51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
import json
|
|
from typing import Any
|
|
from typing import Dict
|
|
from typing import Optional
|
|
|
|
import docutils.parsers.rst.roles as docutils_roles
|
|
|
|
from esbonio.lsp.roles import RoleLanguageFeature
|
|
from esbonio.lsp.roles import Roles
|
|
from esbonio.lsp.rst import RstLanguageServer
|
|
from esbonio.lsp.util import resources
|
|
|
|
|
|
class Docutils(RoleLanguageFeature):
|
|
"""Support for docutils' built-in roles."""
|
|
|
|
def __init__(self) -> None:
|
|
self._roles: Optional[Dict[str, Any]] = None
|
|
"""Cache for known roles."""
|
|
|
|
@property
|
|
def roles(self) -> Dict[str, Any]:
|
|
if self._roles is not None:
|
|
return self._roles
|
|
|
|
found_roles = {**docutils_roles._roles, **docutils_roles._role_registry}
|
|
|
|
self._roles = {
|
|
k: v
|
|
for k, v in found_roles.items()
|
|
if v != docutils_roles.unimplemented_role
|
|
}
|
|
|
|
return self._roles
|
|
|
|
def get_implementation(self, role: str, domain: str):
|
|
if domain:
|
|
return None
|
|
|
|
return self.roles.get(role, None)
|
|
|
|
def index_roles(self) -> Dict[str, Any]:
|
|
return self.roles
|
|
|
|
|
|
def esbonio_setup(rst: RstLanguageServer, roles: Roles):
|
|
documentation = resources.read_string("esbonio.lsp.rst", "roles.json")
|
|
|
|
roles.add_documentation(json.loads(documentation))
|
|
roles.add_feature(Docutils())
|