#?SuikaWikiConfig/2.0 Plugin: @Name: WikiPageProp @Description: @@@: WikiPage property @@lang:en @License: %%Perl%% @Author: @@Name: @@@@: Wakaba @@@lang:ja @@@script:Latn @@Mail[list]: w@suika.fam.cx @Date.RCS: $Date: 2004/04/25 07:06:50 $ @RequiredModule[list]: WikiFormat @Use: use Message::Util::Error; PluginConst: @NS_XHTML1: http://www.w3.org/1999/xhtml FormattingRule: @Category[list]: view view-resource form-input @Name: last-modified @Description: @@@: Last-modified date-time of the WikiPage. \ Note: Date-time value returned by this rule might not be the "real" last-modified date-time, in case last-modified value is not updated when content is modified (so called "sage" feature). @@lang: en @Parameter: @@Name: page @@Type: WikiName @@Default: (current) @@Description: @@@@: Target WikiPage @@@lang:en @Formatting: __ATTRTEXT:%page__; my $page = length $p->{page} ? [split $o->{wiki}->{config}->{name}->{space}->{separator_regex}, $p->{page}]: $o->{wiki}->{var}->{page}; my $lm; try { $lm = $o->{wiki}->{db}->get (lastmodified => $page); } catch SuikaWiki::DB::Util::Error with { my $err = shift; $err->throw if $err->{-type} eq 'ERROR_REPORTED'; $lm = 0; }; $p->{-parent}->append_text ( __FUNCPACK__::unixtime_to_string ($lm)); ## TODO: format string FormattingRule: @Category[list]: page-link @Name: last-modified @Description: @@@: Last-modified date-time of the WikiPage. \ Note: Date-time value returned by this rule might not be the "real" last-modified date-time, in case last-modified value is not updated when content is modified (so called "sage" feature). @@lang: en @Formatting: my $date; if (defined $o->{link}->{dest}->{page_lastmodified}) { $date = $o->{link}->{dest}->{page_lastmodified}; } else { ## TODO: my $page = $o->{link}->{dest}->{page_name}; try { $date = $o->{wiki}->{db}->get (lastmodified => $page); } catch SuikaWiki::DB::Util::Error with { my $err = shift; $err->throw if $err->{-type} eq 'ERROR_REPORTED'; $date = 0; }; } $p->{-parent}->append_text (__FUNCPACK__::unixtime_to_string ($date)); ## TODO: Update to new interface FormattingRule: @Category[list]: view view-resource form-input @Name: page-name @Description: @@@: WikiName in string repersentation @@lang: en @Parameter: @@Name:separator @@Type:string @@Default:(config) @@Description: @@@@:Separator used to delimit namespace components (ie. path delimiter) @@@lang:en @Formatting: __ATTRTEXT:%page__; $p->{-parent}->append_text ($o->{wiki}->{var}->{page}->stringify (wiki => $o->{wiki})); FormattingRule: @Category[list]:page-link @Name: page-name @Description: @@@:WikiName in string representation @@lang:en @Parameter: @@Name:relative @@Type:boolean @@Default:"0" @@Description: @@@@:Whether WikiName should be relative to "this" page @@@lang:en @Formatting: __ATTRTEXT:%relative__; if ($p->{relative}) { $p->{-parent}->append_text ($o->{link}->{dest}->{page_name_relative}->stringify (wiki => $o->{wiki})); } else { $p->{-parent}->append_text ($o->{link}->{dest}->{page_name}->stringify (wiki => $o->{wiki})); } FormattingRule: @Category[list]:page-link @Name: page-title @Description: @@@:Title of the WikiPage @@lang:en @Parameter: @@Name:relative @@Type:boolean @@Default:"0" @@Description: @@@@:Whether relative to "this" page @@@lang:en @Formatting: __ATTRTEXT:%relative__; if (defined $o->{link}->{dest}->{page_title}) { ## ISSUE: Is this work now? $p->{-parent}->append_text ($o->{link}->{dest}->{page_title}); } elsif ($p->{relative}) { $p->{-parent}->append_text ($o->{link}->{dest}->{page_name_relative}->stringify (wiki => $o->{wiki})); } else { $p->{-parent}->append_text ($o->{link}->{dest}->{page_name}->stringify (wiki => $o->{wiki})); } FormattingRule: @Category[list]:page-link @Name:page-headline @Description: @@@:Headline summary of the WikiPage @@lang:en @Formatting: $p->{-parent}->append_text (__FUNCPACK__->get_headsummary ($o->{link}->{dest}->{page_name}, wiki => $o->{wiki})); FormattingRule: @Category[list]: form-input @Name: wpp--next-anchor-index @Description: @@@: Next "anchor index" number @@lang: en @Formatting: my $page = $o->{wiki}->{var}->{page}; my $content; my $content_prop; try { $content = $o->{wiki}->{db}->get (content => $page); $content_prop = $o->{wiki}->{db}->get (content_prop => $page); ## Get Format Handler my $format = SuikaWiki::Plugin->module_package ('WikiFormat') ->handler (\$content, content_prop => $content_prop, wiki => $o->{wiki}); $p->{-parent}->append_text ($format->next_index_for_anchor (\$content, content_prop => $content_prop, wiki => $o->{wiki}, page => $page)); } catch SuikaWiki::DB::Util::Error with { my $err = shift; $err->throw if $err->{-type} eq 'ERROR_REPORTED'; } catch SuikaWiki::Format::Definition::error with { # }; Function: @Name: unixtime_to_string @Description @@@: Convert internal date-time format to other (possibly human readable) format. \ Note: Currently, only one fixed format is supported, whilst future version is expected to support highly customizable formatting supported by Message::Field::Date. @@lang:en @Main: my @date = gmtime shift; sprintf '%04d-%02d-%02d %02d:%02d:%02d +00:00', $date[5] + 1900, $date[4] + 1, @date[3,2,1,0]; Function: @Name: get_headsummary @Description: @@@: Returns headline summary @@lang:en @Main: my (undef, $page, %opt) = @_; $page ||= $opt{wiki}->{var}->{page}; my $s; try { if ($opt{wiki}->{db}->exist (wpp__headsummary => $page)) { $s = $opt{wiki}->{db}->get (wpp__headsummary => $page); } else { my $content = $opt{wiki}->{db}->get (content => $page); ## Get Format Handler my $format = SuikaWiki::Plugin->module_package ('WikiFormat') ->handler (\$content, wiki => $opt{wiki}); $s = $format->headsummary (\$content, wiki => $opt{wiki}); $s =~ tr/\x0D//d; if (length ($s) > 500) { $s = substr ($s, 0, 500); $s =~ s/[^\x09\x0A\x20-\x7E]+$//; $s .= '...'; } if ($s =~ /^([^\x0A]*(?:\x0A+[^\x0A]+){0,9})/) { $s = $1; } $s =~ s/[\x09\x0A\x20]+/\x20/gs; $s =~ s/\([^\(\)]+\)//g; $s =~ s/\[[^\[\]]+\]//g; $s =~ s/>>[0-9]+//g; $s =~ s/<[^<>]+>//g; $s =~ s/{[^{}]+}//g; $s =~ s/20[0-9][0-9]-[01][0-9]-[0-3][0-9][T\x20]*[0-2][0-9]:[0-5][0-9]:[0-5][0-9](?:\s*[+-][0-9][0-9]:[0-9][0-9])?//g; $s =~ s/ [Aa]n? / /g; $s =~ s/ [Aa]t / @ /g; $s =~ s/ [Tt]he / /g; $s =~ s/,? and / & /g; $s =~ s!,? or ! / !g; $s =~ s! not !n't !g; $s =~ s! (?:i|ha)s !'s !g; $s =~ s! are !'re !g; $s =~ s! [Ww]ith(in|out)? !' w/'.substr ($1,0,1).' '!ge; $s =~ s![.,]\x20?$!!g; $s =~ s/\x20+/\x20/g; if (length ($s) > 400) { $s = substr ($s, 0, 400); $s =~ s/[^\x20-\x7E]+$//s; # Remove broken EUC-JP char $s .= '...'; } $opt{wiki}->{db}->set (wpp__headsummary => $page => $s); } } catch SuikaWiki::DB::Util::Error with { my $err = shift; $err->throw if $err->{-type} eq 'ERROR_REPORTED'; $s = undef; }; return $s; ViewFragment: @Name: ws--post-content @Description: @@@: After content body -- last modified date and time of the WikiPage @@lang:en @Order: 800 @Formatting: %block ( id => last-modified, content => {%res(name=>{LastModified=});%last-modified;}p, ); Resource: @LastModified=: @@@: Last modified: @@lang: en