mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-13 15:03:20 +03:00
fix(mxl-compile,mxl-decompile): не терять колонку, объявленную без формата
Платформа иногда перечисляет колонку в раскладке с <formatIndex>0</formatIndex> — колонка объявлена, формата у неё нет (4% макетов корпуса). Компилятор такие опускал, декомпилятор их не видел, и элемент терялся целиком. Выражается пустым значением в columnStyles. Для авторинга это бесполезно — ни одна задача не звучит как «объяви колонку без свойств», — поэтому в описании DSL записи нет: она нужна только чтобы раундтрип не терял байты. На пилоте потери в категории colset[].col[].formatIndex упали с 39 до 35. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
4e389d0ef1
commit
3c7f7345bb
@@ -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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -389,7 +389,11 @@ function Build-ColStyleMap {
|
|||||||
$map = @{}
|
$map = @{}
|
||||||
if ($styles) {
|
if ($styles) {
|
||||||
foreach ($prop in $styles.PSObject.Properties) {
|
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
|
return $map
|
||||||
@@ -701,11 +705,18 @@ foreach ($layout in $columnLayouts) {
|
|||||||
$cols = @($layout.Widths.Keys) + @($layout.Styles.Keys) | ForEach-Object { [int]$_ } |
|
$cols = @($layout.Widths.Keys) + @($layout.Styles.Keys) | ForEach-Object { [int]$_ } |
|
||||||
Select-Object -Unique | Sort-Object
|
Select-Object -Unique | Sort-Object
|
||||||
foreach ($col in $cols) {
|
foreach ($col in $cols) {
|
||||||
|
$styleName = if ($layout.Styles.ContainsKey($col)) { $layout.Styles[$col] } else { $null }
|
||||||
|
# Колонка перечислена без формата вовсе (<formatIndex>0</formatIndex>): в корпусе так
|
||||||
|
# бывает у 4% макетов. Ноль — не индекс записи, а «формата нет».
|
||||||
|
if (-not $layout.Widths.ContainsKey($col) -and [string]::IsNullOrEmpty($styleName)) {
|
||||||
|
$map[$col] = 0
|
||||||
|
continue
|
||||||
|
}
|
||||||
$props = @{}
|
$props = @{}
|
||||||
if ($layout.Styles.ContainsKey($col)) {
|
if ($styleName) {
|
||||||
# Шрифт по умолчанию колонке не навязываем: формат колонки без оформления —
|
# Шрифт по умолчанию колонке не навязываем: формат колонки без оформления —
|
||||||
# это ровно <width>, как пишет платформа.
|
# это ровно <width>, как пишет платформа.
|
||||||
$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] }
|
if ($layout.Widths.ContainsKey($col)) { $props['width'] = $layout.Widths[$col] }
|
||||||
$map[$col] = Register-Format $props
|
$map[$col] = Register-Format $props
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import hashlib
|
import hashlib
|
||||||
@@ -601,8 +601,12 @@ def main():
|
|||||||
out = {}
|
out = {}
|
||||||
if styles:
|
if styles:
|
||||||
for prop_name, prop_value in styles.items():
|
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):
|
for c in parse_column_spec(prop_name):
|
||||||
out[c] = str(prop_value)
|
out[c] = v
|
||||||
return out
|
return out
|
||||||
|
|
||||||
col_style_map = build_col_style_map(defn.get('columnStyles'))
|
col_style_map = build_col_style_map(defn.get('columnStyles'))
|
||||||
@@ -778,11 +782,17 @@ def main():
|
|||||||
for layout in column_layouts:
|
for layout in column_layouts:
|
||||||
fmap = {} # 1-based col -> format index
|
fmap = {} # 1-based col -> format index
|
||||||
for col in sorted({int(c) for c in list(layout['Widths']) + list(layout['Styles'])}):
|
for col in sorted({int(c) for c in list(layout['Widths']) + list(layout['Styles'])}):
|
||||||
|
style_name = layout['Styles'].get(col)
|
||||||
|
# Колонка перечислена без формата вовсе (<formatIndex>0</formatIndex>): в корпусе
|
||||||
|
# так бывает у 4% макетов. Ноль — не индекс записи, а «формата нет».
|
||||||
|
if col not in layout['Widths'] and not style_name:
|
||||||
|
fmap[col] = 0
|
||||||
|
continue
|
||||||
props = {}
|
props = {}
|
||||||
if col in layout['Styles']:
|
if style_name:
|
||||||
# Шрифт по умолчанию колонке не навязываем: формат колонки без оформления —
|
# Шрифт по умолчанию колонке не навязываем: формат колонки без оформления —
|
||||||
# это ровно <width>, как пишет платформа.
|
# это ровно <width>, как пишет платформа.
|
||||||
props = resolve_style(layout['Styles'][col], '', no_default_font=True)
|
props = resolve_style(style_name, '', no_default_font=True)
|
||||||
if col in layout['Widths']:
|
if col in layout['Widths']:
|
||||||
props['width'] = layout['Widths'][col]
|
props['width'] = layout['Widths'][col]
|
||||||
fmap[col] = register_format(props)
|
fmap[col] = register_format(props)
|
||||||
|
|||||||
@@ -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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -585,6 +585,12 @@ function Get-ColumnStyles {
|
|||||||
$out = [ordered]@{}
|
$out = [ordered]@{}
|
||||||
foreach ($col in $cs.FmtIdx.Keys) {
|
foreach ($col in $cs.FmtIdx.Keys) {
|
||||||
$fi = $cs.FmtIdx[$col]
|
$fi = $cs.FmtIdx[$col]
|
||||||
|
if ($fi -eq 0) {
|
||||||
|
# Колонка перечислена, формата у неё нет. Для авторинга бесполезно, но без
|
||||||
|
# этого раундтрип теряет элемент целиком.
|
||||||
|
$out[$col] = $null
|
||||||
|
continue
|
||||||
|
}
|
||||||
$fmt = Get-Format $fi
|
$fmt = Get-Format $fi
|
||||||
if ($fmt -and (Get-StyleProps $fmt).Count -gt 0) { $out[$col] = Get-StyleName $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 ($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($_) })
|
$toRemove = @($styleDefs.Keys | Where-Object { -not $usedStyles.ContainsKey($_) })
|
||||||
foreach ($s in $toRemove) { $styleDefs.Remove($s)
|
foreach ($s in $toRemove) { $styleDefs.Remove($s)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
@@ -747,6 +747,11 @@ def main():
|
|||||||
"""Колонки раскладки, у которых формат несёт не только ширину, — «колонка → стиль»."""
|
"""Колонки раскладки, у которых формат несёт не только ширину, — «колонка → стиль»."""
|
||||||
out = OrderedDict()
|
out = OrderedDict()
|
||||||
for col, fi in cs["FmtIdx"].items():
|
for col, fi in cs["FmtIdx"].items():
|
||||||
|
if fi == 0:
|
||||||
|
# Колонка перечислена, формата у неё нет. Для авторинга бесполезно, но без
|
||||||
|
# этого раундтрип теряет элемент целиком.
|
||||||
|
out[col] = None
|
||||||
|
continue
|
||||||
fmt = get_format(fi)
|
fmt = get_format(fi)
|
||||||
if fmt and style_props(fmt):
|
if fmt and style_props(fmt):
|
||||||
out[col] = get_style_name(fi)
|
out[col] = get_style_name(fi)
|
||||||
|
|||||||
Reference in New Issue
Block a user