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.
		
		
		
		
		
			
		
			
				
	
	
		
			153 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
from lark import Lark, ParseTree, exceptions
 | 
						|
 | 
						|
from pathlib import Path
 | 
						|
 | 
						|
from rfc3987_syntax.utils import load_grammar
 | 
						|
 | 
						|
RFC3987_SYNTAX_PARSER_TYPE: str = "earley"
 | 
						|
RFC3987_SYNTAX_GRAMMAR_PATH: Path = Path(__file__).parent / "syntax_rfc3987.lark"
 | 
						|
RFC3987_SYNTAX_TERMS: list[str] = [
 | 
						|
    "iri",
 | 
						|
    "iri_reference",
 | 
						|
    "absolute_iri",
 | 
						|
    "scheme",
 | 
						|
    "irelative_ref",
 | 
						|
    "irelative_part"
 | 
						|
    "ihier_part",
 | 
						|
    "iauthority",
 | 
						|
    "iuserinfo",
 | 
						|
    "ihost",
 | 
						|
    "ireg_name",
 | 
						|
    "ipath_abempty",
 | 
						|
    "isegment",
 | 
						|
    "isegment_nz",
 | 
						|
    "isegment_nz_nc",
 | 
						|
    "ipchar",
 | 
						|
    "iquery",
 | 
						|
    "ifragment",
 | 
						|
    "iunreserved",
 | 
						|
    "ucschar",
 | 
						|
    "iprivate",
 | 
						|
    "sub_delims",
 | 
						|
    "ip_literal",
 | 
						|
    "ipvfuture",
 | 
						|
    "ipv6address",
 | 
						|
    "h16",
 | 
						|
    "ls32",
 | 
						|
    "ipv4address",
 | 
						|
    "dec_octet",
 | 
						|
    "digit",
 | 
						|
    "non_zero",
 | 
						|
    "unreserved",
 | 
						|
    "alpha",
 | 
						|
    "hexdig",
 | 
						|
    "port",
 | 
						|
    "pct_encoded",
 | 
						|
]
 | 
						|
 | 
						|
grammar: str = load_grammar(RFC3987_SYNTAX_GRAMMAR_PATH)
 | 
						|
 | 
						|
syntax_parser = Lark(grammar, start=["iri", "iri_reference", "absolute_iri"], parser=RFC3987_SYNTAX_PARSER_TYPE)
 | 
						|
 | 
						|
 | 
						|
def parse(term: str, value: str) -> ParseTree:
 | 
						|
    return syntax_parser.parse(value, start=term)
 | 
						|
 | 
						|
 | 
						|
def is_valid_syntax(term: str, value: str):
 | 
						|
    try:
 | 
						|
        parse(term=term, value=value)
 | 
						|
        return True
 | 
						|
    except exceptions.LarkError:
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
def make_syntax_validator(rule_name):
 | 
						|
    parser = Lark(grammar, start=rule_name, parser=RFC3987_SYNTAX_PARSER_TYPE)
 | 
						|
 | 
						|
    def syntax_validator(text):
 | 
						|
        try:
 | 
						|
            parser.parse(text)
 | 
						|
            return True
 | 
						|
        except exceptions.LarkError:
 | 
						|
            return False
 | 
						|
 | 
						|
    return syntax_validator
 | 
						|
 | 
						|
 | 
						|
is_valid_syntax_iri = make_syntax_validator("iri")
 | 
						|
 | 
						|
is_valid_syntax_iri_reference = make_syntax_validator("iri_reference")
 | 
						|
 | 
						|
is_valid_syntax_absolute_iri = make_syntax_validator("absolute_iri")
 | 
						|
 | 
						|
is_valid_syntax_irelative_ref = make_syntax_validator("irelative_ref")
 | 
						|
 | 
						|
is_valid_syntax_irelative_part = make_syntax_validator("irelative_part")
 | 
						|
 | 
						|
is_valid_syntax_ihier_part = make_syntax_validator("ihier_part")
 | 
						|
 | 
						|
is_valid_syntax_iauthority = make_syntax_validator("iauthority")
 | 
						|
 | 
						|
is_valid_syntax_iuserinfo = make_syntax_validator("iuserinfo")
 | 
						|
 | 
						|
is_valid_syntax_ihost = make_syntax_validator("ihost")
 | 
						|
 | 
						|
is_valid_syntax_ireg_name = make_syntax_validator("ireg_name")
 | 
						|
 | 
						|
is_valid_syntax_ipath = make_syntax_validator("ipath")
 | 
						|
 | 
						|
is_valid_syntax_ipath_abempty = make_syntax_validator("ipath_abempty")
 | 
						|
 | 
						|
is_valid_syntax_ipath_absolute = make_syntax_validator("ipath_absolute")
 | 
						|
 | 
						|
is_valid_syntax_ipath_noscheme = make_syntax_validator("ipath_noscheme")
 | 
						|
 | 
						|
is_valid_syntax_ipath_rootless = make_syntax_validator("ipath_rootless")
 | 
						|
 | 
						|
is_valid_syntax_ipath_empty = make_syntax_validator("ipath_empty")
 | 
						|
 | 
						|
is_valid_syntax_isegment = make_syntax_validator("isegment")
 | 
						|
 | 
						|
is_valid_syntax_isegment_nz = make_syntax_validator("isegment_nz")
 | 
						|
 | 
						|
is_valid_syntax_isegment_nz_nc = make_syntax_validator("isegment_nz_nc")
 | 
						|
 | 
						|
is_valid_syntax_ipchar = make_syntax_validator("ipchar")
 | 
						|
 | 
						|
is_valid_syntax_iquery = make_syntax_validator("iquery")
 | 
						|
 | 
						|
is_valid_syntax_ifragment = make_syntax_validator("ifragment")
 | 
						|
 | 
						|
is_valid_syntax_iunreserved = make_syntax_validator("iunreserved")
 | 
						|
 | 
						|
is_valid_syntax_ucschar = make_syntax_validator("ucschar")
 | 
						|
 | 
						|
is_valid_syntax_iprivate = make_syntax_validator("iprivate")
 | 
						|
 | 
						|
is_valid_syntax_sub_delims = make_syntax_validator("sub_delims")
 | 
						|
 | 
						|
is_valid_syntax_ip_literal = make_syntax_validator("ip_literal")
 | 
						|
 | 
						|
is_valid_syntax_ipvfuture = make_syntax_validator("ipvfuture")
 | 
						|
 | 
						|
is_valid_syntax_ipv6address = make_syntax_validator("ipv6address")
 | 
						|
 | 
						|
is_valid_syntax_h16 = make_syntax_validator("h16")
 | 
						|
 | 
						|
is_valid_syntax_ls32 = make_syntax_validator("ls32")
 | 
						|
 | 
						|
is_valid_syntax_ipv4address = make_syntax_validator("ipv4address")
 | 
						|
 | 
						|
is_valid_syntax_dec_octet = make_syntax_validator("dec_octet")
 | 
						|
 | 
						|
is_valid_syntax_unreserved = make_syntax_validator("unreserved")
 | 
						|
 | 
						|
is_valid_syntax_alpha = make_syntax_validator("alpha")
 | 
						|
 | 
						|
is_valid_syntax_digit = make_syntax_validator("digit")
 | 
						|
 | 
						|
is_valid_syntax_hexdig = make_syntax_validator("hexdig")
 | 
						|
 | 
						|
is_valid_syntax_port = make_syntax_validator("port")
 |