X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/fe6b271501d4d8ae00a012d14a8814cee5e0e55d..a2c97af60ba1880e38c28ab1303d0eea488bb9dd:/IkiWiki/Render.pm

diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 9ece00157..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,12 +102,12 @@ 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 "[[$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 =~ /(?<!\\)$config{wiki_link_regexp}/g) {
 		push @links, titlepage($2);
 	}
-	# Discussion links are a special case since they're not in the text
-	# of the page, but on its template.
-	return @links, "$page/discussion";
+	if ($config{discussion}) {
+		# Discussion links are a special case since they're not in the
+		# text of the page, but on its template.
+		return @links, "$page/discussion";
+	}
+	else {
+		return @links;
+	}
 } #}}}
 
 sub render ($) { #{{{
@@ -243,9 +238,18 @@ sub render ($) { #{{{
 	if ($type ne 'unknown') {
 		my $content=readfile($srcfile);
 		my $page=pagename($file);
+		delete $depends{$page};
+		
+		if (exists $hooks{filter}) {
+			foreach my $id (keys %{$hooks{filter}}) {
+				$content=$hooks{filter}{$id}{call}->(
+					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", 
-		"<!--ESTFORM-->\n\n<!--ESTRESULT-->\n\n<!--ESTINFO-->\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();
 	}
 } #}}}