1#!/usr/bin/env python
2
3"""
4Pandoc filter to process code blocks with class "graphviz" into
5graphviz-generated images.
6
7Needs pygraphviz
8"""
9
10import os
11import sys
12
13import pygraphviz
14
15from pandocfilters import toJSONFilter, Para, Image, get_filename4code, get_caption, get_extension, get_value
16
17def graphviz(key, value, format, _):
18    if key == 'CodeBlock':
19        [[ident, classes, keyvals], code] = value
20        if "graphviz" in classes:
21            caption, typef, keyvals = get_caption(keyvals)
22            prog, keyvals = get_value(keyvals, u"prog", u"dot")
23            filetype = get_extension(format, "png", html="png", latex="pdf")
24            dest = get_filename4code("graphviz", code, filetype)
25
26            if not os.path.isfile(dest):
27                g = pygraphviz.AGraph(string=code)
28                g.layout()
29                g.draw(dest, prog=prog)
30                sys.stderr.write('Created image ' + dest + '\n')
31
32            return Para([Image([ident, [], keyvals], caption, [dest, typef])])
33
34if __name__ == "__main__":
35    toJSONFilter(graphviz)
36