From 04fcb7a24ea4ac179f5033c00f7cb23b8ebb9e35 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sun, 4 Jan 2015 23:06:35 -0800 Subject: Use cmark itself to build spec.html. Removes build dependency on pandoc. Closes #256. Note: we have lost "smart punctuation," but we can either (a) add an option to do this in the cmark renderer, or (b) insert unicode punctuation in the spec as needed. Not an urgent issue in any case. --- makespec.py | 29 ++++++++++++++++++++++++----- spec.txt | 3 +-- template.html | 27 +++++++++------------------ 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/makespec.py b/makespec.py index c7b90b5..07bf453 100644 --- a/makespec.py +++ b/makespec.py @@ -2,6 +2,7 @@ import re import sys from subprocess import * +from string import Template if len(sys.argv) == 3: specfile = sys.argv[1] @@ -16,6 +17,18 @@ else: def toIdentifier(s): return re.sub(r'\s+', '-', re.sub(r'\W+', ' ', s.strip().lower())) +def parseYaml(yaml): + metadata = {} + def parseField(match): + key = match.group(1) + val = match.group(2).strip() + if re.match(r'^\'', val): + val = val[1:len(val) - 1] + metadata[key] = val + fieldre = re.compile('^(\w+):(.*)$', re.MULTILINE) + re.sub(fieldre, parseField, yaml) + return metadata + 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')) @@ -83,11 +96,14 @@ with open(specfile, 'r', encoding='utf-8') as spec: lastnum[level - 1] = lastnum[level - 1] + 1 number = '.'.join([str(x) for x in lastnum]) ident = toIdentifier(section) + ln = re.sub(r' ', ' ' + number + ' ', ln, count=1) sections.append(dict(level=level, contents=section, ident=ident, number=number)) refs.append("[{0}]: #{1}".format(section, ident)) + ln = re.sub(r'# +', '# '.format(ident), + ln, count=1) else: ln = re.sub(r'\[([^]]*)\]\(@([^)]*)\)', replaceAnchor, ln) else: @@ -95,22 +111,25 @@ with open(specfile, 'r', encoding='utf-8') as spec: mdlines.append(ln) mdtext = ''.join(mdlines) + '\n\n' + '\n'.join(refs) + '\n' +yaml = ''.join(yamllines) +metadata = parseYaml(yaml) if specformat == "markdown": - sys.stdout.write(mdtext) + sys.stdout.write(yaml + '\n\n' + mdtext) elif specformat == "html": + with open("template.html", "r", encoding="utf-8") as templatefile: + template = Template(templatefile.read()) toclines = [] for section in sections: indent = ' ' * (section['level'] - 1) toclines.append(indent + '* [' + section['number'] + ' ' + section['contents'] + '](#' + section['ident'] + ')') toc = '
\n\n' + '\n'.join(toclines) + '\n\n
\n\n' - yaml = ''.join(yamllines) + '\n' - prog = "pandoc -s -S --no-highlight --number-sections --template template.html" - [retcode, result, err] = pipe_through_prog(prog, yaml + toc + mdtext) + prog = "build/src/cmark" + [retcode, result, err] = pipe_through_prog(prog, toc + mdtext) if retcode == 0: result = re.sub(r'␣', ' ', result) - sys.stdout.write(result) + sys.stdout.write(template.substitute(metadata, body=result)) else: sys.stderr.write("Error converting markdown version of spec:\n") sys.stderr.write(err) diff --git a/spec.txt b/spec.txt index aebbc5b..508a3f7 100644 --- a/spec.txt +++ b/spec.txt @@ -1,7 +1,6 @@ --- title: CommonMark Spec -author: -- John MacFarlane +author: John MacFarlane version: 0.15 date: 2014-12-31 license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' diff --git a/template.html b/template.html index 6a30d0c..a5cc081 100644 --- a/template.html +++ b/template.html @@ -2,7 +2,7 @@ -$title$ +${title}