diff options
author | Ferdinand Thiessen <rpm@fthiessen.de> | 2022-07-09 23:38:00 +0300 |
---|---|---|
committer | Ferdinand Thiessen <rpm@fthiessen.de> | 2022-07-15 13:34:00 +0300 |
commit | 1b7d876711be312a5230cb4e970eb086c71700fb (patch) | |
tree | e1733fe50594a655de39bdb2f1e2cdf152d0cce3 | |
parent | ad23fc82b7bd1a8d49693f015bffc0f387d06f26 (diff) |
Ensure whitespaces in markdown files are preserved
Adjusted test cases to test whitespace characters are
not touched.
Signed-off-by: Ferdinand Thiessen <rpm@fthiessen.de>
-rw-r--r-- | src/extensions/HardBreak.js | 3 | ||||
-rw-r--r-- | src/extensions/RichText.js | 8 | ||||
-rw-r--r-- | src/nodes/BulletList.js | 3 | ||||
-rw-r--r-- | src/tests/markdown.spec.js | 7 |
4 files changed, 16 insertions, 5 deletions
diff --git a/src/extensions/HardBreak.js b/src/extensions/HardBreak.js index 60c7518ee..e1597099b 100644 --- a/src/extensions/HardBreak.js +++ b/src/extensions/HardBreak.js @@ -27,7 +27,8 @@ const HardBreak = TipTapHardBreak.extend({ toMarkdown(state, node, parent, index) { for (let i = index + 1; i < parent.childCount; i++) { if (parent.child(i).type !== node.type) { - state.write(' \n') + if (parent.child(i).text?.startsWith('\n')) state.write(' ') + else state.write(' \n') return } } diff --git a/src/extensions/RichText.js b/src/extensions/RichText.js index c98927618..bcf566fca 100644 --- a/src/extensions/RichText.js +++ b/src/extensions/RichText.js @@ -24,7 +24,7 @@ import { Extension } from '@tiptap/core' /* eslint-disable import/no-named-as-default */ import Document from '@tiptap/extension-document' -import Paragraph from '@tiptap/extension-paragraph' +import TipTapParagraph from '@tiptap/extension-paragraph' import Text from '@tiptap/extension-text' import Blockquote from '@tiptap/extension-blockquote' import OrderedList from '@tiptap/extension-ordered-list' @@ -45,6 +45,12 @@ import Callout from './../nodes/Callouts.js' import { Strong, Italic, Strike, Link, Underline } from './../marks/index.js' +const Paragraph = TipTapParagraph.extend({ + parseHTML() { + return this.parent().map(rule => Object.assign(rule, { preserveWhitespace: 'full' })) + }, +}) + export default Extension.create({ name: 'RichText', diff --git a/src/nodes/BulletList.js b/src/nodes/BulletList.js index ac32fd040..12a6d61f9 100644 --- a/src/nodes/BulletList.js +++ b/src/nodes/BulletList.js @@ -29,6 +29,9 @@ import { listInputRule } from '../commands/index.js' * Only there we know the user is not trying to create a task list. */ const BulletList = TiptapBulletList.extend({ + parseHTML() { + return this.parent().map(rule => Object.assign(rule, { preserveWhitespace: true })) + }, addInputRules() { return [ diff --git a/src/tests/markdown.spec.js b/src/tests/markdown.spec.js index 34397eceb..0f6cbaeed 100644 --- a/src/tests/markdown.spec.js +++ b/src/tests/markdown.spec.js @@ -61,7 +61,7 @@ describe('Markdown though editor', () => { test('hard breaks', () => { expect(markdownThroughEditor('hard \nbreak')).toBe('hard \nbreak') expect(markdownThroughEditor('hard\\\nbreak')).toBe('hard \nbreak') - expect(markdownThroughEditor('no\nbreak')).toBe('no break') + expect(markdownThroughEditor('soft\nbreak')).toBe('soft\nbreak') }) test('inline format', () => { expect(markdownThroughEditor('**Test**')).toBe('**Test**') @@ -79,7 +79,8 @@ describe('Markdown though editor', () => { expect(markdownThroughEditor('1. foo\n2. bar')).toBe('1. foo\n2. bar') }) test('paragraph', () => { - expect(markdownThroughEditor('foo\nbar\n\nfoobar\n\tfoobar')).toBe('foo bar\n\nfoobar foobar') + // Test whitespace characters are untouched + expect(markdownThroughEditor('foo\nbar\n\nfoobar\nfoo\tbar')).toBe('foo\nbar\n\nfoobar\nfoo\tbar') }) test('links', () => { expect(markdownThroughEditor('[test](foo)')).toBe('[test](foo)') @@ -144,7 +145,7 @@ describe('Markdown serializer from html', () => { test('hard line breaks', () => { expect(markdownThroughEditorHtml('<p>hard<br />break</p>')).toBe('hard \nbreak') expect(markdownThroughEditorHtml('<p>hard<br>break</p>')).toBe('hard \nbreak') - expect(markdownThroughEditorHtml('<p>no\nbreak</p>')).toBe('no break') + expect(markdownThroughEditorHtml('<p>soft\nbreak</p>')).toBe('soft\nbreak') }) test('links', () => { expect(markdownThroughEditorHtml('<a href="foo">test</a>')).toBe('[test](foo)') |