#!/opt/bin/perl
# cfmapidx - inverted index for deliantra maps
# Copyright (C) 2005,2007,2008,2009 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 cfmaps; if not, write to the Free Software
# Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
our $VERSION = '2.0';
use common::sense;
use Deliantra;
use Deliantra::Map;
use Fcntl;
use GDBM_File;
sub FAST () { 1 } # skip stopwords, skip duplicate-management
our $RESULTS = 200;
our %idx; # the database
sub escape_html($) {
local $_ = shift;
s/([<>&])/sprintf "%d;", ord $1/ge;
$_
}
sub find {
my @kw = @_;
tie %idx, "GDBM_File", ".index.dat", O_RDONLY, 0
or die ".index.dat: $!";
my $cnt;
my %res;
my @found;
for (@kw) {
if (exists $idx{$_}) {
$cnt++;
$res{$_}++ for unpack "(A4)*", $idx{$_};
push @found, $_;
#warn "$_ found\n";#d#
} else {
#warn "$_ not found\n";#d#
}
}
my @res;
while (my ($k, $v) = each %res) {
next unless $v == $cnt;
my ($docnum, $x, $y) = unpack "nCC", $k;
my ($path, $mtime) = split /\x00/, $idx{"D" . pack "n", $docnum};
push @res, [$path, $x, $y];
}
(\@res, \@found)
}
sub dotag {
my ($tag) = @_;
my ($res) = find "T$tag";
use Data::Dumper; warn Dumper $res;
print <",
'',
"",
"",
"Deliantra Tag Search",
"\n",
"",
"";
print "