import re
import html
from enum import Enum
def CleanUpText (text):
if text == None:
return ''
invalidChars = ['\r', '\n', '\t']
for invalidChar in invalidChars:
text = text.replace (invalidChar, ' ')
text = html.escape (text)
return text
def GenerateLink (entityName, entityLink):
target = '_blank' if entityLink.startswith ('http') else '_self'
return '{0}'.format (entityName, entityLink, target)
def FinalizeType (text, entityLinks):
text = CleanUpText (text)
arrayMatch = re.match ('Array\.<(.+)>', text)
if arrayMatch != None:
matchedName = arrayMatch.group (1)
if matchedName in entityLinks:
return GenerateLink (matchedName, entityLinks[matchedName]) + '[]'
else:
return arrayMatch.group (1) + '[]'
if text in entityLinks:
return GenerateLink (text, entityLinks[text])
return text
def ReplaceLinksInText (text, entityLinks):
links = re.findall ('{@link ([^{}]+)}', text)
for link in links:
if link in entityLinks:
text = text.replace ('{@link ' + link + '}', GenerateLink (link, entityLinks[link]))
else:
text = text.replace ('{@link ' + link + '}', link)
return text
def FinalizeDescription (text, entityLinks):
text = CleanUpText (text)
return ReplaceLinksInText (text, entityLinks)
def GenerateParameterTypesHtml (paramTypes, generator, entityLinks):
for i in range (0, len (paramTypes)):
paramType = paramTypes[i]
paramTypeHtml = FinalizeType (paramType, entityLinks)
generator.AddTagWithClass ('span', 'type parameter_type', paramTypeHtml)
if (i < len (paramTypes) - 1):
generator.AddTagWithClass ('span', 'parameter_type_separator', '|')
def GenerateParameterListHtml (parameters, generator, entityLinks):
for param in parameters:
generator.BeginTagWithClass ('div', 'parameter_header')
generator.AddTagWithClass ('span', 'parameter_name', param.name)
GenerateParameterTypesHtml (param.types, generator, entityLinks)
if param.isOptional:
generator.AddTagWithClass ('span', 'parameter_attributes', '(optional)')
generator.EndTag ('div')
generator.BeginTagWithClass ('div', 'parameter_main')
generator.AddTagWithClass ('div', 'parameter_description', FinalizeDescription (param.description, entityLinks))
if len (param.subParameters) > 0:
GenerateParameterListHtml (param.subParameters, generator, entityLinks)
generator.EndTag ('div')
class FunctionType (Enum):
Constructor = 1
ClassMethod = 2
Standalone = 3
def GenerateFunctionHtml (function, generator, entityLinks, type):
paramNames = map (lambda x : x.name, function.parameters)
functionSignature = function.name + ' (' + ', '.join (paramNames) + ')'
if type == FunctionType.Constructor:
functionSignature = 'new ' + functionSignature
generator.BeginTagWithClass ('div', 'function_container')
generator.AddTagWithAttributes ('div', [('id', function.name), ('class', 'function_signature')], functionSignature)
if function.description != None:
generator.AddTagWithClass ('div', 'function_title', 'Description')
generator.AddTagWithClass ('div', 'function_description', FinalizeDescription (function.description, entityLinks))
if function.parameters != None and len (function.parameters) > 0:
generator.AddTagWithClass ('div', 'function_title', 'Parameters')
GenerateParameterListHtml (function.parameters, generator, entityLinks)
if function.returns != None:
generator.AddTagWithClass ('div', 'function_title', 'Returns')
generator.BeginTagWithClass ('div', 'function_returns')
if function.returns.types != None:
GenerateParameterTypesHtml (function.returns.types, generator, entityLinks)
if function.returns.description != None:
generator.AddTagWithClass ('span', 'return_description', FinalizeDescription (function.returns.description, entityLinks))
generator.EndTag ('div')
generator.EndTag ('div')