From ef3b532dcf6e605adf6c680c375a4b20622ecb3c Mon Sep 17 00:00:00 2001 From: Affan Ziya Date: Sat, 19 Sep 2026 20:01:46 +0530 Subject: [PATCH] escape non-printable characters in serialize_url --- tests/test_tinycss2.py | 8 ++++++++ tinycss2/serializer.py | 1 + 2 files changed, 9 insertions(+) diff --git a/tests/test_tinycss2.py b/tests/test_tinycss2.py index 98fbf7c..bf4fbe5 100644 --- a/tests/test_tinycss2.py +++ b/tests/test_tinycss2.py @@ -691,6 +691,14 @@ def test_serialize_e_in_unit(source): assert serialize(rules) == source.replace('\\45', '\\65') +@pytest.mark.parametrize('source', ['url(\\1)', 'url(a\\b c)', 'url(\\7f)']) +def test_serialize_control_in_url(source): + url_token, = parse_component_value_list(source) + reparsed, = parse_component_value_list(serialize([url_token])) + assert reparsed.type == 'url' + assert reparsed.value == url_token.value + + def test_backslash_delim(): source = '\\\nfoo' tokens = parse_component_value_list(source) diff --git a/tinycss2/serializer.py b/tinycss2/serializer.py index 032b924..cec8371 100644 --- a/tinycss2/serializer.py +++ b/tinycss2/serializer.py @@ -96,6 +96,7 @@ def serialize_url(value): r'\C ' if c == '\f' else r'\(' if c == '(' else r'\)' if c == ')' else + '\\%X ' % ord(c) if c <= '\x1f' or c == '\x7f' else c for c in value )