diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 index a917a5ed..bcc1de1a 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.30 — Compile 1C spreadsheet from JSON +# mxl-compile v1.31 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -389,7 +389,11 @@ function Build-ColStyleMap { $map = @{} if ($styles) { foreach ($prop in $styles.PSObject.Properties) { - foreach ($c in (Parse-ColumnSpec $prop.Name)) { $map[$c] = "$($prop.Value)" } + # Пустое значение = колонка перечислена, формата у неё нет. Записи для авторинга + # в этом смысла нет, поэтому в описании DSL её не показываем — она нужна + # декомпилятору, чтобы раундтрип не терял байты. + $v = if ($null -eq $prop.Value) { $null } else { "$($prop.Value)" } + foreach ($c in (Parse-ColumnSpec $prop.Name)) { $map[$c] = $v } } } return $map @@ -701,11 +705,18 @@ foreach ($layout in $columnLayouts) { $cols = @($layout.Widths.Keys) + @($layout.Styles.Keys) | ForEach-Object { [int]$_ } | Select-Object -Unique | Sort-Object foreach ($col in $cols) { + $styleName = if ($layout.Styles.ContainsKey($col)) { $layout.Styles[$col] } else { $null } + # Колонка перечислена без формата вовсе (0): в корпусе так + # бывает у 4% макетов. Ноль — не индекс записи, а «формата нет». + if (-not $layout.Widths.ContainsKey($col) -and [string]::IsNullOrEmpty($styleName)) { + $map[$col] = 0 + continue + } $props = @{} - if ($layout.Styles.ContainsKey($col)) { + if ($styleName) { # Шрифт по умолчанию колонке не навязываем: формат колонки без оформления — # это ровно , как пишет платформа. - $props = Resolve-Style -styleName $layout.Styles[$col] -fillType "" -noDefaultFont + $props = Resolve-Style -styleName $styleName -fillType "" -noDefaultFont } if ($layout.Widths.ContainsKey($col)) { $props['width'] = $layout.Widths[$col] } $map[$col] = Register-Format $props diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.py b/.claude/skills/mxl-compile/scripts/mxl-compile.py index 3bb31b7f..baf1b430 100644 --- a/.claude/skills/mxl-compile/scripts/mxl-compile.py +++ b/.claude/skills/mxl-compile/scripts/mxl-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# mxl-compile v1.30 — Compile 1C spreadsheet from JSON +# mxl-compile v1.31 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import hashlib @@ -601,8 +601,12 @@ def main(): out = {} if styles: for prop_name, prop_value in styles.items(): + # Пустое значение = колонка перечислена, формата у неё нет. Записи для + # авторинга в этом смысла нет, поэтому в описании DSL её не показываем — + # она нужна декомпилятору, чтобы раундтрип не терял байты. + v = None if prop_value is None else str(prop_value) for c in parse_column_spec(prop_name): - out[c] = str(prop_value) + out[c] = v return out col_style_map = build_col_style_map(defn.get('columnStyles')) @@ -778,11 +782,17 @@ def main(): for layout in column_layouts: fmap = {} # 1-based col -> format index for col in sorted({int(c) for c in list(layout['Widths']) + list(layout['Styles'])}): + style_name = layout['Styles'].get(col) + # Колонка перечислена без формата вовсе (0): в корпусе + # так бывает у 4% макетов. Ноль — не индекс записи, а «формата нет». + if col not in layout['Widths'] and not style_name: + fmap[col] = 0 + continue props = {} - if col in layout['Styles']: + if style_name: # Шрифт по умолчанию колонке не навязываем: формат колонки без оформления — # это ровно , как пишет платформа. - props = resolve_style(layout['Styles'][col], '', no_default_font=True) + props = resolve_style(style_name, '', no_default_font=True) if col in layout['Widths']: props['width'] = layout['Widths'][col] fmap[col] = register_format(props) diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 b/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 index a1df39bb..b782e59d 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.11 — Decompile 1C spreadsheet to JSON +# mxl-decompile v1.12 — Decompile 1C spreadsheet to JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -585,6 +585,12 @@ function Get-ColumnStyles { $out = [ordered]@{} foreach ($col in $cs.FmtIdx.Keys) { $fi = $cs.FmtIdx[$col] + if ($fi -eq 0) { + # Колонка перечислена, формата у неё нет. Для авторинга бесполезно, но без + # этого раундтрип теряет элемент целиком. + $out[$col] = $null + continue + } $fmt = Get-Format $fi if ($fmt -and (Get-StyleProps $fmt).Count -gt 0) { $out[$col] = Get-StyleName $fi } } @@ -938,7 +944,9 @@ foreach ($a in $dslAreas) { } # Стиль бывает не только у ячейки и строки: колонка — третий владелец формата. foreach ($cs in $columnSets) { - foreach ($name in (Get-ColumnStyles $cs).Values) { $usedStyles[$name] = $true } + foreach ($name in (Get-ColumnStyles $cs).Values) { + if ($name) { $usedStyles[$name] = $true } + } } $toRemove = @($styleDefs.Keys | Where-Object { -not $usedStyles.ContainsKey($_) }) foreach ($s in $toRemove) { $styleDefs.Remove($s) diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py index 39733cd0..3069322c 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.11 — Decompile 1C spreadsheet to JSON +# mxl-decompile v1.12 — Decompile 1C spreadsheet to JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -747,6 +747,11 @@ def main(): """Колонки раскладки, у которых формат несёт не только ширину, — «колонка → стиль».""" out = OrderedDict() for col, fi in cs["FmtIdx"].items(): + if fi == 0: + # Колонка перечислена, формата у неё нет. Для авторинга бесполезно, но без + # этого раундтрип теряет элемент целиком. + out[col] = None + continue fmt = get_format(fi) if fmt and style_props(fmt): out[col] = get_style_name(fi)