/[pub]/suikawiki/script/misc/plugins/link/map.wp2
Suika

Diff of /suikawiki/script/misc/plugins/link/map.wp2

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.9 by wakaba, Sat Mar 13 13:43:33 2004 UTC revision 1.15 by wakaba, Tue Sep 21 03:18:22 2004 UTC
# Line 16  Plugin: Line 16  Plugin:
16    @Date.RCS:    @Date.RCS:
17       $Date$       $Date$
18    @RequiredPlugin[list]:    @RequiredPlugin[list]:
19        Search
20      WikiLinking      WikiLinking
21        WikiNamespace
22    @Use:    @Use:
23      use Message::Util::Error;      use Message::Util::Error;
24      my $WIKILINKING;      my $WIKILINKING;
25      my $WIKIRESOURCE;      my $WIKIRESOURCE;
26      @Namespace:
27        @@relrev:
28          http://suika.fam.cx/~wakaba/archive/2004/7/25/html-relrev#
29        @@sw:
30          http://suika.fam.cx/~wakaba/archive/2004/7/20/sw#
31    
32  PluginConst:  PluginConst:
33    @NS_XHTML1:    @NS_XHTML1:
# Line 39  PluginConst: Line 46  PluginConst:
46      {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))}      {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))}
47    
48  FormattingRule:  FormattingRule:
49      @Category[list]: view
50      @Name: m--wikipage-obsolete
51      @Description:
52        @@@:
53          The navigation notify that this WikiPage is obsolete and
54          should refer the other WikiPages.
55        @@lang: en
56      @Parameter:
57        @@Name: desc-after
58        @@Type: template
59        @@Default: (none)
60        @@Description:
61          @@@lang:en
62          @@@@: The description should be located after WikiPage names if any.
63      @Parameter:
64        @@Name: desc-before
65        @@Type: template
66        @@Default: (none)
67        @@Description:
68          @@@lang:en
69          @@@@: The description should be located before WikiPage names if any.
70      @Parameter:
71        @@Name: page
72        @@Type: WikiName
73        @@Default: (current)
74        @@Description:
75          @@@lang: en
76          @@@@: The WikiPage that might be obsoleted.
77      @Formatting:
78          my $page = $o->{wiki}->name ($p->{page} || $o->{wiki}->{var}->{page});
79          my $content_prop;
80          try {
81            $content_prop = $o->{wiki}->{db}->get (content_prop => $page);
82          } catch SuikaWiki::DB::Util::Error with {
83            my $err = shift;
84            $err->throw if $err->{-type} eq 'ERROR_REPORTED';
85          } catch SuikaWiki::Format::Definition::error with {
86            #
87          };
88    
89        if ($content_prop) {
90          my $obs = $content_prop->get_attribute_value
91                                            (<Q:sw:obsolete>, as_array => 1,
92                                             default => []);
93          if (@$obs) {
94            my $pp = $p->{-parent}->append_new_node
95                                     (type => '#element',
96                                      namespace_uri => $NS_XHTML1,
97                                      local_name => 'p');
98            $pp->set_attribute (class => 'm--wikipage-obsolete');
99            __ATTRNODE:%desc_before->{$pp}__;
100            my $i = 0;
101            for (@$obs) {
102              $pp->append_text (', ') if $i++;
103                __FUNCPACK{WikiLinking}__->to_wikipage_in_html (
104                {
105                } => {
106                  base            => $page,
107                  page_name_relative => $o->{wiki}->name ($_),
108                }, {
109                  o               => $o,
110                  parent          => $pp,
111                });
112            }
113            __ATTRNODE:%desc_after->{$pp}__;
114          }
115        }
116    
117    FormattingRule:
118      @Category[list]: view
119      @Name: m--html-link-navigation
120      @Description:
121        @@@: Navigation links (HTML link elements) made from content properties
122        @@lang: en
123      @Parameter:
124        @@Name: page
125        @@Type: WikiName
126        @@Default: (current)
127        @@Description:
128          @@@lang: en
129          @@@@: Target WikiPage
130      @Formatting:
131          my $page = $o->{wiki}->name ($p->{page} || $o->{wiki}->{var}->{page});
132          my $content_prop;
133          try {
134            $content_prop = $o->{wiki}->{db}->get (content_prop => $page);
135          } catch SuikaWiki::DB::Util::Error with {
136            my $err = shift;
137            $err->throw if $err->{-type} eq 'ERROR_REPORTED';
138          } catch SuikaWiki::Format::Definition::error with {
139            #
140          };
141    
142        if ($content_prop) {
143          for my $rel (
144            {uri => <Q:relrev:prev>, html => 'prev'},
145            {uri => <Q:relrev:next>, html => 'next'},
146            {uri => <Q:relrev:contents>, html => 'contents'},
147            {uri => <Q:relrev:index>, html => 'index'},
148            {uri => <Q:relrev:up>, html => 'up'},
149          ) {
150            if (my $val = $content_prop->get_attribute ($rel->{uri})) {
151              $val = $val->value;
152              for (ref $val eq 'ARRAY' ? @$val : $val) {
153                __FUNCPACK{WikiLinking}__->to_wikipage_in_html (
154                {
155                  label           => qq(%html-link (
156                                          description => {%res (name => {Map:LinkNav:$rel->{html}:Description});: %page-name;: %page-headline;}p,
157                                        );\n),
158                } => {
159                  base            => $page,
160                  page_name_relative => $o->{wiki}->name ($_),
161                }, {
162                  o               => $o,
163                  parent          => $p->{-parent},
164                  -rel            => $rel->{html},
165                });
166              }
167            }
168          }
169        }
170    
171    FormattingRule:
172    @Category[list]:    @Category[list]:
173      form-input      form-input
174      view      view
# Line 63  FormattingRule: Line 193  FormattingRule:
193      $list->set_attribute (class => 'm--recent-changes');      $list->set_attribute (class => 'm--recent-changes');
194            
195      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;
     __ATTRTEXT:%n__;  
