X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/54d5308cd83c67e7e9c32450c776ef0dac63549f..b7a3a56cfada6cbca6ba6a775221130eea013e1c:/IkiWiki/Render.pm diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index f9730193b..854d5105e 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -5,6 +5,7 @@ package IkiWiki; use warnings; use strict; use File::Spec; +use IkiWiki; sub linkify ($$) { #{{{ my $content=shift; @@ -18,40 +19,6 @@ sub linkify ($$) { #{{{ return $content; } #}}} -my $_scrubber; -sub scrubber { #{{{ - return $_scrubber if defined $_scrubber; - - eval q{use HTML::Scrubber}; - # Lists based on http://feedparser.org/docs/html-sanitization.html - $_scrubber = HTML::Scrubber->new( - allow => [qw{ - a abbr acronym address area b big blockquote br - button caption center cite code col colgroup dd del - dfn dir div dl dt em fieldset font form h1 h2 h3 h4 - h5 h6 hr i img input ins kbd label legend li map - menu ol optgroup option p pre q s samp select small - span strike strong sub sup table tbody td textarea - tfoot th thead tr tt u ul var - }], - default => [undef, { map { $_ => 1 } qw{ - abbr accept accept-charset accesskey action - align alt axis border cellpadding cellspacing - char charoff charset checked cite class - clear cols colspan color compact coords - datetime dir disabled enctype for frame - headers height href hreflang hspace id ismap - label lang longdesc maxlength media method - multiple name nohref noshade nowrap prompt - readonly rel rev rows rowspan rules scope - selected shape size span src start summary - tabindex target title type usemap valign - value vspace width - }}], - ); - return $_scrubber; -} # }}} - sub htmlize ($$) { #{{{ my $type=shift; my $content=shift; @@ -70,8 +37,10 @@ sub htmlize ($$) { #{{{ error("htmlization of $type not supported"); } - if ($config{sanitize}) { - $content=scrubber()->scrub($content); + if (exists $hooks{sanitize}) { + foreach my $id (keys %{$hooks{sanitize}}) { + $content=$hooks{sanitize}{$id}{call}->($content); + } } return $content; @@ -133,15 +102,15 @@ sub preprocess ($$) { #{{{ if (length $escape) { return "[[$command $params]]"; } - elsif (exists $plugins{preprocess}{$command}) { + elsif (exists $hooks{preprocess}{$command}) { my %params; while ($params =~ /(\w+)=\"([^"]+)"(\s+|$)/g) { $params{$1}=$2; } - return $plugins{preprocess}{$command}->(page => $page, %params); + return $hooks{preprocess}{$command}{call}->(page => $page, %params); } else { - return "[[bad directive $command]]"; + return "[[$command not processed]]"; } }; @@ -157,10 +126,31 @@ sub add_depends ($$) { #{{{ $depends{$page}=$globlist; } else { - $depends{$page}.=" ".$globlist; + $depends{$page}=globlist_merge($depends{$page}, $globlist); } } # }}} +sub globlist_merge ($$) { #{{{ + my $a=shift; + my $b=shift; + + my $ret=""; + # Only add negated globs if they are not matched by the other globlist. + foreach my $i ((map { [ $a, $_ ] } split(" ", $b)), + (map { [ $b, $_ ] } split(" ", $a))) { + if ($i->[1]=~/^!(.*)/) { + if (! globlist_match($1, $i->[0])) { + $ret.=" ".$i->[1]; + } + } + else { + $ret.=" ".$i->[1]; + } + } + + return $ret; +} #}}} + sub genpage ($$$) { #{{{ my $content=shift; my $page=shift; @@ -184,9 +174,10 @@ sub genpage ($$$) { #{{{ $u=~s/\[\[file\]\]/$pagesources{$page}/g; $template->param(historyurl => $u); } - if ($config{hyperestraier}) { - $template->param(hyperestraierurl => cgiurl()); + if ($config{discussion}) { + $template->param(discussionlink => htmllink($page, "Discussion", 1, 1)); } + $template->param(headercontent => $config{headercontent}); $template->param( title => $title, @@ -194,7 +185,6 @@ sub genpage ($$$) { #{{{ parentlinks => [parentlinks($page)], content => $content, backlinks => [backlinks($page)], - discussionlink => htmllink($page, "Discussion", 1, 1), mtime => scalar(gmtime($mtime)), styleurl => styleurl($page), ); @@ -230,9 +220,14 @@ sub findlinks ($$) { #{{{ while ($content =~ /(?( + page => $page, + content => $content + ); + } + } $links{$page}=[findlinks($content, $page)]; - delete $depends{$page}; $content=linkify($content, $page); $content=preprocess($page, $content); @@ -278,57 +282,6 @@ sub prune ($) { #{{{ } } #}}} -sub estcfg () { #{{{ - my $estdir="$config{wikistatedir}/hyperestraier"; - my $cgi=basename($config{cgiurl}); - $cgi=~s/\..*$//; - open(TEMPLATE, ">$estdir/$cgi.tmpl") || - error("write $estdir/$cgi.tmpl: $!"); - print TEMPLATE misctemplate("search", - "\n\n\n\n\n\n"); - close TEMPLATE; - open(TEMPLATE, ">$estdir/$cgi.conf") || - error("write $estdir/$cgi.conf: $!"); - my $template=HTML::Template->new( - filename => "$config{templatedir}/estseek.conf" - ); - eval q{use Cwd 'abs_path'}; - $template->param( - index => $estdir, - tmplfile => "$estdir/$cgi.tmpl", - destdir => abs_path($config{destdir}), - url => $config{url}, - ); - print TEMPLATE $template->output; - close TEMPLATE; - $cgi="$estdir/".basename($config{cgiurl}); - unlink($cgi); - symlink("/usr/lib/estraier/estseek.cgi", $cgi) || - error("symlink $cgi: $!"); -} # }}} - -sub estcmd ($;@) { #{{{ - my @params=split(' ', shift); - push @params, "-cl", "$config{wikistatedir}/hyperestraier"; - if (@_) { - push @params, "-"; - } - - my $pid=open(CHILD, "|-"); - if ($pid) { - # parent - foreach (@_) { - print CHILD "$_\n"; - } - close(CHILD) || error("estcmd @params exited nonzero: $?"); - } - else { - # child - open(STDOUT, "/dev/null"); # shut it up (closing won't work) - exec("estcmd", @params) || error("can't run estcmd"); - } -} #}}} - sub refresh () { #{{{ # find existing pages my %exists; @@ -494,19 +447,15 @@ FILE: foreach my $file (@files) { } } - if ($config{hyperestraier} && (%rendered || @del)) { - debug("updating hyperestraier search index"); - if (%rendered) { - estcmd("gather -cm -bc -cl -sd", - map { $config{destdir}."/".$renderedfiles{pagename($_)} } - keys %rendered); + if (@del && exists $hooks{delete}) { + foreach my $id (keys %{$hooks{delete}}) { + $hooks{delete}{$id}{call}->(@del); } - if (@del) { - estcmd("purge -cl"); + } + if (%rendered && exists $hooks{change}) { + foreach my $id (keys %{$hooks{change}}) { + $hooks{change}{$id}{call}->(keys %rendered); } - - debug("generating hyperestraier cgi config"); - estcfg(); } } #}}}