[DEV] generated code is now usable

This commit is contained in:
Edouard DUPIN 2013-12-27 21:35:30 +01:00
parent 378ba0b8fa
commit 7d217467dc
8 changed files with 360 additions and 143 deletions

View File

@ -83,6 +83,11 @@ def transcode(value):
value, value,
flags=re.DOTALL) flags=re.DOTALL)
value = re.sub(r'\[note\](.*?)\[/note\]',
r'<br/><b>Note:</b><pre>\1</pre>',
value,
flags=re.DOTALL)
value = re.sub(r'____(.*?)\n', value = re.sub(r'____(.*?)\n',
r'<hr>', r'<hr>',
value, value,

View File

@ -4,6 +4,33 @@ import sys
import monkTools import monkTools
import re import re
listRegExp = [
[ r'&lt;!\-\-!(.*?)\-\-&gt;', 'code-doxygen'],
[ r'&lt;!\-\-(.*?)\-\-&gt;', 'code-comment'],
[ r'"((\\"|.)*?)"', 'code-text-quote'],
[ r"'(('|.)*?)'", 'code-text-quote'],
[ r'&lt;/[0-9a-zA-Z_]+|&lt;[0-9a-zA-Z_]+|/&gt;|&gt;',
'code-function-name']
]
def transcode(value): def transcode(value):
return value inValue = value
outValue = ""
haveFindSomething = False;
for reg1, color in listRegExp:
result = re.search(reg1, inValue, re.DOTALL)
while result != None:
haveFindSomething = True
# sub parse the start :
outValue += transcode(inValue[:result.start()])
# transform local
outValue += '<span class="' + color + '">'
outValue += result.group()
outValue += '</span>'
# change the input value
inValue = inValue[result.end():]
# Search again ...
result = re.search(reg1, inValue, re.DOTALL)
outValue += inValue
return outValue

View File

@ -11,20 +11,27 @@ import monkNode as node
def display_doxygen_param(comment, input, output): def display_doxygen_param(comment, input, output):
data = "<b>Parameter" data = '<tr>'
data = '<td>'
data += "<b>Parameter"
if input == True: if input == True:
data += " [input]" data += " [input]"
if output == True: if output == True:
data += " [output]" data += " [output]"
data += ":</b> " data += ":</b>"
data += '</td>'
#extract first element: #extract first element:
val = comment.find(" ") val = comment.find(" ")
var = comment[:val] var = comment[:val]
endComment = comment[val:] endComment = comment[val:]
data += '<td>'
# TODO : Check if it exist in the parameter list ... # TODO : Check if it exist in the parameter list ...
data += "<span class=\"code-argument\">" + var + "</span> " + endComment data += "<span class=\"code-argument\">" + var + "</span> "
data += '</td>'
data += "<br/>" data += '<td>'
data += codeBB.transcode(endComment)
data += '</td>'
data += '</tr>\n'
return data return data
@ -40,8 +47,8 @@ def parse_doxygen(data) :
# nothing to do : Nomale case of the first \n # nothing to do : Nomale case of the first \n
None None
elif element[:6] == "brief ": elif element[:6] == "brief ":
data2 += element[6:] data2 += codeBB.transcode(element[6:])
data2 += "<br/>" data2 += '<br/>'
for element in streams: for element in streams:
if element[:1] == "\n" \ if element[:1] == "\n" \
@ -49,11 +56,12 @@ def parse_doxygen(data) :
# nothing to do : Nomale case of the first \n # nothing to do : Nomale case of the first \n
None None
elif element[:5] == "note ": elif element[:5] == "note ":
data2 += "<b>Notes:</b> " data2 += '<b>Note:</b> '
data2 += element[5:] data2 += codeBB.transcode(element[5:])
data2 += "<br/> " data2 += '<br/> '
data3 = '' data3 = ''
dataReturn = ''
for element in streams: for element in streams:
if element[:1] == "\n" \ if element[:1] == "\n" \
or element[:2] == "\n\n": or element[:2] == "\n\n":
@ -69,13 +77,22 @@ def parse_doxygen(data) :
elif element[:6] == "param ": elif element[:6] == "param ":
data3 += display_doxygen_param(element[6:], False, False) data3 += display_doxygen_param(element[6:], False, False)
elif element[:7] == "return ": elif element[:7] == "return ":
data3 += "<b>Return:</b> " if dataReturn != "":
data3 += element[7:] dataReturn += '<br/>'
data3 += "<br/>" dataReturn += element[7:]
if data3 != '': if data3 != '' \
data2 += "<ul>\n" or dataReturn != '':
data2 += '<ul>\n'
data2 += '<table class="parameter-list">\n'
data2 += data3 data2 += data3
data2 += "</ul>\n" if dataReturn != "":
data2 += '<tr><td>'
data2 += '<b>Return: </b>'
data2 += '</td><td></td><td>'
data2 += codeBB.transcode(dataReturn)
data2 += '</td></tr>'
data2 += '</table>\n'
data2 += '</ul>\n'
return data2 return data2
def white_space(size) : def white_space(size) :
@ -135,6 +152,8 @@ def calculate_methode_size(list):
def write_methode(element, namespaceStack, displaySize = None, link = True): def write_methode(element, namespaceStack, displaySize = None, link = True):
if element['node'].get_request_hidden() == True:
return
if displaySize == None: if displaySize == None:
displaySize = calculate_methode_size([element]) displaySize = calculate_methode_size([element])
ret = "" ret = ""
@ -337,15 +356,34 @@ def generate_page(outFolder, header, footer, element):
if len(listBase) != 0: if len(listBase) != 0:
# display all functions : # display all functions :
file.write('<h2>Detail:</h2>\n') file.write('<h2>Detail:</h2>\n')
allDetailDoc = ""
lastDoc = ""
for subElement in listBase: for subElement in listBase:
file.write('<h3><a id="' + str(subElement['node'].get_uid()) + '">' + subElement['node'].get_name() + '</a></h3>') file.write('<a id="' + str(subElement['node'].get_uid()) + '"/>')
file.write('<pre>\n'); if lastDoc != "" \
file.write(write_methode(subElement, namespaceStack, link = False)) and subElement['node'].get_request_in_previous() == True:
file.write('</pre>\n'); allDetailDoc += write_methode(subElement, namespaceStack, link = False)
#debug.info(str(element['node'].get_doc())); else:
file.write(parse_doxygen(subElement['node'].get_doc())); if lastDoc != "":
file.write('<br/>\n'); allDetailDoc += '</pre>\n'
file.write('<hr/>\n'); allDetailDoc += lastDoc
allDetailDoc += '<br/>\n'
allDetailDoc += '<hr/>\n'
file.write(allDetailDoc);
allDetailDoc = ""
lastDoc = ""
allDetailDoc += '<h3>' + subElement['node'].get_name() + '</h3>'
allDetailDoc += '<pre>\n'
allDetailDoc += write_methode(subElement, namespaceStack, link = False)
lastDoc = parse_doxygen(subElement['node'].get_doc()) + '\n'
if lastDoc != "":
allDetailDoc += '</pre>\n'
allDetailDoc += lastDoc
allDetailDoc += '<br/>\n'
allDetailDoc += '<hr/>\n'
file.write(allDetailDoc);
allDetailDoc = ""
lastDoc = ""
if element.get_node_type() == 'enum': if element.get_node_type() == 'enum':
myElementList = element.get_enum_list() myElementList = element.get_enum_list()
@ -420,12 +458,71 @@ def generate(myLutinDoc, outFolder) :
genericHeader += '<body>\n' genericHeader += '<body>\n'
genericHeader += ' <div class="navbar navbar-fixed-top">\n' genericHeader += ' <div class="navbar navbar-fixed-top">\n'
genericHeader += ' <div class="container">\n' genericHeader += ' <div class="container">\n'
genericHeader += ' <h1>' + myDoc.get_name() + ' Library</h1>\n' if myDoc.get_node_type() == 'library':
genericHeader += ' <h1><a href="index.html">' + myDoc.get_name() + ' library</a></h1>\n'
else:
genericHeader += ' <h1><a href="index.html">' + myDoc.get_name() + '</a></h1>\n'
genericHeader += '<h3>API:</h3>'
genericHeader += ' <div id="menu">\n' genericHeader += ' <div id="menu">\n'
#genericHeader += ' <h2>' + myDoc.moduleName + '</h2>\n' #genericHeader += ' <h2>' + myDoc.moduleName + '</h2>\n'
genericHeader += generate_menu(myDoc) genericHeader += generate_menu(myDoc)
#genericHeader += ' <h3> </h3>\n' #genericHeader += ' <h3> </h3>\n'
genericHeader += ' </div>\n' genericHeader += ' </div>\n'
# TODO : add Generic doc main point.
if len(myLutinDoc.listDocFile) > 0:
genericHeader += '<h3>Documentation:</h3>'
genericHeader += '<div id="menu">\n'
for docInputName,outpath in myLutinDoc.listDocFile:
outputFileName = outFolder + "/" + outpath.replace('/','_') +".html"
outputFileName = outputFileName.split('/')[-1]
name = outputFileName.split('_')[-1][:-5]
if name == "index":
continue
genericHeader += '<ul class="niveau1">'
genericHeader += '<li><a href="' + outputFileName + '">' + name + '</a></li>\n'
genericHeader += '</ul>'
genericHeader += '</div>\n'
# TODO : add Tutorial doc main point.
if len(myLutinDoc.listTutorialFile) > 0:
genericHeader += '<h3>Tutorials:</h3>'
genericHeader += '<div id="menu">\n'
for docInputName,outpath in myLutinDoc.listTutorialFile:
outputFileName = outFolder + "/" + outpath+".html"
outputFileName = outputFileName.split('/')[-1]
name = outputFileName.split('_')[-1][:-5]
if name == "index":
continue
genericHeader += '<ul class="niveau1">'
genericHeader += '<li><a href="tutorial_' + outputFileName + '">' + name + '</a></li>\n'
genericHeader += '</ul>'
genericHeader += '</div>\n'
localWebsite = myLutinDoc.get_website()
# add other libs entry point :
allModule = module.get_all_module()
if len(allModule) != 1:
genericHeader += '<br/>'
genericHeader += '<h3>Associate libraries:</h3>'
genericHeader += '<div id="menu">\n'
for modd in allModule:
if modd.type == 'application':
continue
if modd.name == myLutinDoc.name:
continue
genericHeader += '<ul class="niveau1">'
link = node.get_doc_website_page_relative(localWebsite, modd.get_website())
if link[-1] != "/":
link += "/"
genericHeader += '<li><a href="' + link + 'index.html">' + modd.name + '</a></li>\n'
genericHeader += '</ul>'
genericHeader += '</div>\n'
genericHeader += "<br/>\n"
genericHeader += "<br/>\n"
genericHeader += "<br/>\n"
genericHeader += "<br/>\n"
genericHeader += "<br/>\n"
genericHeader += "<br/>\n"
genericHeader += " </div>\n" genericHeader += " </div>\n"
genericHeader += " </div>\n" genericHeader += " </div>\n"
genericHeader += " <div class=\"container\" id=\"content\">\n" genericHeader += " <div class=\"container\" id=\"content\">\n"
@ -440,7 +537,7 @@ def generate(myLutinDoc, outFolder) :
# create the namespace index properties : # create the namespace index properties :
generate_page(outFolder, genericHeader, genericFooter, myDoc) generate_page(outFolder, genericHeader, genericFooter, myDoc)
for docInputName,outpath in myLutinDoc.listDocFile : for docInputName,outpath in myLutinDoc.listTutorialFile :
debug.print_element("doc", myLutinDoc.name, "<==", docInputName) debug.print_element("doc", myLutinDoc.name, "<==", docInputName)
outputFileName = outFolder + "/" + outpath.replace('/','_') +".html" outputFileName = outFolder + "/" + outpath.replace('/','_') +".html"
debug.debug("output file : " + outputFileName) debug.debug("output file : " + outputFileName)
@ -451,9 +548,9 @@ def generate(myLutinDoc, outFolder) :
outData = genericHeader + codeBB.transcode(inData) + genericFooter outData = genericHeader + codeBB.transcode(inData) + genericFooter
monkTools.file_write_data(outputFileName, outData) monkTools.file_write_data(outputFileName, outData)
for docInputName,outpath in myLutinDoc.listTutorialFile : for docInputName,outpath in myLutinDoc.listDocFile :
debug.print_element("tutorial", myLutinDoc.name, "<==", docInputName) debug.print_element("tutorial", myLutinDoc.name, "<==", docInputName)
outputFileName = outFolder + "/" + outpath+".html" outputFileName = outFolder + outpath + ".html"
debug.debug("output file : " + outputFileName) debug.debug("output file : " + outputFileName)
monkTools.create_directory_of_file(outputFileName) monkTools.create_directory_of_file(outputFileName)
inData = monkTools.file_read_data(docInputName) inData = monkTools.file_read_data(docInputName)

View File

@ -126,9 +126,9 @@ class Module:
debug.verbose(" Find a doc file : '" + fileCompleteName + "'") debug.verbose(" Find a doc file : '" + fileCompleteName + "'")
pathBase = fileCompleteName[len(self.pathGlobalDoc):len(fileCompleteName)-3] pathBase = fileCompleteName[len(self.pathGlobalDoc):len(fileCompleteName)-3]
if fileCompleteName[:len(tutorialPath)] == tutorialPath: if fileCompleteName[:len(tutorialPath)] == tutorialPath:
self.add_file_doc(fileCompleteName, pathBase)
else:
self.add_tutorial_doc(fileCompleteName, pathBase) self.add_tutorial_doc(fileCompleteName, pathBase)
else:
self.add_file_doc(fileCompleteName, pathBase)
## ##
## @brief Add a documentation file at the parsing system ## @brief Add a documentation file at the parsing system

View File

@ -17,7 +17,7 @@ class Node():
global genericUID global genericUID
genericUID+=1 genericUID+=1
self.uid = genericUID self.uid = genericUID
self.documenatationCode = documentation self.documenatationCode = []
self.nodeType = type self.nodeType = type
self.name = name self.name = name
self.doc = None self.doc = None
@ -28,6 +28,9 @@ class Node():
# namespace elements : (set when all element are parsed ... # namespace elements : (set when all element are parsed ...
self.namespace = [] self.namespace = []
self.moduleLink = None # this is a link on the main application node or library node (usefull to get the website ...) self.moduleLink = None # this is a link on the main application node or library node (usefull to get the website ...)
self.hiddenRequest = False # @not-in-doc
self.previousRequest = False # @previous
self.add_doc(documentation)
def to_str(self): def to_str(self):
return "" return ""
@ -41,6 +44,22 @@ class Node():
def get_name(self): def get_name(self):
return self.name return self.name
def add_doc(self, doc):
for element in doc:
self.documenatationCode.append(element)
if element.find("@not-in-doc") != -1 :
self.hiddenRequest = True
if element.find("@previous") != -1 :
self.previousRequest = True
def get_request_hidden(self):
return self.hiddenRequest
def get_request_in_previous(self):
return self.previousRequest
def get_displayable_name(self): def get_displayable_name(self):
ret = "" ret = ""
for namespace in self.namespace: for namespace in self.namespace:
@ -62,7 +81,8 @@ class Node():
isFirst = False isFirst = False
ret += req ret += req
return ret return ret
if self.nodeType not in ['methode']:
return ""
#try to get previous element : #try to get previous element :
if len(self.namespace) == 0: if len(self.namespace) == 0:
return "" return ""

View File

@ -55,14 +55,15 @@ body {
text-shadow: 0 1px 0 #ce4213; text-shadow: 0 1px 0 #ce4213;
padding: 10px 20px 10px; padding: 10px 20px 10px;
margin-left: -20px; margin-left: -20px;
//overflow:scroll; overflow:scroll;
//overflow-x:hidden; overflow-y:auto;
overflow-x:hidden;
} }
/* .navbar-fixed-top a {
.navbar ul { text-decoration: none;
font-size: 15px; color: #000000;
}; }
*/
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
display: block; display: block;
margin: 10px 0; margin: 10px 0;
@ -100,6 +101,11 @@ pre {
padding-right:10px; padding-right:10px;
} }
.parameter-list td {
padding-left:5px;
padding-right:5px;
}
.code-function { .code-function {
text-decoration:none; text-decoration:none;
color:#09857e; color:#09857e;

View File

@ -1,147 +1,62 @@
/* CSS Document */ /* CSS Document */
/*----------------MENU-----------------*/ /*----------------MENU-----------------*/
div#menu div{ div#menu {
margin-top: 0px; border-left: 4px solid #8d2d0d;
background: #6699FF; border-bottom: 4px solid #8d2d0d;
padding-left: 4px;
padding-bottom: 4px;
} }
/* permet l'affichage du haut du menu*/
div#menu h2{ div#menu h2{
color: #000000; color: #000000;
FONT-FAMILY: Arial;
FONT-SIZE: 9pt;
text-align:left; text-align:left;
margin: 0; margin: 0;
padding: 3px; padding: 3px;
padding-left: 6px; padding-left: 6px;
background: #1a62db; background: #d44413;
} }
div#menu h3{ div#menu h3{
margin: 0; margin: 0;
padding: 6px; padding: 6px;
background: #6699FF; background: #d44413;
} }
div#menu a{ div#menu a{
color: #000000; color: #000000;
bgcolor=#6699FF; bgcolor=#d44413;
FONT-FAMILY: Arial; FONT-FAMILY: Arial;
FONT-SIZE: 9pt; FONT-SIZE: 9pt;
} }
div#menu li { div#menu li {
position: relative;
list-style:none; list-style:none;
margin:0px; width:160px;
border-bottom: 1px solid #0008ab; border-top: 1px solid #d44413;
}
div#menu li.sousmenu {
background: url(sous_menu.gif) 95% 50% no-repeat;
}
div#menu li:hover {
background: #0008ab;
}
div#menu li.sousmenu:hover {
background: #0008ab;
}
div#menu ul ul {
position: absolute;
top: 0px;
} }
/*TAILLE PREMIERE COLONNE*/
div#menu {
float: center;
width: 200px;
text-align:left;
}
div#menu ul { div#menu ul {
left: 30px;
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 200px;
background: #6699FF;
border: 0px solid;
}
div#menu ul ul {
left: 199px;
display:none;
background: #FFFFFF;
} }
div#menu li a { div#menu li a {
display: block;
padding: 2px 0px 2px 4px; padding: 2px 0px 2px 4px;
text-decoration: none; text-decoration: none;
width: 191px; width:160px;
border-left: 3px solid #6699FF; border-left: 4px solid #8d2d0d;
}
div#menu form {
border-left: 8px solid #6699FF;
background: #6699FF;
FONT-FAMILY: Arial;
margin:0px;
FONT-SIZE: 8pt;
}
div#menu texte {
border-left: 8px solid #6699FF;
FONT-FAMILY: Arial;
FONT-SIZE: 9pt;
font-weight:bold;
border-bottom: 1px solid #6699FF;
} }
/*TAILLE DEUXIEME COLONE*/
div#menu ul.niveau1 ul { div#menu ul.niveau1 ul {
left: 200px; border-left: 20px solid #d44413;
height: 500px;
border: 1px solid #0008ab;
background: #1a62db; background: #1a62db;
/*
overflow:scroll;
overflow-y:auto;
overflow-x:hidden;
*/
} }
div#menu ul.niveau1 li { div#menu ul.niveau1 li {
background: #6699FF; background: #b43a10;
}
div#menu ul.niveau1 li.sousmenu:hover ul.niveau2 {
width:219px;
display:block;
} }
/*TAILLE TROISIEME COLONNE*/
div#menu ul.niveau2 ul {
left: 219px;
height: 500px;
}
div#menu ul.niveau2 li a {
width: 200px;
}
div#menu ul.niveau2 li.sousmenu:hover ul.niveau3 {
width:10em;
display:block;
}
/*TAILLE Quatrieme COLONNE*/
div#menu ul.niveau3 ul {
left: 369px;
height: 500px;
}
div#menu ul.niveau3 li a {
width: 200px;
}
div#menu ul.niveau3 li.sousmenu:hover ul.niveau4 {
width:10em;
display:block;
}
/*TAILLE DEUXIEME COLONE BIS????*/
/*COULEUR DES BORDURES*/
div#menu li a:hover { div#menu li a:hover {
border-left-color: #000ADE; border-left-color: #ff3800;
background: #6699FF;
font-weight:bold; font-weight:bold;
} }

