From fb5923af0d43dbcfe536f9fa951efa44e2e6d21d Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 23 Jun 2019 21:04:36 +0300 Subject: Add: ftt-docgen options --pdf and --html to format doc --- ftt-docgen | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'ftt-docgen') diff --git a/ftt-docgen b/ftt-docgen index f73bb27..cb774e8 100755 --- a/ftt-docgen +++ b/ftt-docgen @@ -1,9 +1,12 @@ #!/usr/bin/env python3 +import argparse import copy import os import re +import subprocess import sys +import tempfile import CommonMark_bkrs as CommonMark import yaml @@ -229,21 +232,42 @@ def walk(o, func): for c in o.children: walk(c, func) -def infer_bindings_filename(markdowns): +def infer_basename(markdowns): root, ext = os.path.splitext(markdowns[0]) if ext not in ['.md', '.mdwn']: sys.exit('Input filenames must end in .md or .mdwn') - return root + '.yaml' + return root + +# This only allows one markdown filename. This is crap. But I can't +# get it work with -- otherwise. What I want is for the following to +# work: +# ftt-docgetn --pdf foo.md bar.md -- --pandoc-arg --other-pandoc-arg +# but I can't make it work. +def parse_cli(): + p = argparse.ArgumentParser() + p.add_argument('--pdf', action='store_true') + p.add_argument('--html', action='store_true') + p.add_argument('markdown', nargs=1) + args, pandoc_args = p.parse_known_args() + return args, pandoc_args def debug(msg): if False: sys.stderr.write('DEBUG: {}\n'.format(msg)) sys.stderr.flush() -markdowns = sys.argv[1:] -text = ''.join(open(filename).read() for filename in markdowns) +def pandoc(args): + argv = ['ftt-pandoc'] + args + subprocess.check_call(argv) -with open(infer_bindings_filename(markdowns)) as f: +args, pandoc_args = parse_cli() + +text = ''.join(open(filename).read() for filename in args.markdown) + +basename = infer_basename(args.markdown) +dirname = os.path.dirname(basename) + +with open(basename + '.yaml') as f: bindings = yaml.safe_load(f) @@ -258,5 +282,15 @@ else: parser = CommonMark.DocParser() ast = parser.parse(text) -sys.stdout.write(meta) -walk(ast, lambda o: write(bindings, sys.stdout, o)) +if args.pdf or args.html: + with tempfile.NamedTemporaryFile(mode='w', dir=dirname) as f: + f.write(meta) + walk(ast, lambda o: write(bindings, f, o)) + f.flush() + if args.pdf: + pandoc(['-o', basename + '.pdf', f.name] + pandoc_args) + elif args.html: + pandoc(['-o', basename + '.html', f.name] + pandoc_args) +else: + sys.stdout.write(meta) + walk(ast, lambda o: write(bindings, sys.stdout, o)) -- cgit v1.2.1