From 8cae947f4bec9a2bc30c386850e38afe9ca2693e Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 10 Aug 2026 18:16:40 +0300 Subject: [PATCH] =?UTF-8?q?docs(mxl):=20=D1=83=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=B7=20=D1=81=D0=BF=D0=B5=D0=BA=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D1=8B=20=D0=B8?= =?UTF-8?q?=D1=81=D1=81=D0=BB=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F,=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Продолжение чистки после перечитывания глазами модели, которая применяет навык. - из раздела ограничений убраны доли по корпусу ERP. Это результат исследования, а не то, что помогает применять навык: модель работает с конкретным макетом, а не с популяцией, и числа стареют. Перечень того, что теряется при round-trip, остался списком; замеры живут в материалах кампании; - фраза про ошибки короткой формы была вырвана из контекста: шла после списка ограничений, начиналась с символа в кавычках, и до самого конца было непонятно, что речь про отказ. Плюс в один ряд попало разнородное — три случая про сам шорткат и переполнение columns, которое к короткой форме не привязано. Переписано правилами: маркеру нужно, что продолжать; объектный элемент не несёт col; элементов не больше columns. Поведение при нарушении — одной фразой в конце; - в SKILL.md ключевые правила шли вперемешку по уровням (страница, ячейка, строка, ячейка, область). Пересобраны сверху вниз: документ → область → строка → ячейка; - буллет про namedAreas сокращён: обнаружимость ключа даёт карта структуры, а из правил там неочевидно только отсутствие ключа type. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/mxl-compile/SKILL.md | 10 +++--- .../skills/mxl-compile/reference/dsl-spec.md | 32 ++++++++----------- docs/mxl-dsl-spec.md | 32 ++++++++----------- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/.claude/skills/mxl-compile/SKILL.md b/.claude/skills/mxl-compile/SKILL.md index a4d62c4a..2c9c32fb 100644 --- a/.claude/skills/mxl-compile/SKILL.md +++ b/.claude/skills/mxl-compile/SKILL.md @@ -60,14 +60,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J Ключевые правила: - `page` — формат страницы (`"A4-landscape"`, `"A4-portrait"` или число). Автоматически вычисляет `defaultWidth` из суммы пропорций `"Nx"` -- `col` — 1-based позиция колонки +- `name` у области в `areas` необязателен: область без имени — просто кусок сетки, именованной она не станет +- `namedAreas` — области, которые не описываются диапазоном подряд идущих строк: полоса колонок, прямоугольник, ячейка. Тип не указывается, он следует из того, какие оси заданы - `rowStyle` — автозаполнение пустот стилем (рамки по всей ширине) -- Тип заполнения определяется автоматически: `param` → Parameter, `text` → Text, `template` → Template -- `rowspan` — объединение строк вниз (rowStyle учитывает занятые ячейки) - `empty` в строке — шорткат для N подряд пустых строк (`{ "empty": 3 }` = три `{}`) -- `name` у области в `areas` необязателен: область без имени — просто кусок сетки, в макет как именованная она не попадёт -- `namedAreas` — области, которые не описываются диапазоном подряд идущих строк (полоса колонок, прямоугольник, ячейка). Тип не указывается: только `rows` → полоса строк, только `cols` → полоса колонок, обе оси → прямоугольник - Строку можно писать массивом ячеек — позиция из порядка, `col` не нужен: `"текст"`, `"{Имя}"` — параметр, `">"` — продолжить ячейку слева, `"|"` — сверху, `null` — пропуск колонки +- `col` — 1-based позиция колонки +- `rowspan` — объединение строк вниз (rowStyle учитывает занятые ячейки) +- Тип заполнения определяется автоматически: `param` → Parameter, `text` → Text, `template` → Template Двухуровневая шапка массивами: ```json diff --git a/.claude/skills/mxl-compile/reference/dsl-spec.md b/.claude/skills/mxl-compile/reference/dsl-spec.md index c5e18f77..64c6ccea 100644 --- a/.claude/skills/mxl-compile/reference/dsl-spec.md +++ b/.claude/skills/mxl-compile/reference/dsl-spec.md @@ -178,7 +178,7 @@ - не выразить текст, совпадающий с `">"`, `"|"` или с шаблоном `"{...}"`; - `"|"` продолжает ячейку из предыдущей строки, только если её позиция известна явно (`col` задан или строка записана массивом). -`">"` без ячейки слева, `"|"` без ячейки сверху, объектный элемент с `col`, элементов больше `columns` → ненулевой код выхода и сообщение в stderr. +Маркеру нужно, что продолжать: `">"` требует ячейку слева в той же строке, `"|"` — ячейку сверху. Объектный элемент не должен нести `col`: позиция уже задана порядком. Число элементов не может превышать `columns`. Нарушение любого из этих правил → ненулевой код выхода и сообщение в stderr. ## Ячейки (`cells[]`) @@ -211,22 +211,18 @@ DSL описывает не все конструкции табличного документа. Перечисленное ниже **теряется при round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попадает, в сгенерированный -XML не возвращается. Доля — по корпусу типовой ERP 8.3.24 (10 924 макета), где измерялась. +XML не возвращается. -| Конструкция | Доля макетов | -|-------------|--------------| -| Ячейки-поля ввода (`containsValue` / `valueType` / `controlType`) | 53% | -| Несколько наборов колонок (`columnsID`) — свои ширины у группы строк | 63% | -| Объединения, не привязанные к ячейке (по всей высоте или ширине) | 16% | -| Рисунки и картинки (в т.ч. штрихкоды) | 2% | -| Цвет текста, цвет фона ячейки, скрытые строки/колонки, отступ | — | -| Рамка с разным стилем у разных сторон; стили линий кроме сплошной | — | -| Группировки строк и колонок | — | -| Колонтитулы, параметры печати, область печати | — | +- ячейки-поля ввода (`containsValue` / `valueType` / `controlType`); +- несколько наборов колонок (`columnsID`) — свои ширины у группы строк; +- объединения, не привязанные к ячейке (по всей высоте или ширине документа); +- рисунки и картинки, в том числе штрихкоды; +- цвет текста, цвет фона ячейки, скрытые строки и колонки, отступ; +- рамка с разным стилем у разных сторон; стили линий кроме сплошной; +- группировки строк и колонок; +- колонтитулы, параметры печати, область печати; +- многоязычные надписи: при разборе берётся первый вариант текста, при генерации язык + всегда `ru`, остальные теряются. -**Многоязычные надписи не поддерживаются:** при разборе берётся первый вариант текста, -при генерации язык всегда `ru`. Для двуязычных макетов (в ERP это почти весь корпус) -надписи на остальных языках теряются. - -Отдельно: пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, -поэтому diff после round-trip обычно шире фактической доработки. +Пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, поэтому +diff после round-trip обычно шире фактической доработки. diff --git a/docs/mxl-dsl-spec.md b/docs/mxl-dsl-spec.md index 6f87f9c9..f4f63dbf 100644 --- a/docs/mxl-dsl-spec.md +++ b/docs/mxl-dsl-spec.md @@ -178,7 +178,7 @@ - не выразить текст, совпадающий с `">"`, `"|"` или с шаблоном `"{...}"`; - `"|"` продолжает ячейку из предыдущей строки, только если её позиция известна явно (`col` задан или строка записана массивом). -`">"` без ячейки слева, `"|"` без ячейки сверху, объектный элемент с `col`, элементов больше `columns` → ненулевой код выхода и сообщение в stderr. +Маркеру нужно, что продолжать: `">"` требует ячейку слева в той же строке, `"|"` — ячейку сверху. Объектный элемент не должен нести `col`: позиция уже задана порядком. Число элементов не может превышать `columns`. Нарушение любого из этих правил → ненулевой код выхода и сообщение в stderr. ## Ячейки (`cells[]`) @@ -211,22 +211,18 @@ DSL описывает не все конструкции табличного документа. Перечисленное ниже **теряется при round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попадает, в сгенерированный -XML не возвращается. Доля — по корпусу типовой ERP 8.3.24 (10 924 макета), где измерялась. +XML не возвращается. -| Конструкция | Доля макетов | -|-------------|--------------| -| Ячейки-поля ввода (`containsValue` / `valueType` / `controlType`) | 53% | -| Несколько наборов колонок (`columnsID`) — свои ширины у группы строк | 63% | -| Объединения, не привязанные к ячейке (по всей высоте или ширине) | 16% | -| Рисунки и картинки (в т.ч. штрихкоды) | 2% | -| Цвет текста, цвет фона ячейки, скрытые строки/колонки, отступ | — | -| Рамка с разным стилем у разных сторон; стили линий кроме сплошной | — | -| Группировки строк и колонок | — | -| Колонтитулы, параметры печати, область печати | — | +- ячейки-поля ввода (`containsValue` / `valueType` / `controlType`); +- несколько наборов колонок (`columnsID`) — свои ширины у группы строк; +- объединения, не привязанные к ячейке (по всей высоте или ширине документа); +- рисунки и картинки, в том числе штрихкоды; +- цвет текста, цвет фона ячейки, скрытые строки и колонки, отступ; +- рамка с разным стилем у разных сторон; стили линий кроме сплошной; +- группировки строк и колонок; +- колонтитулы, параметры печати, область печати; +- многоязычные надписи: при разборе берётся первый вариант текста, при генерации язык + всегда `ru`, остальные теряются. -**Многоязычные надписи не поддерживаются:** при разборе берётся первый вариант текста, -при генерации язык всегда `ru`. Для двуязычных макетов (в ERP это почти весь корпус) -надписи на остальных языках теряются. - -Отдельно: пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, -поэтому diff после round-trip обычно шире фактической доработки. +Пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, поэтому +diff после round-trip обычно шире фактической доработки.