#?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/13 03:39:35 $ @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'); 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}); my $i = 0; my $j = 0; for my $item (sort {$b->[1] <=> $a->[1] or $a->[0] cmp $b->[0]} @list) { last if $j++ == 512; 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 { if ($i > 50) { ## avoid browser timeout $label = $default_label; } else { $i++; 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], }); } } 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;}p, ); Resource: @Referer:RefererList:Label: {%ref--referer-item-weight;} %ref--referer-item-label; @Referer:URIReference2Label: <%link-to-it (label => {%uri-reference;}p);>