X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/3a95b4b13254dbdbd94074d6da9fbeba99d08349..eff2ddbe9a49b1993800e5455246c91769d70046:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 57c7d8f58..990836f8e 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -10,16 +10,19 @@ use open qw{:utf8 :std}; # Optimisation. use Memoize; memoize("abs2rel"); +memoize("pagespec_translate"); -use vars qw{%config %links %oldlinks %oldpagemtime %pagectime +use vars qw{%config %links %oldlinks %oldpagemtime %pagectime %pagecase %renderedfiles %pagesources %depends %hooks %forcerebuild}; +my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE + sub defaultconfig () { #{{{ - wiki_file_prune_regexp => qr{((^|/).svn/|\.\.|^\.|\/\.|\.html?$|\.rss$)}, + wiki_file_prune_regexp => qr{((^|/).svn/|\.\.|^\.|\/\.|\.x?html?$|\.rss$)}, wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]]+)\]\]/, - wiki_processor_regexp => qr/\[\[(\w+)\s+([^\]]*)\]\]/, wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/, verbose => 0, + syslog => 0, wikiname => "wiki", default_pageext => "mdwn", cgi => 0, @@ -43,14 +46,15 @@ sub defaultconfig () { #{{{ srcdir => undef, destdir => undef, pingurl => [], - templatedir => "/usr/share/ikiwiki/templates", - underlaydir => "/usr/share/ikiwiki/basewiki", + templatedir => "$installdir/share/ikiwiki/templates", + underlaydir => "$installdir/share/ikiwiki/basewiki", setup => undef, adminuser => undef, adminemail => undef, plugin => [qw{mdwn inline htmlscrubber}], timeformat => '%c', locale => undef, + sslcookie => 0, } #}}} sub checkconfig () { #{{{ @@ -118,12 +122,31 @@ sub error ($) { #{{{ print "Content-type: text/html\n\n"; print misctemplate("Error", "

Error: @_

