summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/pandoc.pm
blob: 25081ef1207d1203637f3f345a2e688bb881d82d (plain)
  1. #!/usr/bin/env perl
  2. package IkiWiki::Plugin::pandoc;
  3. use warnings;
  4. use strict;
  5. use IkiWiki;
  6. use FileHandle;
  7. use IPC::Open2;
  8. use File::Path qw/make_path/;
  9. use JSON;
  10. # activate with 'generate_$format' in meta; turn on all with 'generate_all_formats'.
  11. my %extra_formats = (
  12.     pdf    => { ext=>'pdf'label=>'PDF'format=>'latex'extra=>[], order=>},
  13.     docx   => { ext=>'docx'label=>'DOCX'format=>'docx'extra=>[], order=>},
  14.     odt    => { ext=>'odt'label=>'ODT'format=>'odt'extra=>[], order=>},
  15.     beamer => { ext=>'beamer.pdf'label=>'Beamer'format=>'beamer'extra=>[], order=>},
  16.     revealjs => { ext=>'revealjs.html'label=>'RevealJS'format=>'revealjs'extra=>['--self-contained'], order=>},
  17.     epub   => { ext=>'epub'label=>'EPUB'format=>'epub3'extra=>[], order=>},
  18.     latex  => { ext=>'tex'label=>'LaTeX'format=>'latex'extra=>['--standalone'], order=>},
  19. );
  20. sub import {
  21.     my $markdown_ext $config{pandoc_markdown_ext} || "mdwn";
  22.     # May be both a string with a single value, a string containing commas or an arrayref
  23.     if ($markdown_ext =~ /,/) {
  24.         $markdown_ext = [split /\s*,\s*/$markdown_ext];
  25.     }
  26.     hook(type => "getsetup"id => "pandoc"call => \&getsetup);
  27.     hook(type => "pagetemplate"id => "pandoc"call => \&pagetemplate);
  28.     hook(type => "pageactions"id => "pandoc"call => \&pageactions);
  29.     if (ref $markdown_ext eq 'ARRAY') {
  30.         foreach my $mde (@$markdown_ext) {
  31.             hook(type => 'htmlize'id => $mde,
  32.                  call => subhtmlize("markdown"@_) });
  33.         }
  34.     else {
  35.         hook(type => "htmlize"id => $markdown_ext,
  36.              call => sub htmlize("markdown"@_) });
  37.     }
  38.     if ($config{pandoc_latex}) {
  39.         hook(type => "htmlize"id => "tex",
  40.              call => sub htmlize("latex"@_) });
  41.     }
  42.     if ($config{pandoc_rst}) {
  43.         hook(type => "htmlize"id => "rst",
  44.              call => sub htmlize("rst"@_) });
  45.     }
  46.     if ($config{pandoc_textile}) {
  47.         hook(type => "htmlize"id => "textile",
  48.              call => sub htmlize("textile"@_) });
  49.     }
  50.     if ($config{pandoc_mediawiki}) {
  51.         hook(type => "htmlize"id => "mediawiki",
  52.              call => sub htmlize("mediawiki"@_) });
  53.     }
  54.     if ($config{pandoc_opml}) {
  55.         hook(type => "htmlize"id => "opml",
  56.              call => sub htmlize("opml"@_) });
  57.     }
  58.     if ($config{pandoc_org}) {
  59.         hook(type => "htmlize"id => "org",
  60.              call => sub htmlize("org"@_) });
  61.     }
  62. }
  63. sub getsetup () {
  64.     return
  65.     plugin => {
  66.         safe => 1,
  67.         rebuild => 1,
  68.     },
  69.     pandoc_command => {
  70.         type => "string",
  71.         example => "/usr/local/bin/pandoc",
  72.         description => "Path to pandoc executable",
  73.         safe => 1,
  74.         rebuild => 0,
  75.     },
  76.     pandoc_citeproc => {
  77.         type => "string",
  78.         example => "/usr/local/bin/pandoc-citeproc",
  79.         description => "Path to pandoc-citeproc executable",
  80.         safe => 1,
  81.         rebuild => 0,
  82.     },
  83.     pandoc_markdown_ext => {
  84.         type => "string",
  85.         example => "mdwn,md,markdown",
  86.         description => "File extension(s) for Markdown files handled by Pandoc",
  87.         safe => 1,
  88.         rebuild => 1,
  89.     },
  90.     pandoc_latex => {
  91.         type => "boolean",
  92.         example => 0,
  93.         description => "Enable Pandoc processing of LaTeX documents (extension=tex)",
  94.         safe => 1,
  95.         rebuild => 1,
  96.     },
  97.     pandoc_rst => {
  98.         type => "boolean",
  99.         example => 0,
  100.         description => "Enable Pandoc processing of reStructuredText documents (extension=rst)",
  101.         safe => 1,
  102.         rebuild => 1,
  103.     },
  104.     pandoc_textile => {
  105.         type => "boolean",
  106.         example => 0,
  107.         description => "Enable Pandoc processing of Textile documents (extension=textile)",
  108.         safe => 1,
  109.         rebuild => 1,
  110.     },
  111.     pandoc_mediawiki => {
  112.         type => "boolean",
  113.         example => 0,
  114.         description => "Enable Pandoc processing of MediaWiki documents (extension=mediawiki)",
  115.         safe => 1,
  116.         rebuild => 1,
  117.     },
  118.     pandoc_org => {
  119.         type => "boolean",
  120.         example => 0,
  121.         description => "Enable Pandoc processing of Emacs org-mode documents (extension=org)",
  122.         safe => 1,
  123.         rebuild => 1,
  124.     },
  125.     pandoc_opml => {
  126.         type => "boolean",
  127.         example => 0,
  128.         description => "Enable Pandoc processing of OPML documents (extension=opml)",
  129.         safe => 1,
  130.         rebuild => 1,
  131.     },
  132.     pandoc_smart => {
  133.         type => "boolean",
  134.         example => 1,
  135.         description => "Use smart quotes, dashes, and ellipses",
  136.         safe => 1,
  137.         rebuild => 1,
  138.     },
  139.     pandoc_obfuscate => {
  140.         type => "boolean",
  141.         example => 1,
  142.         description => "Obfuscate emails",
  143.         safe => 1,
  144.         rebuild => 1,
  145.     },
  146.     pandoc_html5 => {
  147.         type => "boolean",
  148.         example => 0,
  149.         description => "Generate HTML5",
  150.         safe => 1,
  151.         rebuild => 1,
  152.     },
  153.     pandoc_ascii => {
  154.         type => "boolean",
  155.         example => 0,
  156.         description => "Generate ASCII instead of UTF8",
  157.         safe => 1,
  158.         rebuild => 1,
  159.     },
  160.     pandoc_html_extra_options => {
  161.         type => "internal",
  162.         default => [],
  163.         description => "List of extra pandoc options for html",
  164.         safe => 0,
  165.         rebuild => 0,
  166.     },
  167.     pandoc_numsect => {
  168.         type => "boolean",
  169.         example => 0,
  170.         description => "Number sections",
  171.         safe => 1,
  172.         rebuild => 1,
  173.     },
  174.     pandoc_sectdiv => {
  175.         type => "boolean",
  176.         example => 0,
  177.         description => "Attach IDs to section DIVs instead of Headers",
  178.         safe => 1,
  179.         rebuild => 1,
  180.     },
  181.     pandoc_codeclasses => {
  182.         type => "string",
  183.         example => "",
  184.         description => "Classes to use for indented code blocks",
  185.         safe => 1,
  186.         rebuild => 1,
  187.     },
  188.     pandoc_math => {
  189.         type => "string",
  190.         example => "mathjax",
  191.         description => "How to process TeX math (mathjax, katex, mathml, mathjs, latexmathml, asciimathml, mimetex, webtex)",
  192.         safe => 1,
  193.         rebuild => 1,
  194.     },
  195.     pandoc_math_custom_js => {
  196.         type => "string",
  197.         example => "",
  198.         description => "Link to local/custom javascript for math (or to server-side script for mimetex and webtex)",
  199.         safe => 1,
  200.         rebuild => 1,
  201.     },
  202.     pandoc_math_custom_css => {
  203.         type => "string",
  204.         example => "",
  205.         description => "Link to local/custom CSS for math (requires appropriate pandoc_math setting)",
  206.         safe => 1,
  207.         rebuild => 1,
  208.     },
  209.     pandoc_bibliography => {
  210.         type => "string",
  211.         example => "",
  212.         description => "Path to default bibliography file",
  213.         safe => 1,
  214.         rebuild => 1,
  215.     },
  216.     pandoc_csl => {
  217.         type => "string",
  218.         example => "",
  219.         description => "Path to CSL file (for references and bibliography)",
  220.         safe => 1,
  221.         rebuild => 1,
  222.     },
  223.     pandoc_csl_default_lang => {
  224.         type => "string",
  225.         example => "",
  226.         description => "Default language code (RFC 1766) for citations processing",
  227.         safe => 1,
  228.         rebuild => 1,
  229.     },
  230.     pandoc_filters => {
  231.         type => "string",
  232.         example => "",
  233.         description => "A comma-separated list of custom pandoc filters",
  234.         safe => 1,
  235.         rebuild => 1,
  236.     },
  237.     pandoc_latex_template => {
  238.         type => "string",
  239.         example => "",
  240.         description => "Path to pandoc template for LaTeX and normal PDF output",
  241.         safe => 1,
  242.         rebuild => 0,
  243.     },
  244.     pandoc_latex_extra_options => {
  245.         type => "internal",
  246.         default => [],
  247.         description => "List of extra pandoc options for LaTeX (and PDF) generation",
  248.         safe => 0,
  249.         rebuild => 0,
  250.     },
  251.     pandoc_beamer_template => {
  252.         type => "string",
  253.         example => "",
  254.         description => "Path to pandoc template for Beamer PDF output",
  255.         safe => 1,
  256.         rebuild => 0,
  257.     },
  258.     pandoc_beamer_extra_options => {
  259.         type => "internal",
  260.         default => [],
  261.         description => "List of extra pandoc options for Beamer PDF generation",
  262.         safe => 0,
  263.         rebuild => 0,
  264.     },
  265.     pandoc_pdf_export_cleanup => {
  266.         type => "boolean",
  267.         example => "0",
  268.         description => "Whether to clean up LaTeX auxiliary files after PDF generation",
  269.         safe => 0,
  270.         rebuild => 0,
  271.     },
  272.     pandoc_revealjs_template => {
  273.         type => "string",
  274.         example => "",
  275.         description => "Path to pandoc template for Reveal.js slides output",
  276.         safe => 1,
  277.         rebuild => 0,
  278.     },
  279.     pandoc_revealjs_extra_options => {
  280.         type => "internal",
  281.         default => [],
  282.         description => "List of extra pandoc options for Reveal.js slides generation",
  283.         safe => 0,
  284.         rebuild => 0,
  285.     },
  286.     pandoc_docx_template => {
  287.         type => "string",
  288.         example => "",
  289.         description => "Path to pandoc template for MS Word (docx) output",
  290.         safe => 1,
  291.         rebuild => 0,
  292.     },
  293.     pandoc_docx_extra_options => {
  294.         type => "internal",
  295.         default => [],
  296.         description => "List of extra pandoc options for DOCX generation",
  297.         safe => 0,
  298.         rebuild => 0,
  299.     },
  300.     pandoc_odt_template => {
  301.         type => "string",
  302.    &n