[EXT][DIFF] Use dev doc odoo theme ext ?

Analyze conflicts and resolve
This commit is contained in:
Victor Feyens 2020-09-24 16:23:16 +02:00
parent f6d651d2db
commit 6fcd48070a
14 changed files with 114 additions and 144 deletions

View File

@ -1,8 +1,8 @@
import inspect import inspect
import importlib import importlib
import os.path import os.path
import werkzeug
from werkzeug import urls
""" """
* adds github_link(mode) context variable: provides URL (in relevant mode) of * adds github_link(mode) context variable: provides URL (in relevant mode) of
@ -22,7 +22,7 @@ Notes
* provided ``linkcode_resolve`` only supports Python domain * provided ``linkcode_resolve`` only supports Python domain
* generates https github links * generates https github links
* explicitly imports ``openerp``, so useless for anyone else * explicitly imports ``odoo``, so useless for anyone else
""" """
def setup(app): def setup(app):
@ -63,9 +63,9 @@ def setup(app):
# obj doesn't have a module, or something # obj doesn't have a module, or something
return None return None
import openerp import odoo
# FIXME: make finding project root project-independent # FIXME: make finding project root project-independent
project_root = os.path.join(os.path.dirname(openerp.__file__), '..') project_root = os.path.join(os.path.dirname(odoo.__file__), '..')
return make_github_link( return make_github_link(
app, app,
os.path.relpath(obj_source_path, project_root), os.path.relpath(obj_source_path, project_root),
@ -82,25 +82,24 @@ def make_github_link(app, path, line=None, mode="blob"):
path=path, path=path,
mode=mode, mode=mode,
) )
return werkzeug.urls.url_unparse(( return urls.url_unparse((
'https', 'https',
'github.com', 'github.com',
urlpath, urlpath,
'', '',
'' if line is None else 'L%d' % line '' if line is None else 'L%d' % line
)) ))
def add_doc_link(app, pagename, templatename, context, doctree): def add_doc_link(app, pagename, templatename, context, doctree):
""" Add github_link function linking to the current page on github """ """ Add github_link function linking to the current page on github """
if not app.config.github_user and app.config.github_project: if not app.config.github_user and app.config.github_project:
return return
# FIXME: find other way to recover current document's source suffix
# in Sphinx 1.3 it's possible to have mutliple source suffixes and that
# may be useful in the future
source_suffix = app.config.source_suffix source_suffix = app.config.source_suffix
source_suffix = next(iter(source_suffix)) # in 1.3 source_suffix can be a list
# FIXME: odoo/odoo has a doc/ prefix which is incorrect for this # in 1.8 source_suffix can be a mapping
# project, how to unify? Add new setting? # FIXME: will break if we ever add support for !rst markdown documents maybe
if not isinstance(source_suffix, str):
source_suffix = next(iter(source_suffix))
# can't use functools.partial because 3rd positional is line not mode
context['github_link'] = lambda mode='edit': make_github_link( context['github_link'] = lambda mode='edit': make_github_link(
app, '%s%s' % (pagename, source_suffix), mode=mode) app, 'doc/%s%s' % (pagename, source_suffix), mode=mode)

View File

