X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Fweb%2Froutetextstring;h=be009d4e5a4b8fa624a5f809a079a432d0b1da2f;hp=0e4ae6eaf2b37d5786c05800ab1497dd7d1c6302;hb=013f7a0ab3bf8d2b1100022e8fc868407c751720;hpb=007700c6236644463a0e78724b8260f14be4bedd diff --git a/yarrg/web/routetextstring b/yarrg/web/routetextstring old mode 100644 new mode 100755 index 0e4ae6e..be009d4 --- a/yarrg/web/routetextstring +++ b/yarrg/web/routetextstring @@ -1,17 +1,63 @@ +<%doc> + + This is part of the YARRG website. YARRG is a tool and website + for assisting players of Yohoho Puzzle Pirates. + + Copyright (C) 2009 Ian Jackson + Copyright (C) 2009 Clare Boothby + + YARRG's client code etc. is covered by the ordinary GNU GPL (v3 or later). + The YARRG website is covered by the GNU Affero GPL v3 or later, which + basically means that every installation of the website will let you + download the source. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + are used without permission. This program is not endorsed or + sponsored by Three Rings. + + + This Mason component parses textual strings giving lists of islands + and archipelagoes, ie textual route strings. + + + + +<%flags> +inherit => undef + + <%args> $ocean $format $ctype => undef $string + <%perl> +# typical url for this script: +# http://www.chiark.greenend.org.uk/ucgi/~clareb/mason/pirates/routetextstring?format=json&ocean=Midnight&string=d + + use CommodsWeb; use HTML::Entities; use JSON; +use Data::Dumper; -db_setocean($ocean); -db_connect(); +my $dbh= dbw_connect($ocean); my $sth= $dbh->prepare("SELECT archipelago,islandid,islandname FROM islands WHERE islandname LIKE ? @@ -21,43 +67,58 @@ my $sth= $dbh->prepare("SELECT archipelago,islandid,islandname my (@results, $canontext); my ($output, $output_wrong); -if ($format =~ 'json') { +if ($format =~ /json/) { $r->content_type($ctype or $format); - $output= sub { print to_json({ + $output= sub { print to_json_shim({ success => 1, - show => encode_entities($canontext), - })}; - $output_wrong= sub { print to_json({ + show => length $canontext ? encode_entities($canontext) + : ' ', + })}; + $output_wrong= sub { print to_json_shim({ success => 0, - show => encode_entities($_[0]), - })}; -} + show => $_[0], + })}; +} +if ($format =~ /return/) { + $output= sub { return { Error => '', Results => \@results }; }; + $output_wrong= sub { return { Error => $_[0] }; }; +} +if ($format =~ /dump/) { + $r->content_type('text/plain'); + $output_wrong= sub { print Dumper(\@_); }; + $output= sub { print Dumper(\@results, $canontext); }; +} foreach my $each (split m#[/|,]#, $string) { $each =~ s/^\s*//; $each =~ s/\s*$//; $each =~ s/\s+/ /g; next if !length $each; - my $pat= "\%$each\%"; - my $nrows= $sth->execute($pat,$pat); my $err= sub { my $msg= sprintf $_[0], encode_entities($each); $output_wrong->($msg); - $m->abort(); }; - my $results= $sth->fetchall_arrayref(); - if (!@$results) { - $err->('no island or arch matches "%s"'); - } elsif (@$results > 3) { - $err->(''); - } elsif (@$results > 1) { - my @m= map { $_->[2] } @$results; - $err->('ambiguous island or arch "%s", could be '. - join(', ', @m)); + my %m; + my $results; + foreach my $pat ("$each\%", "\%$each\%") { + $sth->execute($pat,$pat); + $results= $sth->fetchall_arrayref(); + last if @$results==1; + map { $m{ $_->[2] }=1 } @$results; + $results= undef; + } + if (!$results) { + if (!%m) { + return $err->('no island or arch matches "%s"'); + } elsif (keys(%m) > 5) { + return $err->(' '); + } else { + return $err->('ambiguous island or arch "%s",'. + ' could be '.join(', ', sort keys %m)); + } } push @results, $results->[0]; } -$canontext= join ' | ', map { encode_entities($_->[2]) } @results; - -$output->(); +$canontext= join ' | ', map { $_->[2] } @results; +return $output->();