Coverage for ramose/escaping.py: 100%
19 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-09-24 21:59 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-09-24 21:59 +0000
1# SPDX-FileCopyrightText: 2026 Arcangelo Massari <arcangelo.massari@unibo.it>
2#
3# SPDX-License-Identifier: ISC
5from __future__ import annotations
7from re import fullmatch, search
9_IRI_FORBIDDEN = r'[<>"{}|^`\\\x00-\x20]'
10_LOCAL_NAME = r"[\w.\-:%]+"
13class InvalidParameterValueError(ValueError):
14 pass
17def escape_literal(value: str) -> str:
18 value = value.replace("\\", "\\\\").replace('"', '\\"').replace("'", "\\'")
19 return value.replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t")
22def escape_iri(value: str) -> str:
23 if search(_IRI_FORBIDDEN, value):
24 msg = f"invalid IRI value: {value!r}"
25 raise InvalidParameterValueError(msg)
26 return value
29def escape_local_name(value: str) -> str:
30 if not fullmatch(_LOCAL_NAME, value):
31 msg = f"invalid prefixed name value: {value!r}"
32 raise InvalidParameterValueError(msg)
33 return value