diff options
| -rw-r--r-- | doc/user-guide/genhelp.py | 165 | 
1 files changed, 165 insertions, 0 deletions
| diff --git a/doc/user-guide/genhelp.py b/doc/user-guide/genhelp.py new file mode 100644 index 00000000..e53b53ed --- /dev/null +++ b/doc/user-guide/genhelp.py @@ -0,0 +1,165 @@ +import re +import xml.etree.ElementTree as ET + +IN_FILE = 'help.xml' +OUT_FILE = 'help.txt' +NORMALIZE_RE = re.compile(r"([^<>\s\t])[\s\t]+([^<>\s\t])") + +def join(list): +    return ''.join([str(x) for x in list]) + +def normalize(x): +    x = NORMALIZE_RE.sub(r"\1 \2", x or '') +    return x.replace("\n", "").replace("\t", "") + +def fix_tree(tag, lvl=''): +    if tag.tag.count("XInclude"): +        tag.tag = 'include' + +    #print("%s<%s>%r" % (lvl, tag.tag, [tag.text, normalize(tag.text)])) + +    for subtag in tag: +        fix_tree(subtag, lvl + "  ") + +    #print("%s</%s>%r" % (lvl, tag.tag, [tag.tail, normalize(tag.tail)])) + +    tag.text = normalize(tag.text) +    tag.tail = normalize(tag.tail) + +def parse_file(filename, parent=None): +    tree = ET.parse(open(filename)).getroot() +    fix_tree(tree) +    return parse_tag(tree, parent) + +def parse_tag(tag, parent): +    fun = globals()["tag_%s" % tag.tag.replace("-", "_")] +    return join(fun(tag, parent)) + +def parse_subtags(tag, parent=None): +    yield tag.text + +    for subtag in tag: +        yield parse_tag(subtag, tag) + +    yield tag.tail + +def handle_subject(tag, parent): +    yield '?%s\n' % tag.attrib['id'] + +    first = True +    for element in tag: +        if element.tag in ["para", "variablelist", "simplelist", +                           "command-list", "ircexample"]: +            if not first: +                yield "\n" +            first = False + +            if element.attrib.get('title', ''): +                yield element.attrib['title'] +                yield "\n" +            yield join(parse_tag(element, tag)).rstrip("\n") +            yield "\n" + +    yield "%\n" + +    for element in tag: +        if element.tag in ["sect1", "sect2"]: +            yield join(handle_subject(element, tag)) + +    for element in tag.findall("bitlbee-command"): +        yield join(handle_command(element)) + +    for element in tag.findall("bitlbee-setting"): +        yield join(handle_setting(element)) + +def handle_command(tag, prefix=''): +    this_cmd = prefix + tag.attrib['name'] + +    yield "?%s\n" % this_cmd +    for syntax in tag.findall("syntax"): +        yield '\x02Syntax:\x02 %s\n' % syntax.text + +    yield "\n" +    yield join(parse_subtags(tag.find("description"))).rstrip() +    yield "\n" + +    for example in tag.findall("ircexample"): +        yield "\n\x02Example:\x02\n" +        yield join(parse_subtags(example)).rstrip() +        yield "\n" + +    yield "%\n" + +    for element in tag.findall("bitlbee-command"): +        yield join(handle_command(element, this_cmd + " ")) + +def handle_setting(tag): +    yield "?set %s\n" % tag.attrib['name'] +    yield "\x02Type:\x02 %s\n" % tag.attrib["type"] +    yield "\x02Scope:\x02 %s\n" % tag.attrib["scope"] + +    if tag.find("default") is not None: +        yield "\x02Default:\x02 %s\n" % tag.findtext("default") + +    if tag.find("possible-values") is not None: +        yield "\x02Possible Values:\x02 %s\n" % tag.findtext("possible-values") + +    yield "\n" +    yield join(parse_subtags(tag.find("description"))).rstrip() +    yield "\n%\n" + +tag_preface = handle_subject +tag_chapter = handle_subject +tag_sect1 = handle_subject +tag_sect2 = handle_subject + +tag_ulink = parse_subtags +tag_note = parse_subtags +tag_book = parse_subtags +tag_ircexample = parse_subtags + +def tag_include(tag, parent): +    return parse_file(tag.attrib['href'], tag) + +def tag_para(tag, parent): +    return join(parse_subtags(tag)) + "\n\n" + +def tag_emphasis(tag, parent): +    return "\x02%s\x02%s" % (tag.text, tag.tail) + +def tag_ircline(tag, parent): +    return "\x02<%s>\x02 %s\n" % (tag.attrib['nick'], join(parse_subtags(tag))) + +def tag_ircaction(tag, parent): +    return "\x02* %s\x02 %s\n" % (tag.attrib['nick'], join(parse_subtags(tag))) + +def tag_command_list(tag, parent): +    yield "These are all root commands. See \x02help <command name>\x02 " \ +          "for more details on each command.\n\n" + +    for subtag in parent.findall("bitlbee-command"): +        yield " * \x02%s\x02 - %s\n" % \ +            (subtag.attrib['name'], +             subtag.findtext("short-description")) + +    yield "\nMost commands can be shortened. For example instead of " \ +          "\x02account list\x02, try \x02ac l\x02.\n\n" + +def tag_variablelist(tag, parent): +    for subtag in tag: +        yield " \x02%s\x02 - %s\n" % \ +            (subtag.findtext("term"), +             join(parse_subtags(subtag.find("listitem/para")))) +    yield '\n' + +def tag_simplelist(tag, parent): +    for subtag in tag: +        yield " - %s\n" % join(parse_subtags(subtag)) +    yield '\n' + +def main(): +    txt = parse_file(IN_FILE) +    open(OUT_FILE, "w").write(txt) + +if __name__ == '__main__': +    main() | 
