refactor link extension
This commit is contained in:
@@ -18,3 +18,4 @@ export { default as getSchema } from './src/utils/getSchema'
|
|||||||
export { default as generateHtml } from './src/utils/generateHtml'
|
export { default as generateHtml } from './src/utils/generateHtml'
|
||||||
export { default as getHtmlFromFragment } from './src/utils/getHtmlFromFragment'
|
export { default as getHtmlFromFragment } from './src/utils/getHtmlFromFragment'
|
||||||
export { default as getMarkAttrs } from './src/utils/getMarkAttrs'
|
export { default as getMarkAttrs } from './src/utils/getMarkAttrs'
|
||||||
|
export { default as mergeAttributes } from './src/utils/mergeAttributes'
|
||||||
|
|||||||
@@ -1,23 +1,25 @@
|
|||||||
import { AnyObject } from '../types'
|
import { AnyObject } from '../types'
|
||||||
|
|
||||||
export default function mergeAttributes(attributes1: AnyObject, attributes2: AnyObject) {
|
export default function mergeAttributes(...object: AnyObject[]) {
|
||||||
const mergedAttributes = { ...attributes1 }
|
return object.reduce((items, item) => {
|
||||||
|
const mergedAttributes = { ...items }
|
||||||
|
|
||||||
Object.entries(attributes2).forEach(([key, value]) => {
|
Object.entries(item).forEach(([key, value]) => {
|
||||||
if (!mergedAttributes[key]) {
|
if (!mergedAttributes[key]) {
|
||||||
mergedAttributes[key] = value
|
mergedAttributes[key] = value
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key === 'class') {
|
if (key === 'class') {
|
||||||
mergedAttributes[key] = [mergedAttributes[key], value].join(' ')
|
mergedAttributes[key] = [mergedAttributes[key], value].join(' ')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key === 'style') {
|
if (key === 'style') {
|
||||||
mergedAttributes[key] = [mergedAttributes[key], value].join('; ')
|
mergedAttributes[key] = [mergedAttributes[key], value].join('; ')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return mergedAttributes
|
return mergedAttributes
|
||||||
|
}, {})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import { Command, createMark, markPasteRule } from '@tiptap/core'
|
import {
|
||||||
|
Command, createMark, markPasteRule, mergeAttributes,
|
||||||
|
} from '@tiptap/core'
|
||||||
import { Plugin, PluginKey } from 'prosemirror-state'
|
import { Plugin, PluginKey } from 'prosemirror-state'
|
||||||
|
|
||||||
export interface LinkOptions {
|
export interface LinkOptions {
|
||||||
@@ -24,34 +26,31 @@ const Link = createMark({
|
|||||||
return {
|
return {
|
||||||
href: {
|
href: {
|
||||||
default: null,
|
default: null,
|
||||||
rendered: false,
|
renderHTML: attributes => ({
|
||||||
|
href: attributes.href,
|
||||||
|
}),
|
||||||
|
parseHTML: node => ({
|
||||||
|
href: node.getAttribute('href'),
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
target: {
|
target: {
|
||||||
default: null,
|
default: this.options.target,
|
||||||
rendered: false,
|
renderHTML: attributes => ({
|
||||||
|
target: attributes.target,
|
||||||
|
}),
|
||||||
|
parseHTML: node => ({
|
||||||
|
target: node.getAttribute('target'),
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
parseHTML() {
|
parseHTML() {
|
||||||
return [
|
return [{ tag: 'a[href]' }]
|
||||||
{
|
|
||||||
tag: 'a[href]',
|
|
||||||
getAttrs: node => ({
|
|
||||||
href: (node as HTMLElement).getAttribute('href'),
|
|
||||||
target: (node as HTMLElement).getAttribute('target'),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
|
|
||||||
renderHTML({ mark, attributes }) {
|
renderHTML({ attributes }) {
|
||||||
return ['a', {
|
return ['a', mergeAttributes(attributes, { rel: this.options.rel }), 0]
|
||||||
...attributes,
|
|
||||||
...mark.attrs,
|
|
||||||
rel: this.options.rel,
|
|
||||||
target: mark.attrs.target ? mark.attrs.target : this.options.target,
|
|
||||||
}, 0]
|
|
||||||
},
|
},
|
||||||
|
|
||||||
addCommands() {
|
addCommands() {
|
||||||
|
|||||||
Reference in New Issue
Block a user