@ -21,6 +21,10 @@ def setup(app):
location="odoo extension") location="odoo extension")
app.config.html_translator_class = 'odoo.translator.BootstrapTranslator' app.config.html_translator_class = 'odoo.translator.BootstrapTranslator'
add_js_file = getattr(app, 'add_js_file', None) or app.add_javascript
for f in ['jquery.min.js', 'bootstrap.js', 'doc.js', 'jquery.noconflict.js']:
add_js_file(f)
switcher.setup(app) switcher.setup(app)
app.add_config_value('odoo_cover_default', None, 'env') app.add_config_value('odoo_cover_default', None, 'env')
app.add_config_value('odoo_cover_external', {}, 'env') app.add_config_value('odoo_cover_external', {}, 'env')
@ -28,9 +32,9 @@ def setup(app):
app.connect('html-page-context', update_meta) app.connect('html-page-context', update_meta)
def update_meta(app, pagename, templatename, context, doctree): def update_meta(app, pagename, templatename, context, doctree):
if not context.get('meta'): # context['meta'] can be None meta = context.get('meta')
context['meta'] = {} if meta is None:
meta = context.setdefault('meta', {}) # we want {} by default meta = context['meta'] = {}
meta.setdefault('banner', app.config.odoo_cover_default) meta.setdefault('banner', app.config.odoo_cover_default)
def navbarify(node, navbar=None): def navbarify(node, navbar=None):
@ -107,13 +111,7 @@ if toctree:
def resolve(old_resolve, tree, docname, *args, **kwargs): def resolve(old_resolve, tree, docname, *args, **kwargs):
if docname == tree.env.config.master_doc: if docname == tree.env.config.master_doc:
return resolve_content_toctree(tree.env, docname, *args, **kwargs) return resolve_content_toctree(tree.env, docname, *args, **kwargs)
toc = old_resolve(tree, docname, *args, **kwargs) return old_resolve(tree, docname, *args, **kwargs)
if toc is None:
return None
navbarify(toc[0], navbar=kwargs.pop('navbar', None))
return toc
@monkey(sphinx.environment.BuildEnvironment) @monkey(sphinx.environment.BuildEnvironment)
def resolve_toctree(old_resolve, self, docname, *args, **kwargs): def resolve_toctree(old_resolve, self, docname, *args, **kwargs):

View File

