X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/655d7925c60ecd7dd5dc3b35887f7a2573029796..0a56f05b53c8b9a91478c2af932a60c4a46c441b:/IkiWiki/Plugin/meta.pm diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm index cfa4b84b1..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}; } # }}} @@ -59,7 +60,9 @@ sub preprocess (@) { #{{{ if ($key eq 'link') { if (%params) { $meta{$page}.=scrub("\n"); } else { @@ -67,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); } @@ -111,25 +149,6 @@ sub preprocess (@) { #{{{ $meta{$page}.="\n"; $copyright{$page}=$value; } - elsif ($key eq 'forward') { - my $delay=0; - my $dest_url; - my $text; - if (exists $params{delay}) { - $delay=$params{delay}; - } - # Is this a wikilink? - if ($value =~ /^\[\[(.*)\]\]$/) { - $text=htmllink($page, $destpage, $1); - $dest_url=urlto(bestlink($page, $1), $destpage); - } else { - $text="$dest_url"; - $dest_url=$value; - } -# TODO. $meta{$page}.=scrub(""); - $meta{$page}.=""; - return "You are being forwarded to $text."; - } else { $meta{$page}.=scrub("\n");