def parseEntry(entryElem) : child = { "count" : lib.textValue(lib.selectChild(entryElem, "count")), "typename" : lib.textValue(lib.selectChild(entryElem, "typename")) } if len(lib.selectChildren(entryElem, "label")) > 0 : child["label"] = lib.textValue(lib.selectChild(entryElem, "label")) return child
def processDocbook(doc) : lib.normalize(doc) for_text_nodes(handleTextReplacements, doc) #convert @@foo to <link linkend="node.foo">foo</link> def handleAtAt(match) : text = match.group(1) elem = doc.createElement('link') elem.setAttribute('linkend', 'node.%s' % text) elem.appendChild(doc.createTextNode(text)) return elem for_text_nodes( lambda x: replaceBy(x, r'@@([a-z\-]+)', handleAtAt), doc) #convert ##foo to <link linkend="def.foo">foo</link> def handleHashHash(match) : elem = doc.createElement('link') elem.setAttribute('linkend', 'def.%s' % match.group(2)) elem.appendChild(doc.createTextNode(match.group(1))) return elem for_text_nodes( lambda x: replaceBy(x, r'##(([a-z\-]+)(:?s))', handleHashHash), doc) for glossterm in doc.getElementsByTagName("glossterm") : glossterm.setAttribute("xml:id", "def.%s" % lib.textValue(glossterm).replace(" ", "-")) specTitle = lib.textValue(doc.getElementsByTagName("title")[0]) if specTitle == "Niviok 1.0 Specification" : terminalTypenames = sorted( x["typename"] for x in nodeTypes if x["category"] == "terminal" ) listElem = lib.getElementsByAttribute(doc, "xml:id", "terminal-node-types-list")[0] for typename in terminalTypenames : memberElem = doc.createElement("member") listElem.appendChild(memberElem) memberElem.appendChild(doc.createTextNode(typename)) memberElem.setAttribute("linkend", "node.%s" % typename) for elem in doc.getElementsByTagName("screen") : processPreElem(elem) for elem in doc.getElementsByTagName("programlistinge") : processPreElem(elem) for elem in doc.getElementsByTagName("member") : role = elem.parentNode.getAttribute('role') if role == 'layout' : setupLayoutMember(elem) elif role == 'family-members' : setupFamilyMember(elem)
def parseFamily(elem) : assert elem.tagName == "family" return { "category" : "family", "typename" : lib.textValue(lib.selectChild(elem, "typename")), "members" : map(lib.textValue, lib.selectChildren(lib.selectChild(elem, "members"), "typename")) }
def getTypes(memberElem) : #defines a node, and is not defined within the section of another node def isTopNode(elem) : return definesNode(elem) and not lib.hasAncestorElement(elem.parentNode, definesNode) assert memberElem.tagName == "member" if memberElem.hasAttribute("linkend") and \ memberElem.getAttribute("linkend").find("node.") != 0 : id = memberElem.getAttribute("linkend") sect = memberElem.ownerDocument.getElementById(id) if sect == None : raise Exception("no element with id '%s'" % id) return map(getTitle, filter(isTopNode, lib.descendantElements(sect))) return [lib.textValue(memberElem)]
def parseTree(elem) : def parseEntry(entryElem) : child = { "count" : lib.textValue(lib.selectChild(entryElem, "count")), "typename" : lib.textValue(lib.selectChild(entryElem, "typename")) } if len(lib.selectChildren(entryElem, "label")) > 0 : child["label"] = lib.textValue(lib.selectChild(entryElem, "label")) return child assert elem.tagName == "tree" return { "category" : "tree", "typename" : lib.textValue(lib.selectChild(elem, "typename")), "layout" : map(parseEntry, lib.selectChildren(elem, "entry")) }
def parseChild(member) : text = lib.textValue(member) tokens = text.split(" ") child = {} #count (e.g. *) if tokens[0] in ["*", "+", "?"] : child["count"] = tokens.pop(0) else : child["count"] = "1" #typename (e.g. "alpha-beta-gamma") child["typename"] = tokens.pop(0) #label (e.g. "alpha beta gamma") if len(tokens) > 0 : child["label"] = " ".join(tokens) return child
def setupLayoutMember(member) : assert( len(member.childNodes) == 1 ) assert( member.childNodes[0].nodeType == member.TEXT_NODE ) doc = member.ownerDocument tokens = lib.textValue(member).split(' ') member.removeChild(member.firstChild) if len(tokens[0]) > 1 : typeName = tokens[0] textAfter = tokens[1:] else : assert( tokens[0] in ['?', '*', '+'] ) member.appendChild( doc.createTextNode(tokens[0] + ' ') ) typeName = tokens[1] textAfter = tokens[2:] typeName = typeName.lower() link = doc.createElement('link') link.setAttribute('linkend', 'node.' + typeName) link.appendChild(doc.createTextNode(typeName)) member.appendChild(link) member.appendChild( doc.createTextNode(' ' + ' '.join(textAfter)) )
def getTitle(elem) : assert definesNode(elem) return lib.textValue(elem.getElementsByTagName("title")[0])
def parseTerminal(elem) : assert elem.tagName == "terminal" return { "category" : "terminal", "typename" : lib.textValue(lib.selectChild(elem, "typename")) }