Source code for innoconv.utils

"""Utility module."""

import json
from subprocess import PIPE, Popen

from innoconv.constants import ENCODING


[docs]def to_ast(filepath): """ Convert a file to abstract syntax tree using pandoc. :param filepath: Path of file :type filepath: str :rtype: (list of dicts, str) :returns: (Pandoc AST, title) :raises RuntimeError: if pandoc exits with an error :raises ValueError: if no title was found """ pandoc_cmd = ["pandoc", "--to=json", filepath] proc = Popen(pandoc_cmd, stdout=PIPE, stderr=PIPE) out, err = proc.communicate(timeout=60) out = out.decode(ENCODING) err = err.decode(ENCODING) if proc.returncode != 0: msg = ( "pandoc process returned exit code ({})." "This is the pandoc output:\n{}" ) raise RuntimeError(msg.format(proc.returncode, err)) loaded = json.loads(out) blocks = loaded["blocks"] try: title_ast = loaded["meta"]["title"]["c"] except KeyError: raise ValueError("Missing title in meta block in {}".format(filepath)) title = "" for element in title_ast: if element["t"] == "Str": title += element["c"] elif element["t"] == "Space": title += " " return blocks, title