From d0361561ca0967162a271faa05b62fe93171d99d Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 12 Jun 2026 11:57:35 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-decompile):=20=D0=B2=D0=BE=D1=81=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=BD=D0=B0=D1=87=D0=B8=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B1=D0=B5=D0=BB=D0=B0=20=D0=B2=20=D0=BC=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B8=D1=8F=D0=B7=D1=8B=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B5?= =?UTF-8?q?=20(=D0=B4=D0=B5=D0=BA=D0=BE=D1=80=D0=B0=D1=86=D0=B8=D1=8F-?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PreserveWhitespace=false стрипает → "" (неотличимо от суппресса). Хелпер Get-LangTextWS восстанавливал пробел только для одиночной (ru-only) строки; для мультиязычной мапы {ru:" ", en:" "} (напр. БольничныйЛист: LabelDecoration «Пробел1» с ru+en пробелами) оба значения терялись → regen давал вместо . Get-LangTextWS расширен на map-случай (восстанавливает " " в каждом языке, где content-узел есть, но текст пуст — платформа не эмитит пустой content). Get-MLFormattedValue (заголовок LabelDecoration) зарефакторен на переиспользование Get-LangTextWS вместо собственного inline single-string восстановления. Компилятор (Emit-MLItems) пробел уже эмитит корректно — правка только в декомпиляторе. Версия 1.0x → 0.103 (декомпилятор — draft, продолжаем 0.xx-схему). Верификация: таргет-роундтрип формы → match (было 4 → 0). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../form-decompile/scripts/form-decompile.ps1 | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 9b8dc107..f799319c 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 v1.02 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.103 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -277,10 +277,23 @@ function Get-LangText { # Get-LangText с восстановлением значимого пробела: PreserveWhitespace=false стрипает # → "" (неотличимо от суппресса). Платформа НЕ эмитит пустой # Title/ToolTip, значит исходно был пробел → возвращаем " " (как Get-MLFormattedValue). +# Покрывает и одиночную строку (ru-only), и мультиязычную мапу (напр. декорация-разделитель +# «Пробел» с ru+en пробелами): восстанавливаем " " в каждом языке, где content-узел есть, но пуст. function Get-LangTextWS { param($node) $t = Get-LangText $node - if ($t -is [string] -and $t -eq '' -and $node.SelectSingleNode("v8:item/v8:content", $ns)) { return ' ' } + if ($null -eq $t) { return $null } + if ($t -is [string]) { + if ($t -eq '' -and $node.SelectSingleNode("v8:item/v8:content", $ns)) { return ' ' } + return $t + } + foreach ($it in @($node.SelectNodes("v8:item", $ns))) { + $lang = $it.SelectSingleNode("v8:lang", $ns) + $content = $it.SelectSingleNode("v8:content", $ns) + if ($lang -and $content -and $t.Contains($lang.InnerText) -and $t[$lang.InnerText] -eq '') { + $t[$lang.InnerText] = ' ' + } + } return $t } @@ -317,12 +330,10 @@ function Test-HasRealMarkup { function Get-MLFormattedValue { param($titleNode) if (-not $titleNode) { return $null } - $text = Get-LangText $titleNode + # Get-LangTextWS восстанавливает значимый пробел в (одиночный и + # мультиязычный случай) — иначе декорация-разделитель «Пробел» спуталась бы с суппресс-маркером "". + $text = Get-LangTextWS $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