/[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.2 by wakaba, Sun Feb 8 08:46:47 2004 UTC revision 1.13 by wakaba, Sun Jul 25 06:54:29 2004 UTC
# Line 6  Plugin: Line 6  Plugin:
6      @@@:      @@@:
7        Visualization of page to page relatinships        Visualization of page to page relatinships
8      @@lang:en      @@lang:en
9    @License: %%GPL%%    @License: %%Perl%%
10    @Author:    @Author:
11      @@Name:      @@Name:
12        @@@@: Wakaba        @@@@: Wakaba
# 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    
30  PluginConst:  PluginConst:
31    @NS_XHTML1:    @NS_XHTML1:
# Line 39  PluginConst: Line 44  PluginConst:
44      {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))}      {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))}
45    
46  FormattingRule:  FormattingRule:
47      @Category[list]: view
48      @Name: m--html-link-navigation
49      @Description:
50        @@@: Navigation links (HTML link elements) made from content properties
51        @@lang: en
52      @Parameter:
53        @@Name: page
54        @@Type: WikiName
55        @@Default: (current)
56        @@Description:
57          @@@lang: en
58          @@@@: Target WikiPage
59      @Formatting:
60          my $page = $o->{wiki}->name ($p->{page} || $o->{wiki}->{var}->{page});
61          my $content_prop;
62          try {
63            $content_prop = $o->{wiki}->{db}->get (content_prop => $page);
64          } catch SuikaWiki::DB::Util::Error with {
65            my $err = shift;
66            $err->throw if $err->{-type} eq 'ERROR_REPORTED';
67          } catch SuikaWiki::Format::Definition::error with {
68            #
69          };
70    
71        if ($content_prop) {
72          for (
73            {uri => <Q:relrev:prev>, html => 'prev'},
74            {uri => <Q:relrev:next>, html => 'next'},
75            {uri => <Q:relrev:contents>, html => 'contents'},
76            {uri => <Q:relrev:index>, html => 'index'},
77            {uri => <Q:relrev:up>, html => 'up'},
78          ) {
79            if (my $val = $content_prop->get_attribute ($_->{uri})) {
80              __FUNCPACK{WikiLinking}__->to_wikipage_in_html (
81              {
82                label           => qq(%html-link (
83                                        description => {%res (name => {Map:LinkNav:$_->{html}:Description});: %page-name;: %page-headline;}p,
84                                      );\n),
85              } => {
86                base            => $page,
87                page_name_relative => $o->{wiki}->name ($val->value),
88              }, {
89                o               => $o,
90                parent          => $p->{-parent},
91                -rel            => $_->{html},
92              });
93            }
94          }
95        }
96    
97    FormattingRule:
98    @Category[list]:    @Category[list]:
99      form-input      form-input
100      view      view
# Line 63  FormattingRule: Line 119  FormattingRule:
119      $list->set_attribute (class => 'm--recent-changes');      $list->set_attribute (class => 'm--recent-changes');
120            
121      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;
     __ATTRTEXT:%n__;  
