rust/src/etc/extract-tests.py

68 lines
2.1 KiB
Python
Raw Normal View History

# Script for extracting compilable fragments from markdown
# documentation. See prep.js for a description of the format
# recognized by this tool. Expects a directory fragements/ to exist
# under the current directory, and writes the fragments in there as
# individual .rs files.
import sys, re;
2012-01-20 20:05:07 -06:00
if len(sys.argv) < 3:
print("Please provide an input filename")
sys.exit(1)
filename = sys.argv[1]
2012-01-20 20:05:07 -06:00
dest = sys.argv[2]
f = open(filename)
lines = f.readlines()
f.close()
cur = 0
line = ""
chapter = ""
chapter_n = 0
while cur < len(lines):
line = lines[cur]
cur += 1
chap = re.match("# (.*)", line);
if chap:
chapter = re.sub(r"\W", "_", chap.group(1)).lower()
chapter_n = 1
elif re.match("~~~", line):
# Parse the tags that open a code block in the pandoc format:
# ~~~ {.tag1 .tag2}
tags = re.findall("\.([\w-]*)", line)
block = ""
ignore = "notrust" in tags or "ignore" in tags
# Some tags used by the language ref that indicate not rust
ignore |= "ebnf" in tags
ignore |= "abnf" in tags
ignore |= "keyword" in tags
ignore |= "field" in tags
ignore |= "precedence" in tags
xfail = "xfail-test" in tags
while cur < len(lines):
line = lines[cur]
cur += 1
if re.match("~~~", line):
break
else:
# Lines beginning with '# ' are turned into valid code
line = re.sub("^# ", "", line)
# Allow elipses in code snippets
line = re.sub("\.\.\.", "/*...*/", line)
block += line
if not ignore:
if not re.search(r"\bfn main\b", block):
2012-07-02 18:27:53 -05:00
block = "fn main() {\n" + block + "\n}\n"
2012-09-05 19:04:42 -05:00
if not re.search(r"\bextern mod std\b", block):
block = "extern mod std;\n" + block;
2012-01-20 20:05:07 -06:00
if xfail:
block = "// xfail-test\n" + block
filename = (dest + "/" + str(chapter)
+ "_" + str(chapter_n) + ".rs")
chapter_n += 1
f = open(filename, 'w')
f.write(block)
f.close()