From ca96a7413a934a5417a3d9d56c0af4ab9f320315 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 9 Jun 2026 21:47:34 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-decompile):=20whitespace-=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BE=D0=BA=20=D0=B4=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D1=86=D0=B8=D0=B8-=D1=80=D0=B0=D0=B7=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=20(=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B1=D0=B5=D0=BB=20=D0=B2=20Title)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PreserveWhitespace=false у XmlDocument стрипает значимый пробел в → декомпилятор читал "" (неотличимо от суппресс- маркера title:"") → компилятор не эмитил Title → LOST (надписи-разделители "РазделительТумблеров" и т.п., 487 в корпусе). Фикс в Get-MLFormattedValue (декорации label/picture): пустой текст ПРИ наличии узла → исходно был пробел (платформа не эмитит пустой Title) → восстанавливаем " ". Компилятор уже эмитит пробел корректно (" " truthy в Emit-DecorationTitle). Decompiler-only. Выборка 2.17: match 209→211, TOTAL 12→0 (остаток — только GroupList, документированный не-покрываемый). Валидировано раунтрипом (форма ЗадачаИсполнителя/ЗадачиПоПредметуБП → match). Co-Authored-By: Claude Opus 4.8 --- .claude/skills/form-decompile/scripts/form-decompile.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 9f3db16d..7bc88f74 100644 --- a/.claude/skills/form-decompile/scripts/form-decompile.ps1 +++ b/.claude/skills/form-decompile/scripts/form-decompile.ps1 @@ -1,4 +1,4 @@ -# form-decompile v0.75 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.76 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -293,6 +293,10 @@ function Get-MLFormattedValue { if (-not $titleNode) { return $null } $text = Get-LangText $titleNode if ($null -eq $text) { return $null } + # Whitespace-only заголовок (декорация-разделитель): PreserveWhitespace=false стрипает значимый + # пробел в → пустой текст при наличии узла content. Платформа НЕ + # эмитит пустой Title, значит исходно был пробел — восстанавливаем (иначе спутаем с суппресс-маркером ""). + if ($text -is [string] -and $text -eq '' -and $titleNode.SelectSingleNode("v8:item/v8:content", $ns)) { $text = ' ' } $fmtAttr = ($titleNode.GetAttribute('formatted') -eq 'true') if ($fmtAttr -eq (Test-HasRealMarkup $text)) { return $text } $o = [ordered]@{}; $o['text'] = $text; $o['formatted'] = $fmtAttr; return $o