fix(form-decompile,form-compile): whitespace-presentation choiceList + SpecialTextInputMode (кластер RadioButtonField>Presentation)

(1) Presentation элемента <ChoiceList> (переключатель / поле ввода) с whitespace-only
контентом (<v8:content> </v8:content>, пробел) терялась: Decompile-ChoiceList читал
presentation через Get-LangText → "" (суппресс-маркер) → компилятор эмитил пустой
<Presentation/>. Фикс: Get-LangText → Get-LangTextWS (тот же корень, что был у
Attribute>Title; декомпилятор-only — Emit-ChoicePresentation " " уже умеет, IsNullOrEmpty
пропускает пробел в контент-ветку). Кластер снова раздут harness-мис-атрибуцией:
одна реальная whitespace-потеря на форму, generic строки-обёртки (<Presentation>/
<v8:item>/<v8:lang>ru) сыпались ложным LOST под соседними элементами.

(2) SpecialTextInputMode (Email/PhoneNumber — моб. спец-режим ввода input) → GENERIC_SCALARS
(компилятор ps1+py, декомпилятор ps1), листовой enum pass-through.

Выборка 3 формы (Новости/ФормаПросмотраНовостейРабочийСтол, МастерПереходаВОблако,
ПеремещениеОС/ФормаДокумента): match 0→3, TOTAL→0. Регресс 43/43 (ps1+py).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-13 12:02:12 +03:00
co-authored by Claude Opus 4.8
parent e127dfcf3d
commit 8631026259
3 changed files with 10 additions and 4 deletions
@@ -1,4 +1,4 @@
# form-compile v1.148 — Compile 1C managed form from JSON or object metadata
# form-compile v1.149 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -3243,6 +3243,8 @@ $script:genericScalars = @(
# Равная ширина элементов (check/radio) / высота заголовка пункта (radio)
@{ Tag='EqualItemsWidth'; Key='equalItemsWidth'; Kind='bool' }
@{ Tag='ItemTitleHeight'; Key='itemTitleHeight'; Kind='value' }
# Спец-режим ввода текста (input, моб.: Email/PhoneNumber/...) — листовой enum-скаляр
@{ Tag='SpecialTextInputMode'; Key='specialTextInputMode'; Kind='value' }
)
function Emit-GenericScalars {
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.148 — Compile 1C managed form from JSON or object metadata
# form-compile v1.149 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -3353,6 +3353,8 @@ GENERIC_SCALARS = [
# Равная ширина элементов (check/radio) / высота заголовка пункта (radio)
('EqualItemsWidth', 'equalItemsWidth', 'bool'),
('ItemTitleHeight', 'itemTitleHeight', 'value'),
# Спец-режим ввода текста (input, моб.: Email/PhoneNumber/...) — листовой enum-скаляр
('SpecialTextInputMode', 'specialTextInputMode', 'value'),
]
@@ -1,4 +1,4 @@
# form-decompile v0.123 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.124 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1581,6 +1581,8 @@ $GENERIC_SCALARS = @(
# Равная ширина элементов (check/radio) / высота заголовка пункта (radio)
@{ Tag='EqualItemsWidth'; Key='equalItemsWidth'; Kind='bool' }
@{ Tag='ItemTitleHeight'; Key='itemTitleHeight'; Kind='value' }
# Спец-режим ввода текста (input, моб.: Email/PhoneNumber/...) — листовой enum-скаляр
@{ Tag='SpecialTextInputMode'; Key='specialTextInputMode'; Kind='value' }
)
# Захват generic-скаляров. Специфичная обработка (если ключ уже задан) — побеждает.
@@ -1658,7 +1660,7 @@ function Decompile-ChoiceList {
# Presentation: непустой → текст/мультиязык; пустой <Presentation/> → "" — суппресс-маркер,
# подавляет авто-вывод компилятора (иначе компилятор додумает presentation из значения).
if ($presNode) {
$p = Get-LangText $presNode
$p = Get-LangTextWS $presNode # восстановление значимого пробела (whitespace-presentation)
if ($null -ne $p -and $p -ne '') { $ci['presentation'] = $p } else { $ci['presentation'] = '' }
}
[void]$items.Add($ci)