You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.6 KiB
52 lines
1.6 KiB
8 months ago
|
import sys
|
||
|
|
||
|
if sys.version_info >= (3, 10):
|
||
|
from importlib.metadata import EntryPoint, entry_points
|
||
|
else:
|
||
|
from importlib_metadata import entry_points, EntryPoint
|
||
|
|
||
|
from typing import Any, Dict, List, Type
|
||
|
|
||
|
_runtime_plugins: Dict[str, Dict[str, Type]] = {
|
||
|
"sphinxcontrib.bibtex.style.referencing": {}
|
||
|
}
|
||
|
|
||
|
|
||
|
# wrapper to work around missing type annotations for entry_points function
|
||
|
def _entry_points(group: str, name: str) -> List[EntryPoint]:
|
||
|
return entry_points(group=group, name=name) # type: ignore
|
||
|
|
||
|
|
||
|
def find_plugin(group: str, name: str) -> Type[Any]:
|
||
|
"""Load a sphinxcontrib-bibtex plugin, either from the runtime store,
|
||
|
or from the entry points.
|
||
|
"""
|
||
|
global _runtime_plugins
|
||
|
if group not in _runtime_plugins:
|
||
|
raise ImportError(f"plugin group {group} not found")
|
||
|
try:
|
||
|
return _runtime_plugins[group][name]
|
||
|
except KeyError:
|
||
|
for entry_point in _entry_points(group=group, name=name):
|
||
|
return entry_point.load()
|
||
|
raise ImportError(f"plugin {group}.{name} not found")
|
||
|
|
||
|
|
||
|
def register_plugin(
|
||
|
group: str, name: str, klass: Type[Any], force: bool = False
|
||
|
) -> bool:
|
||
|
"""Register a sphinxcontrib-bibtex plugin into the runtime store."""
|
||
|
global _runtime_plugins
|
||
|
if group not in _runtime_plugins:
|
||
|
raise ImportError(f"plugin group {group} not found")
|
||
|
eps: List[Any]
|
||
|
try:
|
||
|
eps = [_runtime_plugins[group][name]]
|
||
|
except KeyError:
|
||
|
eps = _entry_points(group=group, name=name)
|
||
|
if not eps or force:
|
||
|
_runtime_plugins[group][name] = klass
|
||
|
return True
|
||
|
else:
|
||
|
return False
|