Skip to content

Commit 848a9da

Browse files
SilverRainZDeepSeek
andcommitted
feat: Add :data:render: inline role
Add DataRenderRole as the inline counterpart of DataRenderDirective, allowing inline template rendering with :data:render: role. Fixes a bug where the role used self.content (always empty for roles) instead of self.text. Also passes an instance rather than a class to app.add_role to comply with docutils callable expectations. Co-authored-by: DeepSeek <service@deepseek.com>
1 parent 1ffd88e commit 848a9da

5 files changed

Lines changed: 52 additions & 0 deletions

File tree

docs/usage.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,24 @@ Directives
121121
122122
``1 + 1 = {{ 1 + 1 }}``
123123
124+
.. _ext-usage-roles:
125+
126+
Roles
127+
=====
128+
129+
.. rst:role:: data.render
130+
131+
Render a template inline without defining data.
132+
This is the inline counterpart of :rst:dir:`data.render` directive.
133+
134+
The role content is used as the Jinja2 template with an empty context.
135+
Refer to :doc:`tmpl` for guide of writing template.
136+
137+
.. example::
138+
:style: grid
139+
140+
:data.render:`{{ 1 + 1 }}` equals 2.
141+
124142
.. _usage-custom-directive:
125143

126144
Defining Custom Directives

src/sphinxnotes/render/ext/adhoc.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
BaseContextDirective,
2626
BaseDataDefineDirective,
2727
BaseDataDefineRole,
28+
BaseContextRole,
2829
)
2930
from ..utils.freestyle import FreeStyleDirective
3031

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

202203

204+
class DataRenderRole(BaseContextRole):
205+
@override
206+
def current_context(self) -> UnresolvedContext | ResolvedContext:
207+
return {}
208+
209+
@override
210+
def current_template(self) -> Template:
211+
return Template(
212+
self.text,
213+
phase=self.options.get('on', Phase.default()),
214+
debug='debug' in self.options,
215+
)
216+
217+
203218
def setup(app: Sphinx) -> None:
204219
app.add_directive('data.define', FreeDataDefineDirective)
205220
app.add_directive('data.template', TemplateDefineDirective)
206221
app.add_directive('data.schema', SchemaDefineDirective)
207222
app.add_directive('data.render', DataRenderDirective)
208223

209224
app.add_role('data.define', FreeDataDefineRole)
225+
app.add_role('data.render', DataRenderRole())
210226

211227
app.connect('source-read', FreeDataDefineRoleDispatcher().install)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
extensions = ['sphinxnotes.render.ext']
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Data Render Role Test
2+
=====================
3+
4+
This is a test of :data.render:`**bold**`.
5+
6+
Inline math: :data.render:`{{ 1 + 1 }}`.

tests/test_e2e.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,17 @@ def test_render_ext_data_define_directives(app, status, warning, phase):
107107
assert 'RenderedContent' in html
108108

109109

110+
@pytest.mark.sphinx('html', testroot='data-render-role')
111+
def test_render_ext_data_render_role(app, status, warning):
112+
"""Test that :data:render: role works correctly."""
113+
app.build()
114+
115+
html = (app.outdir / 'index.html').read_text(encoding='utf-8')
116+
117+
assert '<strong>bold</strong>' in html
118+
assert '2' in html
119+
120+
110121
@pytest.mark.sphinx('html', testroot='derive')
111122
def test_derived_render_ext_data_define_directives(app, status, warning):
112123
"""Test that render_ext_data_define_directives generates directives correctly."""

0 commit comments

Comments
 (0)