122      $p->{recursive} = 1 unless length $p->{recursive};      $p->{recursive} = 1 unless length $p->{recursive};
123      my $ns = $o->{wiki}->name ($p->{ns});      my $ns = $o->{wiki}->name ($p->{ns});
124      #$ns->append_component ('') unless $ns->[$#$ns] eq '';  
125      my $i = 0;      my @target = map  { try { [$_, $o->{wiki}->{db}->get (lastmodified => $_)] }
126      $p->{n} ||= 10;                          catch SuikaWiki::DB::Util::Error with {
127                              my $err = shift;
128                              $err->throw if $err->{-type} eq 'ERROR_REPORTED';
129                              [$_, undef]} }
130             $o->{wiki}->{db}->keys ('lastmodified',
131                                     -ns => $ns,
132                                     -type => 'key',
133                                     -recursive => $p->{recursive});
134        try {
135          my $nsmodified = $o->{wiki}->{db}->get (lastmodified => $ns);
136          push @target, [$ns, $nsmodified] if $nsmodified;
137        } catch SuikaWiki::DB::Util::Error with {
138          my $err = shift;
139          $err->throw if $err->{-type} eq 'ERROR_REPORTED';
140        };
141        @target = sort {$b->[1] <=> $a->[1]} @target;
142    
143        __ATTRTEXT:%start__;
144        __ATTRTEXT:%n__;
145        my $start = length $p->{start} ? $p->{start} :
146                    $o->{wiki}->{input}->parameter ('m--change--range-start') || 0;
147        $p->{n} = $o->{wiki}->{input}->parameter ('m--change--range-number')
148                     unless length $p->{n};
149        my $end = $p->{n} ? $start + $p->{n} - 1 : $start + 29;
150        $start = 0 if $start > $#target or $start < 0;
151        $end = $#target if $end < $start or $end > $#target;
152        $end = $start + 255 if $end > $start + 255;
153        local $o->{var}->{search__result} = {
154          min => 0,
155          max => $#target,
156          start => $start,
157          end => $end,
158          number => $p->{n} || 30,
159          query => $p->{query},
160          param_prefix => 'm--change',
161        };
162    
163      __ATTRTEXT:%template__;      __ATTRTEXT:%template__;
164      $p->{template} ||= $WIKIRESOURCE->get      $p->{template} ||= $WIKIRESOURCE->get
165          (name => 'Link:toWikiPage:SourceLabelLong:RecentChangeItem',          (name => 'Link:toWikiPage:SourceLabelLong:RecentChangeItem',
166           wiki => $o->{wiki}, o => $o);           wiki => $o->{wiki}, o => $o);
167      __ATTRTEXT:%mode__;      __ATTRTEXT:%mode__;
168      for (sort {$b->[1] <=> $a->[1]}  
169           map  { try { [$_, $o->{wiki}->{db}->get (lastmodified => $_)] }      for my $target (@target[$start..$end]) {
                 catch SuikaWiki::DB::Util::Error with {[$_, undef]} }  
          $o->{wiki}->{db}->keys ('content',  
                                  -ns => $ns,  
                                  -type => 'key',  
                                  -recursive => $p->{recursive})) {  
       next unless $_->[0];  
       last if $i++ == $p->{n};  
         
       my $li = $list->append_new_node  
                         (type => '#element',  
                          namespace_uri => $NS_XHTML1,  
                          local_name => 'li');  
170        $WIKILINKING->to_wikipage_in_html ({        $WIKILINKING->to_wikipage_in_html ({
171          label => $p->{template},          label => $p->{template},
172        } => {        } => {
173          base => $o->{wiki}->{var}->{page},          base => $o->{wiki}->{var}->{page},
174          page_name_relative => $o->{wiki}->name ($_->[0]),          page_name_relative => $o->{wiki}->name ($target->[0]),
175          wiki_mode => $p->{mode},          wiki_mode => $p->{mode},
176          _with_lm => 1,          _with_lm => 1,
177          page_lastmodified => $_->[1],          page_lastmodified => $target->[1],
178        }, {        }, {
179          o => $o,          o => $o,
180          parent => $li,          parent => $list->append_new_node
181                            (type => '#element',
182                             namespace_uri => $NS_XHTML1,
183                             local_name => 'li'),
184        });        });
185      }      }
186    
187        if ($list->count) {
188          $list->set_attribute (start => $start + 1);
189          __ATTRNODE:%post_list->{$p->{-parent}}__;
190        } else {
191          $p->{-parent}->remove_child_node ($list);
192        }
193    
194    ViewDefinition:
195      @Mode: m--change
196      @Condition:
197        @@http-method[list]:
198          GET
199          HEAD
200          POST
201      @Description:
202        @@@: Show recently changed WikiPages list
203        @@lang: en
204      @template:
205        @@http-status-code: 200
206        @@media-type: text/html
207        @@use-media-type-charset: 1
208        @@expires: %%list%%
209        @@body:
210            %html-document (
211              title => {%res (name => {Map:Change:WebPageTitle});}p,
212              link-meta => {%template (name => links);}p,
213              content => {
214                %block (
215                  id => tools1, class => tools,
216                  content => {%template (name => navbar);}p,
217                );
218                %section (
219                  title => {%res (name => {Map:Change:Title});}p,
220                  heading,
221                  id => WEBPAGE--M--CHANGE,
222                  content => {%recent-change-list (
223                    n => 50,
224                    ns => {%page-name;}p,
225                    post-list => {%search--result-navigation (
226                      fragment => WEBPAGE--M--CHANGE,
227                    );}p,
228                  );}p,
229                );
230                %block (
231                  id => footer,
232                  content => {%template (name => ws--footer);}p,
233                );
234              }p,
235            );
236    
237    
238  FormattingRule:  FormattingRule:
239    @Category[list]:    @Category[list]:
240      form-input      form-input
# Line 126  FormattingRule: Line 259  FormattingRule:
259                                   local_name => 'ul');                                   local_name => 'ul');
260            
261      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;      __ATTRTEXT:%ns__;__ATTRTEXT:%recursive__;
     __ATTRTEXT:%n__;  
