Skip to content

Commit 6b148fd

Browse files
authored
fix: remove marks from breaks that are first node inside that mark (#378)
1 parent b6b61f8 commit 6b148fd

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

src/core/markdown/Markdown.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,10 @@ describe('markdown', () => {
163163

164164
it('drops trailing hard breaks', () => serialize(doc(p('a', br(), br())), 'a'));
165165

166-
it('should remove marks from edge break', () =>
166+
it('should remove marks from edge break (before)', () =>
167+
serialize(doc(p('text', strong(br(), 'text2'))), 'text\\\n**text2**'));
168+
169+
it('should remove marks from edge break (after)', () =>
167170
serialize(doc(p(strong('text', br()), 'text2')), '**text**\\\ntext2'));
168171

169172
it('expels enclosing whitespace from inside emphasis', () =>

src/core/markdown/MarkdownSerializer.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,19 @@ export class MarkdownSerializerState {
194194
const progress = (node, _, index) => {
195195
let marks = node ? node.marks : [];
196196

197-
// Remove marks from breaks (hard_break or soft_break) that are the last node inside
197+
// Remove marks from breaks (hard_break or soft_break) that are the edge node inside
198198
// that mark to prevent parser edge cases with new lines just
199-
// before closing marks.
199+
// before closing or after opening marks.
200200
if (node && node.type.spec.isBreak) {
201201
marks = marks.filter(m => {
202+
if (index === 0) return false;
202203
if (index + 1 == parent.childCount) return false;
204+
const prev = parent.child(index - 1);
203205
const next = parent.child(index + 1);
204-
return m.isInSet(next.marks) && (!next.isText || /\S/.test(next.text));
206+
return (
207+
(m.isInSet(prev.marks) && (!prev.isText || /\S/.test(prev.text))) &&
208+
(m.isInSet(next.marks) && (!next.isText || /\S/.test(next.text)))
209+
);
205210
});
206211
}
207212

src/extensions/markdown/Breaks/Breaks.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,24 @@ describe('Breaks extension', () => {
3333
'Lorem **ipsum**\\\ndolor sit amet',
3434
));
3535

36+
it('should serialize hard break 2', () =>
37+
serialize(
38+
doc(p('Lorem', bold(hb(), 'ipsum'), ' dolor sit amet')),
39+
'Lorem\\\n**ipsum** dolor sit amet',
40+
));
41+
3642
it('should serialize soft break', () =>
3743
serialize(
3844
doc(p('Lorem ', bold('ipsum', sb()), 'dolor sit amet')),
3945
'Lorem **ipsum**\ndolor sit amet',
4046
));
4147

48+
it('should serialize soft break 2', () =>
49+
serialize(
50+
doc(p('Lorem', bold(sb(), 'ipsum'), ' dolor sit amet')),
51+
'Lorem\n**ipsum** dolor sit amet',
52+
));
53+
4254
it('should parse html - br tag', () => {
4355
parseDOM(schema, '<div>hello<br>world!</div>', doc(p('hello', hb(), 'world!')));
4456
});

0 commit comments

Comments
 (0)