X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/8d3a3c6a1e2a5a2be4213c2ce80c02e8f31dc9b4..4e70f2f0d20bbfc800aafb1b78cc6a41f4617d32:/IkiWiki/Plugin/inline.pm diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index d6ef6c54c..a501566b5 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -5,7 +5,7 @@ package IkiWiki::Plugin::inline; use warnings; use strict; use Encode; -use IkiWiki 2.00; +use IkiWiki 3.00; use URI; my %knownfeeds; @@ -13,7 +13,7 @@ my %page_numfeeds; my @inline; my $nested=0; -sub import { #{{{ +sub import { hook(type => "getopt", id => "inline", call => \&getopt); hook(type => "getsetup", id => "inline", call => \&getsetup); hook(type => "checkconfig", id => "inline", call => \&checkconfig); @@ -22,14 +22,14 @@ sub import { #{{{ call => \&IkiWiki::preprocess_inline); hook(type => "pagetemplate", id => "inline", call => \&IkiWiki::pagetemplate_inline); - hook(type => "format", id => "inline", call => \&format); + hook(type => "format", id => "inline", call => \&format, first => 1); # Hook to change to do pinging since it's called late. # This ensures each page only pings once and prevents slow # pings interrupting page builds. hook(type => "change", id => "inline", call => \&IkiWiki::pingurl); -} # }}} +} -sub getopt () { #{{{ +sub getopt () { eval q{use Getopt::Long}; error($@) if $@; Getopt::Long::Configure('pass_through'); @@ -42,9 +42,9 @@ sub getopt () { #{{{ push @{$config{pingurl}}, $_[1]; }, ); -} #}}} +} -sub getsetup () { #{{{ +sub getsetup () { return plugin => { safe => 1, @@ -85,9 +85,9 @@ sub getsetup () { #{{{ safe => 1, rebuild => 0, }, -} #}}} +} -sub checkconfig () { #{{{ +sub checkconfig () { if (($config{rss} || $config{atom}) && ! length $config{url}) { error(gettext("Must specify url to wiki with --url when using --rss or --atom")); } @@ -100,9 +100,9 @@ sub checkconfig () { #{{{ if (! exists $config{pingurl}) { $config{pingurl}=[]; } -} #}}} +} -sub format (@) { #{{{ +sub format (@) { my %params=@_; # Fill in the inline content generated earlier. This is actually an @@ -111,9 +111,9 @@ sub format (@) { #{{{ delete @inline[$1,] }eg; return $params{content}; -} #}}} +} -sub sessioncgi ($$) { #{{{ +sub sessioncgi ($$) { my $q=shift; my $session=shift; @@ -148,10 +148,10 @@ package IkiWiki; my %toping; my %feedlinks; -sub preprocess_inline (@) { #{{{ +sub preprocess_inline (@) { my %params=@_; - if (! exists $params{pages}) { + if (! exists $params{pages} && ! exists $params{pagenames}) { error gettext("missing pages parameter"); } my $raw=yesno($params{raw}); @@ -184,24 +184,44 @@ sub preprocess_inline (@) { #{{{ } my @list; - foreach my $page (keys %pagesources) { - next if $page eq $params{page}; - if (pagespec_match($page, $params{pages}, location => $params{page})) { - push @list, $page; + + if (exists $params{pagenames}) { + foreach my $p (qw(sort pages)) { + if (exists $params{$p}) { + error sprintf(gettext("the %s and %s parameters cannot be used together"), + "pagenames", $p); + } } - } - if (exists $params{sort} && $params{sort} eq 'title') { - @list=sort { pagetitle(basename($a)) cmp pagetitle(basename($b)) } @list; - } - elsif (exists $params{sort} && $params{sort} eq 'mtime') { - @list=sort { $pagemtime{$b} <=> $pagemtime{$a} } @list; - } - elsif (! exists $params{sort} || $params{sort} eq 'age') { - @list=sort { $pagectime{$b} <=> $pagectime{$a} } @list; + @list = map { bestlink($params{page}, $_) } + split ' ', $params{pagenames}; + + $params{pages} = join(" or ", @list); } else { - error sprintf(gettext("unknown sort type %s"), $params{sort}); + @list = pagespec_match_list( + [ grep { $_ ne $params{page} } keys %pagesources ], + $params{pages}, location => $params{page}); + + if (exists $params{sort} && $params{sort} eq 'title') { + @list=sort { pagetitle(basename($a)) cmp pagetitle(basename($b)) } @list; + } + elsif (exists $params{sort} && $params{sort} eq 'title_natural') { + eval q{use Sort::Naturally}; + if ($@) { + error(gettext("Sort::Naturally needed for title_natural sort")); + } + @list=sort { Sort::Naturally::ncmp(pagetitle(basename($a)), pagetitle(basename($b))) } @list; + } + elsif (exists $params{sort} && $params{sort} eq 'mtime') { + @list=sort { $pagemtime{$b} <=> $pagemtime{$a} } @list; + } + elsif (! exists $params{sort} || $params{sort} eq 'age') { + @list=sort { $pagectime{$b} <=> $pagectime{$a} } @list; + } + else { + error sprintf(gettext("unknown sort type %s"), $params{sort}); + } } if (yesno($params{reverse})) { @@ -231,10 +251,12 @@ sub preprocess_inline (@) { #{{{ # Explicitly add all currently displayed pages as dependencies, so # that if they are removed or otherwise changed, the inline will be # sure to be updated. - add_depends($params{page}, join(" or ", $#list >= $#feedlist ? @list : @feedlist)); + foreach my $p ($#list >= $#feedlist ? @list : @feedlist) { + add_depends($params{page}, $p); + } if ($feeds && exists $params{feedpages}) { - @feedlist=grep { pagespec_match($_, $params{feedpages}, location => $params{page}) } @feedlist; + @feedlist=pagespec_match_list(\@feedlist, $params{feedpages}, location => $params{page}); } my ($feedbase, $feednum); @@ -274,8 +296,8 @@ sub preprocess_inline (@) { #{{{ } } - my $rssurl=basename($feedbase."rss".$feednum) if $feeds && $rss; - my $atomurl=basename($feedbase."atom".$feednum) if $feeds && $atom; + my $rssurl=abs2rel($feedbase."rss".$feednum, dirname(htmlpage($params{destpage}))) if $feeds && $rss; + my $atomurl=abs2rel($feedbase."atom".$feednum, dirname(htmlpage($params{destpage}))) if $feeds && $atom; my $ret=""; @@ -339,7 +361,8 @@ sub preprocess_inline (@) { #{{{ my $content=get_inline_content($page, $params{destpage}); $template->param(content => $content); } - $template->param(pageurl => urlto(bestlink($params{page}, $page), $params{destpage})); + $template->param(pageurl => urlto($page, $params{destpage})); + $template->param(inlinepage => $page); $template->param(title => pagetitle(basename($page))); $template->param(ctime => displaytime($pagectime{$page}, $params{timeformat})); $template->param(mtime => displaytime($pagemtime{$page}, $params{timeformat})); @@ -350,15 +373,14 @@ sub preprocess_inline (@) { #{{{ my $file = $pagesources{$page}; my $type = pagetype($file); if ($config{discussion}) { - my $discussionlink=gettext("discussion"); - if ($page !~ /.*\/\Q$discussionlink\E$/ && + if ($page !~ /.*\/\Q$config{discussionpage}\E$/ && (length $config{cgiurl} || - exists $links{$page."/".$discussionlink})) { + exists $links{$page."/".$config{discussionpage}})) { $template->param(have_actions => 1); $template->param(discussionlink => htmllink($page, $params{destpage}, - gettext("Discussion"), + $config{discussionpage}, noimageinline => 1, forcesubpage => 1)); } @@ -416,18 +438,18 @@ sub preprocess_inline (@) { #{{{ return $ret if $raw || $nested; push @inline, $ret; return "
\n\n"; -} #}}} +} -sub pagetemplate_inline (@) { #{{{ +sub pagetemplate_inline (@) { my %params=@_; my $page=$params{page}; my $template=$params{template}; $template->param(feedlinks => $feedlinks{$page}) if exists $feedlinks{$page} && $template->query(name => "feedlinks"); -} #}}} +} -sub get_inline_content ($$) { #{{{ +sub get_inline_content ($$) { my $page=shift; my $destpage=shift; @@ -446,9 +468,9 @@ sub get_inline_content ($$) { #{{{ else { return ""; } -} #}}} +} -sub date_822 ($) { #{{{ +sub date_822 ($) { my $time=shift; my $lc_time=POSIX::setlocale(&POSIX::LC_TIME); @@ -456,9 +478,9 @@ sub date_822 ($) { #{{{ my $ret=POSIX::strftime("%a, %d %b %Y %H:%M:%S %z", localtime($time)); POSIX::setlocale(&POSIX::LC_TIME, $lc_time); return $ret; -} #}}} +} -sub date_3339 ($) { #{{{ +sub date_3339 ($) { my $time=shift; my $lc_time=POSIX::setlocale(&POSIX::LC_TIME); @@ -466,9 +488,9 @@ sub date_3339 ($) { #{{{ my $ret=POSIX::strftime("%Y-%m-%dT%H:%M:%SZ", gmtime($time)); POSIX::setlocale(&POSIX::LC_TIME, $lc_time); return $ret; -} #}}} +} -sub absolute_urls ($$) { #{{{ +sub absolute_urls ($$) { # sucky sub because rss sucks my $content=shift; my $baseurl=shift; @@ -489,9 +511,9 @@ sub absolute_urls ($$) { #{{{ $content=~s/( date_3339($pagemtime{$p}), ); - if (exists $pagestate{$p} && - exists $pagestate{$p}{meta}{guid}) { - $itemtemplate->param(guid => $pagestate{$p}{meta}{guid}); + if (exists $pagestate{$p}) { + if (exists $pagestate{$p}{meta}{guid}) { + $itemtemplate->param(guid => $pagestate{$p}{meta}{guid}); + } + + if (exists $pagestate{$p}{meta}{updated}) { + $itemtemplate->param(mdate_822 => date_822($pagestate{$p}{meta}{updated})); + $itemtemplate->param(mdate_3339 => date_3339($pagestate{$p}{meta}{updated})); + } } if ($itemtemplate->query(name => "enclosure")) { @@ -576,9 +604,9 @@ sub genfeed ($$$$$@) { #{{{ }); return $template->output; -} #}}} +} -sub pingurl (@) { #{{{ +sub pingurl (@) { return unless @{$config{pingurl}} && %toping; eval q{require RPC::XML::Client}; @@ -624,6 +652,6 @@ sub pingurl (@) { #{{{ } exit 0; # daemon done -} #}}} +} 1