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
param(
[Parameter(Mandatory)]
@@ -1021,6 +1021,30 @@ foreach ($area in $def.areas) {
# Формат по умолчанию — последняя запись палитры (см. выше).
$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 ---
$xml = New-Object System.Text.StringBuilder 4096
@@ -1,5 +1,5 @@
#!/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
import argparse
import hashlib
@@ -1044,6 +1044,22 @@ def main():
# Формат по умолчанию — последняя запись палитры (см. выше).
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 ---
lines = []