From fa608b355654a8813dfff91982a945a5f7a605aa Mon Sep 17 00:00:00 2001 From: Kibzik Date: Thu, 13 Apr 2023 14:28:54 +0300 Subject: [PATCH] LAW-6621 | Add ability to replace/remove property of attr --- src/html_presets_processor.py | 59 ++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) 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):