X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/9dc796737f2845c143a91a949ab1ea4526a2a1da..0a56f05b53c8b9a91478c2af932a60c4a46c441b:/IkiWiki/Plugin/meta.pm diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm index 938a28e59..4aa545a93 100644 --- a/IkiWiki/Plugin/meta.pm +++ b/IkiWiki/Plugin/meta.pm @@ -24,6 +24,7 @@ sub filter (@) { #{{{ my %params=@_; $meta{$params{page}}=''; + delete $pagestate{$params{page}}{meta}{redir}; return $params{content}; } # }}} @@ -47,6 +48,7 @@ sub preprocess (@) { #{{{ delete $params{$key}; my $page=$params{page}; delete $params{page}; + my $destpage=$params{destpage}; delete $params{destpage}; delete $params{preview}; @@ -58,7 +60,9 @@ sub preprocess (@) { #{{{ if ($key eq 'link') { if (%params) { $meta{$page}.=scrub("\n"); } else { @@ -66,6 +70,41 @@ sub preprocess (@) { #{{{ push @{$links{$page}}, $value; } } + elsif ($key eq 'redir') { + return "" if $destpage ne $page; + my $safe=0; + if ($value !~ /^\w+:\/\//) { + add_depends($page, $value); + my $link=bestlink($page, $value); + if (! length $link) { + return "[[meta ".gettext("redir page not found")."]]"; + } + + $value=urlto($link, $page); + $safe=1; + + # redir cycle detection + $pagestate{$page}{meta}{redir}=$link; + my $at=$page; + my %seen; + while (exists $pagestate{$at}{meta}{redir}) { + if ($seen{$at}) { + return "[[meta ".gettext("redir cycle is not allowed")."]]"; + } + $seen{$at}=1; + $at=$pagestate{$at}{meta}{redir}; + } + } + else { + $value=encode_entities($value); + } + my $delay=int(exists $params{delay} ? $params{delay} : 0); + my $redir=""; + if (! $safe) { + $redir=scrub($redir); + } + $meta{$page}.=$redir; + } elsif ($key eq 'title') { $title{$page}=HTML::Entities::encode_numeric($value); }