Skip to content

Commit

Permalink
feat: Register all anchors for each object in the inventory
Browse files Browse the repository at this point in the history
  • Loading branch information
pawamoy committed Aug 28, 2023
1 parent 0b06d6a commit 228fb73
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 22 deletions.
29 changes: 22 additions & 7 deletions src/mkdocstrings/extension.py
Expand Up @@ -137,13 +137,28 @@ def run(self, parent: Element, blocks: MutableSequence[str]) -> None:
self._autorefs.register_anchor(page, rendered_anchor)

if "data-role" in heading.attrib:
for anchor in sorted({rendered_anchor, *handler.get_anchors(data)}):
self._handlers.inventory.register(
name=anchor,
domain=handler.domain,
role=heading.attrib["data-role"],
uri=f"{page}#{rendered_anchor}",
)
self._handlers.inventory.register(
name=rendered_anchor,
domain=handler.domain,
role=heading.attrib["data-role"],
priority=1, # register with standard priority
uri=f"{page}#{rendered_anchor}",
)

# also register other anchors for this object in the inventory
try:
data_object = handler.collect(rendered_anchor, handler.fallback_config)
except CollectionError:
continue
for anchor in handler.get_anchors(data_object):
if anchor not in self._handlers.inventory:
self._handlers.inventory.register(
name=anchor,
domain=handler.domain,
role=heading.attrib["data-role"],
priority=2, # register with lower priority
uri=f"{page}#{rendered_anchor}",
)

parent.append(el)

Expand Down
29 changes: 14 additions & 15 deletions src/mkdocstrings/inventory.py
Expand Up @@ -20,7 +20,7 @@ def __init__(
domain: str,
role: str,
uri: str,
priority: str = "1",
priority: int = 1,
dispname: str | None = None,
):
"""Initialize the object.
Expand All @@ -30,14 +30,14 @@ def __init__(
domain: The item domain, like 'python' or 'crystal'.
role: The item role, like 'class' or 'method'.
uri: The item URI.
priority: The item priority. It can help for inventory suggestions.
priority: The item priority. Only used internally by mkdocstrings and Sphinx.
dispname: The item display name.
"""
self.name: str = name
self.domain: str = domain
self.role: str = role
self.uri: str = uri
self.priority: str = priority
self.priority: int = priority
self.dispname: str = dispname or name

def format_sphinx(self) -> str:
Expand Down Expand Up @@ -67,7 +67,7 @@ def parse_sphinx(cls, line: str) -> InventoryItem:
uri = uri[:-1] + name
if dispname == "-":
dispname = name
return cls(name, domain, role, uri, priority, dispname)
return cls(name, domain, role, uri, int(priority), dispname)


class Inventory(dict):
Expand All @@ -94,7 +94,7 @@ def register(
domain: str,
role: str,
uri: str,
priority: str = "1",
priority: int = 1,
dispname: str | None = None,
) -> None:
"""Create and register an item.
Expand All @@ -104,18 +104,17 @@ def register(
domain: The item domain, like 'python' or 'crystal'.
role: The item role, like 'class' or 'method'.
uri: The item URI.
priority: The item priority. It can help for inventory suggestions.
priority: The item priority. Only used internally by mkdocstrings and Sphinx.
dispname: The item display name.
"""
if name not in self:
self[name] = InventoryItem(
name=name,
domain=domain,
role=role,
uri=uri,
priority=priority,
dispname=dispname,
)
self[name] = InventoryItem(
name=name,
domain=domain,
role=role,
uri=uri,
priority=priority,
dispname=dispname,
)

def format_sphinx(self) -> bytes:
"""Format this inventory as a Sphinx `objects.inv` file.
Expand Down

0 comments on commit 228fb73

Please sign in to comment.