From 4c64b97cec5169030695e11560918ab9fd022ceb Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 5 Aug 2026 20:05:47 +0300 Subject: [PATCH] =?UTF-8?q?fix(skd-edit):=20=D0=B3=D0=B0=D1=80=D0=B4=20?= =?UTF-8?q?=D0=BD=D0=B0=20CDATA=20=D0=BF=D1=80=D0=B8=20=D0=BD=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=BE=D0=B3=D0=BE=20=D1=82=D0=B5=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit skd-edit нормализовал ` />` в `/>` без проверки на CDATA и комментарии, в отличие от остальных 23 мест, где такая нормализация есть. Вскрылось сверкой копий: конструкция повторяется в 24 местах, и вариантов формы должно быть ровно два — с гардом и никак иначе. Гард нужен потому, что `>` не экранируется только внутри CDATA и комментариев — там ` />` может оказаться содержимым, а не концом тега. В 1С-метаданных ни того, ни другого не встречается (0 из 476 943 XML корпуса), так что практического расхождения поведения нет — но полагаться на это в одном месте и защищаться в остальных двадцати трёх непоследовательно. Правка в обоих портах: у py-порта нормализация тоже была без гарда (она там защитная — lxml и так пишет плотно). Co-Authored-By: Claude Opus 5 --- .claude/skills/skd-edit/scripts/skd-edit.ps1 | 9 +++++---- .claude/skills/skd-edit/scripts/skd-edit.py | 11 +++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index 16200b8e..412d8158 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.ps1 +++ b/.claude/skills/skd-edit/scripts/skd-edit.ps1 @@ -1,4 +1,4 @@ -# skd-edit v1.30 — Atomic 1C DCS editor +# skd-edit v1.31 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: парный .py собирает выражения автодат вне f-string ради совместимости с python 3.9 (PEP 701). param( @@ -4045,9 +4045,10 @@ if ($script:RawRootOpening) { $content = [regex]::Replace($content, ']*>', { param($m) $script:RawRootOpening }) } -# (2) normalize self-closing tags: `.NET XmlDocument` adds a space before `/>` -# (``) but 1C-Designer writes ``. Strip the space. -$content = [regex]::Replace($content, '(?<=\S) />', '/>') +# (2) Пустой элемент: XmlWriter отдаёт ``, Конфигуратор пишет ``. Гард на +# CDATA/комментарии: только там `>` не экранируется, и ` />` может быть +# содержимым, а не концом тега. +if ($content -notmatch '', '/>') } # (3) normalize line endings to match source — operations may mix LF (from new # fragments) with whatever the source used (CRLF on Windows, LF on Linux/git). diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index a230210d..875df26b 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.py +++ b/.claude/skills/skd-edit/scripts/skd-edit.py @@ -1,4 +1,4 @@ -# skd-edit v1.30 — Atomic 1C DCS editor (Python port) +# skd-edit v1.31 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -3440,9 +3440,12 @@ xml_bytes = xml_bytes.replace( xml_text = xml_bytes.decode("utf-8") if raw_root_opening: xml_text = re.sub(r"]*>", lambda m: raw_root_opening, xml_text, count=1, flags=re.DOTALL) -# Normalize self-closing tags: lxml writes `` already (no space), but be -# defensive — strip any space before `/>` so PS and PY ports stay byte-equivalent. -xml_text = re.sub(r"(?<=\S) />", "/>", xml_text) +# Пустой элемент: XmlWriter отдаёт ``, Конфигуратор пишет `` (lxml и так +# пишет плотно — правка защитная, чтобы порты оставались байт-эквивалентны). Гард на +# CDATA/комментарии: только там `>` не экранируется, и ` />` может быть содержимым, +# а не концом тега. +if "", "/>", xml_text) # Канонизировать переносы к LF (убирает возможный ), затем к стилю источника. xml_text = xml_text.replace(" \n", "\n").replace(" ", "").replace("\r\n", "\n").replace("\r", "\n")