Спецификация таблиц: какие таблицы можно форматировать
Что вы сможете делать после изучения
- Знать, какие таблицы может форматировать плагин
- Понимать причину ошибки
invalid structure - Писать таблицы Markdown, соответствующие спецификации
Ваша текущая проблема
ИИ сгенерировал таблицу, но плагин не отформатировал её и добавил в конце комментарий:
<!-- table not formatted: invalid structure -->Что такое "недопустимая структура"? Почему моя таблица не подходит?
Когда использовать этот приём
- Столкнулись с ошибкой
invalid structureи хотите понять, в чём проблема - Хотите убедиться, что таблицы, генерируемые ИИ, будут правильно отформатированы
- Хотите вручную написать таблицу Markdown, соответствующую спецификации
Ключевая идея
Плагин выполняет три уровня валидации перед форматированием:
Уровень 1: Это строка таблицы? → isTableRow()
Уровень 2: Есть ли разделительная строка? → isSeparatorRow()
Уровень 3: Структура валидна? → isValidTable()Только если все три уровня пройдены, таблица будет отформатирована. Если любой уровень не пройден, таблица сохраняется в исходном виде с добавлением комментария об ошибке.
4 условия валидной таблицы
Условие 1: каждая строка должна начинаться и заканчиваться символом |
Это базовое требование. Каждая строка таблицы Markdown (Pipe Table) должна быть обёрнута символами |.
✅ Правильно
| Название | Описание |
❌ Неправильно
Название | Описание ← Нет начального |
| Название | Описание ← Нет конечного |Реализация в исходном коде
function isTableRow(line: string): boolean {
const trimmed = line.trim()
return trimmed.startsWith("|") && trimmed.endsWith("|") && trimmed.split("|").length > 2
}Расположение в коде: index.ts:58-61
Условие 2: каждая строка должна содержать минимум 2 разделителя
split("|").length > 2 означает, что должно быть минимум 2 символа |, разделяющих содержимое.
✅ Правильно (3 символа |, 2 разделителя)
| Название | Описание |
❌ Неправильно (только 2 символа |, 1 разделитель)
| Название |Другими словами, таблица из одного столбца валидна, но должна быть записана в формате | Содержимое |.
Условие 3: должна быть разделительная строка
Разделительная строка — это строка между заголовком и строками данных, которая определяет способ выравнивания.
| Название | Описание |
| --- | --- | ← Это разделительная строка
| Значение1 | Значение2 |Правила синтаксиса разделительной строки:
Каждая ячейка должна соответствовать регулярному выражению /^\s*:?-+:?\s*$/, что означает:
| Компонент | Значение | Пример |
|---|---|---|
\s* | Необязательные пробелы | Допускается | --- | или |---| |
:? | Необязательное двоеточие | Используется для указания выравнивания |
-+ | Минимум один дефис | -, ---, ------ — всё допустимо |
Примеры валидных разделительных строк:
| --- | --- | ← Минимальная форма
| :--- | ---: | ← С маркерами выравнивания
| :---: | :---: | ← Выравнивание по центру
| --- | --- | ← Без пробелов тоже допустимо
| -------- | -------- | ← Длинные дефисы тоже допустимыПримеры невалидных разделительных строк:
| === | === | ← Использованы знаки равенства, а не дефисы
| - - | - - | ← Дефисы разделены пробелами
| ::: | ::: | ← Только двоеточия, нет дефисовРеализация в исходном коде
function isSeparatorRow(line: string): boolean {
const trimmed = line.trim()
if (!trimmed.startsWith("|") || !trimmed.endsWith("|")) return false
const cells = trimmed.split("|").slice(1, -1)
return cells.length > 0 && cells.every((cell) => /^\s*:?-+:?\s*$/.test(cell))
}Расположение в коде: index.ts:63-68
Условие 4: количество столбцов во всех строках должно совпадать
Если в первой строке 3 столбца, то в каждой последующей строке также должно быть 3 столбца.
✅ Правильно (в каждой строке 3 столбца)
| A | B | C |
| --- | --- | --- |
| 1 | 2 | 3 |
❌ Неправильно (в третьей строке только 2 столбца)
| A | B | C |
| --- | --- | --- |
| 1 | 2 |Реализация в исходном коде
function isValidTable(lines: string[]): boolean {
if (lines.length < 2) return false
const rows = lines.map((line) =>
line.split("|").slice(1, -1).map((cell) => cell.trim()),
)
if (rows.length === 0 || rows[0].length === 0) return false
const firstRowCellCount = rows[0].length
const allSameColumnCount = rows.every((row) => row.length === firstRowCellCount)
if (!allSameColumnCount) return false
const hasSeparator = lines.some((line) => isSeparatorRow(line))
return hasSeparator
}Расположение в коде: index.ts:70-88
Справочник по синтаксису выравнивания
Разделительная строка используется не только для разделения, но и для указания способа выравнивания:
| Синтаксис | Способ выравнивания | Эффект |
|---|---|---|
--- или :--- | По левому краю | Текст слева (по умолчанию) |
:---: | По центру | Текст по центру |
---: | По правому краю | Текст справа |
Пример:
| По левому краю | По центру | По правому краю |
| --- | --- | --- |
| Текст | Текст | Текст |После форматирования:
| По левому краю | По центру | По правому краю |
| --- | --- | --- |
| Текст | Текст | Текст |Реализация в исходном коде
function getAlignment(delimiterCell: string): "left" | "center" | "right" {
const trimmed = delimiterCell.trim()
const hasLeftColon = trimmed.startsWith(":")
const hasRightColon = trimmed.endsWith(":")
if (hasLeftColon && hasRightColon) return "center"
if (hasRightColon) return "right"
return "left"
}Расположение в коде: index.ts:141-149
Диагностика распространённых ошибок
| Симптом ошибки | Возможная причина | Решение |
|---|---|---|
invalid structure | Отсутствует разделительная строка | Добавьте | --- | --- | после заголовка |
invalid structure | Несогласованное количество столбцов | Проверьте, одинаковое ли количество | в каждой строке |
invalid structure | Отсутствует | в начале/конце строки | Добавьте недостающие | |
| Таблица не обнаружена | Только 1 столбец | Убедитесь, что есть минимум 2 разделителя | |
| Выравнивание не работает | Ошибка в синтаксисе разделительной строки | Проверьте, используются ли -, а не другие символы |
Контрольные вопросы
После завершения этого урока вы должны уметь ответить:
- [ ] Каким условиям должна соответствовать строка таблицы? (Ответ: начинаться и заканчиваться
|, минимум 2 разделителя) - [ ] Что означает регулярное выражение для разделительной строки? (Ответ: необязательное двоеточие + минимум один дефис + необязательное двоеточие)
- [ ] Почему возникает ошибка
invalid structure? (Ответ: отсутствует разделительная строка, несогласованное количество столбцов или отсутствует|в начале/конце строки) - [ ] Что означает
:---:? (Ответ: выравнивание по центру)
Резюме урока
| Условие | Требование |
|---|---|
| Начало и конец строки | Должны начинаться и заканчиваться | |
| Количество разделителей | Минимум 2 символа | |
| Разделительная строка | Обязательна, формат :?-+:? |
| Согласованность столбцов | Количество столбцов должно быть одинаковым во всех строках |
Мнемоническое правило:
Символы | с обеих сторон, разделительная строка с дефисами, Столбцов одинаковое число, четыре правила помни всегда.
Анонс следующего урока
В следующем уроке мы изучим Подробно о выравнивании.
Вы узнаете:
- Детальное использование трёх способов выравнивания
- Принципы реализации форматирования разделительных строк
- Алгоритм заполнения ячеек
Приложение: справочник по исходному коду
Нажмите, чтобы развернуть информацию о расположении кода
Время обновления: 2026-01-26
| Функциональность | Путь к файлу | Строки |
|---|---|---|
| Определение строки таблицы | index.ts | 58-61 |
| Определение разделительной строки | index.ts | 63-68 |
| Валидация таблицы | index.ts | 70-88 |
| Парсинг выравнивания | index.ts | 141-149 |
| Обработка невалидных таблиц | index.ts | 44-47 |
Ключевые регулярные выражения:
/^\s*:?-+:?\s*$/: правило соответствия ячейки разделительной строки
Ключевые функции:
isTableRow(): определение, является ли строка строкой таблицыisSeparatorRow(): определение, является ли строка разделительной строкойisValidTable(): проверка валидности структуры таблицыgetAlignment(): парсинг способа выравнивания