nwb-linkml/docs/directives.py

86 lines
2.2 KiB
Python

import codecs
import os
import sys
from docutils import nodes
from docutils.parsers.rst import Directive
from docutils.parsers.rst import directives
from docutils.statemachine import StringList
from jinja2 import FileSystemLoader, Environment
import sphinx.util
TEMPLATE = """
.. grid:: 2
:gutter: 1
:margin: 0
:padding: 0
.. grid-item-card::
:margin: 0
NWB Schema
^^^
.. code-block:: yaml
{{ nwb }}
.. grid-item-card::
:margin: 0
LinkML
^^^
.. code-block:: yaml
{{ linkml }}
"""
class AdapterDirective(Directive):
"""
Directive for writing inline adapter doctests with pretty rendering :)
Based on sphinx-jinja: https://pypi.org/project/sphinx-jinja/
"""
has_content = True
optional_arguments = 1
option_spec = {
"nwb": directives.unchanged,
"linkml": directives.unchanged,
}
app = None
def run(self):
node = nodes.Element()
node.document = self.state.document
cxt = {
'nwb': self.options.get("nwb"),
'linkml': self.options.get("linkml")
}
template = Environment(
#**conf.jinja_env_kwargs
).from_string(TEMPLATE)
new_content = template.render(**cxt)
new_content = StringList(new_content.splitlines(), source='')
sphinx.util.nested_parse_with_titles(self.state, new_content, node)
return node.children
def debug_print(title, content):
stars = '*' * 10
print('\n{1} Begin Debug Output: {0} {1}'.format(title, stars))
print(content)
print('\n{1} End Debug Output: {0} {1}'.format(title, stars))
def setup(app):
AdapterDirective.app = app
app.add_directive('jinja', JinjaDirective)
app.add_config_value('jinja_contexts', {}, 'env')
app.add_config_value('jinja_base', app.srcdir, 'env')
app.add_config_value('jinja_env_kwargs', {}, 'env')
app.add_config_value('jinja_filters', {}, 'env')
app.add_config_value('jinja_tests', {}, 'env')
app.add_config_value('jinja_globals', {}, 'env')
app.add_config_value('jinja_policies', {}, 'env')
return {'parallel_read_safe': True, 'parallel_write_safe': True}