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
 |