| Index: third_party/twisted_8_1/twisted/lore/tree.py
|
| diff --git a/third_party/twisted_8_1/twisted/lore/tree.py b/third_party/twisted_8_1/twisted/lore/tree.py
|
| deleted file mode 100644
|
| index 263522cb2d82dba612a84231813edbcbbbfd9203..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/lore/tree.py
|
| +++ /dev/null
|
| @@ -1,901 +0,0 @@
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -import re, os, cStringIO, time, cgi, string, urlparse
|
| -from twisted import copyright
|
| -from twisted.python import htmlizer, text
|
| -from twisted.web import microdom, domhelpers
|
| -import process, latex, indexer, numberer, htmlbook
|
| -from twisted.python.util import InsensitiveDict
|
| -
|
| -# relative links to html files
|
| -def fixLinks(document, ext):
|
| - """
|
| - Rewrite links to XHTML lore input documents so they point to lore XHTML
|
| - output documents.
|
| -
|
| - Any node with an C{href} attribute which does not contain a value starting
|
| - with C{http}, C{https}, C{ftp}, or C{mailto} and which does not have a
|
| - C{class} attribute of C{absolute} or which contains C{listing} and which
|
| - does point to an URL ending with C{html} will have that attribute value
|
| - rewritten so that the filename extension is C{ext} instead of C{html}.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @type ext: C{str}
|
| - @param ext: The extension to use when selecting an output file name. This
|
| - replaces the extension of the input file name.
|
| -
|
| - @return: C{None}
|
| - """
|
| - supported_schemes=['http', 'https', 'ftp', 'mailto']
|
| - for node in domhelpers.findElementsWithAttribute(document, 'href'):
|
| - href = node.getAttribute("href")
|
| - if urlparse.urlparse(href)[0] in supported_schemes:
|
| - continue
|
| - if node.getAttribute("class", "") == "absolute":
|
| - continue
|
| - if node.getAttribute("class", "").find('listing') != -1:
|
| - continue
|
| -
|
| - # This is a relative link, so it should be munged.
|
| - if href.endswith('html') or href[:href.rfind('#')].endswith('html'):
|
| - fname, fext = os.path.splitext(href)
|
| - if '#' in fext:
|
| - fext = ext+'#'+fext.split('#', 1)[1]
|
| - else:
|
| - fext = ext
|
| - node.setAttribute("href", fname + fext)
|
| -
|
| -
|
| -
|
| -def addMtime(document, fullpath):
|
| - """
|
| - Set the last modified time of the given document.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The output template which defines the presentation of the
|
| - last modified time.
|
| -
|
| - @type fullpath: C{str}
|
| - @param fullpath: The file name from which to take the last modified time.
|
| -
|
| - @return: C{None}
|
| - """
|
| - for node in domhelpers.findElementsWithAttribute(document, "class","mtime"):
|
| - node.appendChild(microdom.Text(time.ctime(os.path.getmtime(fullpath))))
|
| -
|
| -
|
| -
|
| -def _getAPI(node):
|
| - """
|
| - Retrieve the fully qualified Python name represented by the given node.
|
| -
|
| - The name is represented by one or two aspects of the node: the value of the
|
| - node's first child forms the end of the name. If the node has a C{base}
|
| - attribute, that attribute's value is prepended to the node's value, with
|
| - C{.} separating the two parts.
|
| -
|
| - @rtype: C{str}
|
| - @return: The fully qualified Python name.
|
| - """
|
| - base = ""
|
| - if node.hasAttribute("base"):
|
| - base = node.getAttribute("base") + "."
|
| - return base+node.childNodes[0].nodeValue
|
| -
|
| -
|
| -
|
| -def fixAPI(document, url):
|
| - """
|
| - Replace API references with links to API documentation.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @type url: C{str}
|
| - @param url: A string which will be interpolated with the fully qualified
|
| - Python name of any API reference encountered in the input document, the
|
| - result of which will be used as a link to API documentation for that name
|
| - in the output document.
|
| -
|
| - @return: C{None}
|
| - """
|
| - # API references
|
| - for node in domhelpers.findElementsWithAttribute(document, "class", "API"):
|
| - fullname = _getAPI(node)
|
| - node2 = microdom.Element('a', {'href': url%fullname, 'title': fullname})
|
| - node2.childNodes = node.childNodes
|
| - node.childNodes = [node2]
|
| - node.removeAttribute('base')
|
| -
|
| -
|
| -
|
| -def fontifyPython(document):
|
| - """
|
| - Syntax color any node in the given document which contains a Python source
|
| - listing.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @return: C{None}
|
| - """
|
| - def matcher(node):
|
| - return (node.nodeName == 'pre' and node.hasAttribute('class') and
|
| - node.getAttribute('class') == 'python')
|
| - for node in domhelpers.findElements(document, matcher):
|
| - fontifyPythonNode(node)
|
| -
|
| -
|
| -
|
| -def fontifyPythonNode(node):
|
| - """
|
| - Syntax color the given node containing Python source code.
|
| -
|
| - @return: C{None}
|
| - """
|
| - oldio = cStringIO.StringIO()
|
| - latex.getLatexText(node, oldio.write,
|
| - entities={'lt': '<', 'gt': '>', 'amp': '&'})
|
| - oldio = cStringIO.StringIO(oldio.getvalue().strip()+'\n')
|
| - newio = cStringIO.StringIO()
|
| - htmlizer.filter(oldio, newio, writer=htmlizer.SmallerHTMLWriter)
|
| - newio.seek(0)
|
| - newel = microdom.parse(newio).documentElement
|
| - newel.setAttribute("class", "python")
|
| - node.parentNode.replaceChild(newel, node)
|
| -
|
| -
|
| -
|
| -def addPyListings(document, dir):
|
| - """
|
| - Insert Python source listings into the given document from files in the
|
| - given directory based on C{py-listing} nodes.
|
| -
|
| - Any node in C{document} with a C{class} attribute set to C{py-listing} will
|
| - have source lines taken from the file named in that node's C{href}
|
| - attribute (searched for in C{dir}) inserted in place of that node.
|
| -
|
| - If a node has a C{skipLines} attribute, its value will be parsed as an
|
| - integer and that many lines will be skipped at the beginning of the source
|
| - file.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The document within which to make listing replacements.
|
| -
|
| - @type dir: C{str}
|
| - @param dir: The directory in which to find source files containing the
|
| - referenced Python listings.
|
| -
|
| - @return: C{None}
|
| - """
|
| - for node in domhelpers.findElementsWithAttribute(document, "class",
|
| - "py-listing"):
|
| - filename = node.getAttribute("href")
|
| - outfile = cStringIO.StringIO()
|
| - lines = map(string.rstrip, open(os.path.join(dir, filename)).readlines())
|
| - data = '\n'.join(lines[int(node.getAttribute('skipLines', 0)):])
|
| - data = cStringIO.StringIO(text.removeLeadingTrailingBlanks(data))
|
| - htmlizer.filter(data, outfile, writer=htmlizer.SmallerHTMLWriter)
|
| - val = outfile.getvalue()
|
| - _replaceWithListing(node, val, filename, "py-listing")
|
| -
|
| -
|
| -
|
| -def _replaceWithListing(node, val, filename, class_):
|
| - captionTitle = domhelpers.getNodeText(node)
|
| - if captionTitle == os.path.basename(filename):
|
| - captionTitle = 'Source listing'
|
| - text = ('<div class="%s">%s<div class="caption">%s - '
|
| - '<a href="%s"><span class="filename">%s</span></a></div></div>' %
|
| - (class_, val, captionTitle, filename, filename))
|
| - newnode = microdom.parseString(text).documentElement
|
| - node.parentNode.replaceChild(newnode, node)
|
| -
|
| -
|
| -
|
| -def addHTMLListings(document, dir):
|
| - """
|
| - Insert HTML source listings into the given document from files in the given
|
| - directory based on C{html-listing} nodes.
|
| -
|
| - Any node in C{document} with a C{class} attribute set to C{html-listing}
|
| - will have source lines taken from the file named in that node's C{href}
|
| - attribute (searched for in C{dir}) inserted in place of that node.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The document within which to make listing replacements.
|
| -
|
| - @type dir: C{str}
|
| - @param dir: The directory in which to find source files containing the
|
| - referenced HTML listings.
|
| -
|
| - @return: C{None}
|
| - """
|
| - for node in domhelpers.findElementsWithAttribute(document, "class",
|
| - "html-listing"):
|
| - filename = node.getAttribute("href")
|
| - val = ('<pre class="htmlsource">\n%s</pre>' %
|
| - cgi.escape(open(os.path.join(dir, filename)).read()))
|
| - _replaceWithListing(node, val, filename, "html-listing")
|
| -
|
| -
|
| -
|
| -def addPlainListings(document, dir):
|
| - """
|
| - Insert text listings into the given document from files in the given
|
| - directory based on C{listing} nodes.
|
| -
|
| - Any node in C{document} with a C{class} attribute set to C{listing} will
|
| - have source lines taken from the file named in that node's C{href}
|
| - attribute (searched for in C{dir}) inserted in place of that node.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The document within which to make listing replacements.
|
| -
|
| - @type dir: C{str}
|
| - @param dir: The directory in which to find source files containing the
|
| - referenced text listings.
|
| -
|
| - @return: C{None}
|
| - """
|
| - for node in domhelpers.findElementsWithAttribute(document, "class",
|
| - "listing"):
|
| - filename = node.getAttribute("href")
|
| - val = ('<pre>\n%s</pre>' %
|
| - cgi.escape(open(os.path.join(dir, filename)).read()))
|
| - _replaceWithListing(node, val, filename, "listing")
|
| -
|
| -
|
| -
|
| -def getHeaders(document):
|
| - """
|
| - Return all H2 and H3 nodes in the given document.
|
| -
|
| - @type document: A DOM Node or Document
|
| -
|
| - @rtype: C{list}
|
| - """
|
| - return domhelpers.findElements(
|
| - document,
|
| - lambda n, m=re.compile('h[23]$').match: m(n.nodeName))
|
| -
|
| -
|
| -
|
| -def generateToC(document):
|
| - """
|
| - Create a table of contents for the given document.
|
| -
|
| - @type document: A DOM Node or Document
|
| -
|
| - @rtype: A DOM Node
|
| - @return: a Node containing a table of contents based on the headers of the
|
| - given document.
|
| - """
|
| - toc, level, id = '\n<ol>\n', 0, 0
|
| - for element in getHeaders(document):
|
| - elementLevel = int(element.tagName[1])-2
|
| - toc += (level-elementLevel)*'</ul>\n'
|
| - toc += (elementLevel-level)*'<ul>'
|
| - toc += '<li><a href="#auto%d">' % id
|
| - toc += domhelpers.getNodeText(element)
|
| - toc += '</a></li>\n'
|
| - level = elementLevel
|
| - anchor = microdom.parseString('<a name="auto%d" />' % id).documentElement
|
| - element.childNodes.append(anchor)
|
| - id += 1
|
| - toc += '</ul>\n' * level
|
| - toc += '</ol>\n'
|
| - return microdom.parseString(toc).documentElement
|
| -
|
| -
|
| -
|
| -def putInToC(document, toc):
|
| - """
|
| - Insert the given table of contents into the given document.
|
| -
|
| - The node with C{class} attribute set to C{toc} has its children replaced
|
| - with C{toc}.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @type toc: A DOM Node
|
| - """
|
| - tocOrig = domhelpers.findElementsWithAttribute(document, 'class', 'toc')
|
| - if tocOrig:
|
| - tocOrig= tocOrig[0]
|
| - tocOrig.childNodes = [toc]
|
| -
|
| -
|
| -
|
| -def removeH1(document):
|
| - """
|
| - Replace all C{h1} nodes in the given document with empty C{span} nodes.
|
| -
|
| - C{h1} nodes mark up document sections and the output template is given an
|
| - opportunity to present this information in a different way.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @return: C{None}
|
| - """
|
| - h1 = domhelpers.findNodesNamed(document, 'h1')
|
| - empty = microdom.Element('span')
|
| - for node in h1:
|
| - node.parentNode.replaceChild(empty, node)
|
| -
|
| -
|
| -
|
| -def footnotes(document):
|
| - """
|
| - Find footnotes in the given document, move them to the end of the body, and
|
| - generate links to them.
|
| -
|
| - A footnote is any node with a C{class} attribute set to C{footnote}.
|
| - Footnote links are generated as superscript. Footnotes are collected in a
|
| - C{ol} node at the end of the document.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @return: C{None}
|
| - """
|
| - footnotes = domhelpers.findElementsWithAttribute(document, "class",
|
| - "footnote")
|
| - if not footnotes:
|
| - return
|
| - footnoteElement = microdom.Element('ol')
|
| - id = 1
|
| - for footnote in footnotes:
|
| - href = microdom.parseString('<a href="#footnote-%(id)d">'
|
| - '<super>%(id)d</super></a>'
|
| - % vars()).documentElement
|
| - text = ' '.join(domhelpers.getNodeText(footnote).split())
|
| - href.setAttribute('title', text)
|
| - target = microdom.Element('a', attributes={'name': 'footnote-%d' % id})
|
| - target.childNodes = [footnote]
|
| - footnoteContent = microdom.Element('li')
|
| - footnoteContent.childNodes = [target]
|
| - footnoteElement.childNodes.append(footnoteContent)
|
| - footnote.parentNode.replaceChild(href, footnote)
|
| - id += 1
|
| - body = domhelpers.findNodesNamed(document, "body")[0]
|
| - header = microdom.parseString('<h2>Footnotes</h2>').documentElement
|
| - body.childNodes.append(header)
|
| - body.childNodes.append(footnoteElement)
|
| -
|
| -
|
| -
|
| -def notes(document):
|
| - """
|
| - Find notes in the given document and mark them up as such.
|
| -
|
| - A note is any node with a C{class} attribute set to C{note}.
|
| -
|
| - (I think this is a very stupid feature. When I found it I actually
|
| - exclaimed out loud. -exarkun)
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @return: C{None}
|
| - """
|
| - notes = domhelpers.findElementsWithAttribute(document, "class", "note")
|
| - notePrefix = microdom.parseString('<strong>Note: </strong>').documentElement
|
| - for note in notes:
|
| - note.childNodes.insert(0, notePrefix)
|
| -
|
| -
|
| -
|
| -def compareMarkPos(a, b):
|
| - """
|
| - Perform in every way identically to L{cmp} for valid inputs.
|
| -
|
| - XXX - replace this with L{cmp}
|
| - """
|
| - linecmp = cmp(a[0], b[0])
|
| - if linecmp:
|
| - return linecmp
|
| - return cmp(a[1], b[1])
|
| -
|
| -
|
| -
|
| -def comparePosition(firstElement, secondElement):
|
| - """
|
| - Compare the two elements given by their position in the document or
|
| - documents they were parsed from.
|
| -
|
| - @type firstElement: C{twisted.web.microdom.Element}
|
| - @type secondElement: C{twisted.web.microdom.Element}
|
| -
|
| - @return: C{-1}, C{0}, or C{1}, with the same meanings as the return value
|
| - of L{cmp}.
|
| - """
|
| - return compareMarkPos(firstElement._markpos, secondElement._markpos)
|
| -
|
| -
|
| -
|
| -def findNodeJustBefore(target, nodes):
|
| - """
|
| - Find the node in C{nodes} which appeared immediately before C{target} in
|
| - the input document.
|
| -
|
| - @type target: L{twisted.web.microdom.Element}
|
| - @type nodes: C{list} of L{twisted.web.microdom.Element}
|
| - @return: An element from C{nodes}
|
| - """
|
| - result = None
|
| - for node in nodes:
|
| - if comparePosition(target, node) < 0:
|
| - return result
|
| - result = node
|
| - return result
|
| -
|
| -
|
| -
|
| -def getFirstAncestorWithSectionHeader(entry):
|
| - """
|
| - Visit the ancestors of C{entry} until one with at least one C{h2} child
|
| - node is found, then return all of that node's C{h2} child nodes.
|
| -
|
| - @type entry: A DOM Node
|
| - @param entry: The node from which to begin traversal. This node itself is
|
| - excluded from consideration.
|
| -
|
| - @rtype: C{list} of DOM Nodes
|
| - @return: All C{h2} nodes of the ultimately selected parent node.
|
| - """
|
| - for a in domhelpers.getParents(entry)[1:]:
|
| - headers = domhelpers.findNodesNamed(a, "h2")
|
| - if len(headers) > 0:
|
| - return headers
|
| - return []
|
| -
|
| -
|
| -
|
| -def getSectionNumber(header):
|
| - """
|
| - Retrieve the section number of the given node.
|
| -
|
| - @type header: A DOM Node or L{None}
|
| - @param header: The section from which to extract a number. The section
|
| - number is the value of this node's first child.
|
| -
|
| - @return: C{None} or a C{str} giving the section number.
|
| - """
|
| - if not header:
|
| - return None
|
| - return header.childNodes[0].value.strip()
|
| -
|
| -
|
| -
|
| -def getSectionReference(entry):
|
| - """
|
| - Find the section number which contains the given node.
|
| -
|
| - This function looks at the given node's ancestry until it finds a node
|
| - which defines a section, then returns that section's number.
|
| -
|
| - @type entry: A DOM Node
|
| - @param entry: The node for which to determine the section.
|
| -
|
| - @rtype: C{str}
|
| - @return: The section number, as returned by C{getSectionNumber} of the
|
| - first ancestor of C{entry} which defines a section, as determined by
|
| - L{getFirstAncestorWithSectionHeader}.
|
| - """
|
| - headers = getFirstAncestorWithSectionHeader(entry)
|
| - myHeader = findNodeJustBefore(entry, headers)
|
| - return getSectionNumber(myHeader)
|
| -
|
| -
|
| -
|
| -def index(document, filename, chapterReference):
|
| - """
|
| - Extract index entries from the given document and store them for later use
|
| - and insert named anchors so that the index can link back to those entries.
|
| -
|
| - Any node with a C{class} attribute set to C{index} is considered an index
|
| - entry.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @type filename: C{str}
|
| - @param filename: A link to the output for the given document which will be
|
| - included in the index to link to any index entry found here.
|
| -
|
| - @type chapterReference: ???
|
| - @param chapterReference: ???
|
| -
|
| - @return: C{None}
|
| - """
|
| - entries = domhelpers.findElementsWithAttribute(document, "class", "index")
|
| - if not entries:
|
| - return
|
| - i = 0;
|
| - for entry in entries:
|
| - i += 1
|
| - anchor = 'index%02d' % i
|
| - if chapterReference:
|
| - ref = getSectionReference(entry) or chapterReference
|
| - else:
|
| - ref = 'link'
|
| - indexer.addEntry(filename, anchor, entry.attributes['value'], ref)
|
| - # does nodeName even affect anything?
|
| - entry.nodeName = entry.tagName = entry.endTagName = 'a'
|
| - entry.attributes = InsensitiveDict({'name': anchor})
|
| -
|
| -
|
| -
|
| -def setIndexLink(template, indexFilename):
|
| - """
|
| - Insert a link to an index document.
|
| -
|
| - Any node with a C{class} attribute set to C{index-link} will have its tag
|
| - name changed to C{a} and its C{href} attribute set to C{indexFilename}.
|
| -
|
| - @type template: A DOM Node or Document
|
| - @param template: The output template which defines the presentation of the
|
| - version information.
|
| -
|
| - @type indexFilename: C{str}
|
| - @param indexFilename: The address of the index document to which to link.
|
| - If any C{False} value, this function will remove all index-link nodes.
|
| -
|
| - @return: C{None}
|
| - """
|
| - indexLinks = domhelpers.findElementsWithAttribute(template,
|
| - "class",
|
| - "index-link")
|
| - for link in indexLinks:
|
| - if indexFilename is None:
|
| - link.parentNode.removeChild(link)
|
| - else:
|
| - link.nodeName = link.tagName = link.endTagName = 'a'
|
| - link.attributes = InsensitiveDict({'href': indexFilename})
|
| -
|
| -
|
| -
|
| -def numberDocument(document, chapterNumber):
|
| - """
|
| - Number the sections of the given document.
|
| -
|
| - A dot-separated chapter, section number is added to the beginning of each
|
| - section, as defined by C{h2} nodes.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @type chapterNumber: C{int}
|
| - @param chapterNumber: The chapter number of this content in an overall
|
| - document.
|
| -
|
| - @return: C{None}
|
| - """
|
| - i = 1
|
| - for node in domhelpers.findNodesNamed(document, "h2"):
|
| - node.childNodes = [microdom.Text("%s.%d " % (chapterNumber, i))] + node.childNodes
|
| - i += 1
|
| -
|
| -
|
| -
|
| -def fixRelativeLinks(document, linkrel):
|
| - """
|
| - Replace relative links in C{str} and C{href} attributes with links relative
|
| - to C{linkrel}.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The output template.
|
| -
|
| - @type linkrel: C{str}
|
| - @param linkrel: An prefix to apply to all relative links in C{src} or
|
| - C{href} attributes in the input document when generating the output
|
| - document.
|
| - """
|
| - for attr in 'src', 'href':
|
| - for node in domhelpers.findElementsWithAttribute(document, attr):
|
| - href = node.getAttribute(attr)
|
| - if not href.startswith('http') and not href.startswith('/'):
|
| - node.setAttribute(attr, linkrel+node.getAttribute(attr))
|
| -
|
| -
|
| -
|
| -def setTitle(template, title, chapterNumber):
|
| - """
|
| - Add title and chapter number information to the template document.
|
| -
|
| - The title is added to the end of the first C{title} tag and the end of the
|
| - first tag with a C{class} attribute set to C{title}. If specified, the
|
| - chapter is inserted before the title.
|
| -
|
| - @type template: A DOM Node or Document
|
| - @param template: The output template which defines the presentation of the
|
| - version information.
|
| -
|
| - @type title: C{list} of DOM Nodes
|
| - @param title: Nodes from the input document defining its title.
|
| -
|
| - @type chapterNumber: C{int}
|
| - @param chapterNumber: The chapter number of this content in an overall
|
| - document. If not applicable, any C{False} value will result in this
|
| - information being omitted.
|
| -
|
| - @return: C{None}
|
| - """
|
| - for nodeList in (domhelpers.findNodesNamed(template, "title"),
|
| - domhelpers.findElementsWithAttribute(template, "class",
|
| - 'title')):
|
| - if nodeList:
|
| - if numberer.getNumberSections() and chapterNumber:
|
| - nodeList[0].childNodes.append(microdom.Text('%s. ' % chapterNumber))
|
| - nodeList[0].childNodes.extend(title)
|
| -
|
| -
|
| -
|
| -def setAuthors(template, authors):
|
| - """
|
| - Add author information to the template document.
|
| -
|
| - Names and contact information for authors are added to each node with a
|
| - C{class} attribute set to C{authors} and to the template head as C{link}
|
| - nodes.
|
| -
|
| - @type template: A DOM Node or Document
|
| - @param template: The output template which defines the presentation of the
|
| - version information.
|
| -
|
| - @type authors: C{list} of two-tuples of C{str}
|
| - @param authors: List of names and contact information for the authors of
|
| - the input document.
|
| -
|
| - @return: C{None}
|
| - """
|
| - # First, similarly to setTitle, insert text into an <div class="authors">
|
| - text = ''
|
| - for name, href in authors:
|
| - # FIXME: Do proper quoting/escaping (is it ok to use
|
| - # xml.sax.saxutils.{escape,quoteattr}?)
|
| - anchor = '<a href="%s">%s</a>' % (href, name)
|
| - if (name, href) == authors[-1]:
|
| - if len(authors) == 1:
|
| - text = anchor
|
| - else:
|
| - text += 'and ' + anchor
|
| - else:
|
| - text += anchor + ','
|
| -
|
| - childNodes = microdom.parseString('<span>' + text +'</span>').childNodes
|
| -
|
| - for node in domhelpers.findElementsWithAttribute(template,
|
| - "class", 'authors'):
|
| - node.childNodes.extend(childNodes)
|
| -
|
| - # Second, add appropriate <link rel="author" ...> tags to the <head>.
|
| - head = domhelpers.findNodesNamed(template, 'head')[0]
|
| - authors = [microdom.parseString('<link rel="author" href="%s" title="%s"/>'
|
| - % (href, name)).childNodes[0]
|
| - for name, href in authors]
|
| - head.childNodes.extend(authors)
|
| -
|
| -
|
| -
|
| -def setVersion(template, version):
|
| - """
|
| - Add a version indicator to the given template.
|
| -
|
| - @type template: A DOM Node or Document
|
| - @param template: The output template which defines the presentation of the
|
| - version information.
|
| -
|
| - @type version: C{str}
|
| - @param version: The version string to add to the template.
|
| -
|
| - @return: C{None}
|
| - """
|
| - for node in domhelpers.findElementsWithAttribute(template, "class",
|
| - "version"):
|
| - node.appendChild(microdom.Text(version))
|
| -
|
| -
|
| -
|
| -def getOutputFileName(originalFileName, outputExtension, index=None):
|
| - """
|
| - Return a filename which is the same as C{originalFileName} except for the
|
| - extension, which is replaced with C{outputExtension}.
|
| -
|
| - For example, if C{originalFileName} is C{'/foo/bar.baz'} and
|
| - C{outputExtension} is C{'quux'}, the return value will be
|
| - C{'/foo/bar.quux'}.
|
| -
|
| - @type originalFileName: C{str}
|
| - @type outputExtension: C{stR}
|
| - @param index: ignored, never passed.
|
| - @rtype: C{str}
|
| - """
|
| - return os.path.splitext(originalFileName)[0]+outputExtension
|
| -
|
| -
|
| -
|
| -def munge(document, template, linkrel, dir, fullpath, ext, url, config, outfileGenerator=getOutputFileName):
|
| - """
|
| - Mutate C{template} until it resembles C{document}.
|
| -
|
| - @type document: A DOM Node or Document
|
| - @param document: The input document which contains all of the content to be
|
| - presented.
|
| -
|
| - @type template: A DOM Node or Document
|
| - @param template: The template document which defines the desired
|
| - presentation format of the content.
|
| -
|
| - @type linkrel: C{str}
|
| - @param linkrel: An prefix to apply to all relative links in C{src} or
|
| - C{href} attributes in the input document when generating the output
|
| - document.
|
| -
|
| - @type dir: C{str}
|
| - @param dir: The directory in which to search for source listing files.
|
| -
|
| - @type fullpath: C{str}
|
| - @param fullpath: The file name which contained the input document.
|
| -
|
| - @type ext: C{str}
|
| - @param ext: The extension to use when selecting an output file name. This
|
| - replaces the extension of the input file name.
|
| -
|
| - @type url: C{str}
|
| - @param url: A string which will be interpolated with the fully qualified
|
| - Python name of any API reference encountered in the input document, the
|
| - result of which will be used as a link to API documentation for that name
|
| - in the output document.
|
| -
|
| - @type config: C{dict}
|
| - @param config: Further specification of the desired form of the output.
|
| - Valid keys in this dictionary::
|
| -
|
| - noapi: If present and set to a True value, links to API documentation
|
| - will not be generated.
|
| -
|
| - version: A string which will be included in the output to indicate the
|
| - version of this documentation.
|
| -
|
| - @type outfileGenerator: Callable of C{str}, C{str} returning C{str}
|
| - @param outfileGenerator: Output filename factory. This is invoked with the
|
| - intput filename and C{ext} and the output document is serialized to the
|
| - file with the name returned.
|
| -
|
| - @return: C{None}
|
| - """
|
| - fixRelativeLinks(template, linkrel)
|
| - addMtime(template, fullpath)
|
| - removeH1(document)
|
| - if not config.get('noapi', False):
|
| - fixAPI(document, url)
|
| - fontifyPython(document)
|
| - fixLinks(document, ext)
|
| - addPyListings(document, dir)
|
| - addHTMLListings(document, dir)
|
| - addPlainListings(document, dir)
|
| - putInToC(template, generateToC(document))
|
| - footnotes(document)
|
| - notes(document)
|
| -
|
| - setIndexLink(template, indexer.getIndexFilename())
|
| - setVersion(template, config.get('version', ''))
|
| -
|
| - # Insert the document into the template
|
| - chapterNumber = htmlbook.getNumber(fullpath)
|
| - title = domhelpers.findNodesNamed(document, 'title')[0].childNodes
|
| - setTitle(template, title, chapterNumber)
|
| - if numberer.getNumberSections() and chapterNumber:
|
| - numberDocument(document, chapterNumber)
|
| - index(document, outfileGenerator(os.path.split(fullpath)[1], ext),
|
| - htmlbook.getReference(fullpath))
|
| -
|
| - authors = domhelpers.findNodesNamed(document, 'link')
|
| - authors = [(node.getAttribute('title',''), node.getAttribute('href', ''))
|
| - for node in authors if node.getAttribute('rel', '') == 'author']
|
| - setAuthors(template, authors)
|
| -
|
| - body = domhelpers.findNodesNamed(document, "body")[0]
|
| - tmplbody = domhelpers.findElementsWithAttribute(template, "class",
|
| - "body")[0]
|
| - tmplbody.childNodes = body.childNodes
|
| - tmplbody.setAttribute("class", "content")
|
| -
|
| -
|
| -def parseFileAndReport(filename):
|
| - """
|
| - Parse and return the contents of the given lore XHTML document.
|
| -
|
| - @type filename: C{str}
|
| - @param filename: The name of a file containing a lore XHTML document to
|
| - load.
|
| -
|
| - @raise process.ProcessingFailure: When the contents of the specified file
|
| - cannot be parsed.
|
| -
|
| - @rtype: A DOM Document
|
| - @return: The document contained in C{filename}.
|
| - """
|
| - try:
|
| - return microdom.parse(open(filename))
|
| - except microdom.MismatchedTags, e:
|
| - raise process.ProcessingFailure(
|
| - "%s:%s: begin mismatched tags <%s>/</%s>" %
|
| - (e.begLine, e.begCol, e.got, e.expect),
|
| - "%s:%s: end mismatched tags <%s>/</%s>" %
|
| - (e.endLine, e.endCol, e.got, e.expect))
|
| - except microdom.ParseError, e:
|
| - raise process.ProcessingFailure("%s:%s:%s" % (e.line, e.col, e.message))
|
| - except IOError, e:
|
| - raise process.ProcessingFailure(e.strerror + ", filename was '" + filename + "'")
|
| -
|
| -def makeSureDirectoryExists(filename):
|
| - filename = os.path.abspath(filename)
|
| - dirname = os.path.dirname(filename)
|
| - if (not os.path.exists(dirname)):
|
| - os.makedirs(dirname)
|
| -
|
| -def doFile(filename, linkrel, ext, url, templ, options={}, outfileGenerator=getOutputFileName):
|
| - """
|
| - Process the input document at C{filename} and write an output document.
|
| -
|
| - @type filename: C{str}
|
| - @param filename: The path to the input file which will be processed.
|
| -
|
| - @type linkrel: C{str}
|
| - @param linkrel: An prefix to apply to all relative links in C{src} or
|
| - C{href} attributes in the input document when generating the output
|
| - document.
|
| -
|
| - @type ext: C{str}
|
| - @param ext: The extension to use when selecting an output file name. This
|
| - replaces the extension of the input file name.
|
| -
|
| - @type url: C{str}
|
| - @param url: A string which will be interpolated with the fully qualified
|
| - Python name of any API reference encountered in the input document, the
|
| - result of which will be used as a link to API documentation for that name
|
| - in the output document.
|
| -
|
| - @type templ: A DOM Node or Document
|
| - @param templ: The template on which the output document will be based.
|
| - This is mutated and then serialized to the output file.
|
| -
|
| - @type options: C{dict}
|
| - @param options: Further specification of the desired form of the output.
|
| - Valid keys in this dictionary::
|
| -
|
| - noapi: If present and set to a True value, links to API documentation
|
| - will not be generated.
|
| -
|
| - version: A string which will be included in the output to indicate the
|
| - version of this documentation.
|
| -
|
| - @type outfileGenerator: Callable of C{str}, C{str} returning C{str}
|
| - @param outfileGenerator: Output filename factory. This is invoked with the
|
| - intput filename and C{ext} and the output document is serialized to the
|
| - file with the name returned.
|
| -
|
| - @return: C{None}
|
| - """
|
| - doc = parseFileAndReport(filename)
|
| - clonedNode = templ.cloneNode(1)
|
| - munge(doc, clonedNode, linkrel, os.path.dirname(filename), filename, ext,
|
| - url, options, outfileGenerator)
|
| - newFilename = outfileGenerator(filename, ext)
|
| - makeSureDirectoryExists(newFilename)
|
| - clonedNode.writexml(open(newFilename, 'wb'))
|
|
|