"); } - die @_; + log_message(error => @_); + exit(1); } #}}} sub debug ($) { #{{{ return unless $config{verbose}; - if (! $config{cgi}) { + log_message(debug => @_); +} #}}} + +my $log_open=0; +sub log_message ($$) { #{{{ + my $type=shift; + + if ($config{syslog}) { + require Sys::Syslog; + unless ($log_open) { + Sys::Syslog::setlogsock('unix'); + Sys::Syslog::openlog('ikiwiki', '', 'user'); + $log_open=1; + } + eval { + Sys::Syslog::syslog($type, join(" ", @_)); + } + } + elsif (! $config{cgi}) { print "@_\n"; } else { @@ -237,7 +260,7 @@ sub bestlink ($$) { #{{{ # goes down the directory tree to the base looking for matching # pages. my $page=shift; - my $link=lc(shift); + my $link=shift; my $cwd=$page; do { @@ -246,9 +269,11 @@ sub bestlink ($$) { #{{{ $l.=$link; if (exists $links{$l}) { - #debug("for $page, \"$link\", use $l"); return $l; } + elsif (exists $pagecase{lc $l}) { + return $pagecase{lc $l}; + } } while $cwd=~s!/?[^/]+$!!; #print STDERR "warning: page $page, broken link: $link\n"; @@ -281,14 +306,14 @@ sub cgiurl (@) { #{{{ return $config{cgiurl}."?".join("&", map "$_=$params{$_}", keys %params); } #}}} -sub styleurl (;$) { #{{{ +sub baseurl (;$) { #{{{ my $page=shift; - return "$config{url}/style.css" if ! defined $page; + return "$config{url}/" if ! defined $page; $page=~s/[^\/]+$//; $page=~s/[^\/]+\//..\//g; - return $page."style.css"; + return $page; } #}}} sub abs2rel ($$) { #{{{ @@ -322,7 +347,8 @@ sub htmllink ($$$;$$$) { #{{{ $linktext=pagetitle(basename($link)) unless defined $linktext; - return $linktext if length $bestlink && $page eq $bestlink; + return "$linktext" + if length $bestlink && $page eq $bestlink; # TODO BUG: %renderedfiles may not have it, if the linked to page # was also added and isn't yet rendered! Note that this bug is @@ -332,7 +358,7 @@ sub htmllink ($$$;$$$) { #{{{ } if (! grep { $_ eq $bestlink } values %renderedfiles) { return " "create", page => $link, from => $page). + cgiurl(do => "create", page => lc($link), from => $page). "\">?$linktext" } @@ -394,6 +420,7 @@ sub loadindex () { #{{{ $links{$page}=[@{$items{link}}]; $depends{$page}=$items{depends}[0] if exists $items{depends}; $renderedfiles{$page}=$items{dest}[0]; + $pagecase{lc $page}=$page; } $pagectime{$page}=$items{ctime}[0]; } @@ -431,7 +458,10 @@ sub template_params (@) { #{{{ my $text_ref = shift; $$text_ref=&Encode::decode_utf8($$text_ref); }, - filename => "$config{templatedir}/$filename", @_; + filename => "$config{templatedir}/$filename", + loop_context_vars => 1, + die_on_bad_params => 0, + @_; } #}}} sub template ($;@) { #{{{ @@ -448,8 +478,7 @@ sub misctemplate ($$) { #{{{ indexlink => indexlink(), wikiname => $config{wikiname}, pagebody => $pagebody, - styleurl => styleurl(), - baseurl => "$config{url}/", + baseurl => baseurl(), ); return $template->output; }#}}} @@ -518,6 +547,8 @@ sub pagespec_merge ($$) { #{{{ my $a=shift; my $b=shift; + return $a if $a eq $b; + # Support for old-style GlobLists. if (is_globlist($a)) { $a=globlist_to_pagespec($a); @@ -529,8 +560,9 @@ sub pagespec_merge ($$) { #{{{ return "($a) or ($b)"; } #}}} -sub pagespec_match ($$) { #{{{ - my $page=shift; +sub pagespec_translate ($) { #{{{ + # This assumes that $page is in scope in the function + # that evalulates the translated pagespec code. my $spec=shift; # Support for old-style GlobLists. @@ -551,7 +583,7 @@ sub pagespec_match ($$) { #{{{ elsif ($word eq "(" || $word eq ")" || $word eq "!") { $code.=" ".$word; } - elsif ($word =~ /^(link|backlink|creation_month|creation_year|creation_day)\((.+)\)$/) { + elsif ($word =~ /^(link|backlink|created_before|created_after|creation_month|creation_year|creation_day)\((.+)\)$/) { $code.=" match_$1(\$page, ".safequote($2).")"; } else { @@ -559,7 +591,14 @@ sub pagespec_match ($$) { #{{{ } } - return eval $code; + return $code; +} #}}} + +sub pagespec_match ($$) { #{{{ + my $page=shift; + my $spec=shift; + + return eval pagespec_translate($spec); } #}}} sub match_glob ($$) { #{{{ @@ -576,7 +615,7 @@ sub match_glob ($$) { #{{{ sub match_link ($$) { #{{{ my $page=shift; - my $link=shift; + my $link=lc(shift); my $links = $links{$page} or return undef; foreach my $p (@$links) { @@ -589,17 +628,40 @@ sub match_backlink ($$) { #{{{ match_link(pop, pop); } #}}} +sub match_created_before ($$) { #{{{ + my $page=shift; + my $testpage=shift; + + if (exists $pagectime{$testpage}) { + return $pagectime{$page} < $pagectime{$testpage}; + } + else { + return 0; + } +} #}}} + +sub match_created_after ($$) { #{{{ + my $page=shift; + my $testpage=shift; + + if (exists $pagectime{$testpage}) { + return $pagectime{$page} > $pagectime{$testpage}; + } + else { + return 0; + } +} #}}} + sub match_creation_day ($$) { #{{{ - return if (gmtime($pagectime{shift()}))[3] == shift; + return ((gmtime($pagectime{shift()}))[3] == shift); } #}}} sub match_creation_month ($$) { #{{{ - return if (gmtime($pagectime{shift()}))[4] + 1 == shift; + return ((gmtime($pagectime{shift()}))[4] + 1 == shift); } #}}} sub match_creation_year ($$) { #{{{ - return if (gmtime($pagectime{shift()}))[5] + 1900 == shift; + return ((gmtime($pagectime{shift()}))[5] + 1900 == shift); } #}}} - 1