Skip to content

Commit d5c918b

Browse files
committed
refactor: Split render to multiple modules
1 parent c661b14 commit d5c918b

15 files changed

Lines changed: 917 additions & 825 deletions

File tree

docs/index.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,22 @@ Introduction
4646
:{{ k }}: {{ v }}
4747
{%- endfor %}
4848

49-
This document "_doc.title" has {{ _doc.sections | length }} section(s).
49+
This document "{{ _doc.title }}" has {{ _doc.sections | length }} section(s).
5050

5151
{{ content }}
5252

5353
.. data:: Shengyu Zhang
5454
:github: SilverRainZ
5555
:homepage: https://silverrainz.me/
5656

57+
.. template::
58+
59+
I am an inline *{{ content }}*
60+
61+
:data:`text`
62+
63+
:pep:`abc`
64+
5765
.. INTRODUCTION END
5866
5967
Getting Started

src/sphinxnotes/data/__init__.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,17 @@
2323
Field,
2424
Schema,
2525
)
26-
from .template import Phase, Template
2726
from .render import (
28-
Host,
29-
pending_node,
30-
rendered_node,
31-
BaseDataDefiner,
27+
pending_data,
28+
rendered_data,
3229
BaseDataDefineRole,
3330
BaseDataDefineDirective,
3431
StrictDataDefineDirective,
35-
ExtraContextRegistry,
36-
EXTRACTX_REGISTRY,
3732
)
33+
from .render.template import Template
34+
from .render.renderer import Host
35+
from .render.extractx import ExtraContextRegistry, ExtraContextGenerator
3836
from .config import Config
39-
from . import extractx
4037

4138
if TYPE_CHECKING:
4239
from sphinx.application import Sphinx
@@ -56,13 +53,11 @@
5653
'Phase',
5754
'Template',
5855
'Host',
59-
'pending_node',
60-
'rendered_node',
61-
'rendered_node',
62-
'BaseDataDefiner',
56+
'pending_data',
57+
'rendered_data',
58+
'rendered_data',
6359
'BaseDataDefineRole',
6460
'BaseDataDefineDirective',
65-
'BaseDataDefineDirective',
6661
'StrictDataDefineDirective',
6762
]
6863

@@ -77,8 +72,8 @@ def data(self) -> DataRegistry:
7772
return DATA_REGISTRY
7873

7974
@property
80-
def extractx(cls) -> ExtraContextRegistry:
81-
return EXTRACTX_REGISTRY
75+
def extra_context(cls) -> ExtraContextRegistry:
76+
return ExtraContextGenerator.registry
8277

8378

8479
REGISTRY = Registry()
@@ -87,7 +82,8 @@ def extractx(cls) -> ExtraContextRegistry:
8782
def setup(app: Sphinx):
8883
meta.pre_setup(app)
8984

90-
from . import config, template, render, adhoc
85+
from . import config, render, adhoc
86+
from .render import template
9187

9288
config.setup(app)
9389
template.setup(app)

src/sphinxnotes/data/adhoc.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
from sphinx.util.docutils import SphinxDirective
2323

2424
from .data import Field, Schema
25-
from .template import Template, Phase
26-
from .render import BaseDataDefineDirective
25+
from .render.template import Template
26+
from .render.nodes import Phase
27+
from .render import BaseDataDefineDirective, BaseDataDefineRole
2728
from .utils.freestyle import FreeStyleDirective, FreeStyleOptionSpec
2829
from . import preset
2930

@@ -35,19 +36,20 @@
3536
SCHEMA_KEY = 'sphinxnotes-data:schema'
3637

3738

39+
def phase_option_spec(arg):
40+
choice = directives.choice(arg, [x.value for x in Phase])
41+
return Phase[choice.title()]
42+
43+
3844
class TemplateDefineDirective(SphinxDirective):
3945
option_spec = {
40-
'on': Phase.option_spec,
46+
'on': phase_option_spec,
4147
'debug': directives.flag,
4248
}
4349
has_content = True
4450

4551
def run(self) -> list[nodes.Node]:
46-
self.env.temp_data[TEMPLATE_KEY] = Template(
47-
text='\n'.join(self.content),
48-
phase=self.options.get('on', Phase.default()),
49-
debug='debug' in self.options,
50-
)
52+
self.env.temp_data[TEMPLATE_KEY] = Template('\n'.join(self.content))
5153

5254
return []
5355

@@ -68,12 +70,7 @@ def run(self) -> list[nodes.Node]:
6870

6971
return []
7072

71-
72-
if TYPE_CHECKING:
73-
...
74-
75-
76-
class FreeDataDefineDirective(BaseDataDefineDirective, FreeStyleDirective):
73+
class AdhocDataDefineDirective(BaseDataDefineDirective, FreeStyleDirective):
7774
optional_arguments = 1
7875
has_content = True
7976

@@ -88,7 +85,20 @@ def current_schema(self) -> Schema:
8885
return cast(Schema, schema)
8986

9087

88+
class AdhocDataDefineRole(BaseDataDefineRole):
89+
@override
90+
def current_template(self) -> Template:
91+
tmpl = self.env.temp_data.get(TEMPLATE_KEY, preset.Directive.template())
92+
return cast(Template, tmpl)
93+
94+
@override
95+
def current_schema(self) -> Schema:
96+
schema = self.env.temp_data.get(SCHEMA_KEY, preset.Directive.schema())
97+
return cast(Schema, schema)
98+
9199
def setup(app: Sphinx):
92100
app.add_directive('template', TemplateDefineDirective)
93101
app.add_directive('schema', SchemaDefineDirective)
94-
app.add_directive('data', FreeDataDefineDirective)
102+
app.add_directive('data', AdhocDataDefineDirective)
103+
104+
app.add_role('data', AdhocDataDefineRole())

