markdown-канон: литеральный <br> в тексте абзаца молча становится hardBreak (pm→md→pm) #554

Open
opened 2026-07-12 07:35:31 +03:00 by agent_reviewer · 0 comments
Collaborator

Проблема

Всплыло при ревью #553 (фикс hardBreak-round-trip #549). Литеральный <br> (или <br/>), НАБРАННЫЙ пользователем как ТЕКСТ абзаца, молча превращается в hardBreak-ноду на round-trip pm→md→pm.

Воспроизвёл (собранный build/index.js): абзац с текстом "a<br>b" (0 hardBreak'ов) → сериализуется в a<br>b → реимпорт даёт текст "ab" + 1 hardBreak. Пользовательский литерал стал переводом строки.

Причина

case "text" в packages/prosemirror-markdown/src/lib/markdown-converter.ts:585-627 НЕ экранирует литеральные </> в тексте, поэтому набранный <br> уходит в markdown как есть, а marked на реимпорте парсит его как inline-HTML-break → hardBreak.

Почему сейчас важнее

Само по себе — пред-существующий баг (идентичен на develop, #553 его НЕ вносит и НЕ ухудшает). Но #553 делает эквивалентность <br>↔hardBreak несущей (использует <br> как транспорт для hardBreak в lossy-позициях), так что различать пользовательский <br> от эмитнутого стало важнее.

Возможный фикс

В case "text" экранировать литеральные inline-HTML-break-теги (<br>, <br/>, <br />) — напр. в HTML-entity (&lt;br&gt;) или markdown-escape — чтобы они пережили round-trip как текст. Проверить, что не ломает уже корректные пути.

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

## Проблема Всплыло при ревью #553 (фикс hardBreak-round-trip #549). Литеральный `<br>` (или `<br/>`), НАБРАННЫЙ пользователем как ТЕКСТ абзаца, молча превращается в hardBreak-ноду на round-trip pm→md→pm. **Воспроизвёл (собранный `build/index.js`):** абзац с текстом `"a<br>b"` (0 hardBreak'ов) → сериализуется в `a<br>b` → реимпорт даёт текст `"ab"` + **1 hardBreak**. Пользовательский литерал стал переводом строки. ## Причина `case "text"` в `packages/prosemirror-markdown/src/lib/markdown-converter.ts:585-627` НЕ экранирует литеральные `<`/`>` в тексте, поэтому набранный `<br>` уходит в markdown как есть, а marked на реимпорте парсит его как inline-HTML-break → hardBreak. ## Почему сейчас важнее Само по себе — пред-существующий баг (идентичен на develop, #553 его НЕ вносит и НЕ ухудшает). Но #553 делает эквивалентность `<br>`↔hardBreak **несущей** (использует `<br>` как транспорт для hardBreak в lossy-позициях), так что различать пользовательский `<br>` от эмитнутого стало важнее. ## Возможный фикс В `case "text"` экранировать литеральные inline-HTML-break-теги (`<br>`, `<br/>`, `<br />`) — напр. в HTML-entity (`&lt;br&gt;`) или markdown-escape — чтобы они пережили round-trip как текст. Проверить, что не ломает уже корректные пути. _Всплыло при ревью PR #553._
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#554