@ -1,7 +1,7 @@
{# warning: if doc structure change, these rules may have to change as well #} {# warning: if doc structure change, these rules may have to change as well #}
{# ===== VARIABLES ====== #} {# ===== VARIABLES ====== #}
{% set master_doc_short_name = 'User Doc' %} {% set master_doc_short_name = 'Developer Doc' %}
{% if pagename == master_doc %} {% if pagename == master_doc %}
<li><a href="{{ pathto(master_doc) }}" class="active">{{ master_doc_short_name }}</a></li> <li><a href="{{ pathto(master_doc) }}" class="active">{{ master_doc_short_name }}</a></li>

View File

@ -1,13 +1,4 @@
{% extends "basic/layout.html" %} {% extends "basic/layout.html" %}
{% set html5_doctype = True %}
{%- block scripts %}
{{ super() }}
<script type="text/javascript" src="{{ pathto('_static/jquery.min.js', 1) }}"></script>
<script type="text/javascript" src="{{ pathto('_static/bootstrap.js', 1) }}"></script>
<script type="text/javascript" src="{{ pathto('_static/doc.js', 1) }}"></script>
<script type="text/javascript" src="{{ pathto('_static/jquery.noconflict.js', 1) }}"></script>
{%- endblock %}
{% set classes = [] %} {% set classes = [] %}
{% if pagename == master_doc %} {% if pagename == master_doc %}
@ -18,18 +9,16 @@
{% set classes = classes + ['has_code_col'] %} {% set classes = classes + ['has_code_col'] %}
{% endif %} {% endif %}
{% if 'classes' in meta %} {%- block doctype -%}
{% set classes = classes + meta['classes'].split() %} <!doctype html>
{% endif %}
{%- block linktags -%}
{% for code, url in language_codes %}
<link rel="alternate" hreflang="{{ code }}" href="{{ url }}" />
{%- endfor %}
<link rel="canonical" href="{{ canonical }}" />
{{ super() }}
{%- endblock -%} {%- endblock -%}
{%- block linktags %}
<link href="https://fonts.googleapis.com/css?family=Work+Sans:500,600" rel="stylesheet">
<link rel="canonical" href="{{ canonical }}" />
{{- super() }}
{%- endblock %}
{%- block sidebar1 -%}{%- endblock -%} {%- block sidebar1 -%}{%- endblock -%}
{%- block sidebar2 -%}{%- endblock -%} {%- block sidebar2 -%}{%- endblock -%}
{%- block relbar1 -%}{%- endblock -%} {%- block relbar1 -%}{%- endblock -%}
@ -44,7 +33,6 @@
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '{{ google_analytics_key }}', 'auto'); ga('create', '{{ google_analytics_key }}', 'auto');
ga('set', 'anonymizeIp', true);
ga('send','pageview'); ga('send','pageview');
</script> </script>
{%- endif -%} {%- endif -%}
@ -77,8 +65,8 @@
<li><a href="https://www.odoo.com/page/e-commerce">eCommerce</a></li> <li><a href="https://www.odoo.com/page/e-commerce">eCommerce</a></li>
<li><a href="https://www.odoo.com/page/blog-engine">Blogs</a></li> <li><a href="https://www.odoo.com/page/blog-engine">Blogs</a></li>
<li><a href="https://www.odoo.com/page/community-builder">Forums</a></li> <li><a href="https://www.odoo.com/page/community-builder">Forums</a></li>
<li><a href="https://www.odoo.com/page/learning-management-system">eLearning</a></li> <li><a href="https://www.odoo.com/page/slides">Slides</a></li>
<li><a href="https://www.odoo.com/page/live-chat">Live Chat</a></li> <li><a href="https://adspike.odoo.com">SEA</a></li>
</ul> </ul>
</div> </div>
<div class="col-sm-3 o_sale_apps"> <div class="col-sm-3 o_sale_apps">
@ -95,12 +83,10 @@
<ul> <ul>
<li><a href="https://www.odoo.com/page/point-of-sale">Shops</a></li> <li><a href="https://www.odoo.com/page/point-of-sale">Shops</a></li>
<li><a href="https://www.odoo.com/page/pos-restaurant">Restaurants</a></li> <li><a href="https://www.odoo.com/page/pos-restaurant">Restaurants</a></li>
<li><a href="https://www.odoo.com/page/point-of-sale-hardware">Hardware</a></li>
</ul> </ul>
</li> </li>
<li><a href="https://www.odoo.com/page/subscriptions">Subscriptions</a></li> <li><a href="https://www.odoo.com/page/subscriptions">Subscriptions</a></li>
<li><a href="https://www.odoo.com/page/sign">Sign</a></li> <li><a href="https://www.odoo.com/page/sign">Sign</a></li>
<li><a href="https://www.odoo.com/page/rental">Rental</a></li>
</ul> </ul>
</div> </div>
<div class="col-sm-3 o_operation_apps"> <div class="col-sm-3 o_operation_apps">
@ -109,17 +95,17 @@
<div>It's all about efficiency</div> <div>It's all about efficiency</div>
</div> </div>
<ul> <ul>
<li><a href="https://www.odoo.com/page/accounting/">Accounting</a></li> <li><a href="https://www.odoo.com/page/accounting">Accounting</a></li>
<li><a href="https://www.odoo.com/page/project-management/">Project</a></li> <li><a href="https://www.odoo.com/page/project-management">Project</a></li>
<li class="dropdown"> <li class="dropdown">
<a href="#0" class="dropdown-toggle">Human Resources</a> <a href="#0" class="dropdown-toggle">Human Resources</a>
<ul> <ul>
<li><a href="https://www.odoo.com/page/referral">Referral</a></li> <li><a href="https://www.odoo.com/page/recruitment">Recruitment</a></li>
<li><a href="https://www.odoo.com/page/employees">Employees</a></li> <li><a href="https://www.odoo.com/page/employees">Employees</a></li>
<li><a href="https://www.odoo.com/page/expenses">Expenses</a></li> <li><a href="https://www.odoo.com/page/expenses">Expenses</a></li>
<li><a href="https://www.odoo.com/page/appraisal">Appraisal</a></li> <li><a href="https://www.odoo.com/page/appraisal">Appraisal</a></li>
<li><a href="https://www.odoo.com/page/fleet">Fleet</a></li> <li><a href="https://www.odoo.com/page/fleet">Fleet</a></li>
<li><a href="https://www.odoo.com/page/leaves">Time Off</a></li> <li><a href="https://www.odoo.com/page/leaves">Leaves</a></li>
</ul> </ul>
</li> </li>
<li><a href="https://www.odoo.com/page/warehouse">Inventory</a></li> <li><a href="https://www.odoo.com/page/warehouse">Inventory</a></li>
@ -133,8 +119,6 @@
<li><a href="https://www.odoo.com/page/quality">Quality</a></li> <li><a href="https://www.odoo.com/page/quality">Quality</a></li>
</ul> </ul>
</li> </li>
<li><a href="https://www.odoo.com/page/helpdesk">Helpdesk</a></li>
<li><a href="https://www.odoo.com/page/field-service-management">Field Service</a></li>
</ul> </ul>
</div> </div>
<div class="col-sm-3 o_productivity_apps"> <div class="col-sm-3 o_productivity_apps">
@ -149,23 +133,15 @@
<li><a href="https://www.odoo.com/page/discuss">Discuss</a></li> <li><a href="https://www.odoo.com/page/discuss">Discuss</a></li>
<li><a href="https://www.odoo.com/page/discuss-groups">Mailing Lists</a></li> <li><a href="https://www.odoo.com/page/discuss-groups">Mailing Lists</a></li>
<li><a href="https://www.odoo.com/page/notes">Notes</a></li> <li><a href="https://www.odoo.com/page/notes">Notes</a></li>
<li><a href="#">Help desk</a></li>
<li><a href="#">Appointment</a></li>
</ul> </ul>
</li> </li>
<li><a href="https://www.odoo.com/page/timesheet">Timesheet</a></li> <li><a href="https://www.odoo.com/page/timesheet">Timesheet</a></li>
<li><a href="https://www.odoo.com/page/email-marketing">Email Marketing</a></li>
<li><a href="https://www.odoo.com/page/events">Events</a></li> <li><a href="https://www.odoo.com/page/events">Events</a></li>
<li class="dropdown">
<a href="#0" class="dropdown-toggle">Marketing</a>
<ul>
<li><a href="https://www.odoo.com/page/marketing-automation">Automation</a></li>
<li><a href="https://www.odoo.com/page/email-marketing">Email</a></li>
<li><a href="https://www.odoo.com/page/social-marketing">Social</a></li>
<li><a href="https://www.odoo.com/page/sms-marketing">SMS</a></li>
</ul>
</li>
<li><a href="https://www.odoo.com/page/survey">Survey</a></li> <li><a href="https://www.odoo.com/page/survey">Survey</a></li>
<li><a href="https://www.odoo.com/page/approval-workflow">Approvals</a></li> <li><a href="https://www.odoo.com/page/live-chat">Live Chat</a></li>
<li><a href="https://www.odoo.com/page/appointments">Appointments</a></li>
<li><a href="https://www.odoo.com/page/documents">Documents</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -198,6 +174,16 @@
<a href="http://www.odoo.com/trial" class="btn btn-primary">Start Now</a> <a href="http://www.odoo.com/trial" class="btn btn-primary">Start Now</a>
</div> </div>
<ul class="navbar-nav navbar-right nav o_sub_nav_actions">
{% if pagename != master_doc %}
<li class="divider"></li>
{% endif%}
{% block switchers_desktop %}
{% include "switchers_list.html" %}
{% endblock %}
</ul>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
{% if languages or versions %} {% if languages or versions %}
<li class="divider"></li> <li class="divider"></li>
@ -211,16 +197,6 @@
<li class="divider"></li> <li class="divider"></li>
{% endif %} {% endif %}
</ul> </ul>
<ul class="navbar-nav navbar-right nav o_sub_nav_actions">
{% if pagename != master_doc %}
<li class="divider"></li>
{% endif%}
{% block switchers_desktop %}
{% include "switchers_list.html" %}
{% endblock %}
</ul>
</div> </div>
</div> </div>
</nav> </nav>
@ -361,4 +337,3 @@
</div> </div>
</footer> </footer>
{%- endblock -%} {%- endblock -%}

View File

@ -118,9 +118,9 @@ class OdooStyle(Style):
Generic.Traceback: "", Generic.Traceback: "",
} }
import imp import types
import sys import sys
modname = 'pygments.styles.odoo' modname = 'pygments.styles.odoo'
m = imp.new_module(modname) m = types.ModuleType(modname)
m.OdooStyle = OdooStyle m.OdooStyle = OdooStyle
sys.modules[modname] = m sys.modules[modname] = m

