From fc792bfee686a15768383cefe630f8fe5d120567 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 11 Aug 2026 20:08:28 +0300 Subject: [PATCH] =?UTF-8?q?feat(mxl-compile,mxl-decompile):=20=D1=8F=D0=B7?= =?UTF-8?q?=D1=8B=D0=BA=D0=B8=20=D0=BC=D0=B0=D0=BA=D0=B5=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D1=88=D1=80=D0=B8=D1=84=D1=82=20=D0=BA=D0=B0=D0=BA=20?= =?UTF-8?q?=D1=83=20=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Контролируемый стенд (upload/epf/МакетТабличныйДокумент) вскрыл четыре системных расхождения подряд. После правок 7 макетов стенда из 10 проходят раундтрип БАЙТ В БАЙТ обоими портами — до этого ни один. 1. Объявление языков макета жёстко писалось как «только русский». Это не то же самое, что textLanguages: почти во всех макетах ERP объявлен один ru, а текст лежит и под ru, и под en, поэтому выводить одно из другого нельзя. Заведены недокументированные ключи languages / currentLanguage / defaultLanguage — автору они не нужны, нужны раундтрипу. defaultLanguage несём, а не выводим: «всегда ru» — наблюдение на четырёх русских типовых, а не правило формата. 2. писался в каждом формате. Платформа пишет его только когда шрифт задан: треть форматов корпуса (23 003 из 69 581) обходится без него. 3. Декомпилятор считал шрифт с индексом 0 «обычным» и не писал его в стиль. Нулевой шрифт вовсе не обязан быть обычным — в макетах стенда он курсивный и жирный, и начертание терялось. 4. Формат, несущий ТОЛЬКО шрифт, выглядел пустым: у ячейки он получал зарезервированное имя default и не записывался, у строки терялся целиком. Остаток на стенде — три макета, и все три про одно: ссылка ячейки на запись ширины, оставшуюся от прежнего состояния документа. Это не воспроизводится принципиально, разобрано в docs/1c-spreadsheet-spec.md. Co-Authored-By: Claude Opus 5 (1M context) --- .../mxl-compile/scripts/mxl-compile.ps1 | 63 ++++++++++--- .../skills/mxl-compile/scripts/mxl-compile.py | 60 +++++++++--- .../mxl-decompile/scripts/mxl-decompile.ps1 | 55 +++++++++-- .../mxl-decompile/scripts/mxl-decompile.py | 54 ++++++++--- .../snapshots/column-sets/Template.xml | 2 - .../snapshots/column-styles/Template.xml | 4 +- .../snapshots/column-widths/Template.xml | 19 ++-- .../snapshots/empty-rows/Template.xml | 16 +--- .../snapshots/format-strings/Template.xml | 33 ++----- .../snapshots/merged-cells/Template.xml | 30 +++--- .../snapshots/multiple-areas/Template.xml | 35 +++---- .../snapshots/named-areas-coords/Template.xml | 2 - .../snapshots/page-a4-landscape/Template.xml | 19 ++-- .../parameters-and-templates/Template.xml | 17 +--- .../snapshots/print-form/Template.xml | 91 ++++++++----------- .../snapshots/row-own-format/Template.xml | 22 ++--- .../snapshots/shorthand-merges/Template.xml | 2 - .../snapshots/shorthand-rows/Template.xml | 3 - .../style-full-properties/Template.xml | 7 +- .../styles-fonts-borders/Template.xml | 38 +++----- .../snapshots/text-multilang/Template.xml | 2 - .../snapshots/unnamed-blocks/Template.xml | 2 - .../roundtrip-merged-cells/Template.xml | 15 +-- .../roundtrip-multiple-areas/Template.xml | 26 ++---- .../snapshots/roundtrip-styles/Template.xml | 6 +- .../roundtrip-templates/Template.xml | 2 - .../snapshots/areas-and-params/Template.xml | 28 ++---- .../snapshots/detail-params/Template.xml | 14 +-- .../snapshots/json-format/Template.xml | 2 - .../mxl-info/snapshots/with-text/Template.xml | 3 - .../snapshots/valid-complex/Template.xml | 24 ++--- .../snapshots/valid-print-form/Template.xml | 27 ++---- .../valid-with-detailed/Template.xml | 12 +-- 33 files changed, 356 insertions(+), 379 deletions(-) diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 index 50445a79..00401b3a 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.35 — Compile 1C spreadsheet from JSON +# mxl-compile v1.36 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -502,7 +502,7 @@ function Get-RowFormatProps { $props = @{} $spec = Get-RowStyleSpec $row.rowStyle "row" if ($spec.Name -and $spec.Apply -cne 'cells') { - $props = Resolve-Style -styleName $spec.Name -fillType "" -noDefaultFont + $props = Resolve-Style -styleName $spec.Name -fillType "" } if ($row.height) { $props['height'] = [int]$row.height } if ($row.hidden -eq $true) { $props['hidden'] = 'true' } @@ -510,12 +510,13 @@ function Get-RowFormatProps { } function Resolve-Style { - param([string]$styleName, [string]$fillType, [switch]$noDefaultFont) + param([string]$styleName, [string]$fillType) # Набор свойств формата — «тег платформы → значение», только заданные. Порядок вставки # роли не играет: и ключ дедупликации, и эмиссия идут по каноническому порядку тегов. + # пишем только когда стиль задал шрифт: треть форматов корпуса (23 003 из 69 581) + # обходится без него, а мы раньше подставляли шрифт по умолчанию всегда. $props = @{} - if (-not $noDefaultFont) { $props['font'] = $fontMap["default"] } if ($styleName -and $def.styles) { $style = $def.styles.$styleName @@ -753,7 +754,7 @@ foreach ($layout in $columnLayouts) { if ($styleName) { # Шрифт по умолчанию колонке не навязываем: формат колонки без оформления — # это ровно , как пишет платформа. - $props = Resolve-Style -styleName $styleName -fillType "" -noDefaultFont + $props = Resolve-Style -styleName $styleName -fillType "" } if ($layout.Widths.ContainsKey($col)) { $props['width'] = $layout.Widths[$col] } $map[$col] = Register-Format $props @@ -827,7 +828,7 @@ function Register-CellFormat { # У ячейки без собственного оформления формата НЕТ вовсе: 0, где ноль — не индекс # записи, а «формата нет». В корпусе так у 170 710 ячеек против 50 635, ссылающихся на # формат по умолчанию; 0 встречается в 71% макетов. - if ($resolved.Count -eq 1 -and $resolved['font'] -eq $fontMap["default"]) { + if ($resolved.Count -eq 0) { return 0 } return Register-Format $resolved @@ -1065,14 +1066,50 @@ X '' X "" # 7b. Language settings +# Языки МАКЕТА — не то же, что textLanguages: там языки, на которые разворачивается текст +# ячейки, здесь объявление в шапке. В 98% макетов ERP объявлен один ru, а текст лежит и под +# ru, и под en, поэтому выводить одно из другого нельзя. Ключи недокументированные: автору +# они не нужны, нужны раундтрипу. +$langCodes = @{ 'ru' = 'Русский'; 'en' = 'Английский' } +$langList = @() +if ($def.languages) { + foreach ($l in @($def.languages)) { + if ($l -is [string]) { + $code = if ($langCodes.ContainsKey("$l")) { $langCodes["$l"] } else { "$l" } + $langList += @{ Id = "$l"; Code = $code; Description = $code } + } else { + # description отсутствует и пустая строка — одно и то же: тег есть всегда, но + # бывает самозакрывающимся (77 записей корпуса против 11 017 со значением). + $langList += @{ + Id = "$($l.id)" + Code = "$($l.code)" + Description = if ($null -eq $l.description) { '' } else { "$($l.description)" } + } + } + } +} +if ($langList.Count -eq 0) { + $langList = @(@{ Id = 'ru'; Code = 'Русский'; Description = 'Русский' }) +} +$currentLang = if ($def.PSObject.Properties['currentLanguage']) { $def.currentLanguage } else { 'ru' } +$defaultLang = if ($def.defaultLanguage) { "$($def.defaultLanguage)" } else { 'ru' } + X "`t" -X "`t`tru" -X "`t`tru" -X "`t`t" -X "`t`t`tru" -X "`t`t`tРусский" -X "`t`t`tРусский" -X "`t`t" +if ($null -ne $currentLang -and "$currentLang" -ne '') { + X "`t`t$(Esc-XmlText "$currentLang")" +} +X "`t`t$(Esc-XmlText $defaultLang)" +foreach ($l in $langList) { + X "`t`t" + X "`t`t`t$(Esc-XmlText $l.Id)" + X "`t`t`t$(Esc-XmlText $l.Code)" + if ($l.Description -eq '') { + X "`t`t`t" + } else { + X "`t`t`t$(Esc-XmlText $l.Description)" + } + X "`t`t" +} X "`t" # 7c. Columns diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.py b/.claude/skills/mxl-compile/scripts/mxl-compile.py index e58a2cb3..0cac8831 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.35 — Compile 1C spreadsheet from JSON +# mxl-compile v1.36 — Compile 1C spreadsheet from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import hashlib @@ -695,17 +695,19 @@ def main(): props = {} name, apply_to = row_style_spec(row.get('rowStyle'), 'row') if name and apply_to != 'cells': - props = resolve_style(name, '', no_default_font=True) + props = resolve_style(name, '') if row.get('height'): props['height'] = int(row['height']) if row.get('hidden') is True: props['hidden'] = 'true' return props - def resolve_style(style_name, fill_type, no_default_font=False): + def resolve_style(style_name, fill_type): # Набор свойств формата — «тег платформы → значение», только заданные. Порядок вставки # роли не играет: и ключ дедупликации, и эмиссия идут по каноническому порядку тегов. - props = {} if no_default_font else {'font': font_map.get('default', 0)} + # пишем только когда стиль задал шрифт: треть форматов корпуса (23 003 из + # 69 581) обходится без него, а мы раньше подставляли шрифт по умолчанию всегда. + props = {} if style_name and defn.get('styles'): style = defn['styles'].get(style_name) @@ -827,7 +829,7 @@ def main(): if style_name: # Шрифт по умолчанию колонке не навязываем: формат колонки без оформления — # это ровно , как пишет платформа. - props = resolve_style(style_name, '', no_default_font=True) + props = resolve_style(style_name, '') if col in layout['Widths']: props['width'] = layout['Widths'][col] fmap[col] = register_format(props) @@ -872,7 +874,7 @@ def main(): # У ячейки без собственного оформления формата НЕТ вовсе: 0, где ноль — не # индекс записи, а «формата нет». В корпусе так у 170 710 ячеек против 50 635, # ссылающихся на формат по умолчанию; 0 встречается в 71% макетов. - if len(resolved) == 1 and resolved.get('font') == font_map.get('default', 0): + if not resolved: return 0 return register_format(resolved) @@ -1077,15 +1079,43 @@ def main(): lines.append(f'') # 7b. Language settings - lines.append('\t') - lines.append('\t\tru') - lines.append('\t\tru') - lines.append('\t\t') - lines.append('\t\t\tru') - lines.append('\t\t\t\u0420\u0443\u0441\u0441\u043a\u0438\u0439') - lines.append('\t\t\t\u0420\u0443\u0441\u0441\u043a\u0438\u0439') - lines.append('\t\t') - lines.append('\t') + # Языки МАКЕТА — не то же, что textLanguages: там языки, на которые разворачивается текст + # ячейки, здесь объявление в шапке. Почти во всех макетах ERP объявлен один ru, а текст + # лежит и под ru, и под en, поэтому выводить одно из другого нельзя. Ключи + # недокументированные: автору они не нужны, нужны раундтрипу. + RU = '\u0420\u0443\u0441\u0441\u043a\u0438\u0439' + lang_codes = {'ru': RU, 'en': '\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439'} + lang_list = [] + for lang in (defn.get('languages') or []): + if isinstance(lang, dict): + # description отсутствует и пустая строка — одно и то же: тег есть всегда, но + # бывает самозакрывающимся (77 записей корпуса против 11 017 со значением). + lang_list.append({'Id': str(lang.get('id') or ''), + 'Code': str(lang.get('code') or ''), + 'Description': '' if lang.get('description') is None + else str(lang['description'])}) + else: + code = lang_codes.get(str(lang), str(lang)) + lang_list.append({'Id': str(lang), 'Code': code, 'Description': code}) + if not lang_list: + lang_list = [{'Id': 'ru', 'Code': RU, 'Description': RU}] + current_lang = defn['currentLanguage'] if 'currentLanguage' in defn else 'ru' + default_lang = str(defn.get('defaultLanguage') or 'ru') + + lines.append(' ') + if current_lang is not None and str(current_lang) != '': + lines.append(f' {esc_xml_text(str(current_lang))}') + lines.append(f' {esc_xml_text(default_lang)}') + for lang in lang_list: + lines.append(' ') + lines.append(f' {esc_xml_text(lang["Id"])}') + lines.append(f' {esc_xml_text(lang["Code"])}') + if lang['Description'] == '': + lines.append(' ') + else: + lines.append(f' {esc_xml_text(lang["Description"])}') + lines.append(' ') + lines.append(' ') # 7c. Columns # Раскладка по умолчанию идёт первой и без — так их хранит платформа. diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 b/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 index 36f0a6ac..cdfd6d3c 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.13 — Decompile 1C spreadsheet to JSON +# mxl-decompile v1.14 — Decompile 1C spreadsheet to JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -54,6 +54,8 @@ function Get-FormatTagKind { } } +$RU_NAME = 'Русский' + # Теги, значение которых — многоязычная строка ( на язык), а не скаляр. function Get-FormatMlTags { return @{ 'format' = $true; 'editFormat' = $true; 'mask' = $true } @@ -407,8 +409,9 @@ function Get-StyleProps { function Get-StyleKey { param($fmt) if (-not $fmt) { return "empty" } - $fi = if ($fmt.FontIdx -ge 0) { $fmt.FontIdx } else { 0 } - $parts = @("f=$fi") + # «шрифта нет» и «шрифт с индексом 0» — разные форматы: нулевой шрифт вовсе не обязан + # быть обычным, в макете он бывает курсивным или жирным. + $parts = @("f=" + $(if ($fmt.FontIdx -ge 0) { "$($fmt.FontIdx)" } else { "none" })) $props = Get-StyleProps $fmt foreach ($tag in $props.Keys) { $v = $props[$tag] @@ -506,7 +509,9 @@ function Get-RowStyleFmt { if (-not $fmt) { return $null } $props = Get-StyleProps $fmt $props.Remove('hidden') | Out-Null - if ($props.Count -eq 0) { return $null } + # Шрифт в Get-StyleProps не входит (он адресуется именем), поэтому формат строки, + # несущий ТОЛЬКО шрифт, здесь выглядел пустым и терялся. + if ($props.Count -eq 0 -and $fmt.FontIdx -lt 0) { return $null } $reduced = [ordered]@{} foreach ($tag in $fmt.Props.Keys) { if ($tag -cne 'hidden') { $reduced[$tag] = $fmt.Props[$tag] } @@ -543,8 +548,8 @@ function Name-Style { $parts = @() $props = Get-StyleProps $fmt - $fi = if ($fmt.FontIdx -ge 0) { $fmt.FontIdx } else { 0 } - if ($fontNames.ContainsKey($fi) -and $fontNames[$fi] -ne "default") { + $fi = $fmt.FontIdx + if ($fi -ge 0 -and $fontNames.ContainsKey($fi) -and $fontNames[$fi] -ne "default") { $parts += $fontNames[$fi] } @@ -569,7 +574,13 @@ function Name-Style { # Имя "default" зарезервировано за стилем БЕЗ свойств: под ним компилятор понимает # отсутствие оформления. Набор из одних неприметных свойств (отступ, защита) обязан # получить своё имя, иначе он потеряется. - if ($parts.Count -eq 0) { return $(if ($props.Count -eq 0) { "default" } else { "style" }) } + # Имя "default" зарезервировано за стилем БЕЗ свойств: под ним компилятор понимает + # отсутствие оформления, и ячейка такой стиль не записывает. Набор из одних неприметных + # свойств или из одного шрифта обязан получить своё имя, иначе он потеряется. + if ($parts.Count -eq 0) { + $hasContent = ($props.Count -gt 0) -or ($fmt.FontIdx -ge 0) + return $(if ($hasContent) { "style" } else { "default" }) + } return ($parts -join "-") } @@ -586,9 +597,8 @@ foreach ($key in $styleKeys.Keys) { $styleNames[$key] = $name $sDef = [ordered]@{} - $fi = if ($fmt.FontIdx -ge 0) { $fmt.FontIdx } else { 0 } - if ($fontNames.ContainsKey($fi) -and $fontNames[$fi] -ne "default") { - $sDef["font"] = $fontNames[$fi] + if ($fmt.FontIdx -ge 0) { + $sDef["font"] = $(if ($fontNames.ContainsKey($fmt.FontIdx)) { $fontNames[$fmt.FontIdx] } else { "default" }) } $props = Get-StyleProps $fmt foreach ($tag in $props.Keys) { $sDef[$tag] = $props[$tag] } @@ -970,6 +980,31 @@ if ($defaultSet) { if ($textLanguages.Count -gt 0 -and -not ($textLanguages.Count -eq 1 -and $textLanguages[0] -ceq 'ru')) { $result["textLanguages"] = [array]$textLanguages } + +# Объявление языков МАКЕТА — не то же, что языки текста: почти во всех макетах ERP объявлен +# один ru, а текст лежит и под ru, и под en. Пишем, только если отличается от умолчания. +$lsNode = $root.SelectSingleNode("d:languageSettings", $ns) +if ($lsNode) { + $langs = @() + foreach ($li in $lsNode.SelectNodes("d:languageInfo", $ns)) { + $idN = $li.SelectSingleNode("d:id", $ns) + $codeN = $li.SelectSingleNode("d:code", $ns) + $descN = $li.SelectSingleNode("d:description", $ns) + $langs += [ordered]@{ + id = $(if ($idN) { $idN.InnerText } else { "" }) + code = $(if ($codeN) { $codeN.InnerText } else { "" }) + description = $(if ($descN) { $descN.InnerText } else { "" }) + } + } + $isDefault = ($langs.Count -eq 1 -and $langs[0].id -ceq 'ru' -and + $langs[0].code -ceq $RU_NAME -and $langs[0].description -ceq $RU_NAME) + if (-not $isDefault) { $result["languages"] = [array]$langs } + $curN = $lsNode.SelectSingleNode("d:currentLanguage", $ns) + $cur = if ($curN) { $curN.InnerText } else { $null } + if ($cur -cne 'ru') { $result["currentLanguage"] = $cur } + $dfltN = $lsNode.SelectSingleNode("d:defaultLanguage", $ns) + if ($dfltN -and $dfltN.InnerText -cne 'ru') { $result["defaultLanguage"] = $dfltN.InnerText } +} # Remove empty "default" style if ($styleDefs.Contains("default") -and $styleDefs["default"].Count -eq 0) { $styleDefs.Remove("default") diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py index 0678db4f..2e61accb 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.13 — Decompile 1C spreadsheet to JSON +# mxl-decompile v1.14 — Decompile 1C spreadsheet to JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -94,6 +94,9 @@ def format_tag_kind(): } +RU_NAME = 'Русский' + + def format_ml_tags(): """Теги, значение которых — многоязычная строка ( на язык), а не скаляр.""" return {'format': True, 'editFormat': True, 'mask': True} @@ -573,8 +576,9 @@ def main(): def get_style_key(fmt): if not fmt: return "empty" - fi = fmt["FontIdx"] if fmt["FontIdx"] >= 0 else 0 - parts = [f"f={fi}"] + # «шрифта нет» и «шрифт с индексом 0» — разные форматы: нулевой шрифт вовсе не + # обязан быть обычным, в макете он бывает курсивным или жирным. + parts = ["f=" + (str(fmt["FontIdx"]) if fmt["FontIdx"] >= 0 else "none")] for tag, val in style_props(fmt).items(): parts.append(f"{tag}={val}") return "|".join(parts) @@ -666,7 +670,9 @@ def main(): return None props = style_props(fmt) props.pop("hidden", None) - if not props: + # Шрифт в style_props не входит (он адресуется именем), поэтому формат строки, + # несущий ТОЛЬКО шрифт, здесь выглядел пустым и терялся. + if not props and fmt["FontIdx"] < 0: return None reduced = OrderedDict() for tag, raw in fmt["Props"].items(): @@ -703,8 +709,8 @@ def main(): parts = [] props = style_props(fmt) - fi = fmt["FontIdx"] if fmt["FontIdx"] >= 0 else 0 - if fi in font_names and font_names[fi] != "default": + fi = fmt["FontIdx"] + if fi >= 0 and font_names.get(fi, "default") != "default": parts.append(font_names[fi]) if "border" in props: @@ -734,9 +740,11 @@ def main(): if len(parts) == 0: # Имя "default" зарезервировано за стилем БЕЗ свойств: под ним компилятор - # понимает отсутствие оформления. Набор из одних неприметных свойств - # (отступ, защита) обязан получить своё имя, иначе он потеряется. - return "default" if not props else "style" + # понимает отсутствие оформления, и ячейка такой стиль не записывает. Набор + # из одних неприметных свойств (отступ, защита) или из одного шрифта обязан + # получить своё имя, иначе он потеряется. + has_content = bool(props) or fmt["FontIdx"] >= 0 + return "style" if has_content else "default" return "-".join(parts) style_names = OrderedDict() @@ -755,9 +763,8 @@ def main(): style_names[key] = name s_def = OrderedDict() - fi = fmt["FontIdx"] if fmt["FontIdx"] >= 0 else 0 - if fi in font_names and font_names[fi] != "default": - s_def["font"] = font_names[fi] + if fmt["FontIdx"] >= 0: + s_def["font"] = font_names.get(fmt["FontIdx"], "default") s_def.update(style_props(fmt)) style_defs[name] = s_def @@ -1107,6 +1114,29 @@ def main(): if text_languages and text_languages != ['ru']: result["textLanguages"] = text_languages + # Объявление языков МАКЕТА — не то же, что языки текста: почти во всех макетах ERP + # объявлен один ru, а текст лежит и под ru, и под en. Пишем, только если отличается + # от умолчания компилятора. + ls_node = find(root, "d:languageSettings") + if ls_node is not None: + langs = [] + for li in findall(ls_node, "d:languageInfo"): + desc_node = find(li, "d:description") + langs.append(OrderedDict([ + ("id", text_of(find(li, "d:id")) or ""), + ("code", text_of(find(li, "d:code")) or ""), + ("description", text_of(desc_node) or "" if desc_node is not None else ""), + ])) + if langs != [OrderedDict([("id", "ru"), ("code", RU_NAME), ("description", RU_NAME)])]: + result["languages"] = langs + cur_node = find(ls_node, "d:currentLanguage") + cur = text_of(cur_node) if cur_node is not None else None + if cur != "ru": + result["currentLanguage"] = cur + dflt = text_of(find(ls_node, "d:defaultLanguage")) + if dflt and dflt != "ru": + result["defaultLanguage"] = dflt + # Remove empty "default" style if "default" in style_defs and len(style_defs["default"]) == 0: del style_defs["default"] diff --git a/tests/skills/cases/mxl-compile/snapshots/column-sets/Template.xml b/tests/skills/cases/mxl-compile/snapshots/column-sets/Template.xml index c8bd8735..c7126c4e 100644 --- a/tests/skills/cases/mxl-compile/snapshots/column-sets/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/column-sets/Template.xml @@ -138,7 +138,6 @@ -1 - 20 @@ -146,7 +145,6 @@ 8 - 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/column-styles/Template.xml b/tests/skills/cases/mxl-compile/snapshots/column-styles/Template.xml index cef1c421..31ca42c5 100644 --- a/tests/skills/cases/mxl-compile/snapshots/column-styles/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/column-styles/Template.xml @@ -127,7 +127,6 @@ -1 - 30 @@ -143,11 +142,10 @@ 12 - 1 + 0 #EBEBEB - 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/column-widths/Template.xml b/tests/skills/cases/mxl-compile/snapshots/column-widths/Template.xml index 17a6ca0d..39c55ae0 100644 --- a/tests/skills/cases/mxl-compile/snapshots/column-widths/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/column-widths/Template.xml @@ -54,7 +54,7 @@ 4 - 5 + 4 ru @@ -65,7 +65,7 @@ - 5 + 4 ru @@ -76,7 +76,7 @@ - 5 + 4 ru @@ -87,7 +87,7 @@ - 5 + 4 ru @@ -98,7 +98,7 @@ - 5 + 4 ru @@ -109,7 +109,7 @@ - 5 + 4 ru @@ -121,7 +121,7 @@ true - 6 + 5 1 1 @@ -137,7 +137,6 @@ Solid - 10 @@ -150,10 +149,6 @@ 0 - - 0 - 0 - 20 diff --git a/tests/skills/cases/mxl-compile/snapshots/empty-rows/Template.xml b/tests/skills/cases/mxl-compile/snapshots/empty-rows/Template.xml index 95e70cb5..9789ce86 100644 --- a/tests/skills/cases/mxl-compile/snapshots/empty-rows/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/empty-rows/Template.xml @@ -41,26 +41,26 @@ 2 - 4 + 3 Код - 4 + 3 Имя - 4 + 3 Значение true - 5 + 4 4 4 @@ -91,21 +91,15 @@ Solid - - 1 + 0 Center 0 - 0 - 0 - - - 0 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/format-strings/Template.xml b/tests/skills/cases/mxl-compile/snapshots/format-strings/Template.xml index 158221b7..bf9300f8 100644 --- a/tests/skills/cases/mxl-compile/snapshots/format-strings/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/format-strings/Template.xml @@ -18,7 +18,7 @@ 1 - 2 + 1 ru @@ -29,7 +29,7 @@ - 2 + 1 ru @@ -40,7 +40,7 @@ - 2 + 1 ru @@ -51,7 +51,7 @@ - 2 + 1 ru @@ -65,35 +65,35 @@ 1 - 3 + 2 - 5 + 3 Дата - 6 + 4 Товар - 7 + 5 Количество - 7 + 5 Цена true - 8 + 6 2 2 @@ -119,25 +119,14 @@ Solid - 0 Center - - 0 - 0 - Center - 0 - 0 - 0 - - - 0 0 Center Parameter @@ -149,12 +138,10 @@ - 0 0 Parameter - 0 0 Right Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/merged-cells/Template.xml b/tests/skills/cases/mxl-compile/snapshots/merged-cells/Template.xml index 740c3090..a846f368 100644 --- a/tests/skills/cases/mxl-compile/snapshots/merged-cells/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/merged-cells/Template.xml @@ -18,7 +18,7 @@ 1 - 3 + 2 ru @@ -29,7 +29,7 @@ - 3 + 2 ru @@ -41,7 +41,7 @@ 3 - 3 + 2 ru @@ -59,7 +59,7 @@ 1 - 4 + 3 ru @@ -70,7 +70,7 @@ - 4 + 3 ru @@ -87,32 +87,32 @@ 1 - 5 + 4 Номер - 6 + 5 Наименование - 6 + 5 Артикул - 6 + 5 Итого true - 7 + 6 3 3 @@ -155,7 +155,6 @@ Solid - 0 @@ -163,25 +162,18 @@ 0 0 + Center - 1 0 Center - 0 - 0 - Center - - - 0 0 Center Parameter - 0 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/multiple-areas/Template.xml b/tests/skills/cases/mxl-compile/snapshots/multiple-areas/Template.xml index f2d4a8a8..0bd89837 100644 --- a/tests/skills/cases/mxl-compile/snapshots/multiple-areas/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/multiple-areas/Template.xml @@ -30,7 +30,7 @@ 3 - 4 + 3 ru @@ -41,7 +41,7 @@ - 4 + 3 ru @@ -52,7 +52,7 @@ - 4 + 3 ru @@ -63,7 +63,7 @@ - 4 + 3 ru @@ -80,26 +80,26 @@ 3 - 5 + 4 НомерСтроки - 5 + 4 Товар Номенклатура - 6 + 5 Количество - 6 + 5 Сумма @@ -111,7 +111,7 @@ 2 - 7 + 6 ru @@ -122,14 +122,14 @@ - 8 + 7 Всего true - 9 + 8 4 4 @@ -180,14 +180,13 @@ Solid - 20 - 2 + 1 Center Parameter @@ -195,27 +194,21 @@ 0 - 0 - 0 - - - 0 0 Parameter - 0 0 Right Parameter - 1 + 0 0 Right - 1 + 0 0 Right Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/named-areas-coords/Template.xml b/tests/skills/cases/mxl-compile/snapshots/named-areas-coords/Template.xml index 090b3f0b..3ab5be2f 100644 --- a/tests/skills/cases/mxl-compile/snapshots/named-areas-coords/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/named-areas-coords/Template.xml @@ -134,9 +134,7 @@ 0 - - 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/page-a4-landscape/Template.xml b/tests/skills/cases/mxl-compile/snapshots/page-a4-landscape/Template.xml index 3ce62301..129eb0fe 100644 --- a/tests/skills/cases/mxl-compile/snapshots/page-a4-landscape/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/page-a4-landscape/Template.xml @@ -109,31 +109,31 @@ 4 - 6 + 5 Номер - 7 + 6 Описание - 6 + 5 ЕдИзм - 6 + 5 Количество - 7 + 6 Сумма @@ -166,7 +166,6 @@ Solid - 111 @@ -175,7 +174,7 @@ 333 - 1 + 0 0 Center @@ -183,17 +182,11 @@ 0 - 0 - 0 - - - 0 0 Center Parameter - 0 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/parameters-and-templates/Template.xml b/tests/skills/cases/mxl-compile/snapshots/parameters-and-templates/Template.xml index 842b590a..c16a892d 100644 --- a/tests/skills/cases/mxl-compile/snapshots/parameters-and-templates/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/parameters-and-templates/Template.xml @@ -72,26 +72,26 @@ 3 - 5 + 4 Позиция - 5 + 4 Товар - 5 + 4 Цена true - 6 + 5 3 3 @@ -127,24 +127,17 @@ Solid - - 1 + 0 - 0 Template 0 - 0 - 0 - - - 0 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/print-form/Template.xml b/tests/skills/cases/mxl-compile/snapshots/print-form/Template.xml index fd40ade9..961924eb 100644 --- a/tests/skills/cases/mxl-compile/snapshots/print-form/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/print-form/Template.xml @@ -142,7 +142,7 @@ 6 - 8 + 7 ru @@ -153,7 +153,7 @@ - 8 + 7 ru @@ -165,7 +165,7 @@ 6 - 8 + 7 ru @@ -176,7 +176,7 @@ - 8 + 7 ru @@ -187,7 +187,7 @@ - 8 + 7 ru @@ -198,7 +198,7 @@ - 8 + 7 ru @@ -215,13 +215,13 @@ 6 - 9 + 8 НомерСтроки - 10 + 9 Товар Номенклатура @@ -229,25 +229,25 @@ 6 - 9 + 8 ЕдИзм - 11 + 10 Количество - 11 + 10 Цена - 11 + 10 Сумма @@ -259,7 +259,7 @@ 7 - 12 + 11 ru @@ -271,7 +271,7 @@ 9 - 13 + 12 ИтогоСумма @@ -283,7 +283,7 @@ 7 - 12 + 11 ru @@ -295,7 +295,7 @@ 9 - 13 + 12 ИтогоНДС @@ -325,7 +325,7 @@ 3 - 14 + 13 Отпустил @@ -337,7 +337,7 @@ 3 - 15 + 14 ru @@ -371,7 +371,7 @@ 3 - 14 + 13 Получил @@ -383,7 +383,7 @@ 3 - 15 + 14 ru @@ -526,7 +526,6 @@ Solid - @@ -536,64 +535,54 @@ 20 - - 2 - Center - Parameter - 1 - - - 0 - Parameter - - - 0 - - - 0 - 0 - - - 0 - 0 - Center - - - 0 - 0 Center Parameter 0 + + + Parameter + + + 0 + + + 0 + Center + + + 0 + Center + Parameter + + 0 Parameter - 0 0 Right Parameter - 1 + 0 Right - 1 + 0 0 Right Parameter - 0 0 Parameter - 3 + 2 Center \ No newline at end of file diff --git a/tests/skills/cases/mxl-compile/snapshots/row-own-format/Template.xml b/tests/skills/cases/mxl-compile/snapshots/row-own-format/Template.xml index 6022a489..e580736e 100644 --- a/tests/skills/cases/mxl-compile/snapshots/row-own-format/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/row-own-format/Template.xml @@ -35,7 +35,7 @@ 2 - 3 + 2 ru @@ -46,12 +46,12 @@ - 3 + 2 - 3 + 2 @@ -59,7 +59,7 @@ 2 - 4 + 3 0 @@ -78,7 +78,7 @@ - 5 + 4 ru @@ -89,18 +89,18 @@ - 5 + 4 - 5 + 4 true - 6 + 5 4 4 @@ -116,7 +116,6 @@ Solid - 20 @@ -127,13 +126,8 @@ 0 - #EBEBEB - 1 - - - 0 0 diff --git a/tests/skills/cases/mxl-compile/snapshots/shorthand-merges/Template.xml b/tests/skills/cases/mxl-compile/snapshots/shorthand-merges/Template.xml index 86d2171a..10f608b9 100644 --- a/tests/skills/cases/mxl-compile/snapshots/shorthand-merges/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/shorthand-merges/Template.xml @@ -139,9 +139,7 @@ -1 - - 0 Parameter diff --git a/tests/skills/cases/mxl-compile/snapshots/shorthand-rows/Template.xml b/tests/skills/cases/mxl-compile/snapshots/shorthand-rows/Template.xml index 798d21fb..99b09559 100644 --- a/tests/skills/cases/mxl-compile/snapshots/shorthand-rows/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/shorthand-rows/Template.xml @@ -107,13 +107,10 @@ Solid - - 0 Parameter - 0 0 Center diff --git a/tests/skills/cases/mxl-compile/snapshots/style-full-properties/Template.xml b/tests/skills/cases/mxl-compile/snapshots/style-full-properties/Template.xml index 6c8b5105..5e8a3b23 100644 --- a/tests/skills/cases/mxl-compile/snapshots/style-full-properties/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/style-full-properties/Template.xml @@ -113,10 +113,9 @@ Solid - - 1 + 0 Center Center style:FormTextColor @@ -125,26 +124,22 @@ true - 0 0 1 2 #C8C8C8 - 0 d3p1:ButtonText d3p1:Gainsboro - 0 Parameter true 900 2 - 0 3 diff --git a/tests/skills/cases/mxl-compile/snapshots/styles-fonts-borders/Template.xml b/tests/skills/cases/mxl-compile/snapshots/styles-fonts-borders/Template.xml index 3add3720..f35a8f88 100644 --- a/tests/skills/cases/mxl-compile/snapshots/styles-fonts-borders/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/styles-fonts-borders/Template.xml @@ -119,31 +119,31 @@ 6 - 8 + 7 НомерСтроки - 9 + 8 Товар - 10 + 9 Количество - 10 + 9 Цена - 10 + 9 Сумма @@ -155,7 +155,7 @@ 3 - 11 + 10 ru @@ -166,7 +166,7 @@ - 12 + 11 Всего @@ -177,7 +177,7 @@ - 13 + 12 ru @@ -189,7 +189,7 @@ true - 14 + 13 6 6 @@ -278,7 +278,6 @@ Solid - @@ -287,59 +286,50 @@ 25 - 2 + 1 Center - 1 + 0 0 - 4 + 3 Parameter - 1 + 0 1 0 - 0 - 0 - - - 0 0 Center Parameter - 0 0 Wrap Parameter - 0 0 Right Parameter - 0 0 0 - 0 0 0 Parameter - 3 + 2 Center diff --git a/tests/skills/cases/mxl-compile/snapshots/text-multilang/Template.xml b/tests/skills/cases/mxl-compile/snapshots/text-multilang/Template.xml index 0f61d33d..e6e70494 100644 --- a/tests/skills/cases/mxl-compile/snapshots/text-multilang/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/text-multilang/Template.xml @@ -72,9 +72,7 @@ -1 - - 0 Template diff --git a/tests/skills/cases/mxl-compile/snapshots/unnamed-blocks/Template.xml b/tests/skills/cases/mxl-compile/snapshots/unnamed-blocks/Template.xml index e3418876..827951fa 100644 --- a/tests/skills/cases/mxl-compile/snapshots/unnamed-blocks/Template.xml +++ b/tests/skills/cases/mxl-compile/snapshots/unnamed-blocks/Template.xml @@ -118,9 +118,7 @@ -1 - - 0 Parameter diff --git a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-merged-cells/Template.xml b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-merged-cells/Template.xml index 4bb0a7f4..13a2e078 100644 --- a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-merged-cells/Template.xml +++ b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-merged-cells/Template.xml @@ -18,7 +18,7 @@ 1 - 3 + 2 ru @@ -29,7 +29,7 @@ - 3 + 2 ru @@ -47,7 +47,7 @@ 1 - 2 + 1 ru @@ -58,7 +58,7 @@ - 2 + 1 ru @@ -70,7 +70,7 @@ true - 4 + 3 2 2 @@ -97,7 +97,6 @@ Solid - 0 @@ -105,10 +104,6 @@ 0 0 - - - 1 - 0 Center diff --git a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-multiple-areas/Template.xml b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-multiple-areas/Template.xml index e643acb8..ed342452 100644 --- a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-multiple-areas/Template.xml +++ b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-multiple-areas/Template.xml @@ -30,25 +30,25 @@ 3 - 5 + 4 Номер - 5 + 4 Товар - 6 + 5 Количество - 6 + 5 Сумма @@ -60,7 +60,7 @@ 2 - 7 + 6 ru @@ -71,14 +71,14 @@ - 8 + 7 Всего true - 9 + 8 3 3 @@ -119,40 +119,32 @@ Solid - 20 - 0 Parameter 0 - 0 - 0 - - - 0 0 Parameter - 0 0 Right Parameter - 1 + 0 0 Right - 1 + 0 0 Right Parameter diff --git a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-styles/Template.xml b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-styles/Template.xml index 27fa6f04..25d3f571 100644 --- a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-styles/Template.xml +++ b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-styles/Template.xml @@ -67,20 +67,18 @@ Solid - - 1 + 0 0 Center - 2 + 1 Right - 0 0 diff --git a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-templates/Template.xml b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-templates/Template.xml index bf8c9f16..b3daf862 100644 --- a/tests/skills/cases/mxl-decompile/snapshots/roundtrip-templates/Template.xml +++ b/tests/skills/cases/mxl-decompile/snapshots/roundtrip-templates/Template.xml @@ -53,9 +53,7 @@ -1 - - 0 Template diff --git a/tests/skills/cases/mxl-info/snapshots/areas-and-params/Template.xml b/tests/skills/cases/mxl-info/snapshots/areas-and-params/Template.xml index d50850ec..f5f2d224 100644 --- a/tests/skills/cases/mxl-info/snapshots/areas-and-params/Template.xml +++ b/tests/skills/cases/mxl-info/snapshots/areas-and-params/Template.xml @@ -53,32 +53,32 @@ 2 - 4 + 3 НомерСтроки - 4 + 3 Товар Номенклатура - 5 + 4 Количество - 5 + 4 Цена - 5 + 4 Сумма @@ -90,7 +90,7 @@ 3 - 6 + 5 ru @@ -101,14 +101,14 @@ - 7 + 6 Всего true - 8 + 7 4 4 @@ -169,37 +169,29 @@ Solid - - 0 Parameter 0 - 0 - 0 - - - 0 0 Parameter - 0 0 Right Parameter - 1 + 0 0 Right - 1 + 0 0 Right Parameter diff --git a/tests/skills/cases/mxl-info/snapshots/detail-params/Template.xml b/tests/skills/cases/mxl-info/snapshots/detail-params/Template.xml index 8bc20706..18500de3 100644 --- a/tests/skills/cases/mxl-info/snapshots/detail-params/Template.xml +++ b/tests/skills/cases/mxl-info/snapshots/detail-params/Template.xml @@ -18,27 +18,27 @@ 1 - 3 + 2 НомерСтроки - 3 + 2 Товар Номенклатура - 3 + 2 Сумма true - 4 + 3 1 1 @@ -54,16 +54,10 @@ Solid - 0 - 0 - 0 - - - 0 0 Parameter diff --git a/tests/skills/cases/mxl-info/snapshots/json-format/Template.xml b/tests/skills/cases/mxl-info/snapshots/json-format/Template.xml index ffaa1ed9..f04d9ee6 100644 --- a/tests/skills/cases/mxl-info/snapshots/json-format/Template.xml +++ b/tests/skills/cases/mxl-info/snapshots/json-format/Template.xml @@ -43,9 +43,7 @@ -1 - - 0 Parameter diff --git a/tests/skills/cases/mxl-info/snapshots/with-text/Template.xml b/tests/skills/cases/mxl-info/snapshots/with-text/Template.xml index ffa85712..63012a6b 100644 --- a/tests/skills/cases/mxl-info/snapshots/with-text/Template.xml +++ b/tests/skills/cases/mxl-info/snapshots/with-text/Template.xml @@ -139,13 +139,10 @@ -1 - - 0 Template - 0 Parameter diff --git a/tests/skills/cases/mxl-validate/snapshots/valid-complex/Template.xml b/tests/skills/cases/mxl-validate/snapshots/valid-complex/Template.xml index 0577bc47..bb2fc1bd 100644 --- a/tests/skills/cases/mxl-validate/snapshots/valid-complex/Template.xml +++ b/tests/skills/cases/mxl-validate/snapshots/valid-complex/Template.xml @@ -70,7 +70,7 @@ 1 - 4 + 3 ru @@ -81,7 +81,7 @@ - 4 + 3 ru @@ -98,32 +98,32 @@ 3 - 5 + 4 Номер - 5 + 4 Имя - 5 + 4 Код - 5 + 4 Сумма true - 6 + 5 4 4 @@ -181,16 +181,15 @@ Solid - - 1 + 0 0 Center Parameter - 1 + 0 0 Center @@ -198,11 +197,6 @@ 0 - 0 - 0 - - - 0 0 Parameter diff --git a/tests/skills/cases/mxl-validate/snapshots/valid-print-form/Template.xml b/tests/skills/cases/mxl-validate/snapshots/valid-print-form/Template.xml index 029c0e94..9cfbbf6c 100644 --- a/tests/skills/cases/mxl-validate/snapshots/valid-print-form/Template.xml +++ b/tests/skills/cases/mxl-validate/snapshots/valid-print-form/Template.xml @@ -60,31 +60,31 @@ 5 - 7 + 6 Номер - 7 + 6 Товар - 7 + 6 ЕдИзм - 8 + 7 Кол - 8 + 7 Сумма @@ -96,7 +96,7 @@ 3 - 9 + 8 ru @@ -107,7 +107,7 @@ - 10 + 9 Всего @@ -155,7 +155,6 @@ Solid - @@ -168,7 +167,7 @@ 20 - 2 + 1 Center Parameter @@ -176,27 +175,21 @@ 0 - 0 - 0 - - - 0 0 Parameter - 0 0 Right Parameter - 1 + 0 0 Right - 1 + 0 0 Right Parameter diff --git a/tests/skills/cases/mxl-validate/snapshots/valid-with-detailed/Template.xml b/tests/skills/cases/mxl-validate/snapshots/valid-with-detailed/Template.xml index 9cf6a8b5..b0b133a1 100644 --- a/tests/skills/cases/mxl-validate/snapshots/valid-with-detailed/Template.xml +++ b/tests/skills/cases/mxl-validate/snapshots/valid-with-detailed/Template.xml @@ -18,20 +18,20 @@ 1 - 3 + 2 Ключ - 3 + 2 Значение true - 4 + 3 1 1 @@ -47,16 +47,10 @@ Solid - 0 - 0 - 0 - - - 0 0 Parameter