1*61046927SAndroid Build Coastguard Worker# BSD 3-Clause License 2*61046927SAndroid Build Coastguard Worker# 3*61046927SAndroid Build Coastguard Worker# Copyright (c) 2018, pandas 4*61046927SAndroid Build Coastguard Worker# All rights reserved. 5*61046927SAndroid Build Coastguard Worker# 6*61046927SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 7*61046927SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 8*61046927SAndroid Build Coastguard Worker# 9*61046927SAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright notice, this 10*61046927SAndroid Build Coastguard Worker# list of conditions and the following disclaimer. 11*61046927SAndroid Build Coastguard Worker# 12*61046927SAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright notice, 13*61046927SAndroid Build Coastguard Worker# this list of conditions and the following disclaimer in the documentation 14*61046927SAndroid Build Coastguard Worker# and/or other materials provided with the distribution. 15*61046927SAndroid Build Coastguard Worker# 16*61046927SAndroid Build Coastguard Worker# * Neither the name of the copyright holder nor the names of its 17*61046927SAndroid Build Coastguard Worker# contributors may be used to endorse or promote products derived from 18*61046927SAndroid Build Coastguard Worker# this software without specific prior written permission. 19*61046927SAndroid Build Coastguard Worker# 20*61046927SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21*61046927SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22*61046927SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23*61046927SAndroid Build Coastguard Worker# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24*61046927SAndroid Build Coastguard Worker# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25*61046927SAndroid Build Coastguard Worker# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26*61046927SAndroid Build Coastguard Worker# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27*61046927SAndroid Build Coastguard Worker# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28*61046927SAndroid Build Coastguard Worker# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*61046927SAndroid Build Coastguard Worker# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker# Based on https://github.com/pydata/pydata-sphinx-theme 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Workerfrom docutils import nodes 34*61046927SAndroid Build Coastguard Worker 35*61046927SAndroid Build Coastguard Workerimport sphinx 36*61046927SAndroid Build Coastguard Workerfrom sphinx.ext.autosummary import autosummary_table 37*61046927SAndroid Build Coastguard Workerfrom sphinx.locale import admonitionlabels 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Workerimport types 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Workerclass BootstrapHTML5TranslatorMixin: 42*61046927SAndroid Build Coastguard Worker def __init__(self, *args, **kwds): 43*61046927SAndroid Build Coastguard Worker super().__init__(*args, **kwds) 44*61046927SAndroid Build Coastguard Worker self.settings.table_style = "table" 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker def starttag(self, *args, **kwargs): 47*61046927SAndroid Build Coastguard Worker """ensure an aria-level is set for any heading role""" 48*61046927SAndroid Build Coastguard Worker if kwargs.get("ROLE") == "heading" and "ARIA-LEVEL" not in kwargs: 49*61046927SAndroid Build Coastguard Worker kwargs["ARIA-LEVEL"] = "2" 50*61046927SAndroid Build Coastguard Worker return super().starttag(*args, **kwargs) 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker def visit_admonition(self, node, name: str = '') -> None: 53*61046927SAndroid Build Coastguard Worker admonitionclasses = { 54*61046927SAndroid Build Coastguard Worker 'attention': 'alert-primary', 55*61046927SAndroid Build Coastguard Worker 'caution': 'alert-secondary', 56*61046927SAndroid Build Coastguard Worker 'danger': 'alert-danger', 57*61046927SAndroid Build Coastguard Worker 'error': 'alert-danger', 58*61046927SAndroid Build Coastguard Worker 'hint': 'alert-secondary', 59*61046927SAndroid Build Coastguard Worker 'important': 'alert-primary', 60*61046927SAndroid Build Coastguard Worker 'note': 'alert-info', 61*61046927SAndroid Build Coastguard Worker 'seealso': 'alert-info', 62*61046927SAndroid Build Coastguard Worker 'tip': 'alert-info', 63*61046927SAndroid Build Coastguard Worker 'warning': 'alert-warning', 64*61046927SAndroid Build Coastguard Worker } 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker self.body.append(self.starttag( 67*61046927SAndroid Build Coastguard Worker node, 'div', CLASS=('alert ' + admonitionclasses[name]))) 68*61046927SAndroid Build Coastguard Worker if name: 69*61046927SAndroid Build Coastguard Worker self.body.append( 70*61046927SAndroid Build Coastguard Worker self.starttag(node, 'div', '', CLASS='h5')) 71*61046927SAndroid Build Coastguard Worker self.body.append(str(admonitionlabels[name])) 72*61046927SAndroid Build Coastguard Worker self.body.append('</div>') 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker def visit_table(self, node): 75*61046927SAndroid Build Coastguard Worker # init the attributes 76*61046927SAndroid Build Coastguard Worker atts = {} 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker self._table_row_indices.append(0) 79*61046927SAndroid Build Coastguard Worker 80*61046927SAndroid Build Coastguard Worker # get the classes 81*61046927SAndroid Build Coastguard Worker classes = [cls.strip(" \t\n") for cls in self.settings.table_style.split(",")] 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Worker # we're looking at the 'real_table', which is wrapped by an autosummary 84*61046927SAndroid Build Coastguard Worker if isinstance(node.parent, autosummary_table): 85*61046927SAndroid Build Coastguard Worker classes += ["autosummary"] 86*61046927SAndroid Build Coastguard Worker 87*61046927SAndroid Build Coastguard Worker # add the width if set in a style attribute 88*61046927SAndroid Build Coastguard Worker if "width" in node: 89*61046927SAndroid Build Coastguard Worker atts["style"] = f'width: {node["width"]}' 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Worker # add specific class if align is set 92*61046927SAndroid Build Coastguard Worker if "align" in node: 93*61046927SAndroid Build Coastguard Worker classes.append(f'table-{node["align"]}') 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker tag = self.starttag(node, "table", CLASS=" ".join(classes), **atts) 96*61046927SAndroid Build Coastguard Worker self.body.append(tag) 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Workerdef setup_translators(app): 99*61046927SAndroid Build Coastguard Worker if app.builder.format != "html": 100*61046927SAndroid Build Coastguard Worker return 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker if not app.registry.translators.items(): 103*61046927SAndroid Build Coastguard Worker translator = types.new_class( 104*61046927SAndroid Build Coastguard Worker "BootstrapHTML5Translator", 105*61046927SAndroid Build Coastguard Worker ( 106*61046927SAndroid Build Coastguard Worker BootstrapHTML5TranslatorMixin, 107*61046927SAndroid Build Coastguard Worker app.builder.default_translator_class, 108*61046927SAndroid Build Coastguard Worker ), 109*61046927SAndroid Build Coastguard Worker {}, 110*61046927SAndroid Build Coastguard Worker ) 111*61046927SAndroid Build Coastguard Worker app.set_translator(app.builder.name, translator, override=True) 112*61046927SAndroid Build Coastguard Worker else: 113*61046927SAndroid Build Coastguard Worker for name, klass in app.registry.translators.items(): 114*61046927SAndroid Build Coastguard Worker translator = types.new_class( 115*61046927SAndroid Build Coastguard Worker "BootstrapHTML5Translator", 116*61046927SAndroid Build Coastguard Worker ( 117*61046927SAndroid Build Coastguard Worker BootstrapHTML5TranslatorMixin, 118*61046927SAndroid Build Coastguard Worker klass, 119*61046927SAndroid Build Coastguard Worker ), 120*61046927SAndroid Build Coastguard Worker {}, 121*61046927SAndroid Build Coastguard Worker ) 122*61046927SAndroid Build Coastguard Worker app.set_translator(name, translator, override=True) 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Workerdef setup(app): 125*61046927SAndroid Build Coastguard Worker app.connect("builder-inited", setup_translators) 126