예제 #1
0
def readMetadata(metaplugin, plugins_local):

    metafile = metaplugin + '/plugin.yaml'
    plg_dict = {}
    plugin_yaml = {}
    if metaplugin in plugins_local:  # pluginsyaml_local
        if os.path.isfile(metafile):
            plugin_yaml = shyaml.yaml_load(metafile, ordered=True)
    else:
        print("There is no plugin named '" + metaplugin + "'")
        print()
        return None
    return plugin_yaml
def write_configfile(plg, configfile_dir, language='de'):
    """
    Create a .rst file with configuration information for the passed plugin
    """
    plgname = plg['name']

    # ---------------------------------
    # read metadata for plugin
    # ---------------------------------
    metafile = plgname + '/plugin.yaml'
    if os.path.isfile(metafile):
        meta_yaml = shyaml.yaml_load(metafile)
        plugin_yaml = meta_yaml.get('plugin', {})
        parameter_yaml = meta_yaml.get('parameters', {})
        iattributes_yaml = meta_yaml.get('item_attributes', {})
        if parameter_yaml is None:
            parameter_yaml = {}
        if iattributes_yaml is None:
            iattributes_yaml = {}
    else:
        plugin_yaml = {}
        parameter_yaml = {}
        iattributes_yaml = {}

    # ---------------------------------
    # Create rST file
    # ---------------------------------
    outf_name = os.path.join(configfile_dir, plgname + '.rst')
    fh = open(outf_name, "w")
    write_heading(fh, 'Plugin ' + plgname, 1)

    # --------------------------------------------
    # write image for plugin-type and generic text
    # --------------------------------------------
    plgtype = plugin_yaml.get('type', '').lower()
    if plgtype != '':
        fh.write('.. image:: /_static/img/' + plgtype + '.svg\n')
        fh.write('   :width: 70px\n')
        fh.write('   :height: 70px\n')
        fh.write('   :scale: 50 %\n')
        fh.write('   :alt: protocol plugin\n')
        fh.write('   :align: left\n')
        fh.write('\n')
        fh.write('.. |br| raw:: html\n')
        fh.write('\n')
        fh.write('   <br />\n')
        fh.write('\n')

    fh.write(
        'Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die Beschreibung, wie das Plugin **'
        + plgname +
        '** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n'
    )
    fh.write('\n')
    fh.write('\n')

    write_heading(fh, 'Beschreibung', 2)
    write_formatted(fh, get_doc_description(plugin_yaml, language))

    # ---------------------------------
    # write Requirements section
    # ---------------------------------
    requirements = get_description(plugin_yaml, 768, language, 'requirements')
    min_version = str(plugin_yaml.get('sh_minversion', ''))
    max_version = str(plugin_yaml.get('sh_maxversion', ''))
    if requirements[0] != '' or min_version != '' or max_version != '':
        write_heading(fh, 'Anforderungen', 2)
        fh.write('\n')
        write_formatted(
            fh, get_doc_description(plugin_yaml, language, 'requirements'))
        if min_version != '':
            fh.write(' - Minimum SmartHomeNG Version: **' + min_version +
                     '**\n')
        if max_version != '':
            fh.write(' - Maximum SmartHomeNG Version: **' + max_version +
                     '**\n')

    # ---------------------------------
    # write supported hardware section
    # ---------------------------------
    hardware = get_description(plugin_yaml, 768, language, 'hardware')
    if hardware[0] != '':
        write_heading(fh, 'Unterstützte Hardware', 2)
        fh.write('\n')
        write_formatted(fh,
                        get_doc_description(plugin_yaml, language, 'hardware'))

    # ---------------------------------
    # write Konfiguration section
    # ---------------------------------
    write_heading(fh, 'Konfiguration', 2)
    fh.write('\n')
    fh.write(
        'Im folgenden ist beschrieben, wie das Plugin **' + plgname +
        '** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n'
    )
    fh.write('\n')

    # ---------------------------------
    # write Parameter section
    # ---------------------------------
    write_heading(fh, 'Parameter', 2)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende Parameter, die in der Datei **../etc/plugin.yaml** konfiguriert werden:\n'
    )
    fh.write('\n')

    if len(parameter_yaml) == 0:
        fh.write(
            '**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n'
        )
    for p in sorted(parameter_yaml):
        # ---------------------------------
        # write info for one parameter
        # ---------------------------------
        write_heading(fh, p, 3)
        fh.write('\n')
        #        desc = get_description(parameter_yaml[p], 768, language)
        #        fh.write(desc[0]+'\n')
        #       fh.write('\n')
        write_formatted(fh, get_doc_description(parameter_yaml[p], language))
        datatype = parameter_yaml[p].get('type', '').lower()
        default = str(parameter_yaml[p].get('default', ''))
        validlist = parameter_yaml[p].get('valid_list', [])
        fh.write(' - Datentyp: **' + datatype + '**\n')
        if default != '':
            fh.write(' - Standardwert: **' + default + '**\n')
        fh.write('\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for v in validlist:
                fh.write('   - **' + str(v) + '**\n')
            fh.write('\n')

    # ---------------------------------
    # write item_attribute section
    # ---------------------------------
    write_heading(fh, 'Item Attribute', 2)
    fh.write('\n')
    fh.write(
        'Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis  **../items** verwendet werden:\n'
    )
    fh.write('\n')

    if len(iattributes_yaml) == 0:
        fh.write(
            '**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n'
        )
    for a in sorted(iattributes_yaml):
        # ---------------------------------
        # write info for one attribute
        # ---------------------------------
        write_heading(fh, a, 3)
        fh.write('\n')
        #        desc = get_description(iattributes_yaml[a], 768, language)
        #        fh.write(desc[0]+'\n')
        #        fh.write('\n')
        write_formatted(fh, get_doc_description(iattributes_yaml[a], language))
        datatype = iattributes_yaml[a].get('type', '').lower()
        default = str(iattributes_yaml[a].get('default', ''))
        validlist = iattributes_yaml[a].get('valid_list', [])
        fh.write(' - Datentyp: **' + datatype + '**\n')
        if default != '':
            fh.write(' - Standardwert: **' + default + '**\n')
        fh.write('\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for v in validlist:
                fh.write('   - **' + str(v) + '**\n')
            fh.write('\n')

    fh.write('\n')
    fh.write(
        '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/'
        + plgname + '/README>` des Plugins zugreifen.\n')

    fh.close()
    return
def build_pluginlist(plugin_type='all'):
    """
    Return a list of dicts with a dict for each plugin of the requested type
    The dict contains the plugin name, type and description
    """
    result = []
    plugin_type = plugin_type.lower()
    for metaplugin in plugins_git:
        metafile = metaplugin + '/plugin.yaml'
        plg_dict = {}
        if metaplugin in plugins_git:  #pluginsyaml_git
            if os.path.isfile(metafile):
                plugin_yaml = shyaml.yaml_load(metafile)
            else:
                plugin_yaml = ''
            if plugin_yaml != '':
                section_dict = plugin_yaml.get('plugin')
                if section_dict != None:
                    if section_dict.get('type') != None:
                        if section_dict.get('type').lower() in plugin_types:
                            plgtype = section_dict.get('type').lower()
                            plg_dict['name'] = metaplugin.lower()
                            plg_dict['type'] = plgtype
                            plg_dict['desc'] = get_description(
                                section_dict, 85, language)
                            plg_dict['maint'] = get_maintainer(
                                section_dict, 15)
                            plg_dict['test'] = get_tester(section_dict, 15)
                            plg_dict['doc'] = html_escape(
                                section_dict.get('documentation', ''))
                            plg_dict['sup'] = html_escape(
                                section_dict.get('support', ''))
                        else:
                            plgtype = type_unclassified
                    else:
                        plgtype = type_unclassified
                        if plugin_type == type_unclassified:
                            print(
                                "not found: plugin type '{}' defined in plugin '{}'"
                                .format(section_dict.get('type'), metaplugin))
                else:
                    plgtype = type_unclassified

                if (plgtype == type_unclassified) and (plugin_yaml != ''):
                    plg_dict['name'] = metaplugin.lower()
                    plg_dict['type'] = type_unclassified
                    plg_dict['desc'] = get_description(section_dict, 85,
                                                       language)
                    plg_dict['maint'] = get_maintainer(section_dict, 15)
                    plg_dict['test'] = get_tester(section_dict, 15)
                    plg_dict['doc'] = html_escape(
                        section_dict.get('documentation', ''))
                    plg_dict['sup'] = html_escape(
                        section_dict.get('support', ''))
                    print("unclassified: metafile = {}, plg_dict = {}".format(
                        metafile, str(plg_dict)))

                plg_dict['desc'].append('')
            else:
                plgtype = type_unclassified
                plg_dict['name'] = metaplugin.lower()
                plg_dict['type'] = type_unclassified
                plg_dict['desc'] = [
                    'No metadata (plugin.yaml) was provided for this plugin!'
                ]
                plg_dict['maint'] = ['']
                plg_dict['test'] = ['']
                plg_dict['doc'] = ''
                plg_dict['sup'] = ''

            # Adjust list lengths
            maxlen = max(len(plg_dict['desc']), len(plg_dict['maint']),
                         len(plg_dict['test']))
            while len(plg_dict['desc']) < maxlen:
                plg_dict['desc'].append('')
            while len(plg_dict['maint']) < maxlen:
                plg_dict['maint'].append('')
            while len(plg_dict['test']) < maxlen:
                plg_dict['test'].append('')

        if (plgtype == plugin_type) or (plugin_type == 'all'):
            #            result.append(metaplugin)
            result.append(plg_dict)
    return result
예제 #4
0
def write_configfile(plg, configfile_dir, language='de'):
    """
    Create a .rst file with configuration information for the passed plugin
    """
    plgname = plg['name']

    # ---------------------------------
    # read metadata for plugin
    # ---------------------------------
    metafile = plgname + '/plugin.yaml'
    if os.path.isfile(metafile):
        meta_yaml = shyaml.yaml_load(metafile, ordered=True)
        plugin_yaml = meta_yaml.get('plugin', {})
        parameter_yaml = meta_yaml.get('parameters', {})
        iattributes_yaml = meta_yaml.get('item_attributes', {})
        lparameter_yaml = meta_yaml.get('logic_parameter', {})
        functions_yaml = meta_yaml.get('plugin_functions', {})

        no_parameters = (parameter_yaml == 'NONE')
        if no_parameters or parameter_yaml is None:
            parameter_yaml = {}

        no_attributes = (iattributes_yaml == 'NONE')
        if no_attributes or iattributes_yaml is None:
            iattributes_yaml = {}

        no_lparameters = (lparameter_yaml == 'NONE')
        if no_lparameters or lparameter_yaml is None:
            lparameter_yaml = {}

        no_functions = (functions_yaml == 'NONE')
        if no_functions or functions_yaml is None:
            functions_yaml = {}
    else:
        plugin_yaml = {}
        no_parameters = False
        parameter_yaml = {}
        no_attributes = False
        iattributes_yaml = {}
        no_functions = False
        functions_yaml = {}

    # ---------------------------------
    # Create rST file
    # ---------------------------------
    outf_name = os.path.join(configfile_dir, plgname + '.rst')
    fh = open(outf_name, "w")
    fh.write('.. |_| unicode:: 0xA0\n')
    fh.write('\n')

    write_heading(fh, 'Plugin ' + plgname, 1)

    # --------------------------------------------
    # write image for plugin-type and generic text
    # --------------------------------------------
    plgtype = plugin_yaml.get('type', '').lower()
    if plgtype != '':
        fh.write('.. image:: /_static/img/' + plgtype + '.svg\n')
        fh.write('   :width: 70px\n')
        fh.write('   :height: 70px\n')
        fh.write('   :scale: 50 %\n')
        fh.write('   :alt: protocol plugin\n')
        fh.write('   :align: left\n')
        fh.write('\n')
        fh.write('.. |br| raw:: html\n')
        fh.write('\n')
        fh.write('   <br />\n')
        fh.write('\n')

    fh.write(
        'Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die Beschreibung, wie das Plugin '
        + bold(plgname) +
        ' konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n'
    )
    fh.write('\n')
    fh.write('\n')

    write_heading(fh, 'Beschreibung', 2)
    write_formatted(fh, get_doc_description(plugin_yaml, language))

    # ---------------------------------
    # write Requirements section
    # ---------------------------------
    requirements = get_description(plugin_yaml, 768, language, 'requirements')
    min_version = str(plugin_yaml.get('sh_minversion', ''))
    max_version = str(plugin_yaml.get('sh_maxversion', ''))
    if requirements[0] != '' or min_version != '' or max_version != '':
        write_heading(fh, 'Anforderungen', 2)
        fh.write('\n')
        write_formatted(
            fh, get_doc_description(plugin_yaml, language, 'requirements'))
        if min_version != '':
            fh.write(' - Minimum SmartHomeNG Version: ' + bold(min_version) +
                     '\n')
        if max_version != '':
            fh.write(' - Maximum SmartHomeNG Version: ' + bold(max_version) +
                     '\n')

    # ---------------------------------
    # write supported hardware section
    # ---------------------------------
    hardware = get_description(plugin_yaml, 768, language, 'hardware')
    if hardware[0] != '':
        write_heading(fh, 'Unterstützte Hardware', 2)
        fh.write('\n')
        write_formatted(fh,
                        get_doc_description(plugin_yaml, language, 'hardware'))

    # ---------------------------------
    # write Konfiguration section
    # ---------------------------------
    write_heading(fh, 'Konfiguration', 2)
    fh.write('\n')
    fh.write(
        'Im folgenden ist beschrieben, wie das Plugin ' + bold(plgname) +
        ' konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n'
    )
    fh.write('\n')

    # ---------------------------------
    # write Parameter section
    # ---------------------------------
    write_heading(fh, 'Parameter', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/plugin.yaml`` konfiguriert werden:\n'
    )
    fh.write('\n')

    if len(parameter_yaml) == 0:
        if no_parameters:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for p in sorted(parameter_yaml):
        # ---------------------------------
        # write info for one parameter
        # ---------------------------------
        write_heading(fh, p, 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(parameter_yaml[p], language))
        datatype = parameter_yaml[p].get('type', '').lower()
        default = str(parameter_yaml[p].get('default', ''))
        validlist = parameter_yaml[p].get('valid_list', [])
        validmin = parameter_yaml[p].get('valid_min', '')
        validmax = parameter_yaml[p].get('valid_max', '')
        fh.write(' - Datentyp: ' + bold(datatype) + '\n')
        if default != '':
            fh.write(' - Standardwert: ' + bold(default) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(parameter_yaml[p],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

    # ---------------------------------
    # write item_attribute section
    # ---------------------------------
    write_heading(fh, 'Item Attribute', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis  ``../items`` verwendet werden:\n'
    )
    fh.write('\n')

    if len(iattributes_yaml) == 0:
        if no_attributes:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Item Attribute in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for a in sorted(iattributes_yaml):
        # ---------------------------------
        # write info for one attribute
        # ---------------------------------
        write_heading(fh, a, 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(iattributes_yaml[a], language))
        datatype = iattributes_yaml[a].get('type', '').lower()
        default = str(iattributes_yaml[a].get('default', ''))
        validlist = iattributes_yaml[a].get('valid_list', [])
        validmin = iattributes_yaml[a].get('valid_min', '')
        validmax = iattributes_yaml[a].get('valid_max', '')
        fh.write(' - Datentyp: ' + bold(datatype) + '\n')
        if default != '':
            fh.write(' - Standardwert: ' + bold(default) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(iattributes_yaml[a],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

    # ---------------------------------
    # write logic_parameter section
    # ---------------------------------
    write_heading(fh, 'Logik Parameter', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/logic.yaml`` konfiguriert werden:\n'
    )
    fh.write('\n')

    if len(lparameter_yaml) == 0:
        if no_lparameters:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Logik Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for l in sorted(lparameter_yaml):
        # ---------------------------------
        # write info for one attribute
        # ---------------------------------
        write_heading(fh, l, 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(lparameter_yaml[l], language))
        datatype = lparameter_yaml[l].get('type', '').lower()
        default = str(lparameter_yaml[l].get('default', ''))
        validlist = lparameter_yaml[l].get('valid_list', [])
        validmin = lparameter_yaml[l].get('valid_min', '')
        validmax = lparameter_yaml[l].get('valid_max', '')
        fh.write(' - Datentyp: ' + bold(datatype) + '\n')
        if default != '':
            fh.write(' - Standardwert: ' + bold(default) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(lparameter_yaml[l],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

    # ---------------------------------
    # write plugin-function section
    # ---------------------------------
    write_heading(fh, 'Plugin Functions', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende öffentliche Funktionen, die z.B. in Logiken aufgerufen werden können.\n'
    )
    fh.write('\n')

    if len(functions_yaml) == 0:
        if no_functions:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Funktionen in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for f in sorted(functions_yaml):
        # ---------------------------------
        # write info for one function
        # ---------------------------------
        fp = ''
        func_param_yaml = functions_yaml[f].get('parameters', None)
        if func_param_yaml != None:
            for par in func_param_yaml:
                if fp != '':
                    fp += ', '
                fp += par
                if func_param_yaml[par].get('default', None) != None:
                    default = str(func_param_yaml[par].get('default', None))
                    if func_param_yaml[par].get('type', 'foo') == 'str':
                        default = " '" + default + "'"
                    fp += '=' + default

        write_heading(fh, f + '(' + fp + ')', 2)
        fh.write('\n')
        #        desc = get_description(parameter_yaml[f], 768, language)
        #        fh.write(desc[0]+'\n')
        #       fh.write('\n')
        write_formatted(fh, get_doc_description(functions_yaml[f], language))
        datatype = functions_yaml[f].get('type', '').lower()
        default = str(functions_yaml[f].get('default', ''))
        validlist = functions_yaml[f].get('valid_list', [])
        validmin = functions_yaml[f].get('valid_min', '')
        validmax = functions_yaml[f].get('valid_max', '')
        if datatype == 'void':
            fh.write(' - Die Funktion liefert kein Ergebnis\n')
        else:
            fh.write(' - Ergebnistyp der Funktion: ' + bold(datatype) + '\n')
        if default != '':
            fh.write(' - Standardwert: ' + bold(default) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(functions_yaml[f],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

#        func_param_yaml = functions_yaml[f].get('parameters', None)
        if func_param_yaml != None:
            for par in func_param_yaml:
                write_heading(fh, par, 3)
                write_formatted(
                    fh, get_doc_description(func_param_yaml[par], language))
                datatype = func_param_yaml[par].get('type', '').lower()
                default = str(func_param_yaml[par].get('default', ''))
                validlist = func_param_yaml[par].get('valid_list', [])
                validmin = func_param_yaml[par].get('valid_min', '')
                validmax = func_param_yaml[par].get('valid_max', '')
                fh.write(' - Datentyp: ' + bold(datatype) + '\n')
                if default != '':
                    fh.write(' - Standardwert: ' + bold(default) + '\n')
                fh.write('\n')
                if validmin != '':
                    fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
                if validmax != '':
                    fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
                if len(validlist) > 0:
                    fh.write(' - Mögliche Werte:\n')
                    fh.write('\n')
                    for index, v in enumerate(validlist):
                        desc = get_doc_description(
                            func_param_yaml[par],
                            language,
                            key='valid_list_description',
                            index=index)
                        if desc != '':
                            desc = ' |_| - |_| ' + desc
                        fh.write('   - ' + bold(str(v)) + desc + '\n')
                    fh.write('\n')

    fh.write('\n')

    if os.path.isfile(plg['name'] + '/README.md'):
        fh.write(
            '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/'
            + plgname + '/README>` des Plugins zugreifen.\n')
    else:
        fh.write(
            '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt.\n'
        )

    fh.close()
    return
예제 #5
0
def build_pluginlist( plugin_type='all' ):
    """
    Return a list of dicts with a dict for each plugin of the requested type
    The dict contains the plugin name, type and description
    """
    result = []
    plugin_type = plugin_type.lower()
    for metaplugin in plugins_git:
        metafile = metaplugin + '/plugin.yaml' 
        plg_dict = {}
        if metaplugin in plugins_git:    #pluginsyaml_git
            if os.path.isfile(metafile):
                plugin_yaml = shyaml.yaml_load(metafile)
            else:
                plugin_yaml = ''
            if plugin_yaml != '':
                section_dict = plugin_yaml.get('plugin')
                if section_dict != None:
                    if section_dict.get('type') != None:
                        if section_dict.get('type').lower() in plugin_types:
                            plgtype = section_dict.get('type').lower()
                            plg_dict['name'] = metaplugin.lower()
                            plg_dict['type'] = plgtype
                            plg_dict['desc'] = get_description(section_dict, 85, language)
                            plg_dict['maint'] = get_maintainer(section_dict, 15)
                            plg_dict['test'] = get_tester(section_dict, 15)
                            plg_dict['doc'] = html_escape(section_dict.get('documentation', ''))
                            plg_dict['sup'] = html_escape(section_dict.get('support', ''))
                        else:
                            plgtype = type_unclassified
                    else:
                        plgtype = type_unclassified
                        if plugin_type == type_unclassified:
                            print("not found: plugin type '{}' defined in plugin '{}'".format(section_dict.get('type'),metaplugin))
                else:
                    plgtype = type_unclassified

                if (plgtype == type_unclassified) and (plugin_yaml != ''):
                    plg_dict['name'] = metaplugin.lower()
                    plg_dict['type'] = type_unclassified
                    plg_dict['desc'] = get_description(section_dict, 85, language)
                    plg_dict['maint'] = get_maintainer(section_dict, 15)
                    plg_dict['test'] = get_tester(section_dict, 15)
                    plg_dict['doc'] = html_escape(section_dict.get('documentation', ''))
                    plg_dict['sup'] = html_escape(section_dict.get('support', ''))
                    print("")
                    print("> unclassified plugin: metafile = {}, plg_dict = {}".format(metafile, str(plg_dict)))

                plg_dict['desc'].append('')
            else:
                plgtype = type_unclassified
                plg_dict['name'] = metaplugin.lower()
                plg_dict['type'] = type_unclassified
                plg_dict['desc'] = ['No metadata (plugin.yaml) was provided for this plugin!']
                plg_dict['maint'] = ['']
                plg_dict['test'] = ['']
                plg_dict['doc'] = ''
                plg_dict['sup'] = ''
                
            
            # Adjust list lengths
            maxlen = max( len(plg_dict['desc']), len(plg_dict['maint']), len(plg_dict['test']) )
            while len(plg_dict['desc']) < maxlen:
                plg_dict['desc'].append('')
            while len(plg_dict['maint']) < maxlen:
                plg_dict['maint'].append('')
            while len(plg_dict['test']) < maxlen:
                plg_dict['test'].append('')
                

        if (plgtype == plugin_type) or (plugin_type == 'all'):
#            result.append(metaplugin)
            result.append(plg_dict)
    return result
def write_configfile(plg, configfile_dir, language='de'):
    """
    Create a .rst file with configuration information for the passed plugin
    """
    plgname = plg['name']

    # ---------------------------------
    # read metadata for plugin
    # ---------------------------------
    metafile = plgname + '/plugin.yaml' 
    if os.path.isfile(metafile):
        meta_yaml = shyaml.yaml_load(metafile)
        plugin_yaml = meta_yaml.get('plugin', {})
        parameter_yaml = meta_yaml.get('parameters', {})
        iattributes_yaml = meta_yaml.get('item_attributes', {})
        if parameter_yaml is None:
            parameter_yaml = {}
        if iattributes_yaml is None:
            iattributes_yaml = {}
    else:
        plugin_yaml = {}
        parameter_yaml = {}
        iattributes_yaml = {}


    # ---------------------------------
    # Create rST file
    # ---------------------------------
    outf_name = os.path.join(configfile_dir, plgname+'.rst')
    fh = open(outf_name, "w")
    write_heading(fh, 'Plugin ' + plgname, 1)

    # --------------------------------------------
    # write image for plugin-type and generic text
    # --------------------------------------------
    plgtype = plugin_yaml.get('type', '').lower()
    if plgtype != '':
        fh.write('.. image:: /_static/img/'+plgtype+'.svg\n')
        fh.write('   :width: 70px\n')
        fh.write('   :height: 70px\n')
        fh.write('   :scale: 50 %\n')
        fh.write('   :alt: protocol plugin\n')
        fh.write('   :align: left\n')
        fh.write('\n')
        fh.write('.. |br| raw:: html\n')
        fh.write('\n')
        fh.write('   <br />\n')
        fh.write('\n')
    
    fh.write('Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die Beschreibung, wie das Plugin **'+plgname+'** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n')
    fh.write('\n')
    fh.write('\n')

    write_heading(fh, 'Beschreibung', 2)
    write_formatted(fh, get_doc_description(plugin_yaml, language))

    # ---------------------------------
    # write Requirements section
    # ---------------------------------
    requirements = get_description(plugin_yaml, 768, language, 'requirements')
    min_version = str(plugin_yaml.get('sh_minversion', ''))
    max_version = str(plugin_yaml.get('sh_maxversion', ''))
    if requirements[0] != '' or min_version != '' or max_version != '':
        write_heading(fh, 'Anforderungen', 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(plugin_yaml, language, 'requirements'))
        if min_version != '':
            fh.write(' - Minimum SmartHomeNG Version: **'+min_version+'**\n')
        if max_version != '':
            fh.write(' - Maximum SmartHomeNG Version: **'+max_version+'**\n')


    # ---------------------------------
    # write supported hardware section
    # ---------------------------------
    hardware = get_description(plugin_yaml, 768, language, 'hardware')
    if hardware[0] != '':
        write_heading(fh, 'Unterstützte Hardware', 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(plugin_yaml, language, 'hardware'))

    # ---------------------------------
    # write Konfiguration section
    # ---------------------------------
    write_heading(fh, 'Konfiguration', 2)
    fh.write('\n')
    fh.write('Im folgenden ist beschrieben, wie das Plugin **'+plgname+'** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n')
    fh.write('\n')

    # ---------------------------------
    # write Parameter section
    # ---------------------------------
    write_heading(fh, 'Parameter', 2)
    fh.write('\n')
    fh.write('Das Plugin verfügt über folgende Parameter, die in der Datei **../etc/plugin.yaml** konfiguriert werden:\n')
    fh.write('\n')

    if len(parameter_yaml) == 0:
        fh.write('**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n')
    for p in sorted(parameter_yaml):
        # ---------------------------------
        # write info for one parameter
        # ---------------------------------
        write_heading(fh, p, 3)
        fh.write('\n')
#        desc = get_description(parameter_yaml[p], 768, language)
#        fh.write(desc[0]+'\n')
#       fh.write('\n')
        write_formatted(fh, get_doc_description(parameter_yaml[p], language))
        datatype = parameter_yaml[p].get('type', '').lower()
        default = str(parameter_yaml[p].get('default', ''))
        validlist = parameter_yaml[p].get('valid_list', [])
        fh.write(' - Datentyp: **'+datatype+'**\n')
        if default != '':
            fh.write(' - Standardwert: **'+default+'**\n')
        fh.write('\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for v in validlist:
                fh.write('   - **'+str(v)+'**\n')
            fh.write('\n')
            
    # ---------------------------------
    # write item_attribute section
    # ---------------------------------
    write_heading(fh, 'Item Attribute', 2)
    fh.write('\n')
    fh.write('Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis  **../items** verwendet werden:\n')
    fh.write('\n')

    if len(iattributes_yaml) == 0:
        fh.write('**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n')
    for a in sorted(iattributes_yaml):
        # ---------------------------------
        # write info for one attribute
        # ---------------------------------
        write_heading(fh, a, 3)
        fh.write('\n')
#        desc = get_description(iattributes_yaml[a], 768, language)
#        fh.write(desc[0]+'\n')
#        fh.write('\n')
        write_formatted(fh, get_doc_description(iattributes_yaml[a], language))
        datatype = iattributes_yaml[a].get('type', '').lower()
        default = str(iattributes_yaml[a].get('default', ''))
        validlist = iattributes_yaml[a].get('valid_list', [])
        fh.write(' - Datentyp: **'+datatype+'**\n')
        if default != '':
            fh.write(' - Standardwert: **'+default+'**\n')
        fh.write('\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for v in validlist:
                fh.write('   - **'+str(v)+'**\n')
            fh.write('\n')


    fh.write('\n')
    fh.write('.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/'+plgname+'/README>` des Plugins zugreifen.\n')

    fh.close()
    return
def write_configfile(plg, configfile_dir, language='de'):
    """
    Create a .rst file with configuration information for the passed plugin
    """
    lparameter_yaml = []
    no_lparameters = (lparameter_yaml == 'NONE')

    plgname = plg['name']

    # ---------------------------------
    # read metadata for plugin
    # ---------------------------------
    metafile = plgname + '/plugin.yaml'
    if os.path.isfile(metafile):
        meta_yaml = shyaml.yaml_load(metafile, ordered=True)
        plugin_yaml = meta_yaml.get('plugin', {})
        parameter_yaml = meta_yaml.get('parameters', {})
        iattributes_yaml = meta_yaml.get('item_attributes', {})
        lparameter_yaml = meta_yaml.get('logic_parameter', {})
        functions_yaml = meta_yaml.get('plugin_functions', {})

        no_parameters = (parameter_yaml == 'NONE')
        if no_parameters or parameter_yaml is None:
            parameter_yaml = {}

        no_attributes = (iattributes_yaml == 'NONE')
        if no_attributes or iattributes_yaml is None:
            iattributes_yaml = {}

        no_lparameters = (lparameter_yaml == 'NONE')
        if no_lparameters or lparameter_yaml is None:
            lparameter_yaml = {}

        no_functions = (functions_yaml == 'NONE')
        if no_functions or functions_yaml is None:
            functions_yaml = {}
    else:
        plugin_yaml = {}
        no_parameters = False
        parameter_yaml = {}
        no_attributes = False
        iattributes_yaml = {}
        no_functions = False
        functions_yaml = {}

    # ---------------------------------
    # Create rST file
    # ---------------------------------
    outf_name = os.path.join(configfile_dir, plgname + '.rst')
    fh = open(outf_name, "w", encoding='UTF-8')
    fh.write('.. |_| unicode:: 0xA0\n')
    fh.write('\n')

    write_heading(fh, f"Plugin '{plgname}' Konfiguration", 1)
    fh.write('\n')
    fh.write(f".. index:: Plugins; {plgname} Konfiguration\n")
    fh.write('\n')

    # --------------------------------------------
    # write image for plugin-type and generic text
    # --------------------------------------------
    plgtype = plugin_yaml.get('type', '').lower()
    plgstate = plugin_yaml.get('state', '').lower()
    if plgtype != '':
        cwd = os.getcwd()
        plglogo = plgname + '/webif/static/img/plugin_logo'
        if os.path.isfile(plglogo + '.png'):
            ext = '.png'
        elif os.path.isfile(plglogo + '.jpg'):
            ext = '.jpg'
        elif os.path.isfile(plglogo + '.svg'):
            ext = '.svg'
        else:
            ext = '.???'
        if os.path.isfile(plglogo + ext):
            fh.write(".. image:: /plugins/" + plglogo + ext + "\n")
            fh.write('   :alt: plugin logo\n')
        else:
            print(
                f"Plugin {plgname}: Kein Plugin-Logo gefunden, Typ-Logo verwendet."
            )
            fh.write('.. image:: /_static/img/' + plgtype + '.svg\n')
            fh.write('   :alt: plugin type logo\n')
        fh.write('   :width: 300px\n')
        fh.write('   :height: 300px\n')
        fh.write('   :scale: 50 %\n')
        fh.write('   :align: left\n')
        fh.write('\n')
        fh.write('.. |br| raw:: html\n')
        fh.write('\n')
        fh.write('   <br />\n')
        fh.write('\n')

    fh.write(
        'Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die \
              Beschreibung, wie das Plugin ' + bold(plgname) +
        ' konfiguriert wird. Außerdem ist im folgenden \
              beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n'
    )
    fh.write('\n')
    fh.write(
        f"Es handelt sich bei diesem Plugin um ein **{plgtype} Plugin**.\n")
    if plgstate == 'deprecated':
        fh.write('\n')
        fh.write(
            f"**ACHTUNG**: Dieses Plugin ist als {plgstate} gekennzeichnet. Es wird empfohlen auf eine \
                 Nachfolgelösung umzusteigen.\n")
    if plgstate == 'develop':
        fh.write('\n')
        fh.write(
            f"**ACHTUNG**: Dieses Plugin ist als {plgstate} gekennzeichnet. Es kann daher sein, dass es \
                 noch nicht Feature-Complete oder noch fehlerhaft ist.\n")

    fh.write('\n')
    fh.write('\n')

    write_heading(fh, 'Beschreibung', 2)
    write_formatted(fh, get_doc_description(plugin_yaml, language))

    # ---------------------------------
    # write a note block if special requirements exist
    # ---------------------------------
    py_versioncomment = str(plugin_yaml.get('py_versioncomment', ''))
    if py_versioncomment != '':
        fh.write('.. attention::\n')
        fh.write('\n')
        fh.write(f"    {py_versioncomment}\n")
        fh.write('\n')
        fh.write('\n')

    # ---------------------------------
    # write Requirements section
    # ---------------------------------
    requirements = get_description(plugin_yaml, 768, language, 'requirements')
    min_version = str(plugin_yaml.get('sh_minversion', ''))
    max_version = str(plugin_yaml.get('sh_maxversion', ''))
    min_py_version = str(plugin_yaml.get('py_minversion', ''))
    max_py_version = str(plugin_yaml.get('py_maxversion', ''))
    if requirements[
            0] != '' or min_version != '' or max_version != '' or min_py_version != '' or max_py_version != '':
        write_heading(fh, 'Anforderungen', 2)
        fh.write('\n')
        write_formatted(
            fh, get_doc_description(plugin_yaml, language, 'requirements'))
        if min_version != '':
            fh.write(' - Minimum SmartHomeNG Version: ' + bold(min_version) +
                     '\n')
        if max_version != '':
            fh.write(' - Maximum SmartHomeNG Version: ' + bold(max_version) +
                     '\n')
        if min_py_version != '':
            fh.write(' - Minimum Python Version: ' + bold(min_py_version) +
                     '\n')
        if max_py_version != '':
            fh.write(' - Maximum Python Version: ' + bold(max_py_version) +
                     '\n')

    # ---------------------------------
    # write supported hardware section
    # ---------------------------------
    hardware = get_description(plugin_yaml, 768, language, 'hardware')
    if hardware[0] != '':
        write_heading(fh, 'Unterstützte Hardware', 2)
        fh.write('\n')
        write_formatted(fh,
                        get_doc_description(plugin_yaml, language, 'hardware'))

    # ---------------------------------
    # write Konfiguration section
    # ---------------------------------
    write_heading(fh, 'Konfiguration', 2)
    fh.write('\n')
    fh.write(
        'Im folgenden ist beschrieben, wie das Plugin ' + bold(plgname) +
        ' konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n'
    )
    fh.write('\n')

    # ---------------------------------
    # write Parameter section
    # ---------------------------------
    write_heading(fh, 'Parameter', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/plugin.yaml`` konfiguriert werden:\n'
    )
    fh.write('\n')

    if len(parameter_yaml) == 0:
        if no_parameters:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for p in sorted(parameter_yaml):
        # ---------------------------------
        # write info for one parameter
        # ---------------------------------
        write_heading(fh, p, 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(parameter_yaml[p], language))
        datatype = parameter_yaml[p].get('type', '').lower()
        default = str(parameter_yaml[p].get('default', ''))
        validlist = parameter_yaml[p].get('valid_list', [])
        validmin = parameter_yaml[p].get('valid_min', '')
        validmax = parameter_yaml[p].get('valid_max', '')
        fh.write(' - Datentyp: ' + bold(datatype) + '\n')
        if default != '':
            default_printable = default.replace('\r', '\\r')
            default_printable = default_printable.replace('\n', '\\n')
            fh.write(' - Standardwert: ' + bold(default_printable) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(parameter_yaml[p],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

    # ---------------------------------
    # write item_attribute section
    # ---------------------------------
    write_heading(fh, 'Item Attribute', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis  ``../items`` verwendet werden:\n'
    )
    fh.write('\n')

    if len(iattributes_yaml) == 0:
        if no_attributes:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Item Attribute in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for a in sorted(iattributes_yaml):
        # ---------------------------------
        # write info for one attribute
        # ---------------------------------
        write_heading(fh, a, 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(iattributes_yaml[a], language))
        datatype = iattributes_yaml[a].get('type', '').lower()
        default = str(iattributes_yaml[a].get('default', ''))
        validlist = iattributes_yaml[a].get('valid_list', [])
        validmin = iattributes_yaml[a].get('valid_min', '')
        validmax = iattributes_yaml[a].get('valid_max', '')
        fh.write(' - Datentyp: ' + bold(datatype) + '\n')
        if default != '':
            default_printable = default.replace('\r', '\\r')
            default_printable = default_printable.replace('\n', '\\n')
            fh.write(' - Standardwert: ' + bold(default_printable) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(iattributes_yaml[a],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

    # ---------------------------------
    # write logic_parameter section
    # ---------------------------------
    write_heading(fh, 'Logik Parameter', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/logic.yaml`` konfiguriert werden:\n'
    )
    fh.write('\n')

    if len(lparameter_yaml) == 0:
        if no_lparameters:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Logik Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for l in sorted(lparameter_yaml):
        # ---------------------------------
        # write info for one attribute
        # ---------------------------------
        write_heading(fh, l, 2)
        fh.write('\n')
        write_formatted(fh, get_doc_description(lparameter_yaml[l], language))
        datatype = lparameter_yaml[l].get('type', '').lower()
        default = str(lparameter_yaml[l].get('default', ''))
        validlist = lparameter_yaml[l].get('valid_list', [])
        validmin = lparameter_yaml[l].get('valid_min', '')
        validmax = lparameter_yaml[l].get('valid_max', '')
        fh.write(' - Datentyp: ' + bold(datatype) + '\n')
        if default != '':
            default_printable = default.replace('\r', '\\r')
            default_printable = default_printable.replace('\n', '\\n')
            fh.write(' - Standardwert: ' + bold(default_printable) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(lparameter_yaml[l],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

    # ---------------------------------
    # write plugin-function section
    # ---------------------------------
    write_heading(fh, 'Plugin Functions', 1)
    fh.write('\n')
    fh.write(
        'Das Plugin verfügt über folgende öffentliche Funktionen, die z.B. in Logiken aufgerufen werden können.\n'
    )
    fh.write('\n')

    if len(functions_yaml) == 0:
        if no_functions:
            fh.write('**Keine**\n')
        else:
            fh.write(
                'Keine Funktionen in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n'
            )
    for f in sorted(functions_yaml):
        # ---------------------------------
        # write info for one function
        # ---------------------------------
        fp = ''
        func_param_yaml = functions_yaml[f].get('parameters', None)
        if func_param_yaml != None:
            for par in func_param_yaml:
                if fp != '':
                    fp += ', '
                fp += par
                if func_param_yaml[par] != None and isinstance(
                        func_param_yaml[par], dict):
                    if func_param_yaml[par].get('default', None) != None:
                        default = str(func_param_yaml[par].get(
                            'default', None))
                        if func_param_yaml[par].get('type', 'foo') == 'str':
                            default = " '" + default + "'"
                        fp += '=' + default
                else:
                    print(f"\n\nFEHLER: Ungültige Plugin-Funktion:")
                    print(f"Plugin: {plgname}")
                    print(f"par   : {par}\n")
                    print(f"func_param_yaml: {func_param_yaml}\n")

        write_heading(fh, f + '(' + fp + ')', 2)
        fh.write('\n')
        #        desc = get_description(parameter_yaml[f], 768, language)
        #        fh.write(desc[0]+'\n')
        #       fh.write('\n')
        write_formatted(fh, get_doc_description(functions_yaml[f], language))
        datatype = functions_yaml[f].get('type', '').lower()
        default = str(functions_yaml[f].get('default', ''))
        validlist = functions_yaml[f].get('valid_list', [])
        validmin = functions_yaml[f].get('valid_min', '')
        validmax = functions_yaml[f].get('valid_max', '')
        if datatype == 'void':
            fh.write(' - Die Funktion liefert kein Ergebnis\n')
        else:
            fh.write(' - Ergebnistyp der Funktion: ' + bold(datatype) + '\n')
        if default != '':
            default_printable = default.replace('\r', '\\r')
            default_printable = default_printable.replace('\n', '\\n')
            fh.write(' - Standardwert: ' + bold(default_printable) + '\n')
        fh.write('\n')
        if validmin != '':
            fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
        if validmax != '':
            fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
        if len(validlist) > 0:
            fh.write(' - Mögliche Werte:\n')
            fh.write('\n')
            for index, v in enumerate(validlist):
                desc = get_doc_description(functions_yaml[f],
                                           language,
                                           key='valid_list_description',
                                           index=index)
                if desc != '':
                    desc = ' |_| - |_| ' + desc
                fh.write('   - ' + bold(str(v)) + desc + '\n')
            fh.write('\n')

#        func_param_yaml = functions_yaml[f].get('parameters', None)
        if func_param_yaml != None:
            for par in func_param_yaml:
                write_heading(fh, par, 3)
                write_formatted(
                    fh, get_doc_description(func_param_yaml[par], language))
                datatype = func_param_yaml[par].get('type', '').lower()
                default = str(func_param_yaml[par].get('default', ''))
                validlist = func_param_yaml[par].get('valid_list', [])
                validmin = func_param_yaml[par].get('valid_min', '')
                validmax = func_param_yaml[par].get('valid_max', '')
                fh.write(' - Datentyp: ' + bold(datatype) + '\n')
                if default != '':
                    default_printable = default.replace('\r', '\\r')
                    default_printable = default_printable.replace('\n', '\\n')
                    fh.write(' - Standardwert: ' + bold(default_printable) +
                             '\n')
                fh.write('\n')
                if validmin != '':
                    fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n')
                if validmax != '':
                    fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n')
                if len(validlist) > 0:
                    fh.write(' - Mögliche Werte:\n')
                    fh.write('\n')
                    for index, v in enumerate(validlist):
                        desc = get_doc_description(
                            func_param_yaml[par],
                            language,
                            key='valid_list_description',
                            index=index)
                        if desc != '':
                            desc = ' |_| - |_| ' + desc
                        fh.write('   - ' + bold(str(v)) + desc + '\n')
                    fh.write('\n')

    fh.write('\n')

    if os.path.isfile(plg['name'] + '/README.md'):
        fh.write(
            '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/'
            + plgname + '/README>` des Plugins zugreifen.\n')
    else:
        fh.write(
            '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt.\n'
        )

    fh.close()
    return