196      $p->{recursive} = 1 unless length $p->{recursive};      $p->{recursive} = 1 unless length $p->{recursive};
197      my $ns = $o->{wiki}->name ($p->{ns});      my $ns = $o->{wiki}->name ($p->{ns});
198      #$ns->append_component ('') unless $ns->[$#$ns] eq '';  
199      my $i = 0;      my @target = map  { try { [$_, $o->{wiki}->{db}->get (lastmodified => $_)] }
200      $p->{n} ||= 10;                          catch SuikaWiki::DB::Util::Error with {
201                              my $err = shift;
202                              $err->throw if $err->{-type} eq 'ERROR_REPORTED';
203                              [$_, undef]} }
204             $o->{wiki}->{db}->keys ('lastmodified',
205                                     -ns => $ns,
206                                     -type => 'key',
207                                     -recursive => $p->{recursive});
208        try {
209          my $nsmodified = $o->{wiki}->{db}->get (lastmodified => $ns);
210          push @target, [$ns, $nsmodified] if $nsmodified;
211        } catch SuikaWiki::DB::Util::Error with {
212          my $err = shift;
213          $err->throw if $err->{-type} eq 'ERROR_REPORTED';
214        };
215        @target = sort {$b->[1] <=> $a->[1]} @target;
216    
217        __ATTRTEXT:%start__;
218        __ATTRTEXT:%n__;
219        my $start = length $p->{start} ? $p->{start} :
220                    $o->{wiki}->{input}->parameter ('m--change--range-start') || 0;
221        $p->{n} = $o->{wiki}->{input}->parameter ('m--change--range-number')
222                     unless length $p->{n};
223        my $end = $p->{n} ? $start + $p->{n} - 1 : $start + 29;
224        $start = 0 if $start > $#target or $start < 0;
225        $end = $#target if $end < $start or $end > $#target;
226        $end = $start + 255 if $end > $start + 255;
227        local $o->{var}->{search__result} = {
228          min => 0,
229          max => $#target,
230          start => $start,
231          end => $end,
232          number => $p->{n} || 30,
233          query => $p->{query},
234          param_prefix => 'm--change',
235        };
236    
237      __ATTRTEXT:%template__;      __ATTRTEXT:%template__;
238      $p->{template} ||= $WIKIRESOURCE->get      $p->{template} ||= $WIKIRESOURCE->get
239          (name => 'Link:toWikiPage:SourceLabelLong:RecentChangeItem',          (name => 'Link:toWikiPage:SourceLabelLong:RecentChangeItem',
240           wiki => $o->{wiki}, o => $o);           wiki => $o->{wiki}, o => $o);
241      __ATTRTEXT:%mode__;      __ATTRTEXT:%mode__;
242      for (sort {$b->[1] <=> $a->[1]}  
243           map  { try { [$_, $o->{wiki}->{db}->get (lastmodified => $_)] }      for my $target (@target[$start..$end]) {
                 catch SuikaWiki::DB::Util::Error with {  
                   my $err = shift;  
                   $err->throw if $err->{-type} eq 'ERROR_REPORTED';  
                   [$_, undef]} }  
          $o->{wiki}->{db}->keys ('content',  
                                  -ns => $ns,  
                                  -type => 'key',  
                                  -recursive => $p->{recursive})) {  
       next unless $_->[0];  
       last if $i++ == $p->{n};  
         
244        $WIKILINKING->to_wikipage_in_html ({        $WIKILINKING->to_wikipage_in_html ({
245          label => $p->{template},          label => $p->{template},
246        } => {        } => {
247          base => $o->{wiki}->{var}->{page},          base => $o->{wiki}->{var}->{page},
248          page_name_relative => $o->{wiki}->name ($_->[0]),          page_name_relative => $o->{wiki}->name ($target->[0]),
249          wiki_mode => $p->{mode},          wiki_mode => $p->{mode},
250          _with_lm => 1,          _with_lm => 1,
251          page_lastmodified => $_->[1],          page_lastmodified => $target->[1],
252        }, {        }, {
253          o => $o,          o => $o,
254          parent => $list->append_new_node          parent => $list->append_new_node
# Line 104  FormattingRule: Line 258  FormattingRule:
258        });        });
259      }      }
260    
261        if ($list->count) {
262          $list->set_attribute (start => $start + 1);
263          __ATTRNODE:%post_list->{$p->{-parent}}__;
264        } else {
265          $p->{-parent}->remove_child_node ($list);
266        }
267    
268    ViewDefinition:
269      @Mode: m--change
270      @Condition:
271        @@http-method[list]:
272          GET
273          HEAD
274          POST
275      @Description:
276        @@@: Show recently changed WikiPages list
277        @@lang: en
278      @template:
279        @@http-status-code: 200
280        @@media-type: text/html
281        @@use-media-type-charset: 1
282        @@expires: %%list%%
283        @@body:
284            %html-document (
285              title => {%res (name => {Map:Change:WebPageTitle});}p,
286              link-meta => {%template (name => links);}p,
287              content => {
288                %block (
289                  id => tools1, class => tools,
290                  content => {%template (name => navbar);}p,
291                );
292                %section (
293                  title => {%res (name => {Map:Change:Title});}p,
294                  heading,
295                  id => WEBPAGE--M--CHANGE,
296                  content => {%recent-change-list (
297                    n => 50,
298                    ns => {%page-name;}p,
299                    post-list => {%search--result-navigation (
300                      fragment => WEBPAGE--M--CHANGE,
301                    );}p,
302                  );}p,
303                );
304                %block (
305                  id => footer,
306                  content => {%template (name => ws--footer);}p,
307                );
308              }p,
309            );
310    
311    
312  FormattingRule:  FormattingRule:
313    @Category[list]:    @Category[list]:
314      form-input      form-input
# Line 128  FormattingRule: Line 333  FormattingRule:
333                                   local_name => 'ul');                                   local_name => 'ul');
334            
335      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;
     __ATTRTEXT:%n__;  
