diff --git a/src/sphinxnotes/strike/__init__.py b/src/sphinxnotes/strike/__init__.py index c4918ae..aa78fe4 100644 --- a/src/sphinxnotes/strike/__init__.py +++ b/src/sphinxnotes/strike/__init__.py @@ -19,13 +19,17 @@ from sphinx.builders import Builder from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.builders.latex import LaTeXBuilder +from sphinx.util import logging +from sphinx.environment import BuildEnvironment from . import meta +logger = logging.getLogger(__name__) -# List of all builders that support render :class:`strike_node`. +# NOTE: DEPRECATED since 1.3, DO NOT it. SUPPORTED_BUILDERS: list[type[Builder]] = [StandaloneHTMLBuilder, LaTeXBuilder] + class strike_node(nodes.Inline, nodes.TextElement): pass @@ -39,10 +43,16 @@ def strike_role( options: Dict = {}, content: List[str] = [], ) -> Tuple[List[Node], List[system_message]]: - env = inliner.document.settings.env # type: ignore - - if not isinstance(env.app.builder, tuple(SUPPORTED_BUILDERS)): - # Builder is not supported, fallback to text. + env: BuildEnvironment = inliner.document.settings.env # type: ignore + builder = env.app.builder + + if not _is_supported_builder(builder): + logger.warning( + f'role {typ} is not supported for builder {builder.name}, fallback to text', + location=(env.docname, lineno), + type='strike', + subtype='unspported_builder', + ) return [Text(unescape(text))], [] node = strike_node(rawtext, unescape(text)) @@ -74,6 +84,15 @@ def latext_depart_strike_node(self, node: strike_node) -> None: self.body.append('}') +def _is_supported_builder(builder: Builder) -> bool: + if isinstance(builder, tuple(SUPPORTED_BUILDERS)): + return True # NOTE: Compatible with version 1.2. + + # a dict of builder name -> dict of node name -> visitor and departure functions + handlers = builder.app.registry.translation_handlers[builder.name] + return handlers.get(strike_node.__name__) is not None + + def setup(app: Sphinx): """Sphinx extension entrypoint.""" meta.pre_setup(app)