[Bf-docboard-svn] bf-manual: [8199] trunk/blender_docs: Add custom reference directive

Aaron Carlisle noreply at blender.org
Mon Jul 12 04:23:26 CEST 2021


Revision: 8199
          https://developer.blender.org/rBM8199
Author:   Blendify
Date:     2021-07-12 04:23:25 +0200 (Mon, 12 Jul 2021)
Log Message:
-----------
Add custom reference directive

The goal of this change is to simplify our custom markup.

Instead of:

```
.. admonition:: Reference
   :class: refbox
```

Writers can now just use:

```
.. reference::
```

This is easier to type and remember and is less prone to errors.

Modified Paths:
--------------
    trunk/blender_docs/manual/conf.py

Added Paths:
-----------
    trunk/blender_docs/exts/reference.py

Added: trunk/blender_docs/exts/reference.py
===================================================================
--- trunk/blender_docs/exts/reference.py	                        (rev 0)
+++ trunk/blender_docs/exts/reference.py	2021-07-12 02:23:25 UTC (rev 8199)
@@ -0,0 +1,67 @@
+
+from docutils import nodes
+from docutils.nodes import Element, Node
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.directives.admonitions import BaseAdmonition
+
+from sphinx.locale import _
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.typing import OptionSpec
+
+
+class refbox(nodes.Admonition, nodes.Element):
+    pass
+
+
+def visit_refbox_node(self, node):
+    self.visit_admonition(node)
+
+
+def depart_refbox_node(self, node):
+    self.depart_admonition(node)
+
+
+class ReferenceDirective(BaseAdmonition, SphinxDirective):
+    node_class = refbox
+    has_content = True
+    required_arguments = 0
+    optional_arguments = 0
+    final_argument_whitespace = False
+    option_spec: OptionSpec = {
+        'class': directives.class_option,
+        'name': directives.unchanged,
+    }
+
+    def run(self):
+        if not self.options.get('class'):
+            self.options['class'] = ['refbox']
+
+        (reference,) = super().run()
+        if isinstance(reference, nodes.system_message):
+            return [reference]
+        elif isinstance(reference, refbox):
+            reference.insert(0, nodes.title(text=_('Reference')))
+            reference['docname'] = self.env.docname
+            self.add_name(reference)
+            self.set_source_info(reference)
+            self.state.document.note_explicit_target(reference)
+            return [reference]
+        else:
+            raise RuntimeError  # never reached here
+
+
+def setup(app):
+    app.add_node(refbox,
+                html=(visit_refbox_node, depart_refbox_node),
+                latex=(visit_refbox_node, depart_refbox_node),
+                text=(visit_refbox_node, depart_refbox_node),
+                man=(visit_refbox_node, depart_refbox_node),
+                texinfo=(visit_refbox_node, depart_refbox_node))
+
+    app.add_directive('reference', ReferenceDirective)
+
+    return {
+        'version': '1.0',
+        'parallel_read_safe': True,
+        'parallel_write_safe': True,
+    }


Property changes on: trunk/blender_docs/exts/reference.py
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: trunk/blender_docs/manual/conf.py
===================================================================
--- trunk/blender_docs/manual/conf.py	2021-07-12 02:14:09 UTC (rev 8198)
+++ trunk/blender_docs/manual/conf.py	2021-07-12 02:23:25 UTC (rev 8199)
@@ -50,6 +50,7 @@
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
+    'reference',
     'youtube',
     'vimeo',
     'sphinx.ext.mathjax',



More information about the Bf-docboard-svn mailing list