|
Packit Service |
99d1c0 |
'''
|
|
Packit Service |
99d1c0 |
Copyright 2011 by the Massachusetts
|
|
Packit Service |
99d1c0 |
Institute of Technology. All Rights Reserved.
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
Export of this software from the United States of America may
|
|
Packit Service |
99d1c0 |
require a specific license from the United States Government.
|
|
Packit Service |
99d1c0 |
It is the responsibility of any person or organization contemplating
|
|
Packit Service |
99d1c0 |
export to obtain such a license before exporting.
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
|
|
Packit Service |
99d1c0 |
distribute this software and its documentation for any purpose and
|
|
Packit Service |
99d1c0 |
without fee is hereby granted, provided that the above copyright
|
|
Packit Service |
99d1c0 |
notice appear in all copies and that both that copyright notice and
|
|
Packit Service |
99d1c0 |
this permission notice appear in supporting documentation, and that
|
|
Packit Service |
99d1c0 |
the name of M.I.T. not be used in advertising or publicity pertaining
|
|
Packit Service |
99d1c0 |
to distribution of the software without specific, written prior
|
|
Packit Service |
99d1c0 |
permission. Furthermore if you modify this software you must label
|
|
Packit Service |
99d1c0 |
your software as modified software and not distribute it in such a
|
|
Packit Service |
99d1c0 |
fashion that it might be confused with the original M.I.T. software.
|
|
Packit Service |
99d1c0 |
M.I.T. makes no representations about the suitability of
|
|
Packit Service |
99d1c0 |
this software for any purpose. It is provided "as is" without express
|
|
Packit Service |
99d1c0 |
or implied warranty.
|
|
Packit Service |
99d1c0 |
'''
|
|
Packit Service |
99d1c0 |
import sys
|
|
Packit Service |
99d1c0 |
import re
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
from collections import defaultdict
|
|
Packit Service |
99d1c0 |
from xml.sax import make_parser
|
|
Packit Service |
99d1c0 |
from xml.sax.handler import ContentHandler
|
|
Packit Service |
99d1c0 |
from docmodel import *
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
exclude_funcs = ['krb5_free_octet_data']
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
class DocNode(object):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
Represents the structure of xml node.
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
def __init__(self, name):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
@param node: name - the name of a node.
|
|
Packit Service |
99d1c0 |
@param attributes: a dictionary populated with attributes of a node
|
|
Packit Service |
99d1c0 |
@param children: a dictionary with lists of children nodes. Nodes
|
|
Packit Service |
99d1c0 |
in lists are ordered as they appear in a document.
|
|
Packit Service |
99d1c0 |
@param content: a content of xml node represented as a list of
|
|
Packit Service |
99d1c0 |
tuples [(type,value)] with type = ['char'|'element'].
|
|
Packit Service |
99d1c0 |
If type is 'char' then the value is a character string otherwise
|
|
Packit Service |
99d1c0 |
it is a reference to a child node.
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
self.name = name
|
|
Packit Service |
99d1c0 |
self.content = list()
|
|
Packit Service |
99d1c0 |
self.attributes = dict()
|
|
Packit Service |
99d1c0 |
self.children = defaultdict(list)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def walk(self, decorators, sub_ws, stack=[]):
|
|
Packit Service |
99d1c0 |
result = list()
|
|
Packit Service |
99d1c0 |
decorator = decorators.get(self.name, decorators['default'])
|
|
Packit Service |
99d1c0 |
stack.append(decorators['default'])
|
|
Packit Service |
99d1c0 |
decorators['default'] = decorator
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
for (obj_type,obj) in self.content:
|
|
Packit Service |
99d1c0 |
if obj_type == 'char':
|
|
Packit Service |
99d1c0 |
if obj != '':
|
|
Packit Service |
99d1c0 |
result.append(obj)
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
partial = obj.walk(decorators,1, stack)
|
|
Packit Service |
99d1c0 |
if partial is not None:
|
|
Packit Service |
99d1c0 |
result.append(' %s ' % partial)
|
|
Packit Service |
99d1c0 |
decorators['default'] = stack.pop()
|
|
Packit Service |
99d1c0 |
result = decorator(self, ''.join(result))
|
|
Packit Service |
99d1c0 |
if result is not None:
|
|
Packit Service |
99d1c0 |
if sub_ws == 1:
|
|
Packit Service |
99d1c0 |
result = re.sub(r'[ ]+', r' ', result)
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
result = result.strip()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def getContent(self):
|
|
Packit Service |
99d1c0 |
decorators = {'default': lambda node,value: value}
|
|
Packit Service |
99d1c0 |
result = self.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
if len(result) == 0:
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def __repr__(self):
|
|
Packit Service |
99d1c0 |
result = ['Content: %s' % self.content]
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
for (key,value) in self.attributes.iteritems():
|
|
Packit Service |
99d1c0 |
result.append('Attr: %s = %s' % (key,value))
|
|
Packit Service |
99d1c0 |
for (key,value) in self.children.iteritems():
|
|
Packit Service |
99d1c0 |
result.append('Child: %s,%i' % (key,len(value)))
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return '\n'.join(result)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
class DoxyContenHandler(ContentHandler):
|
|
Packit Service |
99d1c0 |
def __init__(self, builder):
|
|
Packit Service |
99d1c0 |
self.builder = builder
|
|
Packit Service |
99d1c0 |
self.counters = defaultdict(int)
|
|
Packit Service |
99d1c0 |
self._nodes = None
|
|
Packit Service |
99d1c0 |
self._current = None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def startDocument(self):
|
|
Packit Service |
99d1c0 |
pass
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def endDocument(self):
|
|
Packit Service |
99d1c0 |
import sys
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def startElement(self, name, attrs):
|
|
Packit Service |
99d1c0 |
if name == self.builder.toplevel:
|
|
Packit Service |
99d1c0 |
self._nodes = []
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if name == 'memberdef':
|
|
Packit Service |
99d1c0 |
kind = attrs.get('kind')
|
|
Packit Service |
99d1c0 |
if kind is None:
|
|
Packit Service |
99d1c0 |
raise ValueError('Kind is not defined')
|
|
Packit Service |
99d1c0 |
self.counters[kind] += 1
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if self._nodes is None:
|
|
Packit Service |
99d1c0 |
return
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
node = DocNode(name)
|
|
Packit Service |
99d1c0 |
for (key,value) in attrs.items():
|
|
Packit Service |
99d1c0 |
node.attributes[key] = value
|
|
Packit Service |
99d1c0 |
if self._current is not None:
|
|
Packit Service |
99d1c0 |
self._current.children[name].append(node)
|
|
Packit Service |
99d1c0 |
self._nodes.append(self._current)
|
|
Packit Service |
99d1c0 |
self._current = node
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def characters(self, content):
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if self._current is not None:
|
|
Packit Service |
99d1c0 |
self._current.content.append(('char',content.strip()))
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def endElement(self, name):
|
|
Packit Service |
99d1c0 |
if name == self.builder.toplevel:
|
|
Packit Service |
99d1c0 |
assert(len(self._nodes) == 0)
|
|
Packit Service |
99d1c0 |
self._nodes = None
|
|
Packit Service |
99d1c0 |
self.builder.document.append(self._current)
|
|
Packit Service |
99d1c0 |
self._current = None
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
if self._nodes is not None:
|
|
Packit Service |
99d1c0 |
node = self._current
|
|
Packit Service |
99d1c0 |
self._current = self._nodes.pop()
|
|
Packit Service |
99d1c0 |
self._current.content.append(('element',node))
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
class XML2AST(object):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
Translates XML document into Abstract Syntax Tree like representation
|
|
Packit Service |
99d1c0 |
The content of document is stored in self.document
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
def __init__(self, xmlpath, toplevel='doxygen'):
|
|
Packit Service |
99d1c0 |
self.document = list()
|
|
Packit Service |
99d1c0 |
self.toplevel = toplevel
|
|
Packit Service |
99d1c0 |
self.parser = make_parser()
|
|
Packit Service |
99d1c0 |
handler = DoxyContenHandler(self)
|
|
Packit Service |
99d1c0 |
self.parser.setContentHandler(handler)
|
|
Packit Service |
99d1c0 |
filename = 'krb5_8hin.xml'
|
|
Packit Service |
99d1c0 |
filepath = '%s/%s' % (xmlpath,filename)
|
|
Packit Service |
99d1c0 |
self.parser.parse(open(filepath,'r'))
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
class DoxyFuncs(XML2AST):
|
|
Packit Service |
99d1c0 |
def __init__(self, path):
|
|
Packit Service |
99d1c0 |
super(DoxyFuncs, self).__init__(path,toplevel='memberdef')
|
|
Packit Service |
99d1c0 |
self.objects = list()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def run(self):
|
|
Packit Service |
99d1c0 |
for node in self.document:
|
|
Packit Service |
99d1c0 |
self.process(node)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def process(self, node):
|
|
Packit Service |
99d1c0 |
node_type = node.attributes['kind']
|
|
Packit Service |
99d1c0 |
if node_type == 'function':
|
|
Packit Service |
99d1c0 |
data = self._process_function_node(node)
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if 'name' in data and data['name'] in exclude_funcs:
|
|
Packit Service |
99d1c0 |
return
|
|
Packit Service |
99d1c0 |
self.objects.append(DocModel(**data))
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def save(self, templates, target_dir):
|
|
Packit Service |
99d1c0 |
for obj in self.objects:
|
|
Packit Service |
99d1c0 |
template_path = templates[obj.category]
|
|
Packit Service |
99d1c0 |
outpath = '%s/%s.rst' % (target_dir,obj.name)
|
|
Packit Service |
99d1c0 |
obj.save(outpath, template_path)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_function_node(self, node):
|
|
Packit Service |
99d1c0 |
f_name = node.children['name'][0].getContent()
|
|
Packit Service |
99d1c0 |
f_Id = node.attributes['id']
|
|
Packit Service |
99d1c0 |
f_ret_type = self._process_type_node(node.children['type'][0])
|
|
Packit Service |
99d1c0 |
f_brief = node.children['briefdescription'][0].getContent()
|
|
Packit Service |
99d1c0 |
f_detailed = node.children['detaileddescription'][0]
|
|
Packit Service |
99d1c0 |
detailed_description = self._process_description_node(f_detailed)
|
|
Packit Service |
99d1c0 |
return_value_description = self._process_return_value_description(f_detailed)
|
|
Packit Service |
99d1c0 |
retval_description = self._process_retval_description(f_detailed)
|
|
Packit Service |
99d1c0 |
warning_description = self._process_warning_description(f_detailed)
|
|
Packit Service |
99d1c0 |
seealso_description = self._process_seealso_description(f_detailed)
|
|
Packit Service |
99d1c0 |
notes_description = self._process_notes_description(f_detailed)
|
|
Packit Service |
99d1c0 |
f_version = self._process_version_description(f_detailed)
|
|
Packit Service |
99d1c0 |
deprecated_description = self._process_deprecated_description(f_detailed)
|
|
Packit Service |
99d1c0 |
param_description_map = self.process_parameter_description(f_detailed)
|
|
Packit Service |
99d1c0 |
f_definition = node.children['definition'][0].getContent()
|
|
Packit Service |
99d1c0 |
f_argsstring = node.children['argsstring'][0].getContent()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
function_descr = {'category': 'function',
|
|
Packit Service |
99d1c0 |
'name': f_name,
|
|
Packit Service |
99d1c0 |
'Id': f_Id,
|
|
Packit Service |
99d1c0 |
'return_type': f_ret_type[1],
|
|
Packit Service |
99d1c0 |
'return_description': return_value_description,
|
|
Packit Service |
99d1c0 |
'retval_description': retval_description,
|
|
Packit Service |
99d1c0 |
'sa_description': seealso_description,
|
|
Packit Service |
99d1c0 |
'warn_description': warning_description,
|
|
Packit Service |
99d1c0 |
'notes_description': notes_description,
|
|
Packit Service |
99d1c0 |
'short_description': f_brief,
|
|
Packit Service |
99d1c0 |
'version_num': f_version,
|
|
Packit Service |
99d1c0 |
'long_description': detailed_description,
|
|
Packit Service |
99d1c0 |
'deprecated_description': deprecated_description,
|
|
Packit Service |
99d1c0 |
'parameters': list()}
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
parameters = function_descr['parameters']
|
|
Packit Service |
99d1c0 |
for (i,p) in enumerate(node.children['param']):
|
|
Packit Service |
99d1c0 |
type_node = p.children['type'][0]
|
|
Packit Service |
99d1c0 |
p_type = self._process_type_node(type_node)
|
|
Packit Service |
99d1c0 |
if p_type[1].find('...') > -1 :
|
|
Packit Service |
99d1c0 |
p_name = ''
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
p_name = None
|
|
Packit Service |
99d1c0 |
p_name_node = p.children.get('declname')
|
|
Packit Service |
99d1c0 |
if p_name_node is not None:
|
|
Packit Service |
99d1c0 |
p_name = p_name_node[0].getContent()
|
|
Packit Service |
99d1c0 |
(p_direction,p_descr) = param_description_map.get(p_name,(None,None))
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
param_descr = {'seqno': i,
|
|
Packit Service |
99d1c0 |
'name': p_name,
|
|
Packit Service |
99d1c0 |
'direction': p_direction,
|
|
Packit Service |
99d1c0 |
'type': p_type[1],
|
|
Packit Service |
99d1c0 |
'typeId': p_type[0],
|
|
Packit Service |
99d1c0 |
'description': p_descr}
|
|
Packit Service |
99d1c0 |
parameters.append(param_descr)
|
|
Packit Service |
99d1c0 |
result = Function(**function_descr)
|
|
Packit Service |
99d1c0 |
print(result, file=self.tmp)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return function_descr
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_type_node(self, type_node):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
Type node has form
|
|
Packit Service |
99d1c0 |
<type>type_string</type>
|
|
Packit Service |
99d1c0 |
for build in types and
|
|
Packit Service |
99d1c0 |
<type>
|
|
Packit Service |
99d1c0 |
<ref refid='reference',kindref='member|compound'>
|
|
Packit Service |
99d1c0 |
'type_name'
|
|
Packit Service |
99d1c0 |
</ref></type>
|
|
Packit Service |
99d1c0 |
postfix (ex. *, **m, etc.)
|
|
Packit Service |
99d1c0 |
</type>
|
|
Packit Service |
99d1c0 |
for user defined types.
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
type_ref_node = type_node.children.get('ref')
|
|
Packit Service |
99d1c0 |
if type_ref_node is not None:
|
|
Packit Service |
99d1c0 |
p_type_id = type_ref_node[0].attributes['refid']
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
p_type_id = None
|
|
Packit Service |
99d1c0 |
p_type = type_node.getContent()
|
|
Packit Service |
99d1c0 |
# remove some macros
|
|
Packit Service |
99d1c0 |
p_type = re.sub('KRB5_ATTR_DEPRECATED', '', p_type)
|
|
Packit Service |
99d1c0 |
p_type = re.sub('KRB5_CALLCONV_C', '', p_type)
|
|
Packit Service |
99d1c0 |
p_type = re.sub('KRB5_CALLCONV_WRONG', '', p_type)
|
|
Packit Service |
99d1c0 |
p_type = re.sub('KRB5_CALLCONV', '', p_type)
|
|
Packit Service |
99d1c0 |
p_type = p_type.strip()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return (p_type_id, p_type)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_description_node(self, node):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
Description node is comprised of <para>...</para> sections
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
result = list()
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
for e in para:
|
|
Packit Service |
99d1c0 |
result.append(str(e.walk(decorators, 1)))
|
|
Packit Service |
99d1c0 |
result.append('\n')
|
|
Packit Service |
99d1c0 |
result = '\n'.join(result)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def return_value_description_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'simplesect':
|
|
Packit Service |
99d1c0 |
if node.attributes['kind'] == 'return':
|
|
Packit Service |
99d1c0 |
cont = set()
|
|
Packit Service |
99d1c0 |
cont = node.getContent()
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def paragraph_content_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'para':
|
|
Packit Service |
99d1c0 |
return value + '\n'
|
|
Packit Service |
99d1c0 |
elif node.name == 'simplesect':
|
|
Packit Service |
99d1c0 |
if node.attributes['kind'] == 'return':
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
elif node.name == 'ref':
|
|
Packit Service |
99d1c0 |
if value.find('()') >= 0:
|
|
Packit Service |
99d1c0 |
# functions
|
|
Packit Service |
99d1c0 |
return ':c:func:' + '`' + value + '`'
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
# macro's
|
|
Packit Service |
99d1c0 |
return ':data:' + '`' + value + '`'
|
|
Packit Service |
99d1c0 |
elif node.name == 'emphasis':
|
|
Packit Service |
99d1c0 |
return '*' + value + '*'
|
|
Packit Service |
99d1c0 |
elif node.name == 'itemizedlist':
|
|
Packit Service |
99d1c0 |
return '\n' + value
|
|
Packit Service |
99d1c0 |
elif node.name == 'listitem':
|
|
Packit Service |
99d1c0 |
return '\n\t - ' + value + '\n'
|
|
Packit Service |
99d1c0 |
elif node.name == 'computeroutput':
|
|
Packit Service |
99d1c0 |
return '**' + value + '**'
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def parameter_name_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'parametername':
|
|
Packit Service |
99d1c0 |
direction = node.attributes.get('direction')
|
|
Packit Service |
99d1c0 |
if direction is not None:
|
|
Packit Service |
99d1c0 |
value = '%s:%s' % (value,direction)
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
elif node.name == 'parameterdescription':
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def parameter_description_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'parameterdescription':
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
elif node.name == 'parametername':
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def process_parameter_description(self, node):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
Parameter descriptions reside inside detailed description section.
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
result = dict()
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for e in para:
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
param_list = e.children.get('parameterlist')
|
|
Packit Service |
99d1c0 |
if param_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
param_items = param_list[0].children.get('parameteritem')
|
|
Packit Service |
99d1c0 |
if param_items is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in param_items:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.parameter_name_decorator}
|
|
Packit Service |
99d1c0 |
direction = None
|
|
Packit Service |
99d1c0 |
name = it.walk(decorators,0).split(':')
|
|
Packit Service |
99d1c0 |
if len(name) == 2:
|
|
Packit Service |
99d1c0 |
direction = name[1]
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.parameter_description_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
description = it.walk(decorators, 0)
|
|
Packit Service |
99d1c0 |
result[name[0]] = (direction,description)
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_return_value_description(self, node):
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
ret = list()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for p in para:
|
|
Packit Service |
99d1c0 |
simplesect_list = p.children.get('simplesect')
|
|
Packit Service |
99d1c0 |
if simplesect_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in simplesect_list:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.return_value_description_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.parameter_name_decorator}
|
|
Packit Service |
99d1c0 |
result = it.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
if result is not None:
|
|
Packit Service |
99d1c0 |
ret.append(result)
|
|
Packit Service |
99d1c0 |
return ret
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_retval_description(self, node):
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
retval descriptions reside inside detailed description section.
|
|
Packit Service |
99d1c0 |
"""
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
ret = list()
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
for e in para:
|
|
Packit Service |
99d1c0 |
param_list = e.children.get('parameterlist')
|
|
Packit Service |
99d1c0 |
if param_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for p in param_list:
|
|
Packit Service |
99d1c0 |
kind = p.attributes['kind']
|
|
Packit Service |
99d1c0 |
if kind == 'retval':
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
param_items = p.children.get('parameteritem')
|
|
Packit Service |
99d1c0 |
if param_items is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
for it in param_items:
|
|
Packit Service |
99d1c0 |
param_descr = it.children.get('parameterdescription')
|
|
Packit Service |
99d1c0 |
if param_descr is not None:
|
|
Packit Service |
99d1c0 |
val = param_descr[0].children.get('para')
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if val is not None:
|
|
Packit Service |
99d1c0 |
val_descr = val[0].getContent()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
val_descr =''
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.parameter_name_decorator}
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
name = it.walk(decorators, 1).split(':')
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
val = name[0]
|
|
Packit Service |
99d1c0 |
result = " %s %s" % (val, val_descr)
|
|
Packit Service |
99d1c0 |
ret.append (result)
|
|
Packit Service |
99d1c0 |
return ret
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def return_warning_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'simplesect':
|
|
Packit Service |
99d1c0 |
if node.attributes['kind'] == 'warning':
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_warning_description(self, node):
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for p in para:
|
|
Packit Service |
99d1c0 |
simplesect_list = p.children.get('simplesect')
|
|
Packit Service |
99d1c0 |
if simplesect_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in simplesect_list:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.return_warning_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
result = it.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
# Assuming that only one Warning per function
|
|
Packit Service |
99d1c0 |
if result is not None:
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def return_seealso_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'simplesect':
|
|
Packit Service |
99d1c0 |
if node.attributes['kind'] == 'see':
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_seealso_description(self, node):
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for p in para:
|
|
Packit Service |
99d1c0 |
simplesect_list = p.children.get('simplesect')
|
|
Packit Service |
99d1c0 |
if simplesect_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in simplesect_list:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.return_seealso_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
result = it.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def return_version_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'simplesect':
|
|
Packit Service |
99d1c0 |
if node.attributes['kind'] == 'version':
|
|
Packit Service |
99d1c0 |
return value
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_version_description(self, node):
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for p in para:
|
|
Packit Service |
99d1c0 |
simplesect_list = p.children.get('simplesect')
|
|
Packit Service |
99d1c0 |
if simplesect_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in simplesect_list:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.return_version_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
result = it.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
if result is not None:
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def return_notes_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'simplesect':
|
|
Packit Service |
99d1c0 |
if node.attributes['kind'] == 'note':
|
|
Packit Service |
99d1c0 |
# We indent notes with an extra tab. Do it for all paragraphs.
|
|
Packit Service |
99d1c0 |
return value.replace("\n ", "\n\n\t ");
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_notes_description(self, node):
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for p in para:
|
|
Packit Service |
99d1c0 |
simplesect_list = p.children.get('simplesect')
|
|
Packit Service |
99d1c0 |
if simplesect_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in simplesect_list:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.return_notes_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
result = it.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
if result is not None:
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def return_deprecated_decorator(self, node, value):
|
|
Packit Service |
99d1c0 |
if node.name == 'xrefsect':
|
|
Packit Service |
99d1c0 |
if node.attributes['id'].find('deprecated_') > -1:
|
|
Packit Service |
99d1c0 |
xreftitle = node.children.get('xreftitle')
|
|
Packit Service |
99d1c0 |
if xreftitle[0] is not None:
|
|
Packit Service |
99d1c0 |
xrefdescr = node.children.get('xrefdescription')
|
|
Packit Service |
99d1c0 |
deprecated_descr = "DEPRECATED %s" % xrefdescr[0].getContent()
|
|
Packit Service |
99d1c0 |
return deprecated_descr
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
return None
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _process_deprecated_description(self, node):
|
|
Packit Service |
99d1c0 |
result = None
|
|
Packit Service |
99d1c0 |
para = node.children.get('para')
|
|
Packit Service |
99d1c0 |
if para is not None:
|
|
Packit Service |
99d1c0 |
for p in para:
|
|
Packit Service |
99d1c0 |
xrefsect_list = p.children.get('xrefsect')
|
|
Packit Service |
99d1c0 |
if xrefsect_list is None:
|
|
Packit Service |
99d1c0 |
continue
|
|
Packit Service |
99d1c0 |
for it in xrefsect_list:
|
|
Packit Service |
99d1c0 |
decorators = {'default': self.return_deprecated_decorator,
|
|
Packit Service |
99d1c0 |
'para': self.paragraph_content_decorator}
|
|
Packit Service |
99d1c0 |
result = it.walk(decorators, 1)
|
|
Packit Service |
99d1c0 |
if result is not None:
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def break_into_lines(self, value, linelen=82):
|
|
Packit Service |
99d1c0 |
breaks = range(0,len(value),linelen) + [len(value)]
|
|
Packit Service |
99d1c0 |
result = list()
|
|
Packit Service |
99d1c0 |
for (start,end) in zip(breaks[:-1],breaks[1:]):
|
|
Packit Service |
99d1c0 |
result.append(value[start:end])
|
|
Packit Service |
99d1c0 |
result = '\n'.join(result)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
return result
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def _save(self, table, path = None):
|
|
Packit Service |
99d1c0 |
if path is None:
|
|
Packit Service |
99d1c0 |
f = sys.stdout
|
|
Packit Service |
99d1c0 |
else:
|
|
Packit Service |
99d1c0 |
f = open(path, 'w')
|
|
Packit Service |
99d1c0 |
for l in table:
|
|
Packit Service |
99d1c0 |
f.write('%s\n' % ','.join(l))
|
|
Packit Service |
99d1c0 |
if path is not None:
|
|
Packit Service |
99d1c0 |
f.close()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
class DoxyBuilderFuncs(DoxyFuncs):
|
|
Packit Service |
99d1c0 |
def __init__(self, xmlpath, rstpath):
|
|
Packit Service |
99d1c0 |
super(DoxyBuilderFuncs,self).__init__(xmlpath)
|
|
Packit Service |
99d1c0 |
self.target_dir = rstpath
|
|
Packit Service |
99d1c0 |
outfile = '%s/%s' % (self.target_dir, 'out.txt')
|
|
Packit Service |
99d1c0 |
self.tmp = open(outfile, 'w')
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def run_all(self):
|
|
Packit Service |
99d1c0 |
self.run()
|
|
Packit Service |
99d1c0 |
templates = {'function': 'func_document.tmpl'}
|
|
Packit Service |
99d1c0 |
self.save(templates, self.target_dir)
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
def test_run(self):
|
|
Packit Service |
99d1c0 |
self.run()
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if __name__ == '__main__':
|
|
Packit Service |
99d1c0 |
builder = DoxyBuilderFuncs(xmlpath, rstpath)
|
|
Packit Service |
99d1c0 |
builder.run_all()
|
|
Packit Service |
99d1c0 |
|