fix: add attributes to pre tag instead of code tag by default, fix #2440

This commit is contained in:
Philipp Kühn
2022-01-26 09:32:29 +01:00
parent d634f4d9fd
commit 85fcc29ac6
2 changed files with 28 additions and 30 deletions

View File

@@ -25,26 +25,20 @@ export function injectExtensionAttributesToParseRule(parseRule: ParseRule, exten
return false
}
const newAttributes = extensionAttributes
.filter(item => item.attribute.rendered)
.reduce((items, item) => {
const value = item.attribute.parseHTML
? item.attribute.parseHTML(node as HTMLElement)
: fromString((node as HTMLElement).getAttribute(item.name))
const newAttributes = extensionAttributes.reduce((items, item) => {
const value = item.attribute.parseHTML
? item.attribute.parseHTML(node as HTMLElement)
: fromString((node as HTMLElement).getAttribute(item.name))
if (isObject(value)) {
console.warn(`[tiptap warn]: BREAKING CHANGE: "parseHTML" for your attribute "${item.name}" returns an object but should return the value itself. If this is expected you can ignore this message. This warning will be removed in one of the next releases. Further information: https://github.com/ueberdosis/tiptap/issues/1863`)
}
if (value === null || value === undefined) {
return items
}
if (value === null || value === undefined) {
return items
}
return {
...items,
[item.name]: value,
}
}, {})
return {
...items,
[item.name]: value,
}
}, {})
return { ...oldAttributes, ...newAttributes }
},

View File

@@ -1,4 +1,4 @@
import { Node, textblockTypeInputRule } from '@tiptap/core'
import { Node, textblockTypeInputRule, mergeAttributes } from '@tiptap/core'
import { Plugin, PluginKey, TextSelection } from 'prosemirror-state'
export interface CodeBlockOptions {
@@ -81,15 +81,7 @@ export const CodeBlock = Node.create<CodeBlockOptions>({
return language
},
renderHTML: attributes => {
if (!attributes.language) {
return null
}
return {
class: this.options.languageClassPrefix + attributes.language,
}
},
rendered: false,
},
}
},
@@ -103,8 +95,20 @@ export const CodeBlock = Node.create<CodeBlockOptions>({
]
},
renderHTML({ HTMLAttributes }) {
return ['pre', this.options.HTMLAttributes, ['code', HTMLAttributes, 0]]
renderHTML({ node, HTMLAttributes }) {
return [
'pre',
mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),
[
'code',
{
class: node.attrs.language
? this.options.languageClassPrefix + node.attrs.language
: null,
},
0,
],
]
},
addCommands() {