|
"""A directive to generate the list of all the built-in components. |
|
|
|
Read the content of the component folder and generate a list of all the components. |
|
This list will display some informations about the component and a link to the |
|
GitHub file. |
|
""" |
|
|
|
import re |
|
from pathlib import Path |
|
from typing import Any, Dict, List |
|
|
|
from docutils import nodes |
|
from sphinx.application import Sphinx |
|
from sphinx.util import logging |
|
from sphinx.util.docutils import SphinxDirective |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
class ComponentListDirective(SphinxDirective): |
|
"""A directive to generate the list of all the built-in components. |
|
|
|
Read the content of the component folder and generate a list of all the components. |
|
This list will display some informations about the component and a link to the |
|
GitHub file. |
|
""" |
|
|
|
name = "component-list" |
|
has_content = True |
|
required_arguments = 0 |
|
optional_arguments = 0 |
|
final_argument_whitespace = True |
|
|
|
def run(self) -> List[nodes.Node]: |
|
"""Create the list.""" |
|
|
|
|
|
root = Path(__file__).parents[2] |
|
component_dir = ( |
|
root |
|
/ "src" |
|
/ "pydata_sphinx_theme" |
|
/ "theme" |
|
/ "pydata_sphinx_theme" |
|
/ "components" |
|
) |
|
if not component_dir.is_dir(): |
|
raise FileNotFoundError( |
|
f"Could not find component folder at {component_dir}." |
|
) |
|
components = sorted(component_dir.glob("*.html")) |
|
|
|
|
|
|
|
docs = [] |
|
pattern = re.compile(r"(?<={#).*?(?=#})", flags=re.DOTALL) |
|
for c in components: |
|
comment = pattern.findall(c.read_text()) |
|
docs.append(comment[0].strip() if comment else "No description available.") |
|
|
|
|
|
github_url = "https://github.com/pydata/pydata-sphinx-theme/blob/main" |
|
urls = [ |
|
f"{github_url}/{component.relative_to(root)}" for component in components |
|
] |
|
|
|
|
|
items = [] |
|
for component, url, doc in zip(components, urls, docs): |
|
items.append( |
|
nodes.list_item( |
|
"", |
|
nodes.paragraph( |
|
"", |
|
"", |
|
nodes.reference("", component.stem, internal=False, refuri=url), |
|
nodes.Text(f": {doc}"), |
|
), |
|
) |
|
) |
|
|
|
return [nodes.bullet_list("", *items)] |
|
|
|
|
|
def setup(app: Sphinx) -> Dict[str, Any]: |
|
"""Add custom configuration to sphinx app. |
|
|
|
Args: |
|
app: the Sphinx application |
|
|
|
Returns: |
|
the 2 parallel parameters set to ``True``. |
|
""" |
|
app.add_directive("component-list", ComponentListDirective) |
|
|
|
return { |
|
"parallel_read_safe": True, |
|
"parallel_write_safe": True, |
|
} |