#!/opt/bin/perl # cfmap2idx - inverted index for crossfire maps # Copyright (C) 2005,2007 Marc Lehmann # # CFMAPIDX is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with gvpe; if not, write to the Free Software # Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA our $VERSION = '0.912'; use Storable; use DB_File; sub escape_html($) { local $_ = shift; s/([<>&])/sprintf "&#%d;", ord $1/ge; $_ } sub search { my (@kw) = @_; tie %idx, DB_File, ".index.dat", O_RDONLY, 0, $DB_HASH or die ".index.dat: $!"; my $cnt; my %res; my @found; for (map lc, @kw) { if (exists $idx{$_}) { $cnt++; $res{$_}++ for unpack "n*", $idx{$_}; push @found, $_; #warn "$_ found\n";#d# } else { #warn "$_ not found\n";#d# } } my @paths; while (my ($k, $v) = each %res) { next unless $v == $cnt; push @paths, $idx{"D" . pack "n", $k}; } binmode STDOUT, ":utf8"; print "", '', "", "", "Crossfire Keyword Search", "\n", "", ""; print "

Search results for '", (join "' & '", map escape_html $_, @found), "'

", "

", (scalar @paths), " results found, up to 200 results shown.

", "

", ""; } if ($ARGV[0] eq "-a") { shift; tie %idx, DB_File, ".index.dat~", O_RDWR|O_CREAT, 0644, $DB_HASH or die ".index.dat~: $!"; my %idx2; for my $path (@ARGV) { my $docnum = pack "n", ++$idx{Vdocnum}; $idx{"D$docnum"} = $path; my $meta = Storable::retrieve "$path.pst"; for my $x (0 .. $meta->{width} - 1) { for my $y (0 .. $meta->{height} - 1) { for my $a (@{ $meta->{map}[$x][$y] }) { for my $v (values %$a) { $v = lc $v; $v =~ y/a-zA-Z0-9_\-.\// /c; for (split /\s+/, $v) { $idx2{$_} .= $docnum; if (/[_\-\.\/]/) { $idx2{$_} .= $docnum for (split /[_\-\.\/]/) } } } } } } } while (my ($k, $v) = each %idx2) { $idx{$k} = pack "n*", keys %{ { map +($_ => 1), unpack "n*", $idx{$k}.$v } }; } } elsif ($ARGV[0] eq "-s") { shift; search @ARGV; } else { # assume CGI chdir "/var/www/cfmaps.schmorp.de" or exit 69; print <