Skip to content
Snippets Groups Projects
Commit 75d994ab authored by Timo Koch's avatar Timo Koch
Browse files

Merge branch 'feature/modify-python-examples-docgen' into 'feature/python-examples-docgen'

Feature/modify python examples docgen

See merge request !1915
parents 4a8b6ceb abc065c2
No related branches found
No related tags found
2 merge requests!1915Feature/modify python examples docgen,!1914[examples] Implement Python-only doc generator using pyparsing
...@@ -10,12 +10,12 @@ from pyparsing import * ...@@ -10,12 +10,12 @@ from pyparsing import *
# tell pyparsing to never ignore white space characters # tell pyparsing to never ignore white space characters
ParserElement.setDefaultWhitespaceChars('') ParserElement.setDefaultWhitespaceChars('')
def taggedContent(keyname, action, open="[[", close="]]", endTag="/"): def parseTaggedContent(keyname, action, open="[[", close="]]", endTag="/"):
""" """
Match content between [[keyname]] and [[/keyname]] and apply the action on it Match content between [[keyname]] and [[/keyname]] and apply the action on it
""" """
start = LineStart() + ZeroOrMore(" ") + Literal("//") + ZeroOrMore(" ") + Literal(open + str(keyname) + close) start = LineStart() + ZeroOrMore(" ") + "//" + ZeroOrMore(" ") + (open + str(keyname) + close) + LineEnd()
end = LineStart() + ZeroOrMore(" ") + Literal("//") + ZeroOrMore(" ") + Literal(open + endTag + str(keyname) + close) end = LineStart() + ZeroOrMore(" ") + "//" + ZeroOrMore(" ") + (open + endTag + str(keyname) + close) + LineEnd()
return start.suppress() + SkipTo(end).setParseAction(action) + end.suppress() return start.suppress() + SkipTo(end).setParseAction(action) + end.suppress()
def createMarkdownCode(markDownToken): def createMarkdownCode(markDownToken):
...@@ -27,33 +27,35 @@ def createMarkdownCode(markDownToken): ...@@ -27,33 +27,35 @@ def createMarkdownCode(markDownToken):
if not token[0].rstrip(): if not token[0].rstrip():
return "" return ""
else: else:
return "```" + markDownToken + "\n" + token[0].rstrip() + "\n```\n" return "\n```" + markDownToken + "\n" + token[0].rstrip() + "\n```\n\n"
return action return action
def cppRules(): def cppRules():
""" """
Define a list of rules to apply for cpp source code Define a list of rules to apply for cpp source code
""" """
header = Suppress(Combine(Literal("// -*-") + SkipTo(Literal("*******/") + LineEnd()) + Literal("*******/"))) suppressHeader = Suppress(Combine("// -*-" + SkipTo("*******/" + LineEnd(), include=True)))
headerGuard = Suppress(Literal("#ifndef") + Optional(restOfLine) + LineEnd() + Literal("#define") + Optional(restOfLine)) suppressHeaderGuard = Suppress("#ifndef" + Optional(restOfLine) + LineEnd() + "#define" + Optional(restOfLine))
endHeaderGuard = Suppress(Literal("#endif") + Optional(restOfLine)) suppressEndHeaderGuard = Suppress("#endif" + Optional(restOfLine))
# exclude stuff between [[exclude]] and [[/exclude]]
exclude = taggedContent("exclude", action=replaceWith(""))
# make a code block (possibly containing comments) between [[codeblock]] and [[/codeblock]] # make a code block (possibly containing comments) between [[codeblock]] and [[/codeblock]]
action = createMarkdownCode("cpp") createCppBlock = createMarkdownCode("cpp")
codeblock = taggedContent("codeblock", action=action) parseCodeblock = parseTaggedContent("codeblock", action=createCppBlock)
# treat doc and code line # treat doc and code line
doc = LineStart() + Suppress(ZeroOrMore(" ") + Literal("//") + ZeroOrMore(" ")) + Optional(restOfLine) parseDoc = LineStart() + Suppress(ZeroOrMore(" ") + "//" + ZeroOrMore(" ")) + Optional(restOfLine)
code = LineStart() + ~(ZeroOrMore(" ") + Literal("//")) + (SkipTo(doc) | SkipTo(StringEnd())) parseCode = LineStart() + ~(ZeroOrMore(" ") + "//") + (SkipTo(parseDoc) | SkipTo(StringEnd()))
code.setParseAction(action) parseCode.setParseAction(createCppBlock)
docTransforms = codeblock | doc | code docTransforms = parseCodeblock | parseDoc | parseCode
return [header, headerGuard, endHeaderGuard, exclude, docTransforms] return [suppressHeader, suppressHeaderGuard, suppressEndHeaderGuard, docTransforms]
def transformCode(code, rules): def transformCode(code, rules):
# exclude stuff between [[exclude]] and [[/exclude]]
exclude = parseTaggedContent("exclude", action=replaceWith(""))
code = exclude.transformString(code)
for transform in rules: for transform in rules:
code = transform.transformString(code) code = transform.transformString(code)
return code return code
...@@ -13,8 +13,9 @@ def convertToMarkdownAndMerge(dir, includeList): ...@@ -13,8 +13,9 @@ def convertToMarkdownAndMerge(dir, includeList):
with open(os.path.join(dir, include), "r") as markdown: with open(os.path.join(dir, include), "r") as markdown:
readme.write(markdown.read()) readme.write(markdown.read())
elif fileExtension == ".hh" or fileExtension == ".cc": elif fileExtension == ".hh" or fileExtension == ".cc":
title = description if description else "The file " title = description + " (`{}`)\n\n\n" if description else "The file `{}`\n\n\n"
readme.write("\n\n## " + title + "`{}`\n\n\n".format(os.path.split(include)[1])) title = title.format(os.path.split(include)[1])
readme.write("\n\n## " + title)
with open(os.path.join(dir, include), "r") as cppCode: with open(os.path.join(dir, include), "r") as cppCode:
readme.write(transformCode(cppCode.read(), cppRules()) + "\n") readme.write(transformCode(cppCode.read(), cppRules()) + "\n")
else: else:
...@@ -27,7 +28,7 @@ def generateReadme(dir): ...@@ -27,7 +28,7 @@ def generateReadme(dir):
configname = os.path.join(dir, ".doc_config") configname = os.path.join(dir, ".doc_config")
with open(configname, 'r') as config: with open(configname, 'r') as config:
def readline(line): def readline(line):
line = line.split() line = line.split(' ', 1)
if len(line) == 1: if len(line) == 1:
return [line[0], ""] return [line[0], ""]
else: else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment