94e063e1f44bf3a231d131663c78fc80f9959786
[odoo/odoo.git] / doc / _themes / odoodoc / sphinx_monkeypatch.py
1 # -*- coding: utf-8 -*-
2 import sphinx.roles
3 import sphinx.environment
4 from sphinx.writers.html import HTMLTranslator
5 from docutils.writers.html4css1 import HTMLTranslator as DocutilsTranslator
6
7 def patch():
8     # navify toctree (oh god)
9     @monkey(sphinx.environment.BuildEnvironment)
10     def resolve_toctree(old_resolve, self, *args, **kwargs):
11         """ If navbar, bootstrapify TOC to yield a navbar
12
13         """
14         navbar = kwargs.pop('navbar', None)
15         toc = old_resolve(self, *args, **kwargs)
16         if toc is None:
17             return None
18
19         navbarify(toc[0], navbar=navbar)
20         return toc
21
22     # monkeypatch visit_table to remove border and add .table
23     HTMLTranslator.visit_table = visit_table
24     # disable colspec crap
25     HTMLTranslator.write_colspecs = lambda self: None
26     # copy data- attributes straight from source to dest
27     HTMLTranslator.starttag = starttag_data
28
29 def navbarify(node, navbar=None):
30     """
31     :param node: toctree node to navbarify
32     :param navbar: Whether this toctree is a 'main' navbar, a 'side' navbar or
33                    not a navbar at all
34     """
35     if navbar == 'side':
36         for n in node.traverse():
37             if n.tagname == 'bullet_list':
38                 n['classes'].append('nav')
39     elif navbar == 'main':
40         # add classes to just toplevel
41         node['classes'].extend(['nav', 'navbar-nav', 'navbar-right'])
42         for list_item in node.children:
43             # bullet_list
44             #     list_item
45             #         compact_paragraph
46             #             reference
47             #         bullet_list
48             #             list_item
49             #                 compact_paragraph
50             #                     reference
51             list_item['classes'].append('dropdown')
52             # list_item.compact_paragraph.reference
53             link = list_item.children[0].children[0]
54             link['classes'].append('dropdown-toggle')
55             link.attributes['data-toggle'] = 'dropdown'
56             # list_item.bullet_list
57             list_item.children[1]['classes'].append('dropdown-menu')
58
59 def visit_table(self, node):
60     """
61     * remove border
62     * add table class
63     """
64     self._table_row_index = 0
65     self.context.append(self.compact_p)
66     self.compact_p = True
67     classes = ' '.join({'table', self.settings.table_style}).strip()
68     self.body.append(self.starttag(node, 'table', CLASS=classes))
69
70 def starttag_data(self, node, tagname, suffix='\n', empty=False, **attributes):
71     attributes.update(
72         (k, v) for k, v in node.attributes.iteritems()
73         if k.startswith('data-')
74     )
75     # oh dear
76     return DocutilsTranslator.starttag(
77         self, node, tagname, suffix=suffix, empty=empty, **attributes)
78
79 class monkey(object):
80     def __init__(self, obj):
81         self.obj = obj
82     def __call__(self, fn):
83         name = fn.__name__
84         old = getattr(self.obj, name)
85         setattr(self.obj, name, lambda self_, *args, **kwargs: \
86                 fn(old, self_, *args, **kwargs))