From 90c7b6a2af1c2b5333bf4ed11793bd5b490e0799 Mon Sep 17 00:00:00 2001 From: makhnatkin Date: Thu, 7 Aug 2025 07:22:55 +0300 Subject: [PATCH 1/3] fix(Lists): enable tight lists by default to eliminate unnecessary spacing --- src/extensions/markdown/Lists/ListsSpecs/schema.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extensions/markdown/Lists/ListsSpecs/schema.ts b/src/extensions/markdown/Lists/ListsSpecs/schema.ts index 59437a7e1..437975898 100644 --- a/src/extensions/markdown/Lists/ListsSpecs/schema.ts +++ b/src/extensions/markdown/Lists/ListsSpecs/schema.ts @@ -5,7 +5,7 @@ import {ListNode, ListsAttr, Markup} from './const'; export const schemaSpecs: Record = { [ListNode.ListItem]: { attrs: { - [ListsAttr.Tight]: {default: false}, + [ListsAttr.Tight]: {default: true}, [ListsAttr.Markup]: {default: null}, }, content: '(paragraph|block)+', @@ -24,7 +24,7 @@ export const schemaSpecs: Record = { content: `${ListNode.ListItem}+`, group: 'block', attrs: { - [ListsAttr.Tight]: {default: false}, + [ListsAttr.Tight]: {default: true}, [ListsAttr.Markup]: {default: Markup.bullet.default}, }, parseDOM: [ @@ -46,7 +46,7 @@ export const schemaSpecs: Record = { [ListNode.OrderedList]: { attrs: { [ListsAttr.Order]: {default: 1}, - [ListsAttr.Tight]: {default: false}, + [ListsAttr.Tight]: {default: true}, [ListsAttr.Markup]: {default: Markup.ordered.default}, }, content: `${ListNode.ListItem}+`, From 1e4c484b7e5f6ffbdf60bbb45858318fc1b00586 Mon Sep 17 00:00:00 2001 From: makhnatkin Date: Thu, 7 Aug 2025 19:17:22 +0300 Subject: [PATCH 2/3] fix(Lists): updated tests --- src/extensions/markdown/Lists/Lists.test.ts | 58 ++++++++++++++++--- .../markdown/Lists/ListsSpecs/schema.ts | 1 - 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/extensions/markdown/Lists/Lists.test.ts b/src/extensions/markdown/Lists/Lists.test.ts index c15a20e68..92df16106 100644 --- a/src/extensions/markdown/Lists/Lists.test.ts +++ b/src/extensions/markdown/Lists/Lists.test.ts @@ -25,9 +25,9 @@ const {doc, p, li, ul, ol} = builders<'doc' | 'p' | 'li' | 'ul' | 'ol'>(schema, const {same} = createMarkupChecker({parser, serializer}); describe('Lists extension', () => { - it('should parse bullet list', () => { + it('should parse bullet list (tight)', () => { same( - '* one\n\n* two', + '* one\n* two', doc( ul( {[ListsAttr.Markup]: '*'}, @@ -38,11 +38,37 @@ describe('Lists extension', () => { ); }); - it('should parse ordered list with dots', () => { + it('should parse bullet list (non tight)', () => { + same( + '* one\n\n* two', + doc( + ul( + {[ListsAttr.Markup]: '*', [ListsAttr.Tight]: false}, + li({[ListsAttr.Markup]: '*'}, p('one')), + li({[ListsAttr.Markup]: '*'}, p('two')), + ), + ), + ); + }); + + it('should parse ordered list with dots (tight)', () => { + same( + '1. one\n2. two', + doc( + ol( + li({[ListsAttr.Markup]: '.'}, p('one')), + li({[ListsAttr.Markup]: '.'}, p('two')), + ), + ), + ); + }); + + it('should parse ordered list with dots (non tight)', () => { same( '1. one\n\n2. two', doc( ol( + {[ListsAttr.Tight]: false}, li({[ListsAttr.Markup]: '.'}, p('one')), li({[ListsAttr.Markup]: '.'}, p('two')), ), @@ -50,9 +76,9 @@ describe('Lists extension', () => { ); }); - it('should parse ordered list with parenthesis', () => { + it('should parse ordered list with parenthesis (tight)', () => { same( - '1) one\n\n2) two', + '1) one\n2) two', doc( ol( {[ListsAttr.Markup]: ')'}, @@ -63,6 +89,19 @@ describe('Lists extension', () => { ); }); + it('should parse ordered list with parenthesis (non tight)', () => { + same( + '1) one\n\n2) two', + doc( + ol( + {[ListsAttr.Markup]: ')', [ListsAttr.Tight]: false}, + li({[ListsAttr.Markup]: ')'}, p('one')), + li({[ListsAttr.Markup]: ')'}, p('two')), + ), + ), + ); + }); + it('should parse nested lists', () => { const markup = ` - one @@ -80,11 +119,12 @@ describe('Lists extension', () => { markup, doc( ul( - {[ListsAttr.Markup]: '-'}, + {[ListsAttr.Markup]: '-', [ListsAttr.Tight]: false}, li( {[ListsAttr.Markup]: '-'}, p('one'), ol( + {[ListsAttr.Tight]: false}, li( {[ListsAttr.Markup]: '.'}, p('two'), @@ -110,15 +150,15 @@ describe('Lists extension', () => { '- + * 2. item', doc( ul( - {[ListsAttr.Markup]: '-'}, + {[ListsAttr.Markup]: '-', [ListsAttr.Tight]: false}, li( {[ListsAttr.Markup]: '-'}, ul( - {[ListsAttr.Markup]: '+'}, + {[ListsAttr.Markup]: '+', [ListsAttr.Tight]: false}, li( {[ListsAttr.Markup]: '+'}, ul( - {[ListsAttr.Markup]: '*'}, + {[ListsAttr.Markup]: '*', [ListsAttr.Tight]: false}, li( {[ListsAttr.Markup]: '*'}, ol( diff --git a/src/extensions/markdown/Lists/ListsSpecs/schema.ts b/src/extensions/markdown/Lists/ListsSpecs/schema.ts index 437975898..fe8676427 100644 --- a/src/extensions/markdown/Lists/ListsSpecs/schema.ts +++ b/src/extensions/markdown/Lists/ListsSpecs/schema.ts @@ -5,7 +5,6 @@ import {ListNode, ListsAttr, Markup} from './const'; export const schemaSpecs: Record = { [ListNode.ListItem]: { attrs: { - [ListsAttr.Tight]: {default: true}, [ListsAttr.Markup]: {default: null}, }, content: '(paragraph|block)+', From 5df596842048c8fb2d4deb6571f5959ac16d037d Mon Sep 17 00:00:00 2001 From: makhnatkin Date: Thu, 28 Aug 2025 13:46:18 +0200 Subject: [PATCH 3/3] fix(Lists): updated tests --- .../Lists/plugins/MergeListsPlugin.test.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/extensions/markdown/Lists/plugins/MergeListsPlugin.test.ts b/src/extensions/markdown/Lists/plugins/MergeListsPlugin.test.ts index d7fea8d18..e8d7d2cdc 100644 --- a/src/extensions/markdown/Lists/plugins/MergeListsPlugin.test.ts +++ b/src/extensions/markdown/Lists/plugins/MergeListsPlugin.test.ts @@ -32,14 +32,16 @@ const nestedListsMarkup = ` * Very easy! `; -const orderedListMarkup = ` +const orderedListMarkup1 = ` 1. Create a list by starting a line with \`+\`, \`-\`, or \`*\` 2. Sub-lists are made by indenting 2 spaces: 1. Marker character change forces new list start: 2. Ac tristique libero volutpat at 3. Facilisis in pretium nisl aliquet 4. Nulla volutpat aliquam velit +`; +const orderedListMarkup2 = ` 1. Very easy! 2. Very easy! `; @@ -106,16 +108,16 @@ describe('Lists extension', () => { state: EditorState.create({schema, plugins: [mergeListsPlugin()]}), }); view.dispatch( - view.state.tr.replaceWith( - 0, - view.state.doc.nodeSize - 2, - markupParser.parse(orderedListMarkup).content, - ), + view.state.tr.replaceWith(0, view.state.doc.nodeSize - 2, [ + markupParser.parse(orderedListMarkup1).firstChild!, + markupParser.parse(orderedListMarkup2).firstChild!, + ]), ); expect(view.state.doc).toMatchNode( doc( ol( { + [ListsAttr.Tight]: true, [ListsAttr.Markup]: '.', }, li(