fix: fix a bug that messed up pasted link attributes, fix #1284
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
import { Plugin, PluginKey } from 'prosemirror-state'
|
import { Plugin, PluginKey } from 'prosemirror-state'
|
||||||
import { Slice, Fragment, MarkType } from 'prosemirror-model'
|
import { Slice, Fragment, MarkType } from 'prosemirror-model'
|
||||||
|
|
||||||
export default function (regexp: RegExp, type: MarkType, getAttrs?: (match: any) => any): Plugin {
|
export default function (
|
||||||
|
regexp: RegExp,
|
||||||
|
type: MarkType,
|
||||||
|
getAttributes?: Record<string, any> | ((match: RegExpExecArray) => Record<string, any>),
|
||||||
|
): Plugin {
|
||||||
const handler = (fragment: Fragment, parent?: any) => {
|
const handler = (fragment: Fragment, parent?: any) => {
|
||||||
const nodes: any[] = []
|
const nodes: any[] = []
|
||||||
|
|
||||||
@@ -22,7 +26,9 @@ export default function (regexp: RegExp, type: MarkType, getAttrs?: (match: any)
|
|||||||
const matchEnd = matchStart + match[outerMatch].length
|
const matchEnd = matchStart + match[outerMatch].length
|
||||||
const textStart = matchStart + match[outerMatch].lastIndexOf(match[innerMatch])
|
const textStart = matchStart + match[outerMatch].lastIndexOf(match[innerMatch])
|
||||||
const textEnd = textStart + match[innerMatch].length
|
const textEnd = textStart + match[innerMatch].length
|
||||||
const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs
|
const attrs = getAttributes instanceof Function
|
||||||
|
? getAttributes(match)
|
||||||
|
: getAttributes
|
||||||
|
|
||||||
// adding text before markdown to nodes
|
// adding text before markdown to nodes
|
||||||
if (matchStart > 0) {
|
if (matchStart > 0) {
|
||||||
|
|||||||
@@ -40,8 +40,14 @@ declare module '@tiptap/core' {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A regex that matches any string that contains a link
|
||||||
|
*/
|
||||||
export const pasteRegex = /https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}\b(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)/gi
|
export const pasteRegex = /https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}\b(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)/gi
|
||||||
export const pasteRegexWithBrackets = /(?:\()https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}\b(?:[-a-zA-Z0-9@:%._+~#=?!&/()]*)(?:\))/gi
|
|
||||||
|
/**
|
||||||
|
* A regex that matches an url
|
||||||
|
*/
|
||||||
export const pasteRegexExact = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}\b(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)$/gi
|
export const pasteRegexExact = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}\b(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)$/gi
|
||||||
|
|
||||||
export const Link = Mark.create<LinkOptions>({
|
export const Link = Mark.create<LinkOptions>({
|
||||||
@@ -97,8 +103,7 @@ export const Link = Mark.create<LinkOptions>({
|
|||||||
|
|
||||||
addPasteRules() {
|
addPasteRules() {
|
||||||
return [
|
return [
|
||||||
markPasteRule(pasteRegex, this.type, (url: string) => ({ href: url })),
|
markPasteRule(pasteRegex, this.type, match => ({ href: match[0] })),
|
||||||
markPasteRule(pasteRegexWithBrackets, this.type, (url: string) => ({ href: url })),
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user