# THIS IS A WORK IN PROGRESS # $Id$ # a pythondoc plugin for creating self-contained "documentation sites" # usage: # pythondoc -Odocsite import pythondoc ET = pythondoc.ElementTree FRAMESET = """\ """ # -------------------------------------------------------------------- # code to convert a PythonDoc infoset to microformatted HTML def fixobject(elem): # turn into
obj = elem.tag elem.tag = "div" if elem.find("div/div") is None: # ignore content-less nodes elem.clear() return elem.set("class", obj) if elem.get("lineno"): del elem.attrib["lineno"] if elem.get("filename"): del elem.attrib["filename"] name = elem.get("name") if name: elem.set("id", name) h3 = ET.Element("h3") h3.text = name elem.insert(0, h3) # prepend def fixinfo(elem): # turn descriptor into microformatted HTML elem.tag = "div" out = [] dl = ET.Element("dl") for e in elem: if e.tag == "def": e.tag = "p" e.set("class", "def") out.append(e) defreturn = elem.findtext("defreturn") if defreturn: text = u" \u21D2" + defreturn if e: e[-1].tail = (e[-1].tail or "") + text else: e.text = (e.text or "") + text elif e.tag == "description": e.tag = "div" e.set("class", "description") out.append(e) elif e.tag in ("param", "keyparam", "exception", "return"): s = ET.SubElement(dl, "dt") if e.tag == "return": s.text = "Returns:" else: s.text = e.get("name") del e.attrib["name"] s.set("class", e.tag) e.set("class", e.tag) e.tag = "dd" dl.append(e) if dl: out.append(dl) elem[:] = out TAGS = { "module": fixobject, "variable": fixobject, "function": fixobject, "class": fixobject, "method": fixobject, "attribute": fixobject, "info": fixinfo, } def fixup(elem): for e in elem: fixup(e) handler = TAGS.get(elem.tag) if handler: handler(elem) # -------------------------------------------------------------------- def cleanup(elem, filter): # from http://effbot.org/zone/element-bits-and-pieces.htm out = [] for e in elem: cleanup(e, filter) if not filter(e): if e.text: if out: out[-1].tail = (out[-1].tail or "") + e.text else: elem.text = (elem.text or "") + e.text out.extend(e) if e.tail: if out: out[-1].tail = (out[-1].tail or "") + e.tail else: elem.text = (elem.text or "") + e.tail else: out.append(e) elem[:] = out class PythonDocGenerator: def __init__(self, options): # FIXME: add options to control start page and style sheet self.modules = [] def save(self, elem, prefix): fixup(elem) cleanup(elem, lambda e: e.tag != "div" or e.attrib) outfile = prefix + ".html" title = elem.get("name") f = open(outfile, "w") ET.ElementTree(elem).write(f) f.close() self.modules.append((outfile, title)) return outfile def done(self): # index page f = open("index.html", "w") f.write(FRAMESET % self.modules[0][0]) f.close() print f.name, "ok" # contents page (to be extended) f = open("contents.html", "w") for module, title in self.modules: f.write("%s\n" % (module, title)) f.close() print f.name, "ok" return None