Blame doc/tools/doxybuilder_funcs.py

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