Skip to content

Спецификация таблиц: какие таблицы можно форматировать

Что вы сможете делать после изучения

  • Знать, какие таблицы может форматировать плагин
  • Понимать причину ошибки invalid structure
  • Писать таблицы Markdown, соответствующие спецификации

Ваша текущая проблема

ИИ сгенерировал таблицу, но плагин не отформатировал её и добавил в конце комментарий:

markdown
<!-- table not formatted: invalid structure -->

Что такое "недопустимая структура"? Почему моя таблица не подходит?

Когда использовать этот приём

  • Столкнулись с ошибкой invalid structure и хотите понять, в чём проблема
  • Хотите убедиться, что таблицы, генерируемые ИИ, будут правильно отформатированы
  • Хотите вручную написать таблицу Markdown, соответствующую спецификации

Ключевая идея

Плагин выполняет три уровня валидации перед форматированием:

Уровень 1: Это строка таблицы? → isTableRow()
Уровень 2: Есть ли разделительная строка? → isSeparatorRow()
Уровень 3: Структура валидна? → isValidTable()

Только если все три уровня пройдены, таблица будет отформатирована. Если любой уровень не пройден, таблица сохраняется в исходном виде с добавлением комментария об ошибке.

4 условия валидной таблицы

Условие 1: каждая строка должна начинаться и заканчиваться символом |

Это базовое требование. Каждая строка таблицы Markdown (Pipe Table) должна быть обёрнута символами |.

markdown
✅ Правильно
| Название | Описание |

❌ Неправильно
Название | Описание      ← Нет начального |
| Название | Описание     ← Нет конечного |
Реализация в исходном коде
typescript
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 символа |, разделяющих содержимое.

markdown
✅ Правильно (3 символа |, 2 разделителя)
| Название | Описание |

❌ Неправильно (только 2 символа |, 1 разделитель)
| Название |

Другими словами, таблица из одного столбца валидна, но должна быть записана в формате | Содержимое |.

Условие 3: должна быть разделительная строка

Разделительная строка — это строка между заголовком и строками данных, которая определяет способ выравнивания.

markdown
| Название | Описание |
| --- | --- |      ← Это разделительная строка
| Значение1 | Значение2 |

Правила синтаксиса разделительной строки:

Каждая ячейка должна соответствовать регулярному выражению /^\s*:?-+:?\s*$/, что означает:

КомпонентЗначениеПример
\s*Необязательные пробелыДопускается | --- | или |---|
:?Необязательное двоеточиеИспользуется для указания выравнивания
-+Минимум один дефис-, ---, ------ — всё допустимо

Примеры валидных разделительных строк:

markdown
| --- | --- |           ← Минимальная форма
| :--- | ---: |         ← С маркерами выравнивания
| :---: | :---: |       ← Выравнивание по центру
| --- | --- |           ← Без пробелов тоже допустимо
| -------- | -------- | ← Длинные дефисы тоже допустимы

Примеры невалидных разделительных строк:

markdown
| === | === |           ← Использованы знаки равенства, а не дефисы
| - - | - - |           ← Дефисы разделены пробелами
| ::: | ::: |           ← Только двоеточия, нет дефисов
Реализация в исходном коде
typescript
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 столбца.

markdown
✅ Правильно (в каждой строке 3 столбца)
| A | B | C |
| --- | --- | --- |
| 1 | 2 | 3 |

❌ Неправильно (в третьей строке только 2 столбца)
| A | B | C |
| --- | --- | --- |
| 1 | 2 |
Реализация в исходном коде
typescript
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

Справочник по синтаксису выравнивания

Разделительная строка используется не только для разделения, но и для указания способа выравнивания:

СинтаксисСпособ выравниванияЭффект
--- или :---По левому краюТекст слева (по умолчанию)
:---:По центруТекст по центру
---:По правому краюТекст справа

Пример:

markdown
| По левому краю | По центру | По правому краю |
| --- | --- | --- |
| Текст | Текст | Текст |

После форматирования:

markdown
| По левому краю |  По центру  | По правому краю |
| --- | --- | --- |
| Текст   |  Текст  |   Текст |
Реализация в исходном коде
typescript
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.ts58-61
Определение разделительной строкиindex.ts63-68
Валидация таблицыindex.ts70-88
Парсинг выравниванияindex.ts141-149
Обработка невалидных таблицindex.ts44-47

Ключевые регулярные выражения:

  • /^\s*:?-+:?\s*$/: правило соответствия ячейки разделительной строки

Ключевые функции:

  • isTableRow(): определение, является ли строка строкой таблицы
  • isSeparatorRow(): определение, является ли строка разделительной строкой
  • isValidTable(): проверка валидности структуры таблицы
  • getAlignment(): парсинг способа выравнивания