#!/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)