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)
20 navbarify(toc[0], main_navbar=main_navbar)
23 @monkey(StandaloneHTMLBuilder)
24 def _get_local_toctree(old_local, self, *args, **kwargs):
25 """ _get_local_toctree generates a documentation toctree for the local
26 document (?), called from handle_page
28 # so can call toctree(main_navbar=False)
29 d = {'main_navbar': True}
31 return old_local(self, *args, **d)
33 # monkeypatch visit_table to remove border and add .table
34 HTMLTranslator.visit_table = visit_table
35 # disable colspec crap
36 HTMLTranslator.write_colspecs = lambda self: None
37 # copy data- attributes straight from source to dest
38 HTMLTranslator.starttag = starttag_data
40 def navbarify(node, main_navbar=False):
41 # add classes to toplevel
45 node['classes'].extend(['nav', 'navbar-nav', 'navbar-right'])
46 for list_item in node.children:
55 list_item['classes'].append('dropdown')
56 # list_item.compact_paragraph.reference
57 link = list_item.children[0].children[0]
58 link['classes'].append('dropdown-toggle')
59 link.attributes['data-toggle'] = 'dropdown'
60 # list_item.bullet_list
61 list_item.children[1]['classes'].append('dropdown-menu')
64 if node.tagname == 'bullet_list':
65 node['classes'].append('nav')
68 def visit_table(self, node):
73 self._table_row_index = 0
74 self.context.append(self.compact_p)
76 classes = ' '.join({'table', self.settings.table_style}).strip()
77 self.body.append(self.starttag(node, 'table', CLASS=classes))
79 def starttag_data(self, node, tagname, suffix='\n', empty=False, **attributes):
81 (k, v) for k, v in node.attributes.iteritems()
82 if k.startswith('data-')
85 return DocutilsTranslator.starttag(
86 self, node, tagname, suffix=suffix, empty=empty, **attributes)
89 def __init__(self, obj):
91 def __call__(self, fn):
93 old = getattr(self.obj, name)
94 setattr(self.obj, name, lambda self_, *args, **kwargs: \
95 fn(old, self_, *args, **kwargs))