diff options
-rwxr-xr-x | Doc/tools/sgmlconv/docfixer.py | 112 |
1 files changed, 99 insertions, 13 deletions
diff --git a/Doc/tools/sgmlconv/docfixer.py b/Doc/tools/sgmlconv/docfixer.py index 97bcb09..b23b0f6 100755 --- a/Doc/tools/sgmlconv/docfixer.py +++ b/Doc/tools/sgmlconv/docfixer.py @@ -227,20 +227,104 @@ def cleanup_trailing_parens(doc, element_names): queue.append(child) +def contents_match(left, right): + left_children = left.childNodes + right_children = right.childNodes + if len(left_children) != len(right_children): + return 0 + for l, r in map(None, left_children, right_children): + nodeType = l.nodeType + if nodeType != r.nodeType: + return 0 + if nodeType == xml.dom.core.ELEMENT: + if l.tagName != r.tagName: + return 0 + # should check attributes, but that's not a problem here + if not contents_match(l, r): + return 0 + elif nodeType == xml.dom.core.TEXT: + if l.data != r.data: + return 0 + else: + # not quite right, but good enough + return 0 + return 1 + + +def create_module_info(doc, section): + # Heavy. + node = extract_first_element(section, "modulesynopsis") + if node is None: + return + node._node.name = "synopsis" + lastchild = node.childNodes[-1] + if lastchild.nodeType == xml.dom.core.TEXT \ + and lastchild.data[-1:] == ".": + lastchild.data = lastchild.data[:-1] + if section.tagName == "section": + modinfo_pos = 2 + modinfo = doc.createElement("moduleinfo") + moddecl = extract_first_element(section, "declaremodule") + name = None + if moddecl: + modinfo.appendChild(doc.createTextNode("\n ")) + name = moddecl.attributes["name"].value + namenode = doc.createElement("name") + namenode.appendChild(doc.createTextNode(name)) + modinfo.appendChild(namenode) + type = moddecl.attributes.get("type") + if type: + type = type.value + modinfo.appendChild(doc.createTextNode("\n ")) + typenode = doc.createElement("type") + typenode.appendChild(doc.createTextNode(type)) + modinfo.appendChild(typenode) + title = get_first_element(section, "title") + if title: + children = title.childNodes + if len(children) >= 2 \ + and children[0].nodeType == xml.dom.core.ELEMENT \ + and children[0].tagName == "module" \ + and children[0].childNodes[0].data == name: + # this is it; morph the <title> into <short-synopsis> + first_data = children[1] + if first_data.data[:4] == " ---": + first_data.data = string.lstrip(first_data.data[4:]) + title._node.name = "short-synopsis" + if children[-1].data[-1:] == ".": + children[-1].data = children[-1].data[:-1] + section.removeChild(title) + section.removeChild(section.childNodes[0]) + title.removeChild(children[0]) + modinfo_pos = 0 + else: + sys.stderr.write( + "module name in title doesn't match" + " <declaremodule>; no <short-synopsis>\n") + else: + sys.stderr.write( + "Unexpected condition: <section> without <title>\n") + modinfo.appendChild(doc.createTextNode("\n ")) + modinfo.appendChild(node) + if title and not contents_match(title, node): + # The short synopsis is actually different, + # and needs to be stored: + modinfo.appendChild(doc.createTextNode("\n ")) + modinfo.appendChild(title) + modinfo.appendChild(doc.createTextNode("\n ")) + section.insertBefore(modinfo, section.childNodes[modinfo_pos]) + section.insertBefore(doc.createTextNode("\n "), modinfo) + + def cleanup_synopses(doc): - # Actually, this should build a "moduleinfo" element from various - # parts of the meta-information in the section. <moduleinfo> needs - # some design work before we can really do anything real. - synopses = doc.getElementsByTagName("modulesynopsis") - for node in synopses: - node._node.name = "synopsis" - parent = node.parentNode - if parent.tagName == "section": - children = parent.childNodes - parent.removeChild(node) - parent.insertBefore(node, children[2]) - text = doc.createTextNode("\n ") - parent.insertBefore(text, node) + for node in doc.childNodes: + if node.nodeType == xml.dom.core.ELEMENT \ + and node.tagName == "section": + create_module_info(doc, node) + + +def fixup_paras(doc): + pass _token_rx = re.compile(r"[a-zA-Z][a-zA-Z0-9.-]*$") @@ -292,6 +376,8 @@ def convert(ifp, ofp): cleanup_root_text(doc) cleanup_trailing_parens(doc, ["function", "method", "cfunction"]) cleanup_synopses(doc) + normalize(doc) + fixup_paras(doc) # d = {} for gi in p.get_empties(): |