"""docutils writers handling Sphinx' custom nodes.""" from __future__ import annotations from typing import TYPE_CHECKING, cast from docutils.writers.html4css1 import Writer from sphinx.util import logging from sphinx.writers.html5 import HTML5Translator if TYPE_CHECKING: from sphinx.builders.html import StandaloneHTMLBuilder logger = logging.getLogger(__name__) HTMLTranslator = HTML5Translator # A good overview of the purpose behind these classes can be found here: # http://www.arnebrodowski.de/blog/write-your-own-restructuredtext-writer.html class HTMLWriter(Writer): # override embed-stylesheet default value to False. settings_default_overrides = {"embed_stylesheet": False} def __init__(self, builder: StandaloneHTMLBuilder) -> None: super().__init__() self.builder = builder def translate(self) -> None: # sadly, this is mostly copied from parent class visitor = self.builder.create_translator(self.document, self.builder) self.visitor = cast(HTML5Translator, visitor) self.document.walkabout(visitor) self.output = self.visitor.astext() for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix', 'body_pre_docinfo', 'docinfo', 'body', 'fragment', 'body_suffix', 'meta', 'title', 'subtitle', 'header', 'footer', 'html_prolog', 'html_head', 'html_title', 'html_subtitle', 'html_body'): setattr(self, attr, getattr(visitor, attr, None)) self.clean_meta = ''.join(self.visitor.meta[2:])