diff --git a/.claude/skills/mxl-compile/SKILL.md b/.claude/skills/mxl-compile/SKILL.md index fea42820..c3654b9f 100644 --- a/.claude/skills/mxl-compile/SKILL.md +++ b/.claude/skills/mxl-compile/SKILL.md @@ -51,10 +51,11 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J { columns, page, defaultWidth, columnWidths, fonts: { name: { face, size, bold, italic, underline, strikeout } }, styles: { name: { font, align, valign, border, borderWidth, wrap, format } }, - areas: [{ name, rows: [{ height, rowStyle, cells: [ + areas: [{ name, columnSet, rows: [{ height, rowStyle, cells: [ { col, span, rowspan, style, param, detail, text, template } ]}]}], - namedAreas: [{ name, rows, cols }] + namedAreas: [{ name, rows, cols }], + columnSets: { name: { columns, columnWidths } } } ``` @@ -62,6 +63,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J - `page` — формат страницы (`"A4-landscape"`, `"A4-portrait"` или число). Автоматически вычисляет `defaultWidth` из суммы пропорций `"Nx"` - `name` у области в `areas` необязателен: область без имени — просто кусок сетки, именованной она не станет - `namedAreas` — области, которые не описываются диапазоном подряд идущих строк: полоса колонок, прямоугольник, ячейка. Тип не указывается, он следует из того, какие оси заданы +- `columnSet` у области — ссылка на раскладку из `columnSets`, когда группе строк нужны свои ширины колонок; без него действует документная раскладка - `rowStyle` — автозаполнение пустот стилем (рамки по всей ширине) - `empty` в строке — шорткат для N подряд пустых строк (`{ "empty": 3 }` = три `{}`) - Строку можно писать массивом ячеек — позиция из порядка, `col` не нужен: `"текст"`, `"{Имя}"` — параметр, `">"` — продолжить ячейку слева, `"|"` — сверху, `null` — пропуск колонки diff --git a/.claude/skills/mxl-compile/reference/dsl-spec.md b/.claude/skills/mxl-compile/reference/dsl-spec.md index 9b5326ef..595f1c5c 100644 --- a/.claude/skills/mxl-compile/reference/dsl-spec.md +++ b/.claude/skills/mxl-compile/reference/dsl-spec.md @@ -73,7 +73,7 @@ | Поле | Обяз. | По умолч. | Описание | |------|:-----:|-----------|----------| -| `columns` | да | — | Количество колонок | +| `columns` | да | — | Количество колонок в раскладке по умолчанию. `0` допустимо: значит, все строки живут в раскладках из `columnSets` | | `page` | нет | — | Формат страницы: `"A4-landscape"` (780), `"A4-portrait"` (540) или число. Автоматически вычисляет `defaultWidth` из суммы пропорций `"Nx"` | | `defaultWidth` | нет | 10 | Ширина колонок по умолчанию. Игнорируется если задан `page` и все колонки используют `"Nx"` | | `columnWidths` | нет | `{}` | Ширины колонок. Ключи 1-based: `"1"`, `"3-14"`, `"5,7,9"`. Значения: число (абсолют) или `"Nx"` (множитель от defaultWidth, напр. `"2x"`, `"0.5x"`) | @@ -81,6 +81,7 @@ | `styles` | нет | `{}` | Именованные стили | | `areas` | да | — | Массив областей — диапазонов подряд идущих строк (порядок = порядок в документе); имя необязательно | | `namedAreas` | нет | — | Именованные области, заданные координатами (см. ниже) | +| `columnSets` | нет | — | Дополнительные колоночные раскладки: своя ширина колонок у группы строк (см. ниже) | ## Шрифты (`fonts.`) @@ -140,6 +141,30 @@ Диапазон — та же грамматика, что у `columnWidths`, но **только** число или `"N-M"`: список через запятую запрещён, область непрерывна. Имя обязательно, и хотя бы одна ось должна быть задана; нарушение любого из этих правил → ненулевой код выхода и сообщение в stderr. +## Колоночные раскладки (`columnSets`) + +Группа строк может иметь собственные ширины колонок — в 1С это «индивидуальная ширина колонок». Документные `columns` и `columnWidths` описывают раскладку по умолчанию; дополнительные объявляются в `columnSets`, а область ссылается на нужную ключом `columnSet` — так же, как ячейка ссылается на `styles` через `style`. + +```json +{ + "columns": 52, + "columnWidths": { "1": 8 }, + "columnSets": { + "таблица": { "columns": 52, "columnWidths": { "1": 7, "2-52": 24 } } + }, + "areas": [ + { "name": "Шапка", "rows": [ ... ] }, + { "name": "ТабличнаяЧасть", "columnSet": "таблица", "rows": [ ... ] } + ] +} +``` + +Раскладка описывается той же парой полей, что и документная: `columns` — количество колонок (у раскладок оно обычно разное), `columnWidths` — ширины. Ключ словаря — имя раскладки; в макетах, полученных через `/mxl-decompile`, это идентификатор из исходного файла, при описании с нуля — любая строка. + +Все строки области получают раскладку области, поэтому одна область не может смешивать раскладки. Позиции колонок (`col`, `span`) проверяются по ширине раскладки СВОЕЙ области, а не документной. + +Ссылка на необъявленную раскладку → ненулевой код выхода и сообщение в stderr. + ## Строки (`rows[]`) | Поле | По умолч. | Описание | @@ -213,7 +238,6 @@ round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попа XML не возвращается. - ячейки-поля ввода (`containsValue` / `valueType` / `controlType`); -- несколько наборов колонок (`columnsID`) — свои ширины у группы строк; - объединения, не привязанные к ячейке (по всей высоте или ширине документа); - рисунки и картинки, в том числе штрихкоды; - цвет текста, цвет фона ячейки, скрытые строки и колонки, отступ; diff --git a/docs/mxl-dsl-spec.md b/docs/mxl-dsl-spec.md index fc768f7d..9498231c 100644 --- a/docs/mxl-dsl-spec.md +++ b/docs/mxl-dsl-spec.md @@ -73,7 +73,7 @@ | Поле | Обяз. | По умолч. | Описание | |------|:-----:|-----------|----------| -| `columns` | да | — | Количество колонок | +| `columns` | да | — | Количество колонок в раскладке по умолчанию. `0` допустимо: значит, все строки живут в раскладках из `columnSets` | | `page` | нет | — | Формат страницы: `"A4-landscape"` (780), `"A4-portrait"` (540) или число. Автоматически вычисляет `defaultWidth` из суммы пропорций `"Nx"` | | `defaultWidth` | нет | 10 | Ширина колонок по умолчанию. Игнорируется если задан `page` и все колонки используют `"Nx"` | | `columnWidths` | нет | `{}` | Ширины колонок. Ключи 1-based: `"1"`, `"3-14"`, `"5,7,9"`. Значения: число (абсолют) или `"Nx"` (множитель от defaultWidth, напр. `"2x"`, `"0.5x"`) | @@ -81,6 +81,7 @@ | `styles` | нет | `{}` | Именованные стили | | `areas` | да | — | Массив областей — диапазонов подряд идущих строк (порядок = порядок в документе); имя необязательно | | `namedAreas` | нет | — | Именованные области, заданные координатами (см. ниже) | +| `columnSets` | нет | — | Дополнительные колоночные раскладки: своя ширина колонок у группы строк (см. ниже) | ## Шрифты (`fonts.`) @@ -140,6 +141,30 @@ Диапазон — та же грамматика, что у `columnWidths`, но **только** число или `"N-M"`: список через запятую запрещён, область непрерывна. Имя обязательно, и хотя бы одна ось должна быть задана; нарушение любого из этих правил → ненулевой код выхода и сообщение в stderr. +## Колоночные раскладки (`columnSets`) + +Группа строк может иметь собственные ширины колонок — в 1С это «индивидуальная ширина колонок». Документные `columns` и `columnWidths` описывают раскладку по умолчанию; дополнительные объявляются в `columnSets`, а область ссылается на нужную ключом `columnSet` — так же, как ячейка ссылается на `styles` через `style`. + +```json +{ + "columns": 52, + "columnWidths": { "1": 8 }, + "columnSets": { + "таблица": { "columns": 52, "columnWidths": { "1": 7, "2-52": 24 } } + }, + "areas": [ + { "name": "Шапка", "rows": [ ... ] }, + { "name": "ТабличнаяЧасть", "columnSet": "таблица", "rows": [ ... ] } + ] +} +``` + +Раскладка описывается той же парой полей, что и документная: `columns` — количество колонок (у раскладок оно обычно разное), `columnWidths` — ширины. Ключ словаря — имя раскладки; в макетах, полученных через `/mxl-decompile`, это идентификатор из исходного файла, при описании с нуля — любая строка. + +Все строки области получают раскладку области, поэтому одна область не может смешивать раскладки. Позиции колонок (`col`, `span`) проверяются по ширине раскладки СВОЕЙ области, а не документной. + +Ссылка на необъявленную раскладку → ненулевой код выхода и сообщение в stderr. + ## Строки (`rows[]`) | Поле | По умолч. | Описание | @@ -213,7 +238,6 @@ round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попа XML не возвращается. - ячейки-поля ввода (`containsValue` / `valueType` / `controlType`); -- несколько наборов колонок (`columnsID`) — свои ширины у группы строк; - объединения, не привязанные к ячейке (по всей высоте или ширине документа); - рисунки и картинки, в том числе штрихкоды; - цвет текста, цвет фона ячейки, скрытые строки и колонки, отступ;