in src/doc_builder/autodoc.py [0:0]
def resolve_links_in_text(text, package, mapping, page_info):
"""
Resolve links of the form [`SomeClass`] to the link in the documentation to `SomeClass`.
Args:
text (`str`): The text in which to convert the links.
package (`types.ModuleType`): The package in which to search objects for.
mapping (`Dict[str, str]`): The map from anchor names of objects to their page in the documentation.
page_info (`Dict[str, str]`): Some information about the page.
"""
package_name = page_info.get("package_name", package.__name__)
version = page_info.get("version", "main")
language = page_info.get("language", "en")
prefix = f"/docs/{package_name}/{version}/{language}/"
def _resolve_link(search):
object_or_param_name, last_char = search.groups()
# Deal with external libs first.
lib_name = object_or_param_name.split(".")[0]
if lib_name.startswith("~"):
lib_name = lib_name[1:]
if lib_name in HUGGINFACE_LIBS and lib_name != package_name:
link = get_external_object_link(object_or_param_name, page_info)
return f"{link}{last_char}"
object_name, param_name = None, None
# If `#` is in the name, assume it's a link to the function/method parameter.
if "#" in object_or_param_name:
object_name_for_param = object_or_param_name.split("#", 1)[0]
# Strip preceding `~` if it's there.
object_name_for_param = (
object_name_for_param[1:] if object_name_for_param.startswith("~") else object_name_for_param
)
obj = find_object_in_package(object_name_for_param, package)
param_name = object_or_param_name.split("#", 1)[-1]
# If the name begins with `~`, we shortcut to the last part.
elif object_or_param_name.startswith("~"):
obj = find_object_in_package(object_or_param_name[1:], package)
object_name = object_or_param_name.split(".")[-1]
else:
obj = find_object_in_package(object_or_param_name, package)
object_name = object_or_param_name
# Object not found, return the original link text.
if obj is None:
return f"`{object_or_param_name}`{last_char}"
link_name = object_name if param_name is None else param_name
# If the link points to an object and the object is not a class, we add ()
if param_name is None and not isinstance(obj, (type, property)):
link_name = f"{link_name}()"
# Link to the anchor
anchor = get_shortest_path(obj, package)
if anchor not in mapping:
return f"`{link_name}`{last_char}"
page = f"{prefix}{mapping[anchor]}"
if param_name:
anchor = f"{anchor}.{param_name}"
if "#" in page:
return f"[{link_name}]({page}){last_char}"
else:
return f"[{link_name}]({page}#{anchor}){last_char}"
return re.sub(r"\[`([^`]+)`\]([^\(])", _resolve_link, text)