171 lines
5.8 KiB
Python
171 lines
5.8 KiB
Python
|
import py
|
||
|
from py.__.misc.rest import convert_rest_html, strip_html_header
|
||
|
from py.__.misc.difftime import worded_time
|
||
|
from py.__.doc.conftest import get_apigenpath, get_docpath
|
||
|
from py.__.apigen.linker import relpath
|
||
|
|
||
|
html = py.xml.html
|
||
|
|
||
|
class Page(object):
|
||
|
doctype = ('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
|
||
|
' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\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.get_docpath()
|
||
|
return html.a(name, class_="menu",
|
||
|
href=relpath(self.targetpath.strpath,
|
||
|
docpath.join(relhtmlpath).strpath))
|
||
|
|
||
|
def a_apigenref(self, name, relhtmlpath):
|
||
|
apipath = get_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()
|
||
|
# string for url, path for local file
|
||
|
stylesheet = mydir.join('style.css')
|
||
|
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 get_content(self, txtpath, encoding):
|
||
|
return unicode(txtpath.read(), encoding)
|
||
|
|
||
|
def get_docpath(self):
|
||
|
return get_docpath()
|
||
|
|
||
|
def get_htmloutputpath(self, txtpath):
|
||
|
docpath = self.get_docpath()
|
||
|
reloutputpath = txtpath.new(ext='.html').relto(self.mydir)
|
||
|
return docpath.join(reloutputpath)
|
||
|
|
||
|
def process(self, txtpath):
|
||
|
encoding = self.encoding
|
||
|
content = self.get_content(txtpath, encoding)
|
||
|
docpath = self.get_docpath()
|
||
|
outputpath = self.get_htmloutputpath(txtpath)
|
||
|
|
||
|
stylesheet = self.stylesheet
|
||
|
if isinstance(self.stylesheet, py.path.local):
|
||
|
if not docpath.join(stylesheet.basename).check():
|
||
|
docpath.ensure(dir=True)
|
||
|
stylesheet.copy(docpath)
|
||
|
stylesheet = relpath(outputpath.strpath,
|
||
|
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))
|
||
|
|