Merge pull request #2455 from nextcloud/bugfix/hard-break

Fix non-working hard line breaks
This commit is contained in:
max-nextcloud 2022-06-07 15:04:00 +02:00 коммит произвёл GitHub
Родитель 87e738654b bd9fcf52d5
Коммит b548bf8f60
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
18 изменённых файлов: 89 добавлений и 19 удалений

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

19
package-lock.json сгенерированный
Просмотреть файл

@ -27,6 +27,7 @@
"@tiptap/extension-code-block-lowlight": "^2.0.0-beta.68",
"@tiptap/extension-document": "^2.0.0-beta.15",
"@tiptap/extension-dropcursor": "^2.0.0-beta.25",
"@tiptap/extension-hard-break": "^2.0.0-beta.30",
"@tiptap/extension-heading": "^2.0.0-beta.26",
"@tiptap/extension-history": "^2.0.0-beta.21",
"@tiptap/extension-horizontal-rule": "^2.0.0-beta.31",
@ -3422,6 +3423,18 @@
"@tiptap/core": "^2.0.0-beta.1"
}
},
"node_modules/@tiptap/extension-hard-break": {
"version": "2.0.0-beta.30",
"resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.30.tgz",
"integrity": "sha512-X9xj/S+CikrbIE7ccUFVwit5QHEbflnKVxod+4zPwr1cxogFbE9AyLZE2MpYdx3z9LcnTYYi9leBqFrP4T/Olw==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
},
"peerDependencies": {
"@tiptap/core": "^2.0.0-beta.1"
}
},
"node_modules/@tiptap/extension-heading": {
"version": "2.0.0-beta.26",
"resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.26.tgz",
@ -21446,6 +21459,12 @@
"tippy.js": "^6.3.7"
}
},
"@tiptap/extension-hard-break": {
"version": "2.0.0-beta.30",
"resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.30.tgz",
"integrity": "sha512-X9xj/S+CikrbIE7ccUFVwit5QHEbflnKVxod+4zPwr1cxogFbE9AyLZE2MpYdx3z9LcnTYYi9leBqFrP4T/Olw==",
"requires": {}
},
"@tiptap/extension-heading": {
"version": "2.0.0-beta.26",
"resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.26.tgz",

Просмотреть файл

@ -45,6 +45,7 @@
"@tiptap/extension-code-block-lowlight": "^2.0.0-beta.68",
"@tiptap/extension-document": "^2.0.0-beta.15",
"@tiptap/extension-dropcursor": "^2.0.0-beta.25",
"@tiptap/extension-hard-break": "^2.0.0-beta.30",
"@tiptap/extension-heading": "^2.0.0-beta.26",
"@tiptap/extension-history": "^2.0.0-beta.21",
"@tiptap/extension-horizontal-rule": "^2.0.0-beta.31",

Просмотреть файл

@ -52,7 +52,7 @@ import {
TaskItem,
Callout,
} from './nodes/index.js'
import { Markdown, Emoji } from './extensions/index.js'
import { HardBreak, Markdown, Emoji } from './extensions/index.js'
import { translate as t } from '@nextcloud/l10n'
import { listLanguages, registerLanguage } from 'lowlight/lib/core'
import { emojiSearch } from '@nextcloud/vue/dist/Functions/emoji'
@ -83,6 +83,7 @@ const createEditor = ({ content, onCreate, onUpdate, extensions, enableRichEditi
Markdown,
Document,
Paragraph,
HardBreak,
Heading,
Strong,
Italic,

Просмотреть файл

@ -0,0 +1,37 @@
/*
* @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import TipTapHardBreak from '@tiptap/extension-hard-break'
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')
return
}
}
},
})
export default HardBreak

Просмотреть файл

@ -21,6 +21,7 @@
*/
import Emoji from './Emoji.js'
import HardBreak from './HardBreak.js'
import Keymap from './Keymap.js'
import UserColor from './UserColor.js'
import Collaboration from './Collaboration.js'
@ -28,6 +29,7 @@ import Markdown from './Markdown.js'
export {
Emoji,
HardBreak,
Keymap,
UserColor,
Collaboration,

Просмотреть файл

@ -58,6 +58,11 @@ describe('Markdown though editor', () => {
expect(markdownThroughEditor('#### Test')).toBe('#### Test')
expect(markdownThroughEditor('##### Test')).toBe('##### Test')
})
test('hard breaks', () => {
expect(markdownThroughEditor('hard \nbreak')).toBe('hard \nbreak')
expect(markdownThroughEditor('hard\\\nbreak')).toBe('hard \nbreak')
expect(markdownThroughEditor('no\nbreak')).toBe('no break')
})
test('inline format', () => {
expect(markdownThroughEditor('**Test**')).toBe('**Test**')
expect(markdownThroughEditor('__Test__')).toBe('__Test__')
@ -131,6 +136,11 @@ describe('Markdown serializer from html', () => {
test('paragraph', () => {
expect(markdownThroughEditorHtml('<p>hello</p><p>world</p>')).toBe('hello\n\nworld')
})
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')
})
test('links', () => {
expect(markdownThroughEditorHtml('<a href="foo">test</a>')).toBe('[test](foo)')
})