ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cfmaps/cfmapidx
(Generate patch)

Comparing cfmaps/cfmapidx (file contents):
Revision 1.3 by root, Wed Nov 23 09:07:21 2005 UTC vs.
Revision 1.12 by root, Thu Oct 22 08:19:16 2009 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2 2
3# cfmap2idx - inverted index for crossfire maps 3# cfmap2idx - inverted index for deliantra maps
4# Copyright (C) 2005 Marc Lehmann <gvpe@schmorp.de> 4# Copyright (C) 2005,2007,2008 Marc Lehmann <cfmaps@schmorp.de>
5# 5#
6# CFMAPIDX is free software; you can redistribute it and/or modify 6# CFMAPIDX is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by 7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or 8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version. 9# (at your option) any later version.
12# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details. 14# GNU General Public License for more details.
15# 15#
16# You should have received a copy of the GNU General Public License 16# You should have received a copy of the GNU General Public License
17# along with gvpe; if not, write to the Free Software 17# along with cfmaps; if not, write to the Free Software
18# Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18# Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 19
20our $VERSION = '0.91'; 20our $VERSION = '0.923';
21 21
22use Storable; 22use Deliantra;
23use Deliantra::Map;
24
25use Fcntl;
23use DB_File; 26use SDBM_File;
24 27
25sub escape_html($) { 28sub escape_html($) {
26 local $_ = shift; 29 local $_ = shift;
27 s/([<>&])/sprintf "&#%d;", ord $1/ge; 30 s/([<>&])/sprintf "&#%d;", ord $1/ge;
28 $_ 31 $_
29} 32}
30 33
31sub search { 34sub search {
32 my (@kw) = @_; 35 my (@kw) = @_;
33 36
34 tie %idx, DB_File, ".index.dat", O_RDONLY, 0, $DB_HASH 37 tie %idx, SDBM_File, ".index.dat", O_RDONLY, 0
35 or die ".index.dat: $!"; 38 or die ".index.dat: $!";
36 39
37 my $cnt; 40 my $cnt;
38 my %res; 41 my %res;
39 my @found; 42 my @found;
60 63
61 print "<?xml version='1.0' encoding='utf-8'?>", 64 print "<?xml version='1.0' encoding='utf-8'?>",
62 '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">', 65 '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
63 "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>", 66 "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>",
64 "<head>", 67 "<head>",
65 "<title>Crossfire Keyword Search</title>", 68 "<title>Deliantra Keyword Search</title>",
66 "<link rel='stylesheet' type='text/css' media='all' href='/common.css'/>\n", 69 "<link rel='stylesheet' type='text/css' media='all' href='/common.css'/>\n",
67 "</head>", 70 "</head>",
68 "<body>"; 71 "<body>";
69 72
70 print "<h1>Search results for '", (join "' &amp; '", map escape_html $_, @found), "'</h1>", 73 print "<h1>Search results for '", (join "' &amp; '", map escape_html $_, @found), "'</h1>",
75 78
76 for (sort @paths) { 79 for (sort @paths) {
77 print "<li><a href='$_.xhtml'>$_</a></li>"; 80 print "<li><a href='$_.xhtml'>$_</a></li>";
78 } 81 }
79 82
80 print "</ul></p><p class='footer'>created by <a href='http://software.schmorp.de/#crossfire'>cfmapidx</a> version $VERSION</p>", 83 print "</ul></p><p class='footer'>created by <a href='http://software.schmorp.de/pkg/cfmaps'>cfmapidx</a> version $VERSION</p>",
81 "</body></html>"; 84 "</body></html>";
82} 85}
83 86
84if ($ARGV[0] eq "-a") { 87if ($ARGV[0] eq "-a") {
85 shift; 88 shift;
86 89
87 tie %idx, DB_File, ".index.dat~", O_RDWR|O_CREAT, 0644, $DB_HASH 90 tie %idx, SDBM_File, ".index.dat~", O_RDWR|O_CREAT, 0644
88 or die ".index.dat~: $!"; 91 or die ".index.dat~: $!";
89 92
90 my %idx2; 93 my %idx2;
91 94
92 for my $path (@ARGV) { 95 for my $path (@ARGV) {
96 (my $base = $path) =~ s/\.map$//;
93 my $docnum = pack "n", ++$idx{Vdocnum}; 97 my $docnum = pack "n", ++$idx{Vdocnum};
94 $idx{"D$docnum"} = $path; 98 $idx{"D$docnum"} = $base;
95 my $meta = Storable::retrieve "$path.pst"; 99 my $meta = Deliantra::Map->new_from_file ("$base.map");
96 100
97 for my $x (0 .. $meta->{width} - 1) { 101 for my $x (0 .. $meta->{width} - 1) {
98 for my $y (0 .. $meta->{height} - 1) { 102 for my $y (0 .. $meta->{height} - 1) {
99 for my $a (@{ $meta->{map}[$x][$y] }) { 103 for my $a (@{ $meta->{map}[$x][$y] }) {
100 for my $v (values %$a) { 104 for my $v (values %$a) {
115 119
116 while (my ($k, $v) = each %idx2) { 120 while (my ($k, $v) = each %idx2) {
117 $idx{$k} = pack "n*", keys %{ { map +($_ => 1), unpack "n*", $idx{$k}.$v } }; 121 $idx{$k} = pack "n*", keys %{ { map +($_ => 1), unpack "n*", $idx{$k}.$v } };
118 } 122 }
119 123
124 untie %idx;
125
120} elsif ($ARGV[0] eq "-s") { 126} elsif ($ARGV[0] eq "-s") {
121 shift; 127 shift;
122 128
123 search @ARGV; 129 search @ARGV;
124} else { 130} else {
125 # assume CGI 131 # assume CGI
126 chdir "/var/www/cfmaps.schmorp.de" or exit 69; 132# chdir "/var/www/maps.deliantra.net" or exit 69;
127 133
128 print <<EOF; 134 print <<EOF;
129Content-Type: application/xhtml+xml 135Content-Type: application/xhtml+xml
130 136
131EOF 137EOF

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines