@cyberyozh/text-editor 0.1.14 → 0.1.16
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/editor.js +1335 -124
- package/dist/editor.js.map +1 -1
- package/dist/editor.mjs +1283 -72
- package/dist/editor.mjs.map +1 -1
- package/dist/render.js +1303 -93
- package/dist/render.js.map +1 -1
- package/dist/render.mjs +1258 -48
- package/dist/render.mjs.map +1 -1
- package/package.json +38 -38
- package/src/editor/controls/bubble-menu-content.tsx +1 -1
- package/src/editor/dialogs/add-link-dialog/add-link-dialog.tsx +2 -6
- package/src/editor/handlers/dialog-handlers.ts +1 -0
- package/src/extensions/base/figure.ts +37 -0
- package/src/extensions/base/link.ts +63 -6
- package/src/types/link.ts +1 -0
- package/src/utils/html-to-tiptap-content.ts +3 -1
package/dist/editor.mjs
CHANGED
|
@@ -781,7 +781,7 @@ var BubbleMenuContent = ({ editor, onLinkClick }) => {
|
|
|
781
781
|
editor.state.selection.$to.pos
|
|
782
782
|
);
|
|
783
783
|
const linkAttrs = editor.getAttributes("link");
|
|
784
|
-
onLinkClick?.({ title: selectedText
|
|
784
|
+
onLinkClick?.({ ...linkAttrs, title: selectedText });
|
|
785
785
|
openDialogCommand("link");
|
|
786
786
|
};
|
|
787
787
|
return /* @__PURE__ */ jsxs10(
|
|
@@ -2273,8 +2273,8 @@ var AddLinkDialog = ({
|
|
|
2273
2273
|
linkDialogContext
|
|
2274
2274
|
}) => {
|
|
2275
2275
|
const translations2 = useTiptapTranslations();
|
|
2276
|
-
const initialLinkTarget = linkDialogContext
|
|
2277
|
-
const initialLinkRel = linkDialogContext
|
|
2276
|
+
const initialLinkTarget = linkDialogContext ? linkDialogContext.target === "_blank" : true;
|
|
2277
|
+
const initialLinkRel = linkDialogContext ? !!linkDialogContext.rel?.includes("noopener") : true;
|
|
2278
2278
|
const [title, setTitle] = useState8(linkDialogContext?.title);
|
|
2279
2279
|
const [url, setUrl] = useState8(linkDialogContext?.href);
|
|
2280
2280
|
const [openInNewTab, setOpenInNewTab] = useState8(initialLinkTarget);
|
|
@@ -2694,7 +2694,7 @@ function handleExitNode(editor, nodeName) {
|
|
|
2694
2694
|
if (!isInsideTargetNode || !isCurrentNodeEmptyParagraph) {
|
|
2695
2695
|
return false;
|
|
2696
2696
|
}
|
|
2697
|
-
const { tr } = state;
|
|
2697
|
+
const { tr: tr2 } = state;
|
|
2698
2698
|
const posAfterTargetNode = $pos.after(targetNodeDepth);
|
|
2699
2699
|
const targetNode = $pos.node(targetNodeDepth);
|
|
2700
2700
|
let newPosAfterTargetNode = posAfterTargetNode;
|
|
@@ -2702,14 +2702,14 @@ function handleExitNode(editor, nodeName) {
|
|
|
2702
2702
|
const emptyParagraphStart = $pos.before();
|
|
2703
2703
|
const emptyParagraphEnd = $pos.after();
|
|
2704
2704
|
const deletionLength = emptyParagraphEnd - emptyParagraphStart;
|
|
2705
|
-
|
|
2705
|
+
tr2.delete(emptyParagraphStart, emptyParagraphEnd);
|
|
2706
2706
|
newPosAfterTargetNode = posAfterTargetNode - deletionLength;
|
|
2707
2707
|
}
|
|
2708
2708
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
2709
2709
|
if (!paragraphNode) return false;
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
view.dispatch(
|
|
2710
|
+
tr2.insert(newPosAfterTargetNode, paragraphNode);
|
|
2711
|
+
tr2.setSelection(TextSelection.create(tr2.doc, newPosAfterTargetNode + 1));
|
|
2712
|
+
view.dispatch(tr2);
|
|
2713
2713
|
return true;
|
|
2714
2714
|
}
|
|
2715
2715
|
|
|
@@ -2729,7 +2729,7 @@ function migrateLegacyCallouts(editor) {
|
|
|
2729
2729
|
}
|
|
2730
2730
|
});
|
|
2731
2731
|
if (calloutsToMigrate.length === 0) return;
|
|
2732
|
-
const
|
|
2732
|
+
const tr2 = editor.state.tr;
|
|
2733
2733
|
calloutsToMigrate.sort((a, b) => b.pos - a.pos);
|
|
2734
2734
|
for (const { node, pos } of calloutsToMigrate) {
|
|
2735
2735
|
const oldType = node.attrs.calloutType;
|
|
@@ -2738,7 +2738,7 @@ function migrateLegacyCallouts(editor) {
|
|
|
2738
2738
|
if (hasInlineContent) {
|
|
2739
2739
|
const paragraph = schema.nodes.paragraph?.create(null, node.content);
|
|
2740
2740
|
const newContent = paragraph ? [paragraph] : [];
|
|
2741
|
-
|
|
2741
|
+
tr2.replaceRangeWith(
|
|
2742
2742
|
pos,
|
|
2743
2743
|
pos + node.nodeSize,
|
|
2744
2744
|
schema.nodes.callout.create(
|
|
@@ -2751,7 +2751,7 @@ function migrateLegacyCallouts(editor) {
|
|
|
2751
2751
|
)
|
|
2752
2752
|
);
|
|
2753
2753
|
} else {
|
|
2754
|
-
|
|
2754
|
+
tr2.setNodeMarkup(pos, void 0, {
|
|
2755
2755
|
...node.attrs,
|
|
2756
2756
|
type: newType,
|
|
2757
2757
|
calloutType: null,
|
|
@@ -2759,7 +2759,7 @@ function migrateLegacyCallouts(editor) {
|
|
|
2759
2759
|
});
|
|
2760
2760
|
}
|
|
2761
2761
|
}
|
|
2762
|
-
editor.view.dispatch(
|
|
2762
|
+
editor.view.dispatch(tr2);
|
|
2763
2763
|
}
|
|
2764
2764
|
|
|
2765
2765
|
// src/extensions/base/callout.ts
|
|
@@ -2967,13 +2967,13 @@ var BaseCustomQuote = Node2.create({
|
|
|
2967
2967
|
if (!isInsideCustomQuote) {
|
|
2968
2968
|
return false;
|
|
2969
2969
|
}
|
|
2970
|
-
const { tr } = state;
|
|
2970
|
+
const { tr: tr2 } = state;
|
|
2971
2971
|
const posAfter = $pos.after(depth);
|
|
2972
2972
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
2973
2973
|
if (!paragraphNode) return false;
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
view.dispatch(
|
|
2974
|
+
tr2.insert(posAfter, paragraphNode);
|
|
2975
|
+
tr2.setSelection(TextSelection2.create(tr2.doc, posAfter + 1));
|
|
2976
|
+
view.dispatch(tr2);
|
|
2977
2977
|
return true;
|
|
2978
2978
|
}
|
|
2979
2979
|
};
|
|
@@ -3006,7 +3006,7 @@ var BaseCustomQuoteText = Node2.create({
|
|
|
3006
3006
|
return {
|
|
3007
3007
|
Enter: () => {
|
|
3008
3008
|
const { view, state } = this.editor;
|
|
3009
|
-
const { tr, selection } = state;
|
|
3009
|
+
const { tr: tr2, selection } = state;
|
|
3010
3010
|
const { $from } = selection;
|
|
3011
3011
|
if ($from.parent.type.name !== "customQuoteText") {
|
|
3012
3012
|
return false;
|
|
@@ -3015,8 +3015,8 @@ var BaseCustomQuoteText = Node2.create({
|
|
|
3015
3015
|
const nextNode = state.doc.nodeAt(posAfter);
|
|
3016
3016
|
if (!nextNode || nextNode.type.name !== "customQuoteAuthor") return false;
|
|
3017
3017
|
const nextNodeEnd = posAfter + nextNode.nodeSize - 1;
|
|
3018
|
-
|
|
3019
|
-
view.dispatch(
|
|
3018
|
+
tr2.setSelection(TextSelection2.create(tr2.doc, nextNodeEnd));
|
|
3019
|
+
view.dispatch(tr2);
|
|
3020
3020
|
return true;
|
|
3021
3021
|
}
|
|
3022
3022
|
};
|
|
@@ -3041,7 +3041,7 @@ var BaseCustomQuoteAuthor = Node2.create({
|
|
|
3041
3041
|
return {
|
|
3042
3042
|
Enter: () => {
|
|
3043
3043
|
const { view, state } = this.editor;
|
|
3044
|
-
const { tr, selection } = state;
|
|
3044
|
+
const { tr: tr2, selection } = state;
|
|
3045
3045
|
const { $from } = selection;
|
|
3046
3046
|
if ($from.parent.type.name !== "customQuoteAuthor") {
|
|
3047
3047
|
return false;
|
|
@@ -3050,8 +3050,8 @@ var BaseCustomQuoteAuthor = Node2.create({
|
|
|
3050
3050
|
const nextNode = state.doc.nodeAt(posAfter);
|
|
3051
3051
|
if (!nextNode || nextNode.type.name !== "customQuoteSign") return false;
|
|
3052
3052
|
const nextNodeEnd = posAfter + nextNode.nodeSize - 1;
|
|
3053
|
-
|
|
3054
|
-
view.dispatch(
|
|
3053
|
+
tr2.setSelection(TextSelection2.create(tr2.doc, nextNodeEnd));
|
|
3054
|
+
view.dispatch(tr2);
|
|
3055
3055
|
return true;
|
|
3056
3056
|
}
|
|
3057
3057
|
};
|
|
@@ -3085,16 +3085,1188 @@ var BaseCustomQuoteSign = Node2.create({
|
|
|
3085
3085
|
});
|
|
3086
3086
|
|
|
3087
3087
|
// src/extensions/base/link.ts
|
|
3088
|
-
import Link from "@tiptap/extension-link";
|
|
3088
|
+
import Link, { isAllowedUri } from "@tiptap/extension-link";
|
|
3089
|
+
import { markPasteRule } from "@tiptap/core";
|
|
3090
|
+
|
|
3091
|
+
// node_modules/linkifyjs/dist/linkify.mjs
|
|
3092
|
+
var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
|
|
3093
|
+
var encodedUtlds = "\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2";
|
|
3094
|
+
var numeric = "numeric";
|
|
3095
|
+
var ascii = "ascii";
|
|
3096
|
+
var alpha = "alpha";
|
|
3097
|
+
var asciinumeric = "asciinumeric";
|
|
3098
|
+
var alphanumeric = "alphanumeric";
|
|
3099
|
+
var domain = "domain";
|
|
3100
|
+
var emoji = "emoji";
|
|
3101
|
+
var scheme = "scheme";
|
|
3102
|
+
var slashscheme = "slashscheme";
|
|
3103
|
+
var whitespace = "whitespace";
|
|
3104
|
+
function registerGroup(name, groups) {
|
|
3105
|
+
if (!(name in groups)) {
|
|
3106
|
+
groups[name] = [];
|
|
3107
|
+
}
|
|
3108
|
+
return groups[name];
|
|
3109
|
+
}
|
|
3110
|
+
function addToGroups(t, flags, groups) {
|
|
3111
|
+
if (flags[numeric]) {
|
|
3112
|
+
flags[asciinumeric] = true;
|
|
3113
|
+
flags[alphanumeric] = true;
|
|
3114
|
+
}
|
|
3115
|
+
if (flags[ascii]) {
|
|
3116
|
+
flags[asciinumeric] = true;
|
|
3117
|
+
flags[alpha] = true;
|
|
3118
|
+
}
|
|
3119
|
+
if (flags[asciinumeric]) {
|
|
3120
|
+
flags[alphanumeric] = true;
|
|
3121
|
+
}
|
|
3122
|
+
if (flags[alpha]) {
|
|
3123
|
+
flags[alphanumeric] = true;
|
|
3124
|
+
}
|
|
3125
|
+
if (flags[alphanumeric]) {
|
|
3126
|
+
flags[domain] = true;
|
|
3127
|
+
}
|
|
3128
|
+
if (flags[emoji]) {
|
|
3129
|
+
flags[domain] = true;
|
|
3130
|
+
}
|
|
3131
|
+
for (const k in flags) {
|
|
3132
|
+
const group = registerGroup(k, groups);
|
|
3133
|
+
if (group.indexOf(t) < 0) {
|
|
3134
|
+
group.push(t);
|
|
3135
|
+
}
|
|
3136
|
+
}
|
|
3137
|
+
}
|
|
3138
|
+
function flagsForToken(t, groups) {
|
|
3139
|
+
const result = {};
|
|
3140
|
+
for (const c in groups) {
|
|
3141
|
+
if (groups[c].indexOf(t) >= 0) {
|
|
3142
|
+
result[c] = true;
|
|
3143
|
+
}
|
|
3144
|
+
}
|
|
3145
|
+
return result;
|
|
3146
|
+
}
|
|
3147
|
+
function State(token = null) {
|
|
3148
|
+
this.j = {};
|
|
3149
|
+
this.jr = [];
|
|
3150
|
+
this.jd = null;
|
|
3151
|
+
this.t = token;
|
|
3152
|
+
}
|
|
3153
|
+
State.groups = {};
|
|
3154
|
+
State.prototype = {
|
|
3155
|
+
accepts() {
|
|
3156
|
+
return !!this.t;
|
|
3157
|
+
},
|
|
3158
|
+
/**
|
|
3159
|
+
* Follow an existing transition from the given input to the next state.
|
|
3160
|
+
* Does not mutate.
|
|
3161
|
+
* @param {string} input character or token type to transition on
|
|
3162
|
+
* @returns {?State<T>} the next state, if any
|
|
3163
|
+
*/
|
|
3164
|
+
go(input) {
|
|
3165
|
+
const state = this;
|
|
3166
|
+
const nextState = state.j[input];
|
|
3167
|
+
if (nextState) {
|
|
3168
|
+
return nextState;
|
|
3169
|
+
}
|
|
3170
|
+
for (let i = 0; i < state.jr.length; i++) {
|
|
3171
|
+
const regex = state.jr[i][0];
|
|
3172
|
+
const nextState2 = state.jr[i][1];
|
|
3173
|
+
if (nextState2 && regex.test(input)) {
|
|
3174
|
+
return nextState2;
|
|
3175
|
+
}
|
|
3176
|
+
}
|
|
3177
|
+
return state.jd;
|
|
3178
|
+
},
|
|
3179
|
+
/**
|
|
3180
|
+
* Whether the state has a transition for the given input. Set the second
|
|
3181
|
+
* argument to true to only look for an exact match (and not a default or
|
|
3182
|
+
* regular-expression-based transition)
|
|
3183
|
+
* @param {string} input
|
|
3184
|
+
* @param {boolean} exactOnly
|
|
3185
|
+
*/
|
|
3186
|
+
has(input, exactOnly = false) {
|
|
3187
|
+
return exactOnly ? input in this.j : !!this.go(input);
|
|
3188
|
+
},
|
|
3189
|
+
/**
|
|
3190
|
+
* Short for "transition all"; create a transition from the array of items
|
|
3191
|
+
* in the given list to the same final resulting state.
|
|
3192
|
+
* @param {string | string[]} inputs Group of inputs to transition on
|
|
3193
|
+
* @param {Transition<T> | State<T>} [next] Transition options
|
|
3194
|
+
* @param {Flags} [flags] Collections flags to add token to
|
|
3195
|
+
* @param {Collections<T>} [groups] Master list of token groups
|
|
3196
|
+
*/
|
|
3197
|
+
ta(inputs, next, flags, groups) {
|
|
3198
|
+
for (let i = 0; i < inputs.length; i++) {
|
|
3199
|
+
this.tt(inputs[i], next, flags, groups);
|
|
3200
|
+
}
|
|
3201
|
+
},
|
|
3202
|
+
/**
|
|
3203
|
+
* Short for "take regexp transition"; defines a transition for this state
|
|
3204
|
+
* when it encounters a token which matches the given regular expression
|
|
3205
|
+
* @param {RegExp} regexp Regular expression transition (populate first)
|
|
3206
|
+
* @param {T | State<T>} [next] Transition options
|
|
3207
|
+
* @param {Flags} [flags] Collections flags to add token to
|
|
3208
|
+
* @param {Collections<T>} [groups] Master list of token groups
|
|
3209
|
+
* @returns {State<T>} taken after the given input
|
|
3210
|
+
*/
|
|
3211
|
+
tr(regexp, next, flags, groups) {
|
|
3212
|
+
groups = groups || State.groups;
|
|
3213
|
+
let nextState;
|
|
3214
|
+
if (next && next.j) {
|
|
3215
|
+
nextState = next;
|
|
3216
|
+
} else {
|
|
3217
|
+
nextState = new State(next);
|
|
3218
|
+
if (flags && groups) {
|
|
3219
|
+
addToGroups(next, flags, groups);
|
|
3220
|
+
}
|
|
3221
|
+
}
|
|
3222
|
+
this.jr.push([regexp, nextState]);
|
|
3223
|
+
return nextState;
|
|
3224
|
+
},
|
|
3225
|
+
/**
|
|
3226
|
+
* Short for "take transitions", will take as many sequential transitions as
|
|
3227
|
+
* the length of the given input and returns the
|
|
3228
|
+
* resulting final state.
|
|
3229
|
+
* @param {string | string[]} input
|
|
3230
|
+
* @param {T | State<T>} [next] Transition options
|
|
3231
|
+
* @param {Flags} [flags] Collections flags to add token to
|
|
3232
|
+
* @param {Collections<T>} [groups] Master list of token groups
|
|
3233
|
+
* @returns {State<T>} taken after the given input
|
|
3234
|
+
*/
|
|
3235
|
+
ts(input, next, flags, groups) {
|
|
3236
|
+
let state = this;
|
|
3237
|
+
const len = input.length;
|
|
3238
|
+
if (!len) {
|
|
3239
|
+
return state;
|
|
3240
|
+
}
|
|
3241
|
+
for (let i = 0; i < len - 1; i++) {
|
|
3242
|
+
state = state.tt(input[i]);
|
|
3243
|
+
}
|
|
3244
|
+
return state.tt(input[len - 1], next, flags, groups);
|
|
3245
|
+
},
|
|
3246
|
+
/**
|
|
3247
|
+
* Short for "take transition", this is a method for building/working with
|
|
3248
|
+
* state machines.
|
|
3249
|
+
*
|
|
3250
|
+
* If a state already exists for the given input, returns it.
|
|
3251
|
+
*
|
|
3252
|
+
* If a token is specified, that state will emit that token when reached by
|
|
3253
|
+
* the linkify engine.
|
|
3254
|
+
*
|
|
3255
|
+
* If no state exists, it will be initialized with some default transitions
|
|
3256
|
+
* that resemble existing default transitions.
|
|
3257
|
+
*
|
|
3258
|
+
* If a state is given for the second argument, that state will be
|
|
3259
|
+
* transitioned to on the given input regardless of what that input
|
|
3260
|
+
* previously did.
|
|
3261
|
+
*
|
|
3262
|
+
* Specify a token group flags to define groups that this token belongs to.
|
|
3263
|
+
* The token will be added to corresponding entires in the given groups
|
|
3264
|
+
* object.
|
|
3265
|
+
*
|
|
3266
|
+
* @param {string} input character, token type to transition on
|
|
3267
|
+
* @param {T | State<T>} [next] Transition options
|
|
3268
|
+
* @param {Flags} [flags] Collections flags to add token to
|
|
3269
|
+
* @param {Collections<T>} [groups] Master list of groups
|
|
3270
|
+
* @returns {State<T>} taken after the given input
|
|
3271
|
+
*/
|
|
3272
|
+
tt(input, next, flags, groups) {
|
|
3273
|
+
groups = groups || State.groups;
|
|
3274
|
+
const state = this;
|
|
3275
|
+
if (next && next.j) {
|
|
3276
|
+
state.j[input] = next;
|
|
3277
|
+
return next;
|
|
3278
|
+
}
|
|
3279
|
+
const t = next;
|
|
3280
|
+
let nextState, templateState = state.go(input);
|
|
3281
|
+
if (templateState) {
|
|
3282
|
+
nextState = new State();
|
|
3283
|
+
Object.assign(nextState.j, templateState.j);
|
|
3284
|
+
nextState.jr.push.apply(nextState.jr, templateState.jr);
|
|
3285
|
+
nextState.jd = templateState.jd;
|
|
3286
|
+
nextState.t = templateState.t;
|
|
3287
|
+
} else {
|
|
3288
|
+
nextState = new State();
|
|
3289
|
+
}
|
|
3290
|
+
if (t) {
|
|
3291
|
+
if (groups) {
|
|
3292
|
+
if (nextState.t && typeof nextState.t === "string") {
|
|
3293
|
+
const allFlags = Object.assign(flagsForToken(nextState.t, groups), flags);
|
|
3294
|
+
addToGroups(t, allFlags, groups);
|
|
3295
|
+
} else if (flags) {
|
|
3296
|
+
addToGroups(t, flags, groups);
|
|
3297
|
+
}
|
|
3298
|
+
}
|
|
3299
|
+
nextState.t = t;
|
|
3300
|
+
}
|
|
3301
|
+
state.j[input] = nextState;
|
|
3302
|
+
return nextState;
|
|
3303
|
+
}
|
|
3304
|
+
};
|
|
3305
|
+
var ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);
|
|
3306
|
+
var tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);
|
|
3307
|
+
var ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);
|
|
3308
|
+
var tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);
|
|
3309
|
+
var WORD = "WORD";
|
|
3310
|
+
var UWORD = "UWORD";
|
|
3311
|
+
var ASCIINUMERICAL = "ASCIINUMERICAL";
|
|
3312
|
+
var ALPHANUMERICAL = "ALPHANUMERICAL";
|
|
3313
|
+
var LOCALHOST = "LOCALHOST";
|
|
3314
|
+
var TLD = "TLD";
|
|
3315
|
+
var UTLD = "UTLD";
|
|
3316
|
+
var SCHEME = "SCHEME";
|
|
3317
|
+
var SLASH_SCHEME = "SLASH_SCHEME";
|
|
3318
|
+
var NUM = "NUM";
|
|
3319
|
+
var WS = "WS";
|
|
3320
|
+
var NL = "NL";
|
|
3321
|
+
var OPENBRACE = "OPENBRACE";
|
|
3322
|
+
var CLOSEBRACE = "CLOSEBRACE";
|
|
3323
|
+
var OPENBRACKET = "OPENBRACKET";
|
|
3324
|
+
var CLOSEBRACKET = "CLOSEBRACKET";
|
|
3325
|
+
var OPENPAREN = "OPENPAREN";
|
|
3326
|
+
var CLOSEPAREN = "CLOSEPAREN";
|
|
3327
|
+
var OPENANGLEBRACKET = "OPENANGLEBRACKET";
|
|
3328
|
+
var CLOSEANGLEBRACKET = "CLOSEANGLEBRACKET";
|
|
3329
|
+
var FULLWIDTHLEFTPAREN = "FULLWIDTHLEFTPAREN";
|
|
3330
|
+
var FULLWIDTHRIGHTPAREN = "FULLWIDTHRIGHTPAREN";
|
|
3331
|
+
var LEFTCORNERBRACKET = "LEFTCORNERBRACKET";
|
|
3332
|
+
var RIGHTCORNERBRACKET = "RIGHTCORNERBRACKET";
|
|
3333
|
+
var LEFTWHITECORNERBRACKET = "LEFTWHITECORNERBRACKET";
|
|
3334
|
+
var RIGHTWHITECORNERBRACKET = "RIGHTWHITECORNERBRACKET";
|
|
3335
|
+
var FULLWIDTHLESSTHAN = "FULLWIDTHLESSTHAN";
|
|
3336
|
+
var FULLWIDTHGREATERTHAN = "FULLWIDTHGREATERTHAN";
|
|
3337
|
+
var AMPERSAND = "AMPERSAND";
|
|
3338
|
+
var APOSTROPHE = "APOSTROPHE";
|
|
3339
|
+
var ASTERISK = "ASTERISK";
|
|
3340
|
+
var AT = "AT";
|
|
3341
|
+
var BACKSLASH = "BACKSLASH";
|
|
3342
|
+
var BACKTICK = "BACKTICK";
|
|
3343
|
+
var CARET = "CARET";
|
|
3344
|
+
var COLON = "COLON";
|
|
3345
|
+
var COMMA = "COMMA";
|
|
3346
|
+
var DOLLAR = "DOLLAR";
|
|
3347
|
+
var DOT = "DOT";
|
|
3348
|
+
var EQUALS = "EQUALS";
|
|
3349
|
+
var EXCLAMATION = "EXCLAMATION";
|
|
3350
|
+
var HYPHEN = "HYPHEN";
|
|
3351
|
+
var PERCENT = "PERCENT";
|
|
3352
|
+
var PIPE = "PIPE";
|
|
3353
|
+
var PLUS = "PLUS";
|
|
3354
|
+
var POUND = "POUND";
|
|
3355
|
+
var QUERY = "QUERY";
|
|
3356
|
+
var QUOTE = "QUOTE";
|
|
3357
|
+
var FULLWIDTHMIDDLEDOT = "FULLWIDTHMIDDLEDOT";
|
|
3358
|
+
var SEMI = "SEMI";
|
|
3359
|
+
var SLASH = "SLASH";
|
|
3360
|
+
var TILDE = "TILDE";
|
|
3361
|
+
var UNDERSCORE = "UNDERSCORE";
|
|
3362
|
+
var EMOJI$1 = "EMOJI";
|
|
3363
|
+
var SYM = "SYM";
|
|
3364
|
+
var tk = /* @__PURE__ */ Object.freeze({
|
|
3365
|
+
__proto__: null,
|
|
3366
|
+
ALPHANUMERICAL,
|
|
3367
|
+
AMPERSAND,
|
|
3368
|
+
APOSTROPHE,
|
|
3369
|
+
ASCIINUMERICAL,
|
|
3370
|
+
ASTERISK,
|
|
3371
|
+
AT,
|
|
3372
|
+
BACKSLASH,
|
|
3373
|
+
BACKTICK,
|
|
3374
|
+
CARET,
|
|
3375
|
+
CLOSEANGLEBRACKET,
|
|
3376
|
+
CLOSEBRACE,
|
|
3377
|
+
CLOSEBRACKET,
|
|
3378
|
+
CLOSEPAREN,
|
|
3379
|
+
COLON,
|
|
3380
|
+
COMMA,
|
|
3381
|
+
DOLLAR,
|
|
3382
|
+
DOT,
|
|
3383
|
+
EMOJI: EMOJI$1,
|
|
3384
|
+
EQUALS,
|
|
3385
|
+
EXCLAMATION,
|
|
3386
|
+
FULLWIDTHGREATERTHAN,
|
|
3387
|
+
FULLWIDTHLEFTPAREN,
|
|
3388
|
+
FULLWIDTHLESSTHAN,
|
|
3389
|
+
FULLWIDTHMIDDLEDOT,
|
|
3390
|
+
FULLWIDTHRIGHTPAREN,
|
|
3391
|
+
HYPHEN,
|
|
3392
|
+
LEFTCORNERBRACKET,
|
|
3393
|
+
LEFTWHITECORNERBRACKET,
|
|
3394
|
+
LOCALHOST,
|
|
3395
|
+
NL,
|
|
3396
|
+
NUM,
|
|
3397
|
+
OPENANGLEBRACKET,
|
|
3398
|
+
OPENBRACE,
|
|
3399
|
+
OPENBRACKET,
|
|
3400
|
+
OPENPAREN,
|
|
3401
|
+
PERCENT,
|
|
3402
|
+
PIPE,
|
|
3403
|
+
PLUS,
|
|
3404
|
+
POUND,
|
|
3405
|
+
QUERY,
|
|
3406
|
+
QUOTE,
|
|
3407
|
+
RIGHTCORNERBRACKET,
|
|
3408
|
+
RIGHTWHITECORNERBRACKET,
|
|
3409
|
+
SCHEME,
|
|
3410
|
+
SEMI,
|
|
3411
|
+
SLASH,
|
|
3412
|
+
SLASH_SCHEME,
|
|
3413
|
+
SYM,
|
|
3414
|
+
TILDE,
|
|
3415
|
+
TLD,
|
|
3416
|
+
UNDERSCORE,
|
|
3417
|
+
UTLD,
|
|
3418
|
+
UWORD,
|
|
3419
|
+
WORD,
|
|
3420
|
+
WS
|
|
3421
|
+
});
|
|
3422
|
+
var ASCII_LETTER = /[a-z]/;
|
|
3423
|
+
var LETTER = /\p{L}/u;
|
|
3424
|
+
var EMOJI = /\p{Emoji}/u;
|
|
3425
|
+
var DIGIT = /\d/;
|
|
3426
|
+
var SPACE = /\s/;
|
|
3427
|
+
var CR = "\r";
|
|
3428
|
+
var LF = "\n";
|
|
3429
|
+
var EMOJI_VARIATION = "\uFE0F";
|
|
3430
|
+
var EMOJI_JOINER = "\u200D";
|
|
3431
|
+
var OBJECT_REPLACEMENT = "\uFFFC";
|
|
3432
|
+
var tlds = null;
|
|
3433
|
+
var utlds = null;
|
|
3434
|
+
function init$2(customSchemes = []) {
|
|
3435
|
+
const groups = {};
|
|
3436
|
+
State.groups = groups;
|
|
3437
|
+
const Start = new State();
|
|
3438
|
+
if (tlds == null) {
|
|
3439
|
+
tlds = decodeTlds(encodedTlds);
|
|
3440
|
+
}
|
|
3441
|
+
if (utlds == null) {
|
|
3442
|
+
utlds = decodeTlds(encodedUtlds);
|
|
3443
|
+
}
|
|
3444
|
+
tt(Start, "'", APOSTROPHE);
|
|
3445
|
+
tt(Start, "{", OPENBRACE);
|
|
3446
|
+
tt(Start, "}", CLOSEBRACE);
|
|
3447
|
+
tt(Start, "[", OPENBRACKET);
|
|
3448
|
+
tt(Start, "]", CLOSEBRACKET);
|
|
3449
|
+
tt(Start, "(", OPENPAREN);
|
|
3450
|
+
tt(Start, ")", CLOSEPAREN);
|
|
3451
|
+
tt(Start, "<", OPENANGLEBRACKET);
|
|
3452
|
+
tt(Start, ">", CLOSEANGLEBRACKET);
|
|
3453
|
+
tt(Start, "\uFF08", FULLWIDTHLEFTPAREN);
|
|
3454
|
+
tt(Start, "\uFF09", FULLWIDTHRIGHTPAREN);
|
|
3455
|
+
tt(Start, "\u300C", LEFTCORNERBRACKET);
|
|
3456
|
+
tt(Start, "\u300D", RIGHTCORNERBRACKET);
|
|
3457
|
+
tt(Start, "\u300E", LEFTWHITECORNERBRACKET);
|
|
3458
|
+
tt(Start, "\u300F", RIGHTWHITECORNERBRACKET);
|
|
3459
|
+
tt(Start, "\uFF1C", FULLWIDTHLESSTHAN);
|
|
3460
|
+
tt(Start, "\uFF1E", FULLWIDTHGREATERTHAN);
|
|
3461
|
+
tt(Start, "&", AMPERSAND);
|
|
3462
|
+
tt(Start, "*", ASTERISK);
|
|
3463
|
+
tt(Start, "@", AT);
|
|
3464
|
+
tt(Start, "`", BACKTICK);
|
|
3465
|
+
tt(Start, "^", CARET);
|
|
3466
|
+
tt(Start, ":", COLON);
|
|
3467
|
+
tt(Start, ",", COMMA);
|
|
3468
|
+
tt(Start, "$", DOLLAR);
|
|
3469
|
+
tt(Start, ".", DOT);
|
|
3470
|
+
tt(Start, "=", EQUALS);
|
|
3471
|
+
tt(Start, "!", EXCLAMATION);
|
|
3472
|
+
tt(Start, "-", HYPHEN);
|
|
3473
|
+
tt(Start, "%", PERCENT);
|
|
3474
|
+
tt(Start, "|", PIPE);
|
|
3475
|
+
tt(Start, "+", PLUS);
|
|
3476
|
+
tt(Start, "#", POUND);
|
|
3477
|
+
tt(Start, "?", QUERY);
|
|
3478
|
+
tt(Start, '"', QUOTE);
|
|
3479
|
+
tt(Start, "/", SLASH);
|
|
3480
|
+
tt(Start, ";", SEMI);
|
|
3481
|
+
tt(Start, "~", TILDE);
|
|
3482
|
+
tt(Start, "_", UNDERSCORE);
|
|
3483
|
+
tt(Start, "\\", BACKSLASH);
|
|
3484
|
+
tt(Start, "\u30FB", FULLWIDTHMIDDLEDOT);
|
|
3485
|
+
const Num = tr(Start, DIGIT, NUM, {
|
|
3486
|
+
[numeric]: true
|
|
3487
|
+
});
|
|
3488
|
+
tr(Num, DIGIT, Num);
|
|
3489
|
+
const Asciinumeric = tr(Num, ASCII_LETTER, ASCIINUMERICAL, {
|
|
3490
|
+
[asciinumeric]: true
|
|
3491
|
+
});
|
|
3492
|
+
const Alphanumeric = tr(Num, LETTER, ALPHANUMERICAL, {
|
|
3493
|
+
[alphanumeric]: true
|
|
3494
|
+
});
|
|
3495
|
+
const Word = tr(Start, ASCII_LETTER, WORD, {
|
|
3496
|
+
[ascii]: true
|
|
3497
|
+
});
|
|
3498
|
+
tr(Word, DIGIT, Asciinumeric);
|
|
3499
|
+
tr(Word, ASCII_LETTER, Word);
|
|
3500
|
+
tr(Asciinumeric, DIGIT, Asciinumeric);
|
|
3501
|
+
tr(Asciinumeric, ASCII_LETTER, Asciinumeric);
|
|
3502
|
+
const UWord = tr(Start, LETTER, UWORD, {
|
|
3503
|
+
[alpha]: true
|
|
3504
|
+
});
|
|
3505
|
+
tr(UWord, ASCII_LETTER);
|
|
3506
|
+
tr(UWord, DIGIT, Alphanumeric);
|
|
3507
|
+
tr(UWord, LETTER, UWord);
|
|
3508
|
+
tr(Alphanumeric, DIGIT, Alphanumeric);
|
|
3509
|
+
tr(Alphanumeric, ASCII_LETTER);
|
|
3510
|
+
tr(Alphanumeric, LETTER, Alphanumeric);
|
|
3511
|
+
const Nl2 = tt(Start, LF, NL, {
|
|
3512
|
+
[whitespace]: true
|
|
3513
|
+
});
|
|
3514
|
+
const Cr = tt(Start, CR, WS, {
|
|
3515
|
+
[whitespace]: true
|
|
3516
|
+
});
|
|
3517
|
+
const Ws = tr(Start, SPACE, WS, {
|
|
3518
|
+
[whitespace]: true
|
|
3519
|
+
});
|
|
3520
|
+
tt(Start, OBJECT_REPLACEMENT, Ws);
|
|
3521
|
+
tt(Cr, LF, Nl2);
|
|
3522
|
+
tt(Cr, OBJECT_REPLACEMENT, Ws);
|
|
3523
|
+
tr(Cr, SPACE, Ws);
|
|
3524
|
+
tt(Ws, CR);
|
|
3525
|
+
tt(Ws, LF);
|
|
3526
|
+
tr(Ws, SPACE, Ws);
|
|
3527
|
+
tt(Ws, OBJECT_REPLACEMENT, Ws);
|
|
3528
|
+
const Emoji = tr(Start, EMOJI, EMOJI$1, {
|
|
3529
|
+
[emoji]: true
|
|
3530
|
+
});
|
|
3531
|
+
tt(Emoji, "#");
|
|
3532
|
+
tr(Emoji, EMOJI, Emoji);
|
|
3533
|
+
tt(Emoji, EMOJI_VARIATION, Emoji);
|
|
3534
|
+
const EmojiJoiner = tt(Emoji, EMOJI_JOINER);
|
|
3535
|
+
tt(EmojiJoiner, "#");
|
|
3536
|
+
tr(EmojiJoiner, EMOJI, Emoji);
|
|
3537
|
+
const wordjr = [[ASCII_LETTER, Word], [DIGIT, Asciinumeric]];
|
|
3538
|
+
const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord], [DIGIT, Alphanumeric]];
|
|
3539
|
+
for (let i = 0; i < tlds.length; i++) {
|
|
3540
|
+
fastts(Start, tlds[i], TLD, WORD, wordjr);
|
|
3541
|
+
}
|
|
3542
|
+
for (let i = 0; i < utlds.length; i++) {
|
|
3543
|
+
fastts(Start, utlds[i], UTLD, UWORD, uwordjr);
|
|
3544
|
+
}
|
|
3545
|
+
addToGroups(TLD, {
|
|
3546
|
+
tld: true,
|
|
3547
|
+
ascii: true
|
|
3548
|
+
}, groups);
|
|
3549
|
+
addToGroups(UTLD, {
|
|
3550
|
+
utld: true,
|
|
3551
|
+
alpha: true
|
|
3552
|
+
}, groups);
|
|
3553
|
+
fastts(Start, "file", SCHEME, WORD, wordjr);
|
|
3554
|
+
fastts(Start, "mailto", SCHEME, WORD, wordjr);
|
|
3555
|
+
fastts(Start, "http", SLASH_SCHEME, WORD, wordjr);
|
|
3556
|
+
fastts(Start, "https", SLASH_SCHEME, WORD, wordjr);
|
|
3557
|
+
fastts(Start, "ftp", SLASH_SCHEME, WORD, wordjr);
|
|
3558
|
+
fastts(Start, "ftps", SLASH_SCHEME, WORD, wordjr);
|
|
3559
|
+
addToGroups(SCHEME, {
|
|
3560
|
+
scheme: true,
|
|
3561
|
+
ascii: true
|
|
3562
|
+
}, groups);
|
|
3563
|
+
addToGroups(SLASH_SCHEME, {
|
|
3564
|
+
slashscheme: true,
|
|
3565
|
+
ascii: true
|
|
3566
|
+
}, groups);
|
|
3567
|
+
customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1);
|
|
3568
|
+
for (let i = 0; i < customSchemes.length; i++) {
|
|
3569
|
+
const sch = customSchemes[i][0];
|
|
3570
|
+
const optionalSlashSlash = customSchemes[i][1];
|
|
3571
|
+
const flags = optionalSlashSlash ? {
|
|
3572
|
+
[scheme]: true
|
|
3573
|
+
} : {
|
|
3574
|
+
[slashscheme]: true
|
|
3575
|
+
};
|
|
3576
|
+
if (sch.indexOf("-") >= 0) {
|
|
3577
|
+
flags[domain] = true;
|
|
3578
|
+
} else if (!ASCII_LETTER.test(sch)) {
|
|
3579
|
+
flags[numeric] = true;
|
|
3580
|
+
} else if (DIGIT.test(sch)) {
|
|
3581
|
+
flags[asciinumeric] = true;
|
|
3582
|
+
} else {
|
|
3583
|
+
flags[ascii] = true;
|
|
3584
|
+
}
|
|
3585
|
+
ts(Start, sch, sch, flags);
|
|
3586
|
+
}
|
|
3587
|
+
ts(Start, "localhost", LOCALHOST, {
|
|
3588
|
+
ascii: true
|
|
3589
|
+
});
|
|
3590
|
+
Start.jd = new State(SYM);
|
|
3591
|
+
return {
|
|
3592
|
+
start: Start,
|
|
3593
|
+
tokens: Object.assign({
|
|
3594
|
+
groups
|
|
3595
|
+
}, tk)
|
|
3596
|
+
};
|
|
3597
|
+
}
|
|
3598
|
+
function run$1(start, str) {
|
|
3599
|
+
const iterable = stringToArray(str.replace(/[A-Z]/g, (c) => c.toLowerCase()));
|
|
3600
|
+
const charCount = iterable.length;
|
|
3601
|
+
const tokens = [];
|
|
3602
|
+
let cursor = 0;
|
|
3603
|
+
let charCursor = 0;
|
|
3604
|
+
while (charCursor < charCount) {
|
|
3605
|
+
let state = start;
|
|
3606
|
+
let nextState = null;
|
|
3607
|
+
let tokenLength = 0;
|
|
3608
|
+
let latestAccepting = null;
|
|
3609
|
+
let sinceAccepts = -1;
|
|
3610
|
+
let charsSinceAccepts = -1;
|
|
3611
|
+
while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) {
|
|
3612
|
+
state = nextState;
|
|
3613
|
+
if (state.accepts()) {
|
|
3614
|
+
sinceAccepts = 0;
|
|
3615
|
+
charsSinceAccepts = 0;
|
|
3616
|
+
latestAccepting = state;
|
|
3617
|
+
} else if (sinceAccepts >= 0) {
|
|
3618
|
+
sinceAccepts += iterable[charCursor].length;
|
|
3619
|
+
charsSinceAccepts++;
|
|
3620
|
+
}
|
|
3621
|
+
tokenLength += iterable[charCursor].length;
|
|
3622
|
+
cursor += iterable[charCursor].length;
|
|
3623
|
+
charCursor++;
|
|
3624
|
+
}
|
|
3625
|
+
cursor -= sinceAccepts;
|
|
3626
|
+
charCursor -= charsSinceAccepts;
|
|
3627
|
+
tokenLength -= sinceAccepts;
|
|
3628
|
+
tokens.push({
|
|
3629
|
+
t: latestAccepting.t,
|
|
3630
|
+
// token type/name
|
|
3631
|
+
v: str.slice(cursor - tokenLength, cursor),
|
|
3632
|
+
// string value
|
|
3633
|
+
s: cursor - tokenLength,
|
|
3634
|
+
// start index
|
|
3635
|
+
e: cursor
|
|
3636
|
+
// end index (excluding)
|
|
3637
|
+
});
|
|
3638
|
+
}
|
|
3639
|
+
return tokens;
|
|
3640
|
+
}
|
|
3641
|
+
function stringToArray(str) {
|
|
3642
|
+
const result = [];
|
|
3643
|
+
const len = str.length;
|
|
3644
|
+
let index = 0;
|
|
3645
|
+
while (index < len) {
|
|
3646
|
+
let first = str.charCodeAt(index);
|
|
3647
|
+
let second;
|
|
3648
|
+
let char = first < 55296 || first > 56319 || index + 1 === len || (second = str.charCodeAt(index + 1)) < 56320 || second > 57343 ? str[index] : str.slice(index, index + 2);
|
|
3649
|
+
result.push(char);
|
|
3650
|
+
index += char.length;
|
|
3651
|
+
}
|
|
3652
|
+
return result;
|
|
3653
|
+
}
|
|
3654
|
+
function fastts(state, input, t, defaultt, jr) {
|
|
3655
|
+
let next;
|
|
3656
|
+
const len = input.length;
|
|
3657
|
+
for (let i = 0; i < len - 1; i++) {
|
|
3658
|
+
const char = input[i];
|
|
3659
|
+
if (state.j[char]) {
|
|
3660
|
+
next = state.j[char];
|
|
3661
|
+
} else {
|
|
3662
|
+
next = new State(defaultt);
|
|
3663
|
+
next.jr = jr.slice();
|
|
3664
|
+
state.j[char] = next;
|
|
3665
|
+
}
|
|
3666
|
+
state = next;
|
|
3667
|
+
}
|
|
3668
|
+
next = new State(t);
|
|
3669
|
+
next.jr = jr.slice();
|
|
3670
|
+
state.j[input[len - 1]] = next;
|
|
3671
|
+
return next;
|
|
3672
|
+
}
|
|
3673
|
+
function decodeTlds(encoded) {
|
|
3674
|
+
const words = [];
|
|
3675
|
+
const stack = [];
|
|
3676
|
+
let i = 0;
|
|
3677
|
+
let digits = "0123456789";
|
|
3678
|
+
while (i < encoded.length) {
|
|
3679
|
+
let popDigitCount = 0;
|
|
3680
|
+
while (digits.indexOf(encoded[i + popDigitCount]) >= 0) {
|
|
3681
|
+
popDigitCount++;
|
|
3682
|
+
}
|
|
3683
|
+
if (popDigitCount > 0) {
|
|
3684
|
+
words.push(stack.join(""));
|
|
3685
|
+
for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) {
|
|
3686
|
+
stack.pop();
|
|
3687
|
+
}
|
|
3688
|
+
i += popDigitCount;
|
|
3689
|
+
} else {
|
|
3690
|
+
stack.push(encoded[i]);
|
|
3691
|
+
i++;
|
|
3692
|
+
}
|
|
3693
|
+
}
|
|
3694
|
+
return words;
|
|
3695
|
+
}
|
|
3696
|
+
var defaults = {
|
|
3697
|
+
defaultProtocol: "http",
|
|
3698
|
+
events: null,
|
|
3699
|
+
format: noop,
|
|
3700
|
+
formatHref: noop,
|
|
3701
|
+
nl2br: false,
|
|
3702
|
+
tagName: "a",
|
|
3703
|
+
target: null,
|
|
3704
|
+
rel: null,
|
|
3705
|
+
validate: true,
|
|
3706
|
+
truncate: Infinity,
|
|
3707
|
+
className: null,
|
|
3708
|
+
attributes: null,
|
|
3709
|
+
ignoreTags: [],
|
|
3710
|
+
render: null
|
|
3711
|
+
};
|
|
3712
|
+
function Options(opts, defaultRender = null) {
|
|
3713
|
+
let o = Object.assign({}, defaults);
|
|
3714
|
+
if (opts) {
|
|
3715
|
+
o = Object.assign(o, opts instanceof Options ? opts.o : opts);
|
|
3716
|
+
}
|
|
3717
|
+
const ignoredTags = o.ignoreTags;
|
|
3718
|
+
const uppercaseIgnoredTags = [];
|
|
3719
|
+
for (let i = 0; i < ignoredTags.length; i++) {
|
|
3720
|
+
uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase());
|
|
3721
|
+
}
|
|
3722
|
+
this.o = o;
|
|
3723
|
+
if (defaultRender) {
|
|
3724
|
+
this.defaultRender = defaultRender;
|
|
3725
|
+
}
|
|
3726
|
+
this.ignoreTags = uppercaseIgnoredTags;
|
|
3727
|
+
}
|
|
3728
|
+
Options.prototype = {
|
|
3729
|
+
o: defaults,
|
|
3730
|
+
/**
|
|
3731
|
+
* @type string[]
|
|
3732
|
+
*/
|
|
3733
|
+
ignoreTags: [],
|
|
3734
|
+
/**
|
|
3735
|
+
* @param {IntermediateRepresentation} ir
|
|
3736
|
+
* @returns {any}
|
|
3737
|
+
*/
|
|
3738
|
+
defaultRender(ir) {
|
|
3739
|
+
return ir;
|
|
3740
|
+
},
|
|
3741
|
+
/**
|
|
3742
|
+
* Returns true or false based on whether a token should be displayed as a
|
|
3743
|
+
* link based on the user options.
|
|
3744
|
+
* @param {MultiToken} token
|
|
3745
|
+
* @returns {boolean}
|
|
3746
|
+
*/
|
|
3747
|
+
check(token) {
|
|
3748
|
+
return this.get("validate", token.toString(), token);
|
|
3749
|
+
},
|
|
3750
|
+
// Private methods
|
|
3751
|
+
/**
|
|
3752
|
+
* Resolve an option's value based on the value of the option and the given
|
|
3753
|
+
* params. If operator and token are specified and the target option is
|
|
3754
|
+
* callable, automatically calls the function with the given argument.
|
|
3755
|
+
* @template {keyof Opts} K
|
|
3756
|
+
* @param {K} key Name of option to use
|
|
3757
|
+
* @param {string} [operator] will be passed to the target option if it's a
|
|
3758
|
+
* function. If not specified, RAW function value gets returned
|
|
3759
|
+
* @param {MultiToken} [token] The token from linkify.tokenize
|
|
3760
|
+
* @returns {Opts[K] | any}
|
|
3761
|
+
*/
|
|
3762
|
+
get(key, operator, token) {
|
|
3763
|
+
const isCallable = operator != null;
|
|
3764
|
+
let option = this.o[key];
|
|
3765
|
+
if (!option) {
|
|
3766
|
+
return option;
|
|
3767
|
+
}
|
|
3768
|
+
if (typeof option === "object") {
|
|
3769
|
+
option = token.t in option ? option[token.t] : defaults[key];
|
|
3770
|
+
if (typeof option === "function" && isCallable) {
|
|
3771
|
+
option = option(operator, token);
|
|
3772
|
+
}
|
|
3773
|
+
} else if (typeof option === "function" && isCallable) {
|
|
3774
|
+
option = option(operator, token.t, token);
|
|
3775
|
+
}
|
|
3776
|
+
return option;
|
|
3777
|
+
},
|
|
3778
|
+
/**
|
|
3779
|
+
* @template {keyof Opts} L
|
|
3780
|
+
* @param {L} key Name of options object to use
|
|
3781
|
+
* @param {string} [operator]
|
|
3782
|
+
* @param {MultiToken} [token]
|
|
3783
|
+
* @returns {Opts[L] | any}
|
|
3784
|
+
*/
|
|
3785
|
+
getObj(key, operator, token) {
|
|
3786
|
+
let obj = this.o[key];
|
|
3787
|
+
if (typeof obj === "function" && operator != null) {
|
|
3788
|
+
obj = obj(operator, token.t, token);
|
|
3789
|
+
}
|
|
3790
|
+
return obj;
|
|
3791
|
+
},
|
|
3792
|
+
/**
|
|
3793
|
+
* Convert the given token to a rendered element that may be added to the
|
|
3794
|
+
* calling-interface's DOM
|
|
3795
|
+
* @param {MultiToken} token Token to render to an HTML element
|
|
3796
|
+
* @returns {any} Render result; e.g., HTML string, DOM element, React
|
|
3797
|
+
* Component, etc.
|
|
3798
|
+
*/
|
|
3799
|
+
render(token) {
|
|
3800
|
+
const ir = token.render(this);
|
|
3801
|
+
const renderFn = this.get("render", null, token) || this.defaultRender;
|
|
3802
|
+
return renderFn(ir, token.t, token);
|
|
3803
|
+
}
|
|
3804
|
+
};
|
|
3805
|
+
function noop(val) {
|
|
3806
|
+
return val;
|
|
3807
|
+
}
|
|
3808
|
+
function MultiToken(value, tokens) {
|
|
3809
|
+
this.t = "token";
|
|
3810
|
+
this.v = value;
|
|
3811
|
+
this.tk = tokens;
|
|
3812
|
+
}
|
|
3813
|
+
MultiToken.prototype = {
|
|
3814
|
+
isLink: false,
|
|
3815
|
+
/**
|
|
3816
|
+
* Return the string this token represents.
|
|
3817
|
+
* @return {string}
|
|
3818
|
+
*/
|
|
3819
|
+
toString() {
|
|
3820
|
+
return this.v;
|
|
3821
|
+
},
|
|
3822
|
+
/**
|
|
3823
|
+
* What should the value for this token be in the `href` HTML attribute?
|
|
3824
|
+
* Returns the `.toString` value by default.
|
|
3825
|
+
* @param {string} [scheme]
|
|
3826
|
+
* @return {string}
|
|
3827
|
+
*/
|
|
3828
|
+
toHref(scheme2) {
|
|
3829
|
+
return this.toString();
|
|
3830
|
+
},
|
|
3831
|
+
/**
|
|
3832
|
+
* @param {Options} options Formatting options
|
|
3833
|
+
* @returns {string}
|
|
3834
|
+
*/
|
|
3835
|
+
toFormattedString(options) {
|
|
3836
|
+
const val = this.toString();
|
|
3837
|
+
const truncate = options.get("truncate", val, this);
|
|
3838
|
+
const formatted = options.get("format", val, this);
|
|
3839
|
+
return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + "\u2026" : formatted;
|
|
3840
|
+
},
|
|
3841
|
+
/**
|
|
3842
|
+
*
|
|
3843
|
+
* @param {Options} options
|
|
3844
|
+
* @returns {string}
|
|
3845
|
+
*/
|
|
3846
|
+
toFormattedHref(options) {
|
|
3847
|
+
return options.get("formatHref", this.toHref(options.get("defaultProtocol")), this);
|
|
3848
|
+
},
|
|
3849
|
+
/**
|
|
3850
|
+
* The start index of this token in the original input string
|
|
3851
|
+
* @returns {number}
|
|
3852
|
+
*/
|
|
3853
|
+
startIndex() {
|
|
3854
|
+
return this.tk[0].s;
|
|
3855
|
+
},
|
|
3856
|
+
/**
|
|
3857
|
+
* The end index of this token in the original input string (up to this
|
|
3858
|
+
* index but not including it)
|
|
3859
|
+
* @returns {number}
|
|
3860
|
+
*/
|
|
3861
|
+
endIndex() {
|
|
3862
|
+
return this.tk[this.tk.length - 1].e;
|
|
3863
|
+
},
|
|
3864
|
+
/**
|
|
3865
|
+
Returns an object of relevant values for this token, which includes keys
|
|
3866
|
+
* type - Kind of token ('url', 'email', etc.)
|
|
3867
|
+
* value - Original text
|
|
3868
|
+
* href - The value that should be added to the anchor tag's href
|
|
3869
|
+
attribute
|
|
3870
|
+
@method toObject
|
|
3871
|
+
@param {string} [protocol] `'http'` by default
|
|
3872
|
+
*/
|
|
3873
|
+
toObject(protocol = defaults.defaultProtocol) {
|
|
3874
|
+
return {
|
|
3875
|
+
type: this.t,
|
|
3876
|
+
value: this.toString(),
|
|
3877
|
+
isLink: this.isLink,
|
|
3878
|
+
href: this.toHref(protocol),
|
|
3879
|
+
start: this.startIndex(),
|
|
3880
|
+
end: this.endIndex()
|
|
3881
|
+
};
|
|
3882
|
+
},
|
|
3883
|
+
/**
|
|
3884
|
+
*
|
|
3885
|
+
* @param {Options} options Formatting option
|
|
3886
|
+
*/
|
|
3887
|
+
toFormattedObject(options) {
|
|
3888
|
+
return {
|
|
3889
|
+
type: this.t,
|
|
3890
|
+
value: this.toFormattedString(options),
|
|
3891
|
+
isLink: this.isLink,
|
|
3892
|
+
href: this.toFormattedHref(options),
|
|
3893
|
+
start: this.startIndex(),
|
|
3894
|
+
end: this.endIndex()
|
|
3895
|
+
};
|
|
3896
|
+
},
|
|
3897
|
+
/**
|
|
3898
|
+
* Whether this token should be rendered as a link according to the given options
|
|
3899
|
+
* @param {Options} options
|
|
3900
|
+
* @returns {boolean}
|
|
3901
|
+
*/
|
|
3902
|
+
validate(options) {
|
|
3903
|
+
return options.get("validate", this.toString(), this);
|
|
3904
|
+
},
|
|
3905
|
+
/**
|
|
3906
|
+
* Return an object that represents how this link should be rendered.
|
|
3907
|
+
* @param {Options} options Formattinng options
|
|
3908
|
+
*/
|
|
3909
|
+
render(options) {
|
|
3910
|
+
const token = this;
|
|
3911
|
+
const href = this.toHref(options.get("defaultProtocol"));
|
|
3912
|
+
const formattedHref = options.get("formatHref", href, this);
|
|
3913
|
+
const tagName = options.get("tagName", href, token);
|
|
3914
|
+
const content = this.toFormattedString(options);
|
|
3915
|
+
const attributes = {};
|
|
3916
|
+
const className = options.get("className", href, token);
|
|
3917
|
+
const target = options.get("target", href, token);
|
|
3918
|
+
const rel = options.get("rel", href, token);
|
|
3919
|
+
const attrs = options.getObj("attributes", href, token);
|
|
3920
|
+
const eventListeners = options.getObj("events", href, token);
|
|
3921
|
+
attributes.href = formattedHref;
|
|
3922
|
+
if (className) {
|
|
3923
|
+
attributes.class = className;
|
|
3924
|
+
}
|
|
3925
|
+
if (target) {
|
|
3926
|
+
attributes.target = target;
|
|
3927
|
+
}
|
|
3928
|
+
if (rel) {
|
|
3929
|
+
attributes.rel = rel;
|
|
3930
|
+
}
|
|
3931
|
+
if (attrs) {
|
|
3932
|
+
Object.assign(attributes, attrs);
|
|
3933
|
+
}
|
|
3934
|
+
return {
|
|
3935
|
+
tagName,
|
|
3936
|
+
attributes,
|
|
3937
|
+
content,
|
|
3938
|
+
eventListeners
|
|
3939
|
+
};
|
|
3940
|
+
}
|
|
3941
|
+
};
|
|
3942
|
+
function createTokenClass(type, props) {
|
|
3943
|
+
class Token extends MultiToken {
|
|
3944
|
+
constructor(value, tokens) {
|
|
3945
|
+
super(value, tokens);
|
|
3946
|
+
this.t = type;
|
|
3947
|
+
}
|
|
3948
|
+
}
|
|
3949
|
+
for (const p in props) {
|
|
3950
|
+
Token.prototype[p] = props[p];
|
|
3951
|
+
}
|
|
3952
|
+
Token.t = type;
|
|
3953
|
+
return Token;
|
|
3954
|
+
}
|
|
3955
|
+
var Email = createTokenClass("email", {
|
|
3956
|
+
isLink: true,
|
|
3957
|
+
toHref() {
|
|
3958
|
+
return "mailto:" + this.toString();
|
|
3959
|
+
}
|
|
3960
|
+
});
|
|
3961
|
+
var Text = createTokenClass("text");
|
|
3962
|
+
var Nl = createTokenClass("nl");
|
|
3963
|
+
var Url = createTokenClass("url", {
|
|
3964
|
+
isLink: true,
|
|
3965
|
+
/**
|
|
3966
|
+
Lowercases relevant parts of the domain and adds the protocol if
|
|
3967
|
+
required. Note that this will not escape unsafe HTML characters in the
|
|
3968
|
+
URL.
|
|
3969
|
+
@param {string} [scheme] default scheme (e.g., 'https')
|
|
3970
|
+
@return {string} the full href
|
|
3971
|
+
*/
|
|
3972
|
+
toHref(scheme2 = defaults.defaultProtocol) {
|
|
3973
|
+
return this.hasProtocol() ? this.v : `${scheme2}://${this.v}`;
|
|
3974
|
+
},
|
|
3975
|
+
/**
|
|
3976
|
+
* Check whether this URL token has a protocol
|
|
3977
|
+
* @return {boolean}
|
|
3978
|
+
*/
|
|
3979
|
+
hasProtocol() {
|
|
3980
|
+
const tokens = this.tk;
|
|
3981
|
+
return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON;
|
|
3982
|
+
}
|
|
3983
|
+
});
|
|
3984
|
+
var makeState = (arg) => new State(arg);
|
|
3985
|
+
function init$1({
|
|
3986
|
+
groups
|
|
3987
|
+
}) {
|
|
3988
|
+
const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]);
|
|
3989
|
+
const qsNonAccepting = [APOSTROPHE, COLON, COMMA, DOT, EXCLAMATION, PERCENT, QUERY, QUOTE, SEMI, OPENANGLEBRACKET, CLOSEANGLEBRACKET, OPENBRACE, CLOSEBRACE, CLOSEBRACKET, OPENBRACKET, OPENPAREN, CLOSEPAREN, FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN, LEFTCORNERBRACKET, RIGHTCORNERBRACKET, LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET, FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN];
|
|
3990
|
+
const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE];
|
|
3991
|
+
const Start = makeState();
|
|
3992
|
+
const Localpart = tt(Start, TILDE);
|
|
3993
|
+
ta(Localpart, localpartAccepting, Localpart);
|
|
3994
|
+
ta(Localpart, groups.domain, Localpart);
|
|
3995
|
+
const Domain = makeState(), Scheme = makeState(), SlashScheme = makeState();
|
|
3996
|
+
ta(Start, groups.domain, Domain);
|
|
3997
|
+
ta(Start, groups.scheme, Scheme);
|
|
3998
|
+
ta(Start, groups.slashscheme, SlashScheme);
|
|
3999
|
+
ta(Domain, localpartAccepting, Localpart);
|
|
4000
|
+
ta(Domain, groups.domain, Domain);
|
|
4001
|
+
const LocalpartAt = tt(Domain, AT);
|
|
4002
|
+
tt(Localpart, AT, LocalpartAt);
|
|
4003
|
+
tt(Scheme, AT, LocalpartAt);
|
|
4004
|
+
tt(SlashScheme, AT, LocalpartAt);
|
|
4005
|
+
const LocalpartDot = tt(Localpart, DOT);
|
|
4006
|
+
ta(LocalpartDot, localpartAccepting, Localpart);
|
|
4007
|
+
ta(LocalpartDot, groups.domain, Localpart);
|
|
4008
|
+
const EmailDomain = makeState();
|
|
4009
|
+
ta(LocalpartAt, groups.domain, EmailDomain);
|
|
4010
|
+
ta(EmailDomain, groups.domain, EmailDomain);
|
|
4011
|
+
const EmailDomainDot = tt(EmailDomain, DOT);
|
|
4012
|
+
ta(EmailDomainDot, groups.domain, EmailDomain);
|
|
4013
|
+
const Email$1 = makeState(Email);
|
|
4014
|
+
ta(EmailDomainDot, groups.tld, Email$1);
|
|
4015
|
+
ta(EmailDomainDot, groups.utld, Email$1);
|
|
4016
|
+
tt(LocalpartAt, LOCALHOST, Email$1);
|
|
4017
|
+
const EmailDomainHyphen = tt(EmailDomain, HYPHEN);
|
|
4018
|
+
tt(EmailDomainHyphen, HYPHEN, EmailDomainHyphen);
|
|
4019
|
+
ta(EmailDomainHyphen, groups.domain, EmailDomain);
|
|
4020
|
+
ta(Email$1, groups.domain, EmailDomain);
|
|
4021
|
+
tt(Email$1, DOT, EmailDomainDot);
|
|
4022
|
+
tt(Email$1, HYPHEN, EmailDomainHyphen);
|
|
4023
|
+
const EmailColon = tt(Email$1, COLON);
|
|
4024
|
+
ta(EmailColon, groups.numeric, Email);
|
|
4025
|
+
const DomainHyphen = tt(Domain, HYPHEN);
|
|
4026
|
+
const DomainDot = tt(Domain, DOT);
|
|
4027
|
+
tt(DomainHyphen, HYPHEN, DomainHyphen);
|
|
4028
|
+
ta(DomainHyphen, groups.domain, Domain);
|
|
4029
|
+
ta(DomainDot, localpartAccepting, Localpart);
|
|
4030
|
+
ta(DomainDot, groups.domain, Domain);
|
|
4031
|
+
const DomainDotTld = makeState(Url);
|
|
4032
|
+
ta(DomainDot, groups.tld, DomainDotTld);
|
|
4033
|
+
ta(DomainDot, groups.utld, DomainDotTld);
|
|
4034
|
+
ta(DomainDotTld, groups.domain, Domain);
|
|
4035
|
+
ta(DomainDotTld, localpartAccepting, Localpart);
|
|
4036
|
+
tt(DomainDotTld, DOT, DomainDot);
|
|
4037
|
+
tt(DomainDotTld, HYPHEN, DomainHyphen);
|
|
4038
|
+
tt(DomainDotTld, AT, LocalpartAt);
|
|
4039
|
+
const DomainDotTldColon = tt(DomainDotTld, COLON);
|
|
4040
|
+
const DomainDotTldColonPort = makeState(Url);
|
|
4041
|
+
ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort);
|
|
4042
|
+
const Url$1 = makeState(Url);
|
|
4043
|
+
const UrlNonaccept = makeState();
|
|
4044
|
+
ta(Url$1, qsAccepting, Url$1);
|
|
4045
|
+
ta(Url$1, qsNonAccepting, UrlNonaccept);
|
|
4046
|
+
ta(UrlNonaccept, qsAccepting, Url$1);
|
|
4047
|
+
ta(UrlNonaccept, qsNonAccepting, UrlNonaccept);
|
|
4048
|
+
tt(DomainDotTld, SLASH, Url$1);
|
|
4049
|
+
tt(DomainDotTldColonPort, SLASH, Url$1);
|
|
4050
|
+
const SchemeColon = tt(Scheme, COLON);
|
|
4051
|
+
const SlashSchemeColon = tt(SlashScheme, COLON);
|
|
4052
|
+
const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH);
|
|
4053
|
+
const UriPrefix = tt(SlashSchemeColonSlash, SLASH);
|
|
4054
|
+
ta(Scheme, groups.domain, Domain);
|
|
4055
|
+
tt(Scheme, DOT, DomainDot);
|
|
4056
|
+
tt(Scheme, HYPHEN, DomainHyphen);
|
|
4057
|
+
ta(SlashScheme, groups.domain, Domain);
|
|
4058
|
+
tt(SlashScheme, DOT, DomainDot);
|
|
4059
|
+
tt(SlashScheme, HYPHEN, DomainHyphen);
|
|
4060
|
+
ta(SchemeColon, groups.domain, Url$1);
|
|
4061
|
+
tt(SchemeColon, SLASH, Url$1);
|
|
4062
|
+
tt(SchemeColon, QUERY, Url$1);
|
|
4063
|
+
ta(UriPrefix, groups.domain, Url$1);
|
|
4064
|
+
ta(UriPrefix, qsAccepting, Url$1);
|
|
4065
|
+
tt(UriPrefix, SLASH, Url$1);
|
|
4066
|
+
const bracketPairs = [
|
|
4067
|
+
[OPENBRACE, CLOSEBRACE],
|
|
4068
|
+
// {}
|
|
4069
|
+
[OPENBRACKET, CLOSEBRACKET],
|
|
4070
|
+
// []
|
|
4071
|
+
[OPENPAREN, CLOSEPAREN],
|
|
4072
|
+
// ()
|
|
4073
|
+
[OPENANGLEBRACKET, CLOSEANGLEBRACKET],
|
|
4074
|
+
// <>
|
|
4075
|
+
[FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN],
|
|
4076
|
+
// ()
|
|
4077
|
+
[LEFTCORNERBRACKET, RIGHTCORNERBRACKET],
|
|
4078
|
+
// 「」
|
|
4079
|
+
[LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET],
|
|
4080
|
+
// 『』
|
|
4081
|
+
[FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN]
|
|
4082
|
+
// <>
|
|
4083
|
+
];
|
|
4084
|
+
for (let i = 0; i < bracketPairs.length; i++) {
|
|
4085
|
+
const [OPEN, CLOSE] = bracketPairs[i];
|
|
4086
|
+
const UrlOpen = tt(Url$1, OPEN);
|
|
4087
|
+
tt(UrlNonaccept, OPEN, UrlOpen);
|
|
4088
|
+
tt(UrlOpen, CLOSE, Url$1);
|
|
4089
|
+
const UrlOpenQ = makeState(Url);
|
|
4090
|
+
ta(UrlOpen, qsAccepting, UrlOpenQ);
|
|
4091
|
+
const UrlOpenSyms = makeState();
|
|
4092
|
+
ta(UrlOpen, qsNonAccepting);
|
|
4093
|
+
ta(UrlOpenQ, qsAccepting, UrlOpenQ);
|
|
4094
|
+
ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
|
|
4095
|
+
ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
|
|
4096
|
+
ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms);
|
|
4097
|
+
tt(UrlOpenQ, CLOSE, Url$1);
|
|
4098
|
+
tt(UrlOpenSyms, CLOSE, Url$1);
|
|
4099
|
+
}
|
|
4100
|
+
tt(Start, LOCALHOST, DomainDotTld);
|
|
4101
|
+
tt(Start, NL, Nl);
|
|
4102
|
+
return {
|
|
4103
|
+
start: Start,
|
|
4104
|
+
tokens: tk
|
|
4105
|
+
};
|
|
4106
|
+
}
|
|
4107
|
+
function run(start, input, tokens) {
|
|
4108
|
+
let len = tokens.length;
|
|
4109
|
+
let cursor = 0;
|
|
4110
|
+
let multis = [];
|
|
4111
|
+
let textTokens = [];
|
|
4112
|
+
while (cursor < len) {
|
|
4113
|
+
let state = start;
|
|
4114
|
+
let secondState = null;
|
|
4115
|
+
let nextState = null;
|
|
4116
|
+
let multiLength = 0;
|
|
4117
|
+
let latestAccepting = null;
|
|
4118
|
+
let sinceAccepts = -1;
|
|
4119
|
+
while (cursor < len && !(secondState = state.go(tokens[cursor].t))) {
|
|
4120
|
+
textTokens.push(tokens[cursor++]);
|
|
4121
|
+
}
|
|
4122
|
+
while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) {
|
|
4123
|
+
secondState = null;
|
|
4124
|
+
state = nextState;
|
|
4125
|
+
if (state.accepts()) {
|
|
4126
|
+
sinceAccepts = 0;
|
|
4127
|
+
latestAccepting = state;
|
|
4128
|
+
} else if (sinceAccepts >= 0) {
|
|
4129
|
+
sinceAccepts++;
|
|
4130
|
+
}
|
|
4131
|
+
cursor++;
|
|
4132
|
+
multiLength++;
|
|
4133
|
+
}
|
|
4134
|
+
if (sinceAccepts < 0) {
|
|
4135
|
+
cursor -= multiLength;
|
|
4136
|
+
if (cursor < len) {
|
|
4137
|
+
textTokens.push(tokens[cursor]);
|
|
4138
|
+
cursor++;
|
|
4139
|
+
}
|
|
4140
|
+
} else {
|
|
4141
|
+
if (textTokens.length > 0) {
|
|
4142
|
+
multis.push(initMultiToken(Text, input, textTokens));
|
|
4143
|
+
textTokens = [];
|
|
4144
|
+
}
|
|
4145
|
+
cursor -= sinceAccepts;
|
|
4146
|
+
multiLength -= sinceAccepts;
|
|
4147
|
+
const Multi = latestAccepting.t;
|
|
4148
|
+
const subtokens = tokens.slice(cursor - multiLength, cursor);
|
|
4149
|
+
multis.push(initMultiToken(Multi, input, subtokens));
|
|
4150
|
+
}
|
|
4151
|
+
}
|
|
4152
|
+
if (textTokens.length > 0) {
|
|
4153
|
+
multis.push(initMultiToken(Text, input, textTokens));
|
|
4154
|
+
}
|
|
4155
|
+
return multis;
|
|
4156
|
+
}
|
|
4157
|
+
function initMultiToken(Multi, input, tokens) {
|
|
4158
|
+
const startIdx = tokens[0].s;
|
|
4159
|
+
const endIdx = tokens[tokens.length - 1].e;
|
|
4160
|
+
const value = input.slice(startIdx, endIdx);
|
|
4161
|
+
return new Multi(value, tokens);
|
|
4162
|
+
}
|
|
4163
|
+
var INIT = {
|
|
4164
|
+
scanner: null,
|
|
4165
|
+
parser: null,
|
|
4166
|
+
tokenQueue: [],
|
|
4167
|
+
pluginQueue: [],
|
|
4168
|
+
customSchemes: [],
|
|
4169
|
+
initialized: false
|
|
4170
|
+
};
|
|
4171
|
+
function init() {
|
|
4172
|
+
INIT.scanner = init$2(INIT.customSchemes);
|
|
4173
|
+
for (let i = 0; i < INIT.tokenQueue.length; i++) {
|
|
4174
|
+
INIT.tokenQueue[i][1]({
|
|
4175
|
+
scanner: INIT.scanner
|
|
4176
|
+
});
|
|
4177
|
+
}
|
|
4178
|
+
INIT.parser = init$1(INIT.scanner.tokens);
|
|
4179
|
+
for (let i = 0; i < INIT.pluginQueue.length; i++) {
|
|
4180
|
+
INIT.pluginQueue[i][1]({
|
|
4181
|
+
scanner: INIT.scanner,
|
|
4182
|
+
parser: INIT.parser
|
|
4183
|
+
});
|
|
4184
|
+
}
|
|
4185
|
+
INIT.initialized = true;
|
|
4186
|
+
return INIT;
|
|
4187
|
+
}
|
|
4188
|
+
function tokenize(str) {
|
|
4189
|
+
if (!INIT.initialized) {
|
|
4190
|
+
init();
|
|
4191
|
+
}
|
|
4192
|
+
return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));
|
|
4193
|
+
}
|
|
4194
|
+
tokenize.scan = run$1;
|
|
4195
|
+
function find(str, type = null, opts = null) {
|
|
4196
|
+
if (type && typeof type === "object") {
|
|
4197
|
+
if (opts) {
|
|
4198
|
+
throw Error(`linkifyjs: Invalid link type ${type}; must be a string`);
|
|
4199
|
+
}
|
|
4200
|
+
opts = type;
|
|
4201
|
+
type = null;
|
|
4202
|
+
}
|
|
4203
|
+
const options = new Options(opts);
|
|
4204
|
+
const tokens = tokenize(str);
|
|
4205
|
+
const filtered = [];
|
|
4206
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
4207
|
+
const token = tokens[i];
|
|
4208
|
+
if (token.isLink && (!type || token.t === type) && options.check(token)) {
|
|
4209
|
+
filtered.push(token.toFormattedObject(options));
|
|
4210
|
+
}
|
|
4211
|
+
}
|
|
4212
|
+
return filtered;
|
|
4213
|
+
}
|
|
4214
|
+
|
|
4215
|
+
// src/extensions/base/link.ts
|
|
4216
|
+
var isSameDomain = (url) => {
|
|
4217
|
+
if (typeof window === "undefined") return false;
|
|
4218
|
+
try {
|
|
4219
|
+
return new URL(url).hostname === window.location.hostname;
|
|
4220
|
+
} catch {
|
|
4221
|
+
return false;
|
|
4222
|
+
}
|
|
4223
|
+
};
|
|
3089
4224
|
var LinkExtension = Link.extend({
|
|
3090
|
-
|
|
4225
|
+
addAttributes() {
|
|
3091
4226
|
return {
|
|
3092
4227
|
...this.parent?.(),
|
|
3093
|
-
|
|
3094
|
-
|
|
3095
|
-
|
|
3096
|
-
|
|
4228
|
+
target: {
|
|
4229
|
+
default: "_blank",
|
|
4230
|
+
parseHTML: (element) => {
|
|
4231
|
+
const href = element.getAttribute("href") ?? "";
|
|
4232
|
+
return isSameDomain(href) ? "_self" : "_blank";
|
|
4233
|
+
}
|
|
4234
|
+
},
|
|
4235
|
+
rel: {
|
|
4236
|
+
default: null,
|
|
4237
|
+
parseHTML: (element) => {
|
|
4238
|
+
const href = element.getAttribute("href") ?? "";
|
|
4239
|
+
return isSameDomain(href) ? null : "noopener noreferrer nofollow";
|
|
4240
|
+
}
|
|
4241
|
+
}
|
|
3097
4242
|
};
|
|
4243
|
+
},
|
|
4244
|
+
addPasteRules() {
|
|
4245
|
+
if (!this.options.linkOnPaste) {
|
|
4246
|
+
return this.parent?.() ?? [];
|
|
4247
|
+
}
|
|
4248
|
+
const { protocols, defaultProtocol } = this.options;
|
|
4249
|
+
return [
|
|
4250
|
+
markPasteRule({
|
|
4251
|
+
find: (text) => find(text).filter(
|
|
4252
|
+
(link) => link.isLink && this.options.isAllowedUri(link.value, {
|
|
4253
|
+
defaultValidate: (href) => !!isAllowedUri(href, protocols),
|
|
4254
|
+
protocols,
|
|
4255
|
+
defaultProtocol
|
|
4256
|
+
})
|
|
4257
|
+
).filter((link) => this.options.shouldAutoLink?.(link.value) !== false).map((link) => ({ text: link.value, data: { href: link.href }, index: link.start })),
|
|
4258
|
+
type: this.type,
|
|
4259
|
+
getAttributes: (match) => {
|
|
4260
|
+
const href = match.data?.href ?? "";
|
|
4261
|
+
const sameDomain = isSameDomain(href);
|
|
4262
|
+
return {
|
|
4263
|
+
href,
|
|
4264
|
+
target: sameDomain ? "_self" : "_blank",
|
|
4265
|
+
rel: sameDomain ? null : "noopener noreferrer nofollow"
|
|
4266
|
+
};
|
|
4267
|
+
}
|
|
4268
|
+
})
|
|
4269
|
+
];
|
|
3098
4270
|
}
|
|
3099
4271
|
}).configure({
|
|
3100
4272
|
openOnClick: false,
|
|
@@ -3168,13 +4340,13 @@ var BasePrompt = Node4.create({
|
|
|
3168
4340
|
if (!isInsidePrompt) {
|
|
3169
4341
|
return false;
|
|
3170
4342
|
}
|
|
3171
|
-
const { tr } = state;
|
|
4343
|
+
const { tr: tr2 } = state;
|
|
3172
4344
|
const posAfter = $pos.after(depth);
|
|
3173
4345
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
3174
4346
|
if (!paragraphNode) return false;
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
view.dispatch(
|
|
4347
|
+
tr2.insert(posAfter, paragraphNode);
|
|
4348
|
+
tr2.setSelection(TextSelection3.create(tr2.doc, posAfter + 1));
|
|
4349
|
+
view.dispatch(tr2);
|
|
3178
4350
|
return true;
|
|
3179
4351
|
}
|
|
3180
4352
|
};
|
|
@@ -3279,6 +4451,43 @@ var BaseFigure = Image2.extend({
|
|
|
3279
4451
|
addAttributes() {
|
|
3280
4452
|
return {
|
|
3281
4453
|
...this.parent?.(),
|
|
4454
|
+
src: {
|
|
4455
|
+
default: null,
|
|
4456
|
+
parseHTML: (element) => {
|
|
4457
|
+
const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
|
|
4458
|
+
return img?.getAttribute("src") ?? null;
|
|
4459
|
+
}
|
|
4460
|
+
},
|
|
4461
|
+
alt: {
|
|
4462
|
+
default: null,
|
|
4463
|
+
parseHTML: (element) => {
|
|
4464
|
+
const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
|
|
4465
|
+
return img?.getAttribute("alt") ?? null;
|
|
4466
|
+
}
|
|
4467
|
+
},
|
|
4468
|
+
title: {
|
|
4469
|
+
default: null,
|
|
4470
|
+
parseHTML: (element) => {
|
|
4471
|
+
const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
|
|
4472
|
+
return img?.getAttribute("title") ?? null;
|
|
4473
|
+
}
|
|
4474
|
+
},
|
|
4475
|
+
width: {
|
|
4476
|
+
default: null,
|
|
4477
|
+
parseHTML: (element) => {
|
|
4478
|
+
const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
|
|
4479
|
+
const val = img?.getAttribute("width");
|
|
4480
|
+
return val ? parseInt(val) : null;
|
|
4481
|
+
}
|
|
4482
|
+
},
|
|
4483
|
+
height: {
|
|
4484
|
+
default: null,
|
|
4485
|
+
parseHTML: (element) => {
|
|
4486
|
+
const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
|
|
4487
|
+
const val = img?.getAttribute("height");
|
|
4488
|
+
return val ? parseInt(val) : null;
|
|
4489
|
+
}
|
|
4490
|
+
},
|
|
3282
4491
|
fileId: {
|
|
3283
4492
|
default: null,
|
|
3284
4493
|
parseHTML: (element) => {
|
|
@@ -3517,13 +4726,13 @@ var BaseLegacySEQuote = Node6.create({
|
|
|
3517
4726
|
if (!isInsideCustomQuoteV2) {
|
|
3518
4727
|
return false;
|
|
3519
4728
|
}
|
|
3520
|
-
const { tr } = state;
|
|
4729
|
+
const { tr: tr2 } = state;
|
|
3521
4730
|
const posAfter = $pos.after(depth);
|
|
3522
4731
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
3523
4732
|
if (!paragraphNode) return false;
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
view.dispatch(
|
|
4733
|
+
tr2.insert(posAfter, paragraphNode);
|
|
4734
|
+
tr2.setSelection(TextSelection4.create(tr2.doc, posAfter + 1));
|
|
4735
|
+
view.dispatch(tr2);
|
|
3527
4736
|
return true;
|
|
3528
4737
|
}
|
|
3529
4738
|
};
|
|
@@ -3565,13 +4774,13 @@ var BaseLegacyPromptSE = Node6.create({
|
|
|
3565
4774
|
if (!isInsidePromptV2) {
|
|
3566
4775
|
return false;
|
|
3567
4776
|
}
|
|
3568
|
-
const { tr } = state;
|
|
4777
|
+
const { tr: tr2 } = state;
|
|
3569
4778
|
const posAfter = $pos.after(depth);
|
|
3570
4779
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
3571
4780
|
if (!paragraphNode) return false;
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
view.dispatch(
|
|
4781
|
+
tr2.insert(posAfter, paragraphNode);
|
|
4782
|
+
tr2.setSelection(TextSelection4.create(tr2.doc, posAfter + 1));
|
|
4783
|
+
view.dispatch(tr2);
|
|
3575
4784
|
return true;
|
|
3576
4785
|
}
|
|
3577
4786
|
};
|
|
@@ -4135,19 +5344,19 @@ var legacyTypeMap3 = {
|
|
|
4135
5344
|
info: "success",
|
|
4136
5345
|
error: "error"
|
|
4137
5346
|
};
|
|
4138
|
-
var Callout = ({ type, bgColor, emoji, children, iconWrapper, calloutType }) => {
|
|
5347
|
+
var Callout = ({ type, bgColor, emoji: emoji2, children, iconWrapper, calloutType }) => {
|
|
4139
5348
|
const isLegacySECallout = !!calloutType;
|
|
4140
5349
|
const finalType = isLegacySECallout ? legacyTypeMap3[calloutType] : type;
|
|
4141
5350
|
const hasCustomColor = !!bgColor;
|
|
4142
5351
|
const className = hasCustomColor ? "callout-node" : `callout-node callout-${finalType}`;
|
|
4143
5352
|
const style = hasCustomColor ? { backgroundColor: bgColor } : void 0;
|
|
4144
5353
|
let icon;
|
|
4145
|
-
if (
|
|
4146
|
-
if (
|
|
4147
|
-
const IconComponent = calloutIconComponents[
|
|
5354
|
+
if (emoji2) {
|
|
5355
|
+
if (emoji2 in calloutIconComponents) {
|
|
5356
|
+
const IconComponent = calloutIconComponents[emoji2];
|
|
4148
5357
|
icon = /* @__PURE__ */ jsx75(IconComponent, {});
|
|
4149
5358
|
} else {
|
|
4150
|
-
icon =
|
|
5359
|
+
icon = emoji2;
|
|
4151
5360
|
}
|
|
4152
5361
|
} else {
|
|
4153
5362
|
icon = calloutIcons[finalType];
|
|
@@ -4159,7 +5368,7 @@ var Callout = ({ type, bgColor, emoji, children, iconWrapper, calloutType }) =>
|
|
|
4159
5368
|
className,
|
|
4160
5369
|
"data-callout-type": hasCustomColor ? void 0 : type,
|
|
4161
5370
|
"data-bg-color": bgColor || void 0,
|
|
4162
|
-
"data-emoji":
|
|
5371
|
+
"data-emoji": emoji2 || void 0,
|
|
4163
5372
|
style,
|
|
4164
5373
|
children: [
|
|
4165
5374
|
iconContent,
|
|
@@ -4481,7 +5690,7 @@ import { jsx as jsx84, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
|
4481
5690
|
var CalloutView = (props) => {
|
|
4482
5691
|
const type = props.node.attrs.type || "info";
|
|
4483
5692
|
const bgColor = props.node.attrs.bgColor;
|
|
4484
|
-
const
|
|
5693
|
+
const emoji2 = props.node.attrs.emoji;
|
|
4485
5694
|
const [showEmojiPicker, setShowEmojiPicker] = useState10(false);
|
|
4486
5695
|
const handleIconClick = (e) => {
|
|
4487
5696
|
e.preventDefault();
|
|
@@ -4497,7 +5706,7 @@ var CalloutView = (props) => {
|
|
|
4497
5706
|
{
|
|
4498
5707
|
type,
|
|
4499
5708
|
bgColor,
|
|
4500
|
-
emoji,
|
|
5709
|
+
emoji: emoji2,
|
|
4501
5710
|
iconWrapper: (icon) => /* @__PURE__ */ jsxs34("div", { className: "callout-icon-wrapper", children: [
|
|
4502
5711
|
/* @__PURE__ */ jsx84(
|
|
4503
5712
|
"button",
|
|
@@ -4846,14 +6055,14 @@ var TextStyle = Mark2.create({
|
|
|
4846
6055
|
toggleTextStyle: (attributes) => ({ commands }) => {
|
|
4847
6056
|
return commands.toggleMark(this.name, attributes);
|
|
4848
6057
|
},
|
|
4849
|
-
removeEmptyTextStyle: () => ({ tr }) => {
|
|
4850
|
-
const { selection } =
|
|
4851
|
-
|
|
6058
|
+
removeEmptyTextStyle: () => ({ tr: tr2 }) => {
|
|
6059
|
+
const { selection } = tr2;
|
|
6060
|
+
tr2.doc.nodesBetween(selection.from, selection.to, (node, pos) => {
|
|
4852
6061
|
if (node.isTextblock) {
|
|
4853
6062
|
return true;
|
|
4854
6063
|
}
|
|
4855
6064
|
if (!node.marks.filter((mark) => mark.type === this.type).some((mark) => Object.values(mark.attrs).some((value) => !!value))) {
|
|
4856
|
-
|
|
6065
|
+
tr2.removeMark(pos, pos + node.nodeSize, this.type);
|
|
4857
6066
|
}
|
|
4858
6067
|
});
|
|
4859
6068
|
return true;
|
|
@@ -5442,15 +6651,15 @@ var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
5442
6651
|
if (!editor) return;
|
|
5443
6652
|
const { state } = editor;
|
|
5444
6653
|
const insertPos = savedPos ?? state.selection.from;
|
|
5445
|
-
editor.chain().focus().command(({ tr, state: state2 }) => {
|
|
6654
|
+
editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
|
|
5446
6655
|
const $pos = state2.doc.resolve(insertPos);
|
|
5447
6656
|
const imageNode = state2.schema.nodes.image.create({ ...attrs });
|
|
5448
6657
|
if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
|
|
5449
|
-
|
|
5450
|
-
|
|
6658
|
+
tr2.replaceWith($pos.before(), $pos.after(), imageNode);
|
|
6659
|
+
tr2.setSelection(TextSelection5.near(tr2.doc.resolve($pos.before())));
|
|
5451
6660
|
} else {
|
|
5452
|
-
|
|
5453
|
-
|
|
6661
|
+
tr2.insert(insertPos, imageNode);
|
|
6662
|
+
tr2.setSelection(TextSelection5.near(tr2.doc.resolve(insertPos)));
|
|
5454
6663
|
}
|
|
5455
6664
|
return true;
|
|
5456
6665
|
}).run();
|
|
@@ -5469,15 +6678,15 @@ var createHandleVideoAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
5469
6678
|
if (!editor) return;
|
|
5470
6679
|
const { state } = editor;
|
|
5471
6680
|
const insertPos = savedPos ?? state.selection.from;
|
|
5472
|
-
editor.chain().focus().command(({ tr, state: state2 }) => {
|
|
6681
|
+
editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
|
|
5473
6682
|
const $pos = state2.doc.resolve(insertPos);
|
|
5474
6683
|
const videoNode = state2.schema.nodes.video.create({ src: url });
|
|
5475
6684
|
if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
|
|
5476
|
-
|
|
5477
|
-
|
|
6685
|
+
tr2.replaceWith($pos.before(), $pos.after(), videoNode);
|
|
6686
|
+
tr2.setSelection(TextSelection5.near(tr2.doc.resolve($pos.before())));
|
|
5478
6687
|
} else {
|
|
5479
|
-
|
|
5480
|
-
|
|
6688
|
+
tr2.insert(insertPos, videoNode);
|
|
6689
|
+
tr2.setSelection(TextSelection5.near(tr2.doc.resolve(insertPos)));
|
|
5481
6690
|
}
|
|
5482
6691
|
return true;
|
|
5483
6692
|
}).run();
|
|
@@ -5489,21 +6698,22 @@ var createHandleLinkAdd = (editor, closeDialogCommand, linkParams, savedPos) =>
|
|
|
5489
6698
|
const hasSelection = !editor.state.selection.empty;
|
|
5490
6699
|
const titleLength = linkParams.title?.length ?? 0;
|
|
5491
6700
|
if (hasSelection) {
|
|
5492
|
-
editor.chain().focus().command(({ tr, state }) => {
|
|
6701
|
+
editor.chain().focus().command(({ tr: tr2, state }) => {
|
|
5493
6702
|
const { from, to } = state.selection;
|
|
5494
|
-
|
|
5495
|
-
|
|
6703
|
+
tr2.insertText(linkParams.title ?? "", from, to);
|
|
6704
|
+
tr2.removeMark(from, from + titleLength);
|
|
6705
|
+
tr2.addMark(from, from + titleLength, editor.schema.marks.link.create({ ...linkParams }));
|
|
5496
6706
|
return true;
|
|
5497
6707
|
}).run();
|
|
5498
6708
|
} else {
|
|
5499
6709
|
const { state } = editor;
|
|
5500
6710
|
const insertPos = savedPos ?? state.selection.from;
|
|
5501
6711
|
const titleLength2 = linkParams.title?.length ?? 0;
|
|
5502
|
-
editor.chain().focus().command(({ tr }) => {
|
|
6712
|
+
editor.chain().focus().command(({ tr: tr2 }) => {
|
|
5503
6713
|
const linkMark = editor.schema.marks.link.create({ ...linkParams });
|
|
5504
6714
|
const textNode = editor.schema.text(linkParams.title ?? "", [linkMark]);
|
|
5505
|
-
|
|
5506
|
-
|
|
6715
|
+
tr2.insert(insertPos, textNode);
|
|
6716
|
+
tr2.setSelection(TextSelection5.create(tr2.doc, insertPos, insertPos + titleLength2));
|
|
5507
6717
|
return true;
|
|
5508
6718
|
}).run();
|
|
5509
6719
|
}
|
|
@@ -5517,10 +6727,10 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
5517
6727
|
} else {
|
|
5518
6728
|
const { state } = editor;
|
|
5519
6729
|
const insertPos = savedPos ?? state.selection.from;
|
|
5520
|
-
editor.chain().focus().command(({ tr, state: state2 }) => {
|
|
6730
|
+
editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
|
|
5521
6731
|
const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
|
|
5522
|
-
|
|
5523
|
-
|
|
6732
|
+
tr2.insert(insertPos, inlineMathNode);
|
|
6733
|
+
tr2.setSelection(TextSelection5.near(tr2.doc.resolve(insertPos)));
|
|
5524
6734
|
return true;
|
|
5525
6735
|
}).run();
|
|
5526
6736
|
}
|
|
@@ -6469,6 +7679,7 @@ var Tiptap = (props) => {
|
|
|
6469
7679
|
|
|
6470
7680
|
// src/utils/html-to-tiptap-content.ts
|
|
6471
7681
|
import { generateJSON } from "@tiptap/core";
|
|
7682
|
+
import { TableKit as TableKit2 } from "@tiptap/extension-table";
|
|
6472
7683
|
function isJSONContent(value) {
|
|
6473
7684
|
return typeof value === "object" && value !== null && "type" in value && typeof value.type === "string";
|
|
6474
7685
|
}
|
|
@@ -6489,7 +7700,7 @@ function htmlToTiptapContent(content) {
|
|
|
6489
7700
|
return { type: "doc", content: [{ type: "paragraph" }] };
|
|
6490
7701
|
}
|
|
6491
7702
|
const sharedExtensions = getSharedExtensions();
|
|
6492
|
-
const extensions = [...sharedExtensions, BaseFigure];
|
|
7703
|
+
const extensions = [...sharedExtensions, BaseFigure, TableKit2, BaseCodeBlock];
|
|
6493
7704
|
try {
|
|
6494
7705
|
return generateJSON(content, extensions);
|
|
6495
7706
|
} catch (error) {
|