fix(mxl-compile): не класть в палитру шрифт, на который никто не ссылается

Мы всегда заводили шрифт Arial 10 по умолчанию, даже когда его никто не
использует. Платформа так не делает: у макета без оформления элемента <font>
нет вовсе. Неиспользуемые шрифты теперь отбрасываются, ссылки перенумеровываются
(индексы шрифтов позиционные).

Проверено на контролируемом стенде: после правки простейший макет расходится
с платформенным ровно одной строкой — объявлением языков в шапке.

Кейс font-fractional-size дополнен: стиль, задающий ТОЛЬКО шрифт по умолчанию,
равнозначен отсутствию оформления (ячейка получает <f>0</f>), поэтому шрифт
остаётся неиспользованным. Чтобы кейс продолжал проверять целый размер, стилю
добавлено второе свойство.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-11 19:40:39 +03:00
co-authored by Claude Opus 5
parent 3f80f936ae
commit f72dd544dd
18 changed files with 115 additions and 31 deletions
@@ -1,4 +1,4 @@
# mxl-compile v1.34 — Compile 1C spreadsheet from JSON # mxl-compile v1.35 — 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)]
@@ -1021,6 +1021,30 @@ foreach ($area in $def.areas) {
# Формат по умолчанию — последняя запись палитры (см. выше). # Формат по умолчанию — последняя запись палитры (см. выше).
$defaultFormatIndex = Register-Format @{ width = $defaultWidth } $defaultFormatIndex = Register-Format @{ width = $defaultWidth }
# Шрифт, на который не ссылается ни один формат, платформа в палитру не кладёт: у макета
# без оформления элемента <font> нет вовсе. Мы же всегда заводили Arial 10 по умолчанию.
# Отбрасываем неиспользуемые и перенумеровываем ссылки — индексы шрифтов позиционные.
$usedFonts = @{}
foreach ($k in $formatRegistry.Keys) {
$fp = $formatRegistry[$k]
if ($fp.ContainsKey('font')) { $usedFonts[[int]$fp['font']] = $true }
}
if ($usedFonts.Count -lt $fontEntries.Count) {
$fontRemap = @{}
$kept = @()
for ($i = 0; $i -lt $fontEntries.Count; $i++) {
if ($usedFonts.ContainsKey($i)) {
$fontRemap[$i] = $kept.Count
$kept += $fontEntries[$i]
}
}
foreach ($k in @($formatRegistry.Keys)) {
$fp = $formatRegistry[$k]
if ($fp.ContainsKey('font')) { $fp['font'] = $fontRemap[[int]$fp['font']] }
}
$fontEntries = $kept
}
# --- 7. Generate XML --- # --- 7. Generate XML ---
$xml = New-Object System.Text.StringBuilder 4096 $xml = New-Object System.Text.StringBuilder 4096
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# mxl-compile v1.34 — Compile 1C spreadsheet from JSON # mxl-compile v1.35 — 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
@@ -1044,6 +1044,22 @@ def main():
# Формат по умолчанию — последняя запись палитры (см. выше). # Формат по умолчанию — последняя запись палитры (см. выше).
default_format_index = register_format({'width': default_width}) default_format_index = register_format({'width': default_width})
# Шрифт, на который не ссылается ни один формат, платформа в палитру не кладёт: у макета
# без оформления элемента <font> нет вовсе. Мы же всегда заводили Arial 10 по умолчанию.
# Отбрасываем неиспользуемые и перенумеровываем ссылки — индексы шрифтов позиционные.
used_fonts = {int(fp['font']) for fp in format_registry.values() if 'font' in fp}
if len(used_fonts) < len(font_entries):
font_remap = {}
kept = []
for i in range(len(font_entries)):
if i in used_fonts:
font_remap[i] = len(kept)
kept.append(font_entries[i])
for fp in format_registry.values():
if 'font' in fp:
fp['font'] = font_remap[int(fp['font'])]
font_entries = kept
# --- 7. Generate XML --- # --- 7. Generate XML ---
lines = [] lines = []
@@ -1,21 +1,57 @@
{ {
"name": "Дробный размер шрифта сохраняется", "name": "Дробный размер шрифта сохраняется",
"input": { "input": {
"columns": 2, "columns": 3,
"fonts": { "fonts": {
"default": { "face": "Arial", "size": 10 }, "default": {
"мелкий": { "face": "Arial", "size": 8.3 }, "face": "Arial",
"крупный": { "face": "Arial", "size": 11.3, "bold": true } "size": 10
},
"мелкий": {
"face": "Arial",
"size": 8.3
},
"крупный": {
"face": "Arial",
"size": 11.3,
"bold": true
}
}, },
"styles": { "styles": {
"мелкий": { "font": "мелкий" }, "мелкий": {
"крупный": { "font": "крупный" } "font": "мелкий"
},
"крупный": {
"font": "крупный"
},
"обычный": {
"font": "default",
"horizontalAlignment": "Center"
}
}, },
"areas": [ "areas": [
{ {
"name": "Шапка", "name": "Шапка",
"rows": [ "rows": [
{ "cells": [{ "col": 1, "style": "крупный", "text": "Заголовок" }, { "col": 2, "style": "мелкий", "text": "сноска" }] } {
"cells": [
{
"col": 1,
"style": "крупный",
"text": "Заголовок"
},
{
"col": 2,
"style": "мелкий",
"text": "сноска"
},
{
"col": 3,
"style": "обычный",
"text": "обычный"
}
]
}
] ]
} }
] ]
@@ -25,10 +61,16 @@
}, },
"validatePath": "Template.xml", "validatePath": "Template.xml",
"expect": { "expect": {
"files": ["Template.xml"], "files": [
"Template.xml"
],
"fileContains": { "fileContains": {
"file": "Template.xml", "file": "Template.xml",
"text": ["height=\"8.3\"", "height=\"11.3\"", "height=\"10\""] "text": [
"height=\"8.3\"",
"height=\"11.3\"",
"height=\"10\""
]
} }
} }
} }
@@ -10,7 +10,7 @@
</languageInfo> </languageInfo>
</languageSettings> </languageSettings>
<columns> <columns>
<size>2</size> <size>3</size>
</columns> </columns>
<rowsItem> <rowsItem>
<index>0</index> <index>0</index>
@@ -37,10 +37,21 @@
</tl> </tl>
</c> </c>
</c> </c>
<c>
<c>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>обычный</v8:content>
</v8:item>
</tl>
</c>
</c>
</row> </row>
</rowsItem> </rowsItem>
<templateMode>true</templateMode> <templateMode>true</templateMode>
<defaultFormatIndex>3</defaultFormatIndex> <defaultFormatIndex>4</defaultFormatIndex>
<height>1</height> <height>1</height>
<vgRows>1</vgRows> <vgRows>1</vgRows>
<namedItem xsi:type="NamedItemCells"> <namedItem xsi:type="NamedItemCells">
@@ -62,6 +73,10 @@
<format> <format>
<font>1</font> <font>1</font>
</format> </format>
<format>
<font>0</font>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -42,7 +42,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -169,7 +169,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -64,7 +64,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -42,7 +42,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -42,7 +42,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -64,7 +64,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -280,7 +280,6 @@
</line> </line>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/> <font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<font faceName="Arial" height="10" bold="true" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/> <font faceName="Arial" height="10" bold="true" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<font faceName="Arial" height="10" bold="false" italic="true" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<font faceName="Times New Roman" height="14" bold="true" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/> <font faceName="Times New Roman" height="14" bold="true" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<font faceName="Arial" height="8" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/> <font faceName="Arial" height="8" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<font faceName="Arial" height="10" bold="false" italic="false" underline="true" strikeout="false" kind="Absolute" scale="100"/> <font faceName="Arial" height="10" bold="false" italic="false" underline="true" strikeout="false" kind="Absolute" scale="100"/>
@@ -288,7 +287,7 @@
<height>25</height> <height>25</height>
</format> </format>
<format> <format>
<font>3</font> <font>2</font>
<horizontalAlignment>Center</horizontalAlignment> <horizontalAlignment>Center</horizontalAlignment>
</format> </format>
<format> <format>
@@ -296,7 +295,7 @@
<bottomBorder>0</bottomBorder> <bottomBorder>0</bottomBorder>
</format> </format>
<format> <format>
<font>5</font> <font>4</font>
<fillType>Parameter</fillType> <fillType>Parameter</fillType>
</format> </format>
<format> <format>
@@ -340,7 +339,7 @@
<fillType>Parameter</fillType> <fillType>Parameter</fillType>
</format> </format>
<format> <format>
<font>4</font> <font>3</font>
<horizontalAlignment>Center</horizontalAlignment> <horizontalAlignment>Center</horizontalAlignment>
</format> </format>
<format> <format>
@@ -61,7 +61,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -53,7 +53,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -1 +1 @@
{ "columns": 2, "defaultWidth": 10, "fonts": { "default": { "face": "Arial", "size": 10 } }, "styles": {}, "areas": [{ "name": "Test", "rows": [["A", "B"]] }] } { "columns": 2, "defaultWidth": 10, "fonts": {}, "styles": {}, "areas": [{ "name": "Test", "rows": [["A", "B"]] }] }
@@ -61,7 +61,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -64,7 +64,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -64,7 +64,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>
@@ -64,7 +64,6 @@
<endColumn>-1</endColumn> <endColumn>-1</endColumn>
</area> </area>
</namedItem> </namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format> <format>
<width>10</width> <width>10</width>
</format> </format>