From 6619a4e7ade4eab8bec85ec867955bc3d71af243 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 12 Aug 2026 12:03:53 +0300 Subject: [PATCH] =?UTF-8?q?fix(mxl-compile,mxl-decompile):=20=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D1=8F=D1=87=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=20=D1=81=D1=82=D0=B8=D0=BB=D1=8C=20=D0=B8?= =?UTF-8?q?=20=D0=BA=D1=83=D0=BB=D1=8C=D1=82=D1=83=D1=80=D0=BD=D0=B0=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Два дефекта, найденных при сведении портов. Стиль, на который ссылалась только дополнительная колоночная раскладка, отсекался как неиспользуемый: проверка смотрела в result, а columnSets попадает туда ПОЗЖЕ неё. Ссылка оставалась висячей — 5 макетов пилота из 40 указывали на стиль, которого в styles нет. Берём стили из самих раскладок. Именованные элементы платформа хранит отсортированными по имени ординально. ps1 сортировал их Sort-Object -CaseSensitive, а он всё равно сравнивает по текущей культуре — комментарий рядом сам об этом предупреждал. На кириллице порядок расходился с py-портом (4800 строк разницы на одном макете). Сортируем по ключу из кодов символов: в нём только 0-9A-F, культура его переупорядочить не может. Порты сошлись: JSON декомпиляторов совпадает на всех 40 макетах пилота (было 26 расхождений), собранный XML — на 39 из 40 (было 20 расхождений). Остаток — один макет, где расходятся компиляторы: ps1 подставляет faceName="Arial" height="10" там, где py пишет пустой шрифт. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/mxl-compile/scripts/mxl-compile.ps1 | 12 +++++++++--- .../mxl-decompile/scripts/mxl-decompile.ps1 | 7 +++++-- .../skills/mxl-decompile/scripts/mxl-decompile.py | 15 +++++++++------ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 index b0bd544d..69f77f78 100644 --- a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 +++ b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 @@ -1,4 +1,4 @@ -# mxl-compile v1.37 — Compile 1C spreadsheet from JSON +# mxl-compile v1.38 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1576,8 +1576,14 @@ foreach ($m in $merges) { # с несколькими элементами иного порядка нет ни разу. Сортировка регистронезависимая и # ординальная — Sort-Object брать нельзя, он сортирует по текущей культуре и на кириллице # даст другой порядок. NB: имён с «ё» в выборке не встретилось, этот случай не проверен. -$sortedNamedItems = @($namedItems | Sort-Object -Property @{ Expression = { $_.Name.ToLowerInvariant() } } ` - -CaseSensitive) +# Sort-Object сортирует по текущей культуре даже с -CaseSensitive, поэтому сортируем по +# ключу из кодов символов: в нём только 0-9A-F, и культурные правила его переупорядочить +# не могут. Прежний вариант давал на кириллице не тот порядок, что py-порт. +function Get-OrdinalKey { + param([string]$name) + return (($name.ToLowerInvariant().ToCharArray() | ForEach-Object { '{0:X4}' -f [int]$_ }) -join '') +} +$sortedNamedItems = @($namedItems | Sort-Object -Property @{ Expression = { Get-OrdinalKey $_.Name } }) foreach ($ni in $sortedNamedItems) { # Тип области выводится из указанных осей, как в ТабличныйДокумент.Область(): # нет колонок → полоса строк, нет строк → полоса колонок, обе → прямоугольник. diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 b/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 index c5390068..5d370d89 100644 --- a/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 +++ b/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 @@ -1,4 +1,4 @@ -# mxl-decompile v1.17 — Decompile 1C spreadsheet to JSON +# mxl-decompile v1.18 — Decompile 1C spreadsheet to JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1176,7 +1176,10 @@ foreach ($a in $dslAreas) { if ($cellList) { foreach ($c in $cellList) { if ($c -isnot [string] -and $c.style) { $usedStyles[$c.style] = $true } } } } } -# Стиль бывает не только у ячейки и строки: колонка — третий владелец формата. +# Стиль бывает не только у ячейки и строки: колонка — третий владелец формата. Берём стили +# ИЗ САМИХ РАСКЛАДОК, а не из $result: columnSets попадает в результат ПОЗЖЕ этой проверки, +# и стиль, на который ссылается только дополнительная раскладка, был бы отсечён, а ссылка +# на него осталась бы висячей. foreach ($cs in $columnSets) { foreach ($name in (Get-ColumnStyles $cs).Values) { if ($name) { $usedStyles[$name] = $true } diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py index 4a4b6dfc..e22d9ed5 100644 --- a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py +++ b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# mxl-decompile v1.17 — Decompile 1C spreadsheet to JSON +# mxl-decompile v1.18 — Decompile 1C spreadsheet to JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1184,11 +1184,14 @@ def main(): for c in cell_list: if isinstance(c, dict) and "style" in c: used_styles.add(c["style"]) - # Стиль бывает не только у ячейки и строки: колонка — третий владелец формата. - for src in [result.get("columnStyles")] + [ - (cs or {}).get("columnStyles") for cs in (result.get("columnSets") or {}).values()]: - for name in (src or {}).values(): - used_styles.add(name) + # Стиль бывает не только у ячейки и строки: колонка — третий владелец формата. Берём + # стили ИЗ САМИХ РАСКЛАДОК, а не из result: columnSets попадает в результат ПОЗЖЕ этой + # проверки, поэтому стиль, на который ссылается только дополнительная раскладка, + # отсекался, а ссылка на него оставалась висячей (5 макетов пилота из 40). + for cs in column_sets: + for name in column_styles_of(cs).values(): + if name: + used_styles.add(name) to_remove = [s for s in style_defs if s not in used_styles] for s in to_remove: del style_defs[s]