Files

42 lines
1.0 KiB
Python
Raw Permalink Normal View History

2025-12-25 11:16:59 +08:00
import re
import pyparsing
# TODO: There is a lot of work to be done here.
# The current implementation is written in a way that _any_ input is valid,
# which does not make sense once things get more complex.
PartialQuotedString = pyparsing.Regex(
re.compile(
r"""
"[^"]*(?:"|$) # double-quoted string that ends with double quote or EOF
|
'[^']*(?:'|$) # single-quoted string that ends with double quote or EOF
""",
re.VERBOSE,
)
)
expr = pyparsing.ZeroOrMore(
PartialQuotedString
| pyparsing.Word(" \r\n\t")
| pyparsing.CharsNotIn("""'" \r\n\t""")
).leaveWhitespace()
def quote(val: str) -> str:
if val and all(char not in val for char in "'\" \r\n\t"):
return val
if '"' not in val:
return f'"{val}"'
if "'" not in val:
return f"'{val}'"
return '"' + val.replace('"', r"\x22") + '"'
def unquote(x: str) -> str:
if len(x) > 1 and x[0] in "'\"" and x[0] == x[-1]:
return x[1:-1]
else:
return x