From d948cb2b921ef0384015bbd432d8b7a7015fee11 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sun, 4 Jan 2015 13:07:18 -0800 Subject: spec2md.py -> makespec.py. Moved HTML generation out of Makefile. --- makespec.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 makespec.py (limited to 'makespec.py') diff --git a/makespec.py b/makespec.py new file mode 100644 index 0000000..4d157a5 --- /dev/null +++ b/makespec.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +import re +import sys +from subprocess import * + +if len(sys.argv) == 3: + specfile = sys.argv[1] + specformat = sys.argv[2] + if not (specformat in ["html", "markdown"]): + sys.stderr.write("Format must be html or markdown\n") + exit(1) +else: + sys.stderr.write("Usage: makespec.py SPECFILE [html|markdown]\n") + exit(1) + +def pipe_through_prog(prog, text): + p1 = Popen(prog.split(), stdout=PIPE, stdin=PIPE, stderr=PIPE) + [result, err] = p1.communicate(input=text.encode('utf-8')) + return [p1.returncode, result.decode('utf-8'), err] + +def replaceAnchor(match): + refs.append("[{0}]: #{1}".format(match.group(1), match.group(2))) + return '{0}'.format(match.group(1), match.group(2)) + +stage = 0 +example = 0 +section = "" +mdlines = [] +refs = [] + +with open(specfile, 'r', encoding='utf-8') as spec: + for ln in spec: + if re.match(r'^\.$', ln): + if stage == 0: + example += 1 + mdlines.append("\n
\n".format(example, section)) + mdlines.append("\n\n".format(example)) + mdlines.append("````````````````````````````````````````````````````````` markdown\n") + stage = 1 + elif stage == 1: + mdlines.append("`````````````````````````````````````````````````````````\n\n") + mdlines.append("````````````````````````````````````````````````````````` html\n") + stage = 2 + elif stage == 2: + mdlines.append("`````````````````````````````````````````````````````````\n\n") + mdlines.append("
\n") + stage = 0 + else: + sys.stderr.out("Encountered unknown stage {0}\n".format(stage)) + sys.exit(1) + else: + if stage == 0: + match = re.match(r'^#{1,6} *(.*)', ln) + if match: + section = match.group(1) + else: + ln = re.sub(r'\[([^]]*)\]\(@([^)]*)\)', replaceAnchor, ln) + else: + ln = re.sub(r' ', '␣', ln) + mdlines.append(ln) + +mdtext = ''.join(mdlines) + '\n\n' + '\n'.join(refs) + '\n' + +if specformat == "markdown": + sys.stdout.write(mdtext) +elif specformat == "html": + prog = "pandoc -s --toc -S --no-highlight --number-sections --template template.html" + [retcode, result, err] = pipe_through_prog(prog, mdtext) + if retcode == 0: + result = re.sub(r'␣', ' ', result) + sys.stdout.write(result) + else: + sys.stderr.write("Error converting markdown version of spec:\n") + sys.stderr.write(err) + exit(1) + +exit(0) -- cgit v1.2.3