aboutsummaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/user-guide/genhelp.py75
1 files changed, 66 insertions, 9 deletions
diff --git a/doc/user-guide/genhelp.py b/doc/user-guide/genhelp.py
index e53b53ed..d17aec62 100644
--- a/doc/user-guide/genhelp.py
+++ b/doc/user-guide/genhelp.py
@@ -1,3 +1,21 @@
+#!/usr/bin/env python
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+
import re
import xml.etree.ElementTree as ET
@@ -5,33 +23,55 @@ 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])
+# Helpers
def normalize(x):
+ """Normalize whitespace of a string.
+
+ The regexp turns any sequence of whitespace into a single space if it's in
+ the middle of the tag text, and then all newlines and tabs are removed,
+ keeping spaces.
+ """
+
x = NORMALIZE_RE.sub(r"\1 \2", x or '')
return x.replace("\n", "").replace("\t", "")
-def fix_tree(tag, lvl=''):
+def join(list):
+ """Turns any iterator into a string"""
+ return ''.join([str(x) for x in list])
+
+def fix_tree(tag, debug=False, lvl=''):
+ """Walks the XML tree and modifies it in-place fixing various details"""
+
+ # The include tags have an ugly namespace in the tag name. Simplify that.
if tag.tag.count("XInclude"):
tag.tag = 'include'
- #print("%s<%s>%r" % (lvl, tag.tag, [tag.text, normalize(tag.text)]))
+ # Print a pretty tree-like representation of the processed tags
+ if debug:
+ print("%s<%s>%r" % (lvl, tag.tag, [tag.text, normalize(tag.text)]))
for subtag in tag:
- fix_tree(subtag, lvl + " ")
+ fix_tree(subtag, debug, lvl + " ")
- #print("%s</%s>%r" % (lvl, tag.tag, [tag.tail, normalize(tag.tail)]))
+ if debug:
+ print("%s</%s>%r" % (lvl, tag.tag, [tag.tail, normalize(tag.tail)]))
+ # Actually normalize whitespace
tag.text = normalize(tag.text)
tag.tail = normalize(tag.tail)
-def parse_file(filename, parent=None):
+
+# Main logic
+
+def process_file(filename, parent=None):
tree = ET.parse(open(filename)).getroot()
fix_tree(tree)
return parse_tag(tree, parent)
def parse_tag(tag, parent):
+ """Calls a tag_... function based on the tag name"""
+
fun = globals()["tag_%s" % tag.tag.replace("-", "_")]
return join(fun(tag, parent))
@@ -43,7 +83,12 @@ def parse_subtags(tag, parent=None):
yield tag.tail
+
+# Main tag handlers
+
def handle_subject(tag, parent):
+ """Tag handler for preface, chapter, sect1 and sect2 (aliased below)"""
+
yield '?%s\n' % tag.attrib['id']
first = True
@@ -51,6 +96,7 @@ def handle_subject(tag, parent):
if element.tag in ["para", "variablelist", "simplelist",
"command-list", "ircexample"]:
if not first:
+ # Spaces between paragraphs
yield "\n"
first = False
@@ -73,6 +119,8 @@ def handle_subject(tag, parent):
yield join(handle_setting(element))
def handle_command(tag, prefix=''):
+ """Tag handler for <bitlbee-command> (called from handle_subject)"""
+
this_cmd = prefix + tag.attrib['name']
yield "?%s\n" % this_cmd
@@ -94,6 +142,8 @@ def handle_command(tag, prefix=''):
yield join(handle_command(element, this_cmd + " "))
def handle_setting(tag):
+ """Tag handler for <bitlbee-setting> (called from handle_subject)"""
+
yield "?set %s\n" % tag.attrib['name']
yield "\x02Type:\x02 %s\n" % tag.attrib["type"]
yield "\x02Scope:\x02 %s\n" % tag.attrib["scope"]
@@ -108,18 +158,24 @@ def handle_setting(tag):
yield join(parse_subtags(tag.find("description"))).rstrip()
yield "\n%\n"
+
+# Aliases for tags that behave like subjects
tag_preface = handle_subject
tag_chapter = handle_subject
tag_sect1 = handle_subject
tag_sect2 = handle_subject
+# Aliases for tags that don't have any special behavior
tag_ulink = parse_subtags
tag_note = parse_subtags
tag_book = parse_subtags
tag_ircexample = parse_subtags
+
+# Handlers for specific tags
+
def tag_include(tag, parent):
- return parse_file(tag.attrib['href'], tag)
+ return process_file(tag.attrib['href'], tag)
def tag_para(tag, parent):
return join(parse_subtags(tag)) + "\n\n"
@@ -157,8 +213,9 @@ def tag_simplelist(tag, parent):
yield " - %s\n" % join(parse_subtags(subtag))
yield '\n'
+
def main():
- txt = parse_file(IN_FILE)
+ txt = process_file(IN_FILE)
open(OUT_FILE, "w").write(txt)
if __name__ == '__main__':