Skip to content

Instantly share code, notes, and snippets.

@giantneco
Created March 12, 2019 08:23
Show Gist options
  • Save giantneco/0d0a9af11d4d9ed766f260824aecc695 to your computer and use it in GitHub Desktop.
Save giantneco/0d0a9af11d4d9ed766f260824aecc695 to your computer and use it in GitHub Desktop.
pandoc filter for packetdiag
#!/usr/bin/env python
"""
Pandoc filter to process code blocks with class "packetdiag" into
packetdiag-generated images.
"""
import os
import sys
import subprocess
from pandocfilters import toJSONFilter, Para, Image
from pandocfilters import get_filename4code, get_caption, get_extension
import cairosvg
PACKETDIAG_BIN = os.environ.get('PACKETDIAG_BIN', 'packetdiag')
def packetdiag(key, value, format_, _):
if key == 'CodeBlock':
[[ident, classes, keyvals], code] = value
if "packetdiag" in classes:
caption, typef, keyvals = get_caption(keyvals)
filename = get_filename4code("packetdiag", code)
filetype = get_extension(format_, "png", html="svg", latex="png")
src = filename + '.diag'
med = filename + '.svg'
dest = filename + '.' + filetype
if not os.path.isfile(dest):
txt = code.encode(sys.getfilesystemencoding())
with open(src, "wb") as f:
f.write(txt)
subprocess.check_call(PACKETDIAG_BIN.split() + ["-T", "svg", src, "-o", med])
sys.stderr.write('Created image ' + dest + '\n')
if filetype == 'png':
cairosvg.svg2png(url=med, write_to=dest)
return Para([Image([ident, [], keyvals], caption, [dest, typef])])
def main():
toJSONFilter(packetdiag)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment