[IMP] display sibling documents in affixed menu
[odoo/odoo.git] / doc / _themes / odoodoc / sphinx_monkeypatch.py
1 # -*- coding: utf-8 -*-
2 import sphinx.roles
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
7
8 def patch():
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
13
14         """
15         main_navbar = kwargs.pop('main_navbar', False)
16         toc = old_resolve(self, *args, **kwargs)
17         if toc is None:
18             return None
19
20         navbarify(toc[0], main_navbar=main_navbar)
21         return toc
22
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
27         """
28         # so can call toctree(main_navbar=False)
29         d = {'main_navbar': True}
30         d.update(kwargs)
31         return old_local(self, *args, **d)
32
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
39
40 def navbarify(node, main_navbar=False):
41     # add classes to toplevel
42     if not main_navbar:
43         navify([node])
44     else:
45         node['classes'].extend(['nav', 'navbar-nav', 'navbar-right'])
46         for list_item in node.children:
47             # bullet_list
48             #     list_item
49             #         compact_paragraph
50             #             reference
51             #         bullet_list
52             #             list_item
53             #                 compact_paragraph
54             #                     reference
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')
62 def navify(nodes):
63     for node in nodes:
64         if node.tagname == 'bullet_list':
65             node['classes'].append('nav')
66         navify(node.children)
67
68 def visit_table(self, node):
69     """
70     * remove border
71     * add table class
72     """
73     self._table_row_index = 0
74     self.context.append(self.compact_p)
75     self.compact_p = True
76     classes = ' '.join({'table', self.settings.table_style}).strip()
77     self.body.append(self.starttag(node, 'table', CLASS=classes))
78
79 def starttag_data(self, node, tagname, suffix='\n', empty=False, **attributes):
80     attributes.update(
81         (k, v) for k, v in node.attributes.iteritems()
82         if k.startswith('data-')
83     )
84     # oh dear
85     return DocutilsTranslator.starttag(
86         self, node, tagname, suffix=suffix, empty=empty, **attributes)
87
88 class monkey(object):
89     def __init__(self, obj):
90         self.obj = obj
91     def __call__(self, fn):
92         name = fn.__name__
93         old = getattr(self.obj, name)
94         setattr(self.obj, name, lambda self_, *args, **kwargs: \
95                 fn(old, self_, *args, **kwargs))