#?SuikaWikiConfig/2.0 Plugin: @Name: Referer @Description: @@@: Backward hyperlinking @@lang:en @License: %%Perl%% @Author: @@Name: @@@@: Wakaba @@@lang:ja @@@script:Latn @@Mail[list]: w@suika.fam.cx @Date.RCS: $Date: 2004/03/30 04:04:44 $ @RequiredPlugin[list]: InterWikiCore WikiStructure WikiLinking @RequiredModule[list]: URI @Use: use Message::Util::Error; require URI; my $INTERWIKICORE; my $WIKIRESOURCE; my $WIKILINKING; PluginConst: @NS_XHTML1: http://www.w3.org/1999/xhtml @INTERWIKICORE: {($INTERWIKICORE ||= SuikaWiki::Plugin->module_package ('InterWikiCore'))} @WIKIRESOURCE: {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))} @WIKILINKING: {($WIKILINKING ||= SuikaWiki::Plugin->module_package ('WikiLinking'))} FormattingRule: @Category[list]: view view-resource form-input @Name: referer-list @Parameter: @@Name: page @@Type: WikiName @@Default: (auto) @@Description: @@@: WikiPage name @@lang: en @Formatting: __ATTRTEXT:%page__; my @list; try { @list = map {[split /\x09/, $_, 2]} split /\x0A/, $o->{wiki}->{db}->get ('referer', $o->{wiki}->name ($p->{page} || $o->{wiki}->{var}->{page})); } catch SuikaWiki::DB::Util::Error with { # }; if (@list) { my $list = $p->{-parent}->append_new_node (type => '#element', namespace_uri => $NS_XHTML1, local_name => 'ol'); @list = sort {$b->[1] <=> $a->[1] or $a->[0] cmp $b->[0]} @list; my $start = length $p->{start} ? $p->{start} : $o->{wiki}->{input}->parameter ('ref--range-start') || 0; $p->{number} = $o->{wiki}->{input}->parameter ('ref--range-number') unless length $p->{number}; my $end = $p->{number} ? $start + $p->{number} - 1 : $start + 29; $start = 0 if $start > $#list or $start < 0; $end = $#list if $end < $start or $end > $#list; $end = $start + 255 if $end > $start + 255; local $o->{var}->{search__result} = { min => 0, max => $#list, start => $start, end => $end, number => $p->{number} || 30, param_prefix => 'ref', }; my $default_label = $WIKIRESOURCE->get (name => 'Referer:URIReference2Label', o => $o, wiki => $o->{wiki}); my $li_label = $WIKIRESOURCE->get (name => 'Referer:RefererList:Label', o => $o, wiki => $o->{wiki}); for my $item (@list[$start..$end]) { local $o->{iwc__param}->{uri_reference} = URI->new ($item->[0]); my $label; try { $label = $o->{wiki}->{db}->get (ref__item_template => [$item->[0]]) or do { my $site = $INTERWIKICORE->get_site_entry_by_uri_reference_match (o => $o, page => $o->{wiki}->{config}->{page}->{InterWikiName}); $label = $site ? $site->get_attribute_value ('URIReference2Label') || $default_label : $default_label; $o->{wiki}->{db}->set (ref__item_template => [$item->[0]] => $label); }; } catch SuikaWiki::DB::Util::Error with {}; $WIKILINKING->to_resource_by_uri_in_html ({ label => $li_label, ref__label => $label, } => { uri => $o->{iwc__param}->{uri_reference}, }, { o => $o, parent => $list->append_new_node (type => '#element', namespace_uri => $NS_XHTML1, local_name => 'li'), ref__weight => $item->[1], }); } $list->set_attribute (start => $start + 1); __ATTRNODE:%post_list->{$p->{-parent}}__; } Function: @Name: add_referer @Main: my (undef, %opt) = @_; return unless $opt{wiki}->{db}; return unless $opt{uri}; $opt{page} ||= $opt{wiki}->{var}->{page}; my $o = $opt{o} || {wiki => $opt{wiki}}; ## To be canonical URI reference object unless (ref $opt{uri}) { $opt{uri} = URI->new ($opt{uri})->canonical; } else { $opt{uri} = $opt{uri}->canonical; } local $o->{iwc__param} = { uri_reference => $opt{uri}, }; ## Check with site definition my $site = $INTERWIKICORE->get_site_entry_by_uri_reference_match (o => $o, page => $opt{wiki}->{config}->{page}->{InterWikiName}); if ($site) { my $v = 1; my $check = $site->get_attribute_value ('RefererLog', default => '1'); try { $v = $o->{wiki}->{plugin} ->boolean_formatter ('iwc__urireference_operation') ->replace ($check, param => $o); } catch Message::Util::Formatter::error with { my $err = shift; if ($err->{-object}->{-category_name} eq 'iwc__urireference_operation') { my $wiki = $err->{-option}->{param}->{wiki}; SuikaWiki::Plugin->module_package ('Error') ->reporting_formatting_template_error ($err, $err->{option}->{param}->{wiki}, template => $check); } else { $err->throw; } }; return unless $v; } ## Update referer list my %referer; for (split /\x0A/, $opt{wiki}->{db}->get ('referer', $opt{page})) { my ($n, $t) = split /\x09/, $_, 2; $referer{$n} = $t + 0; } $referer{$o->{iwc__param}->{uri_reference}}++; $opt{wiki}->{db}->set ('referer', $opt{page} => join "\x0A", map {$_ . "\x09" . $referer{$_}} keys %referer); FormattingRule: @Category[list]: link-to-resource @Name: ref--referer-item-weight @Formatting: $p->{-parent}->append_text ($o->{link}->{option}->{ref__weight}); FormattingRule: @Category[list]: link-to-resource @Name: ref--referer-item-label @Description: @@@: Label for referer list item, that is taken from InterWikiName database. @@lang: en @Formatting: try { $f->replace ($o->{link}->{src}->{ref__label}, param => $o, -parent => $p->{-parent}); } catch Message::Util::Formatter::error with { my $err = shift; if ($err->{-object}->{-category_name} eq $f->{-category_name}) { my $wiki = $err->{option}->{param}->{wiki}; SuikaWiki::Plugin->module_package ('Error') ->reporting_formatting_template_error ($err, $wiki, template => $o->{link}->{src}->{ref__label}); undef; } else { $err->throw; } }; ViewFragment: @Name: ws--post-content @Description: @@@: After content body -- referer lista @@lang:en @Order: 150 @Formatting: %section ( id => referer, title => {%res(name=>Referer);}p, heading, content => {%referer-list ( number => 10, post-list => {%search--result-navigation ( fragment => referer, );}p, );}p, ); Resource: @Referer:RefererList:Label: {%ref--referer-item-weight;} %ref--referer-item-label; @Referer:URIReference2Label: <%link-to-it (label => {%uri-reference;}p);>