X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/ca9c6cc254d934837406ef9bb0dc5d021983661b..8d3c89f0c75c31c5e17a661150662e3efd3a146e:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 0ac49ade9..d76b5edb4 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -5,7 +5,6 @@ package IkiWiki; use warnings; use strict; use Encode; -use HTML::Entities; use URI::Escape q{uri_escape_utf8}; use POSIX (); use Storable; @@ -152,7 +151,7 @@ sub getsetup () { templatedir => { type => "string", default => "$installdir/share/ikiwiki/templates", - description => "location of template files", + description => "additional directory to search for template files", advanced => 1, safe => 0, # path rebuild => 1, @@ -235,6 +234,14 @@ sub getsetup () { safe => 1, rebuild => 1, }, + html5 => { + type => "boolean", + default => 0, + description => "generate HTML5? (experimental)", + advanced => 1, + safe => 1, + rebuild => 1, + }, sslcookie => { type => "boolean", default => 0, @@ -991,10 +998,18 @@ sub abs2rel ($$) { return $ret; } -sub displaytime ($;$) { +sub displaytime ($;$$) { # Plugins can override this function to mark up the time to # display. - return ''.formattime(@_).''; + my $time=formattime($_[0], $_[1]); + if ($config{html5}) { + return ''; + } + else { + return ''.$time.''; + } } sub formattime ($;$) { @@ -1010,6 +1025,16 @@ sub formattime ($;$) { return decode_utf8(POSIX::strftime($format, localtime($time))); } +sub date_3339 ($) { + my $time=shift; + + my $lc_time=POSIX::setlocale(&POSIX::LC_TIME); + POSIX::setlocale(&POSIX::LC_TIME, "C"); + my $ret=POSIX::strftime("%Y-%m-%dT%H:%M:%SZ", gmtime($time)); + POSIX::setlocale(&POSIX::LC_TIME, $lc_time); + return $ret; +} + sub beautify_urlpath ($) { my $url=shift; @@ -1376,10 +1401,6 @@ sub filter ($$$) { return $content; } -sub indexlink () { - return "$config{wikiname}"; -} - sub check_canedit ($$$;$) { my $page=shift; my $q=shift; @@ -1531,8 +1552,8 @@ sub loadindex () { my $d=$pages->{$src}; my $page=pagename($src); $pagectime{$page}=$d->{ctime}; + $pagesources{$page}=$src; if (! $config{rebuild}) { - $pagesources{$page}=$src; $pagemtime{$page}=$d->{mtime}; $renderedfiles{$page}=$d->{dest}; if (exists $d->{links} && ref $d->{links}) { @@ -1661,7 +1682,11 @@ sub template_file ($) { } my $template=srcfile($tpage, 1); - if (! defined $template) { + if (defined $template) { + return $template, $tpage, 1 if wantarray; + return $template; + } + else { $name=~s:/::; # avoid path traversal foreach my $dir ($config{templatedir}, "$installdir/share/ikiwiki/templates") { @@ -1670,12 +1695,12 @@ sub template_file ($) { last; } } + if (defined $template) { + return $template, $tpage if wantarray; + return $template; + } } - if (defined $template) { - return $template, $tpage if wantarray; - return $template; - } return; } @@ -1683,7 +1708,7 @@ sub template_depends ($$;@) { my $name=shift; my $page=shift; - my ($filename, $tpage)=template_file($name); + my ($filename, $tpage, $untrusted)=template_file($name); if (defined $page && defined $tpage) { add_depends($page, $tpage); } @@ -1699,7 +1724,7 @@ sub template_depends ($$;@) { die_on_bad_params => 0, filename => $filename, @_, - no_includes => 1, + ($untrusted ? (no_includes => 1) : ()), ); return @opts if wantarray; @@ -1713,20 +1738,25 @@ sub template ($;@) { sub misctemplate ($$;@) { my $title=shift; - my $pagebody=shift; + my $content=shift; - my $template=template("misc.tmpl"); + my $template=template("page.tmpl"); + + run_hooks(pagetemplate => sub { + shift->(page => "", destpage => "", template => $template); + }); + $template->param( + dynamic => 1, + have_actions => 0, # force off title => $title, - indexlink => indexlink(), wikiname => $config{wikiname}, - pagebody => $pagebody, + content => $content, baseurl => baseurl(), + html5 => $config{html5}, @_, ); - run_hooks(pagetemplate => sub { - shift->(page => "", destpage => "", template => $template); - }); + return $template->output; } @@ -2312,7 +2342,19 @@ sub match_glob ($$;@) { } sub match_internal ($$;@) { - return match_glob($_[0], $_[1], @_, internal => 1) + return match_glob(shift, shift, @_, internal => 1) +} + +sub match_page ($$;@) { + my $page=shift; + my $match=match_glob($page, shift, @_); + if ($match && ! (exists $IkiWiki::pagesources{$page} + && defined IkiWiki::pagetype($IkiWiki::pagesources{$page}))) { + return IkiWiki::FailReason->new("$page is not a page"); + } + else { + return $match; + } } sub match_link ($$;@) {