@docs.plus/extension-hyperlink 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/tippyHelper.d.ts +24 -14
- package/dist/index.cjs +110 -104
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +110 -104
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +111 -105
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/helpers/clickHandler.ts +14 -7
- package/src/helpers/tippyHelper.ts +112 -100
- package/src/index.ts +2 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tiptap/core'), require('linkifyjs'), require('@tiptap/pm/state'), require('tippy.js')) :
|
|
3
3
|
typeof define === 'function' && define.amd ? define(['exports', '@tiptap/core', 'linkifyjs', '@tiptap/pm/state', 'tippy.js'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["@docs"] = global["@docs"] || {}, global["@docs"]["plus/extension-hyperlink"] = {}), global.core, global.linkifyjs, global.state, global.tippy));
|
|
5
5
|
})(this, (function (exports, core, linkifyjs, state, tippy) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function autoHyperlink(options) {
|
|
@@ -102,121 +102,120 @@
|
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
105
|
+
class Tooltip {
|
|
106
|
+
constructor(options) {
|
|
107
|
+
this.preventHide = false;
|
|
108
|
+
this.mousedownHandler = () => {
|
|
109
|
+
this.preventHide = true;
|
|
110
|
+
};
|
|
111
|
+
this.dragstartHandler = () => {
|
|
112
|
+
this.hide();
|
|
113
|
+
};
|
|
114
|
+
this.blurHandler = ({ event }) => {
|
|
115
|
+
var _a;
|
|
116
|
+
console.log("blurHandler", { event });
|
|
117
|
+
if (this.preventHide) {
|
|
118
|
+
this.preventHide = false;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if ((event === null || event === void 0 ? void 0 : event.relatedTarget) &&
|
|
122
|
+
((_a = this.tippyWrapper.parentNode) === null || _a === void 0 ? void 0 : _a.contains(event.relatedTarget))) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.hide();
|
|
126
|
+
};
|
|
127
|
+
this.tippyBlurHandler = (event) => {
|
|
128
|
+
this.blurHandler({ event });
|
|
129
|
+
};
|
|
130
|
+
this.editor = options.editor;
|
|
131
|
+
this.view = options.view;
|
|
132
|
+
this.tippyWrapper = document.createElement("div");
|
|
133
|
+
this.tippyWrapper.addEventListener("mousedown", this.mousedownHandler, {
|
|
116
134
|
capture: true,
|
|
117
135
|
});
|
|
118
|
-
view.dom.addEventListener("dragstart", dragstartHandler);
|
|
119
|
-
editor.on("
|
|
120
|
-
editor.on("blur", blurHandler);
|
|
136
|
+
this.view.dom.addEventListener("dragstart", this.dragstartHandler);
|
|
137
|
+
this.editor.on("blur", this.blurHandler);
|
|
121
138
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
tippyInstance === null || tippyInstance === void 0 ? void 0 : tippyInstance.show();
|
|
126
|
-
return true;
|
|
127
|
-
};
|
|
128
|
-
const hide = () => {
|
|
129
|
-
setTimeout(() => tippyInstance === null || tippyInstance === void 0 ? void 0 : tippyInstance.hide());
|
|
130
|
-
return false;
|
|
131
|
-
};
|
|
132
|
-
const mousedownHandler = () => {
|
|
133
|
-
preventHide = true;
|
|
134
|
-
};
|
|
135
|
-
const dragstartHandler = () => {
|
|
136
|
-
hide();
|
|
137
|
-
};
|
|
138
|
-
const focusHandler = () => {
|
|
139
|
-
setTimeout(() => update(editor.view));
|
|
140
|
-
};
|
|
141
|
-
const blurHandler = ({ event }) => {
|
|
142
|
-
var _a;
|
|
143
|
-
if (preventHide) {
|
|
144
|
-
preventHide = false;
|
|
145
|
-
return;
|
|
139
|
+
init() {
|
|
140
|
+
this.tippyWrapper.innerHTML = "";
|
|
141
|
+
return { tippyModal: this.tippyWrapper, tippyInstance: this.tippyInstance };
|
|
146
142
|
}
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
show() {
|
|
144
|
+
var _a;
|
|
145
|
+
(_a = this.tippyInstance) === null || _a === void 0 ? void 0 : _a.show();
|
|
146
|
+
return true;
|
|
149
147
|
}
|
|
150
|
-
hide()
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
blurHandler({ event });
|
|
154
|
-
};
|
|
155
|
-
const createTooltip = () => {
|
|
156
|
-
if (!editor || !editor.options)
|
|
157
|
-
return;
|
|
158
|
-
const { element: editorElement } = editor.options;
|
|
159
|
-
const editorIsAttached = !!editorElement.parentElement;
|
|
160
|
-
if (tippyInstance || !editorIsAttached) {
|
|
161
|
-
return;
|
|
148
|
+
hide() {
|
|
149
|
+
setTimeout(() => { var _a; return (_a = this.tippyInstance) === null || _a === void 0 ? void 0 : _a.hide(); });
|
|
150
|
+
return false;
|
|
162
151
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
return core.posToDOMRect(view, pos, pos);
|
|
152
|
+
createTooltip() {
|
|
153
|
+
if (!this.editor || !this.editor.options)
|
|
154
|
+
return;
|
|
155
|
+
const { element: editorElement } = this.editor.options;
|
|
156
|
+
const editorIsAttached = !!editorElement.parentElement;
|
|
157
|
+
if (this.tippyInstance || !editorIsAttached) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.tippyInstance = tippy(editorElement, {
|
|
161
|
+
duration: 0,
|
|
162
|
+
getReferenceClientRect: null,
|
|
163
|
+
content: this.tippyWrapper,
|
|
164
|
+
interactive: true,
|
|
165
|
+
trigger: "manual",
|
|
166
|
+
placement: "bottom",
|
|
167
|
+
hideOnClick: "toggle",
|
|
168
|
+
onClickOutside: (instance, event) => {
|
|
169
|
+
console.log("onClickOutside", { instance, event });
|
|
170
|
+
this.hide();
|
|
171
|
+
},
|
|
172
|
+
onAfterUpdate: (instance, partialProps) => {
|
|
173
|
+
console.log("onAfterUpdate", { instance, partialProps });
|
|
174
|
+
this.show();
|
|
187
175
|
},
|
|
188
176
|
});
|
|
189
|
-
|
|
177
|
+
if (this.tippyInstance.popper.firstChild) {
|
|
178
|
+
this.tippyInstance.popper.firstChild.addEventListener("blur", this.tippyBlurHandler);
|
|
179
|
+
}
|
|
190
180
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
tippyInstance
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
181
|
+
update(view, option = {}) {
|
|
182
|
+
var _a;
|
|
183
|
+
this.createTooltip();
|
|
184
|
+
option.arrow = (_a = option === null || option === void 0 ? void 0 : option.arrow) !== null && _a !== void 0 ? _a : false;
|
|
185
|
+
if (this.tippyInstance) {
|
|
186
|
+
this.tippyInstance.setProps({
|
|
187
|
+
...option,
|
|
188
|
+
getReferenceClientRect: () => {
|
|
189
|
+
const pos = view.state.selection.from;
|
|
190
|
+
return core.posToDOMRect(view, pos, pos);
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return {};
|
|
203
195
|
}
|
|
204
|
-
|
|
196
|
+
destroyTooltip() {
|
|
197
|
+
if (this.tippyInstance) {
|
|
198
|
+
this.tippyInstance.destroy();
|
|
199
|
+
this.tippyInstance = undefined;
|
|
200
|
+
this.tippyWrapper.removeEventListener("mousedown", this.mousedownHandler, {
|
|
201
|
+
capture: true,
|
|
202
|
+
});
|
|
203
|
+
this.view.dom.removeEventListener("dragstart", this.dragstartHandler);
|
|
204
|
+
this.editor.off("blur", this.blurHandler);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
205
208
|
|
|
206
209
|
var tippyHelper = /*#__PURE__*/Object.freeze({
|
|
207
210
|
__proto__: null,
|
|
208
|
-
|
|
209
|
-
dragstartHandler: dragstartHandler,
|
|
210
|
-
focusHandler: focusHandler,
|
|
211
|
-
hide: hide,
|
|
212
|
-
init: init,
|
|
213
|
-
mousedownHandler: mousedownHandler,
|
|
214
|
-
show: show,
|
|
215
|
-
update: update
|
|
211
|
+
default: Tooltip
|
|
216
212
|
});
|
|
217
213
|
|
|
218
214
|
function clickHandler(options) {
|
|
219
|
-
|
|
215
|
+
// Create the tooltip instance
|
|
216
|
+
let tooltip = new Tooltip(options);
|
|
217
|
+
// Initialize the tooltip
|
|
218
|
+
let { tippyModal, tippyInstance } = tooltip.init();
|
|
220
219
|
return new state.Plugin({
|
|
221
220
|
key: new state.PluginKey("handleClickHyperlink"),
|
|
222
221
|
props: {
|
|
@@ -224,6 +223,11 @@
|
|
|
224
223
|
var _a, _b;
|
|
225
224
|
if (event.button !== 0)
|
|
226
225
|
return false;
|
|
226
|
+
console.log({
|
|
227
|
+
event,
|
|
228
|
+
button: event.button,
|
|
229
|
+
target: event.target,
|
|
230
|
+
});
|
|
227
231
|
// Get the target HTML element and its position
|
|
228
232
|
const nodeTarget = event.target;
|
|
229
233
|
const nodePos = view.posAtDOM(nodeTarget, 0);
|
|
@@ -243,7 +247,7 @@
|
|
|
243
247
|
}
|
|
244
248
|
// if the link does not contain href attribute, hide the tooltip
|
|
245
249
|
if (!(link === null || link === void 0 ? void 0 : link.href))
|
|
246
|
-
return hide();
|
|
250
|
+
return tooltip.hide();
|
|
247
251
|
// Create a preview of the hyperlink
|
|
248
252
|
const hyperlinkPreview = options.modals.previewHyperlink({
|
|
249
253
|
link,
|
|
@@ -252,12 +256,14 @@
|
|
|
252
256
|
});
|
|
253
257
|
// If there is no hyperlink preview, hide the modal
|
|
254
258
|
if (!hyperlinkPreview)
|
|
255
|
-
return hide();
|
|
259
|
+
return tooltip.hide();
|
|
256
260
|
// Empty the modal and append the hyperlink preview box
|
|
257
|
-
tippyModal.
|
|
261
|
+
while (tippyModal.firstChild) {
|
|
262
|
+
tippyModal.removeChild(tippyModal.firstChild);
|
|
263
|
+
}
|
|
258
264
|
tippyModal.append(hyperlinkPreview);
|
|
259
265
|
// Update the modal position
|
|
260
|
-
update(options.view);
|
|
266
|
+
tooltip.update(options.view);
|
|
261
267
|
return false;
|
|
262
268
|
},
|
|
263
269
|
},
|
|
@@ -488,8 +494,8 @@
|
|
|
488
494
|
});
|
|
489
495
|
|
|
490
496
|
exports.Hyperlink = Hyperlink;
|
|
497
|
+
exports.Tooltip = tippyHelper;
|
|
491
498
|
exports.default = Hyperlink;
|
|
492
|
-
exports.tippy = tippyHelper;
|
|
493
499
|
|
|
494
500
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
495
501
|
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/helpers/autoHyperlink.ts","../src/helpers/tippyHelper.ts","../src/helpers/clickHandler.ts","../src/helpers/pasteHandler.ts","../src/helpers/editHyperlink.ts","../src/hyperlink.ts"],"sourcesContent":["import {\n combineTransactionSteps,\n findChildrenInRange,\n getChangedRanges,\n getMarksBetween,\n NodeWithPos,\n} from \"@tiptap/core\";\nimport { MarkType } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { find, test } from \"linkifyjs\";\n\ntype AutoHyperlinkOptions = {\n type: MarkType;\n validate?: (url: string) => boolean;\n};\n\nexport default function autoHyperlink(options: AutoHyperlinkOptions): Plugin {\n return new Plugin({\n key: new PluginKey(\"autoHyperlink\"),\n appendTransaction: (transactions, oldState, newState) => {\n const docChanges =\n transactions.some((transaction) => transaction.docChanged) &&\n !oldState.doc.eq(newState.doc);\n const preventAutoHyperlink = transactions.some((transaction) =>\n transaction.getMeta(\"preventAutoHyperlink\")\n );\n\n if (!docChanges || preventAutoHyperlink) {\n return;\n }\n\n const { tr } = newState;\n const transform = combineTransactionSteps(oldState.doc, [\n ...transactions,\n ]);\n const { mapping } = transform;\n const changes = getChangedRanges(transform);\n\n changes.forEach(({ oldRange, newRange }) => {\n // at first we check if we have to remove links\n getMarksBetween(oldRange.from, oldRange.to, oldState.doc)\n .filter((item) => item.mark.type === options.type)\n .forEach((oldMark) => {\n const newFrom = mapping.map(oldMark.from);\n const newTo = mapping.map(oldMark.to);\n const newMarks = getMarksBetween(\n newFrom,\n newTo,\n newState.doc\n ).filter((item) => item.mark.type === options.type);\n\n if (!newMarks.length) {\n return;\n }\n\n const newMark = newMarks[0];\n const oldLinkText = oldState.doc.textBetween(\n oldMark.from,\n oldMark.to,\n undefined,\n \" \"\n );\n const newLinkText = newState.doc.textBetween(\n newMark.from,\n newMark.to,\n undefined,\n \" \"\n );\n const wasLink = test(oldLinkText);\n const isLink = test(newLinkText);\n\n // remove only the link, if it was a link before too\n // because we don’t want to remove links that were set manually\n if (wasLink && !isLink) {\n tr.removeMark(newMark.from, newMark.to, options.type);\n }\n });\n\n // now let’s see if we can add new links\n const nodesInChangedRanges = findChildrenInRange(\n newState.doc,\n newRange,\n (node) => node.isTextblock\n );\n\n let textBlock: NodeWithPos | undefined;\n let textBeforeWhitespace: string | undefined;\n\n if (nodesInChangedRanges.length > 1) {\n // Grab the first node within the changed ranges (ex. the first of two paragraphs when hitting enter)\n textBlock = nodesInChangedRanges[0];\n textBeforeWhitespace = newState.doc.textBetween(\n textBlock.pos,\n textBlock.pos + textBlock.node.nodeSize,\n undefined,\n \" \"\n );\n } else if (\n nodesInChangedRanges.length &&\n // We want to make sure to include the block seperator argument to treat hard breaks like spaces\n newState.doc\n .textBetween(newRange.from, newRange.to, \" \", \" \")\n .endsWith(\" \")\n ) {\n textBlock = nodesInChangedRanges[0];\n textBeforeWhitespace = newState.doc.textBetween(\n textBlock.pos,\n newRange.to,\n undefined,\n \" \"\n );\n }\n\n if (textBlock && textBeforeWhitespace) {\n const wordsBeforeWhitespace = textBeforeWhitespace\n .split(\" \")\n .filter((s) => s !== \"\");\n\n if (wordsBeforeWhitespace.length <= 0) {\n return false;\n }\n\n const lastWordBeforeSpace =\n wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1];\n const lastWordAndBlockOffset =\n textBlock.pos +\n textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace);\n\n if (!lastWordBeforeSpace) {\n return false;\n }\n\n find(lastWordBeforeSpace)\n .filter((link) => link.isLink)\n .filter((link) => {\n if (options.validate) {\n return options.validate(link.value);\n }\n return true;\n })\n // calculate link position\n .map((link) => ({\n ...link,\n from: lastWordAndBlockOffset + link.start + 1,\n to: lastWordAndBlockOffset + link.end + 1,\n }))\n // add link mark\n .forEach((link) => {\n tr.addMark(\n link.from,\n link.to,\n options.type.create({\n href: link.href,\n })\n );\n });\n }\n });\n\n if (!tr.steps.length) {\n return;\n }\n\n return tr;\n },\n });\n}\n","import tippy, { Instance, Props, roundArrow } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { EditorView } from \"@tiptap/pm/view\";\nimport { getAttributes, posToDOMRect } from \"@tiptap/core\";\n\nlet tippyInstance: Instance | undefined;\nlet preventHide: boolean = false;\nlet tippyWrapper: HTMLDivElement;\nlet editor: Editor;\nlet view: EditorView;\n\ntype TippyInitOptions = {\n editor: Editor;\n validate?: (url: string) => boolean;\n view: EditorView;\n};\n\nexport const init = (options: TippyInitOptions) => {\n editor = options.editor;\n view = options.view;\n if (!tippyInstance) {\n tippyWrapper = document.createElement(\"div\");\n tippyWrapper.addEventListener(\"mousedown\", mousedownHandler, {\n capture: true,\n });\n view.dom.addEventListener(\"dragstart\", dragstartHandler);\n editor.on(\"focus\", focusHandler);\n editor.on(\"blur\", blurHandler);\n }\n\n return { tippyModal: tippyWrapper, tippyInstance: tippyInstance };\n};\n\nexport const show = () => {\n tippyInstance?.show();\n return true;\n};\n\nexport const hide = () => {\n setTimeout(() => tippyInstance?.hide());\n return false;\n};\n\nexport const mousedownHandler = () => {\n preventHide = true;\n};\n\nexport const dragstartHandler = () => {\n hide();\n};\n\nexport const focusHandler = () => {\n setTimeout(() => update(editor.view));\n};\n\nconst blurHandler = ({ event }: { event: FocusEvent }) => {\n if (preventHide) {\n preventHide = false;\n return;\n }\n if (event?.relatedTarget && tippyWrapper.parentNode?.contains(event.relatedTarget as Node)) {\n return;\n }\n hide();\n};\n\nconst tippyBlurHandler = (event: FocusEvent) => {\n blurHandler({ event });\n};\n\nconst createTooltip = () => {\n if (!editor || !editor.options) return;\n const { element: editorElement } = editor.options;\n const editorIsAttached = !!editorElement.parentElement;\n\n if (tippyInstance || !editorIsAttached) {\n return;\n }\n\n tippyInstance = tippy(editorElement, {\n duration: 0,\n getReferenceClientRect: null,\n content: tippyWrapper,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom\",\n hideOnClick: \"toggle\",\n });\n\n if (tippyInstance.popper.firstChild) {\n (tippyInstance.popper.firstChild as HTMLElement).addEventListener(\"blur\", tippyBlurHandler);\n }\n};\n\nexport const update = (view: EditorView, option: any = {}) => {\n createTooltip();\n\n // Ensure 'arrow' is false when not provided\n option.arrow = option?.arrow ?? false;\n\n if (tippyInstance) {\n tippyInstance.setProps({\n ...option,\n getReferenceClientRect: () => {\n const pos = view.state.selection.from;\n return posToDOMRect(view, pos, pos);\n },\n });\n show();\n }\n\n return {};\n};\n\nexport const destroyTooltip = () => {\n if (tippyInstance) {\n tippyInstance.destroy();\n tippyInstance = undefined;\n tippyWrapper.removeEventListener(\"mousedown\", mousedownHandler, {\n capture: true,\n });\n view.dom.removeEventListener(\"dragstart\", dragstartHandler);\n editor.off(\"focus\", focusHandler);\n editor.off(\"blur\", blurHandler);\n }\n};\n","import { getAttributes } from \"@tiptap/core\";\nimport { MarkType } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Editor } from \"@tiptap/core\";\nimport { EditorView } from \"@tiptap/pm/view\";\nimport * as tippy from \"./tippyHelper\";\n// import \"tippy.js/dist/svg-arrow.css\";\n\n// Define type for the ClickHandlerOptions\ntype ClickHandlerOptions = {\n type: MarkType;\n editor: Editor;\n validate?: (url: string) => boolean;\n view: EditorView;\n modals: {\n previewHyperlink?: ((options: any) => HTMLElement) | null;\n setHyperlink?: ((options: any) => HTMLElement) | null;\n };\n};\n\nexport default function clickHandler(options: ClickHandlerOptions): Plugin {\n const { tippyModal } = tippy.init(options);\n\n return new Plugin({\n key: new PluginKey(\"handleClickHyperlink\"),\n props: {\n handleClick: (view, pos, event) => {\n if (event.button !== 0) return false;\n\n // Get the target HTML element and its position\n const nodeTarget: HTMLElement = event.target as HTMLElement;\n const nodePos = view.posAtDOM(nodeTarget, 0);\n\n // Find the closest link element to the target element\n const link = nodeTarget?.closest(\"a\");\n\n // Extract attributes from the state\n const attrs = getAttributes(view.state, options.type.name);\n\n // Extract href and target attributes from the link element or the state\n const href = link?.href ?? attrs.href;\n const target = link?.target ?? attrs.target;\n\n // If there is no previewHyperlink modal provided, then open the link in new window\n if (!options.modals.previewHyperlink) {\n if (link && href) {\n window.open(href, target);\n }\n return true;\n }\n\n // if the link does not contain href attribute, hide the tooltip\n if (!link?.href) return tippy.hide();\n\n // Create a preview of the hyperlink\n const hyperlinkPreview = options.modals.previewHyperlink({\n link,\n nodePos,\n ...options,\n });\n\n // If there is no hyperlink preview, hide the modal\n if (!hyperlinkPreview) return tippy.hide();\n\n // Empty the modal and append the hyperlink preview box\n tippyModal.innerHTML = \"\";\n tippyModal.append(hyperlinkPreview);\n\n // Update the modal position\n tippy.update(options.view);\n\n return false;\n },\n },\n });\n}\n","import { Editor } from \"@tiptap/core\";\nimport { MarkType } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { find } from \"linkifyjs\";\n\ntype PasteHandlerOptions = {\n editor: Editor;\n type: MarkType;\n};\n\nexport function pasteHandler(options: PasteHandlerOptions): Plugin {\n return new Plugin({\n key: new PluginKey(\"handlePasteHyperlink\"),\n props: {\n handlePaste: (view, event, slice) => {\n const { state } = view;\n const { selection } = state;\n const { empty } = selection;\n\n if (empty) {\n return false;\n }\n\n let textContent = \"\";\n\n slice.content.forEach((node) => {\n textContent += node.textContent;\n });\n\n const link = find(textContent).find(\n (item) => item.isLink && item.value === textContent\n );\n\n if (!textContent || !link) {\n return false;\n }\n\n options.editor.commands.setMark(options.type, {\n href: link.href,\n });\n\n return true;\n },\n },\n });\n}\n","import { Editor } from \"@tiptap/core\";\nimport { find } from \"linkifyjs\";\n\ntype EditHyperlinkOptions = {\n editor: Editor;\n validate?: (url: string) => boolean;\n newURL?: string;\n newText?: string;\n};\n\nexport default function editHyperlink(options: EditHyperlinkOptions) {\n const { state, dispatch } = options.editor.view;\n const { from, to } = state.selection;\n let link: HTMLAnchorElement | null = null;\n\n const selectedNode = options.editor.view.domAtPos(from - 1)\n .node as HTMLElement;\n\n if (selectedNode?.nodeName === \"#text\") {\n link = (selectedNode.parentNode as HTMLElement)?.closest(\"a\");\n } else {\n link = selectedNode?.closest(\"a\");\n }\n\n if (!link) return true;\n\n const text = options.newText || link?.innerText;\n // Get the position of the link in the editor view\n const nodePos = options.editor.view.posAtDOM(link, 0);\n\n const sanitizeURL = find(options.newURL || link.href)\n .filter((link) => link.isLink)\n .filter((link) => (options.validate ? options.validate(link.value) : true))\n .at(0);\n\n return options.editor\n .chain()\n .focus()\n .command(({ tr }) => {\n // The command replaces the range from nodePos to nodePos + length of the text\n // with a new text node with the provided text and a link mark with the sanitized URL\n tr.replaceWith(\n nodePos,\n nodePos + text?.length,\n options.editor.schema.text(text, [\n options.editor.schema.marks.hyperlink.create({\n href: sanitizeURL?.href,\n }),\n ])\n );\n\n return true;\n })\n .run();\n}\n","import { Mark, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { find, registerCustomProtocol, reset } from \"linkifyjs\";\nimport autoHyperlink from \"./helpers/autoHyperlink\";\nimport clickHandler from \"./helpers/clickHandler\";\nimport { pasteHandler } from \"./helpers/pasteHandler\";\nimport editHyperlinkHelper from \"./helpers/editHyperlink\";\n\nexport interface LinkProtocolOptions {\n scheme: string;\n optionalSlashes?: boolean;\n}\n\nexport interface HyperlinkOptions {\n /**\n * If enabled, it adds links as you type.\n */\n autoHyperlink: boolean;\n /**\n * An array of custom protocols to be registered with linkifyjs.\n */\n protocols: Array<LinkProtocolOptions | string>;\n /**\n * If enabled, links will be opened on click.\n */\n openOnClick: boolean;\n /**\n * Adds a link to the current selection if the pasted content only contains an url.\n */\n hyperlinkOnPaste: boolean;\n /**\n * A list of HTML attributes to be rendered.\n */\n HTMLAttributes: Record<string, any>;\n /**\n * A list of modals to be rendered.\n * @default null\n * @example\n */\n modals: {\n previewHyperlink?: ((options: any) => HTMLElement) | null;\n setHyperlink?: ((options: any) => HTMLElement) | null;\n };\n /**\n * A validation function that modifies link verification for the auto linker.\n * @param url - The url to be validated.\n * @returns - True if the url is valid, false otherwise.\n */\n validate?: (url: string) => boolean;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n link: {\n /**\n * Edit the hyperlink's text\n */\n editHyperLinkText: (text: string) => ReturnType;\n\n /**\n * Edit the hyperlink's href value\n */\n editHyperLinkHref: (href: string) => ReturnType;\n\n /**\n * Edit the hyperlink's\n */\n editHyperlink: (attributes?: { newText?: string; newURL?: string }) => ReturnType;\n\n /**\n * Set a hyperlink\n */\n setHyperlink: (attributes?: { href: string; target?: string | null }) => ReturnType;\n\n /**\n * Unset a link mark\n */\n unsetHyperlink: () => ReturnType;\n };\n }\n}\n\nexport const Hyperlink = Mark.create<HyperlinkOptions>({\n name: \"hyperlink\",\n\n priority: 1000,\n\n keepOnSplit: false,\n\n onCreate() {\n this.options.protocols.forEach((protocol) => {\n if (typeof protocol === \"string\") {\n registerCustomProtocol(protocol);\n return;\n }\n registerCustomProtocol(protocol.scheme, protocol.optionalSlashes);\n });\n },\n\n onDestroy() {\n reset();\n },\n\n inclusive() {\n return this.options.autoHyperlink;\n },\n\n addOptions() {\n return {\n openOnClick: true,\n hyperlinkOnPaste: true,\n autoHyperlink: true,\n protocols: [],\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer nofollow\",\n class: null,\n },\n modals: {\n previewHyperlink: null,\n setHyperlink: null,\n },\n validate: undefined,\n };\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n },\n target: {\n default: this.options.HTMLAttributes.target,\n },\n class: {\n default: this.options.HTMLAttributes.class,\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'a[href]:not([href *= \"javascript:\" i])' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"a\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n\n addCommands() {\n return {\n setHyperlink:\n (attributes) =>\n ({ editor, chain }) => {\n if (!this.options.modals.setHyperlink) {\n return chain()\n .setMark(this.name, attributes)\n .setMeta(\"preventAutohyperlink\", true)\n .run();\n } else {\n this.options.modals.setHyperlink({\n editor,\n validate: this.options.validate,\n extentionName: this.name,\n attributes,\n });\n return true;\n }\n },\n\n editHyperlink:\n (attributes) =>\n ({ editor }) => {\n return editHyperlinkHelper({\n ...attributes,\n editor,\n validate: this.options.validate,\n });\n },\n\n editHyperLinkText:\n (newText) =>\n ({ editor }) => {\n return editHyperlinkHelper({\n editor,\n newText,\n validate: this.options.validate,\n });\n },\n\n editHyperLinkHref:\n (newURL) =>\n ({ editor }) => {\n return editHyperlinkHelper({\n editor,\n validate: this.options.validate,\n newURL,\n });\n },\n\n unsetHyperlink:\n () =>\n ({ chain }) => {\n return chain()\n .unsetMark(this.name, { extendEmptyMarkRange: true })\n .setMeta(\"preventAutohyperlink\", true)\n .run();\n },\n };\n },\n\n addPasteRules() {\n return [\n markPasteRule({\n find: (text) =>\n find(text)\n .filter((link) => {\n if (this.options.validate) {\n return this.options.validate(link.value);\n }\n\n return true;\n })\n .filter((link) => link.isLink)\n .map((link) => ({\n text: link.value,\n index: link.start,\n data: link,\n })),\n type: this.type,\n getAttributes: (match) => ({\n href: match.data?.href,\n }),\n }),\n ];\n },\n\n addProseMirrorPlugins() {\n const plugins: Plugin[] = [];\n\n if (this.options.autoHyperlink) {\n plugins.push(\n autoHyperlink({\n type: this.type,\n validate: this.options.validate,\n })\n );\n }\n\n if (this.options.openOnClick) {\n plugins.push(\n clickHandler({\n type: this.type,\n editor: this.editor,\n validate: this.options.validate,\n view: this.editor.view,\n modals: this.options.modals,\n })\n );\n }\n\n if (this.options.hyperlinkOnPaste) {\n plugins.push(\n pasteHandler({\n editor: this.editor,\n type: this.type,\n })\n );\n }\n\n return plugins;\n },\n});\n"],"names":["Plugin","PluginKey","combineTransactionSteps","getChangedRanges","getMarksBetween","test","findChildrenInRange","find","posToDOMRect","tippy.init","getAttributes","tippy.hide","tippy.update","Mark","registerCustomProtocol","reset","mergeAttributes","editHyperlinkHelper","markPasteRule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/helpers/autoHyperlink.ts","../src/helpers/tippyHelper.ts","../src/helpers/clickHandler.ts","../src/helpers/pasteHandler.ts","../src/helpers/editHyperlink.ts","../src/hyperlink.ts"],"sourcesContent":["import {\n combineTransactionSteps,\n findChildrenInRange,\n getChangedRanges,\n getMarksBetween,\n NodeWithPos,\n} from \"@tiptap/core\";\nimport { MarkType } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { find, test } from \"linkifyjs\";\n\ntype AutoHyperlinkOptions = {\n type: MarkType;\n validate?: (url: string) => boolean;\n};\n\nexport default function autoHyperlink(options: AutoHyperlinkOptions): Plugin {\n return new Plugin({\n key: new PluginKey(\"autoHyperlink\"),\n appendTransaction: (transactions, oldState, newState) => {\n const docChanges =\n transactions.some((transaction) => transaction.docChanged) &&\n !oldState.doc.eq(newState.doc);\n const preventAutoHyperlink = transactions.some((transaction) =>\n transaction.getMeta(\"preventAutoHyperlink\")\n );\n\n if (!docChanges || preventAutoHyperlink) {\n return;\n }\n\n const { tr } = newState;\n const transform = combineTransactionSteps(oldState.doc, [\n ...transactions,\n ]);\n const { mapping } = transform;\n const changes = getChangedRanges(transform);\n\n changes.forEach(({ oldRange, newRange }) => {\n // at first we check if we have to remove links\n getMarksBetween(oldRange.from, oldRange.to, oldState.doc)\n .filter((item) => item.mark.type === options.type)\n .forEach((oldMark) => {\n const newFrom = mapping.map(oldMark.from);\n const newTo = mapping.map(oldMark.to);\n const newMarks = getMarksBetween(\n newFrom,\n newTo,\n newState.doc\n ).filter((item) => item.mark.type === options.type);\n\n if (!newMarks.length) {\n return;\n }\n\n const newMark = newMarks[0];\n const oldLinkText = oldState.doc.textBetween(\n oldMark.from,\n oldMark.to,\n undefined,\n \" \"\n );\n const newLinkText = newState.doc.textBetween(\n newMark.from,\n newMark.to,\n undefined,\n \" \"\n );\n const wasLink = test(oldLinkText);\n const isLink = test(newLinkText);\n\n // remove only the link, if it was a link before too\n // because we don’t want to remove links that were set manually\n if (wasLink && !isLink) {\n tr.removeMark(newMark.from, newMark.to, options.type);\n }\n });\n\n // now let’s see if we can add new links\n const nodesInChangedRanges = findChildrenInRange(\n newState.doc,\n newRange,\n (node) => node.isTextblock\n );\n\n let textBlock: NodeWithPos | undefined;\n let textBeforeWhitespace: string | undefined;\n\n if (nodesInChangedRanges.length > 1) {\n // Grab the first node within the changed ranges (ex. the first of two paragraphs when hitting enter)\n textBlock = nodesInChangedRanges[0];\n textBeforeWhitespace = newState.doc.textBetween(\n textBlock.pos,\n textBlock.pos + textBlock.node.nodeSize,\n undefined,\n \" \"\n );\n } else if (\n nodesInChangedRanges.length &&\n // We want to make sure to include the block seperator argument to treat hard breaks like spaces\n newState.doc\n .textBetween(newRange.from, newRange.to, \" \", \" \")\n .endsWith(\" \")\n ) {\n textBlock = nodesInChangedRanges[0];\n textBeforeWhitespace = newState.doc.textBetween(\n textBlock.pos,\n newRange.to,\n undefined,\n \" \"\n );\n }\n\n if (textBlock && textBeforeWhitespace) {\n const wordsBeforeWhitespace = textBeforeWhitespace\n .split(\" \")\n .filter((s) => s !== \"\");\n\n if (wordsBeforeWhitespace.length <= 0) {\n return false;\n }\n\n const lastWordBeforeSpace =\n wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1];\n const lastWordAndBlockOffset =\n textBlock.pos +\n textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace);\n\n if (!lastWordBeforeSpace) {\n return false;\n }\n\n find(lastWordBeforeSpace)\n .filter((link) => link.isLink)\n .filter((link) => {\n if (options.validate) {\n return options.validate(link.value);\n }\n return true;\n })\n // calculate link position\n .map((link) => ({\n ...link,\n from: lastWordAndBlockOffset + link.start + 1,\n to: lastWordAndBlockOffset + link.end + 1,\n }))\n // add link mark\n .forEach((link) => {\n tr.addMark(\n link.from,\n link.to,\n options.type.create({\n href: link.href,\n })\n );\n });\n }\n });\n\n if (!tr.steps.length) {\n return;\n }\n\n return tr;\n },\n });\n}\n","import tippy, { Instance, Props, roundArrow } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { EditorView } from \"@tiptap/pm/view\";\nimport { getAttributes, posToDOMRect } from \"@tiptap/core\";\n\ninterface TippyInitOptions {\n editor: Editor;\n validate?: (url: string) => boolean;\n view: EditorView;\n}\n\nclass Tooltip {\n private tippyInstance?: Instance;\n private preventHide: boolean = false;\n private tippyWrapper: HTMLDivElement;\n private editor: Editor;\n private view: EditorView;\n\n constructor(options: TippyInitOptions) {\n this.editor = options.editor;\n this.view = options.view;\n this.tippyWrapper = document.createElement(\"div\");\n this.tippyWrapper.addEventListener(\"mousedown\", this.mousedownHandler, {\n capture: true,\n });\n this.view.dom.addEventListener(\"dragstart\", this.dragstartHandler);\n this.editor.on(\"blur\", this.blurHandler);\n }\n\n init() {\n this.tippyWrapper.innerHTML = \"\";\n\n return { tippyModal: this.tippyWrapper, tippyInstance: this.tippyInstance };\n }\n\n show() {\n this.tippyInstance?.show();\n return true;\n }\n\n hide() {\n setTimeout(() => this.tippyInstance?.hide());\n return false;\n }\n\n private mousedownHandler = () => {\n this.preventHide = true;\n };\n\n private dragstartHandler = () => {\n this.hide();\n };\n\n private blurHandler = ({ event }: { event: FocusEvent }) => {\n console.log(\"blurHandler\", { event });\n if (this.preventHide) {\n this.preventHide = false;\n return;\n }\n if (\n event?.relatedTarget &&\n this.tippyWrapper.parentNode?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n this.hide();\n };\n\n private tippyBlurHandler = (event: FocusEvent) => {\n this.blurHandler({ event });\n };\n\n private createTooltip() {\n if (!this.editor || !this.editor.options) return;\n const { element: editorElement } = this.editor.options;\n const editorIsAttached = !!editorElement.parentElement;\n\n if (this.tippyInstance || !editorIsAttached) {\n return;\n }\n\n this.tippyInstance = tippy(editorElement, {\n duration: 0,\n getReferenceClientRect: null,\n content: this.tippyWrapper,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom\",\n hideOnClick: \"toggle\",\n onClickOutside: (instance, event) => {\n console.log(\"onClickOutside\", { instance, event });\n this.hide();\n },\n onAfterUpdate: (instance, partialProps) => {\n console.log(\"onAfterUpdate\", { instance, partialProps });\n this.show();\n },\n });\n\n if (this.tippyInstance.popper.firstChild) {\n (this.tippyInstance.popper.firstChild as HTMLElement).addEventListener(\n \"blur\",\n this.tippyBlurHandler\n );\n }\n }\n\n update(view: EditorView, option: any = {}) {\n this.createTooltip();\n\n option.arrow = option?.arrow ?? false;\n\n if (this.tippyInstance) {\n this.tippyInstance.setProps({\n ...option,\n getReferenceClientRect: () => {\n const pos = view.state.selection.from;\n return posToDOMRect(view, pos, pos);\n },\n });\n }\n\n return {};\n }\n\n destroyTooltip() {\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = undefined;\n this.tippyWrapper.removeEventListener(\"mousedown\", this.mousedownHandler, {\n capture: true,\n });\n this.view.dom.removeEventListener(\"dragstart\", this.dragstartHandler);\n this.editor.off(\"blur\", this.blurHandler);\n }\n }\n}\n\nexport default Tooltip;\n","import { getAttributes } from \"@tiptap/core\";\nimport { MarkType } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Editor } from \"@tiptap/core\";\nimport { EditorView } from \"@tiptap/pm/view\";\nimport Tooltip from \"./tippyHelper\";\n\n// Define type for the ClickHandlerOptions\ntype ClickHandlerOptions = {\n type: MarkType;\n editor: Editor;\n validate?: (url: string) => boolean;\n view: EditorView;\n modals: {\n previewHyperlink?: ((options: any) => HTMLElement) | null;\n setHyperlink?: ((options: any) => HTMLElement) | null;\n };\n};\n\nexport default function clickHandler(options: ClickHandlerOptions): Plugin {\n // Create the tooltip instance\n let tooltip = new Tooltip(options);\n\n // Initialize the tooltip\n let { tippyModal, tippyInstance } = tooltip.init();\n\n return new Plugin({\n key: new PluginKey(\"handleClickHyperlink\"),\n props: {\n handleClick: (view, pos, event) => {\n if (event.button !== 0) return false;\n\n console.log({\n event,\n button: event.button,\n target: event.target,\n });\n\n // Get the target HTML element and its position\n const nodeTarget: HTMLElement = event.target as HTMLElement;\n const nodePos = view.posAtDOM(nodeTarget, 0);\n\n // Find the closest link element to the target element\n const link = nodeTarget?.closest(\"a\");\n\n // Extract attributes from the state\n const attrs = getAttributes(view.state, options.type.name);\n\n // Extract href and target attributes from the link element or the state\n const href = link?.href ?? attrs.href;\n const target = link?.target ?? attrs.target;\n\n // If there is no previewHyperlink modal provided, then open the link in new window\n if (!options.modals.previewHyperlink) {\n if (link && href) {\n window.open(href, target);\n }\n return true;\n }\n\n // if the link does not contain href attribute, hide the tooltip\n if (!link?.href) return tooltip.hide();\n\n // Create a preview of the hyperlink\n const hyperlinkPreview = options.modals.previewHyperlink({\n link,\n nodePos,\n ...options,\n });\n\n // If there is no hyperlink preview, hide the modal\n if (!hyperlinkPreview) return tooltip.hide();\n\n // Empty the modal and append the hyperlink preview box\n\n while (tippyModal.firstChild) {\n tippyModal.removeChild(tippyModal.firstChild);\n }\n\n tippyModal.append(hyperlinkPreview);\n\n // Update the modal position\n tooltip.update(options.view);\n\n return false;\n },\n },\n });\n}\n","import { Editor } from \"@tiptap/core\";\nimport { MarkType } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { find } from \"linkifyjs\";\n\ntype PasteHandlerOptions = {\n editor: Editor;\n type: MarkType;\n};\n\nexport function pasteHandler(options: PasteHandlerOptions): Plugin {\n return new Plugin({\n key: new PluginKey(\"handlePasteHyperlink\"),\n props: {\n handlePaste: (view, event, slice) => {\n const { state } = view;\n const { selection } = state;\n const { empty } = selection;\n\n if (empty) {\n return false;\n }\n\n let textContent = \"\";\n\n slice.content.forEach((node) => {\n textContent += node.textContent;\n });\n\n const link = find(textContent).find(\n (item) => item.isLink && item.value === textContent\n );\n\n if (!textContent || !link) {\n return false;\n }\n\n options.editor.commands.setMark(options.type, {\n href: link.href,\n });\n\n return true;\n },\n },\n });\n}\n","import { Editor } from \"@tiptap/core\";\nimport { find } from \"linkifyjs\";\n\ntype EditHyperlinkOptions = {\n editor: Editor;\n validate?: (url: string) => boolean;\n newURL?: string;\n newText?: string;\n};\n\nexport default function editHyperlink(options: EditHyperlinkOptions) {\n const { state, dispatch } = options.editor.view;\n const { from, to } = state.selection;\n let link: HTMLAnchorElement | null = null;\n\n const selectedNode = options.editor.view.domAtPos(from - 1)\n .node as HTMLElement;\n\n if (selectedNode?.nodeName === \"#text\") {\n link = (selectedNode.parentNode as HTMLElement)?.closest(\"a\");\n } else {\n link = selectedNode?.closest(\"a\");\n }\n\n if (!link) return true;\n\n const text = options.newText || link?.innerText;\n // Get the position of the link in the editor view\n const nodePos = options.editor.view.posAtDOM(link, 0);\n\n const sanitizeURL = find(options.newURL || link.href)\n .filter((link) => link.isLink)\n .filter((link) => (options.validate ? options.validate(link.value) : true))\n .at(0);\n\n return options.editor\n .chain()\n .focus()\n .command(({ tr }) => {\n // The command replaces the range from nodePos to nodePos + length of the text\n // with a new text node with the provided text and a link mark with the sanitized URL\n tr.replaceWith(\n nodePos,\n nodePos + text?.length,\n options.editor.schema.text(text, [\n options.editor.schema.marks.hyperlink.create({\n href: sanitizeURL?.href,\n }),\n ])\n );\n\n return true;\n })\n .run();\n}\n","import { Mark, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { find, registerCustomProtocol, reset } from \"linkifyjs\";\nimport autoHyperlink from \"./helpers/autoHyperlink\";\nimport clickHandler from \"./helpers/clickHandler\";\nimport { pasteHandler } from \"./helpers/pasteHandler\";\nimport editHyperlinkHelper from \"./helpers/editHyperlink\";\n\nexport interface LinkProtocolOptions {\n scheme: string;\n optionalSlashes?: boolean;\n}\n\nexport interface HyperlinkOptions {\n /**\n * If enabled, it adds links as you type.\n */\n autoHyperlink: boolean;\n /**\n * An array of custom protocols to be registered with linkifyjs.\n */\n protocols: Array<LinkProtocolOptions | string>;\n /**\n * If enabled, links will be opened on click.\n */\n openOnClick: boolean;\n /**\n * Adds a link to the current selection if the pasted content only contains an url.\n */\n hyperlinkOnPaste: boolean;\n /**\n * A list of HTML attributes to be rendered.\n */\n HTMLAttributes: Record<string, any>;\n /**\n * A list of modals to be rendered.\n * @default null\n * @example\n */\n modals: {\n previewHyperlink?: ((options: any) => HTMLElement) | null;\n setHyperlink?: ((options: any) => HTMLElement) | null;\n };\n /**\n * A validation function that modifies link verification for the auto linker.\n * @param url - The url to be validated.\n * @returns - True if the url is valid, false otherwise.\n */\n validate?: (url: string) => boolean;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n link: {\n /**\n * Edit the hyperlink's text\n */\n editHyperLinkText: (text: string) => ReturnType;\n\n /**\n * Edit the hyperlink's href value\n */\n editHyperLinkHref: (href: string) => ReturnType;\n\n /**\n * Edit the hyperlink's\n */\n editHyperlink: (attributes?: { newText?: string; newURL?: string }) => ReturnType;\n\n /**\n * Set a hyperlink\n */\n setHyperlink: (attributes?: { href: string; target?: string | null }) => ReturnType;\n\n /**\n * Unset a link mark\n */\n unsetHyperlink: () => ReturnType;\n };\n }\n}\n\nexport const Hyperlink = Mark.create<HyperlinkOptions>({\n name: \"hyperlink\",\n\n priority: 1000,\n\n keepOnSplit: false,\n\n onCreate() {\n this.options.protocols.forEach((protocol) => {\n if (typeof protocol === \"string\") {\n registerCustomProtocol(protocol);\n return;\n }\n registerCustomProtocol(protocol.scheme, protocol.optionalSlashes);\n });\n },\n\n onDestroy() {\n reset();\n },\n\n inclusive() {\n return this.options.autoHyperlink;\n },\n\n addOptions() {\n return {\n openOnClick: true,\n hyperlinkOnPaste: true,\n autoHyperlink: true,\n protocols: [],\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer nofollow\",\n class: null,\n },\n modals: {\n previewHyperlink: null,\n setHyperlink: null,\n },\n validate: undefined,\n };\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n },\n target: {\n default: this.options.HTMLAttributes.target,\n },\n class: {\n default: this.options.HTMLAttributes.class,\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'a[href]:not([href *= \"javascript:\" i])' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"a\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n\n addCommands() {\n return {\n setHyperlink:\n (attributes) =>\n ({ editor, chain }) => {\n if (!this.options.modals.setHyperlink) {\n return chain()\n .setMark(this.name, attributes)\n .setMeta(\"preventAutohyperlink\", true)\n .run();\n } else {\n this.options.modals.setHyperlink({\n editor,\n validate: this.options.validate,\n extentionName: this.name,\n attributes,\n });\n return true;\n }\n },\n\n editHyperlink:\n (attributes) =>\n ({ editor }) => {\n return editHyperlinkHelper({\n ...attributes,\n editor,\n validate: this.options.validate,\n });\n },\n\n editHyperLinkText:\n (newText) =>\n ({ editor }) => {\n return editHyperlinkHelper({\n editor,\n newText,\n validate: this.options.validate,\n });\n },\n\n editHyperLinkHref:\n (newURL) =>\n ({ editor }) => {\n return editHyperlinkHelper({\n editor,\n validate: this.options.validate,\n newURL,\n });\n },\n\n unsetHyperlink:\n () =>\n ({ chain }) => {\n return chain()\n .unsetMark(this.name, { extendEmptyMarkRange: true })\n .setMeta(\"preventAutohyperlink\", true)\n .run();\n },\n };\n },\n\n addPasteRules() {\n return [\n markPasteRule({\n find: (text) =>\n find(text)\n .filter((link) => {\n if (this.options.validate) {\n return this.options.validate(link.value);\n }\n\n return true;\n })\n .filter((link) => link.isLink)\n .map((link) => ({\n text: link.value,\n index: link.start,\n data: link,\n })),\n type: this.type,\n getAttributes: (match) => ({\n href: match.data?.href,\n }),\n }),\n ];\n },\n\n addProseMirrorPlugins() {\n const plugins: Plugin[] = [];\n\n if (this.options.autoHyperlink) {\n plugins.push(\n autoHyperlink({\n type: this.type,\n validate: this.options.validate,\n })\n );\n }\n\n if (this.options.openOnClick) {\n plugins.push(\n clickHandler({\n type: this.type,\n editor: this.editor,\n validate: this.options.validate,\n view: this.editor.view,\n modals: this.options.modals,\n })\n );\n }\n\n if (this.options.hyperlinkOnPaste) {\n plugins.push(\n pasteHandler({\n editor: this.editor,\n type: this.type,\n })\n );\n }\n\n return plugins;\n },\n});\n"],"names":["Plugin","PluginKey","combineTransactionSteps","getChangedRanges","getMarksBetween","test","findChildrenInRange","find","posToDOMRect","getAttributes","Mark","registerCustomProtocol","reset","mergeAttributes","editHyperlinkHelper","markPasteRule"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,8 +3,7 @@ import { MarkType } from "@tiptap/pm/model";
|
|
|
3
3
|
import { Plugin, PluginKey } from "@tiptap/pm/state";
|
|
4
4
|
import { Editor } from "@tiptap/core";
|
|
5
5
|
import { EditorView } from "@tiptap/pm/view";
|
|
6
|
-
import
|
|
7
|
-
// import "tippy.js/dist/svg-arrow.css";
|
|
6
|
+
import Tooltip from "./tippyHelper";
|
|
8
7
|
|
|
9
8
|
// Define type for the ClickHandlerOptions
|
|
10
9
|
type ClickHandlerOptions = {
|
|
@@ -19,7 +18,11 @@ type ClickHandlerOptions = {
|
|
|
19
18
|
};
|
|
20
19
|
|
|
21
20
|
export default function clickHandler(options: ClickHandlerOptions): Plugin {
|
|
22
|
-
|
|
21
|
+
// Create the tooltip instance
|
|
22
|
+
let tooltip = new Tooltip(options);
|
|
23
|
+
|
|
24
|
+
// Initialize the tooltip
|
|
25
|
+
let { tippyModal, tippyInstance } = tooltip.init();
|
|
23
26
|
|
|
24
27
|
return new Plugin({
|
|
25
28
|
key: new PluginKey("handleClickHyperlink"),
|
|
@@ -50,7 +53,7 @@ export default function clickHandler(options: ClickHandlerOptions): Plugin {
|
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
// if the link does not contain href attribute, hide the tooltip
|
|
53
|
-
if (!link?.href) return
|
|
56
|
+
if (!link?.href) return tooltip.hide();
|
|
54
57
|
|
|
55
58
|
// Create a preview of the hyperlink
|
|
56
59
|
const hyperlinkPreview = options.modals.previewHyperlink({
|
|
@@ -60,14 +63,18 @@ export default function clickHandler(options: ClickHandlerOptions): Plugin {
|
|
|
60
63
|
});
|
|
61
64
|
|
|
62
65
|
// If there is no hyperlink preview, hide the modal
|
|
63
|
-
if (!hyperlinkPreview) return
|
|
66
|
+
if (!hyperlinkPreview) return tooltip.hide();
|
|
64
67
|
|
|
65
68
|
// Empty the modal and append the hyperlink preview box
|
|
66
|
-
|
|
69
|
+
|
|
70
|
+
while (tippyModal.firstChild) {
|
|
71
|
+
tippyModal.removeChild(tippyModal.firstChild);
|
|
72
|
+
}
|
|
73
|
+
|
|
67
74
|
tippyModal.append(hyperlinkPreview);
|
|
68
75
|
|
|
69
76
|
// Update the modal position
|
|
70
|
-
|
|
77
|
+
tooltip.update(options.view);
|
|
71
78
|
|
|
72
79
|
return false;
|
|
73
80
|
},
|