45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""Extra support for roles added by sphinx."""
|
|
import json
|
|
import os.path
|
|
from typing import List
|
|
from typing import Optional
|
|
|
|
import pygls.uris as Uri
|
|
from lsprotocol.types import CompletionItem
|
|
|
|
from esbonio.lsp.roles import Roles
|
|
from esbonio.lsp.rst import CompletionContext
|
|
from esbonio.lsp.sphinx import SphinxLanguageServer
|
|
from esbonio.lsp.util import resources
|
|
from esbonio.lsp.util.filepaths import complete_sphinx_filepaths
|
|
from esbonio.lsp.util.filepaths import path_to_completion_item
|
|
|
|
|
|
class Downloads:
|
|
def __init__(self, rst: SphinxLanguageServer):
|
|
self.rst = rst
|
|
self.logger = rst.logger.getChild(self.__class__.__name__)
|
|
|
|
def complete_targets(
|
|
self, context: CompletionContext, name: str, domain: Optional[str]
|
|
) -> List[CompletionItem]:
|
|
if domain or name != "download":
|
|
return []
|
|
|
|
if not self.rst.app:
|
|
return []
|
|
|
|
srcdir = self.rst.app.srcdir
|
|
partial = context.match.group("label")
|
|
base = os.path.dirname(Uri.to_fs_path(context.doc.uri))
|
|
items = complete_sphinx_filepaths(srcdir, base, partial) # type: ignore[arg-type]
|
|
|
|
return [path_to_completion_item(context, p) for p in items]
|
|
|
|
|
|
def esbonio_setup(rst: SphinxLanguageServer, roles: Roles):
|
|
sphinx_docs = resources.read_string("esbonio.lsp.sphinx", "roles.json")
|
|
roles.add_documentation(json.loads(sphinx_docs))
|
|
|
|
roles.add_target_completion_provider(Downloads(rst))
|