diff --git a/src/extensions/yfm/YfmCut/YfmCutSpecs/serializer.ts b/src/extensions/yfm/YfmCut/YfmCutSpecs/serializer.ts index b8071c18e..b06c20ef2 100644 --- a/src/extensions/yfm/YfmCut/YfmCutSpecs/serializer.ts +++ b/src/extensions/yfm/YfmCut/YfmCutSpecs/serializer.ts @@ -1,10 +1,9 @@ -import type {Node} from 'prosemirror-model'; +import type {SerializerNodeToken} from '#core'; +import type {Node} from '#pm/model'; +import {isNodeEmpty} from 'src/utils/nodes'; +import {getPlaceholderContent} from 'src/utils/placeholder'; -import type {SerializerNodeToken} from '../../../../core'; -import {isNodeEmpty} from '../../../../utils/nodes'; -import {getPlaceholderContent} from '../../../../utils/placeholder'; - -import {CutAttr, CutNode} from './const'; +import {CutAttr, CutNode, cutContentType, cutTitleType} from './const'; export function getSerializerTokens({ directiveSyntax, @@ -16,27 +15,51 @@ export function getSerializerTokens({ }; return { - [CutNode.Cut]: (state, node) => { - state.renderContent(node); - state.write(isDirectiveCut(node) ? ':::' : '{% endcut %}'); - state.closeBlock(node); + [CutNode.Cut]: (state, cutNode) => { + const {schema} = cutNode.type; + const titleNode = + cutNode.firstChild?.type === cutTitleType(schema) ? cutNode.firstChild : null; + const contentNode = + cutNode.lastChild?.type === cutContentType(schema) ? cutNode.lastChild : null; + + if (isDirectiveCut(cutNode)) { + state.write(':::cut ['); + if (titleNode) state.renderInline(titleNode); + state.write(']'); + state.ensureNewLine(); + + if (contentNode) state.renderContent(contentNode); + state.ensureNewLine(); + state.write(':::'); + + state.closeBlock(); + return; + } + + state.write('{% cut "'); + if (titleNode) { + if (titleNode.nodeSize > 2) state.renderInline(titleNode); + else state.write(getPlaceholderContent(titleNode)); + } + state.write('" %}\n'); + state.write('\n'); + + if (contentNode) state.renderContent(contentNode); + state.write('{% endcut %}'); + state.closeBlock(cutNode); }, [CutNode.CutTitle]: (state, node, parent) => { if (isDirectiveCut(parent)) { - state.write(':::cut ['); state.renderInline(node); - state.write(']'); state.ensureNewLine(); state.closeBlock(); return; } - state.write('{% cut "'); if (node.nodeSize > 2) state.renderInline(node); else state.write(getPlaceholderContent(node)); - state.write('" %}\n'); - state.write('\n'); + state.ensureNewLine(); state.closeBlock(); }, @@ -46,8 +69,13 @@ export function getSerializerTokens({ return; } - if (!isNodeEmpty(node)) state.renderInline(node); - else state.write(getPlaceholderContent(node) + '\n\n'); + if (isNodeEmpty(node)) { + state.write(getPlaceholderContent(node)); + state.write('\n'); + state.write('\n'); + } else { + state.renderContent(node); + } }, }; } diff --git a/src/extensions/yfm/YfmNote/YfmNoteSpecs/serializer.ts b/src/extensions/yfm/YfmNote/YfmNoteSpecs/serializer.ts index 9eebe773c..4fa7c5e85 100644 --- a/src/extensions/yfm/YfmNote/YfmNoteSpecs/serializer.ts +++ b/src/extensions/yfm/YfmNote/YfmNoteSpecs/serializer.ts @@ -1,33 +1,45 @@ -import type {SerializerNodeToken} from '../../../../core'; -import {isNodeEmpty} from '../../../../utils/nodes'; -import {getPlaceholderContent} from '../../../../utils/placeholder'; +import type {SerializerNodeToken} from '#core'; +import {isNodeEmpty} from 'src/utils/nodes'; +import {getPlaceholderContent} from 'src/utils/placeholder'; import {NoteAttrs, NoteNode} from './const'; +import {noteContentType, noteTitleType} from './utils'; export const serializerTokens: Record = { - [NoteNode.Note]: (state, node) => { - state.renderContent(node); - state.write('{% endnote %}'); - state.closeBlock(node); - }, + [NoteNode.Note]: (state, noteNode) => { + const {schema} = noteNode.type; + const titleNode = + noteNode.firstChild?.type === noteTitleType(schema) ? noteNode.firstChild : null; + const contentNode = + noteNode.lastChild?.type === noteContentType(schema) ? noteNode.lastChild : null; - [NoteNode.NoteTitle]: (state, node, parent) => { - state.write(`{% note ${parent.attrs[NoteAttrs.Type]} `); - if (node.nodeSize > 2) { - state.write('"'); - state.renderInline(node); - state.write('"'); - } else { - const placeholder = getPlaceholderContent(node); - if (placeholder) state.write(`"${placeholder}"`); + state.write(`{% note ${noteNode.attrs[NoteAttrs.Type]} "`); + if (titleNode) { + if (titleNode.nodeSize > 2) state.renderInline(titleNode); + else state.write(getPlaceholderContent(titleNode)); } - state.write(' %}\n'); + state.write('" %}\n'); state.write('\n'); + + if (contentNode) state.renderContent(contentNode); + state.write('{% endnote %}'); + state.closeBlock(noteNode); + }, + + [NoteNode.NoteTitle]: (state, node) => { + if (node.nodeSize > 2) state.renderInline(node); + else state.write(getPlaceholderContent(node)); + state.ensureNewLine(); state.closeBlock(); }, [NoteNode.NoteContent]: (state, node) => { - if (!isNodeEmpty(node)) state.renderInline(node); - else state.write(getPlaceholderContent(node) + '\n\n'); + if (isNodeEmpty(node)) { + state.write(getPlaceholderContent(node)); + state.write('\n'); + state.write('\n'); + } else { + state.renderContent(node); + } }, };