Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions src/sphinxnotes/strike/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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))
Expand Down Expand Up @@ -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)
Expand Down