Skip to content

Instantly share code, notes, and snippets.

@agoose77
Created March 12, 2023 10:00
Show Gist options
  • Save agoose77/16a1db82f8649d4739e084e06ce8ac3f to your computer and use it in GitHub Desktop.
Save agoose77/16a1db82f8649d4739e084e06ce8ac3f to your computer and use it in GitHub Desktop.
Hide content through class names
from sphinx.transforms.post_transforms import SphinxPostTransform
from docutils import nodes
class HiddenNode(nodes.Element):
"""A node that will not be rendered."""
def __init__(self, rawsource="", *children, **attributes):
super().__init__("", **attributes)
@classmethod
def register(cls, app):
app.add_node(
cls,
override=True,
html=(visit_HiddenNode, None),
latex=(visit_HiddenNode, None),
textinfo=(visit_HiddenNode, None),
text=(visit_HiddenNode, None),
man=(visit_HiddenNode, None),
)
def visit_HiddenNode(self, node):
raise nodes.SkipNode
class HideNodesTransform(SphinxPostTransform):
"""Hides nodes with the given classes during rendering."""
default_priority = 400
def apply(self, **kwargs):
builder_ignore_classes = self.app.config['builder_ignore_classes']
ignore_classes = builder_ignore_classes.get(
self.app.builder.name, set()
)
for node in self.document.traverse(nodes.Element):
node_classes = set(node['classes'])
if node_classes & ignore_classes:
node.replace_self([HiddenNode()])
DEFAULT_BUILDER_IGNORE_CLASSES = {
"latex": [
"dropdown", "toggle", "margin",
]
}
def setup(app):
app.connect("builder-inited", setup_transforms)
app.connect('config-inited', setup_ignore_classes)
app.add_config_value("builder_ignore_classes", DEFAULT_BUILDER_IGNORE_CLASSES, "env", [dict])
def setup_ignore_classes(app, config):
config['builder_ignore_classes'] = {
k: set(v) for k, v in config['builder_ignore_classes'].items()
}
def setup_transforms(app):
app.add_post_transform(HideNodesTransform)
HiddenNode.register(app)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment