mirror of https://gitee.com/bigwinds/arangodb
211 lines
8.0 KiB
Python
211 lines
8.0 KiB
Python
import sys
|
|
import re
|
|
import os
|
|
import MarkdownPP
|
|
|
|
dokuBlocks = [{},{}]
|
|
|
|
def _mkdir_recursive(path):
|
|
sub_path = os.path.dirname(path)
|
|
if not os.path.exists(sub_path):
|
|
_mkdir_recursive(sub_path)
|
|
if not os.path.exists(path):
|
|
os.mkdir(path)
|
|
|
|
|
|
def replaceCode(lines):
|
|
lines = re.sub(r"<!--(\s*.+\s)-->","", lines)
|
|
# remove the placeholder BR's again:
|
|
lines = re.sub(r"<br />\n", "\n", lines)
|
|
# multi line bullet lists should become one:
|
|
lines = re.sub(r"\n\n-", "\n-", lines)
|
|
|
|
#HTTP API changing code
|
|
# unwrap multi-line-briefs: (up to 3 lines supported by now ;-)
|
|
lines = re.sub(r"@brief(.+)\n(.+)\n(.+)\n\n", r"@brief\g<1> \g<2> \g<3>\n\n", lines)
|
|
lines = re.sub(r"@brief(.+)\n(.+)\n\n", r"@brief\g<1> \g<2>\n\n", lines)
|
|
# if there is an @brief above a RESTHEADER, swap the sequence:
|
|
lines = re.sub(r"@brief(.+\n*)\n\n@RESTHEADER{([\s\w\/\_{}-]*),([\s\w-]*)}",r"###\g<3>\n\g<1>\n\n`\g<2>`", lines)
|
|
# else simply put it into the text:
|
|
lines = re.sub(r"@brief(.+)",r"\g<1>", lines)
|
|
# there should be no RESTHEADER without brief, so we will fail offensively if by not doing:
|
|
#lines = re.sub(r"@RESTHEADER{([\s\w\/\_{}-]*),([\s\w-]*)}", r"###\g<2>\n`\g<1>`", lines)
|
|
|
|
lines = re.sub(r"@RESTDESCRIPTION","", lines)
|
|
lines = re.sub(r"@RESTURLPARAM(\s+)","\n**URL Parameters**\n", lines)
|
|
lines = re.sub(r"@RESTQUERYPARAM(\s+)","\n**Query Parameters**\n", lines)
|
|
lines = re.sub(r"@RESTHEADERPARAM(\s+)","\n**Header Parameters**\n", lines)
|
|
lines = re.sub(r"@RESTBODYPARAM(\s+)","\n**Body Parameters**\n", lines)
|
|
lines = re.sub(r"@RESTRETURNCODES","\n**Return Codes**\n", lines)
|
|
lines = re.sub(r"@RESTURLPARAM", "@RESTPARAM", lines)
|
|
lines = re.sub(r"@PARAMS", "\n**Parameters**\n", lines)
|
|
lines = re.sub(r"@PARAM", "@RESTPARAM", lines)
|
|
lines = re.sub(r"@RESTHEADERPARAM", "@RESTPARAM", lines)
|
|
lines = re.sub(r"@RESTQUERYPARAM", "@RESTPARAM", lines)
|
|
lines = re.sub(r"@RESTBODYPARAM", "@RESTPARAM", lines)
|
|
lines = re.sub(r"@RESTPARAM{([\s\w\-]*),([\s\w\_\|-]*),\s[optional]}", r"* *\g<1>* (\g<3>):", lines)
|
|
lines = re.sub(r"@RESTPARAM{([\s\w-]*),([\s\w\_\|-]*),\s*(\w+)}", r"* *\g<1>*:", lines)
|
|
lines = re.sub(r"@RESTRETURNCODE{(.*)}", r"* *\g<1>*:", lines)
|
|
lines = re.sub(r"@RESTBODYPARAMS{(.*)}", r"*(\g<1>)*", lines)
|
|
lines = lines.replace("@EXAMPLES","\n**Examples**\n")
|
|
lines = lines.replace("@EXAMPLES","\n**Examples**\n")
|
|
lines = lines.replace("@RESTPARAMETERS","")
|
|
lines = lines.replace("@RESTPARAMS","")
|
|
# Error codes replace
|
|
lines = re.sub(r"(####)#+", r"", lines)
|
|
# lines = re.sub(r"- (\w+):\s*@LIT{(.+)}", r"\n*\g<1>* - **\g<2>**:", lines)
|
|
lines = re.sub(r"(.+),(\d+),\"(.+)\",\"(.+)\"", r"\n*\g<2>* - **\g<3>**: \g<4>", lines)
|
|
return lines
|
|
|
|
def replaceCodeIndex(lines):
|
|
lines = re.sub(r"<!--(\s*.+\s)-->","", lines)
|
|
#HTTP API changing code
|
|
#lines = re.sub(r"@brief(.+)",r"\g<1>", lines)
|
|
#lines = re.sub(r"@RESTHEADER{([\s\w\/\_{}-]*),([\s\w-]*)}", r"###\g<2>\n`\g<1>`", lines)
|
|
return lines
|
|
|
|
################################################################################
|
|
# main loop over all files
|
|
################################################################################
|
|
def walk_on_files(inDirPath, outDirPath):
|
|
for root, dirs, files in os.walk(inDirPath):
|
|
for file in files:
|
|
if file.endswith(".mdpp"):
|
|
inFileFull = os.path.join(root, file)
|
|
outFileFull = os.path.join(outDirPath, re.sub(r'mdpp$', 'md', inFileFull))
|
|
print "%s -> %s" % (inFileFull, outFileFull)
|
|
_mkdir_recursive(os.path.join(outDirPath, root))
|
|
mdpp = open(inFileFull, "r")
|
|
md = open(outFileFull, "w")
|
|
MarkdownPP.MarkdownPP(input=mdpp, output=md, modules=MarkdownPP.modules.keys())
|
|
mdpp.close()
|
|
md.close()
|
|
findStartCode(md, outFileFull)
|
|
|
|
def findStartCode(fd,full_path):
|
|
inFD = open(full_path, "r")
|
|
textFile =inFD.read()
|
|
inFD.close()
|
|
#print "-" * 80
|
|
#print textFile
|
|
matchInline = re.findall(r'@startDocuBlockInline\s*(\w+)', textFile)
|
|
if matchInline:
|
|
for find in matchInline:
|
|
#print "7"*80
|
|
print full_path + " " + find
|
|
textFile = replaceTextInline(textFile, full_path, find)
|
|
#print textFile
|
|
|
|
match = re.findall(r'@startDocuBlock\s*(\w+)', textFile)
|
|
if match:
|
|
for find in match:
|
|
#print "8"*80
|
|
textFile = replaceText(textFile, full_path, find)
|
|
#print textFile
|
|
|
|
textFile = replaceCodeIndex(textFile)
|
|
textFile = replaceCode(textFile)
|
|
#print "9" * 80
|
|
#print textFile
|
|
outFD = open(full_path, "w")
|
|
|
|
outFD.truncate()
|
|
outFD.write(textFile)
|
|
outFD.close()
|
|
|
|
|
|
def replaceText(text, pathOfFile, searchText):
|
|
''' reads the mdpp and generates the md '''
|
|
global dokuBlocks
|
|
if not searchText in dokuBlocks[0]:
|
|
print "Failed to locate the docublock '%s' for replacing it into the file '%s'\n have:" % (searchText, pathOfFile)
|
|
print dokuBlocks[0].keys()
|
|
print '*' * 80
|
|
print text
|
|
exit(1)
|
|
rc= re.sub("@startDocuBlock\s+"+ searchText + "(?:\s+|$)", dokuBlocks[0][searchText], text)
|
|
return rc
|
|
|
|
def replaceTextInline(text, pathOfFile, searchText):
|
|
''' reads the mdpp and generates the md '''
|
|
global dokuBlocks
|
|
if not searchText in dokuBlocks[1]:
|
|
print "Failed to locate the inline docublock '%s' for replacing it into the file '%s'\n have:" % (searchText, pathOfFile)
|
|
print dokuBlocks[1].keys()
|
|
print '*' * 80
|
|
print text
|
|
exit(1)
|
|
rePattern = r'(?s)\s*@startDocuBlockInline\s+'+ searchText +'.*@endDocuBlock\s' + searchText
|
|
# (?s) is equivalent to flags=re.DOTALL but works in Python 2.6
|
|
match = re.search(rePattern, text)
|
|
|
|
if (match == None):
|
|
print "failed to match with '%s' for %s in file %s in: \n%s" % (rePattern, searchText, pathOfFile, text)
|
|
exit(1)
|
|
|
|
subtext = match.group(0)
|
|
if (len(re.findall('@startDocuBlock', subtext)) > 1):
|
|
print "failed to snap with '%s' on end docublock for %s in %s our match is:\n%s" % (rePattern, searchText, pathOfFile, subtext)
|
|
exit(1)
|
|
|
|
return re.sub(rePattern, dokuBlocks[1][searchText], text)
|
|
|
|
################################################################################
|
|
# Read the docublocks into memory
|
|
################################################################################
|
|
thisBlock = ""
|
|
thisBlockName = ""
|
|
thisBlockType = 0
|
|
|
|
STATE_SEARCH_START = 0
|
|
STATE_SEARCH_END = 1
|
|
def readStartLine(line):
|
|
global thisBlockName, thisBlockType, thisBlock, dokuBlocks
|
|
if ("@startDocuBlock" in line):
|
|
if "@startDocuBlockInline" in line:
|
|
thisBlockType = 1
|
|
else:
|
|
thisBlockType = 0
|
|
try:
|
|
thisBlockName = re.search(r" *start[0-9a-zA-Z]*\s\s*([0-9a-zA-Z_ ]*)\s*$", line).group(1).strip()
|
|
except:
|
|
print "failed to read startDocuBlock: [" + line + "]"
|
|
exit(1)
|
|
dokuBlocks[thisBlockType][thisBlockName] = ""
|
|
return STATE_SEARCH_END
|
|
return STATE_SEARCH_START
|
|
|
|
def readNextLine(line):
|
|
global thisBlockName, thisBlockType, thisBlock, dokuBlocks
|
|
if '@endDocuBlock' in line:
|
|
return STATE_SEARCH_START
|
|
dokuBlocks[thisBlockType][thisBlockName] += line
|
|
#print "reading " + thisBlockName
|
|
#print dokuBlocks[thisBlockType][thisBlockName]
|
|
return STATE_SEARCH_END
|
|
|
|
def loadDokuBlocks():
|
|
state = STATE_SEARCH_START
|
|
f=open("allComments.txt", 'rU')
|
|
count = 0
|
|
for line in f.readlines():
|
|
if state == STATE_SEARCH_START:
|
|
state = readStartLine(line)
|
|
elif state == STATE_SEARCH_END:
|
|
state = readNextLine(line)
|
|
|
|
#if state == STATE_SEARCH_START:
|
|
# print dokuBlocks[thisBlockType].keys()
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) < 2:
|
|
print("usage: input-directory output-directory")
|
|
exit(1)
|
|
|
|
inDir = sys.argv[1]
|
|
outDir = sys.argv[2]
|
|
loadDokuBlocks()
|
|
print "loaded %d / %d docu blocks" % (len(dokuBlocks[0]), len(dokuBlocks[1]))
|
|
#print dokuBlocks[0].keys()
|
|
walk_on_files(inDir, outDir)
|