diff --git a/src/html_presets_processor.py b/src/html_presets_processor.py
index 2a8e426..f7d1e64 100644
--- a/src/html_presets_processor.py
+++ b/src/html_presets_processor.py
@@ -17,6 +17,7 @@ class HtmlPresetsProcessor:
"decomposer": self._decompose_tag,
"replacer": self._replace_tag,
"attr_remover": self._remove_attr,
+ "attr_property_replacer": self._replace_attr_property,
"attr_replacer": self._replace_attr,
"unwrapper": self._unwrap_tag,
"inserter": self._insert_tag,
@@ -170,23 +171,73 @@ class HtmlPresetsProcessor:
new_value = re.sub(pattern, "", attr_string)
kwargs["found_tag"][attr_name] = new_value
+ @staticmethod
+ def _replace_attr_property(**kwargs):
+ """
+ Replaces a property or value in an HTML tag attribute.
+
+ Parameters:
+ **kwargs (dict): A dictionary containing the following keys:
+ - "rule" (dict): A dictionary containing the rule to apply.
+ - "found_tag" (dict): A dictionary containing the attributes of the tag to modify.
+
+ Returns:
+ None.
+ """
+ rule = kwargs["rule"]
+ found_tag = kwargs["found_tag"]
+ attr = rule["condition"]["attrs"][0]
+ attr_name = attr.get("name", None)
+ attr_value = attr.get("value", None)
+ property_name, property_value = attr_value.split(":")
+ property_name_to_replace = rule["property_to_replace"].get("name", None)
+ property_value_to_replace = rule["property_to_replace"].get("value", None)
+
+ if attr_name is None or found_tag.get(attr_name) is None:
+ return
+
+ pattern = r'\b' + re.escape(property_name) + r'\s*:\s*[^;]*'
+
+ if property_name_to_replace:
+ # Replace property name
+ if property_value_to_replace:
+ # Also replace property value
+ found_tag[attr_name] = re.sub(pattern, f"{property_name_to_replace}:{property_value_to_replace}",
+ found_tag[attr_name])
+ else:
+ # Only replace property name
+ found_tag[attr_name] = re.sub(pattern, f"{property_name_to_replace}:{property_value}",
+ found_tag[attr_name])
+ elif property_value_to_replace:
+ # Replace only property value
+ found_tag[attr_name] = re.sub(pattern, f"{property_name}:{property_value_to_replace}",
+ found_tag[attr_name])
+ else:
+ # Remove this property from tag
+ found_tag[attr_name] = re.sub(pattern, "", found_tag[attr_name])
+
+
@staticmethod
def _replace_attr(**kwargs):
attr = kwargs["rule"]["condition"]["attrs"][0]
attr_name, attr_value =\
attr["name"], attr["value"]
- attr_to_replace, attr_value_to_replace =\
+ attr_name_to_replace, attr_value_to_replace =\
kwargs["rule"]["attr_to_replace"]["name"], kwargs["rule"]["attr_to_replace"]["value"]
- if attr_to_replace:
- kwargs["found_tag"][attr_to_replace] = kwargs["found_tag"][attr_name] \
+ if attr_name_to_replace:
+ # replace attr name
+ kwargs["found_tag"][attr_name_to_replace] = kwargs["found_tag"][attr_name] \
if kwargs["found_tag"].get(attr_name)\
else ""
if attr_value_to_replace:
- kwargs["found_tag"].attrs[attr_to_replace] = attr_value_to_replace
+ # also replace attr value
+ kwargs["found_tag"].attrs[attr_name_to_replace] = attr_value_to_replace
del kwargs["found_tag"][attr_name]
elif attr_value_to_replace:
+ # replace ONLY attr value
kwargs["found_tag"].attrs[attr_name] = attr_value_to_replace
elif attr_name:
+ # remove this attr from tag
del kwargs["found_tag"][attr_name]
def _unwrap_tag(self, **kwargs):