markdown-канон теряет hardBreak: trailing/consecutive/table-cell (pm→md→pm) #549

Open
opened 2026-07-12 05:59:09 +03:00 by agent_reviewer · 0 comments
Collaborator

Проблема

Найдено при ревью #544 (регресс-гард hardBreak, #503). #503-путь (updatePageJson: PM JSON → Yjs) hardBreak СОХРАНЯЕТ. Но через markdown-канон (updatePageMarkdown / getNode→patchNode markdown / экспорт) hardBreak теряется в 3 подслучаях round-trip pm→md→pm:

  1. Trailing в конце документа — top-level processNode(content).trim() (packages/prosemirror-markdown/src/lib/markdown-converter.ts:1786) срезает завершающий \n → hardBreak в конце абзаца/дока пропадает. (Проверил: .trim() на месте.)
  2. Consecutivea \n \nb при реимпорте (marked GFM) парсится как ДВА абзаца, а не один с двумя hardBreak.
  3. Table cell — GFM-ячейка флэттит <br> в пробелы.

Почему это важно

Тихая потеря данных (без ошибки) на markdown-путях агента — тот же класс, что исходный #503, только не JSON-путь. Зелёный тест #544 покрывает только mid-paragraph markdown + JSON-путь, поэтому не читается как «hardBreak безопасен везде».

Где

packages/prosemirror-markdown/src/lib/markdown-converter.ts (serializer :1786 trim; hardBreak :834), md→pm импорт (marked→<br>). Затрагивает updatePageMarkdown / export.

Всплыло при ревью PR #544.

## Проблема Найдено при ревью #544 (регресс-гард hardBreak, #503). #503-путь (updatePageJson: PM JSON → Yjs) hardBreak СОХРАНЯЕТ. Но через **markdown**-канон (`updatePageMarkdown` / getNode→patchNode markdown / экспорт) `hardBreak` теряется в 3 подслучаях round-trip pm→md→pm: 1. **Trailing в конце документа** — top-level `processNode(content).trim()` (`packages/prosemirror-markdown/src/lib/markdown-converter.ts:1786`) срезает завершающий ` \n` → hardBreak в конце абзаца/дока пропадает. (Проверил: `.trim()` на месте.) 2. **Consecutive** — `a \n \nb` при реимпорте (marked GFM) парсится как ДВА абзаца, а не один с двумя hardBreak. 3. **Table cell** — GFM-ячейка флэттит `<br>` в пробелы. ## Почему это важно Тихая потеря данных (без ошибки) на markdown-путях агента — тот же класс, что исходный #503, только не JSON-путь. Зелёный тест #544 покрывает только mid-paragraph markdown + JSON-путь, поэтому не читается как «hardBreak безопасен везде». ## Где `packages/prosemirror-markdown/src/lib/markdown-converter.ts` (serializer `:1786` trim; hardBreak `:834`), md→pm импорт (marked→`<br>`). Затрагивает updatePageMarkdown / export. _Всплыло при ревью PR #544._
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#549