diff --git a/py/apigen/htmlgen.py b/py/apigen/htmlgen.py
index 26012e8b9..90c0a49bd 100644
--- a/py/apigen/htmlgen.py
+++ b/py/apigen/htmlgen.py
@@ -332,6 +332,20 @@ class SourcePageBuilder(AbstractPageBuilder):
reltargetpath = outputpath.relto(self.base).replace(os.path.sep, '/')
self.write_page(title, reltargetpath, project, tag, nav)
+def enumerate_and_color(codelines, firstlineno, enc):
+ tokenizer = source_color.Tokenizer(source_color.PythonSchema)
+ colored = []
+ for i, line in enumerate(codelines):
+ try:
+ colored.append(H.span('%04s: ' % (i + firstlineno + 1)))
+ colored.append(source_html.prepare_line([line], tokenizer, enc))
+ colored.append('\n')
+ except py.error.ENOENT:
+ # error reading source code, giving up
+ colored = org
+ break
+ return colored
+
class ApiPageBuilder(AbstractPageBuilder):
""" builds the html for an api docs page """
def __init__(self, base, linker, dsa, projroot, namespace_tree):
@@ -359,19 +373,17 @@ class ApiPageBuilder(AbstractPageBuilder):
is_in_pkg = self.is_in_pkg(sourcefile)
if sourcefile and callable_source:
enc = source_html.get_module_encoding(sourcefile)
+ tokenizer = source_color.Tokenizer(source_color.PythonSchema)
+ firstlineno = func.func_code.co_firstlineno
+ org = callable_source.split('\n')
+ colored = enumerate_and_color(org, firstlineno, enc)
if is_in_pkg:
- csource = H.div(H.br(),
- H.a('source: %s' % (sourcefile,),
- href=self.linker.get_lazyhref(sourcefile)),
- H.br(),
- H.SourceDef(H.pre(unicode(callable_source,
- enc))))
- elif not is_in_pkg:
- csource = H.div(H.br(),
- H.em('source: %s' % (sourcefile,)),
- H.br(),
- H.SourceDef(H.pre(unicode(callable_source,
- enc))))
+ slink = H.a('source: %s' % (sourcefile,),
+ href=self.linker.get_lazyhref(sourcefile))
+ else:
+ slink = H.em('source: %s' % (sourcefile,))
+ csource = H.div(H.br(), slink, H.br(),
+ H.SourceDef(H.div(class_='code', *colored)))
else:
csource = H.SourceDef('could not get source file')
@@ -465,8 +477,6 @@ class ApiPageBuilder(AbstractPageBuilder):
H.Docstring(docstring or '*no docstring available*')
)
for dotted_name in sorted(item_dotted_names):
- if dotted_name.startswith('_'):
- continue
itemname = dotted_name.split('.')[-1]
if is_private(itemname):
continue
@@ -583,9 +593,11 @@ class ApiPageBuilder(AbstractPageBuilder):
for dn in sorted(siblings):
selected = dn == '.'.join(path)
sibpath = dn.split('.')
- navitems.append(build_navitem_html(self.linker, sibpath[-1],
- dn, depth,
- selected))
+ sibname = sibpath[-1]
+ if is_private(sibname):
+ continue
+ navitems.append(build_navitem_html(self.linker, sibname,
+ dn, depth, selected))
if selected:
lastlevel = dn.count('.') == dotted_name.count('.')
if not lastlevel:
@@ -723,17 +735,7 @@ class ApiPageBuilder(AbstractPageBuilder):
else:
enc = 'latin-1'
sourcelink = H.div(linktext)
- colored = []
- for i, line in enumerate(mangled):
- try:
- colored.append(H.span('%02s: ' %
- (i + frame.firstlineno + 1)))
- colored.append(source_html.prepare_line(
- [line], tokenizer, enc))
- colored.append('\n')
- except py.error.ENOENT:
- colored = mangled
- break
+ colored = enumerate_and_color(mangled, frame.firstlineno, enc)
else:
sourcelink = H.div('source unknown')
tbdiv.append(sourcelink)
diff --git a/py/apigen/style.css b/py/apigen/style.css
index c0c70f27a..4c9f5669e 100644
--- a/py/apigen/style.css
+++ b/py/apigen/style.css
@@ -88,6 +88,8 @@ a:hover {
padding-left: 1em;
white-space: pre;
font-family: monospace, Monaco;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
}
.comment {
diff --git a/py/apigen/testing/test_apigen_example.py b/py/apigen/testing/test_apigen_example.py
index 5996b1d18..fb5cf68bc 100644
--- a/py/apigen/testing/test_apigen_example.py
+++ b/py/apigen/testing/test_apigen_example.py
@@ -63,6 +63,7 @@ def setup_fs_project():
'main.SomeSubClass': ('./somesubclass.py', 'SomeSubClass'),
'main.SomeSubClass': ('./somesubclass.py', 'SomeSubClass'),
'other': ('./somenamespace.py', '*'),
+ '_test': ('./somenamespace.py', '*'),
})
"""))
return temp, 'pkg'
@@ -114,7 +115,8 @@ class AbstractBuilderTest(object):
'main.SomeSubClass',
'main.SomeInstance',
'other.foo',
- 'other.bar'])
+ 'other.bar',
+ '_test'])
self.namespace_tree = namespace_tree
self.apb = ApiPageBuilder(base, linker, self.dsa,
self.fs_root.join(self.pkg_name),
@@ -195,6 +197,7 @@ class TestApiPageBuilder(AbstractBuilderTest):
def test_build_class_pages_nav_links(self):
data = self.apb.prepare_class_pages(['main.SomeSubClass',
'main.SomeClass'])
+ self.apb.prepare_namespace_pages()
# fake some stuff that would be built from other methods
self.linker.set_link('', 'api/index.html')
self.linker.set_link('main', 'api/main.html')
@@ -211,8 +214,8 @@ class TestApiPageBuilder(AbstractBuilderTest):
'href="main.SomeClass.html">SomeClass',
'href="main.SomeSubClass.html">SomeSubClass',
])
- assert not 'href="main.sub.func.html"' in html
- py.test.skip('WOP from here')
+ assert 'href="main.sub.func.html"' not in html
+ assert 'href="_test' not in html
assert 'href="main.sub.html">sub' in html
_checkhtml(html)