1
1
mirror of https://github.com/Kozea/WeasyPrint.git synced 2024-09-11 20:47:56 +03:00

Improve error handling for selectors

This commit is contained in:
Lucie Anglade 2024-01-19 17:28:32 +01:00 committed by Guillaume Ayoub
parent 7b02f67199
commit 3c537a32cc
2 changed files with 24 additions and 19 deletions

View File

@ -920,40 +920,42 @@ def preprocess_stylesheet(device_media_type, base_url, stylesheet_rules,
continue
if rule.type == 'qualified-rule':
selectors_declarations = list(
preprocess_declarations(
base_url, tinycss2.parse_declaration_list(rule.content),
rule.prelude))
if selectors_declarations:
try:
logger_level = WARNING
selectors_declarations = groupby(
selectors_declarations, key=lambda x: x[0])
try:
selectors_declarations = list(
preprocess_declarations(
base_url, tinycss2.parse_declaration_list(rule.content),
rule.prelude))
if selectors_declarations:
selectors_declarations = groupby(
selectors_declarations, key=lambda x: x[0])
for selectors, declarations in selectors_declarations:
declarations = [
declaration[1] for declaration in declarations]
for selector in selectors:
matcher.add_selector(selector, declarations)
if selector.pseudo_element not in PSEUDO_ELEMENTS:
prelude_string = tinycss2.serialize(prelude)
if selector.pseudo_element.startswith('-'):
logger_level = DEBUG
raise cssselect2.SelectorError(
f"'{prelude_string}', "
'ignored prefixed pseudo-element: '
f'{selector.pseudo_element}')
else:
raise cssselect2.SelectorError(
f"'{prelude_string}', "
'unknown pseudo-element: '
f'{selector.pseudo_element}')
ignore_imports = True
except cssselect2.SelectorError as exc:
LOGGER.log(
logger_level,
"Invalid or unsupported selector '%s', %s",
tinycss2.serialize(rule.prelude), exc)
continue
else:
ignore_imports = True
else:
ignore_imports = True
except cssselect2.SelectorError as exc:
LOGGER.log(
logger_level,
"Invalid or unsupported selector, %s", exc)
continue
elif rule.type == 'at-rule' and rule.lower_at_keyword == 'import':
if ignore_imports:

View File

@ -1,7 +1,7 @@
"""Validate properties, expanders and descriptors."""
from cssselect2 import compile_selector_list
from cssselect2 import SelectorError, compile_selector_list
from tinycss2 import parse_declaration_list, serialize
from tinycss2.ast import FunctionBlock, LiteralToken
@ -200,7 +200,10 @@ def preprocess_declarations(base_url, declarations, prelude=None):
important = declaration.important
for long_name, value in result:
if prelude is not None:
selectors = compile_selector_list(prelude)
try:
selectors = compile_selector_list(prelude)
except SelectorError as exc:
raise SelectorError(f"'{serialize(prelude)}'")
declaration = (long_name.replace('-', '_'), value, important)
yield selectors, declaration
else: