-
Notifications
You must be signed in to change notification settings - Fork 3
/
autocorrect-v0i1
179 lines (150 loc) · 5.67 KB
/
autocorrect-v0i1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# Blosxom Plugin: autocorrect -*- perl -*-
# Author: Todd Larason ([email protected])
# Version: 0+1i
# Blosxom Home/Docs/Licensing: http://www.raelity.org/blosxom
# AutoCorrect plugin Home/Docs/Licensing:
# http://molelog.molehill.org/blox/Computers/Internet/Web/Blosxom/AutoCorrect/
package autocorrect;
# --- Configuration Variables ---
$debug_level ||= 1;
# -------------------------------
use CGI;
use FileHandle;
my $package = 'autocorrect';
my @goodhits = ();
my $activated = 0;
my %template = ();
my $flav_cache;
sub debug {
my ($level, @msg) = @_;
if ($debug_level >= $level) {
print STDERR "$package debug $level: @msg\n";
}
}
sub load_template {
my ($bit) = @_;
my $fh = new FileHandle;
return $flav_cache{$bit} ||=
($fh->open("< $blosxom::datadir/$package.$bit.$blosxom::flavour") ?
join '',<$fh> : $template{$blosxom::flavour}{$bit}) ||
($fh->open("< $blosxom::datadir/$package.$bit.$blosxom::default_flavour") ?
join '',<$fh> : $template{$blosxom::default_flavour}{$bit}) ||
($fh->open("< $blosxom::datadir/$package.$bit.html") ?
join '',<$fh> : $template{html}{$bit}) ||
'';
}
sub report {
my ($bit, $path, $text) = @_;
my $f = load_template($bit);
$f =~ s/((\$[\w:]+)|(\$\{[\w:]+\}))/$1 . "||''"/gee;
return $f;
}
sub start {
if ($blosxom::static_or_dynamic eq 'dynamic') {
debug(1, "start() called, enabled");
while (<DATA>) {
last if /^(__END__)?$/;
my ($flavour, $comp, $txt) = split ' ',$_,3;
$txt =~ s:\\n:\n:g;
$template{$flavour}{$comp} = $txt;
}
return 1;
} else {
debug(1, "start() called, but in static mode -- not enabling");
return 0;
}
}
sub filter {
my ($pkg, $files_ref) = @_;
my $datepart;
my $path_info = path_info();
debug(2, "filter() called, path_info = $path_info");
# handle normal cases as fast as possible -- no path, a category
# path, or a category + file that exists
return 1 if ($path_info eq '');
return 1 if ($path_info !~ s!\.[^.]+$!.$blosxom::file_extension!);
return 1 if (defined($files_ref->{"$blosxom::datadir$path_info"}));
debug(2, "fasttrack failed, splitting path");
# at this point, $path_info is (category + optional date + filename)
# and either the file doesn't exist in that category, or the
# date field is being used along with a full filename
# this is straight from blosxom itself, and should be kept in-sync
my @path_info = split '/', $path_info;
my $filename = pop @path_info;
return 1 if ($filename eq "index.$blosxom::file_extension");
shift @path_info; # remove empty '' before first /
$path_info = '';
while ($path_info[0] and
$path_info[0] =~ /^[a-zA-Z].*$/ and
$path_info[0] !~ /(.*)\.(.*)/) {
$path_info .= '/' . shift @path_info;
}
debug(2, "path_info=$path_info, filename=$filename");
# @path_info may have date info in it still, but we're not interested
return 1 if defined($files_ref->{"blosxom::datadir$path_info/$filename"});
debug(2, "Still not found, looking for good matches");
# okay, it doesn't exist -- it's okay to spend some time now, since
# slow results are better than no results
# XXX this should be quite a bit smarter -- 'sounds like', 'typoed like'
# look at what mod_speling does
$activated = 1;
foreach (keys %$files_ref) {
my ($this_filename) = m:([^/]+)$:;
if ($filename eq $this_filename) {
push(@goodhits, $_);
debug(2, "Found good hit: $_");
}
}
$files_ref->{"$blosxom::datadir$path_info/$filename"} =
$#goodhits == 0 ? $files_ref->{$goodhits[0]} : time;
return 1;
}
sub story {
return 1 if !$activated;
my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_;
if ($#goodhits == -1) {
debug(2, "in story(), no good hits");
$$title_ref = report('not_found_title');
$$body_ref = report('not_found_body');
} elsif ($#goodhits == 0) {
debug(2, "in story(), 1 good hit");
# just one, easy case to deal with
my $fh = new FileHandle;
if ($fh->open($goodhits[0])) {
debug(3, "opened $goodhits[0]");
# convert from filename to path+filename (w/o extension)
$goodhits[0] =~ s!$blosxom::datadir(.*)\.[^./]+$!\1!;
chomp(my $title = <$fh>);
$$title_ref = report('found_one_title', $goodhits[0], $title);
$$body_ref = report('found_one_body',$goodhits[0],(join '',<$fh>));
} else {
debug(3, "Couldn't open $goodhits[0]: $!");
$goodhits[0] =~ s!$blosxom::datadir(.*)\.[^./]+$!\1!;
$$title_ref = report('error_title', $goodhits[0]);
$$body_ref = report('error_body', $goodhits[0]);
}
} else {
debug(2, "in story(), multiple matches");
$$title_ref = report('multi_title');
$$body_ref = report('multi_body_head');
map {
$_ =~ s!$blosxom::datadir(.*)\.[^./]+$!\1!;
$$body_ref .= report('multi_body_item', $_)
} @goodhits;
$$body_ref .= report('multi_body_foot');
}
return 1;
}
1;
__DATA__
html not_found_title Not Found
html not_found_body <p>The file you asked for doesn't exist, and I'm afraid I couldn't find a good match for it. I'm sorry.</p>\n
html found_one_title $text
html found_one_body <p>The file you asked for doesn't exist; it may have been moved. This is actually <a href="$blosxom::url$path.$blosxom::flavour">$path</a>.</p><hr>$text
html error_title Error
html error_body <p>The file you asked for doesn't exist, and I thought I'd found a replacement with $path, but I can't open it. Sorry</p>
html multi_title Possible Matches
html multi_body_head <p>The file you asked for doesn't exist. Some possible matches are:</p><ul>\n
html multi_body_item <li><a href="$blosxom::url$path.$blosxom::flavour">$path</a></li>\n
html multi_body_foot </ul>\n
__END__