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
9 changes: 9 additions & 0 deletions docs/conf.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ The extension provides the following configuration:

Name of the domain.

.. any:confval:: any_domain_dump
:type: bool
:default: 'True'

Whether dump domain data to ``DOCTREE_DIR/{any_domain_name}-objects.json``
(default be ``_build/doctrees/any-objects.json``).

.. versionadded:: 3.0a8

.. any:confval:: any_schemas
:type: List[sphinxnotes.any.Schema]
:default: []
Expand Down
42 changes: 42 additions & 0 deletions src/sphinxnotes/any/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

from __future__ import annotations
from typing import TYPE_CHECKING
import json
import dataclasses

from sphinx.util import logging

Expand Down Expand Up @@ -37,6 +39,43 @@ def _config_inited(app: Sphinx, config: Config) -> None:
app.add_domain(AnyDomain)


def _on_build_finished(app: Sphinx, _):
_dump_domain_data(app)


def _dump_domain_data(app: Sphinx):
"""Dump any domain data to a JSON file."""

name = app.config.any_domain_name
data = app.env.domaindata[name]
objs = {}
fn = f'{name}-objects.json'

# sphinx.util.status_iterator alias has been deprecated since sphinx 6.1
# and has been removed in sphinx 8.0
try:
from sphinx.util.display import status_iterator
except ImportError:
from sphinx.util import status_iterator

for (objtype, objid), (docname, anchor, obj) in status_iterator(
data['objects'].items(),
f'dump {name} domain data to {fn}... ',
'brown',
len(data['objects']),
0,
stringify_func=lambda i: f'{i[0][0]}-{i[0][1]}',
):
objs[f'{objtype}-{objid}'] = {
'docname': docname,
'anchor': anchor,
'obj': dataclasses.asdict(obj),
}

with open(app.doctreedir.joinpath(fn), 'w') as f:
f.write(json.dumps(objs, indent=2, ensure_ascii=False))


def setup(app: Sphinx):
"""Sphinx extension entrypoint."""
meta.pre_setup(app)
Expand All @@ -45,8 +84,11 @@ def setup(app: Sphinx):
TemplateEnvironment.setup(app)

app.add_config_value('any_domain_name', 'any', 'env', types=str)
app.add_config_value('any_domain_dump', True, '', types=bool)
app.add_config_value('any_schemas', [], 'env', types=list[Schema])

app.connect('config-inited', _config_inited)
app.connect('warn-missing-reference', warn_missing_reference)
app.connect('build-finished', _on_build_finished)

return meta.post_setup(app)