import py from py.__.misc.rest import convert_rest_html, strip_html_header from py.__.misc.difftime import worded_time from py.__.apigen.linker import relpath html = py.xml.html class Page(object): doctype = ('\n') def __init__(self, project, title, targetpath, stylesheeturl=None, type="text/html", encoding="ISO-8859-1"): self.project = project self.title = project.prefix_title + title self.targetpath = targetpath self.stylesheeturl = stylesheeturl self.type = type self.encoding = encoding self.body = html.body() self.head = html.head() self._root = html.html(self.head, self.body) self.fill() def a_docref(self, name, relhtmlpath): docpath = self.project.docpath return html.a(name, class_="menu", href=relpath(self.targetpath.strpath, docpath.join(relhtmlpath).strpath)) def a_apigenref(self, name, relhtmlpath): apipath = self.project.apigenpath return html.a(name, class_="menu", href=relpath(self.targetpath.strpath, apipath.join(relhtmlpath).strpath)) def fill_menubar(self): items = [ self.a_docref("index", "index.html"), self.a_apigenref("api", "api/index.html"), self.a_apigenref("source", "source/index.html"), self.a_docref("contact", "contact.html"), self.a_docref("download", "download.html"), ] items2 = [items.pop(0)] sep = " " for item in items: items2.append(sep) items2.append(item) self.menubar = html.div(id="menubar", *items2) def fill(self): content_type = "%s;charset=%s" %(self.type, self.encoding) self.head.append(html.title(self.title)) self.head.append(html.meta(name="Content-Type", content=content_type)) if self.stylesheeturl: self.head.append( html.link(href=self.stylesheeturl, media="screen", rel="stylesheet", type="text/css")) self.fill_menubar() self.metaspace = html.div( html.div(self.title, class_="project_title"), self.menubar, id='metaspace') self.body.append(self.project.logo) self.body.append(self.metaspace) self.contentspace = html.div(id="contentspace") self.body.append(self.contentspace) def unicode(self, doctype=True): page = self._root.unicode() if doctype: return self.doctype + page else: return page class PyPage(Page): def get_menubar(self): menubar = super(PyPage, self).get_menubar() # base layout menubar.append( html.a("issue", href="https://codespeak.net/issue/py-dev/", class_="menu"), ) return menubar def getrealname(username): try: import uconf except ImportError: return username try: user = uconf.system.User(username) except KeyboardInterrupt: raise try: return user.realname or username except KeyError: return username class Project: mydir = py.magic.autopath().dirpath() title = "py lib" prefix_title = "" # we have a logo already containing "py lib" encoding = 'latin1' logo = html.div( html.a( html.img(alt="py lib", id='pyimg', height=114, width=154, src="http://codespeak.net/img/pylib.png"), href="http://codespeak.net")) Page = PyPage def __init__(self, sourcepath=None): if sourcepath is None: sourcepath = self.mydir self.setpath(sourcepath) def setpath(self, sourcepath, docpath=None, apigenpath=None, stylesheet=None): self.sourcepath = sourcepath if docpath is None: docpath = sourcepath self.docpath = docpath if apigenpath is None: apigenpath = docpath self.apigenpath = apigenpath if stylesheet is None: p = sourcepath.join("style.css") if p.check(): self.stylesheet = p else: self.stylesheet = None else: p = py.path.local(stylesheet) if p.check(): stylesheet = p self.stylesheet = stylesheet self.apigen_relpath = relpath( self.docpath.strpath + '/', self.apigenpath.strpath + '/') def get_content(self, txtpath, encoding): return unicode(txtpath.read(), encoding) def get_htmloutputpath(self, txtpath): reloutputpath = txtpath.new(ext='.html').relto(self.sourcepath) return self.docpath.join(reloutputpath) def process(self, txtpath): encoding = self.encoding content = self.get_content(txtpath, encoding) outputpath = self.get_htmloutputpath(txtpath) stylesheet = self.stylesheet if isinstance(stylesheet, py.path.local): if not self.docpath.join(stylesheet.basename).check(): docpath.ensure(dir=True) stylesheet.copy(docpath) stylesheet = relpath(outputpath.strpath, self.docpath.join(stylesheet.basename).strpath) content = convert_rest_html(content, txtpath, stylesheet=stylesheet, encoding=encoding) content = strip_html_header(content, encoding=encoding) page = self.Page(self, "[%s] " % txtpath.purebasename, outputpath, stylesheeturl=stylesheet) try: svninfo = txtpath.info() modified = " modified %s by %s" % (worded_time(svninfo.mtime), getrealname(svninfo.last_author)) except (KeyboardInterrupt, SystemExit): raise except: modified = " " page.contentspace.append( html.div(html.div(modified, style="float: right; font-style: italic;"), id = 'docinfoline')) page.contentspace.append(py.xml.raw(content)) outputpath.ensure().write(page.unicode().encode(encoding))