/[pub]/suikawiki/script/lib/SuikaWiki/Plugin/WikiPage.wps
Suika

Contents of /suikawiki/script/lib/SuikaWiki/Plugin/WikiPage.wps

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (hide annotations) (download)
Mon Jul 7 11:35:16 2003 UTC (21 years, 9 months ago) by w
Branch: MAIN
Branch point for: branch-suikawiki-1
Changes since 1.15: +27 -11 lines
Use WikiLinking and SuikaWiki::Markup::XML

1 w 1.1 Name:
2     WikiPage
3     FullName:
4     Getting WikiPage information
5     URI:
6     IW:SuikaWiki:WikiAdmin
7 wakaba 1.14 Require:
8     SuikaWiki::Markup::XML main
9 wakaba 1.9 Initialize:
10     my $NS_XHTML1 = 'http://www.w3.org/1999/xhtml';
11 w 1.4
12     {
13     Name:
14     wikiview/search-result
15     wikiform_input/search-result
16     FullName:
17     Search result with the given string
18     Format:
19 wakaba 1.9 $p->{key} ||= $o->{page};
20 w 1.4 my $word = $p->{case_sensible} ? $p->{key} : lc $p->{key};
21     my @r;
22     my $sr = $o->cache ('search');
23     unless (defined $sr->{$word}) {
24     for my $page (keys %main::database) {
25     my ($magic, $content) = $o->magic_and_content ($main::database{$page});
26     $content = $p->{case_sensible} ? $content : lc $content;
27     $content =~ s/^[^\x0A\x0D]+[\x0D\x0A]+//s;
28     if (index (lc $page, $word) > -1) {
29     my $c = $content =~ s/\Q$word\E//g;
30     push @r, [$page, $c+20];
31     } elsif (index ($word, lc $page) > -1) {
32     my $c = $content =~ s/\Q$word\E//g;
33     push @r, [$page, $c+10];
34     } elsif (my $c = $content =~ s/\Q$word\E//g) {
35     push @r, [$page, $c];
36     }
37     }
38     @r = sort {$b->[1] <=> $a->[1] || $a->[0] cmp $b->[0]} @r;
39     $sr->{$word} = join "\x1E", map {$_->[0]."\x1F".$_->[1]} @r;
40     } else {
41     @r = map {[split /\x1F/, $_, 2]} split /\x1E/, $sr->{$word};
42     }
43     my $em = $p->{em} ? sub { my $s = shift; $s =~ s#(\Q$word\E)#<em>$1</em>#gi; $s } : sub {$_[0]};
44 wakaba 1.9 my $ul = SuikaWiki::Markup::XML->new (local_name => 'ul', namespace_uri => $NS_XHTML1);
45     for (@r) {
46     my $li = $ul->append_new_node (local_name => 'li', namespace_uri => $NS_XHTML1);
47     $li->append_text ('{' . $_->[1] . '} ');
48     my $a = $li->append_new_node (local_name => 'a', namespace_uri => $NS_XHTML1);
49     $a->set_attribute (href => $o->uri('wiki').'?'.$o->encode($_->[0]));
50     $a->set_attribute (class => 'wiki');
51     $a->append_text ($_->[0]);
52     $li->append_text (' ');
53     my $hl = $li->append_new_node (local_name => 'span', namespace_uri => $NS_XHTML1);
54     $hl->set_attribute (class => 'headline');
55 wakaba 1.14 $hl->append_text (__PACKAGE__->_get_subjectline ($_->[0]));
56 wakaba 1.9 $ul->append_text ("\n");
57 w 1.4 }
58 wakaba 1.14 $r = $ul if $ul->count;
59 w 1.4 }
60    
61     {
62     Name:
63     wikiview/last-modified
64     wikiview-resource/last-modified
65 w 1.16 wikiform-input/last-modified
66 w 1.4 FullName:
67     Last-modified date & time of the page
68     Format:
69 w 1.16 $r = SuikaWiki::Markup::XML->new (type => '#text', value => &main::_rfc3339_date ($o->_database->mtime ($p->{page} || $o->{page})));
70 w 1.4 }
71     {
72     Name:
73 w 1.16 wikipage-link/last-modified
74 w 1.4 FullName:
75     Last-modified date & time of the page
76     Format:
77 w 1.16 $r = SuikaWiki::Markup::XML->new (type => '#text', value => &main::_rfc3339_date ($o->_database->mtime ($o->{link}->{dest}->{page_name})));
78 w 1.4 }
79 w 1.16
80 w 1.4 {
81     Name:
82 wakaba 1.7 wikiview-resource/page-name
83 w 1.16 wikiform-input/page-name
84 w 1.4 wikiview/page-name
85 wakaba 1.7 wikipage_list_item/page-name
86 w 1.4 FullName:
87     Page name
88     Format:
89 wakaba 1.10 $r = SuikaWiki::Markup::XML->new (type => '#text', value => $o->{page});
90 w 1.4 }
91 wakaba 1.7
92 w 1.4 {
93     Name:
94 wakaba 1.13 wikipage-link/page-name
95     FullName:
96     Name of the WikiPage
97     Format:
98     if ($p->{relative}) {
99 w 1.16 $r = SuikaWiki::Markup::XML->new (type => '#text', value => $o->{link}->{dest}->{page_name_relative});
100     } else {
101     $r = SuikaWiki::Markup::XML->new (type => '#text', value => $o->{link}->{dest}->{page_name});
102     }
103     }
104    
105     {
106     Name:
107     wikipage-link/page-title
108     FullName:
109     Title of the WikiPage
110     Description:
111     Returns title of the destination WikiPage.
112     Note that currently WikiPage itself cannot have page title information
113     so that title not same as WikiName is only able to be specified by
114     generator of the link context. (In other words, customized title is
115     defined by the link, not the page linked to.)
116     Format:
117     if (defined $o->{link}->{dest}->{page_title}) {
118     $r = SuikaWiki::Markup::XML->new (type => '#text', value => $o->{link}->{dest}->{page_title});
119     } elsif ($p->{relative}) {
120 wakaba 1.13 $r = SuikaWiki::Markup::XML->new (type => '#text', value => $o->{link}->{dest}->{page_name_relative});
121     } else {
122     $r = SuikaWiki::Markup::XML->new (type => '#text', value => $o->{link}->{dest}->{page_name});
123     }
124     }
125    
126     {
127     Name:
128     wikipage-link/page-headline
129     FullName:
130     Headline of the WikiPage
131     Format:
132 wakaba 1.14 $r = SuikaWiki::Markup::XML->new (type => '#text', value => __PACKAGE__->_get_subjectline ($o->{link}->{dest}->{page_name}, delimiter => ''));
133 wakaba 1.13 }
134    
135     {
136     Name:
137 w 1.4 wikiview/wiki-link
138 wakaba 1.7 wikiview-resource/wiki-link
139 w 1.4 FullName:
140     Link to the WikiPage
141     Format:
142 wakaba 1.13 $r = &main::make_wikilink ($o->escape ($p->{page}||$o->{page}), anchor => $p->{anchor}, up_to_date => 1);
143 w 1.4 }
144     {
145     Name:
146 wakaba 1.7 wikipage_list_item/wiki-link
147 w 1.4 FullName:
148     Link to the WikiPage
149     Format:
150 wakaba 1.13 $r = $o->_html_wikilink ($o->escape ($p->{page}||$o->{page}), anchor => $p->{anchor}, up_to_date => $p->{up_to_date}, label => $p->{label});
151 w 1.4 }
152    
153     {
154     Name:
155     wikiview/link-wiki
156     FullName:
157     Link element to the wiki itself
158     Format:
159     unless ($p->{href}) {
160     $p->{mode} ||= 'read';
161 wakaba 1.7 $p->{page} ||= $o->{page};
162 w 1.4 $p->{href} = $o->uri('wiki').'?';
163     if ($p->{up_to_date} || $p->{mode} ne 'read' || $p->{add_param}) {
164     $p->{href} .= qq(mypage=@{[$o->encode($p->{page})]};mycmd=@{[$o->encode($p->{mode})]});
165     $p->{href} .= ';'.$p->{add_param} if $p->{add_param};
166     $p->{href} .= ';x-d='.time if $p->{up_to_date};
167     $p->{href} .= ';x-lm='.($main::database->mtime ($p->{page})||0) if $p->{with_lm};
168     } else {
169     $p->{href} .= $o->encode ($p->{page});
170     }
171     }
172     $r = qq(<link);
173 wakaba 1.11 for my $attr (qw/rel rev href title class type hreflang charset accesskey/) {
174 w 1.4 $r .= qq( $attr="@{[$o->escape($p->{$attr})]}") if $p->{$attr};
175     }
176     $r .= '/' if $o->{media}->{type} =~ /xml/;
177     $r .= '>';
178     }
179     {
180     Name:
181     wikiview/anchor-wiki
182     FullName:
183     A element to the wiki page
184     Format:
185 wakaba 1.7 $p->{href} ||= compose_wiki_page_uri ($o, $p, {});
186     $p->{label} = $p->{page} unless length $p->{label};
187     if ($p->{page} ne $p->{label} && !defined $p->{title}) {
188     $p->{title} = $p->{page};
189     }
190     $r = qq(<a);
191     for my $attr (qw/rel rev href class title type hreflang charset target accesskey/) {
192     $r .= qq( $attr="@{[$o->escape($p->{$attr})]}") if $p->{$attr};
193 w 1.4 }
194 wakaba 1.7 $r .= '>' . $o->escape ($p->{label}) . '</a>';
195     }
196     {
197     Name:
198     wikiview-resource/anchor-wiki
199     FullName:
200     A element to the wiki page
201     Format:
202     $p->{href} = compose_wiki_page_uri ($o, $p, {});
203     $p->{label} = $p->{page} unless length $p->{label};
204     if ($p->{page} ne $p->{label} && !defined $p->{title}) {
205     $p->{title} = $p->{page} || $o->{page};
206 w 1.4 }
207     $r = qq(<a);
208 wakaba 1.7 for my $attr (qw/rel rev href class title type hreflang charset target accesskey/) {
209 w 1.4 $r .= qq( $attr="@{[$o->escape($p->{$attr})]}") if $p->{$attr};
210     }
211 wakaba 1.7 $r .= '>' . $o->escape ($p->{label}) . '</a>';
212 w 1.4 }
213    
214     {
215     Name:
216     wikiview/uri-wiki
217     FullName:
218     Output URI of the WikiPage (as anchor)
219     Format:
220     my $uri = $o->uri('wiki').'?'.$o->encode($p->{page}||$o->{page});
221     $r = qq(&lt;<a href="$uri">$uri</a>&gt;);
222 w 1.1 }
223 wakaba 1.6
224     {
225     Name:
226     wikiview/log-hotness
227     FullName:
228     Logging hotness of the page
229     Format:
230     my $db = $o->cache ('hotness', -expires=>7*24*3600, -removes=>7*24*3600);
231     $db->{$o->{page}||$p->{page}} += ($p->{weight} || 1);
232     }
233     {
234     Name:
235     wikiform_input/hotness-list
236     FullName:
237     Hotness-of-pages' list
238     Format:
239     my $db = $o->cache ('hotness', -expires=>7*24*3600, -removes=>7*24*3600);
240     my $i = 0;
241     $r = qq(<ol class="hotness">\n);
242     for (sort {$db->{$b}<=>$db->{$a}} grep {$db->{$_} > $p->{threshold}} keys %$db) {
243     do {$i++; next if $i > $p->{n}} if $p->{n};
244     $r .= qq(<li><a href="@{[$o->uri('wiki')]}?@{[$o->encode($_)]}" class="wiki" title="{@{[$db->{$_}+0]}}">) . $o->escape ($_) . qq(</a></li>\n);
245     }
246     $r .= '</ol>';
247     }
248    
249     MODULE:
250     sub compose_wiki_page_uri ($$$) {
251     my ($o, $p, $q) = @_;
252     $q->{mode} ||= $p->{mode} || 'read';
253     $q->{page} ||= $p->{page} || $o->{page};
254     $q->{add_param} ||= $p->{add_param};
255     $q->{up_to_date} = $p->{up_to_date} unless defined $q->{up_to_date};
256     $q->{with_lm} = $p->{with_lm} unless defined $q->{with_lm};
257     $q->{href} = $o->uri('wiki').'?';
258     if ($q->{up_to_date} || $q->{mode} ne 'read' || $q->{add_param} || $q->{with_lm}) {
259     $q->{href} .= qq(mypage=@{[$o->encode($q->{page})]};mycmd=@{[$o->encode($q->{mode})]});
260     $q->{href} .= ';'.$q->{add_param} if $q->{add_param};
261     $q->{href} .= ';x-d='.time if $q->{up_to_date};
262     $q->{href} .= ';x-lm='.($main::database->mtime ($q->{page})||0) if $q->{with_lm};
263     } else {
264     $q->{href} .= $o->encode ($q->{page});
265     }
266 wakaba 1.7 $q->{href};
267 wakaba 1.6 }
268 wakaba 1.14
269     ## TODO: obsolete this function in the future
270     sub _get_subjectline {
271 wakaba 1.15 my (undef, $page, %option) = @_;
272 wakaba 1.14 my $SubjectLine = SuikaWiki::Plugin->cache ('headline');
273     unless (defined $SubjectLine->{$page}) {
274     if (not &main::is_editable($page)) {
275     $SubjectLine->{$page} = "";
276     } else {
277     $SubjectLine->{$page} = do {
278     my $s=$main::database{$page};
279     $s =~ tr/\x0D//d;
280     $s =~ s!^\#\?[^\x0A\x0D]+[\x0A\x0D]*!!s;
281     $s =~ s/\x0A\x0A.*//s;
282     if (length ($s) > 500) {
283     $s = substr ($s, 0, 500);
284     $s =~ s/[^\x09\x0A\x20-\x7E]+$//s;
285     $s .= '...';
286     }
287     #if ($s =~ /^([^\x0A]*(?:\x0A+[^\x0A]+){0,9})/s) {
288     # $s = $1;
289     #}
290     $s =~ s/[\x09\x0A\x20]+/\x20/gs;
291     $s =~ s/^[-=*>,:]+//;
292     $s =~ s/'''?//g;
293     $s =~ s/\[\[([^]]+)\]\]/$1/g;
294     $s =~ s/__&&([^&]+)&&__/$1/g;
295     $s =~ s/\[[A-Z]+(?:\([^)]+\))?\[([^]]+)\](?:\s\[([^]]+)\])?\]/$1$2/g;
296     $s =~ s/\([^\(\)]+\)//g;
297     $s =~ s/\[[^\[\]]+\]//g;
298     $s =~ s/>>[0-9]+//g;
299     $s =~ s/<[^<>]+>//g;
300     $s =~ s/20[0-9][0-9]-[01][0-9]-[0-3][0-9]\x20*[0-2][0-9]:[0-5][0-9]//g;
301     $s =~ s/ [Aa]n? / /g;
302     $s =~ s/ [Aa]t / @ /g;
303     $s =~ s/ [Tt]he / /g;
304     $s =~ s/,? and / & /g;
305     $s =~ s!,? or ! / !g;
306     $s =~ s! not !n't !g;
307     $s =~ s! (?:i|ha)s !'s !g;
308     $s =~ s! are !'re !g;
309     $s =~ s! [Ww]ith(in|out)? !' w/'.substr ($1,0,1).' '!ge;
310     $s =~ s!です。!。!g;
311     $s =~ s!ました。!た。!g;
312     $s =~ s!ありません!ない!g;
313     $s =~ s!します!する!g;
314     $s =~ s!(?:り)?ます!る!g;
315     $s =~ s!いよいよ|とうとう|ようやく!!g;
316     $s =~ s!とりあえず!!g;
317     $s =~ s!(?:、|。|[.,])\x20?$!!g;
318     $s =~ s/\x20+/\x20/g;
319     if (length ($s) > 400) {
320     $s = substr ($s, 0, 400);
321     $s =~ s/[^\x20-\x7E]+$//s;
322     $s .= '...';
323     }
324     $s};
325     }
326     }
327     if (length $SubjectLine->{$page}) {
328     $option{delimiter} = defined $option{delimiter} ? $option{delimiter} : SuikaWiki::Plugin->resource('Title-Summary Delimiter');
329     $option{delimiter}.$SubjectLine->{$page}.$option{tail};
330     } else {
331     '';
332     }
333     } # main::get_subjectline
334    
335 wakaba 1.11 SuikaWiki::View->template ('links')->add_line (<<EOH);
336     %link-wiki(page=>@{[$main::PageName{SearchPage}]},rel=>search,class=>wiki,title=>"%res(name=>GoToSearchPageLink);"p);
337     EOH
338 wakaba 1.9
339 w 1.1
340     POD:LICENSE:
341     Copyright 2003 Wakaba <w@suika.fam.cx>
342    
343     %%GNUGPL2%%

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24