Patrick Wheeler
June 8 2014
Pandoc is can be used to convert between a number of markdown and markup file formats
Input formats:  docbook, haddock, html, json, latex, markdown,
                markdown_github, markdown_mmd,
                markdown_phpextra, markdown_strict, mediawiki,
                native, opml, org, rst, textile
Output formats: asciidoc, beamer, context, docbook, docx,
                dzslides, epub, epub3, fb2, html, html5, icml,
                json, latex, man, markdown, markdown_github,
                markdown_mmd, markdown_phpextra,
                markdown_strict, mediawiki, native, odt,
                opendocument, opml, org, pdf*, plain, revealjs,
                rst, rtf, s5, slideous, slidy, texinfo, textile
                [*for pdf output, use latex or beamer and -o FILENAME.pdf]## hi
This is text and [this is a link.](http://www.example.com)<h2 id="hi">hi</h2>
<p>This is text and <a href="http://www.example.com">this is a link.</a></p>When rendered:
This is text and this is a link.
## This is a list
* item one
* item two<h2 id="this-is-a-list">This is a list</h2>
<ul>
<li>item one</li>
<li>item two</li>
</ul>rendered:
## This is a list
* item one
* item two<h2 id="this-is-a-list">This is a list</h2>
<ul>
<li>item one</li>
<li>item two</li>
</ul>## This is a list
* item one
* item two[[this-is-a-list]]
This is a list
~~~~~~~~~~~~~~
* item one
* item two
## This is a list
* item one
* item two<sect1 id="this-is-a-list">
  <title>This is a list</title>
  <itemizedlist spacing="compact">
    <listitem>
      <para>
        item one
      </para>
    </listitem>
    <listitem>
      <para>
        item two
      </para>
    </listitem>
  </itemizedlist>
</sect1>
## This is a list
* item one [link](http://www.example.com]
* item two\subsection{This is a list}\label{this-is-a-list}
\begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt
\item
  item one {[}link{]}(http://www.example.com{]}
\item
  item two
\end{itemize}## This is a list
* item one
* item two[{"unMeta":{}},[{"t":"Header","c":[2,["this-is-a-list",[],[]],[{"t":"Str","c":"This"},{"t":"Space","c":[]},{"t":"Str","c":"is"},{"t":"Space","c":[]},{"t":"Str","c":"a"},{"t":"Space","c":[]},{"t":"Str","c":"list"}]]},{"t":"BulletList","c":[[{"t":"Plain","c":[{"t":"Str","c":"item"},{"t":"Space","c":[]},{"t":"Str","c":"one"}]}],[{"t":"Plain","c":[{"t":"Str","c":"item"},{"t":"Space","c":[]},{"t":"Str","c":"two"}]}]]}]]This can represent all of pandoc's internal AST.
Output formats: asciidoc, beamer, context, docbook, docx,
                dzslides, epub, epub3, fb2, html, html5, icml,
                json, latex, man, markdown, markdown_github,
                markdown_mmd, markdown_phpextra,
                markdown_strict, mediawiki, native, odt,
                opendocument, opml, org, pdf*, plain, revealjs,
                rst, rtf, s5, slideous, slidy, texinfo, textile
                [*for pdf output, use latex or beamer and -o FILENAME.pdf]Since it is easy to out the internal AST it is simple to filter and edit the AST and send it along to other formats.
In fact that is what I have been doing for all of my little converstion examples. I would have been too lazy to copy and paste all of the converstions you have seen so far.
So instead I made a small haskell script to access and filter pandoc AST with command line commands.
 ```{ cmdBlock="pandoc -t html5" inClasses="markdown" outClasses="html5"}
 ## This is a h2 header
 ```becomes:
## This is a h2 header<h2 id="this-is-a-h2-header">This is a h2 header</h2>
 ```{ showCmdBlock="ls -l" outClasses="bashOut"}
 ## This is a h2 header
 ```becomes:
$ ls -ltotal 3144
-rw-r--r-- 1 pjw users  206358 Jun  8 13:07 a.svg
drwxr-xr-x 7 pjw users    4096 Jun  6 10:11 blogging
-rw-r--r-- 1 pjw users   11654 Jun  7 03:09 chicago-author-date.csl
-rw-r--r-- 1 pjw users   11654 Jun  6 23:43 chicago-author-date.csl.orig
-rw-r--r-- 1 pjw users   20916 Jun  8 13:07 circle.svg
-rw-r--r-- 1 pjw users    3080 Jun  8 15:36 diaExample.svg
-rw-r--r-- 1 pjw users   61550 Jun  8 15:36 dotExample.png
-rwxr-xr-x 1 pjw users 2374623 Jun  6 09:36 e
-rw-r--r-- 1 pjw users   14801 Jun  6 09:01 e.png
-rw-r--r-- 1 pjw users  206374 Jun  6 21:05 e.svg
-rw-r--r-- 1 pjw users    4284 Jan  9  2013 ghcFromSource.md
-rw-r--r-- 1 pjw users    6741 Jun  8 00:50 hello.png
-rw-r--r-- 1 pjw users    7758 Jan 16  2013 lazy.md
drwxr-xr-x 2 pjw users    4096 Jun  6 10:08 log
-rw-r--r-- 1 pjw users     488 Mar 14  2013 nixCommandLineHelpers.txt
-rw-r--r-- 1 pjw users    2873 Apr 12  2013 nixHackage.md
-rw-r--r-- 1 pjw users   15734 Jun  8 13:07 nix.html
-rw-r--r-- 1 pjw users    8864 Jun  8 13:07 nix.md
drwxr-xr-x 2 pjw users    4096 Jun  6 10:03 noteLog
-rwxr-xr-x 1 pjw users    1241 Jun  8 15:02 pandocCmdFilter.hs
-rwxr-xr-x 1 pjw users     415 Jun  8 10:35 pandocDebugFilter.hs
-rwxr-xr-x 1 pjw users    1179 Jun  8 02:00 pandocDotFilter.hs
-rwxr-xr-x 1 pjw users     481 Jun  8 14:45 pandocJsonFormatterFilter.hs
-rw-r--r-- 1 pjw users     362 Jun  7 03:12 pandocmarkdown.bib
-rwxr-xr-x 1 pjw users     721 Jun  8 06:01 pandocShowFilter.hs
-rw-r--r-- 1 pjw users     246 Dec 18  2012 paper2.md
-rw-r--r-- 1 pjw users    1691 Jun  8 13:07 sc2.svg
-rw-r--r-- 1 pjw users    3824 Jun  8 13:07 sc3.svg
-rw-r--r-- 1 pjw users    4123 Jun  8 13:07 sc4.svg
-rw-r--r-- 1 pjw users    1383 Jun  8 13:07 sc5.svg
-rw-r--r-- 1 pjw users   27509 Jun  8 13:07 sc6.svg
-rw-r--r-- 1 pjw users    4104 Jun  8 13:07 sc7.svg
-rw-r--r-- 1 pjw users    8120 Jun  8 13:07 sc8.svg
-rw-r--r-- 1 pjw users    3105 Jun  8 15:24 sc.svg
-rw-r--r-- 1 pjw users      61 Jun  8 13:06 test.css
-rw-r--r-- 1 pjw users   24725 Jun  8 15:36 testDebugFilter.html
-rw-r--r-- 1 pjw users    6034 Jun  8 15:37 testDebugFilter.md
-rw-r--r-- 1 pjw users    1714 Jun  8 01:01 testDotfilter.html
-rw-r--r-- 1 pjw users     626 Jun  8 01:01 testDotFilter.html
-rw-r--r-- 1 pjw users     136 Jun  8 01:01 testDotFilter.md
-rw-r--r-- 1 pjw users    6741 Jun  8 01:01 testDot.png
-rw-r--r-- 1 pjw users    1547 Jun 21  2013 testLeftD.hs
-rw-r--r-- 1 pjw users    4745 Jun  7 00:33 test.md
-rw-r--r-- 1 pjw users     681 Jun  8 15:36 tmp.dot
-rw-r--r-- 1 pjw users    4740 Jun  6 09:01 tmp.hi
-rw-r--r-- 1 pjw users     380 Jun  8 15:36 tmp.hs
-rw-r--r-- 1 pjw users    8280 Jun  6 09:36 tmp.o
drwxr-xr-x 2 pjw users    4096 Jun  6 10:03 todo
-rw-r--r-- 1 pjw users    2531 Jun 21  2013 turnRelectBugs.hs
drwxr-xr-x 4 pjw users    4096 Mar 30  2013 typeAnnotations
To inport a file with highlighting:
 ```{ cmdBlock="cat pandocCmdFilter.hs" outClasses="haskell"}
 ```#!/usr/bin/env runhaskell
-- behead2.hs
import Text.Pandoc.JSON
import System.Process
import Data.Monoid
import Data.List (find)
main :: IO ()
main = toJSONFilter handleCmds
handleCmds :: Block -> IO Block
handleCmds (CodeBlock (ident, [] , (("showCmdBlock",cmd0):attrs)) code) = do
    cmdBlock <- handleCmds $ CodeBlock (ident, [], (("cmdBlock",cmd0):attrs)) code
    return $ Div ("", ["groupCodeBlock"], [])
                 [ CodeBlock (ident, ["bash"], []) $ "$ " <> cmd0
                 , cmdBlock
                 ]
handleCmds (CodeBlock (ident, [] , (("cmdBlock",cmd0):attrs)) code) = do
    let (cmd:args) = words cmd0
    let outClasses =
              words
            . maybe [] snd
            . find ((== "outClasses") . fst)
            $ attrs
    let inClasses =
              words
            . maybe [] snd
            . find ((== "inClasses") . fst)
            $ attrs
    let inputBlock =
            if null code
            then Null
            else CodeBlock (ident, inClasses, []) code
    result <- readProcess cmd args code
    return $ Div ("", ["groupCodeBlock"], [])
                 [ inputBlock
                 , CodeBlock (ident, outClasses, []) result
                 ]
handleCmds x = return x

{-# LANGUAGE NoMonomorphismRestriction #-}
import Diagrams.Prelude
import Diagrams.TwoD
import Diagrams.Backend.SVG
import Data.List
example = hrule (2 * sum sizes) === circles # centerX
  where circles = hcat . map alignT . zipWith scale sizes
                $ repeat (circle 1)
        sizes   = [2,5,4,7,1,3]
main = renderSVG "diaExample.svg" (Width 500)  (example # lw 0.2)