-
Notifications
You must be signed in to change notification settings - Fork 59
/
graphviz.py
43 lines (34 loc) · 1.13 KB
/
graphviz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python
"""
Pandoc filter to process code blocks with class "graphviz" into
graphviz-generated images.
"""
import pygraphviz
import hashlib
import os
import sys
from panflute import toJSONFilter, Str, Para, Image, CodeBlock
def sha1(x):
return hashlib.sha1(x.encode(sys.getfilesystemencoding())).hexdigest()
imagedir = "graphviz-images"
def graphviz(elem, doc):
if type(elem) == CodeBlock and 'graphviz' in elem.classes:
code = elem.text
caption = "caption"
G = pygraphviz.AGraph(string=code)
G.layout()
filename = sha1(code)
filetype = {'html': 'png', 'latex': 'pdf'}.get(doc.format, 'png')
alt = Str(caption)
src = imagedir + '/' + filename + '.' + filetype
if not os.path.isfile(src):
try:
os.mkdir(imagedir)
sys.stderr.write('Created directory ' + imagedir + '\n')
except OSError:
pass
G.draw(src)
sys.stderr.write('Created image ' + src + '\n')
return Para(Image(alt, url=source, title=''))
if __name__ == "__main__":
toJSONFilter(graphviz)