1 # -*- coding: utf-8 -*-
3 import sphinx.environment
4 from sphinx.builders.html import StandaloneHTMLBuilder
5 from sphinx.writers.html import HTMLTranslator
6 from docutils.writers.html4css1 import HTMLTranslator as DocutilsTranslator
9 # navify toctree (oh god)
10 @monkey(sphinx.environment.BuildEnvironment)
11 def resolve_toctree(old_resolve, self, *args, **kwargs):
12 """ If main_navbar, bootstrapify TOC to yield a navbar
15 main_navbar = kwargs.pop('main_navbar', False)
16 toc = old_resolve(self, *args, **kwargs)
24 @monkey(StandaloneHTMLBuilder)
25 def _get_local_toctree(old_local, self, *args, **kwargs):
26 """ _get_local_toctree generates a documentation toctree for the local
27 document (?), called from handle_page
29 return old_local(self, *args, main_navbar=True, **kwargs)
31 # monkeypatch visit_table to remove border and add .table
32 HTMLTranslator.visit_table = visit_table
33 # disable colspec crap
34 HTMLTranslator.write_colspecs = lambda self: None
35 # copy data- attributes straight from source to dest
36 HTMLTranslator.starttag = starttag_data
39 # add classes to toplevel
40 node['classes'].extend(['nav', 'navbar-nav', 'navbar-right'])
41 for list_item in node.children:
50 list_item['classes'].append('dropdown')
51 # list_item.compact_paragraph.reference
52 link = list_item.children[0].children[0]
53 link['classes'].append('dropdown-toggle')
54 link.attributes['data-toggle'] = 'dropdown'
55 # list_item.bullet_list
56 list_item.children[1]['classes'].append('dropdown-menu')
58 def visit_table(self, node):
63 self._table_row_index = 0
64 self.context.append(self.compact_p)
66 classes = ' '.join({'table', self.settings.table_style}).strip()
67 self.body.append(self.starttag(node, 'table', CLASS=classes))
69 def starttag_data(self, node, tagname, suffix='\n', empty=False, **attributes):
71 (k, v) for k, v in node.attributes.iteritems()
72 if k.startswith('data-')
75 return DocutilsTranslator.starttag(
76 self, node, tagname, suffix=suffix, empty=empty, **attributes)
79 def __init__(self, obj):
81 def __call__(self, fn):
83 old = getattr(self.obj, name)
84 setattr(self.obj, name, lambda self_, *args, **kwargs: \
85 fn(old, self_, *args, **kwargs))