from py.xml import html
# HTML related stuff
class H(html):
class Content(html.div):
def __init__(self, *args):
super(H.Content, self).__init__(id='apigen-content', *args)
class Description(html.div):
pass
class NamespaceDescription(Description):
pass
class NamespaceItem(html.div):
pass
class NamespaceDef(html.h1):
pass
class ClassDescription(Description):
pass
class ClassDef(html.h1):
def __init__(self, classname, bases, docstring, sourcelink,
properties, methods):
super(H.ClassDef, self).__init__('class %s(' % classname,)
for name, href in bases:
link = name
if href is not None:
link = H.a(name, href=href)
self.append(H.BaseDescription(link))
self.append('):')
self.append(H.div(H.Docstring(docstring or
'*no docstring available*'),
sourcelink,
class_='classdoc'))
if properties:
self.append(H.h2('properties:'))
for name, val in properties:
self.append(H.PropertyDescription(name, val))
if methods:
self.append(H.h2('methods:'))
for methodhtml in methods:
self.append(methodhtml)
class MethodDescription(Description):
pass
class MethodDef(html.h2):
pass
class FunctionDescription(Description):
def __init__(self, localname, argdesc, docstring, valuedesc, csource,
callstack):
fd = H.FunctionDef(localname, argdesc)
ds = H.Docstring(docstring or '*no docstring available*')
fi = H.FunctionInfo(valuedesc, csource, callstack)
super(H.FunctionDescription, self).__init__(fd, ds, fi)
class FunctionDef(html.h2):
def __init__(self, name, argdesc):
super(H.FunctionDef, self).__init__('def %s%s:' % (name, argdesc))
class FunctionInfo(html.div):
def __init__(self, valuedesc, csource, callstack):
super(H.FunctionInfo, self).__init__(
H.Hideable('funcinfo', 'funcinfo', valuedesc, H.br(), csource,
callstack))
class PropertyDescription(html.div):
def __init__(self, name, value):
if type(value) not in [str, unicode]:
value = str(value)
if len(value) > 100:
value = value[:100] + '...'
super(H.PropertyDescription, self).__init__(name, ': ',
H.em(value),
class_='property')
class ParameterDescription(html.div):
pass
class Docstring(html.pre):
pass
class Navigation(html.div):
#style = html.Style(min_height='99%', float='left', margin_top='1.2em',
# overflow='auto', width='15em', white_space='nowrap')
pass
class NavigationItem(html.div):
def __init__(self, linker, linkid, name, indent, selected):
href = linker.get_lazyhref(linkid)
super(H.NavigationItem, self).__init__((indent * 2 * u'\xa0'),
H.a(name, href=href))
if selected:
self.attr.class_ = 'selected'
class BaseDescription(html.a):
pass
class SourceSnippet(html.div):
def __init__(self, text, href, sourceels=None):
if sourceels is None:
sourceels = []
link = text
if href:
link = H.a(text, href=href)
super(H.SourceSnippet, self).__init__(
link, H.div(*sourceels))
class SourceDef(html.div):
def __init__(self, *sourceels):
super(H.SourceDef, self).__init__(
H.div(*sourceels))
class SourceCode(html.div):
style = html.Style(margin_top='1em', margin_bottom='1em')
def __init__(self):
self.linenotable = lntable = H.table(style='float: left')
self.linenotbody = lntbody = H.tbody()
lntable.append(lntbody)
self.linetable = ltable = H.table()
self.linetbody = ltbody = H.tbody()
ltable.append(ltbody)
super(H.SourceCode, self).__init__(lntable, ltable)
def add_line(self, lineno, els):
if els == []:
els = [u'\xa0']
self.linenotbody.append(H.tr(H.td(lineno, class_='lineno')))
self.linetbody.append(H.tr(H.td(class_='code', *els)))
class NonPythonSource(html.pre):
pass # style = html.Style(margin_left='15em')
class DirList(html.div):
def __init__(self, dirs, files):
dirs = [H.DirListItem(text, href) for (text, href) in dirs]
files = [H.DirListItem(text, href) for (text, href) in files]
super(H.DirList, self).__init__(
H.h2('directories'), dirs,
H.h2('files'), files,
)
class DirListItem(html.div):
def __init__(self, text, href):
super(H.DirListItem, self).__init__(H.a(text, href=href))
class ValueDescList(html.ul):
def __init__(self, *args, **kwargs):
super(H.ValueDescList, self).__init__(*args, **kwargs)
class ValueDescItem(html.li):
pass
class CallStackDescription(Description):
def __init__(self, callstackdiv):
super(H.CallStackDescription, self).__init__(
H.Hideable('callsites', 'callsites', csdiv))
class CallStackItem(html.div):
def __init__(self, filename, lineno, traceback):
super(H.CallStackItem, self).__init__(
H.Hideable("stack trace %s - line %s" % (filename, lineno),
'callstackitem', traceback))
class Hideable(html.div):
def __init__(self, name, class_, *content):
super(H.Hideable, self).__init__(
H.div(H.a('show/hide %s' % (name,),
href='#',
onclick=('showhideel(getnextsibling(this));'
'return false;')),
H.div(style='display: none',
class_=class_,
*content)))