Skip to content
Merged
Show file tree
Hide file tree
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
18 changes: 18 additions & 0 deletions docs/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,24 @@ Directives

``1 + 1 = {{ 1 + 1 }}``

.. _ext-usage-roles:

Roles
=====

.. rst:role:: data.render

Render a template inline without defining data.
This is the inline counterpart of :rst:dir:`data.render` directive.

The role content is used as the Jinja2 template with an empty context.
Refer to :doc:`tmpl` for guide of writing template.

.. example::
:style: grid

:data.render:`{{ 1 + 1 }}` equals 2.

.. _usage-custom-directive:

Defining Custom Directives
Expand Down
16 changes: 16 additions & 0 deletions src/sphinxnotes/render/ext/adhoc.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
BaseContextDirective,
BaseDataDefineDirective,
BaseDataDefineRole,
BaseContextRole,
)
from ..utils.freestyle import FreeStyleDirective

Expand Down Expand Up @@ -200,12 +201,27 @@ def install(self, app: Sphinx, docname: str, source: list[str]) -> None:
self.enable()


class DataRenderRole(BaseContextRole):
@override
def current_context(self) -> UnresolvedContext | ResolvedContext:
return {}

@override
def current_template(self) -> Template:
return Template(
self.text,
phase=self.options.get('on', Phase.default()),
debug='debug' in self.options,
)


def setup(app: Sphinx) -> None:
app.add_directive('data.define', FreeDataDefineDirective)
app.add_directive('data.template', TemplateDefineDirective)
app.add_directive('data.schema', SchemaDefineDirective)
app.add_directive('data.render', DataRenderDirective)

app.add_role('data.define', FreeDataDefineRole)
app.add_role('data.render', DataRenderRole())

app.connect('source-read', FreeDataDefineRoleDispatcher().install)
1 change: 1 addition & 0 deletions tests/roots/test-data-render-role/conf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
extensions = ['sphinxnotes.render.ext']
6 changes: 6 additions & 0 deletions tests/roots/test-data-render-role/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Data Render Role Test
=====================

This is a test of :data.render:`**bold**`.

Inline math: :data.render:`{{ 1 + 1 }}`.
11 changes: 11 additions & 0 deletions tests/test_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,17 @@ def test_render_ext_data_define_directives(app, status, warning, phase):
assert 'RenderedContent' in html


@pytest.mark.sphinx('html', testroot='data-render-role')
def test_render_ext_data_render_role(app, status, warning):
"""Test that :data:render: role works correctly."""
app.build()

html = (app.outdir / 'index.html').read_text(encoding='utf-8')

assert '<strong>bold</strong>' in html
assert '2' in html


@pytest.mark.sphinx('html', testroot='derive')
def test_derived_render_ext_data_define_directives(app, status, warning):
"""Test that render_ext_data_define_directives generates directives correctly."""
Expand Down