262      $p->{recursive} = 1 unless length $p->{recursive};      $p->{recursive} = 1 unless length $p->{recursive};
263      my $ns = $o->{wiki}->name ($p->{ns});      my $ns = $o->{wiki}->name ($p->{ns});
264      #$ns->append_component ('') unless $ns->[$#$ns] eq '';  
265      my $i = 0;      my @target = sort {$a->[1] cmp $b->[1]}
266      $p->{n} ||= -1;             map {[$_, join "\t", @{$_}]} # make sort key
267               $o->{wiki}->{db}->keys ('content',
268                                       -ns => $ns,
269                                       -type => 'key',
270                                       -recursive => $p->{recursive});
271    
272        __ATTRTEXT:%start__;
273        __ATTRTEXT:%n__;
274        my $start = length $p->{start} ? $p->{start} :
275                    $o->{wiki}->{input}->parameter ('m--list--range-start') || 0;
276        $p->{n} = $o->{wiki}->{input}->parameter ('m--list--range-number')
277                     unless length $p->{n};
278        my $end = $p->{n} ? $start + $p->{n} - 1 : $start + 29;
279        $start = 0 if $start > $#target or $start < 0;
280        $end = $#target if $end < $start or $end > $#target;
281        $end = $start + 255 if $end > $start + 255;
282        local $o->{var}->{search__result} = {
283          min => 0,
284          max => $#target,
285          start => $start,
286          end => $end,
287          number => $p->{n} || 30,
288          query => $p->{query},
289          param_prefix => 'm--list',
290        };
291    
292      __ATTRTEXT:%template__;      __ATTRTEXT:%template__;
293      $p->{template} ||= $WIKIRESOURCE->get      $p->{template} ||= $WIKIRESOURCE->get
294          (name => 'Link:toWikiPage:SourceLabelLong:PageList',          (name => 'Link:toWikiPage:SourceLabelLong:PageList',
295           wiki => $o->{wiki}, o => $o);           wiki => $o->{wiki}, o => $o);
296    
297      __ATTRTEXT:%mode__;      __ATTRTEXT:%mode__;
298      try {      try {
299        for (sort {$a->[1] cmp $b->[1]}        for (@target[$start..$end]) {
            map {[$_, join '//', @{$_}]} # make sort key  
            $o->{wiki}->{db}->keys ('content',  
                                    -ns => $ns,  
                                    -type => 'key',  
                                    -recursive => $p->{recursive})) {  
         last if $i++ == $p->{n};  
           
         my $li = $list->append_new_node  
                           (type => '#element',  
                            namespace_uri => $NS_XHTML1,  
                            local_name => 'li');  
300          $WIKILINKING->to_wikipage_in_html ({          $WIKILINKING->to_wikipage_in_html ({
301            label => $p->{template},            label => $p->{template},
302          } => {          } => {
# Line 158  FormattingRule: Line 305  FormattingRule:
305            wiki_mode => $p->{mode},            wiki_mode => $p->{mode},
306          }, {          }, {
307            o => $o,            o => $o,
308            parent => $li,            parent => $list->append_new_node
309                              (type => '#element',
310                               namespace_uri => $NS_XHTML1,
311                               local_name => 'li'),
312          });          });
313        }        }
314      } catch SuikaWiki::DB::Util::Error with {      } catch SuikaWiki::DB::Util::Error with {
315        #        my $err = shift;
316          $err->throw if $err->{-type} eq 'ERROR_REPORTED';
317      };      };
     $p->{-parent}->remove_child_node ($list) unless $list->count;  
318    
319  FormattingRule:      if ($list->count) {
320    @Category[list]:        $list->set_attribute (start => $start + 1);
321      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 {  
           $content = undef;  
         };  
         $content = $p->{case_sensible} ? $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-sensibility  
322      } else {      } else {
323        @r = map {[$o->{wiki}->name ($_->[0], delimiter_reg => qr/\x1D/), $_->[1]]}        $p->{-parent}->remove_child_node ($list);
            map {[split /\x1F/, $_, 2]} split /\x1E/, $sr;  
324      }      }
325        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) {  
         my $li = $list->append_new_node  
                           (type => '#element',  
                            namespace_uri => $NS_XHTML1,  
                            local_name => 'li');  
         $WIKILINKING->to_wikipage_in_html ({  
           label => $p->{template},  
         } => {  
           base => $o->{wiki}->{var}->{page},  
           page_name_relative => $_->[0],  
           wiki_mode => $p->{mode},  
         }, {  
           o => $o,  
           parent => $li,  
           -m__weight => $_->[1],  
         });  
       }  
