]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/teximg.pm
po(change): avoid losing information before guessing the same...
[git.ikiwiki.info.git] / IkiWiki / Plugin / teximg.pm
index 5f9589fdd997452527492cab2c4256a4b12954e2..661d97b1f4fc04b86421f41baa36cd05ce021a8b 100644 (file)
@@ -10,10 +10,50 @@ use File::Temp qw(tempdir);
 use HTML::Entities;
 use IkiWiki 2.00;
 
+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 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 = @_;
        
@@ -27,14 +67,14 @@ 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")
        }
 } #}}}
 
@@ -72,19 +112,11 @@ sub create ($$$) { #{{{
 
        my $imglink= $params->{page} . "/$digest.png";
        my $imglog =  $params->{page} .  "/$digest.log";
-       will_render($params->{destpage}, $imglink);
-       will_render($params->{destpage}, $imglog);
-
-       my $imgurl;
-       my $logurl;
-       if (! $params->{preview}) {
-               $imgurl = urlto($imglink, $params->{destpage});
-               $logurl = urlto($imglog, $params->{destpage});
-       }
-       else {
-               $imgurl="$params->{page}/$digest.png";
-               $logurl="$params->{page}/$digest.log";
-       }
+       will_render($params->{page}, $imglink);
+       will_render($params->{page}, $imglog);
+
+       my $imgurl=urlto($imglink, $params->{destpage});
+       my $logurl=urlto($imglog, $params->{destpage});
        
        if (-e "$config{destdir}/$imglink" ||
            gen_image($code, $height, $digest, $params->{page})) {
@@ -93,7 +125,7 @@ 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>";
        }
 } #}}}
 
@@ -104,35 +136,45 @@ sub gen_image ($$$$) { #{{{
        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 {
                # store failure log
-               my $log;
+               my $log="";
                {
-                       open(my $f, '<', "$tmp/$digest.log");
-                       local $/=undef;
-                       $log = <$f>;
-                       close($f);
+                       if (open(my $f, '<', "$tmp/$digest.log")) {
+                               local $/=undef;
+                               $log = <$f>;
+                               close($f);
+                       }
                }
                writefile("$digest.log", "$config{destdir}/$imagedir", $log);