Coverage for ramose/escaping.py: 100%

19 statements  

« 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 

4 

5from __future__ import annotations 

6 

7from re import fullmatch, search 

8 

9_IRI_FORBIDDEN = r'[<>"{}|^`\\\x00-\x20]' 

10_LOCAL_NAME = r"[\w.\-:%]+" 

11 

12 

13class InvalidParameterValueError(ValueError): 

14 pass 

15 

16 

17def escape_literal(value: str) -> str: 

18 value = value.replace("\\", "\\\\").replace('"', '\\"').replace("'", "\\'") 

19 return value.replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t") 

20 

21 

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 

27 

28 

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