#!/usr/bin/perl package IkiWiki::Plugin::pandoc; use warnings; use strict; use IkiWiki; use FileHandle; use IPC::Open2; sub import { my $markdown_ext = $config{pandoc_markdown_ext} || "mdwn"; hook(type => "getsetup", id => "pandoc", call => \&getsetup); hook(type => "htmlize", id => $markdown_ext, # longname => "Pandoc Markdown", call => sub { htmlize("markdown", @_) }); if ($config{pandoc_latex}) { hook(type => "htmlize", id => "tex", call => sub { htmlize("latex", @_) }); } if ($config{pandoc_rst}) { hook(type => "htmlize", id => "rst", call => sub { htmlize("rst", @_) }); } } sub getsetup () { return plugin => { safe => 1, rebuild => 1, }, pandoc_command => { type => "string", example => "/usr/bin/pandoc", description => "Path to pandoc executable", safe => 0, rebuild => 0, }, pandoc_markdown_ext => { type => "string", example => "mdwn", description => "File extension for Markdown files", safe => 1, rebuild => 1, }, pandoc_latex => { type => "boolean", example => 0, description => "Enable Pandoc processing of LaTeX documents", safe => 0, rebuild => 1, }, pandoc_rst => { type => "boolean", example => 0, description => "Enable Pandoc processing of reStructuredText documents", safe => 0, rebuild => 1, }, pandoc_smart => { type => "boolean", example => 1, description => "Use smart quotes, dashes, and ellipses", safe => 1, rebuild => 1, }, pandoc_obfuscate => { type => "boolean", example => 1, description => "Obfuscate emails", safe => 1, rebuild => 1, }, pandoc_html5 => { type => "boolean", example => 0, description => "Generate HTML5", safe => 1, rebuild => 1, }, pandoc_ascii => { type => "boolean", example => 0, description => "Generate ASCII instead of UTF8", safe => 1, rebuild => 1, }, pandoc_numsect => { type => "boolean", example => 0, description => "Number sections", safe => 1, rebuild => 1, }, pandoc_sectdiv => { type => "boolean", example => 0, description => "Attach IDs to section DIVs instead of Headers", safe => 1, rebuild => 1, }, pandoc_codeclasses => { type => "string", example => "", description => "Classes to use for indented code blocks", safe => 1, rebuild => 1, }, pandoc_math => { type => "string", example => "unicode", description => "Process TeX math using", safe => 0, rebuild => 1, }, } sub htmlize ($@) { my $format = shift; my %params = @_; my $page = $params{page}; local(*PANDOC_IN, *PANDOC_OUT); my @args; my $command = $config{pandoc_command} || "/usr/bin/pandoc"; if ($config{pandoc_smart}) { push @args, '--smart'; }; if ($config{pandoc_obfuscate}) { push @args, '--email-obfuscation=references'; } else { push @args, '--email-obfuscation=none'; }; if ($config{pandoc_html5}) { push @args, '--html5'; }; if ($config{pandoc_ascii}) { push @args, '--ascii'; }; if ($config{pandoc_numsect}) { push @args, '--number-sections'; }; if ($config{pandoc_sectdiv}) { push @args, '--section-divs'; }; if ($config{pandoc_codeclasses} && ($config{pandoc_codeclasses} ne "")) { push @args, '--indented-code-classes=' . $config{pandoc_codeclasses}; }; for ($config{pandoc_math}) { if (/^mathjax$/) { push @args, '--mathjax=/dev/null'; } elsif (/^jsmath$/) { push @args, '--jsmath'; } elsif (/^latexmathml$/) { push @args, '--latexmathml'; } elsif (/^mimetex$/) { push @args, '--mimetex'; } elsif (/^mathtex$/) { push @args, '--mimetex=/cgi-bin/mathtex.cgi'; } elsif (/^google$/) { push @args, '--webtex'; } elsif (/^mathml$/) { push @args, '--mathml'; } else { } } # $ENV{"LC_ALL"} = "en_US.UTF-8"; my $pid = open2(*PANDOC_IN, *PANDOC_OUT, $command, '-f', $format, '-t', 'html', @args); error("Unable to open $command") unless $pid; # Workaround for perl bug (#376329) require Encode; my $content = Encode::encode_utf8($params{content}); print PANDOC_OUT $content; close PANDOC_OUT; my @html = ; close PANDOC_IN; waitpid $pid, 0; $content = Encode::decode_utf8(join('', @html)); return $content; } 1