- Commit
- d948cb2b921ef0384015bbd432d8b7a7015fee11
- Parent
- 22b6d7d5dfa00510dd8df481ef4bed3945cc911c
- Author
- John MacFarlane <jgm@berkeley.edu>
- Date
spec2md.py -> makespec.py.
Moved HTML generation out of Makefile.
My personal build of CMark ✏️
spec2md.py -> makespec.py.
Moved HTML generation out of Makefile.
3 files changed, 80 insertions, 56 deletions
Status | File Name | N° Changes | Insertions | Deletions |
Modified | Makefile | 9 | 3 | 6 |
Added | makespec.py | 77 | 77 | 0 |
Deleted | spec2md.py | 50 | 0 | 50 |
diff --git a/Makefile b/Makefile @@ -178,7 +178,7 @@ dingus: js/commonmark.js ### Spec ### spec.md: $(SPEC) - python3 spec2md.py $< > $@ + python3 makespec.py $< markdown > $@ spec: spec.html @anchors=`perl -ne '@matches = / id="([^"]*)"/g; foreach $$match (@matches) { print "$$match\n"; }' $<`; \ @@ -188,11 +188,8 @@ spec: spec.html echo "Link to missing anchor #$$link"; \ done -spec.html: spec.md template.html - pandoc --no-highlight --number-sections --template template.html -s --toc -S $< | \ - perl -pe 's/a href="@([^"]*)"/a id="\1" href="#\1" class="definition"/g' | \ - perl -pe 's/␣/<span class="space"> <\/span>/g' \ - > $@ +spec.html: spec.txt template.html + python3 makespec.py $< html > $@ spec.pdf: spec.md template.tex specfilter.hs pandoc -s $< --template template.tex \
diff --git a/makespec.py 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 '<a id="{1}" href="#{1}" class="definition">{0}</a>'.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<div class=\"example\" id=\"example-{0}\" data-section=\"{1}\">\n".format(example, section)) + mdlines.append("<div class=\"examplenum\"><a href=\"#example-{0}\">Example {0}</a> <a class=\"dingus\" title=\"open in interactive dingus\">(interact)</a></div>\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("</div>\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'␣', '<span class="space"> </span>', result) + sys.stdout.write(result) + else: + sys.stderr.write("Error converting markdown version of spec:\n") + sys.stderr.write(err) + exit(1) + +exit(0)
diff --git a/spec2md.py b/spec2md.py @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -import re -import sys - -stage = 0 -example = 0 -section = "" -mdlines = [] -refs = [] - -if len(sys.argv) > 1: - specfile = sys.argv[1] -else: - specfile = 'spec.txt' - -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<div class=\"example\" id=\"example-{0}\" data-section=\"{1}\">\n".format(example, section)) - mdlines.append("<div class=\"examplenum\"><a href=\"#example-{0}\">Example {0}</a> <a class=\"dingus\" title=\"open in interactive dingus\">(interact)</a></div>\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("</div>\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: - for match in re.finditer(r'\[([^]]*)\]\(@([^)]*)\)', ln): - refs.append("[{0}]: #{1}".format(match.group(1), match.group(2))) - else: - ln = re.sub(r' ', '␣', ln) - mdlines.append(ln) - -mdtext = ''.join(mdlines) + '\n\n' + '\n'.join(refs) + '\n' - -sys.stdout.write(mdtext)