Skip to content

Commit 19068d8

Browse files
committed
fix(Lists): check that list items are being serialized with correct markup
1 parent 85c34b4 commit 19068d8

File tree

6 files changed

+86
-25
lines changed

6 files changed

+86
-25
lines changed

src/extensions/markdown/Lists/Lists.test.ts

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ describe('Lists extension', () => {
3030
'* one\n\n* two',
3131
doc(
3232
ul(
33-
{[ListsAttr.Bullet]: '*'},
33+
{[ListsAttr.Markup]: '*'},
3434
li({[ListsAttr.Markup]: '*'}, p('one')),
3535
li({[ListsAttr.Markup]: '*'}, p('two')),
3636
),
3737
),
3838
);
3939
});
4040

41-
it('should parse ordered list', () => {
41+
it('should parse ordered list with dots', () => {
4242
same(
4343
'1. one\n\n2. two',
4444
doc(
@@ -50,6 +50,19 @@ describe('Lists extension', () => {
5050
);
5151
});
5252

53+
it('should parse ordered list with parenthesis', () => {
54+
same(
55+
'1) one\n\n2) two',
56+
doc(
57+
ol(
58+
{[ListsAttr.Markup]: ')'},
59+
li({[ListsAttr.Markup]: ')'}, p('one')),
60+
li({[ListsAttr.Markup]: ')'}, p('two')),
61+
),
62+
),
63+
);
64+
});
65+
5366
it('should parse nested lists', () => {
5467
const markup = `
5568
- one
@@ -67,7 +80,7 @@ describe('Lists extension', () => {
6780
markup,
6881
doc(
6982
ul(
70-
{[ListsAttr.Bullet]: '-'},
83+
{[ListsAttr.Bullet]: '-', [ListsAttr.Markup]: '-'},
7184
li(
7285
{[ListsAttr.Markup]: '-'},
7386
p('one'),
@@ -76,7 +89,11 @@ describe('Lists extension', () => {
7689
{[ListsAttr.Markup]: '.'},
7790
p('two'),
7891
ul(
79-
{[ListsAttr.Tight]: true, [ListsAttr.Bullet]: '+'},
92+
{
93+
[ListsAttr.Tight]: true,
94+
[ListsAttr.Bullet]: '+',
95+
[ListsAttr.Markup]: '+',
96+
},
8097
li({[ListsAttr.Markup]: '+'}, p('three')),
8198
),
8299
),
@@ -94,19 +111,23 @@ describe('Lists extension', () => {
94111
'- + * 2. item',
95112
doc(
96113
ul(
97-
{[ListsAttr.Bullet]: '-'},
114+
{[ListsAttr.Bullet]: '-', [ListsAttr.Markup]: '-'},
98115
li(
99116
{[ListsAttr.Markup]: '-'},
100117
ul(
101-
{[ListsAttr.Bullet]: '+'},
118+
{[ListsAttr.Bullet]: '+', [ListsAttr.Markup]: '+'},
102119
li(
103120
{[ListsAttr.Markup]: '+'},
104121
ul(
105-
{[ListsAttr.Bullet]: '*'},
122+
{[ListsAttr.Bullet]: '*', [ListsAttr.Markup]: '*'},
106123
li(
107124
{[ListsAttr.Markup]: '*'},
108125
ol(
109-
{[ListsAttr.Order]: 2, [ListsAttr.Tight]: true},
126+
{
127+
[ListsAttr.Order]: 2,
128+
[ListsAttr.Tight]: true,
129+
[ListsAttr.Markup]: '.',
130+
},
110131
li({[ListsAttr.Markup]: '.'}, p('item')),
111132
),
112133
),

src/extensions/markdown/Lists/ListsSpecs/const.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,20 @@ export enum ListNode {
66

77
export enum ListsAttr {
88
Tight = 'tight',
9-
/** used in bullet list only */
9+
/** @deprecated Use `ListsAttr.Markup` instead */
1010
Bullet = 'bullet',
1111
/** used in ordered list only */
1212
Order = 'order',
13-
/** used in list item only */
1413
Markup = 'markup',
1514
}
15+
16+
export const Markup = {
17+
bullet: {
18+
values: ['-', '+', '*'],
19+
default: '*',
20+
},
21+
ordered: {
22+
values: ['.', ')'],
23+
default: '.',
24+
},
25+
};

src/extensions/markdown/Lists/ListsSpecs/parser.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const parserTokens: Record<ListNode, ParserToken> = {
1717
getAttrs: (token, tokens, i) => ({
1818
[ListsAttr.Tight]: listIsTight(tokens, i),
1919
[ListsAttr.Bullet]: token.markup,
20+
[ListsAttr.Markup]: token.markup,
2021
}),
2122
},
2223

@@ -26,6 +27,7 @@ export const parserTokens: Record<ListNode, ParserToken> = {
2627
getAttrs: (token, tokens, i) => ({
2728
[ListsAttr.Order]: Number(token.attrGet('start')) || 1,
2829
[ListsAttr.Tight]: listIsTight(tokens, i),
30+
[ListsAttr.Markup]: token.markup,
2931
}),
3032
},
3133
};

src/extensions/markdown/Lists/ListsSpecs/schema.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import type {NodeSpec} from 'prosemirror-model';
22

3-
import {ListNode, ListsAttr} from './const';
3+
import {ListNode, ListsAttr, Markup} from './const';
44

55
export const schemaSpecs: Record<ListNode, NodeSpec> = {
66
[ListNode.ListItem]: {
7-
attrs: {[ListsAttr.Tight]: {default: false}, [ListsAttr.Markup]: {default: null}},
7+
attrs: {
8+
[ListsAttr.Tight]: {default: false},
9+
[ListsAttr.Markup]: {default: null},
10+
},
811
content: '(paragraph|block)+',
912
defining: true,
1013
parseDOM: [{tag: 'li'}],
@@ -20,7 +23,11 @@ export const schemaSpecs: Record<ListNode, NodeSpec> = {
2023
[ListNode.BulletList]: {
2124
content: `${ListNode.ListItem}+`,
2225
group: 'block',
23-
attrs: {[ListsAttr.Tight]: {default: false}, [ListsAttr.Bullet]: {default: '*'}},
26+
attrs: {
27+
[ListsAttr.Tight]: {default: false},
28+
[ListsAttr.Bullet]: {default: Markup.bullet.default},
29+
[ListsAttr.Markup]: {default: Markup.bullet.default},
30+
},
2431
parseDOM: [
2532
{
2633
tag: 'ul',
@@ -38,7 +45,11 @@ export const schemaSpecs: Record<ListNode, NodeSpec> = {
3845
},
3946

4047
[ListNode.OrderedList]: {
41-
attrs: {[ListsAttr.Order]: {default: 1}, [ListsAttr.Tight]: {default: false}},
48+
attrs: {
49+
[ListsAttr.Order]: {default: 1},
50+
[ListsAttr.Tight]: {default: false},
51+
[ListsAttr.Markup]: {default: Markup.ordered.default},
52+
},
4253
content: `${ListNode.ListItem}+`,
4354
group: 'block',
4455
parseDOM: [

src/extensions/markdown/Lists/ListsSpecs/serializer.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,44 @@ import type {Node} from 'prosemirror-model';
22

33
import type {SerializerNodeToken} from '../../../../core';
44

5-
import {ListNode, ListsAttr} from './const';
5+
import {ListNode, ListsAttr, Markup} from './const';
66

77
export const serializerTokens: Record<ListNode, SerializerNodeToken> = {
88
[ListNode.ListItem]: (state, node) => {
99
state.renderContent(node);
1010
},
1111

1212
[ListNode.BulletList]: (state, node) => {
13-
state.renderList(
14-
node,
15-
' ',
16-
(_i: number, li: Node) =>
17-
(li.attrs[ListsAttr.Markup] || node.attrs[ListsAttr.Bullet] || '*') + ' ',
18-
);
13+
state.renderList(node, ' ', (_i: number, li: Node) => {
14+
const markup = getMarkup({item: li, list: node, type: 'bullet'});
15+
return markup + ' ';
16+
});
1917
},
2018

2119
[ListNode.OrderedList]: (state, node) => {
2220
const start = node.attrs[ListsAttr.Order] || 1;
2321
const maxW = String(start + node.childCount - 1).length;
2422
const space = state.repeat(' ', maxW + 2);
25-
state.renderList(node, space, (i: number) => {
23+
state.renderList(node, space, (i: number, li: Node) => {
2624
const nStr = String(start + i);
27-
return state.repeat(' ', maxW - nStr.length) + nStr + '. ';
25+
const markup = getMarkup({item: li, list: node, type: 'ordered'});
26+
return state.repeat(' ', maxW - nStr.length) + nStr + markup + ' ';
2827
});
2928
},
3029
};
30+
31+
function getMarkup({
32+
item,
33+
list,
34+
type,
35+
}: {
36+
item: Node;
37+
list: Node;
38+
type: keyof typeof Markup;
39+
}): string {
40+
const defs = Markup[type];
41+
let value = item.attrs[ListsAttr.Markup];
42+
if (!defs.values.includes(value)) value = list.attrs[ListsAttr.Markup];
43+
if (!defs.values.includes(value)) value = defs.default;
44+
return value;
45+
}

src/extensions/markdown/Lists/plugins/MergeListsPlugin.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ describe('Lists extension', () => {
6363
{
6464
[ListsAttr.Tight]: true,
6565
[ListsAttr.Bullet]: '+',
66+
[ListsAttr.Markup]: '+',
6667
},
6768
li(
6869
{[ListsAttr.Markup]: '+'},
@@ -82,6 +83,7 @@ describe('Lists extension', () => {
8283
{
8384
[ListsAttr.Tight]: true,
8485
[ListsAttr.Bullet]: '-',
86+
[ListsAttr.Markup]: '-',
8587
},
8688
li(
8789
{[ListsAttr.Markup]: '-'},
@@ -116,7 +118,7 @@ describe('Lists extension', () => {
116118
doc(
117119
ol(
118120
{
119-
[ListsAttr.Bullet]: '.',
121+
[ListsAttr.Markup]: '.',
120122
},
121123
li(
122124
{
@@ -139,7 +141,7 @@ describe('Lists extension', () => {
139141
ol(
140142
{
141143
[ListsAttr.Tight]: true,
142-
[ListsAttr.Bullet]: '.',
144+
[ListsAttr.Markup]: '.',
143145
},
144146
li(
145147
{[ListsAttr.Markup]: '.'},

0 commit comments

Comments
 (0)