[ADD] doc: new documentation, with training tutorials, and new scaffolding
[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         if main_navbar:
21             navbarify(toc[0])
22         return toc
23
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
28         """
29         return old_local(self, *args, main_navbar=True, **kwargs)
30
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
37
38 def navbarify(node):
39     # add classes to toplevel
40     node['classes'].extend(['nav', 'navbar-nav', 'navbar-right'])
41     for list_item in node.children:
42         # bullet_list
43         #     list_item
44         #         compact_paragraph
45         #             reference
46         #         bullet_list
47         #             list_item
48         #                 compact_paragraph
49         #                     reference
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')
57
58 def visit_table(self, node):
59     """
60     * remove border
61     * add table class
62     """
63     self._table_row_index = 0
64     self.context.append(self.compact_p)
65     self.compact_p = True
66     classes = ' '.join({'table', self.settings.table_style}).strip()
67     self.body.append(self.starttag(node, 'table', CLASS=classes))
68
69 def starttag_data(self, node, tagname, suffix='\n', empty=False, **attributes):
70     attributes.update(
71         (k, v) for k, v in node.attributes.iteritems()
72         if k.startswith('data-')
73     )
74     # oh dear
75     return DocutilsTranslator.starttag(
76         self, node, tagname, suffix=suffix, empty=empty, **attributes)
77
78 class monkey(object):
79     def __init__(self, obj):
80         self.obj = obj
81     def __call__(self, fn):
82         name = fn.__name__
83         old = getattr(self.obj, name)
84         setattr(self.obj, name, lambda self_, *args, **kwargs: \
85                 fn(old, self_, *args, **kwargs))