336      $p->{recursive} = 1 unless length $p->{recursive};      $p->{recursive} = 1 unless length $p->{recursive};
337      my $ns = $o->{wiki}->name ($p->{ns});      my $ns = $o->{wiki}->name ($p->{ns});
338      #$ns->append_component ('') unless $ns->[$#$ns] eq '';  
339      my $i = 0;      my @target = sort {$a->[1] cmp $b->[1]}
340      $p->{n} ||= -1;             map {[$_, join "\t", @{$_}]} # make sort key
341               $o->{wiki}->{db}->keys ('content',
342                                       -ns => $ns,
343                                       -type => 'key',
344                                       -recursive => $p->{recursive});
345    
346        __ATTRTEXT:%start__;
347        __ATTRTEXT:%n__;
348        my $start = length $p->{start} ? $p->{start} :
349                    $o->{wiki}->{input}->parameter ('m--list--range-start') || 0;
350        $p->{n} = $o->{wiki}->{input}->parameter ('m--list--range-number')
351                     unless length $p->{n};
352        my $end = $p->{n} ? $start + $p->{n} - 1 : $start + 29;
353        $start = 0 if $start > $#target or $start < 0;
354        $end = $#target if $end < $start or $end > $#target;
355        $end = $start + 255 if $end > $start + 255;
356        local $o->{var}->{search__result} = {
357          min => 0,
358          max => $#target,
359          start => $start,
360          end => $end,
361          number => $p->{n} || 30,
362          query => $p->{query},
363          param_prefix => 'm--list',
364        };
365    
366      __ATTRTEXT:%template__;      __ATTRTEXT:%template__;
367      $p->{template} ||= $WIKIRESOURCE->get      $p->{template} ||= $WIKIRESOURCE->get
368          (name => 'Link:toWikiPage:SourceLabelLong:PageList',          (name => 'Link:toWikiPage:SourceLabelLong:PageList',
369           wiki => $o->{wiki}, o => $o);           wiki => $o->{wiki}, o => $o);
370      __ATTRTEXT:%match__; ## WARNING: This parameter might be dangerous!  
     my $reg = $p->{match} ? qr/$p->{match}/ : qr/./;  