src/sphinxnotes/data/data.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def _bool_conv(v: str | None) -> bool:
9797
if v in ('false', 'no', '0', 'off', 'n', None):
9898
return False
9999
# Same to :meth:`directives.flag`.
100-
raise ValueError(f'no argument is allowed; "{v}" supplied')
100+
raise ValueError(f'No argument is allowed; "{v}" supplied')
101101

102102

103103
def _str_conv(v: str) -> str:
@@ -172,7 +172,7 @@ def add_form(
172172
self, name: str, ctype: type, sep: str, aliases: list[str] = []
173173
) -> None:
174174
if ctype not in self.ctypes:
175-
raise ValueError(f'unsupported type: "{ctype}". available: {self.ctypes}')
175+
raise ValueError(f'Unsupported type: "{ctype}". Available: {self.ctypes}')
176176

177177
form = Form(ctype, sep)
178178

@@ -297,7 +297,7 @@ def parse(self, rawval: str | None) -> Value:
297297
if rawval is None:
298298
if self.required:
299299
# Same to :meth:`directives.unchanged_required`.
300-
raise ValueError('argument required but none supplied')
300+
raise ValueError('Argument required but none supplied')
301301
if self.ctype:
302302
# Return a empty container when a None value is optional.
303303
return self.ctype()
@@ -329,7 +329,7 @@ def parse(self, rawval: str | None) -> Value:
329329

330330
return self.ctype(elems)
331331
except ValueError as e:
332-
raise ValueError(f"failed to parse '{rawval}' as {self.etype}: {e}") from e
332+
raise ValueError(f"Failed to parse '{rawval}' as {self.etype}: {e}") from e
333333

334334
def __getattr__(self, name: str) -> Value:
335335
if name in self.flags:
@@ -382,13 +382,13 @@ def _apply_modifier(self, mod: str):
382382

383383
if etype not in REGISTRY.etypes:
384384
raise ValueError(
385-
f'unsupported type: "{etype}". '
386-
f'available: {list(REGISTRY.etypes.keys())}'
385+
f'Unsupported type: "{etype}". '
386+
f'Available: {list(REGISTRY.etypes.keys())}'
387387
)
388388
if form not in REGISTRY.forms:
389389
raise ValueError(
390-
f'unsupported form: "{form}". '
391-
f'available: {list(REGISTRY.forms.keys())}'
390+
f'Unsupported form: "{form}". '
391+
f'Available: {list(REGISTRY.forms.keys())}'
392392
)
393393

394394
self.field.etype = REGISTRY.etypes[etype]
@@ -407,8 +407,8 @@ def _apply_modifier(self, mod: str):
407407

408408
if optname not in REGISTRY.byopts:
409409
raise ValueError(
410-
f'unsupported by-option: "{optname}" by. '
411-
f'available: {list(REGISTRY.byopts.keys())}'
410+
f'Unsupported by-option: "{optname}" by. '
411+
f'Available: {list(REGISTRY.byopts.keys())}'
412412
)
413413

414414
flags = self.field.flags
@@ -438,13 +438,13 @@ def _apply_modifier(self, mod: str):
438438
self.field.flags[opt.name] = not opt.default
439439
return
440440

441-
raise ValueError(f"unknown modifier: '{mod}'")
441+
raise ValueError(f"Unknown modifier: '{mod}'")
442442

443443
@staticmethod
444444
def by_option_store_value_error(opt: ByOption) -> ValueError:
445445
raise ValueError(
446-
f'unsupported by-option store: "{opt.store}". '
447-
f'available: {ByOptionStore}' # FIXME:
446+
f'Unsupported by-option store: "{opt.store}". '
447+
f'Available: {ByOptionStore}' # FIXME:
448448
)
449449

450450

@@ -472,14 +472,14 @@ def _parse_single(
472472
) -> Value:
473473
if field[1] is None and rawval is not None:
474474
raise ValueError(
475-
f'parsing {field[0]}: no argument is allowed; "{rawval}" supplied'
475+
f'Parsing {field[0]}: no argument is allowed; "{rawval}" supplied'
476476
)
477477

478478
try:
479479
assert field[1] is not None
480480
return field[1].parse(rawval)
481481
except Exception as e:
482-
raise ValueError(f'parsing {field[0]}: {e}')
482+
raise ValueError(f'Parsing {field[0]}: {e}')
483483

484484
def parse(self, data: RawData) -> ParsedData:
485485
if data.name:
@@ -497,7 +497,7 @@ def parse(self, data: RawData) -> ParsedData:
497497
if rawval := rawattrs.pop(key, None):
498498
attrs[key] = self._parse_single(('attrs.' + key, field), rawval)
499499
for key, rawval in rawattrs.items():
500-
raise ValueError(f'unknown attr: "{key}"')
500+
raise ValueError(f'Unknown attr: "{key}"')
501501

502502
if data.content:
503503
content = self._parse_single(('content', self.content), data.content)

src/sphinxnotes/data/extractx.py

Lines changed: 0 additions & 87 deletions
This file was deleted.

0 commit comments

Comments
 (0)