Changeset 1388

Show
Ignore:
Timestamp:
03/05/07 13:17:00 (2 years ago)
Author:
jm3
Message:

= Woot! =
== The Feed Me Links AIM bot now supports: ==

  • search as the default action, meaning if it doesn't understand what you said, it will search feed me links for it
  • renaming links
  • tagging links
  • renaming and tagging in either order; ie. you can add a link, fart around, rename it, then tag it, without having to refer back explicitly to your last link -- the bot remembers
  • (adding links was already supported)

= other bug fixes =

  • ajax rename button style fixed
  • xml search api entity fix
  • xml search api consistentificaton with rest of API
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • feedmelinks/aim/bot/klaus.pl

    r1359 r1388  
    1717$aimbot->signon( "cityoflinks", "fuzzlebuzzle" );  
    1818 
    19 open( ICON, "48x48heart.gif" ) || die("can't open icon file: $!"); 
    20 binmode( ICON ); 
    21 my @icon = <ICON>;  #Read the file into an array 
    22 $aimbot->set_icon( @icon ); 
    23 print "attempting to load icon...\n"; 
    24 close( ICON ); 
    25 $aimbot->commit_buddylist(); 
     19#open( ICON, "48x48heart.gif" ) || die("can't open icon file: $!"); 
     20#binmode( ICON ); 
     21#my @icon = <ICON>;  #Read the file into an array 
     22#$aimbot->set_icon( @icon ); 
     23#print "attempting to load icon...\n"; 
     24#close( ICON ); 
     25#$aimbot->commit_buddylist(); 
    2626 
    2727# global 
  • feedmelinks/folder.php

    r1387 r1388  
    373373                if( !$condensed ) { 
    374374?> 
    375                 <?= makeEditLink( $id ) ?> 
    376375                <?= makeDeleteLink( $id ) ?> 
    377376                <input type="checkbox" name="<?= $id ?>" onChange="updateSelectedTotal(this);" /> 
  • feedmelinks/lib/FeedMeLinks/Bot.pm

    r1360 r1388  
    11#!/usr/local/bin/perl 
    22package FeedMeLinks::Bot; 
    3 #use strict; 
     3use strict; 
    44 
    55require Encode; 
     
    3333sub handle_response { 
    3434        my ($aim, $sender, $message, $away, $sessions_ref ) = @_; 
     35 
    3536        my $user; 
    3637        # AIM often wraps seemingly plaintext messages with shouty <HTML><FONT>...</FONT></HTML> crap. this strips that 
    3738        $message = strip_html( $message ); 
     39        log_mesg( \*LOG, "debug", "command: $message" ); 
    3840 
    3941        print "handle_resopnse can see site = $site\n"; 
    4042 
    4143        # init user 
    42  
    4344        my $fml_username = is_user_validated( $sender ); 
    4445        $fml_username .= ""; # type coerce 
    4546        if( ! $fml_username ) { 
    46                 $sessions_ref->{"$sender"} = build_empty_session(); 
    47          if( ! $sessions_ref->{ $sender }->{ "seen_welcome" } ) { 
     47                $sessions_ref->{"$sender"} = build_empty_session( $sender ); 
     48         if( $sessions_ref->{ $sender }{ "seen_welcome" } != 1 ) { 
    4849                        $aim->send_im($sender, h("<b>Hi! I am the Feed Me Links bot!</b>\nTo get started, you can type <b>links</b>, <b>help</b>, or click <b><a href='$site/set-up/IM?aim=$sender'>activate</a></b> to set up your account.") ); 
    49                  $sessions_ref->{ $sender }->{ "seen_welcome" } = 1; 
     50                 $sessions_ref->{ $sender }{ "seen_welcome" } = 1; 
    5051                } 
    5152        } else { 
    52                 if( $sessions_ref->{ $sender }->{ "seen_welcome" } == 0 ) { 
     53                log_mesg( \*LOG, "session", "authenticated session for $sender" ); 
     54                if( $sessions_ref->{ $sender }{ "seen_welcome" } == 0 ) { 
    5355                        $aim->send_im( $sender, "Welcome back, " .  get_dude() . "!" ); 
    54                         $sessions_ref->{ $sender }->{ "seen_welcome" } = 1; 
     56                        $sessions_ref->{"$sender"} = build_authenticated_session( $fml_username ); 
     57                        $sessions_ref->{ $sender }{ "seen_welcome" } = 1; 
    5558                } 
    56                 $sessions_ref->{"$sender"} = build_authenticated_session( $fml_username ); 
    5759        } 
    5860 
     
    7072                        my $name = get_title_for_url( $url ); 
    7173                        my $name = $name ? $name : $url; 
    72                         my $encoded_name = $name; 
    73                         $encoded_name =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; 
    74                         my $encoded_url = $url; 
    75                         $encoded_url =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; 
    76                         print "< $sender adding $url as $name\n"; 
     74                        my $encoded_name = encode( $name ); 
     75                        my $encoded_url = encode( $url ); 
     76                        log_mesg( \*LOG, "add link", "$sender adding $url as $name" ); 
    7777 
    7878                        my $response = $sessions_ref->{$sender}->{"proxy"}->get( "$site/api/add?url=$encoded_url&name=$encoded_name", []); 
     
    8686                                $link_id =~ s/.*com\///; 
    8787                                print "< FML server gave us link ID: $link_id\n"; 
     88 
     89                                # set our session state 
    8890                                $sessions_ref->{$sender}->{"last_link"} = $link_id; 
    8991                                $sessions_ref->{$sender}->{"last_action"} = "added_link"; 
     92                                $sessions_ref->{$sender}->{"added_tags"} = 0; 
     93                                $sessions_ref->{$sender}->{"renamed"} = 0; 
     94 
     95                                log_mesg( \*LOG, "set last_link hash thing to : " . $sessions_ref->{$sender}->{"last_link"} ); 
     96 
    9097                                $aim->send_im($sender, h("<b>Added</b>:\n<a href='$info'>$name</a>" )); 
    91                                 $aim->send_im($sender, h("(coming soon) Want to tag it? Just start typing; separate tags with commas." )); 
     98                                $aim->send_im($sender, h("To add tags, just type them, separated by tags\nTo rename it, type it: <em>new name...</em>" )); 
    9299                        } else { 
    93                                 $aim->send_im($sender, h("<b>Oops, the server screwed something up!</b>\n$info" )); 
     100                                if( $info =~ m/Duplicate/ ) { 
     101                                        $aim->send_im($sender, h("<b>$info</b>" )); 
     102                                } else { 
     103                                        $aim->send_im($sender, h("<b>Oops, the server screwed something up!</b>\n$info" )); 
     104                                } 
     105                                log_mesg( \*LOG, "error:add link", "$sender adding $url as $name" ); 
    94106                        } 
    95  
    96                         # FIXME: next action: tag / rename 
    97107 
    98108                } else { 
    99109                        # FIXME: should search and say "NN people have added this link -- click activate to add it" 
     110                        log_mesg( \*LOG, "error:add link", "un-authenticated add request from $sender for $message" ); 
    100111                        $aim->send_im($sender, h("That looks like a link! To add links via IM, just <b><a href='$site/set-up/IM?aim=$sender'>activate your account</a></b> by clicking." )); 
    101112                } 
     
    109120                        $aim_validation_phrase =~ s/<.*$//; 
    110121                        $claimed_fml_username =~ s/,.+$//; 
    111                         print "claimed_fml_username: $claimed_fml_username\n"; 
    112                         print "aim_validation_phrase: $aim_validation_phrase\n"; 
     122                        #print "claimed_fml_username: $claimed_fml_username\n"; 
     123                        #print "aim_validation_phrase: $aim_validation_phrase\n"; 
     124                        log_mesg( \*LOG, "validate", "$sender requesting validation with $message" ); 
    113125 
    114126                        print "$site/api/backroom/get_im_validation_phrase_for_user&user=$claimed_fml_username\n"; 
     
    154166         
    155167                my $response = $www->get( "$site/usr/" . substr( $u, 0, 1 ) . "/$u/contacts.xml", []); 
    156                 $xp = XML::XPath->new(xml => $response->content); 
     168                my $xp = XML::XPath->new(xml => $response->content); 
    157169                my $peeps = $xp->find("/fml"); 
    158170                # FIXME: peeps list here for sharing 
    159171                 
    160172        } elsif( $message =~ m/version/ ) { 
     173                log_mesg( \*LOG, "version", " $sender" ); 
    161174                $aim->send_im($sender, get_version()); 
    162175         
    163176        } elsif( $message =~ m/(links|recent)/ ) { 
     177                log_mesg( \*LOG, "recent", " $sender" ); 
    164178                $aim->send_im($sender, "recent links here, soon! (not finished yet, sorry"); 
    165179         
     
    167181                log_mesg( \*LOG, "log test", " $message from $sender" ); 
    168182         
    169         } elsif( $message =~ m/(recent|new)/ ) { 
    170                 $aim->send_im($sender, "(soon!) show the last 10 links"); 
    171  
    172183        } elsif( $message =~ m/help/ || $message =~ m/commands/ || $message =~ m/\?/ ) { 
     184                log_mesg( \*LOG, "help", " $sender" ); 
    173185 
    174186                $aim->send_im($sender, "<b>Instructions</b>: 
     
    176188 
    177189        } elsif( $message =~ m/status/ ) { 
     190                log_mesg( \*LOG, "status", " $sender" ); 
    178191                $aim->send_im($sender, "<b>DEBUG DUMP</b>:\nsender: $sender\nmessage: $message" ); 
    179192                $aim->send_im($sender, Dumper( $sessions_ref )); 
     
    181194         
    182195        } elsif( $message =~ m/credits/ ) { 
     196                log_mesg( \*LOG, "credits", " $sender" ); 
    183197                        $aim->send_im($sender, h("by <b><a href='http://jm3.net'>John Manoogian III / jm3</a></b>")); 
    184198 
    185         } elsif( $sessions_ref->{$sender}->{"last_link"} && $sessions_ref->{$sender}->{"last_action"} eq "added_link" ) { 
     199        } elsif( $sessions_ref->{$sender}->{"last_link"} && $sessions_ref->{$sender}->{"renamed"} == 0 && $message =~ m/rename(:| )/ ) { 
     200                        $sessions_ref->{$sender}->{"last_action"} = "rename"; 
     201                        $sessions_ref->{$sender}->{"renamed"}  = 1; 
     202                        my $link = $sessions_ref->{$sender}{"last_link"}; # convenience var 
     203                        log_mesg( \*LOG, "rename", " $message from $sender" ); 
     204 
     205                        my $name = $message; 
     206                        $name =~ s/^rename(:|\s+)(\s*)?//; 
     207                        my $pretty_name = $name; 
     208                        $name = encode( $name );  
     209 
     210                        # HACK: not sure why the proxy's credential'ed password isn't being passed in, but passing it on the URL works. whatever. 
     211                        my $url = "$site/api/rename/" . $sessions_ref->{$sender}{"fml_username"} . "&id=$link&name=$name&password=" . encode($sessions_ref->{$sender}{"fml_password"}); 
     212                        log_mesg( \*LOG, "debug", " $url" ); 
     213                        my $response = $sessions_ref->{$sender}->{"proxy"}->get( $url , []); 
     214                        my $xp = XML::XPath->new(xml => $response->content); 
     215                        my $response_code = "" . XML::XPath->new(xml => $response->content)->findnodes('/rest/response/@code'); 
     216                        if( $response_code == "success" ) { 
     217                                $aim->send_im($sender, h("Thanks! We renamed <a href='$site/$link'><b>$pretty_name</b></a>.")); 
     218                        } else { 
     219                                $aim->send_im($sender, h("<b>Oops, the server screwed something up!</b>\n$response_code" )); 
     220                        } 
     221                        log_mesg( \*LOG, "debug", "response: $response_code renaming $link to $message" ); 
     222 
     223        } elsif( $sessions_ref->{$sender}->{"last_link"} && $sessions_ref->{$sender}->{"added_tags"} == 0 ) { 
    186224                        $sessions_ref->{$sender}->{"last_action"} = "added_tags"; 
    187                         $aim->send_im($sender, "Mmm, looks like tagz!"); 
     225                        $sessions_ref->{$sender}->{"added_tags"}  = 1; 
     226                        $aim->send_im($sender, "Mmm, TAGS! Let me add those for you..."); 
     227                        log_mesg( \*LOG, "tagging", " $message from $sender" ); 
     228 
     229                        my $tags = $message; 
     230                        $tags =~ s/, /,/g; 
     231                        $tags = encode( $tags ); 
     232                        # HACK: not sure why the proxy's credential'ed password isn't being passed in, but passing it on the URL works. whatever. 
     233                        my $url = "$site/api/add_tags/" . $sessions_ref->{$sender}{"fml_username"} . "&id=" . $sessions_ref->{$sender}{"last_link"} . "&tags=$tags&password=" . encode($sessions_ref->{$sender}{"fml_password"}); 
     234                        my $response = $sessions_ref->{$sender}->{"proxy"}->get( $url , []); 
     235                        my $response_code = "" . XML::XPath->new(xml => $response->content)->findnodes('/rest/response/@code'); # HACK: string type coercion 
     236                        log_mesg( \*LOG, "debug", "response: $response_code adding adding $tags with URL $url" );; 
     237                        if( $response_code == "success" ) { 
     238                                my $tag_noun = "tag"; 
     239                                if( $tags =~ m/,/ ) { 
     240                                        $tag_noun .= "s"; 
     241                                } 
     242                                $tag_noun .= " <b>$message</b>"; 
     243                                $aim->send_im($sender, h("Thanks! We added the tags <b>$message</b> to <a href='$site/" . $sessions_ref->{$sender}->{"last_link"} . "'>your link</a>")); 
     244                        } 
    188245 
    189246        } else { 
    190                         $aim->send_im($sender, "I'm up in your AIM, feed me some links. (type <b>?</b> for help)"); 
    191                  
     247                        log_mesg( \*LOG, "search", "$message by $sender" ); 
     248                        $aim->send_im($sender, "<b>Hm, let me search for that on Feed Me Links</b>:\n(searching)"); 
     249 
     250                        my $search_term = $message; 
     251                        $search_term =~ s/^search(:|\s+)(\s*)?//; 
     252                        my $url = "http://www.feedmelinks.com/search-as-xml?q=$search_term"; 
     253                        log_mesg( \*LOG, "debug", " $url" ); 
     254 
     255                        my $response = $sessions_ref->{$sender}->{"proxy"}->get( $url, []); 
     256                        my $nodes = XML::XPath->new(xml => $response->content)->findnodes("/rest/response/link"); 
     257                        #my $nodes = XML::XPath->new(xml => $response->content)->findnodes("/rest/response/link/name/text()"); 
     258                        my $message = "" . XML::XPath->new(xml => $response->content)->findnodes("/rest/response/message"); 
     259                        my $response_code = "" . XML::XPath->new(xml => $response->content)->findnodes("/rest/response/\@code"); 
     260                        if( $response_code == "success" ) { 
     261                                my $summary = ""; 
     262                                my $max = 3; 
     263                                my $c = 0; 
     264                                foreach my $link_node ($nodes->get_nodelist) { 
     265                                        if( $c < $max ) { 
     266                                                $summary .=  
     267                                                        "<a href='"  
     268                                                                . $link_node->findnodes( "url/text()" ) 
     269                                                                . "'>" 
     270                                                                . $link_node->findnodes( "name/text()" ) 
     271                                                                . "</a>, "; 
     272                                                log_mesg( \*LOG, XML::XPath::XMLParser::as_string($link_node)); 
     273                                        }; 
     274                                        ++ $c; 
     275                                } 
     276                                log_mesg( \*LOG, "debug", "summary: $summary" ); 
     277                                log_mesg( \*LOG, scalar( $nodes->get_nodelist) . " links found" ); 
     278                                log_mesg( \*LOG, "search", "found $message" ); 
     279                        $aim->send_im($sender, "<b>$message</b> (<a href='$site/search?q=$search_term'>view all matches</a>)\nincluding: $summary"); 
     280                        } 
    192281        } 
    193282 
     
    196285 
    197286sub is_user_validated { 
    198         log_mesg( \*LOG, "debug", " is_user_validated() - why is bri getting kicked off?" ); 
     287        log_mesg( \*LOG, "debug", " is_user_validated() - no users with \@ signs?" ); 
    199288        my $sender = shift; 
    200289        my $response = $www->get( "$site/api/backroom/is_im_account_known&user=$sender" , []); 
     
    216305 
    217306sub build_empty_session { 
    218         print "> building UNauthenticated session for $sender\n"; 
     307        my $sender = $_[0]; 
     308        log_mesg( \*LOG, "session", "building empty session for $sender" ); 
    219309        return {  
    220     'last_link' => 'none yet', 
    221     'last_action' => '',  
     310                'last_link'    => 0, 
     311                'last_action'  => '', 
     312                'added_tags'   => 0, 
     313                'renamed'      => 0, 
    222314    'fml_username' => "",  
    223315    'fml_password' => "",  
     
    237329        print "> using url: $site/api/backroom/getPasswdForUser&user=$u\n"; 
    238330        my $response = $www->get( "$site/api/backroom/getPasswdForUser&user=$u", []); 
    239         $xp = XML::XPath->new(xml => $response->content); 
     331        my $xp = XML::XPath->new(xml => $response->content); 
    240332        my $p = "" . $xp->getNodeText("/rest/response"); 
    241         print "< got password: '$p'\n"
     333        log_mesg( \*LOG, "debug", "got password $p" )
    242334 
    243335        my $session = {  
    244                 'last_link' => 'none yet', 
    245                 'last_action' => '', 
     336                'last_link'    => 0, 
     337                'last_action'  => '', 
     338                'added_tags'   => 0, 
     339                'renamed'      => 0, 
    246340                'fml_username' => $u, 
    247341                'fml_password' => $p, 
     
    260354                "www." . FeedMeLinks::Environment::get_domain() . ":80", 
    261355                'Feed_Me_Links_XML_API', 
     356                # FIXME: are we doing something wrong? tags is failing with no authroization... 
    262357                $u => $p 
    263358        ); 
     
    267362sub get_title_for_url { 
    268363        my $url = $_[0]; 
    269         ($fh, $file) = mkstemp( "fml_aim_pagetitle_url_XXXX" ); 
     364        my ($fh, $file) = mkstemp( "fml_aim_pagetitle_url_XXXX" ); 
    270365 
    271366        my $ua = LWP::UserAgent->new(); 
     
    309404                "dude",  
    310405                "bro",  
     406                "baby",  
     407                "brother",  
     408                "fellow linkster",  
     409                "digital citizen",  
    311410                "bro-ham"  
    312411                ); 
     
    333432 
    334433sub get_date { 
    335         ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
     434        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
    336435        $year += 1900; 
    337436        $mon += 1; 
     
    347446} 
    348447 
     448sub encode { 
     449        my $s = $_[0]; 
     450        $s =~ s/([^A-Za-z0-9-_\.,|])/sprintf("%%%02X", ord($1))/seg; 
     451        return $s; 
     452} 
     453 
    3494541; # modules must return a true value 
    350455 
  • feedmelinks/modules/my-recent.inc.php

    r1334 r1388  
    6161                        <?= makeLink( $id, "/t/$id", urldecode( mysql_result($q,$i,"name")), $url, "", "" ) ?> 
    6262                        <?= makePermaLink( $id ) ?> 
    63 <?php echo "\n"; ?>             <div style="text-align: right;"> in: 
    64 <?php $cats = getShortCategoriesForLinkAsHTML( $id, $u, 0, 0 ); ?> <?= $cats ? "$cats" : "(" . getUnCattedName() . ")" ?>  
     63<?php echo "\n"; ?>             <div style="text-align: right;"> 
     64<?php $cats = getShortCategoriesForLinkAsHTML( $id, $u, 0, 0 ); ?> <?= $cats ? "in: $cats" : "(<a href='/f/unfiled'>" . getUnCattedName() . "</a>)" ?>  
    6565 
    6666<?php            
  • feedmelinks/modules/utils.inc.php

    r1375 r1388  
    2525        if( !( $u && $id && $name )) 
    2626                return; 
    27         return run_query( getQuery( "edit_name", $name, $id, $u ));  
     27        run_query( getQuery( "edit_name", $name, $id, $u ));  
     28        return mysql_affected_rows(); 
    2829} 
    2930 
     
    988989        if( $u != getOwnerForLink( $newLinkID )) { 
    989990                log_mesg_to( "[failed tag hijacking attempt] $u, $newLinkID", "security" ); 
    990                 return "FAILED"; 
     991                return "failed"; 
    991992        } 
    992993  # if we were called with a big list of possible tags, use that,  
     
    10661067    } 
    10671068  } 
    1068 return $q; 
     1069       return $q; 
    10691070}  
    10701071 
     
    13901391  } 
    13911392 
    1392   # strips slashes, and converts special characters to HTML equivalents for string defined in $var 
    1393   function o( $s ){ 
    1394      $chars = array( 
     1393        function get_entities() { 
     1394     return array( 
    13951395         128 => '&#8364;', 
    13961396         130 => '&#8218;', 
     
    14201420         158 => '&#382;', 
    14211421         159 => '&#376;'); 
     1422        } 
     1423 
     1424  # strips slashes, and converts special characters to HTML equivalents for string defined in $var 
     1425  function o( $s ){ 
     1426     $chars = get_entities(); 
    14221427     return hateration( unicode_fix( str_replace(array_map('chr', array_keys($chars)), $chars, htmlentities(stripslashes($s))))); 
    14231428  } 
     
    27102715 
    27112716function getUnCattedName() { 
    2712   return "not tagged"; 
     2717  return "no tags"; 
    27132718} 
    27142719 
     
    43044309 
    43054310function makeEditLink( $id ) { 
    4306   %><a title="Edit this link" href="javascript:openEdit('<%= $id %>');"><img src="img/edit_entry_16.png" valign="middle" height="16" width="16" alt="edit" border="0" /></a><% 
     4311  %><a title="View Info" href="/<?= $id ?>"><img src="img/edit_entry_16.png" valign="middle" height="16" width="16" alt="edit" border="0" /></a><% 
    43074312} 
    43084313 
     
    43204325function makeAJAXEditLink( $type, $label ) { 
    43214326  $label = $label ? $label : "Rename this link"; 
    4322   %><input type="button" class="editor <%= $type %>" src="/img/icons/edit.png"  
     4327       %><input type="button" class="editor <%= $type %>" src="/img/icons/edit.png"  
    43234328    height="26" width="26" hspace="5" value="<%= $label %>" border="0" /></a><% 
    43244329} 
  • feedmelinks/modules/view-link.inc.php

    r1352 r1388  
    7070 
    7171        <div ftype="name" fid="<%= $l %>"> 
    72                 <a class="biglink" title="<%= $name %>" href="/t/<%= $l %>"><%= $name %></a> <% if( $owned ) {makeAJAXEditLink( "name", "Rename this link" );} %> 
     72                <a class="biglink" title="<%= $name %>" href="/t/<%= $l %>"><%= $name %></a> <% if( $owned ) {makeAJAXEditLink( "name", "Rename" );} %> 
    7373<% if( $owned ) { %> 
    7474                        <label>Make&nbsp;<?= $private ? "public" : "private" ?>:&nbsp;<%= makeAJAXToggle( "link_privacy", $l, $isPrivate ) %></label> 
     
    8989  <%= insertBigThumb( $link ) %> 
    9090        <div ftype="url" fid="<%= $l %>"> 
    91                 <a title="<%= $link %>" href="/t/<%= $l %>"><%= $displayLink %></a> <% if( $owned ) {makeAJAXEditLink( "url", "Edit this URL" ); } %> 
     91                <a title="<%= $link %>" href="/t/<%= $l %>"><%= $displayLink %></a> <% if( $owned ) {makeAJAXEditLink( "url", "Edit URL" ); } %> 
    9292        </div> 
    9393 
  • feedmelinks/search-as-xml.php

    r1352 r1388  
    2828%> 
    2929<<%= "?" %>xml version='1.0' encoding="UTF-8" standalone='yes'?> 
    30 <response type="search"> 
    31 <meta>  
    32         Search <%= $my ? "My Links" : "Feed Me Links" %> <%= $q ? "for '$q'" : "" %> 
    33 </meta> 
     30<rest> 
     31        <request>Search <%= $my ? "My Links" : "Feed Me Links" %> <%= $q ? "for '$q'" : "" %> 
     32</request> 
    3433<% 
    3534        if( $searchTerm ) { 
     
    4847                        $numRows = mysql_num_rows($q); 
    4948%> 
    50 <meta><%= $numRows %> matches from <%= number_format( $totalNumLinks ) %> links</meta> 
     49        <response code="<?= $numRows != 0 ? "success" : "failed" ?>" matches="<?= $numRows ?>"> 
     50                <message><%= $numRows %> matches from <%= number_format( $totalNumLinks ) %> links</message> 
    5151<% 
    5252                if( $numRows ) { 
     
    7171%> 
    7272<url><%= $url %></url>   
    73 <name><%= html_entity_decode( $name ) %></name> 
     73<name><%= preg_replace( "/&([^a])/", "&amp;\\1", unicode_fix( $name )) %></name> 
    7474<%  
    7575        $cats = $cats ? "$cats" : "by $userid"; 
    76         #echo $cats; 
    7776%> 
    7877</link> 
     
    124123        } 
    125124%> 
    126 </response> 
     125        </response> 
     126</rest> 
    127127 
    128128<% 
  • feedmelinks/search.php

    r1352 r1388  
    147147<% } else { %>  
    148148 
    149 <%= makeEditLink( $id ) %> 
    150149<%= makeDeleteLink( $id ) %> 
    151150 
  • feedmelinks/style/main.css

    r1387 r1388  
    77input, textarea, select { margin: 2px } 
    88input, select { vertical-align: middle } 
    9 input[type=button], input[type=submit], input[type=reset] { 
     9 
     10button, input.button, input[type=button], input[type=submit], input[type=reset] { 
    1011        font-size: 10px; 
    1112        background: #eee; 
     
    1415        padding: .1em .5em; 
    1516} 
    16 input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover { 
     17button:hover, input.button:hover, input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover { 
    1718        background: #333; 
    18 
    19 input[type=button][disabled], input[type=submit][disabled], 
     19        color: #ffffff; 
     20
     21button[disabled], input.button:disabled, input[type=button][disabled], input[type=submit][disabled], 
    2022.cancel, input[type=reset][disabled] { 
    2123        background: #f6f6f6; 
     
    2325        color: #999; 
    2426} 
    25  
    2627/* end stealing */ 
     28 
     29OLDBUTTON { 
     30        background-color: #FF6600; 
     31        color: white; 
     32        font-family: inherit; 
     33        padding: 0px; 
     34        margin: 0px; 
     35        font-size: 9px; 
     36} 
     37 
     38medbutton, input.medbutton { 
     39        background-color: #FF6600; 
     40        color: white; 
     41        font-family: inherit; 
     42        padding: 3px; 
     43        margin: 1px; 
     44        font-size: 10px; 
     45} 
     46 
     47bigbutton, input.bigbutton { 
     48        background-color: #FF6600; 
     49        color: white; 
     50        font-family: inherit; 
     51        padding: 0.4em; 
     52        margin: 0px; 
     53        font-size: 14px;; 
     54} 
     55 
     56.renameable { 
     57        background-color: #FFFFD3; 
     58        font-size: 14px; 
     59        color: #222222; 
     60        padding: 4px; 
     61} 
    2762 
    2863.progress { 
     
    171206        font-size: 12px; 
    172207        color: red; 
    173 } 
    174  
    175 button, input.button { 
    176         background-color: #FF6600; 
    177         color: white; 
    178         font-family: inherit; 
    179         padding: 0px; 
    180         margin: 0px; 
    181         font-size: 9px; 
    182 } 
    183  
    184 medbutton, input.medbutton { 
    185         background-color: #FF6600; 
    186         color: white; 
    187         font-family: inherit; 
    188         padding: 3px; 
    189         margin: 1px; 
    190         font-size: 10px; 
    191 } 
    192  
    193 bigbutton, input.bigbutton { 
    194         background-color: #FF6600; 
    195         color: white; 
    196         font-family: inherit; 
    197         padding: 0.4em; 
    198         margin: 0px; 
    199         font-size: 14px;; 
    200 } 
    201  
    202 button:hover, input.button:hover { 
    203         background-color: #FF0000; 
    204208} 
    205209