fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-10-24 09:58 am

[dw-free] convert multisearch.bml to TT

[commit: http://hg.dwscoalition.org/dw-free/rev/73087735e83d]

http://bugs.dwscoalition.org/show_bug.cgi?id=3976

Refactor and convert multisearch.bml to multisearch.tt.

Patch by [personal profile] kareila.

Files modified:
  • bin/upgrading/deadphrases.dat
  • cgi-bin/DW/Controller/Search/Multisearch.pm
  • htdocs/multisearch.bml
  • htdocs/multisearch.bml.text
  • views/multisearch.tt
  • views/multisearch.tt.text
--------------------------------------------------------------------------------
diff -r 59ef33796a97 -r 73087735e83d bin/upgrading/deadphrases.dat
--- a/bin/upgrading/deadphrases.dat	Wed Oct 19 00:05:03 2011 +0800
+++ b/bin/upgrading/deadphrases.dat	Mon Oct 24 17:58:12 2011 +0800
@@ -183,7 +183,19 @@
 
 general /modify_do.bml.title
 
+general /multisearch.bml.formaterror
+general /multisearch.bml.noaddress.text
+general /multisearch.bml.noaddress.title
+general /multisearch.bml.nofaqsearch.text
+general /multisearch.bml.nofaqsearch.title
+general /multisearch.bml.nointerest.text
+general /multisearch.bml.nointerest.title
+general /multisearch.bml.nomatch.text
+general /multisearch.bml.nomatch.title
+general /multisearch.bml.region.bodytext2
+general /multisearch.bml.region.head
 general /multisearch.bml.region.text
+general /multisearch.bml.title.results
 
 general /register.bml.new.body
 general /register.bml.new.modify2
diff -r 59ef33796a97 -r 73087735e83d cgi-bin/DW/Controller/Search/Multisearch.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/DW/Controller/Search/Multisearch.pm	Mon Oct 24 17:58:12 2011 +0800
@@ -0,0 +1,253 @@
+#!/usr/bin/perl
+#
+# DW::Controller::Search::Multisearch
+#
+# Conversion of LJ's multisearch.bml, used for handling redirects
+# from sitewide search bar (LJ::Widget::Search).
+#
+# Authors:
+#      Jen Griffin <kareila@livejournal.com>
+#
+# Copyright (c) 2011 by Dreamwidth Studios, LLC.
+#
+# This program is free software; you may redistribute it and/or modify it under
+# the same terms as Perl itself. For a copy of the license, please reference
+# 'perldoc perlartistic' or 'perldoc perlgpl'.
+#
+
+package DW::Controller::Search::Multisearch;
+
+use strict;
+
+use DW::Routing;
+use DW::Template;
+use DW::Controller;
+
+DW::Routing->register_string( '/multisearch', \&multisearch_handler, app => 1 );
+
+sub multisearch_handler {
+    my $r = DW::Request->get;
+    my $args = $r->did_post ? $r->post_args : $r->get_args;
+
+    my $type   = lc $args->{'type'}   || '';
+    my $q      = lc $args->{'q'}      || '';
+    my $output = lc $args->{'output'} || '';
+
+    my ( $ok, $rv ) = controller( anonymous => 1 );
+    return $rv unless $ok;
+
+    my $tpl = 'multisearch.tt';
+
+    # functions for handling various call types
+    my ( $f_nav, $f_user, $f_int, $f_email, $f_im, $f_faq, $f_region );
+
+    $f_nav = sub {
+        # Some special shortcuts used for easy navigation
+        return $r->redirect( "$LJ::SITEROOT/support/faqbrowse?faqid=$1&view=full" )
+            if $q =~ /^faq (\d+)$/;
+        return $r->redirect( "$LJ::SITEROOT/support/see_request?id=$2" )
+            if $q =~ /^req(uest)? (\d+)$/;
+
+        if ( $q =~ m!(.+)/(pics|full)! ) {
+            if ( my $u = LJ::load_user_or_identity($1) ) {
+                return $r->redirect( $u->profile_url( full => 1 ) )
+                    if $2 eq "full";
+                return $r->redirect( $u->allpics_base )
+                    if $2 eq "pics";
+            }
+        }
+
+        eval "use LJ::NavTag;";
+        return error_ml( 'error.tempdisabled' ) if $@;
+
+        my @dests = LJ::NavTag->dests_of_tag( $q );
+        my $last_is_untrusted = 0;
+
+        if ( $type eq "nav_and_user" ) {
+            if ( my $u = LJ::load_user_or_identity($q) ) {
+                push @dests, LJ::NavTag::Dest->new( type => "LJUSER",
+                                                    dest => $u->user );
+
+                # Presumably users will start registering usernames that match
+                # our site navigation tags, so let's preempt that and push them
+                # into a bottom section when site-defined tags are also present.
+                $last_is_untrusted = 1 if $u->is_visible;
+            }
+        }
+
+        my $eq = LJ::ehtml( $q );
+        return error_ml( '/multisearch.tt.errorpage.nomatch.nav', { query => $eq } )
+            unless @dests;
+        return $r->redirect( $dests[0]->url ) if @dests == 1;
+
+        # multiple matches
+        my @cats = ( { name => 'site', list => \@dests } );
+        push @cats,  { name => 'user', list => [ pop @dests ] }
+            if $last_is_untrusted;
+
+        $rv->{type} = 'nav';
+        $rv->{query} = $eq;
+        $rv->{cats} = \@cats;
+
+        return DW::Template->render_template( $tpl, $rv );
+    };
+
+    $f_user = sub {
+        my $user = $q;
+        $user =~ s!\@$LJ::USER_DOMAIN!!;
+        $user =~ s!/(\w+)!!;
+        my $what = defined $1 ? $1 : '';
+
+        $user =~ s/-/_/g;
+        $user =~ s/[^\w]//g;
+
+        return $r->redirect( "$LJ::SITEROOT/random" ) unless $user;
+
+        my $u = LJ::load_user( $user );
+        return $r->redirect( "$LJ::SITEROOT/profile?user=$user" ) unless $u;
+
+        return $r->redirect( $u->allpics_base ) if $what eq "pics";
+
+        return $r->redirect( $u->journal_base . '/data/foaf' )
+            if $output eq "foaf";
+
+        my $url = $u->profile_url;
+        $url .= "?mode=full" if $what eq 'full';
+        return $r->redirect( $url );
+    };
+
+    $f_int = sub {
+        return error_ml( '/multisearch.tt.errorpage.nointerest' ) unless $q;
+        return $r->redirect( "$LJ::SITEROOT/interests?int=" . LJ::eurl( $q ) );
+    };
+
+    $f_email = sub {
+        return error_ml( '/multisearch.tt.errorpage.noaddress' ) unless $q;
+
+        my $dbr = LJ::get_db_reader();
+        my $uid = $dbr->selectrow_array( qq{
+            SELECT userid FROM user WHERE journaltype='P' AND statusvis='V'
+            AND allow_contactshow='Y' AND email=? LIMIT 1 }, undef, $q );
+
+        # if not in the user table, try the email table
+        $uid ||= $dbr->selectrow_array( qq{
+            SELECT e.userid FROM user u, email e WHERE e.email=?
+            AND e.userid=u.userid AND u.journaltype='P' AND u.statusvis='V'
+            AND u.allow_contactshow='Y' LIMIT 1 }, undef, $q );
+
+        if ( my $u = LJ::load_userid( $uid ) ) {
+            my $show = $u->opt_whatemailshow;
+            if ( $show eq "A" || $show eq "B" ) {
+                return $r->redirect( $u->journal_base . '/data/foaf' )
+                    if $output eq "foaf";
+                return $r->redirect( $u->profile_url );
+            }
+        }
+        return error_ml( '/multisearch.tt.errorpage.nomatch' );
+    };
+
+    $f_im = sub {
+        eval "use LJ::Directory::Constraint::ContactInfo;";
+        return error_ml( 'error.tempdisabled' ) if $@;
+
+        my $c = LJ::Directory::Constraint::ContactInfo->new( screenname => $q );
+        my @uids = $c->matching_uids;
+
+        if ( @uids == 1 ) {
+            my $u = LJ::load_userid( $uids[0] );
+            return $r->redirect( $u->journal_base . '/data/foaf' )
+                if $output eq "foaf";
+            return $r->redirect( $u->profile_url );
+
+        } elsif ( @uids > 1 ) {
+            $rv->{type} = 'im';
+
+            my $us = [ values %{ LJ::load_userids( @uids ) } ];
+            $rv->{results} = LJ::user_search_display(
+                    users => $us, timesort => 1, perpage => 50 );
+
+            return DW::Template->render_template( $tpl, $rv );
+        }
+        return error_ml( '/multisearch.tt.errorpage.nomatch' );
+    };
+
+    $f_region = sub {
+        $q = LJ::trim( $q );
+        my @parts = split /\s*,\s*/, $q;
+        if ( @parts == 0 || @parts > 3 ) {
+            $rv->{type} = 'region';
+            return DW::Template->render_template( $tpl, $rv );
+        }
+
+        my $ctc = $parts[-1];
+        my $dbr = LJ::get_db_reader();
+        my $sth = $dbr->prepare( qq{
+            SELECT code FROM codes WHERE type='country'
+            AND (code=? OR item=?) LIMIT 1 } );
+        $sth->execute( $ctc, $ctc );
+        my ( $country ) = $sth->fetchrow_array;
+        my ( $state, $city );
+
+        if ( $country ) {
+            pop @parts;
+            if ( @parts == 1 ) {
+                $state = $parts[0];
+            } else {
+                ( $city, $state ) = @parts;
+            }
+
+        } else {
+            $country = "US";
+
+            if ( @parts == 1 ) {
+                $city = $parts[0];
+            } else {
+                ( $city, $state ) = @parts;
+            }
+        }
+
+        ( $city, $state, $country ) = map { LJ::eurl($_) }
+                                          ( $city, $state, $country );
+        return $r->redirect( "$LJ::SITEROOT/directorysearch?s_loc=1" .
+                             "&loc_cn=$country&loc_st=$state&loc_ci=$city" .
+                             "&opt_sort=ut&opt_format=pics&opt_pagesize=50" );
+    };
+
+    $f_faq = sub {
+        return error_ml( '/multisearch.tt.errorpage.nofaq' ) unless $q;
+        return $r->redirect( "$LJ::SITEROOT/support/faqsearch?q=" . LJ::eurl( $q ) );
+    };
+
+    # set up dispatch table
+    my $dispatch = { nav          => $f_nav,
+                     nav_and_user => $f_nav,
+                     user         => $f_user,
+                     ljtalk       => $f_user,
+                     int          => $f_int,
+                     email        => $f_email,
+                     im           => $f_im,
+                     aolim        => $f_im,
+                     icq          => $f_im,
+                     yahoo        => $f_im,
+                     msn          => $f_im,
+                     jabber       => $f_im,
+                     region       => $f_region,
+                     faq          => $f_faq,
+                   };
+
+    return $dispatch->{$type}->() if exists $dispatch->{$type};
+
+    # Unknown type, try running site hooks
+    if ( $type ) {
+        # TODO: check return value of this hook, and fall back to another hook
+        # that shows the results here, rather than redirecting to another page
+        return LJ::Hooks::run_hook( 'multisearch_custom_search_redirect',
+                                    { type => $type, query => $q } );
+    }
+
+    # No type specified - redirect them somewhere useful.
+    return $r->redirect( "$LJ::SITEROOT/tools/search" );
+}
+
+
+1;
diff -r 59ef33796a97 -r 73087735e83d htdocs/multisearch.bml
--- a/htdocs/multisearch.bml	Wed Oct 19 00:05:03 2011 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-<?_c
-# This code was forked from the LiveJournal project owned and operated
-# by Live Journal, Inc. The code has been modified and expanded by
-# Dreamwidth Studios, LLC. These files were originally licensed under
-# the terms of the license supplied by Live Journal, Inc, which can
-# currently be found at:
-#
-# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
-#
-# In accordance with the original license, this code and all its
-# modifications are provided under the GNU General Public License.
-# A copy of that license can be found in the LICENSE file included as
-# part of this distribution.
-_c?>
-<?_code
-{
-    use strict;
-    use vars qw(%GET %POST $title $body $arg);
-
-    $title = "";
-    $body = "";
-    my $type = $POST{'type'} || $GET{'type'};
-    my $q = $POST{'q'} || $GET{'q'};
-    my $output = lc($POST{'output'}) || lc($GET{'output'});
-    my $dbr = LJ::get_db_reader();
-
-    if ($type eq "nav_and_user" || $type eq "nav") {
-        # Some special shortcuts used for easy navigation
-        if ($q =~ /^faq (\d+)$/) {
-            return BML::redirect("$LJ::SITEROOT/support/faqbrowse?faqid=$1&view=full");
-        }
-        if ($q =~ /^req(uest)? (\d+)$/) {
-            return BML::redirect("$LJ::SITEROOT/support/see_request?id=$2");
-        }
-        if ($q =~ m!(.+)/(pics|full)!) {
-            if (my $u = LJ::load_user($1)) {
-                return BML::redirect( $u->profile_url('full' => 1) )
-                    if $2 eq "full";
-                return BML::redirect( $u->allpics_base )
-                    if $2 eq "pics";
-            }
-        }
-
-        do "LJ/NavTag.pm";
-        my @dests = LJ::NavTag->dests_of_tag($q);
-        my $last_is_untrusted = 0;
-
-        if ($type eq "nav_and_user") {
-            my $u = LJ::load_user_or_identity($q);
-            if ($u) {
-                push @dests, LJ::NavTag::Dest->new(type => "LJUSER", dest => $u->{user});
-
-                # presumably users will start registering usernames that match our site navigation tags,
-                # so let's preempt that and throw them into a lame bottom section when site-defined tags
-                # are alse present.
-                $last_is_untrusted = 1 if $u->is_visible;
-            }
-        }
-
-        my $eq = LJ::ehtml($q);
-        if (@dests == 0) {
-            $title = "No matches";
-            $body = "<?h1 $ML{'Error'} h1?><?p No site page or username matches your search for <b>$eq</b>. p?>";
-            return;
-        }
-        if (@dests == 1) {
-            return BML::redirect($dests[0]->url);
-        }
-
-        $title = "Choices";
-        $body = "<?h1 Multiple Choices h1?>";
-
-        my @cats = ({
-            title => "Site pages",
-            text => "The following $LJ::SITENAMESHORT pages match your search for <b>$eq</b>:",
-            list => \@dests,
-        });
-
-        if ($last_is_untrusted) {
-            push @cats, {
-                title => "User account",
-                text => "The following user account matches your search for <b>$eq</b>:",
-                list => [ pop @dests ],
-            };
-        }
-
-        foreach my $cat (@cats) {
-            $body .= "<?h2 $cat->{title} h2?><?p $cat->{text} p?>";
-            $body .= "<ul>";
-            foreach my $dst (@{ $cat->{list} }) {
-                my $lju = $dst->ljuser;
-                my $link;
-                if ($lju) {
-                    $link = $dst->ljuser->ljuser_display . " - " . LJ::ehtml($dst->title);
-                } else {
-                    $link = "<a href=\"" . LJ::ehtml($dst->url) . "\">" . LJ::ehtml($dst->title) . "</a>";
-                }
-                if ( ! $lju || $lju->is_visible ) {
-                    $body .= "<li>$link</li>\n";
-                }
-            }
-            $body .= "</ul>";
-        }
-
-        return;
-    }
-
-    if ($type eq "user" || $type eq "ljtalk") {
-        my $user = lc($q);
-        $user =~ s!\@$LJ::USER_DOMAIN!!;
-        my $what;
-        if ($user =~ s!/(\w+)!!) {
-            $what = $1;
-        }
-
-        $user =~ s/-/_/g;
-        $user =~ s/[^\w]//g;
-        if ($user) {
-            my $url;
-            if ($what eq "pics") {
-                $url = "$LJ::SITEROOT/allpics?user=$user";
-            } elsif ($output eq "foaf") {
-                $url = LJ::journal_base($user) . '/data/foaf';
-            } else {
-                if (my $u = LJ::load_user($user)) {
-                    $url = $u->profile_url;
-                    $url .= "?mode=full" if $what eq 'full';
-                } else {
-                    $url = "$LJ::SITEROOT/profile?user=$user";
-                }
-            }
-            return BML::redirect($url);
-        } else {
-            return BML::redirect("$LJ::SITEROOT/random");
-        }
-    }
-
-    if ($type eq "int") {
-        my $int = lc($q);
-        if ($int) {
-            return BML::redirect("$LJ::SITEROOT/interests?int=" . LJ::eurl($int));
-        } else {
-            $title = $ML{'.nointerest.title'};
-            $body = "<?h1 $ML{'Error'} h1?><?p $ML{'.nointerest.text'} p?>";
-            return;
-        }
-    }
-
-    if ($type eq "email") {
-        my $email = lc($q);
-        unless ($email) {
-            $title = $ML{'.noaddress.title'};
-            $body = "<?h1 $ML{'Error'} h1?><?p $ML{'.noaddress.text'} p?>";
-            return;
-        } else {
-            my $uid = $dbr->selectrow_array("SELECT userid FROM user WHERE journaltype='P' AND statusvis='V' ".
-                                            "AND allow_contactshow='Y' AND email=? LIMIT 1", undef, $email);
-            # try the email table
-            unless ($uid) {
-                $uid = $dbr->selectrow_array(qq{
-                    SELECT e.userid
-                    FROM user u, email e
-                    WHERE e.email=? AND e.userid=u.userid AND u.journaltype='P' AND u.statusvis='V'
-                    AND u.allow_contactshow='Y' LIMIT 1
-                }, undef, $email);
-            }
-            if (my $u = LJ::load_userid($uid)) {
-                if ($u->opt_whatemailshow eq "A" || $u->opt_whatemailshow eq "B") {
-                    if ($output eq "foaf") {
-                        return BML::redirect( $u->journal_base . '/data/foaf' );
-                    } else {
-                        return BML::redirect( $u->profile_url );
-                    }
-                }
-            }
-            $title = $ML{'.nomatch.title'};
-            $body = "<?h1 $ML{'Sorry'} h1?><?p $ML{'.nomatch.text'} p?>";
-            return;
-        }
-    }
-
-    if ($type eq "im" ||
-        $type eq "aolim" || $type eq "icq" ||
-        $type eq "yahoo" || $type eq "msn" ||
-        $type eq "jabber") {
-
-        use LJ::Directory::Constraint::ContactInfo;
-        my @uids = LJ::Directory::Constraint::ContactInfo->new(screenname => $q)->matching_uids;
-
-        if (@uids == 1) {
-            my $u = LJ::load_userid(shift @uids);
-            if ($output eq "foaf") {
-                return BML::redirect($u->journal_base . '/data/foaf');
-            } else {
-                return BML::redirect($u->profile_url);
-            }
-        } elsif (@uids > 1) {
-            my $us = LJ::load_userids(@uids);
-
-            $title = $ML{'.title.results'};
-            $body .= LJ::user_search_display(
-                                             users      => [ values %$us ],
-                                             timesort   => 1,
-                                             perpage    => 50,
-                                             );
-            return;
-        }
-
-        # If we haven't returned already then the search turned up nothing.
-        $title = $ML{'.nomatch.title'};
-        $body = "<?h1 $ML{'Sorry'} h1?><?p $ML{'.nomatch.text'} p?>";
-        return;
-    }
-
-    if ($type eq "region") {
-        $q =~ s/^\s+//; $q =~ s/\s+$//;
-        my @parts = split(/\s*,\s*/, $q);
-        if (@parts==0 || @parts>3) {
-            $title = $ML{'.formaterror'};
-            $body .= "<?h1 $ML{'.region.head'} h1?><?p " . BML::ml('.region.bodytext2', {'aopts' => "href='$LJ::SITEROOT/directorysearch'"}) . " p?>";
-            return;
-        }
-
-        my $ctc = $parts[-1];
-        my $sth = $dbr->prepare("SELECT code FROM codes WHERE type='country' AND (code=? OR item=?) LIMIT 1");
-        $sth->execute($ctc, $ctc);
-        my ($country) = $sth->fetchrow_array;
-        my ($state, $city);
-
-        if ($country) {
-            pop @parts;
-            if (@parts == 1) {
-                $state = $parts[0];
-            } elsif (@parts == 2) {
-                ($city, $state) = @parts;
-            }
-        } else {
-            $country = "US";
-            if (@parts ==1) {
-                $city = $parts[0];
-            } elsif (@parts == 2) {
-                ($city, $state) = @parts;
-            }
-        }
-        ($city, $state, $country) = map { LJ::eurl($_); } ($city, $state, $country);
-        return BML::redirect("$LJ::SITEROOT/directorysearch?s_loc=1&loc_cn=$country&loc_st=$state&loc_ci=$city&opt_sort=ut&opt_format=pics&opt_pagesize=50");
-    }
-
-    if ($type eq "faq") {
-        my $term = lc($q);
-        if ($term) {
-            return BML::redirect("$LJ::SITEROOT/support/faqsearch?q=" . LJ::eurl($term));
-        } else {
-            $title = $ML{'.nofaqsearch.title'};
-            $body = "<?h1 $ML{'Error'} h1?><?p $ML{'.nofaqsearch.text'} p?>";
-            return;
-        }
-    }
-
-    # Unknown type, try running site hooks
-    if ($type) {
-        # TODO: check return value of this hook, and fall back to another
-        # hook that shows the results here, rather than redirecting to another page
-        return LJ::Hooks::run_hook('multisearch_custom_search_redirect', {
-            type  => $type,
-            query => $q, });
-    }
-
-    return;
-}
-_code?><?page
-title=><?_code return $title; _code?>
-body=><?_code return $body; _code?>
-page?>
diff -r 59ef33796a97 -r 73087735e83d htdocs/multisearch.bml.text
--- a/htdocs/multisearch.bml.text	Wed Oct 19 00:05:03 2011 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-;; -*- coding: utf-8 -*-
-.formaterror=Format Error
-
-.noaddress.text=You didn't enter an email address.
-
-.noaddress.title=No Address
-
-.nofaqsearch.text=You didn't enter a term to search for in the FAQ.
-
-.nofaqsearch.title=No FAQ Search Term
-
-.nointerest.text=You didn't enter an interest.
-
-.nointerest.title=No Interest
-
-.nomatch.text=There were no results for the criteria you specified.
-
-.nomatch.title=No Match
-
-.region.bodytext2<<
-You can search by region in one of the following formats:
-<ul>
- <li>Country</li>
- <li>City *</li>
- <li>City, State *</li>
- <li>State, Country</li>
- <li>City, State, Country</li>
-</ul>
-Notes:
-<ul>
- <li>* searching for only a city or a city and state defaults to assuming the country is the United States.</li>
- <li>Country can either be the country's full name, or its two letter country code</li>
-</ul>
-If you want to do a different type of search, check out the <a [[aopts]]>directory search</a>.
-.
-
-.region.head=Search by Region
-
-.title.results=Search Results
-
diff -r 59ef33796a97 -r 73087735e83d views/multisearch.tt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/multisearch.tt	Mon Oct 24 17:58:12 2011 +0800
@@ -0,0 +1,43 @@
+[%# TT conversion of multisearch.bml
+  #
+  # Authors:
+  #      Jen Griffin <kareila@livejournal.com>
+  #
+  # Copyright (c) 2011 by Dreamwidth Studios, LLC.
+  #
+  # This program is free software; you may redistribute it and/or modify it
+  # under the same terms as Perl itself. For a copy of the license, please
+  # reference 'perldoc perlartistic' or 'perldoc perlgpl'.
+  #
+%]
+
+[%- sections.title=".title.$type" | ml -%]
+
+[%- IF type == 'nav' -%]
+   [%- FOREACH cats -%]
+        <h2>[% ".head.$name" | ml %]</h2>
+        <p>[% ".text.$name" | ml(query = query, sitename = site.nameshort) %]</p>
+        <ul class="bullet-list">
+        [%- FOREACH dst = list;
+              link_title = dst.title | html;
+              link_url = dst.url | html;
+              lju = dst.ljuser -%]
+
+          [%- IF lju -%]
+              [%- IF lju.is_visible -%]
+                <li>[% lju.ljuser_display %] - [% link_title %]</li>
+              [%- END -%]
+          [%- ELSE -%]
+                <li><a href="[% link_url %]">[% link_title %]</a></li>
+          [%- END -%]
+
+        [%- END -%]
+        </ul>
+   [%- END -%]
+[%- END -%]
+
+[%- IF type == 'im'; results; END -%]
+
+[%- IF type == 'region';
+    '.region.bodytext' | ml(aopts = "href='$site.root/directorysearch'");
+    END -%]
diff -r 59ef33796a97 -r 73087735e83d views/multisearch.tt.text
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/views/multisearch.tt.text	Mon Oct 24 17:58:12 2011 +0800
@@ -0,0 +1,46 @@
+;; -*- coding: utf-8 -*-
+.errorpage.noaddress=You didn't enter an email address.
+
+.errorpage.nofaq=You didn't enter a term to search for in the FAQ.
+
+.errorpage.nointerest=You didn't enter an interest.
+
+.errorpage.nomatch=There were no results for the criteria you specified.
+
+.errorpage.nomatch.nav=No site page or username matches your search for <b>[[query]]</b>.
+
+.head.site=Site pages
+
+.head.user=User account
+
+.region.bodytext<<
+<p>Your search criteria were incorrectly specified.</p>
+
+<p>You can search by region in one of the following formats:</p>
+<ul class='bullet-list'>
+ <li>Country</li>
+ <li>City *</li>
+ <li>City, State *</li>
+ <li>State, Country</li>
+ <li>City, State, Country</li>
+</ul>
+<p>Notes:</p>
+<ul class='bullet-list'>
+ <li>* Searching for only a city or a city and state defaults to assuming
+     the country is the United States.</li>
+ <li>Country can either be the country's full name, or its two letter
+     country code.</li>
+</ul>
+<p>If you want to do a different type of search, check out the
+<a [[aopts]]>directory search</a>.</p>
+.
+
+.text.site=The following [[sitename]] pages match your search for <b>[[query]]</b>:
+
+.text.user=The following user account matches your search for <b>[[query]]</b>:
+
+.title.im=Search Results
+
+.title.nav=Multiple Choices
+
+.title.region=Search by Region
--------------------------------------------------------------------------------