#!/usr/bin/python
import monkDebug as debug
import sys
import monkTools
#import CppHeaderParser
import re
import codeBB
import collections
global_class_link = {
"std::string" : "http://www.cplusplus.com/reference/string/string/",
"std::u16string" : "http://www.cplusplus.com/reference/string/u16string/",
"std::u32string" : "http://www.cplusplus.com/reference/string/u32string/",
"std::wstring" : "http://www.cplusplus.com/reference/string/wstring/",
"std::vector" : "http://www.cplusplus.com/reference/vector/vector/"
}
def replace_type(match):
value = "" + match.group() + ""
return value
def replace_storage_keyword(match):
value = "" + match.group() + ""
return value
def display_color(valBase):
# storage keyword :
p = re.compile("(inline|const|class|virtual|private|public|protected|friend|const|extern|auto|register|static|volatile|typedef|struct|union|enum)")
val = p.sub(replace_storage_keyword, valBase)
# type :
p = re.compile("(bool|BOOL|char(16_t|32_t)?|double|float|u?int(8|16|32|64|128)?(_t)?|long|short|signed|size_t|unsigned|void|(I|U)(8|16|32|64|128))")
val = p.sub(replace_type, val)
return val, len(valBase)
def display_type(type, myDoc):
type = type.replace("inline ", "")
lenght = 0;
isFirst = True
out = ''
# we split all the element in list sepa=rated with space to keep class... and standard c+ class
for element in type.split(' '):
if isFirst == False:
out += " "
lenght += 1
isFirst = False
# check if the element in internal at the current lib
name, link = myDoc.get_class_link(element)
if len(link) != 0:
out += "" + name + ""
lenght += len(element)
# Ckeck if the variable in a standard class:
elif element in global_class_link.keys():
out += "" + element + ""
lenght += len(element)
else:
data, lenghtTmp = display_color(element)
out += data
lenght += lenghtTmp
# get every subelement class :
return [out,lenght]
def display_doxygen_param(comment, input, output):
data = "Parameter"
if input == True:
data += " [input]"
if output == True:
data += " [output]"
data += ": "
#extract first element:
val = comment.find(" ")
var = comment[:val]
endComment = comment[val:]
# TODO : Check if it exist in the parameter list ...
data += "" + var + " " + endComment
data += " "
return data
def parse_doxygen(data) :
streams = data.split("@")
data2 = ''
for element in streams:
if element[:1] == "\n" \
or element[:2] == "\n\n":
# nothing to do : Nomale case of the first \n
None
elif element[:6] == "brief ":
data2 += element[6:]
data2 += " "
for element in streams:
if element[:1] == "\n" \
or element[:2] == "\n\n":
# nothing to do : Nomale case of the first \n
None
elif element[:5] == "note ":
data2 += "Notes: "
data2 += element[5:]
data2 += " "
data3 = ''
for element in streams:
if element[:1] == "\n" \
or element[:2] == "\n\n":
# nothing to do : Nomale case of the first \n
None
elif element[:14] == "param[in,out] " \
or element[:14] == "param[out,in] ":
data3 += display_doxygen_param(element[14:], True, True)
elif element[:10] == "param[in] ":
data3 += display_doxygen_param(element[10:], True, False)
elif element[:11] == "param[out] ":
data3 += display_doxygen_param(element[11:], False, True)
elif element[:6] == "param ":
data3 += display_doxygen_param(element[6:], False, False)
elif element[:7] == "return ":
data3 += "Return: "
data3 += element[7:]
data3 += " "
if data3 != '':
data2 += "
\n"
data2 += data3
data2 += "
\n"
return data2
def white_space(size) :
ret = ''
for iii in range(len(ret), size):
ret += " "
return ret
def calsulateSizeFunction(function, size) :
if len(function["name"]) > size:
return len(function["name"])+1
return size
def calsulateSizeReturn(function, size) :
if len(function["rtnType"]) > size:
return len(function["rtnType"])+1
return size
def addSub(tree, filterSubNamespace=False):
return ""
# ##############################################################
# NEW function ...
# ##############################################################
def generate_menu(element, namespaceStack=[], level=1):
listBase = element.get_all_sub_type(['namespace'])
if len(listBase) == 0:
return ""
ret = ""
ret += '
\n'
for element in listBase:
namespaceStack.append(element['node'].get_name())
retTmp = generate_menu(element['node'], namespaceStack, level+1)
namespaceStack.pop()
if retTmp != "":
subMenu = ' class="sousmenu"'
else:
subMenu = ''
ret += '
' + generate_link(element['node'], namespaceStack) + '\n'
ret += retTmp
ret += '
\n'
ret += '
\n'
return ret
def generate_html_page_name(element, namespaceStack):
link = ""
for name in namespaceStack:
link += name + "__"
return element.get_node_type() + "_" + link + element.get_name() + '.html'
def generate_name(element, namespaceStack):
link = ""
for name in namespaceStack:
link += name + "::"
return element.get_node_type() + ": " + link + element.get_name()
def generate_link(element, namespaceStack):
return '' + element.get_name() + ''
def calculate_methode_size(list):
returnSize = 0;
methodeSize = 0;
for element in list:
retType = ""
if element['node'].get_virtual() == True:
retType += 'virtual '
retType += element['node'].get_return_type().to_str()
tmpLen = len(retType)
if returnSize < tmpLen:
returnSize = tmpLen
tmpLen = len(element['node'].get_name())
if methodeSize < tmpLen:
methodeSize = tmpLen
return [returnSize, methodeSize]
def write_methode(element, namespaceStack, displaySize = None, link = True):
if displaySize == None:
displaySize = calculate_methode_size([element])
ret = ""
if 'access' in element.keys():
if element['access'] == 'private':
ret += '- '
elif element['access'] == 'protected':
ret += '# '
elif element['access'] == 'public':
ret += '+ '
else:
ret += ' '
retType = ""
if element['node'].get_virtual() == True:
retType += 'virtual '
retType += element['node'].get_return_type().to_str()
if retType != "":
retType2 = re.sub("<","<", retType)
retType2 = re.sub(">",">", retType2)
ret += retType2
ret += " "
ret += white_space(displaySize[0] - len(retType))
name = element['node'].get_name()
if link == True:
ret += '' + name + ''
else:
ret += '' + name + ''
ret += white_space(displaySize[1] - len(name)) + ' ('
listParam = element['node'].get_param()
first = True
for param in listParam:
if first == False:
ret += ', '
ret += white_space(displaySize[0] + displaySize[1] +5)
first = False
retParam = param.get_type().to_str()
if retParam != "":
ret += retParam
ret += " "
ret += "" + param.get_name() + ""
ret += ')'
if element['node'].get_virtual_pure() == True:
ret += ' = 0'
if element['node'].get_constant() == True:
ret += ' const'
ret += ';'
ret += ' '
return ret
def generate_stupid_index_page(outFolder, header, footer, myLutinDoc):
# create index.hml :
filename = outFolder + "/index.html"
monkTools.create_directory_of_file(filename);
file = open(filename, "w")
file.write(header)
file.write("
");
file.write("");
if element.get_node_type() == 'library':
file.write("TODO : the page ...");
elif element.get_node_type() == 'application':
file.write("TODO : the page ...");
elif element.get_node_type() == 'namespace':
file.write("TODO : the page ...");
elif element.get_node_type() == 'class':
# calculate element size :
listBase = element.get_all_sub_type(['methode', 'constructor', 'destructor'])
displayLen = calculate_methode_size(listBase)
file.write("
Constructor and Destructor:
\n")
file.write("
\n");
listBaseConstructor = element.get_all_sub_type(['constructor'])
for elem in listBaseConstructor:
ret = write_methode(elem, namespaceStack, displayLen)
file.write(ret)
listBaseDestructor = element.get_all_sub_type(['destructor'])
for elem in listBaseDestructor:
ret = write_methode(elem, namespaceStack, displayLen)
file.write(ret)
file.write("
\n");
file.write(" \n")
file.write("
Synopsis:
\n")
file.write("
\n");
listBaseMethode = element.get_all_sub_type(['methode'])
displayLen = calculate_methode_size(listBaseMethode)
for elem in listBaseMethode:
ret = write_methode(elem, namespaceStack, displayLen)
file.write(ret)
file.write("