Skip to content

Instantly share code, notes, and snippets.

@kurosuke
Created November 6, 2017 05:04
Show Gist options
  • Save kurosuke/36dbe0aa319a8b695b3ab47bb23f34e2 to your computer and use it in GitHub Desktop.
Save kurosuke/36dbe0aa319a8b695b3ab47bb23f34e2 to your computer and use it in GitHub Desktop.
plantuml in markdown filter for pandoc
#!/usr/bin/env python
"""
Pandoc filter to process code blocks with class "dot" into
plantuml-generated images.
"""
import subprocess
import hashlib
import os
import sys
from pandocfilters import toJSONFilter, Str, Para, Image, attributes
def sha1(x):
return hashlib.sha1(x.encode('utf-8')).hexdigest()
def out(s):
sys.stderr.write('\t[PLTUML] ' + s + '\n');
image_dir = "tmp"
def pipe(cmd, data):
p = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
p.stdin.write(data.encode('utf-8'))
p.stdin.close()
data = p.stdout.read()
p.stdout.close()
err = p.stderr.read()
p.stderr.close()
return data, err
def graphviz(key, value, fmt, meta):
if key == 'CodeBlock':
[[ident,classes,keyvals], code] = value
caption = ""
if "plantuml" in classes or "uml" in classes:
path = os.path.dirname(os.path.abspath(__file__))
filename = sha1(code)
alt = Str(caption)
tit = ""
image_filename = image_dir + '/' + filename + '.png'
src = image_filename
if not os.path.isfile(src):
try:
os.mkdir(os.path.dirname(image_filename))
except OSError:
pass
data, err = pipe(["plantuml", "-pipe", "-Tpng"], code)
if (len(err) > 0):
return Para([Str(err)])
with open(src, 'wb') as f:
f.write(data)
try:
image = Image(attributes({}), [alt], [src, tit])
return Para([image])
except:
try:
image = Image([alt], [src,tit])
return Para([image])
except:
pass
if __name__ == "__main__":
toJSONFilter(graphviz)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment