From 9f46d8e39ed9f833455939773d03b39bfbb234d0 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 14 Aug 2026 13:35:11 +0300 Subject: [PATCH] Preserve nested appearance style values --- plugins/1c/parser/appearance_payload.py | 11 +++++++++++ tests/1c/test_payload_codec.py | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/plugins/1c/parser/appearance_payload.py b/plugins/1c/parser/appearance_payload.py index f6feb96..ebdde9f 100644 --- a/plugins/1c/parser/appearance_payload.py +++ b/plugins/1c/parser/appearance_payload.py @@ -63,6 +63,17 @@ def inspect_appearance_payload(data: bytes) -> dict[str, Any]: rule["value_type"] = value_type if value_node.attrib: rule["value_attributes"] = {key.rsplit("}", 1)[-1]: value for key, value in value_node.attrib.items()} + nested_values = [] + for child in value_node.iter(): + if child is value_node or list(child): + continue + nested_values.append({ + "tag": _local_name(child.tag), + "value": "".join(child.itertext()).strip(), + **({"attributes": {key.rsplit("}", 1)[-1]: value for key, value in child.attrib.items()}} if child.attrib else {}), + }) + if nested_values: + rule["value_children"] = nested_values rules.append(rule) appearances.append({"ordinal": ordinal, "rules": rules}) tag_counts = Counter(_local_name(node.tag) for node in root.iter()) diff --git a/tests/1c/test_payload_codec.py b/tests/1c/test_payload_codec.py index d343a17..a6279ee 100644 --- a/tests/1c/test_payload_codec.py +++ b/tests/1c/test_payload_codec.py @@ -259,14 +259,14 @@ def test_scd_payload_decoder_reads_xml_after_platform_prefix() -> None: def test_appearance_payload_decoder_reads_xml_rules() -> None: xml = """ -Заголовокstyle:TitleЦветФонаstyle:Blue""" +Заголовокstyle:TitleЦветФона""" result = inspect_appearance_payload(compress_payload(b"\x00\x01" + xml.encode("utf-8"), "raw_deflate")) assert result["status"] == "ok" assert result["items"] == [{"ordinal": 1, "parameter": "Заголовок", "value": "style:Title"}] - assert result["appearances"] == [{"ordinal": 1, "rules": [{"parameter": "ЦветФона", "value": "style:Blue", "value_type": "Color", "value_attributes": {"type": "Color", "ref": "style:Blue"}}]}] - assert result["outline"]["tag_counts"] == {"AppearanceTemplate": 1, "appearance": 1, "item": 2, "name": 1, "parameter": 2, "style": 1, "value": 2} + assert result["appearances"] == [{"ordinal": 1, "rules": [{"parameter": "ЦветФона", "value": "Solid", "value_type": "Line", "value_attributes": {"type": "Line", "ref": "style:Blue"}, "value_children": [{"tag": "style", "value": "Solid", "attributes": {"type": "Solid"}}]}]}] + assert result["outline"]["tag_counts"] == {"AppearanceTemplate": 1, "appearance": 1, "item": 2, "name": 1, "parameter": 2, "style": 2, "value": 2} assert result["diagnostics"]["write"] == "unsupported_until_reverse_codec_fixture"