X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/3a23cdde7d5621bc8d723d2226945ee5243115f3..5412a95fd00017fb95037140393b864d38e2be0b:/IkiWiki/Plugin/teximg.pm?ds=inline

diff --git a/IkiWiki/Plugin/teximg.pm b/IkiWiki/Plugin/teximg.pm
index 8c3e88c69..57b23147e 100644
--- a/IkiWiki/Plugin/teximg.pm
+++ b/IkiWiki/Plugin/teximg.pm
@@ -10,11 +10,51 @@ use File::Temp qw(tempdir);
 use HTML::Entities;
 use IkiWiki 2.00;
 
-sub import { #{{{
+my $default_prefix = <<EOPREFIX;
+\\documentclass{article}
+\\usepackage{amsmath}
+\\usepackage{amsfonts}
+\\usepackage{amssymb}
+\\pagestyle{empty}
+\\begin{document}
+EOPREFIX
+
+my $default_postfix = '\\end{document}';
+
+sub import {
+	hook(type => "getsetup", id => "teximg", call => \&getsetup);
 	hook(type => "preprocess", id => "teximg", call => \&preprocess);
-} #}}}
-
-sub preprocess (@) { #{{{
+}
+
+sub getsetup () {
+	return
+		plugin => {
+			safe => 1,
+			rebuild => undef,
+		},
+		teximg_dvipng => {
+			type => "boolean",
+			description => "Should teximg use dvipng to render, or dvips and convert?",
+			safe => 0,
+			rebuild => undef,
+		},
+		teximg_prefix => {
+			type => "string",
+			example => $default_prefix,
+			description => "LaTeX prefix for teximg plugin",
+			safe => 0, # Not sure how secure LaTeX is...
+			rebuild => 1,
+		},
+		teximg_postfix => {
+			type => "string",
+			example => $default_postfix,
+			description => "LaTeX postfix for teximg plugin",
+			safe => 0, # Not sure how secure LaTeX is...
+			rebuild => 1,
+		},
+}
+
+sub preprocess (@) {
 	my %params = @_;
 	
 	my $height = $params{height};
@@ -27,18 +67,18 @@ sub preprocess (@) { #{{{
 	
 	my $code = $params{code};
 	if (! defined $code && ! length $code) {
-		return "[[teximg ".gettext("missing tex code"). "]]";
+		error gettext("missing tex code");
 	}
 
 	if (check($code)) {
 		return create($code, check_height($height), \%params);
 	}
 	else {
-		return "[[teximg ".gettext("code includes disallowed latex commands"). "]]";
+		error gettext("code includes disallowed latex commands")
 	}
-} #}}}
+}
 
-sub check_height ($) { #{{{
+sub check_height ($) {
 	# Since latex doesn't support unlimited scaling this function
 	# returns the closest supported size.
 	my $height =shift;
@@ -55,9 +95,9 @@ sub check_height ($) { #{{{
 		}
 	}
 	return $ret;
-} #}}}
+}
 
-sub create ($$$) { #{{{
+sub create ($$$) {
 	# This function calls the image generating function and returns
 	# the <img .. /> for the generated image.
 	my $code = shift;
@@ -85,36 +125,45 @@ sub create ($$$) { #{{{
 			.qq{" class="teximg" />};
 	}
 	else {
-		return qq{[[teximg <a href="$logurl">}.gettext("failed to generate image from code")."</a>]]";
+		error qq{<a href="$logurl">}.gettext("failed to generate image from code")."</a>";
 	}
-} #}}}
+}
 
-sub gen_image ($$$$) { #{{{
+sub gen_image ($$$$) {
 	# Actually creates the image.
 	my $code = shift;
 	my $height = shift;
 	my $digest = shift;
 	my $imagedir = shift;
 
-	#TODO This should move into the setup file.
-	my $tex = '\documentclass['.$height.'pt]{scrartcl}';
-	$tex .= '\usepackage[version=3]{mhchem}';
-	$tex .= '\usepackage{amsmath}';
-	$tex .= '\usepackage{amsfonts}';
-	$tex .= '\usepackage{amssymb}';
-	$tex .= '\pagestyle{empty}';
-	$tex .= '\begin{document}';
+	if (!defined $config{teximg_prefix}) {
+		$config{teximg_prefix} = $default_prefix;
+	}
+	if (!defined $config{teximg_postfix}) {
+		$config{teximg_postfix} = $default_postfix;
+	}
+	if (!defined $config{teximg_dvipng}) {
+		$config{teximg_dvipng} = length `which dvipng 2>/dev/null`;
+	}
+	
+	my $tex = $config{teximg_prefix};
 	$tex .= '$$'.$code.'$$';
-	$tex .= '\end{document}';
+	$tex .= $config{teximg_postfix};
+	$tex =~ s!\\documentclass{article}!\\documentclass[${height}pt]{article}!g;
+	$tex =~ s!\\documentclass{scrartcl}!\\documentclass[${height}pt]{scrartcl}!g;
 
 	my $tmp = eval { create_tmp_dir($digest) };
 	if (! $@ &&
 	    writefile("$digest.tex", $tmp, $tex) &&
 	    system("cd $tmp; latex --interaction=nonstopmode $tmp/$digest.tex > /dev/null") == 0 &&
-	    system("dvips -E $tmp/$digest.dvi -o $tmp/$digest.ps 2> $tmp/$digest.log") == 0 &&
 	    # ensure destination directory exists
 	    writefile("$imagedir/$digest.png", $config{destdir}, "") &&
-	    system("convert -density 120  -trim -transparent \"#FFFFFF\" $tmp/$digest.ps $config{destdir}/$imagedir/$digest.png > $tmp/$digest.log") == 0) {
+	    (($config{teximg_dvipng} &&
+	    	system("dvipng -D 120 -bg Transparent -T tight -o $config{destdir}/$imagedir/$digest.png $tmp/$digest.dvi > $tmp/$digest.log") == 0
+	    ) || (!$config{teximg_dvipng} &&
+	    	system("dvips -E $tmp/$digest.dvi -o $tmp/$digest.ps 2> $tmp/$digest.log") == 0 &&
+	    	system("convert -density 120  -trim -transparent \"#FFFFFF\" $tmp/$digest.ps $config{destdir}/$imagedir/$digest.png > $tmp/$digest.log") == 0
+	    ))) {
 		return 1;
 	}
 	else {
@@ -131,18 +180,18 @@ sub gen_image ($$$$) { #{{{
 
 		return 0;
 	}
-} #}}}
+}
 
-sub create_tmp_dir ($) { #{{{
+sub create_tmp_dir ($) {
 	# Create a temp directory, it will be removed when ikiwiki exits.
 	my $base = shift;
 
 	my $template = $base.".XXXXXXXXXX";
 	my $tmpdir = tempdir($template, TMPDIR => 1, CLEANUP => 1);
 	return $tmpdir;
-} #}}}
+}
 
-sub check ($) { #{{{
+sub check ($) {
 	# Check if the code is ok
 	my $code = shift;
 
@@ -170,6 +219,6 @@ sub check ($) { #{{{
 		}
 	}
 	return 1;
-} #}}}
+}
 
 1