147
theme/menu_dynamic.css Normal file
View File

@ -0,0 +1,147 @@
/* CSS Document */
/*----------------MENU-----------------*/
div#menu div{
margin-top: 0px;
background: #6699FF;
}
/* permet l'affichage du haut du menu*/
div#menu h2{
color: #000000;
FONT-FAMILY: Arial;
FONT-SIZE: 9pt;
text-align:left;
margin: 0;
padding: 3px;
padding-left: 6px;
background: #1a62db;
}
div#menu h3{
margin: 0;
padding: 6px;
background: #6699FF;
}
div#menu a{
color: #000000;
bgcolor=#6699FF;
FONT-FAMILY: Arial;
FONT-SIZE: 9pt;
}
div#menu li {
position: relative;
list-style:none;
margin:0px;
border-bottom: 1px solid #0008ab;
}
div#menu li.sousmenu {
background: url(sous_menu.gif) 95% 50% no-repeat;
}
div#menu li:hover {
background: #0008ab;
}
div#menu li.sousmenu:hover {
background: #0008ab;
}
div#menu ul ul {
position: absolute;
top: 0px;
}
/*TAILLE PREMIERE COLONNE*/
div#menu {
float: center;
width: 200px;
text-align:left;
}
div#menu ul {
margin: 0;
padding: 0;
width: 200px;
background: #6699FF;
border: 0px solid;
}
div#menu ul ul {
left: 199px;
display:none;
background: #FFFFFF;
}
div#menu li a {
display: block;
padding: 2px 0px 2px 4px;
text-decoration: none;
width: 191px;
border-left: 3px solid #6699FF;
}
div#menu form {
border-left: 8px solid #6699FF;
background: #6699FF;
FONT-FAMILY: Arial;
margin:0px;
FONT-SIZE: 8pt;
}
div#menu texte {
border-left: 8px solid #6699FF;
FONT-FAMILY: Arial;
FONT-SIZE: 9pt;
font-weight:bold;
border-bottom: 1px solid #6699FF;
}
/*TAILLE DEUXIEME COLONE*/
div#menu ul.niveau1 ul {
left: 200px;
height: 500px;
border: 1px solid #0008ab;
background: #1a62db;
/*
overflow:scroll;
overflow-y:auto;
overflow-x:hidden;
*/
}
div#menu ul.niveau1 li {
background: #6699FF;
}
div#menu ul.niveau1 li.sousmenu:hover ul.niveau2 {
width:219px;
display:block;
}
/*TAILLE TROISIEME COLONNE*/
div#menu ul.niveau2 ul {
left: 219px;
height: 500px;
}
div#menu ul.niveau2 li a {
width: 200px;
}
div#menu ul.niveau2 li.sousmenu:hover ul.niveau3 {
width:10em;
display:block;
}
/*TAILLE Quatrieme COLONNE*/
div#menu ul.niveau3 ul {
left: 369px;
height: 500px;
}
div#menu ul.niveau3 li a {
width: 200px;
}
div#menu ul.niveau3 li.sousmenu:hover ul.niveau4 {
width:10em;
display:block;
}
/*TAILLE DEUXIEME COLONE BIS????*/
/*COULEUR DES BORDURES*/
div#menu li a:hover {
border-left-color: #000ADE;
background: #6699FF;
font-weight:bold;
}