You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
import os
|
|
import re
|
|
from pathlib import Path
|
|
from typing import Union
|
|
from urllib.parse import unquote, urlparse
|
|
|
|
RE_PATH_ANCHOR = r"^file://([^/]+|/[A-Z]:)"
|
|
|
|
|
|
def normalized_uri(root_dir):
|
|
"""Attempt to make an LSP rootUri from a ContentsManager root_dir
|
|
|
|
Special care must be taken around windows paths: the canonical form of
|
|
windows drives and UNC paths is lower case
|
|
"""
|
|
root_uri = Path(root_dir).expanduser().resolve().as_uri()
|
|
root_uri = re.sub(
|
|
RE_PATH_ANCHOR, lambda m: "file://{}".format(m.group(1).lower()), root_uri
|
|
)
|
|
return root_uri
|
|
|
|
|
|
def file_uri_to_path(file_uri):
|
|
"""Return a path string for give file:/// URI.
|
|
|
|
Respect the different path convention on Windows.
|
|
Based on https://stackoverflow.com/a/57463161/6646912, BSD 0
|
|
"""
|
|
windows_path = os.name == "nt"
|
|
file_uri_parsed = urlparse(file_uri)
|
|
file_uri_path_unquoted = unquote(file_uri_parsed.path)
|
|
if windows_path and file_uri_path_unquoted.startswith("/"):
|
|
result = file_uri_path_unquoted[1:] # pragma: no cover
|
|
else:
|
|
result = file_uri_path_unquoted # pragma: no cover
|
|
return result
|
|
|
|
|
|
def is_relative(root: Union[str, Path], path: Union[str, Path]) -> bool:
|
|
"""Return if path is relative to root"""
|
|
try:
|
|
Path(path).resolve().relative_to(Path(root).resolve())
|
|
return True
|
|
except ValueError:
|
|
return False
|