371      __ATTRTEXT:%mode__;      __ATTRTEXT:%mode__;
372      try {      try {
373        for (sort {$a->[1] cmp $b->[1]}        for (@target[$start..$end]) {
            grep {$_->[1] =~ /$reg/}  
            map {[$_, join '//', @{$_}]} # make sort key  
            $o->{wiki}->{db}->keys ('content',  
                                    -ns => $ns,  
                                    -type => 'key',  
                                    -recursive => $p->{recursive})) {  
         last if $i++ == $p->{n};  
           
374          $WIKILINKING->to_wikipage_in_html ({          $WIKILINKING->to_wikipage_in_html ({
375            label => $p->{template},            label => $p->{template},
376          } => {          } => {
# Line 169  FormattingRule: Line 389  FormattingRule:
389        my $err = shift;        my $err = shift;
390        $err->throw if $err->{-type} eq 'ERROR_REPORTED';        $err->throw if $err->{-type} eq 'ERROR_REPORTED';
391      };      };
     $p->{-parent}->remove_child_node ($list) unless $list->count;  
392    
393  FormattingRule:      if ($list->count) {
394    @Category[list]:        $list->set_attribute (start => $start + 1);
395      form-input        __ATTRNODE:%post_list->{$p->{-parent}}__;
     view  
     view-resource  
   @Name: search-result  
   @Formatting:  
     __ATTRTEXT:%key__;  
     $p->{key} ||= $o->{wiki}->{var}->{page}->stringify (wiki => $o->{wiki});  
     __ATTRTEXT:%case_sensible__;  
     my $word = $p->{case_sensible} ? $p->{key} : lc $p->{key};  
     my @r;  
     my $sr = $o->{wiki}->{db}->get (m__search_result => [$word]);  
     unless ($sr) {  
       for my $page ($o->{wiki}->{db}->keys ('content')) {  
         my $content;  
         try {  
           $content = $o->{wiki}->{db}->get (content => $page);  
         } catch SuikaWiki::DB::Util::Error with {  
           my $err = shift;  
           $err->throw if $err->{-type} eq 'ERROR_REPORTED';  
           $content = undef;  
         };  
         $content = $p->{case_sensitive} ? $content : lc $content;  
         $content =~ s/^[^\x0A\x0D]+[\x0D\x0A]+//s;  
         $page = $o->{wiki}->name ($page);  
         my $n_page = $page->stringify (wiki => $o->{wiki});  
         $n_page = lc $n_page unless $p->{case_sensible};  
         if (index ($n_page, $word) > -1) {  
                my $c = $content =~ s/\Q$word\E//g;  
                 push @r, [$page, $c+20];  
               } elsif (index ($word, $n_page) > -1) {  
                 my $c = $content =~ s/\Q$word\E//g;  
                 push @r, [$page, $c+10];  
               } elsif (my $c = $content =~ s/\Q$word\E//g) {  
                 push @r, [$page, $c];  
               }  
       }  
       @r = sort {$b->[1] <=> $a->[1] || $a->[0] cmp $b->[0]} @r;  
       $sr = join "\x1E",  
             map {$_->[0]->stringify (wiki => $o->{wiki}, delimiter => "\x1D")  
                  ."\x1F".$_->[1]} @r;  
       $o->{wiki}->{db}->set (m__search_result => [$word] => $sr);  
 ## TODO: Cache & case-sensitivility  
396      } else {      } else {
397        @r = map {[$o->{wiki}->name ($_->[0], delimiter_reg => qr/\x1D/), $_->[1]]}        $p->{-parent}->remove_child_node ($list);
            map {[split /\x1F/, $_, 2]} split /\x1E/, $sr;  
398      }      }
399        return unless @r;  
       my $list = $p->{-parent}->append_new_node  
                                 (type => '#element',  
                                  namespace_uri => $NS_XHTML1,  
                                  local_name => 'ol');  
       __ATTRTEXT:%template__;  
       $p->{template} ||= $WIKIRESOURCE->get  
           (name => 'Link:toWikiPage:SourceLabelLong:SearchResult',  
            wiki => $o->{wiki}, o => $o);  
       for (@r) {  
         $WIKILINKING->to_wikipage_in_html ({  
           label => $p->{template},  
         } => {  
           base => $o->{wiki}->{var}->{page},  
           page_name_relative => $_->[0],  
           wiki_mode => $p->{mode},  
         }, {  
           o => $o,  
           parent => $list->append_new_node  
                           (type => '#element',  
                            namespace_uri => $NS_XHTML1,  
                            local_name => 'li'),  
           -m__weight => $_->[1],  
         });  
       }  
400    
401  FormattingRule:  FormattingRule:
402    @Category[list]:    @Category[list]:
# Line 266  ViewFragment: Line 419  ViewFragment:
419                       ns       => {%page-name;}p, recursive => 0,                       ns       => {%page-name;}p, recursive => 0,
420                       type     => both,                       type     => both,
421                       template => {%resource-as-plain-text (name => {Children:Item});}p,                       template => {%resource-as-plain-text (name => {Children:Item});}p,
422                         post-list => {%search--result-navigation (
423                           fragment => children,
424                         );}p,
425                     );}p,                     );}p,
426      );      );
427          %section (  
428            id => see-also,  ViewFragment:
429            title => {%res(name=>SeeAlso);}p, heading,    @Name: navbar
430            content => {%search-result;}p,    @Order: 21
431          );    @Formatting:
432        %link-to-wikipage (
433          page => {%ns--root-wikiname;}p,
434          mode => m--change,
435          label => {%link-to-it (
436            label => {%res (name => GoToRecentChanges);}p,
437            description => {%res (name => GoToRecentChangesLong);}p,
438          );},
439          rel => news,
440        );
441    
442    ViewFragment:
443      @Name: links
444      @Formatting:
445        %m--html-link-navigation;
446    
447        %link-to-wikipage (
448          page => {%ns--root-wikiname;}p,
449          rel => news,
450          mode => m--change,
451          label => {%html-link (
452                      description => {%res(name=>GoToRecentChangesLink);}p,
453                    );},
454        );
455        %link-to-wikipage (
456          page => {%ns-page-path-name;}p,
457          rel => news,
458          mode => m--change,
459          label => {%html-link (
460            description => {%res(name=> {Map:Change:Link:Parent:Description});}p,
461          );},
462        );
463        %link-to-wikipage (
464          rel => news,
465          mode => m--change,
466          label => {%html-link (
467            description => {%res(name=> {Map:Change:Link:Local:Description});}p,
468          );},
469        );
470    
471  Resource:  Resource:
472    @Children:Title:    @Children:Title:
# Line 300  Resource: Line 494  Resource:
494        description=>{%page-name(absolute);}p,        description=>{%page-name(absolute);}p,
495      );      );
496      %span(class=>headline,content=>{%page-headline;}p);      %span(class=>headline,content=>{%page-headline;}p);
   
 ## TODO: Make recent-changes page name customizable  
 ViewFragment:  
   @Name: navbar  
   @Order: 21  
   @Formatting:  
     %link-to-wikipage (  
       page => {RecentChanges},  
       label => {%link-to-it (  
         label => {%res (name => GoToRecentChanges);}p,  
         description => {%res (name => GoToRecentChangesLong);}p,  
       );},  
       rel => news,  
     );  
   
 ## TODO:  
 ViewFragment:  
   @Name: links  
   @Formatting:  
     %link-to-wikipage (  
       page => {RecentChanges},  
       rel => news,  
       label => {%html-link (  
                   description => {%res(name=>GoToRecentChangesLink);}p,  
                 );},  
     );  
   
 Resource:  
