X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/894ae79699fccba212418fe75ce0e729a24e7ecd..017f335aff7df37d0a22f11f45fec05c5e446826:/IkiWiki/Plugin/otl.pm

diff --git a/IkiWiki/Plugin/otl.pm b/IkiWiki/Plugin/otl.pm
index 314ed28ad..3801a6ec2 100644
--- a/IkiWiki/Plugin/otl.pm
+++ b/IkiWiki/Plugin/otl.pm
@@ -4,55 +4,90 @@ package IkiWiki::Plugin::otl;
 
 use warnings;
 use strict;
-use IkiWiki;
-use IPC::Open2;
+use IkiWiki 3.00;
+use open qw{:utf8 :std};
 
-sub import { #{{{
-	IkiWiki::hook(type => "filter", id => "otl", call => \&filter);
-	IkiWiki::hook(type => "htmlize", id => "otl", call => \&htmlize);
+sub import {
+	hook(type => "getsetup", id => "otl", call => \&getsetup);
+	hook(type => "htmlize", id => "otl", call => \&htmlize);
+}
 
-} # }}}
+sub getsetup () {
+	return 
+		plugin => {
+			safe => 1,
+			rebuild => 1, # format plugin
+			section => "format",
+		},
+}
 
-sub filter (@) { #{{{
+sub htmlize (@) {
 	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);
+	
+	# Munge up check boxes to look a little bit better.
+	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;
-        
-	return $params{content};
-} # }}}
 
-sub htmlize ($) { #{{{
+	# 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 shift;
+	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 shift;
-	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;
 	return $ret;
-} # }}}
+}
 
 1