15
0
Files
python-qstylizer/qstylizer-tinycss2.patch
2021-04-20 08:06:50 +00:00

84 lines
2.8 KiB
Diff

From 9228896f335cd6519a8abab70c8c0e38b6a28267 Mon Sep 17 00:00:00 2001
From: Ben Greiner <code@bnavigator.de>
Date: Thu, 8 Apr 2021 21:15:03 +0200
Subject: [PATCH] use tinycss2 instead of tinycss
---
qstylizer/parser.py | 45 ++++++++++++++++++++++++++++-----------------
requirements.txt | 2 +-
2 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/qstylizer/parser.py b/qstylizer/parser.py
index 71864af..635e01e 100644
--- a/qstylizer/parser.py
+++ b/qstylizer/parser.py
@@ -1,32 +1,43 @@
# coding: utf-8
-from tinycss.css21 import CSS21Parser
+import tinycss2
import qstylizer.style
-class QSSParser(CSS21Parser):
- def parse_declaration(self, tokens):
- declaration = super(QSSParser, self).parse_declaration(tokens)
- if tokens:
- name = tokens[0].value
- if name.startswith("qproperty-"):
- declaration.name = name
- return declaration
+def _strip_whitespace_recursive(value):
+ for i, v in enumerate(value):
+ if isinstance(v, list):
+ value[i].value = _strip_whitespace_recursive(v)
+ else:
+ try:
+ value[i].value = v.value.strip()
+ except AttributeError:
+ pass
+ return value
def parse(stylesheet):
- """Parse a stylesheet using tinycss and return a StyleSheet instance.
+ """Parse a stylesheet using tinycss2 and return a StyleSheet instance.
:param stylesheet: A string of an existing stylesheet.
"""
- parsed_stylesheet = QSSParser().parse_stylesheet(stylesheet)
+ parsed_stylesheet = tinycss2.parse_stylesheet(
+ stylesheet, skip_comments=True, skip_whitespace=True
+ )
css = qstylizer.style.StyleSheet()
- for rule in parsed_stylesheet.rules:
- selector = rule.selector.as_css()
- for declaration in rule.declarations:
- prop = declaration.name
- value = declaration.value.as_css()
- css[selector][prop] = value
+ for node in parsed_stylesheet:
+ if node.type == "error":
+ raise ValueError("Cannot parse Stylesheet: " + node.message)
+ selector = tinycss2.serialize(_strip_whitespace_recursive(node.prelude))
+ declaration_list = tinycss2.parse_declaration_list(
+ node.content, skip_comments=True, skip_whitespace=True
+ )
+ for declaration in declaration_list:
+ if declaration.type == "declaration":
+ prop = declaration.name.strip()
+ v = _strip_whitespace_recursive(declaration.value)
+ value = tinycss2.serialize(v)
+ css[selector][prop] = value
return css
diff --git a/requirements.txt b/requirements.txt
index 46f1d65..d56a026 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,2 +1,2 @@
-tinycss >= 0.4, < 1
+tinycss2 >= 0.5, < 2
inflection > 0.3.0, < 1