View File

@ -124,7 +124,6 @@ article.doc-body .code-fields {
margin: 0; margin: 0;
padding: 0 0 2%; padding: 0 0 2%;
.transform-origin(50% 0px 0px); .transform-origin(50% 0px 0px);
.o-gradient();
@media screen and (min-width: @screen-sm-min) { @media screen and (min-width: @screen-sm-min) {
padding: 12% 0 5%; padding: 12% 0 5%;

View File

@ -403,4 +403,3 @@
} }
}); });
})(jQuery); })(jQuery);

View File

@ -109,12 +109,6 @@ main.index {
display: none; display: none;
} }
} }
a {
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
} }
} }
} }

View File

@ -9384,6 +9384,16 @@ h6 {
color: white; color: white;
} }
} }
.footnote-ref {
vertical-align: super;
font-size: 1ex;
}
.footnote-ref:before {
content: '[';
}
.footnote-ref:after {
content: ']';
}
article.doc-body > section { article.doc-body > section {
padding-bottom: 10px; padding-bottom: 10px;
} }
@ -9665,12 +9675,6 @@ article.doc-body .code-fields ul em {
-moz-transform-origin: 50% 0px 0px; -moz-transform-origin: 50% 0px 0px;
-ms-transform-origin: 50% 0px 0px; -ms-transform-origin: 50% 0px 0px;
transform-origin: 50% 0px 0px; transform-origin: 50% 0px 0px;
background: #75526b;
background: -webkit-linear-gradient(99deg, #875A7B 10%, #62495B 90%);
background: -moz-linear-gradient(99deg, #875A7B 10%, #62495B 90%);
background: -ms-linear-gradient(99deg, #875A7B 10%, #62495B 90%);
background: -o-linear-gradient(99deg, #875A7B 10%, #62495B 90%);
background: linear-gradient(99deg, #875A7B 10%, #62495B 90%);
} }
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {
.card.top { .card.top {
@ -10310,12 +10314,6 @@ main.index .card figcaption {
.toctree-wrapper > ul li.toctree-l2 > ul:empty { .toctree-wrapper > ul li.toctree-l2 > ul:empty {
display: none; display: none;
} }
.toctree-wrapper > ul li.toctree-l2 a {
text-decoration: none;
}
.toctree-wrapper > ul li.toctree-l2 a:hover {
text-decoration: underline;
}
#oe_main_menu_navbar ~ #wrapwrap .o_main_header.o_has_sub_nav.o_scrolled { #oe_main_menu_navbar ~ #wrapwrap .o_main_header.o_has_sub_nav.o_scrolled {
top: -17px; top: -17px;
} }

View File

@ -29,7 +29,7 @@
background-color: @footer-bg-color; background-color: @footer-bg-color;
color: @gray-lighter; color: @gray-lighter;
} }
> .o_sub_nav #o_sub-menu #searchbox { > .o_sub_nav #o_sub-menu #searchbox {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@ -33,6 +33,13 @@ h1, h2, h3, h4, h5, h6 {
border-bottom: 2px solid #f4f6f7; border-bottom: 2px solid #f4f6f7;
} }
.footnote-ref {
&:before {content: '[';}
&:after {content: ']';}
vertical-align: super;
font-size: 1ex;
}
article.doc-body { article.doc-body {
// Vertical rhythm // Vertical rhythm

View File

@ -2,9 +2,8 @@
<li><a href="https://www.odoo.com/documentation/user/13.0/index.html">User</a></li> <li><a href="https://www.odoo.com/documentation/user/13.0/index.html">User</a></li>
<li><a href="https://www.odoo.com/documentation/13.0/index.html">Developer</a></li> <li><a href="https://www.odoo.com/documentation/13.0/index.html">Developer</a></li>
<li><a href="https://odoo.com/slides">eLearning</a></li>
<li><a href="https://www.odoo.com/documentation/13.0/webservices/odoo.html">API</a></li>
<li><a href="https://www.odoo.com/documentation/13.0/setup/install.html">Installation</a></li> <li><a href="https://www.odoo.com/documentation/13.0/setup/install.html">Installation</a></li>
<li><a href="https://odoo.com/slides">eLearning</a></li>
<li><a href="https://www.odoo.com/page/odoo-white-paper">White Papers</a></li> <li><a href="https://www.odoo.com/page/odoo-white-paper">White Papers</a></li>
<li><a href="https://www.odoo.com/page/legal">Legal</a></li> <li><a href="https://www.odoo.com/page/legal">Legal</a></li>

View File

@ -1,7 +1,8 @@
from docutils import nodes, utils from docutils import nodes, utils
from docutils.parsers.rst import Directive from docutils.parsers.rst import Directive
from pygments.lexers import get_lexer_by_name from pygments.lexers import get_lexer_by_name, PythonLexer
PythonLexer.name = 'Python 2'
def setup(app): def setup(app):
app.add_directive('switcher', SwitcherDirective) app.add_directive('switcher', SwitcherDirective)

View File

@ -1,4 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import print_function
import os.path import os.path
import posixpath import posixpath
import re import re
@ -6,7 +8,6 @@ import re
from docutils import nodes from docutils import nodes
from sphinx import addnodes, util, builders from sphinx import addnodes, util, builders
from sphinx.locale import admonitionlabels from sphinx.locale import admonitionlabels
from urllib.request import url2pathname from urllib.request import url2pathname
@ -31,9 +32,8 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
html_title = 'html_title' html_title = 'html_title'
html_subtitle = 'html_subtitle' html_subtitle = 'html_subtitle'
# <meta> tags
def __init__(self, builder, document): def __init__(self, document, builder):
# order of parameter swapped between Sphinx 1.x and 2.x, check if # order of parameter swapped between Sphinx 1.x and 2.x, check if
# we're running 1.x and swap back # we're running 1.x and swap back
if not isinstance(builder, builders.Builder): if not isinstance(builder, builders.Builder):
@ -42,10 +42,12 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
super(BootstrapTranslator, self).__init__(document) super(BootstrapTranslator, self).__init__(document)
self.builder = builder self.builder = builder
self.meta = [ self.meta = [
# HTMLWriter strips out the first two items from Translator.meta
# with no explanation
'', '', '', '',
'\n <meta http-equiv="X-UA-Compatible" content="IE=edge">',
'\n <meta name="viewport" content="width=device-width, initial-scale=1">'
] ]
self.add_meta('<meta http-equiv="X-UA-Compatible" content="IE=edge">')
self.add_meta('<meta name="viewport" content="width=device-width, initial-scale=1">')
self.body = [] self.body = []
self.fragment = self.body self.fragment = self.body
self.html_body = self.body self.html_body = self.body
@ -57,7 +59,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.context = [] self.context = []
self.section_level = 0 self.section_level = 0
self.config = builder.config self.config = self.builder.config
self.highlightlang = self.highlightlang_base = self.builder.config.highlight_language self.highlightlang = self.highlightlang_base = self.builder.config.highlight_language
self.highlightopts = getattr(builder.config, 'highlight_options', {}) self.highlightopts = getattr(builder.config, 'highlight_options', {})
@ -67,7 +69,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.param_separator = ',' self.param_separator = ','
def encode(self, text): def encode(self, text):
return text.translate({ return str(text).translate({
ord('&'): u'&amp;', ord('&'): u'&amp;',
ord('<'): u'&lt;', ord('<'): u'&lt;',
ord('"'): u'&quot;', ord('"'): u'&quot;',
@ -79,7 +81,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.meta.append('\n ' + meta) self.meta.append('\n ' + meta)
def starttag(self, node, tagname, **attributes): def starttag(self, node, tagname, **attributes):
tagname = tagname.lower() tagname = str(tagname).lower()
# extract generic attributes # extract generic attributes
attrs = {name.lower(): value for name, value in attributes.items()} attrs = {name.lower(): value for name, value in attributes.items()}
@ -113,8 +115,8 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
) )
# only "space characters" SPACE, CHARACTER TABULATION, LINE FEED, # only "space characters" SPACE, CHARACTER TABULATION, LINE FEED,
# FORM FEED and CARRIAGE RETURN should be collapsed, not al White_Space # FORM FEED and CARRIAGE RETURN should be collapsed, not al White_Space
def attval(self, value, whitespace=re.compile(u'[ \t\n\f\r]')): def attval(self, value, whitespace=re.compile(u'[ \t\n\f\r]+')):
return self.encode(whitespace.sub(u' ', str(value))) return self.encode(whitespace.sub(' ', str(value)))
def astext(self): def astext(self):
return u''.join(self.body) return u''.join(self.body)
@ -137,6 +139,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
def visit_meta(self, node): def visit_meta(self, node):
if node.hasattr('lang'): if node.hasattr('lang'):
node['xml:lang'] = node['lang'] node['xml:lang'] = node['lang']
# del(node['lang'])
meta = self.starttag(node, 'meta', **node.non_default_attributes()) meta = self.starttag(node, 'meta', **node.non_default_attributes())
self.add_meta(meta) self.add_meta(meta)
def depart_meta(self, node): def depart_meta(self, node):
@ -156,6 +159,11 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
if not self.section_level: if not self.section_level:
self.body.append(u'</section>') self.body.append(u'</section>')
def visit_topic(self, node):
self.body.append(self.starttag(node, 'nav'))
def depart_topic(self, node):
self.body.append(u'</nav>')
def is_compact_paragraph(self, node): def is_compact_paragraph(self, node):
parent = node.parent parent = node.parent
if isinstance(parent, (nodes.document, nodes.compound, if isinstance(parent, (nodes.document, nodes.compound,
@ -197,6 +205,18 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
def depart_compact_paragraph(self, node): def depart_compact_paragraph(self, node):
pass pass
def visit_problematic(self, node):
if node.hasattr('refid'):
self.body.append('<a href="#%s">' % node['refid'])
self.context.append('</a>')
else:
self.context.append('')
self.body.append(self.starttag(node, 'span', CLASS='problematic'))
def depart_problematic(self, node):
self.body.append('</span>')
self.body.append(self.context.pop())
def visit_literal_block(self, node): def visit_literal_block(self, node):
if node.rawsource != node.astext(): if node.rawsource != node.astext():
# most probably a parsed-literal block -- don't highlight # most probably a parsed-literal block -- don't highlight
@ -215,7 +235,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
else: else:
opts = {} opts = {}
def warner(msg): def warner(msg, **kw):
self.builder.warn(msg, (self.builder.current_docname, node.line)) self.builder.warn(msg, (self.builder.current_docname, node.line))
highlighted = self.builder.highlighter.highlight_block( highlighted = self.builder.highlighter.highlight_block(
node.rawsource, lang, opts=opts, warn=warner, linenos=linenos, node.rawsource, lang, opts=opts, warn=warner, linenos=linenos,
@ -319,9 +339,9 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
def visit_title(self, node): def visit_title(self, node):
parent = node.parent parent = node.parent
closing = u'</p>' closing = u'</h3>'
if isinstance(parent, nodes.Admonition): if isinstance(parent, nodes.Admonition):
self.body.append(self.starttag(node, 'p', CLASS='alert-title')) self.body.append(self.starttag(node, 'h3', CLASS='alert-title'))
elif isinstance(node.parent, nodes.document): elif isinstance(node.parent, nodes.document):
self.body.append(self.starttag(node, 'h1')) self.body.append(self.starttag(node, 'h1'))
closing = u'</h1>' closing = u'</h1>'
@ -388,11 +408,11 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
"Unsupported alignment value \"%s\"" % node['align'], "Unsupported alignment value \"%s\"" % node['align'],
location=doc location=doc
) )
attrs['style'] = '; '.join( elif 'align' in node.parent and node.parent['align'] == 'center':
'%s:%s' % (name, node[name] + ('px' if re.match(r'^[0-9]+$', node[name]) else '')) # figure > image
for name in ['width', 'height'] attrs['class'] += ' center-block'
if name in node
) # todo: explicit width/height/scale?
self.body.append(self.starttag(node, 'img', **attrs)) self.body.append(self.starttag(node, 'img', **attrs))
def depart_image(self, node): pass def depart_image(self, node): pass
def visit_figure(self, node): def visit_figure(self, node):
@ -443,12 +463,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
tagname = 'th' tagname = 'th'
else: else:
tagname = 'td' tagname = 'td'
attrs = {} self.body.append(self.starttag(node, tagname))
if 'morerows' in node:
attrs['rowspan'] = node['morerows']+1
if 'morecols' in node:
attrs['colspan'] = node['morecols']+1
self.body.append(self.starttag(node, tagname, **attrs))
self.context.append(tagname) self.context.append(tagname)
def depart_entry(self, node): def depart_entry(self, node):
self.body.append(u'</{}>'.format(self.context.pop())) self.body.append(u'</{}>'.format(self.context.pop()))
@ -500,20 +515,6 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.body.append(self.starttag(node, 'a', **attrs)) self.body.append(self.starttag(node, 'a', **attrs))
def depart_reference(self, node): def depart_reference(self, node):
self.body.append(u'</a>') self.body.append(u'</a>')
def visit_download_reference(self, node):
# type: (nodes.Node) -> None
if node.hasattr('filename'):
self.body.append(
'<a class="reference download internal" href="%s" download="">' %
posixpath.join(self.builder.dlpath, node['filename']))
self.body.append(node.astext())
self.body.append('</a>')
raise nodes.SkipNode
else:
self.context.append('')
def depart_download_reference(self, node):
# type: (nodes.Node) -> None
self.body.append(self.context.pop())
def visit_target(self, node): pass def visit_target(self, node): pass
def depart_target(self, node): pass def depart_target(self, node): pass
def visit_footnote(self, node): def visit_footnote(self, node):
@ -659,11 +660,11 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
classes = env.metadata[ref].get('types', 'tutorials') classes = env.metadata[ref].get('types', 'tutorials')
classes += ' toc-single-entry' if not toc else ' toc-section' classes += ' toc-single-entry' if not toc else ' toc-section'
self.body.append(self.starttag(node, 'div', CLASS="row " + classes)) self.body.append(self.starttag(node, 'div', CLASS="row " + classes))
self.body.append(u'<h2 class="col-sm-12">') self.body.append(u'<div class="col-sm-12"><h2>')
self.body.append(title if title else util.nodes.clean_astext(env.titles[ref])) self.body.append(title if title else util.nodes.clean_astext(env.titles[ref]))
self.body.append(u'</h2>') self.body.append(u'</h2></div>')
entries = [(title, ref)] if not toc else ((e[0], e[1]) for e in list(toc)[0]['entries']) entries = [(title, ref)] if not toc else ((e[0], e[1]) for e in toc[0]['entries'])
for subtitle, subref in entries: for subtitle, subref in entries:
baseuri = self.builder.get_target_uri(node['parent']) baseuri = self.builder.get_target_uri(node['parent'])