X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4895955ceaf264c5f17b10c4009e1ab1afcc55ee..b4ab0d0b9eae7b2204b8ea8e1ee70e63117b23ab:/IkiWiki/Plugin/otl.pm

diff --git a/IkiWiki/Plugin/otl.pm b/IkiWiki/Plugin/otl.pm
index be339c88e..ef76d6215 100644
--- a/IkiWiki/Plugin/otl.pm
+++ b/IkiWiki/Plugin/otl.pm
@@ -4,23 +4,32 @@ package IkiWiki::Plugin::otl;
 
 use warnings;
 use strict;
-use IkiWiki;
-use IPC::Open2;
+use IkiWiki 2.00;
+use open qw{:utf8 :std};
 
 sub import { #{{{
-	IkiWiki::hook(type => "filter", id => "otl", call => \&filter);
-	IkiWiki::hook(type => "htmlize", id => "otl", call => \&htmlize);
+	hook(type => "getsetup", id => "otl", call => \&getsetup);
+	hook(type => "filter", id => "otl", call => \&filter);
+	hook(type => "htmlize", id => "otl", call => \&htmlize);
 
 } # }}}
 
+sub getsetup () { #{{{
+	return 
+		plugin => {
+			safe => 1,
+			rebuild => 1, # format plugin
+		},
+} #}}}
+
 sub filter (@) { #{{{
 	my %params=@_;
         
 	# Munge up check boxes to look a little bit better. This is a hack.
-	my $checked=IkiWiki::htmllink($params{page}, $params{page},
-		"smileys/star_on.png", 0);
-	my $unchecked=IkiWiki::htmllink($params{page}, $params{page},
-		"smileys/star_off.png", 0);
+	my $checked=htmllink($params{page}, $params{page},
+		"smileys/star_on.png", linktext => "[X]");
+	my $unchecked=htmllink($params{page}, $params{page},
+		"smileys/star_off.png", linktext => "[_]");
 	$params{content}=~s/^(\s*)\[X\]\s/${1}$checked /mg;
 	$params{content}=~s/^(\s*)\[_\]\s/${1}$unchecked /mg;
         
@@ -30,27 +39,58 @@ sub filter (@) { #{{{
 sub htmlize (@) { #{{{
 	my %params=@_;
 
+	# Can't use open2 since otl2html doesn't play nice with buffering.
+	# Instead, fork off a child process that will run otl2html and feed
+	# it the content. Then read otl2html's response.
+
 	my $tries=10;
-	while (1) {
-		eval {
-			open2(*IN, *OUT, 'otl2html -S /dev/null -T /dev/stdin');
-		};
-		last unless $@;
-		$tries--;
-		if ($tries < 1) {
-			IkiWiki::debug("failed to run otl2html: $@");
-			return $params{content};
+	my $pid;
+	do {
+		$pid = open(KID_TO_READ, "-|");
+		unless (defined $pid) {
+			$tries--;
+			if ($tries < 1) {
+				debug("failed to fork: $@");
+				return $params{content};
+			}
 		}
+	} until defined $pid;
+
+	if (! $pid) {
+		$tries=10;
+		$pid=undef;
+
+		do {
+			$pid = open(KID_TO_WRITE, "|-");
+			unless (defined $pid) {
+				$tries--;
+				if ($tries < 1) {
+					debug("failed to fork: $@");
+					print $params{content};
+					exit;
+				}
+			}
+		} until defined $pid;
+
+		if (! $pid) {
+			if (! exec 'otl2html', '-S', '/dev/null', '-T', '/dev/stdin') {
+				debug("failed to run otl2html: $@");
+				print $params{content};
+				exit;
+			}
+		}
+
+		print KID_TO_WRITE $params{content};
+		close KID_TO_WRITE;
+		waitpid $pid, 0;
+		exit;
 	}
-	# open2 doesn't respect "use open ':utf8'"
-	binmode (IN, ':utf8'); 
-	binmode (OUT, ':utf8'); 
 	
-	print OUT $params{content};
-	close OUT;
-
 	local $/ = undef;
-	my $ret=<IN>;
+	my $ret=<KID_TO_READ>;
+	close KID_TO_READ;
+	waitpid $pid, 0;
+
 	$ret=~s/.*<body>//s;
 	$ret=~s/<body>.*//s;
 	$ret=~s/<div class="Footer">.*//s;