diff --git a/py/apigen/html.py b/py/apigen/html.py new file mode 100644 index 000000000..9098a3bfa --- /dev/null +++ b/py/apigen/html.py @@ -0,0 +1,81 @@ + +from py.xml import html + +# HTML related stuff +class H(html): + class Content(html.div): + pass # style = html.Style(margin_left='15em') + + 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): + pass + + class MethodDescription(Description): + pass + + class MethodDef(html.h2): + pass + + class FunctionDescription(Description): + pass + + class FunctionDef(html.h2): + pass + + class ParameterDescription(html.div): + pass + + class Docstring(html.pre): + style = html.Style(width='100%') + 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): + pass + + class BaseDescription(html.a): + pass + + class SourceDef(html.div): + pass + + class NonPythonSource(html.pre): + pass # style = html.Style(margin_left='15em') + + class DirList(html.div): + pass # style = html.Style(margin_left='15em') + + class DirListItem(html.div): + pass + + class ValueDescList(html.ul): + def __init__(self, *args, **kwargs): + super(H.ValueDescList, self).__init__(*args, **kwargs) + + class ValueDescItem(html.li): + pass + + class CallStackDescription(Description): + pass + + class CallStackItem(html.div): + class_ = 'callstackitem' + diff --git a/py/apigen/htmlgen.py b/py/apigen/htmlgen.py index 866084dc2..d386c8c2a 100644 --- a/py/apigen/htmlgen.py +++ b/py/apigen/htmlgen.py @@ -8,6 +8,7 @@ from py.__.apigen.source import color as source_color from py.__.apigen.tracer.description import is_private from py.__.apigen.rest.genrest import split_of_last_part from py.__.apigen.linker import relpath +from py.__.apigen.html import H sorted = py.builtin.sorted html = py.xml.html @@ -45,83 +46,6 @@ def deindent(str, linesep='\n'): ret.append(line[deindent:]) return '%s\n' % (linesep.join(ret),) -# HTML related stuff -class H(html): - class Content(html.div): - style = html.Style(margin_left='15em') - - 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): - pass - - class MethodDescription(Description): - pass - - class MethodDef(html.h2): - pass - - class FunctionDescription(Description): - pass - - class FunctionDef(html.h2): - pass - - class ParameterDescription(html.div): - pass - - class Docstring(html.pre): - #style = html.Style(white_space='pre', min_height='3em') - pass - - class Navigation(html.div): - style = html.Style(min_height='99%', float='left', margin_top='1.2em', - overflow='auto', width='15em', white_space='nowrap') - - class NavigationItem(html.div): - pass - - class BaseDescription(html.a): - pass - - class SourceDef(html.div): - pass - - class NonPythonSource(html.pre): - style = html.Style(margin_left='15em') - - class DirList(html.div): - style = html.Style(margin_left='15em') - - class DirListItem(html.div): - pass - - class ValueDescList(html.ul): - def __init__(self, *args, **kwargs): - super(H.ValueDescList, self).__init__(*args, **kwargs) - - class ValueDescItem(html.li): - pass - - class CallStackDescription(Description): - pass - - class CallStackItem(html.div): - class_ = 'callstackitem' - def get_param_htmldesc(linker, func): """ get the html for the parameters of a function """ import inspect @@ -174,18 +98,11 @@ def create_namespace_tree(dotted_names): ret[ns].append(itempath) return ret -def wrap_page(project, title, contentel, navel, outputpath, stylesheeturl, - scripturls): +def wrap_page(project, title, contentel, navel, relbase, basepath): page = LayoutPage(project, title, nav=navel, encoding='UTF-8', - stylesheeturl=stylesheeturl, scripturls=scripturls) + relpath=relbase) page.set_content(contentel) - here = py.magic.autopath().dirpath() - style = here.join(stylesheeturl.split('/')[-1]).read() - outputpath.join(stylesheeturl.split('/')[-1]).write(style) - for spath in scripturls: - sname = spath.split('/')[-1] - sdata = here.join(sname).read() - outputpath.join(sname).write(sdata) + page.setup_scripts_styles(basepath) return page # the PageBuilder classes take care of producing the docs (using the stuff @@ -193,12 +110,9 @@ def wrap_page(project, title, contentel, navel, outputpath, stylesheeturl, class AbstractPageBuilder(object): def write_page(self, title, reltargetpath, project, tag, nav): targetpath = self.base.join(reltargetpath) - stylesheeturl = relpath('%s%s' % (targetpath.dirpath(), os.path.sep), - self.base.join('style.css').strpath) - scripturls = [relpath('%s%s' % (targetpath.dirpath(), os.path.sep), - self.base.join('api.js').strpath)] - page = wrap_page(project, title, - tag, nav, self.base, stylesheeturl, scripturls) + relbase= relpath('%s%s' % (targetpath.dirpath(), targetpath.sep), + self.base.strpath + '/') + page = wrap_page(project, title, tag, nav, relbase, self.base) content = self.linker.call_withbase(reltargetpath, page.unicode) targetpath.ensure() targetpath.write(content.encode("utf8")) @@ -212,7 +126,7 @@ class SourcePageBuilder(AbstractPageBuilder): self.capture = capture def build_navigation(self, fspath): - nav = H.Navigation() + nav = H.Navigation(class_='sidebar') relpath = fspath.relto(self.projroot) path = relpath.split(os.path.sep) indent = 0 @@ -613,40 +527,7 @@ class ApiPageBuilder(AbstractPageBuilder): return navitems navitems += build_nav_level(dotted_name) - return H.Navigation(*navitems) - - - - navitems = [] - - # top namespace, index.html - module_name = self.dsa.get_module_name().split('/')[-1] - navitems.append(build_navitem_html(self.linker, module_name, '', 0, - (selection == ''))) - - indent = 1 - path = dotted_name.split('.') - if dotted_name != '': - # build html for each item in path to dotted_name item - for i in xrange(len(path)): - name = path[i] - item_dotted_name = '.'.join(path[:i+1]) - selected = (selection == item_dotted_name) - navitems.append(build_navitem_html(self.linker, name, - item_dotted_name, indent, - selected)) - indent += 1 - - # build sub items of dotted_name item - for item_dotted_name in py.builtin.sorted(item_dotted_names): - itemname = item_dotted_name.split('.')[-1] - if is_private(itemname): - continue - selected = (item_dotted_name == selection) - navitems.append(build_navitem_html(self.linker, itemname, - item_dotted_name, indent, - selected)) - return H.Navigation(*navitems) + return H.Navigation(class_='sidebar', *navitems) def build_callable_signature_description(self, dotted_name): args, retval = self.dsa.get_function_signature(dotted_name) diff --git a/py/apigen/layout.py b/py/apigen/layout.py index dc1a705f1..d0934c124 100644 --- a/py/apigen/layout.py +++ b/py/apigen/layout.py @@ -4,14 +4,19 @@ """ import py -from py.__.doc.confrest import Page +from py.__.doc import confrest +from py.__.apigen import linker -class LayoutPage(Page): +class LayoutPage(confrest.PyPage): """ this provides the layout and style information """ + stylesheets = [(py.path.local('../doc/style.css'), 'style.css'), + (py.path.local('style.css'), 'apigen_style.css')] + scripts = [(py.path.local('api.js'), 'api.js')] + def __init__(self, *args, **kwargs): self.nav = kwargs.pop('nav') - self.scripturls = kwargs.pop('scripturls', []) + self.relpath = kwargs.pop('relpath') super(LayoutPage, self).__init__(*args, **kwargs) def set_content(self, contentel): @@ -19,9 +24,19 @@ class LayoutPage(Page): def fill(self): super(LayoutPage, self).fill() - self.menubar[:] = [] - self.menubar.append(self.nav) - for scripturl in self.scripturls: - self.head.append(py.xml.html.script(type="text/javascript", - src=scripturl)) + #self.menubar[:] = [] + self.body.insert(0, self.nav) + + def setup_scripts_styles(self, copyto=None): + for path, name in self.stylesheets: + if copyto: + copyto.join(name).write(path.read()) + self.head.append(py.xml.html.link(type='text/css', + rel='stylesheet', + href=self.relpath + name)) + for path, name in self.scripts: + if copyto: + copyto.join(name).write(path.read()) + self.head.append(py.xml.html.script(type="text/javascript", + src=self.relpath + name)) diff --git a/py/apigen/style.css b/py/apigen/style.css index 4c9f5669e..b84c5b5e8 100644 --- a/py/apigen/style.css +++ b/py/apigen/style.css @@ -1,12 +1,18 @@ -#sidebar { - width: 9em; - float: left; +div.sidebar { + font-family: Verdana, Helvetica, Arial, sans-serif; + width: 155px; vertical-align: top; margin-top: 0.5em; + position: absolute; + top: 130px; + left: 4px; + bottom: 4px; + overflow: auto; } -#main { - margin-left: 10em; +div.sidebar .selected a { + color: white; + background-color: #3ba6ec; } #content { @@ -15,47 +21,6 @@ width: 100%; } -#breadcrumb { - height: 5%; - display: none; -} - -#logo { - /* float: left; */ -} - -#logo img { - border-width: 0px; -} - -#menubar a { - text-decoration: none; - color: blue; -} - -#menubar div.selected a { - color: purple; -} - -.project_title { - font-size: 2em; - font-weight: bold; -} - -body { - background-color: #FFE; - color: black; -} - -body, div, p, h1, h2, h3, h4 { - font-family: Trebuchet MS, Verdana, Arial; -} - -a { - color: #006; - text-decoration: none; -} - ul { padding-left: 0em; margin-top: 0px; @@ -71,10 +36,6 @@ ul li { text-decoration: none; } -a:hover { - color: #005; -} - .lineno { text-align: right; color: #555; diff --git a/py/apigen/testing/test_apigen_example.py b/py/apigen/testing/test_apigen_example.py index d7639e093..3ed757029 100644 --- a/py/apigen/testing/test_apigen_example.py +++ b/py/apigen/testing/test_apigen_example.py @@ -204,6 +204,7 @@ class TestApiPageBuilder(AbstractBuilderTest): print html run_string_sequence_test(html, [ 'href="../style.css"', + 'href="../apigen_style.css"', 'src="../api.js"', 'href="index.html">pkg', 'href="main.html">main',