Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/text.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFerdinand Thiessen <rpm@fthiessen.de>2022-07-09 23:38:00 +0300
committerFerdinand Thiessen <rpm@fthiessen.de>2022-07-15 13:34:00 +0300
commit1b7d876711be312a5230cb4e970eb086c71700fb (patch)
treee1733fe50594a655de39bdb2f1e2cdf152d0cce3
parentad23fc82b7bd1a8d49693f015bffc0f387d06f26 (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.js3
-rw-r--r--src/extensions/RichText.js8
-rw-r--r--src/nodes/BulletList.js3
-rw-r--r--src/tests/markdown.spec.js7
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)')