def docu(self):
    classes = []
    docstring = ''
    head = ''
    attributes = ''
    methods = ''
    attributesList = []
    methodsList = []
    head += ('<div id="class-%s"></div>\n\n' % self.__class__.__name__.lower())
    head += ('# _class_ %s()\n\n' % self.__class__.__name__)
    head += self.linkDocuText(inspect.getdoc(self))
    head += '\n\n'
    additionalDocu = self.additionalDocu()
    if additionalDocu:
        head += (additionalDocu + '\n\n')
    attributes += '## Attributes\n\n'
    for key in sorted(self._structure.keys()):
        attributesList.append(key)
        attributes += ('<div id="class-%s-attribute-%s"></div>\n\n' % (self.__class__.__name__.lower(), key))
        attributes += ('### %s\n\n' % key)
        if self._structure[key][3]:
            attributes += (self.linkDocuText(self._structure[key][3]) + '\n\n')
        attributes += (('__Required:__ %s' % self._structure[key][1]) + '<br />\n')
        attributes += (('__Type:__ %s' % self.typeDescription(self._structure[key][0])) + '<br />\n')
        hint = self._structure[key][0]().formatHint()
        if hint:
            attributes += (('__Format:__ %s' % hint) + '<br />\n')
        if (self._structure[key][2] is not None):
            attributes += (('__Default value:__ %s' % self._structure[key][2]) + '\n\n')
        example = self._structure[key][0]().exampleData()
        if example:
            attributes += 'Example:\n'
            attributes += '```json\n'
            attributes += json.dumps(example, indent=4)
            attributes += '\n```\n'
    method_list = [func for func in dir(self) if (callable(getattr(self, func)) and (not func.startswith('__')) and inspect.getdoc(getattr(self, func)))]
    if method_list:
        methods += '## Methods\n\n'
        for methodName in method_list:
            methodsList.append(methodName)
            methods += ('<div id="class-%s-method-%s"></div>\n\n' % (self.__class__.__name__.lower(), methodName.lower()))
            args = inspect.getfullargspec(getattr(self, methodName))
            if (args.args != ['self']):
                argList = []
                if (args.args and args.defaults):
                    startPoint = (len(args.args) - len(args.defaults))
                    for (i, defaultValue) in enumerate(args.defaults):
                        argList.append(('%s = %s' % (args.args[(i + startPoint)], defaultValue)))
                methods += ('#### %s(%s)\n\n' % (methodName, ', '.join(argList)))
            else:
                methods += ('#### %s()\n\n' % methodName)
            methods += (self.linkDocuText(inspect.getdoc(getattr(self, methodName))) + '\n\n')
    docstring += head
    if attributesList:
        docstring += '### Attributes\n\n'
        for attribute in attributesList:
            docstring += ('[%s](#class-%s-attribute-%s)<br />' % (attribute, self.__class__.__name__.lower(), attribute.lower()))
        docstring += '\n\n'
    if methodsList:
        docstring += '### Methods\n\n'
        for methodName in methodsList:
            docstring += ('[%s()](#class-%s-method-%s)<br />' % (methodName, self.__class__.__name__.lower(), methodName.lower()))
        docstring += '\n\n'
    if attributesList:
        docstring += attributes
        docstring += '\n\n'
    if methodsList:
        docstring += methods
        docstring += '\n\n'
    classes.append([self.__class__.__name__, docstring])
    for key in list(self._structure.keys()):
        if issubclass(self._structure[key][0], Proxy):
            o = self._structure[key][0].dataType()
            classes.extend(o.docu())
        if issubclass(self._structure[key][0], ListProxy):
            o = self._structure[key][0].dataType.dataType()
            if hasattr(o, 'docu'):
                classes.extend(o.docu())
    return classes
def docu(self):
    classes = []
    docstring = 
    head = 
    attributes = 
    methods = 
    attributesList = []
    methodsList = []
    head += ('<div id="class-%s"></div>\n\n' % self.__class__.__name__.lower())
    head += ('# _class_ %s()\n\n' % self.__class__.__name__)
    head += self.linkDocuText(inspect.getdoc(self))
    head += '\n\n'
    additionalDocu = self.additionalDocu()
    if additionalDocu:
        head += (additionalDocu + '\n\n')
    attributes += '## Attributes\n\n'
    for key in sorted(self._structure.keys()):
        attributesList.append(key)
        attributes += ('<div id="class-%s-attribute-%s"></div>\n\n' % (self.__class__.__name__.lower(), key))
        attributes += ('### %s\n\n' % key)
        if self._structure[key][3]:
            attributes += (self.linkDocuText(self._structure[key][3]) + '\n\n')
        attributes += (('__Required:__ %s' % self._structure[key][1]) + '<br />\n')
        attributes += (('__Type:__ %s' % self.typeDescription(self._structure[key][0])) + '<br />\n')
        hint = self._structure[key][0]().formatHint()
        if hint:
            attributes += (('__Format:__ %s' % hint) + '<br />\n')
        if (self._structure[key][2] is not None):
            attributes += (('__Default value:__ %s' % self._structure[key][2]) + '\n\n')
        example = self._structure[key][0]().exampleData()
        if example:
            attributes += 'Example:\n'
            attributes += '```json\n'
            attributes += json.dumps(example, indent=4)
            attributes += '\n```\n'
    method_list = [func for func in dir(self) if (callable(getattr(self, func)) and (not func.startswith('__')) and inspect.getdoc(getattr(self, func)))]
    if method_list:
        methods += '## Methods\n\n'
        for methodName in method_list:
            methodsList.append(methodName)
            methods += ('<div id="class-%s-method-%s"></div>\n\n' % (self.__class__.__name__.lower(), methodName.lower()))
            args = inspect.getfullargspec(getattr(self, methodName))
            if (args.args != ['self']):
                argList = []
                if (args.args and args.defaults):
                    startPoint = (len(args.args) - len(args.defaults))
                    for (i, defaultValue) in enumerate(args.defaults):
                        argList.append(('%s = %s' % (args.args[(i + startPoint)], defaultValue)))
                methods += ('#### %s(%s)\n\n' % (methodName, ', '.join(argList)))
            else:
                methods += ('#### %s()\n\n' % methodName)
            methods += (self.linkDocuText(inspect.getdoc(getattr(self, methodName))) + '\n\n')
    docstring += head
    if attributesList:
        docstring += '### Attributes\n\n'
        for attribute in attributesList:
            docstring += ('[%s](#class-%s-attribute-%s)<br />' % (attribute, self.__class__.__name__.lower(), attribute.lower()))
        docstring += '\n\n'
    if methodsList:
        docstring += '### Methods\n\n'
        for methodName in methodsList:
            docstring += ('[%s()](#class-%s-method-%s)<br />' % (methodName, self.__class__.__name__.lower(), methodName.lower()))
        docstring += '\n\n'
    if attributesList:
        docstring += attributes
        docstring += '\n\n'
    if methodsList:
        docstring += methods
        docstring += '\n\n'
    classes.append([self.__class__.__name__, docstring])
    for key in list(self._structure.keys()):
        if issubclass(self._structure[key][0], Proxy):
            o = self._structure[key][0].dataType()
            classes.extend(o.docu())
        if issubclass(self._structure[key][0], ListProxy):
            o = self._structure[key][0].dataType.dataType()
            if hasattr(o, 'docu'):
                classes.extend(o.docu())
    return classes