remove link extension
This commit is contained in:
@@ -1,21 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import cx from "classnames"
|
|
||||||
import type {NodeViewProps} from "@tiptap/core"
|
|
||||||
import {NodeViewWrapper} from "svelte-tiptap"
|
|
||||||
import {displayUrl} from "@welshman/lib"
|
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
|
||||||
import Link from "@lib/components/Link.svelte"
|
|
||||||
|
|
||||||
export let node: NodeViewProps["node"]
|
|
||||||
export let selected: NodeViewProps["selected"]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<NodeViewWrapper class="inline-block">
|
|
||||||
<Link
|
|
||||||
external
|
|
||||||
href={node.attrs.url}
|
|
||||||
class={cx("link-content", {"link-content-selected": selected})}>
|
|
||||||
<Icon icon="link-round" size={3} class="inline-block" />
|
|
||||||
{displayUrl(node.attrs.url)}
|
|
||||||
</Link>
|
|
||||||
</NodeViewWrapper>
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
import {last} from "@welshman/lib"
|
|
||||||
import {Node, InputRule, nodePasteRule} from "@tiptap/core"
|
|
||||||
import type {Node as ProsemirrorNode} from "@tiptap/pm/model"
|
|
||||||
import type {MarkdownSerializerState} from "prosemirror-markdown"
|
|
||||||
import {createPasteRuleMatch} from "./util"
|
|
||||||
|
|
||||||
export const LINK_REGEX = /([a-z\+:]{2,30}:\/\/)?[^<>\(\)\s]+\.[a-z]{2,6}[^\s<>"'\.!?,:\)\(]*/gi
|
|
||||||
|
|
||||||
export interface LinkAttributes {
|
|
||||||
url: string
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module "@tiptap/core" {
|
|
||||||
interface Commands<ReturnType> {
|
|
||||||
inlineLink: {
|
|
||||||
insertLink: (options: {url: string}) => ReturnType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const LinkExtension = Node.create({
|
|
||||||
atom: true,
|
|
||||||
name: "inlineLink",
|
|
||||||
group: "inline",
|
|
||||||
inline: true,
|
|
||||||
selectable: true,
|
|
||||||
draggable: true,
|
|
||||||
priority: 1000,
|
|
||||||
addAttributes() {
|
|
||||||
return {
|
|
||||||
url: {default: null},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
renderHTML(props) {
|
|
||||||
return ["div", {"data-url": props.node.attrs.url}]
|
|
||||||
},
|
|
||||||
renderText(props) {
|
|
||||||
return props.node.attrs.url
|
|
||||||
},
|
|
||||||
addStorage() {
|
|
||||||
return {
|
|
||||||
markdown: {
|
|
||||||
serialize(state: MarkdownSerializerState, node: ProsemirrorNode) {
|
|
||||||
state.write(node.attrs.url)
|
|
||||||
},
|
|
||||||
parse: {},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
addCommands() {
|
|
||||||
return {
|
|
||||||
insertLink:
|
|
||||||
({url}) =>
|
|
||||||
({commands}) => {
|
|
||||||
return commands.insertContent(
|
|
||||||
{type: this.name, attrs: {url}},
|
|
||||||
{
|
|
||||||
updateSelection: false,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
addInputRules() {
|
|
||||||
return [
|
|
||||||
new InputRule({
|
|
||||||
find: text => {
|
|
||||||
const match = last(Array.from(text.matchAll(LINK_REGEX)))
|
|
||||||
|
|
||||||
if (match && text.length === match.index + match[0].length + 1) {
|
|
||||||
return {
|
|
||||||
index: match.index!,
|
|
||||||
text: match[0],
|
|
||||||
data: {
|
|
||||||
url: match[0],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
},
|
|
||||||
handler: ({state, range, match}) => {
|
|
||||||
const {tr} = state
|
|
||||||
|
|
||||||
if (match[0]) {
|
|
||||||
try {
|
|
||||||
tr.insert(range.from - 1, this.type.create(match.data))
|
|
||||||
.delete(tr.mapping.map(range.from - 1), tr.mapping.map(range.to))
|
|
||||||
.insert(
|
|
||||||
tr.mapping.map(range.to),
|
|
||||||
this.editor.schema.text(last(Array.from(match.input!))),
|
|
||||||
)
|
|
||||||
} catch (e) {
|
|
||||||
// If the node was already linkified, the above code breaks for whatever reason
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tr.scrollIntoView()
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
]
|
|
||||||
},
|
|
||||||
addPasteRules() {
|
|
||||||
return [
|
|
||||||
nodePasteRule({
|
|
||||||
type: this.type,
|
|
||||||
getAttributes: match => match.data,
|
|
||||||
find: text => {
|
|
||||||
const matches = []
|
|
||||||
|
|
||||||
for (const match of text.matchAll(LINK_REGEX)) {
|
|
||||||
try {
|
|
||||||
matches.push(createPasteRuleMatch(match, {url: match[0]}))
|
|
||||||
} catch (e) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return matches
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
]
|
|
||||||
},
|
|
||||||
})
|
|
||||||
@@ -23,13 +23,11 @@ import type {StampedEvent} from "@welshman/util"
|
|||||||
import {signer, profileSearch} from "@welshman/app"
|
import {signer, profileSearch} from "@welshman/app"
|
||||||
import {FileUploadExtension} from "./FileUpload"
|
import {FileUploadExtension} from "./FileUpload"
|
||||||
import {createSuggestions} from "./Suggestions"
|
import {createSuggestions} from "./Suggestions"
|
||||||
// import {LinkExtension} from "./LinkExtension"
|
|
||||||
import EditMention from "./EditMention.svelte"
|
import EditMention from "./EditMention.svelte"
|
||||||
import EditEvent from "./EditEvent.svelte"
|
import EditEvent from "./EditEvent.svelte"
|
||||||
import EditImage from "./EditImage.svelte"
|
import EditImage from "./EditImage.svelte"
|
||||||
import EditBolt11 from "./EditBolt11.svelte"
|
import EditBolt11 from "./EditBolt11.svelte"
|
||||||
import EditVideo from "./EditVideo.svelte"
|
import EditVideo from "./EditVideo.svelte"
|
||||||
import EditLink from "./EditLink.svelte"
|
|
||||||
import Suggestions from "./Suggestions.svelte"
|
import Suggestions from "./Suggestions.svelte"
|
||||||
import SuggestionProfile from "./SuggestionProfile.svelte"
|
import SuggestionProfile from "./SuggestionProfile.svelte"
|
||||||
import {asInline} from "./util"
|
import {asInline} from "./util"
|
||||||
@@ -37,13 +35,11 @@ import {getSetting} from "@app/state"
|
|||||||
|
|
||||||
export {
|
export {
|
||||||
createSuggestions,
|
createSuggestions,
|
||||||
// LinkExtension,
|
|
||||||
EditMention,
|
EditMention,
|
||||||
EditEvent,
|
EditEvent,
|
||||||
EditImage,
|
EditImage,
|
||||||
EditBolt11,
|
EditBolt11,
|
||||||
EditVideo,
|
EditVideo,
|
||||||
EditLink,
|
|
||||||
Suggestions,
|
Suggestions,
|
||||||
SuggestionProfile,
|
SuggestionProfile,
|
||||||
}
|
}
|
||||||
@@ -108,7 +104,6 @@ export const getEditorOptions = ({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
// LinkExtension.extend({addNodeView: () => SvelteNodeViewRenderer(EditLink)}),
|
|
||||||
Bolt11Extension.extend(asInline({addNodeView: () => SvelteNodeViewRenderer(EditBolt11)})),
|
Bolt11Extension.extend(asInline({addNodeView: () => SvelteNodeViewRenderer(EditBolt11)})),
|
||||||
NProfileExtension.extend({
|
NProfileExtension.extend({
|
||||||
addNodeView: () => SvelteNodeViewRenderer(EditMention),
|
addNodeView: () => SvelteNodeViewRenderer(EditMention),
|
||||||
|
|||||||
Reference in New Issue
Block a user