326    
327  FormattingRule:  FormattingRule:
328    @Category[list]:    @Category[list]:
# Line 249  FormattingRule: Line 334  FormattingRule:
334  ViewFragment:  ViewFragment:
335    @Name: ws--post-content    @Name: ws--post-content
336    @Description:    @Description:
337      @@@: After content body -- navigation bar      @@@: After content body -- children and backward links
338      @@lang:en      @@lang:en
339    @Order: 100    @Order: 100
340    @Formatting:    @Formatting:
# Line 260  ViewFragment: Line 345  ViewFragment:
345                       ns       => {%page-name;}p, recursive => 0,                       ns       => {%page-name;}p, recursive => 0,
346                       type     => both,                       type     => both,
347                       template => {%resource-as-plain-text (name => {Children:Item});}p,                       template => {%resource-as-plain-text (name => {Children:Item});}p,
348                         post-list => {%search--result-navigation (
349                           fragment => children,
350                         );}p,
351                     );}p,                     );}p,
352      );      );
353          %section (  
354            id => see-also,  ViewFragment:
355            title => {%res(name=>SeeAlso);}p, heading,    @Name: navbar
356            content => {%search-result;}p,    @Order: 21
357          );    @Formatting:
358          %section (      %link-to-wikipage (
359            id => referer,        page => {%ns--root-wikiname;}p,
360            title => {%res(name=>Referer);}p, heading,        mode => m--change,
361            content => {%referer-list;}p,        label => {%link-to-it (
362          );          label => {%res (name => GoToRecentChanges);}p,
363            description => {%res (name => GoToRecentChangesLong);}p,
364          );},
365          rel => news,
366        );
367    
368    ViewFragment:
369      @Name: links
370      @Formatting:
371        %m--html-link-navigation;
372    
373        %link-to-wikipage (
374          page => {%ns--root-wikiname;}p,
375          rel => news,
376          mode => m--change,
377          label => {%html-link (
378                      description => {%res(name=>GoToRecentChangesLink);}p,
379                    );},
380        );
381        %link-to-wikipage (
382          page => {%ns-page-path-name;}p,
383          rel => news,
384          mode => m--change,
385          label => {%html-link (
386            description => {%res(name=> {Map:Change:Link:Parent:Description});}p,
387          );},
388        );
389        %link-to-wikipage (
390          rel => news,
391          mode => m--change,
392          label => {%html-link (
393            description => {%res(name=> {Map:Change:Link:Local:Description});}p,
394          );},
395        );
396    
397  Resource:  Resource:
398    @Children:Title:    @Children:Title:
# Line 299  Resource: Line 420  Resource:
420        description=>{%page-name(absolute);}p,        description=>{%page-name(absolute);}p,
421      );      );
422      %span(class=>headline,content=>{%page-headline;}p);      %span(class=>headline,content=>{%page-headline;}p);
423      @GoToRecentChanges:
424        @@@: Recent
425        @@lang: en
426      @GoToRecentChangesLink:
427        @@@: Recently modified WikiPages list
428        @@lang: en
429      @GoToRecentChangesLong:
430        @@@: Review recently modified WikiPages list
431        @@lang: en
432      @Map:Change:Link:Local:Description:
433        @@@: List of recently modified WikiPages in this namespace (%page-name;)
434        @@lang: en
435      @Map:Change:Link:Parent:Description:
436        @@@:
437          List of recently modified WikiPages in parent namespace
438          (%ns-page-path-name;)
439        @@lang: en
440      @Map:Change:Title:
441        @@@: Recent Changes
442        @@lang: en
443      @Map:Change:WebPageTitle:
444        @@@: Recent Changes (%page-name;)
445        @@lang: en
446      @Map:LinkNav:prev:Description:
447        @@lang: en
448        @@@: Previous WikiPage
449      @Map:LinkNav:next:Description:
450        @@lang: en
451        @@@: Next WikiPage
452      @Map:LinkNav:contents:Description:
453        @@lang: en
454        @@@: Table of Contents
455      @Map:LinkNav:index:Description:
456        @@lang: en
457        @@@: Index
458      @Map:LinkNav:up:Description:
459        @@lang: en
460        @@@: Up
461    
462    
463      
464    
 ## TODO:  
 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,  
     );  
465    
 ## TODO:  
 ViewFragment:  
   @Name: links  
   @Formatting:  
     %link-to-wikipage (  
       page => {RecentChanges},  
       rel => news,  
       label => {%html-link (  
                   description => {%res(name=>GoToRecentChangesLink);}p,  
                 );},  
     );  

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.13

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24