497    @GoToRecentChanges:    @GoToRecentChanges:
498      @@@: Recent      @@@: Recent
499      @@lang: en      @@lang: en
# Line 337  Resource: Line 503  Resource:
503    @GoToRecentChangesLong:    @GoToRecentChangesLong:
504      @@@: Review recently modified WikiPages list      @@@: Review recently modified WikiPages list
505      @@lang: en      @@lang: en
506      @Map:Change:Link:Local:Description:
507        @@@: List of recently modified WikiPages in this namespace (%page-name;)
508        @@lang: en
509      @Map:Change:Link:Parent:Description:
510        @@@:
511          List of recently modified WikiPages in parent namespace
512          (%ns-page-path-name;)
513        @@lang: en
514      @Map:Change:Title:
515        @@@: Recent Changes
516        @@lang: en
517      @Map:Change:WebPageTitle:
518        @@@: Recent Changes (%page-name;)
519        @@lang: en
520      @Map:LinkNav:prev:Description:
521        @@lang: en
522        @@@: Previous WikiPage
523      @Map:LinkNav:next:Description:
524        @@lang: en
525        @@@: Next WikiPage
526      @Map:LinkNav:contents:Description:
527        @@lang: en
528        @@@: Table of Contents
529      @Map:LinkNav:index:Description:
530        @@lang: en
531        @@@: Index
532      @Map:LinkNav:up:Description:
533        @@lang: en
534        @@@: Up
535    
536    
537      
538    
539    

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.15

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24