Skip to content

Commit 1408cee

Browse files
committed
feat(YfmCut): allow inline nodes in cut title
1 parent 5edfcb3 commit 1408cee

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

src/extensions/yfm/YfmCut/YfmCut.test.ts

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,32 @@ import {
88
BlockquoteSpecs,
99
italicMarkName,
1010
ItalicSpecs,
11+
ImageSpecs,
12+
imageNodeName,
13+
ImageAttr,
1114
} from '../../markdown/specs';
1215
import {CutNode, YfmCutSpecs} from './YfmCutSpecs';
1316

1417
const {schema, parser, serializer} = new ExtensionsManager({
1518
extensions: (builder) =>
16-
builder.use(BaseSpecsPreset, {}).use(ItalicSpecs).use(BlockquoteSpecs).use(YfmCutSpecs, {}),
19+
builder
20+
.use(BaseSpecsPreset, {})
21+
.use(ItalicSpecs)
22+
.use(BlockquoteSpecs)
23+
.use(YfmCutSpecs, {})
24+
.use(ImageSpecs),
1725
}).buildDeps();
1826

19-
const {doc, p, i, bq, cut, cutTitle, cutContent} = builders(schema, {
27+
const {doc, p, i, bq, img, cut, cutTitle, cutContent} = builders(schema, {
2028
doc: {nodeType: BaseNode.Doc},
2129
p: {nodeType: BaseNode.Paragraph},
2230
i: {markType: italicMarkName},
2331
bq: {nodeType: blockquoteNodeName},
32+
img: {nodeType: imageNodeName},
2433
cut: {nodeType: CutNode.Cut},
2534
cutTitle: {nodeType: CutNode.CutTitle},
2635
cutContent: {nodeType: CutNode.CutContent},
27-
}) as PMTestBuilderResult<'doc' | 'p' | 'bq' | 'cut' | 'cutTitle' | 'cutContent', 'i'>;
36+
}) as PMTestBuilderResult<'doc' | 'p' | 'bq' | 'img' | 'cut' | 'cutTitle' | 'cutContent', 'i'>;
2837

2938
const {same} = createMarkupChecker({parser, serializer});
3039

@@ -94,6 +103,31 @@ cut content
94103
same(markup, doc(cut(cutTitle(i('cut italic title')), cutContent(p('cut content')))));
95104
});
96105

106+
it('should parse yfm-cut with inline node in cut title', () => {
107+
const markup = `
108+
{% cut "![img](path/to/img)" %}
109+
110+
cut content
111+
112+
{% endcut %}
113+
`.trim();
114+
115+
same(
116+
markup,
117+
doc(
118+
cut(
119+
cutTitle(
120+
img({
121+
[ImageAttr.Src]: 'path/to/img',
122+
[ImageAttr.Alt]: 'img',
123+
}),
124+
),
125+
cutContent(p('cut content')),
126+
),
127+
),
128+
);
129+
});
130+
97131
it('should parse yfm-note from html', () => {
98132
parseDOM(
99133
schema,

src/extensions/yfm/YfmCut/YfmCutSpecs/spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const getSpec = (opts?: YfmCutSpecsOptions): Record<CutNode, NodeSpec> =>
2424

2525
[CutNode.CutTitle]: {
2626
attrs: {class: {default: 'yfm-cut-title'}},
27-
content: 'text*',
27+
content: 'inline*',
2828
group: 'block yfm-cut',
2929
parseDOM: [{tag: 'div.yfm-cut-title'}],
3030
toDOM(node) {

src/extensions/yfm/YfmCut/YfmCutSpecs/toYfm.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const toYfm: Record<CutNode, SerializerNodeToken> = {
1212

1313
[CutNode.CutTitle]: (state, node) => {
1414
state.write('{% cut "');
15-
if (node.textContent) state.renderInline(node);
15+
if (node.nodeSize > 2) state.renderInline(node);
1616
else state.write(getPlaceholderContent(node));
1717
state.write('" %}\n');
1818
state.write('\n');

0 commit comments

Comments
 (0)