class PatchedHTMLTranslator( HTML5Translator if is_html5_writer_available() else HTMLTranslator): def starttag(self, node, tagname, *args, **attrs): if (tagname == "a" and "target" not in attrs and ("external" in attrs.get("class", "") or "external" in attrs.get("classes", []))): attrs["target"] = "_blank" attrs["ref"] = "noopener noreferrer" return super().starttag(node, tagname, *args, **attrs)
def add_node(self, node, **kwds): # type: (nodes.Node, Any) -> None logger.debug('[app] adding node: %r', (node, kwds)) if not kwds.pop('override', False) and \ hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__): logger.warning(__( 'while setting up extension %s: node class %r is ' 'already registered, its visitors will be overridden'), self._setting_up_extension, node.__name__, type='app', subtype='add_node') nodes._add_node_class_names([node.__name__]) for key, val in iteritems(kwds): try: visit, depart = val except ValueError: raise ExtensionError( __('Value for key %r must be a ' '(visit, depart) function tuple') % key) translator = self.registry.translators.get(key) translators = [] if translator is not None: translators.append(translator) elif key == 'html': from sphinx.writers.html import HTMLTranslator translators.append(HTMLTranslator) if is_html5_writer_available(): from sphinx.writers.html5 import HTML5Translator translators.append(HTML5Translator) elif key == 'latex': from sphinx.writers.latex import LaTeXTranslator translators.append(LaTeXTranslator) elif key == 'text': from sphinx.writers.text import TextTranslator translators.append(TextTranslator) elif key == 'man': from sphinx.writers.manpage import ManualPageTranslator translators.append(ManualPageTranslator) elif key == 'texinfo': from sphinx.writers.texinfo import TexinfoTranslator translators.append(TexinfoTranslator) for translator in translators: setattr(translator, 'visit_' + node.__name__, visit) if depart: setattr(translator, 'depart_' + node.__name__, depart)
def add_node(self, node, **kwds): # type: (nodes.Node, Any) -> None logger.debug('[app] adding node: %r', (node, kwds)) if not kwds.pop('override', False) and \ hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__): logger.warning(__('while setting up extension %s: node class %r is ' 'already registered, its visitors will be overridden'), self._setting_up_extension, node.__name__, type='app', subtype='add_node') nodes._add_node_class_names([node.__name__]) for key, val in iteritems(kwds): try: visit, depart = val except ValueError: raise ExtensionError(__('Value for key %r must be a ' '(visit, depart) function tuple') % key) translator = self.registry.translators.get(key) translators = [] if translator is not None: translators.append(translator) elif key == 'html': from sphinx.writers.html import HTMLTranslator translators.append(HTMLTranslator) if is_html5_writer_available(): from sphinx.writers.html5 import HTML5Translator translators.append(HTML5Translator) elif key == 'latex': from sphinx.writers.latex import LaTeXTranslator translators.append(LaTeXTranslator) elif key == 'text': from sphinx.writers.text import TextTranslator translators.append(TextTranslator) elif key == 'man': from sphinx.writers.manpage import ManualPageTranslator translators.append(ManualPageTranslator) elif key == 'texinfo': from sphinx.writers.texinfo import TexinfoTranslator translators.append(TexinfoTranslator) for translator in translators: setattr(translator, 'visit_' + node.__name__, visit) if depart: setattr(translator, 'depart_' + node.__name__, depart)
def add_node(self, node, **kwds): """ See :epkg:`class Sphinx`. """ # type: (nodes.Node, Any) -> None nodes._add_node_class_names([node.__name__]) for key, val in kwds.items(): if not isinstance(val, tuple): continue visit, depart = val translator = self.writer.app.registry.translators.get(key) translators = [] if translator is not None: translators.append(translator) elif key == 'html': from sphinx.writers.html import HTMLTranslator translators.append(HTMLTranslator) if is_html5_writer_available(): from sphinx.writers.html5 import HTML5Translator translators.append(HTML5Translator) elif key == 'latex': try: from sphinx.writers.latex import LaTeXTranslator except ImportError: # Since sphinx 1.7.3 (circular reference). import sphinx.builders.latex.transforms from sphinx.writers.latex import LaTeXTranslator translators.append(LaTeXTranslator) elif key == 'text': from sphinx.writers.text import TextTranslator translators.append(TextTranslator) elif key == 'man': from sphinx.writers.manpage import ManualPageTranslator translators.append(ManualPageTranslator) elif key == 'texinfo': from sphinx.writers.texinfo import TexinfoTranslator translators.append(TexinfoTranslator) for translator in translators: setattr(translator, 'visit_' + node.__name__, visit) if depart: setattr(translator, 'depart_' + node.__name__, depart)
import xml.etree.cElementTree as ElementTree import pytest from html5lib import getTreeBuilder, HTMLParser from sphinx.util.docutils import is_html5_writer_available from test_build_html import flat_dict, tail_check, check_xpath TREE_BUILDER = getTreeBuilder('etree', implementation=ElementTree) HTML_PARSER = HTMLParser(TREE_BUILDER, namespaceHTMLElements=False) etree_cache = {} @pytest.mark.skipif(not is_html5_writer_available(), reason='HTML5 writer is not available') @pytest.fixture(scope='module') def cached_etree_parse(): def parse(fname): if fname in etree_cache: return etree_cache[fname] with (fname).open('rb') as fp: etree = HTML_PARSER.parse(fp) etree_cache.clear() etree_cache[fname] = etree return etree yield parse etree_cache.clear()
def add_node(self, node, **kwds): # type: (nodes.Node, Any) -> None """Register a Docutils node class. This is necessary for Docutils internals. It may also be used in the future to validate nodes in the parsed documents. Node visitor functions for the Sphinx HTML, LaTeX, text and manpage writers can be given as keyword arguments: the keyword should be one or more of ``'html'``, ``'latex'``, ``'text'``, ``'man'``, ``'texinfo'`` or any other supported translators, the value a 2-tuple of ``(visit, depart)`` methods. ``depart`` can be ``None`` if the ``visit`` function raises :exc:`docutils.nodes.SkipNode`. Example: .. code-block:: python class math(docutils.nodes.Element): pass def visit_math_html(self, node): self.body.append(self.starttag(node, 'math')) def depart_math_html(self, node): self.body.append('</math>') app.add_node(math, html=(visit_math_html, depart_math_html)) Obviously, translators for which you don't specify visitor methods will choke on the node when encountered in a document to translate. .. versionchanged:: 0.5 Added the support for keyword arguments giving visit functions. """ logger.debug('[app] adding node: %r', (node, kwds)) if not kwds.pop('override', False) and \ hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__): logger.warning(__('while setting up extension %s: node class %r is ' 'already registered, its visitors will be overridden'), self._setting_up_extension, node.__name__, type='app', subtype='add_node') nodes._add_node_class_names([node.__name__]) for key, val in iteritems(kwds): try: visit, depart = val except ValueError: raise ExtensionError(__('Value for key %r must be a ' '(visit, depart) function tuple') % key) translator = self.registry.translators.get(key) translators = [] if translator is not None: translators.append(translator) elif key == 'html': from sphinx.writers.html import HTMLTranslator translators.append(HTMLTranslator) if is_html5_writer_available(): from sphinx.writers.html5 import HTML5Translator translators.append(HTML5Translator) elif key == 'latex': from sphinx.writers.latex import LaTeXTranslator translators.append(LaTeXTranslator) elif key == 'text': from sphinx.writers.text import TextTranslator translators.append(TextTranslator) elif key == 'man': from sphinx.writers.manpage import ManualPageTranslator translators.append(ManualPageTranslator) elif key == 'texinfo': from sphinx.writers.texinfo import TexinfoTranslator translators.append(TexinfoTranslator) for translator in translators: setattr(translator, 'visit_' + node.__name__, visit) if depart: setattr(translator, 'depart_' + node.__name__, depart)
import pytest from html5lib import getTreeBuilder, HTMLParser from sphinx.util.docutils import is_html5_writer_available from test_build_html import flat_dict, tail_check, check_xpath TREE_BUILDER = getTreeBuilder('etree', implementation=ElementTree) HTML_PARSER = HTMLParser(TREE_BUILDER, namespaceHTMLElements=False) etree_cache = {} @pytest.mark.skipif(not is_html5_writer_available(), reason='HTML5 writer is not available') @pytest.fixture(scope='module') def cached_etree_parse(): def parse(fname): if fname in etree_cache: return etree_cache[fname] with (fname).open('rb') as fp: etree = HTML_PARSER.parse(fp) etree_cache.clear() etree_cache[fname] = etree return etree yield parse etree_cache.clear() @pytest.mark.skipif(not is_html5_writer_available(), reason='HTML5 writer is not available')
from hashlib import md5 import pytest from html5lib import getTreeBuilder, HTMLParser from test_build_html import flat_dict, tail_check, check_xpath from sphinx.util.docutils import is_html5_writer_available TREE_BUILDER = getTreeBuilder('etree', implementation=ElementTree) HTML_PARSER = HTMLParser(TREE_BUILDER, namespaceHTMLElements=False) etree_cache = {} @pytest.mark.skipif(not is_html5_writer_available(), reason='HTML5 writer is not available') @pytest.fixture(scope='module') def cached_etree_parse(): def parse(fname): if fname in etree_cache: return etree_cache[fname] with (fname).open('rb') as fp: etree = HTML_PARSER.parse(fp) etree_cache.clear() etree_cache[fname] = etree return etree yield parse etree_cache.clear() @pytest.mark.skipif(not is_html5_writer_available(), reason='HTML5 writer is not available')
@file @brief Defines a sphinx extension to add button to share a page .. versionadded:: 1.3 """ import os import copy import shutil import sphinx from docutils import nodes from docutils.parsers.rst import Directive, directives from sphinx.util.logging import getLogger from sphinx.util.docutils import is_html5_writer_available from sphinx.util import FilenameUniqDict if is_html5_writer_available(): from sphinx.writers.html5 import HTML5Translator as HTMLTranslator from sphinx.writers.html import HTMLTranslator as HTMLTranslatorOld inheritance = (HTMLTranslator, HTMLTranslatorOld) else: from sphinx.writers.html import HTMLTranslator inheritance = HTMLTranslator DEFAULT_CONFIG = dict( default_video_width='100%', default_video_height='auto', cache_path='_videos', ) class video_node(nodes.General, nodes.Element):
import pytest from html5lib import getTreeBuilder, HTMLParser from sphinx import __display_version__ from sphinx.util.docutils import is_html5_writer_available from util import remove_unicode_literals, strip_escseq, skip_unless from test_build_html import flat_dict, tail_check, check_xpath TREE_BUILDER = getTreeBuilder('etree', implementation=ElementTree) HTML_PARSER = HTMLParser(TREE_BUILDER, namespaceHTMLElements=False) etree_cache = {} @skip_unless(is_html5_writer_available()) @pytest.fixture(scope='module') def cached_etree_parse(): def parse(fname): if fname in etree_cache: return etree_cache[fname] with (fname).open('rb') as fp: etree = HTML_PARSER.parse(fp) etree_cache.clear() etree_cache[fname] = etree return etree yield parse etree_cache.clear()
import pytest from html5lib import getTreeBuilder, HTMLParser from sphinx import __display_version__ from sphinx.util.docutils import is_html5_writer_available from util import remove_unicode_literals, strip_escseq, skip_unless from test_build_html import flat_dict, tail_check, check_xpath TREE_BUILDER = getTreeBuilder('etree', implementation=ElementTree) HTML_PARSER = HTMLParser(TREE_BUILDER, namespaceHTMLElements=False) etree_cache = {} @skip_unless(is_html5_writer_available()) @pytest.fixture(scope='module') def cached_etree_parse(): def parse(fname): if fname in etree_cache: return etree_cache[fname] with (fname).open('rb') as fp: etree = HTML_PARSER.parse(fp) etree_cache.clear() etree_cache[fname] = etree return etree yield parse etree_cache.clear() @skip_unless(is_html5_writer_available())