feat(mxl-compile): стиль умеет все свойства формата, а не семь

Стиль описывал 7 свойств из 47, которые платформа хранит в <format>. Не было
самого частого тега корпуса — backColor (1.7 млн вхождений), а также textColor,
textPlacement, protection, hidden, indent, borderColor, textOrientation и хвоста.

Теперь ключ стиля — имя тега платформы, без исключений: помнить, какие ключи
названы по-своему, больше не нужно. Прежние align/valign/wrap продолжают
работать молча, как синонимы; там же CSS-имена (background, color,
border-bottom) и русские имена свойств. Таблицы типов значений и допустимых
значений перечислений сняты с корпуса, а не выписаны на глаз.

Рамка: пять плоских ключей (border и четыре стороны) со значением
{ style, width } либо строкой стиля; линия регистрируется в палитре <line>,
которая раньше знала только «тонкую» и «толстую» Solid. Четыре одинаковые
стороны сворачиваются в один <border> — правило проверено на корпусе:
70 265 свёрнутых форматов против 36 783 записанных по сторонам, и среди
вторых нет ни одного с четырьмя совпадающими значениями.

Цвет — нотация самой платформы: #RRGGBB, style:Имя, web:Имя, win:Имя. Первые
две пишутся дословно (префикс style объявлен в корне документа), для web и win
платформа дописывает объявление xmlns прямо на узел — делаем так же.

containsValue / valueType / controlType намеренно не заведены: это свойства
конкретной ячейки, а стиль — сущность общая, один на многие ячейки.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-11 15:34:54 +03:00
co-authored by Claude Opus 5
parent c559696c5a
commit d3c16f56c5
14 changed files with 663 additions and 295 deletions
@@ -151,9 +151,6 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
</document>
@@ -101,17 +101,11 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
</document>
@@ -123,25 +123,16 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
<format>
@@ -153,18 +144,12 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Right</horizontalAlignment>
<fillType>Parameter</fillType>
<format>
@@ -159,42 +159,27 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>1</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
</document>
@@ -194,25 +194,16 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Right</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
@@ -174,34 +174,22 @@
</format>
<format>
<font>1</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
</document>
@@ -140,17 +140,11 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
</document>
@@ -548,42 +548,27 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Right</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
@@ -117,10 +117,7 @@
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
</format>
</document>
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://v8.1c.ru/8.2/data/spreadsheet" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<languageSettings>
<currentLanguage>ru</currentLanguage>
<defaultLanguage>ru</defaultLanguage>
<languageInfo>
<id>ru</id>
<code>Русский</code>
<description>Русский</description>
</languageInfo>
</languageSettings>
<columns>
<size>4</size>
</columns>
<rowsItem>
<index>0</index>
<row>
<c>
<c>
<f>2</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Отчёт о движении</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>1</index>
<row>
<c>
<c>
<f>3</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Слева пунктир</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>4</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Цвет из палитры</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>5</f>
<parameter>Скрытое</parameter>
</c>
</c>
<c>
<c>
<f>6</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Рамка свёрнута</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<templateMode>true</templateMode>
<defaultFormatIndex>1</defaultFormatIndex>
<height>2</height>
<vgRows>2</vgRows>
<merge>
<r>0</r>
<c>0</c>
<w>3</w>
</merge>
<namedItem xsi:type="NamedItemCells">
<name>Тело</name>
<area>
<type>Rows</type>
<beginRow>1</beginRow>
<endRow>1</endRow>
<beginColumn>-1</beginColumn>
<endColumn>-1</endColumn>
</area>
</namedItem>
<namedItem xsi:type="NamedItemCells">
<name>Шапка</name>
<area>
<type>Rows</type>
<beginRow>0</beginRow>
<endRow>0</endRow>
<beginColumn>-1</beginColumn>
<endColumn>-1</endColumn>
</area>
</namedItem>
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Dotted</v8ui:style>
</line>
<line width="2" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Solid</v8ui:style>
</line>
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">ThinDashed</v8ui:style>
</line>
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Solid</v8ui:style>
</line>
<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"/>
<format>
<width>20</width>
</format>
<format>
<font>1</font>
<horizontalAlignment>Center</horizontalAlignment>
<verticalAlignment>Center</verticalAlignment>
<textColor>style:FormTextColor</textColor>
<backColor>#EBEBEB</backColor>
<textPlacement>Wrap</textPlacement>
<protection>true</protection>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>1</topBorder>
<bottomBorder>2</bottomBorder>
<borderColor>#C8C8C8</borderColor>
</format>
<format>
<font>0</font>
<textColor xmlns:d3p1="http://v8.1c.ru/8.1/data/ui/colors/windows">d3p1:ButtonText</textColor>
<backColor xmlns:d3p1="http://v8.1c.ru/8.1/data/ui/colors/web">d3p1:Gainsboro</backColor>
</format>
<format>
<font>0</font>
<fillType>Parameter</fillType>
<hidden>true</hidden>
<textOrientation>900</textOrientation>
<indent>2</indent>
</format>
<format>
<font>0</font>
<border>3</border>
</format>
</document>
@@ -302,42 +302,27 @@
</format>
<format>
<font>1</font>
<leftBorder>1</leftBorder>
<topBorder>1</topBorder>
<rightBorder>1</rightBorder>
<bottomBorder>1</bottomBorder>
<border>1</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Center</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<textPlacement>Wrap</textPlacement>
<fillType>Parameter</fillType>
</format>
<format>
<font>0</font>
<leftBorder>0</leftBorder>
<topBorder>0</topBorder>
<rightBorder>0</rightBorder>
<bottomBorder>0</bottomBorder>
<border>0</border>
<horizontalAlignment>Right</horizontalAlignment>
<fillType>Parameter</fillType>
</format>
@@ -0,0 +1,67 @@
{
"name": "Стиль: свойства формата платформенными именами, цвета, посторонние рамки",
"input": {
"columns": 4,
"defaultWidth": 20,
"fonts": {
"default": { "face": "Arial", "size": 10 },
"bold": { "face": "Arial", "size": 10, "bold": true }
},
"styles": {
"шапка": {
"font": "bold",
"backColor": "#EBEBEB",
"textColor": "style:FormTextColor",
"horizontalAlignment": "Center",
"verticalAlignment": "Center",
"textPlacement": "Wrap",
"protection": true
},
"рамка-по-сторонам": {
"leftBorder": "Dotted",
"topBorder": { "style": "Solid", "width": 2 },
"bottomBorder": { "style": "ThinDashed" },
"borderColor": "#C8C8C8"
},
"web-цвет": {
"backColor": "web:Gainsboro",
"textColor": "win:ButtonText"
},
"скрытая": {
"hidden": true,
"indent": 2,
"textOrientation": 900
},
"рамка-вокруг": {
"leftBorder": "Solid",
"topBorder": "Solid",
"rightBorder": "Solid",
"bottomBorder": "Solid"
}
},
"areas": [
{
"name": "Шапка",
"rows": [
{ "cells": [
{ "col": 1, "span": 4, "style": "шапка", "text": "Отчёт о движении" }
]}
]
},
{
"name": "Тело",
"rows": [
{ "cells": [
{ "col": 1, "style": "рамка-по-сторонам", "text": "Слева пунктир" },
{ "col": 2, "style": "web-цвет", "text": "Цвет из палитры" },
{ "col": 3, "style": "скрытая", "param": "Скрытое" },
{ "col": 4, "style": "рамка-вокруг", "text": "Рамка свёрнута" }
]}
]
}
]
},
"params": { "outputPath": "Template.xml" },
"validatePath": "Template.xml",
"expect": { "files": ["Template.xml"] }
}