fix(schema): снять excludes:"_" у марки code — она комбинируется со всеми марками (#515)
По CommonMark `**` рядом с инлайн-кодом дают `<strong><code>` — узел с
составом марок [code, bold]. Марка `code` из tiptap несёт `excludes: "_"`
(исключает все прочие инлайн-марки), и ProseMirror на HTML→PM импорте
(`generateJSON`) выкидывает сосуществующую bold — так `**`--flag`**` терял
жирный. Ставим `excludes: ""` (не исключает ничего) во всех четырёх местах,
где марка конфигурируется независимо:
- Единый источник: новая каноническая марка `Code = TiptapCode.extend({
excludes: "" })` в @docmost/editor-ext, экспортируется из barrel.
- Живой редактор (extensions.ts): базовая `Code` теперь из editor-ext,
поверх сохранены client-only addInputRules/addKeyboardShortcuts.
- Collab-сервер + серверный HTML-парс/экспорт (collaboration.util.ts):
StarterKit code:false + общая `Code`; @docmost/editor-ext объявлен в
apps/server/package.json (использовался, но не был задекларирован).
- Редактор комментариев (comment-editor.tsx): StarterKit code:false + `Code`.
- Вендор-зеркало docmostExtensions (docmost-schema.ts) — сознательно отдельная
копия, не тянущая editor-ext в node-рантайм: `excludes:""` объявлен локально
(StarterKit code:false + `Code.extend({ excludes:"" })`), держится в
синхроне с editor-ext паритет-тестом.
Паритет-гард: тест в пакете сверяет excludes марки code вендор-зеркала с
канонической editor-ext Code (обе ""); vitest резолвит @docmost/editor-ext на
sibling-исходник, чтобы гард был герметичным.
`excludes:""` делает code «перекрывающейся» маркой в y-prosemirror (как comment):
она пишется в Yjs под хешированным ключом `code--<hash>` и распаковывается
обратно в `code` штатным декодером — правим mcp-тест-хелпер fragmentToJson,
чтобы он снимал хеш ровно как yattr2markname (иначе overlapping-code утёк бы
в сравнение как `code--<hash>`).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
import { Code as TiptapCode } from "@tiptap/extension-code";
|
||||
|
||||
// #515: canonical inline `code` mark for Docmost.
|
||||
//
|
||||
// Tiptap's stock Code mark (via StarterKit) declares `excludes: "_"`, which
|
||||
// makes it exclude EVERY other inline mark: applying `code` drops any co-
|
||||
// occurring bold/italic/… on both the HTML->PM import and editor transactions.
|
||||
// That silently stripped emphasis adjacent to inline code (`` **`--flag`** ``
|
||||
// lost its bold on markdown import). CommonMark nests them (`<strong><code>`),
|
||||
// so Docmost lets `code` combine with all marks by overriding `excludes` to the
|
||||
// empty string (excludes nothing).
|
||||
//
|
||||
// This is the SINGLE shared source imported by the live editor, the collab
|
||||
// server and the comment editor schemas. The markdown-import mirror in
|
||||
// @docmost/prosemirror-markdown re-declares the same override locally (it must
|
||||
// not pull this React-aware package into its node runtime) and a parity test
|
||||
// keeps the two in lockstep.
|
||||
export const Code = TiptapCode.extend({
|
||||
excludes: "",
|
||||
});
|
||||
Reference in New Issue
Block a user