| from sphinx.application import TemplateBridge |
| from sphinx.builders.html import StandaloneHTMLBuilder |
| from sphinx.highlighting import PygmentsBridge |
| from sphinx.jinja2glue import BuiltinTemplateLoader |
| from pygments import highlight |
| from pygments.lexer import RegexLexer, bygroups, using |
| from pygments.token import * |
| from pygments.filter import Filter, apply_filters |
| from pygments.lexers import PythonLexer, PythonConsoleLexer |
| from pygments.formatters import HtmlFormatter, LatexFormatter |
| import re |
| import os |
| from mako.lookup import TemplateLookup |
| from mako.template import Template |
| from mako.ext.pygmentplugin import MakoLexer |
| |
| rtd = os.environ.get('READTHEDOCS', None) == 'True' |
| |
| class MakoBridge(TemplateBridge): |
| def init(self, builder, *args, **kw): |
| self.jinja2_fallback = BuiltinTemplateLoader() |
| self.jinja2_fallback.init(builder, *args, **kw) |
| |
| builder.config.html_context['site_base'] = builder.config['site_base'] |
| |
| self.lookup = TemplateLookup( |
| directories=builder.config.templates_path, |
| imports=[ |
| "from builder import util" |
| ] |
| ) |
| |
| def render(self, template, context): |
| template = template.replace(".html", ".mako") |
| context['prevtopic'] = context.pop('prev', None) |
| context['nexttopic'] = context.pop('next', None) |
| |
| # RTD layout |
| if rtd: |
| # add variables if not present, such |
| # as if local test of READTHEDOCS variable |
| if 'MEDIA_URL' not in context: |
| context['MEDIA_URL'] = "http://media.readthedocs.org/" |
| if 'slug' not in context: |
| context['slug'] = "mako-test-slug" |
| if 'url' not in context: |
| context['url'] = "/some/test/url" |
| if 'current_version' not in context: |
| context['current_version'] = "some_version" |
| if 'versions' not in context: |
| context['versions'] = [('default', '/default/')] |
| |
| context['docs_base'] = "http://readthedocs.org" |
| context['toolbar'] = True |
| context['layout'] = "rtd_layout.mako" |
| context['pdf_url'] = "%spdf/%s/%s/%s.pdf" % ( |
| context['MEDIA_URL'], |
| context['slug'], |
| context['current_version'], |
| context['slug'] |
| ) |
| # local docs layout |
| else: |
| context['toolbar'] = False |
| context['docs_base'] = "/" |
| context['layout'] = "layout.mako" |
| |
| context.setdefault('_', lambda x:x) |
| return self.lookup.get_template(template).render_unicode(**context) |
| |
| def render_string(self, template, context): |
| # this is used for .js, .css etc. and we don't have |
| # local copies of that stuff here so use the jinja render. |
| return self.jinja2_fallback.render_string(template, context) |
| |
| class StripDocTestFilter(Filter): |
| def filter(self, lexer, stream): |
| for ttype, value in stream: |
| if ttype is Token.Comment and re.match(r'#\s*doctest:', value): |
| continue |
| yield ttype, value |
| |
| |
| def autodoc_skip_member(app, what, name, obj, skip, options): |
| if what == 'class' and skip and name == '__init__': |
| return False |
| else: |
| return skip |
| |
| def setup(app): |
| # app.connect('autodoc-skip-member', autodoc_skip_member) |
| # Mako is already in Pygments, adding the local |
| # lexer here so that the latest syntax is available |
| app.add_lexer('mako', MakoLexer()) |
| app.add_config_value('site_base', "", True) |
| |
| |