view docs/tutorial/mypandocfilters/graphviz-file.py @ 6202:fe8e88ea296d

evolve: use util.unlinkpath() via vfs Internally vfs.unlinkpath() does the path join and calls util.unlinkpath(). So the new form is equivalent, just shorter. This method exists in 4.8, so the new code shouldn't have any compatibility issues.
author Anton Shestakov <av6@dwimlabs.net>
date Sun, 13 Mar 2022 18:21:57 +0300
parents aad37ffd7d58
children
line wrap: on
line source

#!/usr/bin/env python

"""
Pandoc filter to process code blocks with class "graphviz" into
graphviz-generated images.

Needs pygraphviz
"""

import os
import sys

import pygraphviz

from pandocfilters import toJSONFilter, Para, Image, get_filename4code, get_caption, get_extension, get_value

def graphviz(key, value, format, _):
    if key == 'CodeBlock':
        [[ident, classes, keyvals], file] = value
        if "graphviz-file" in classes:
            caption, typef, keyvals = get_caption(keyvals)
            prog, keyvals = get_value(keyvals, u"prog", u"dot")
            filetype = get_extension(format, "svg", html="svg", latex="pdf")
            with open(file) as f:
                code = f.read()
            dest = get_filename4code("graphviz", code, filetype)

            if not os.path.isfile(dest):
                g = pygraphviz.AGraph(string=code)
                g.layout()
                g.draw(dest, prog=prog)
                sys.stderr.write('Created image ' + dest + '\n')

            return Para([Image([ident, ['graphviz'], keyvals], caption, [dest, typef])])

if __name__ == "__main__":
    toJSONFilter(graphviz)