@cyberyozh/text-editor 0.1.15 → 0.1.17

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.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, ...linkAttrs });
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?.target ? linkDialogContext.target === "_blank" : true;
2277
- const initialLinkRel = linkDialogContext?.rel ? linkDialogContext.rel?.includes("noopener") : true;
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
- tr.delete(emptyParagraphStart, emptyParagraphEnd);
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
- tr.insert(newPosAfterTargetNode, paragraphNode);
2711
- tr.setSelection(TextSelection.create(tr.doc, newPosAfterTargetNode + 1));
2712
- view.dispatch(tr);
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 tr = editor.state.tr;
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
- tr.replaceRangeWith(
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
- tr.setNodeMarkup(pos, void 0, {
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(tr);
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
- tr.insert(posAfter, paragraphNode);
2975
- tr.setSelection(TextSelection2.create(tr.doc, posAfter + 1));
2976
- view.dispatch(tr);
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
- tr.setSelection(TextSelection2.create(tr.doc, nextNodeEnd));
3019
- view.dispatch(tr);
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
- tr.setSelection(TextSelection2.create(tr.doc, nextNodeEnd));
3054
- view.dispatch(tr);
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
- addOptions() {
4225
+ addAttributes() {
3091
4226
  return {
3092
4227
  ...this.parent?.(),
3093
- openOnClick: false,
3094
- linkOnPaste: true,
3095
- autolink: true,
3096
- protocols: ["http", "https", "mailto", "tel"]
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
- tr.insert(posAfter, paragraphNode);
3176
- tr.setSelection(TextSelection3.create(tr.doc, posAfter + 1));
3177
- view.dispatch(tr);
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
- tr.insert(posAfter, paragraphNode);
3525
- tr.setSelection(TextSelection4.create(tr.doc, posAfter + 1));
3526
- view.dispatch(tr);
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
- tr.insert(posAfter, paragraphNode);
3573
- tr.setSelection(TextSelection4.create(tr.doc, posAfter + 1));
3574
- view.dispatch(tr);
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 (emoji) {
4146
- if (emoji in calloutIconComponents) {
4147
- const IconComponent = calloutIconComponents[emoji];
5354
+ if (emoji2) {
5355
+ if (emoji2 in calloutIconComponents) {
5356
+ const IconComponent = calloutIconComponents[emoji2];
4148
5357
  icon = /* @__PURE__ */ jsx75(IconComponent, {});
4149
5358
  } else {
4150
- icon = emoji;
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": emoji || void 0,
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 emoji = props.node.attrs.emoji;
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 } = tr;
4851
- tr.doc.nodesBetween(selection.from, selection.to, (node, pos) => {
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
- tr.removeMark(pos, pos + node.nodeSize, this.type);
6065
+ tr2.removeMark(pos, pos + node.nodeSize, this.type);
4857
6066
  }
4858
6067
  });
4859
6068
  return true;
@@ -5224,7 +6433,8 @@ var Figure2 = BaseFigure.extend({
5224
6433
  };
5225
6434
  const updateImageDimensions = (width, height) => {
5226
6435
  imageContainer.style.width = `${width}px`;
5227
- imageContainer.style.height = `${height}px`;
6436
+ imageContainer.style.aspectRatio = `${width} / ${height}`;
6437
+ imageContainer.style.height = "";
5228
6438
  };
5229
6439
  const figure = document.createElement("figure");
5230
6440
  figure.setAttribute("data-drag-handle", "");
@@ -5236,7 +6446,7 @@ var Figure2 = BaseFigure.extend({
5236
6446
  if (attrs.title) img.title = attrs.title;
5237
6447
  if (attrs.width && attrs.height) {
5238
6448
  imageContainer.style.width = `${attrs.width}px`;
5239
- imageContainer.style.height = `${attrs.height}px`;
6449
+ imageContainer.style.aspectRatio = `${attrs.width} / ${attrs.height}`;
5240
6450
  }
5241
6451
  img.onload = () => {
5242
6452
  naturalAspectRatio = img.naturalHeight / img.naturalWidth;
@@ -5244,15 +6454,11 @@ var Figure2 = BaseFigure.extend({
5244
6454
  maxHeight = Math.round(maxWidth * naturalAspectRatio);
5245
6455
  }
5246
6456
  if (attrs.width && attrs.height && maxWidth && attrs.width > maxWidth) {
5247
- const width = maxWidth;
5248
- const height = Math.round(attrs.height / attrs.width * maxWidth);
5249
- imageContainer.style.width = `${width}px`;
5250
- imageContainer.style.height = `${height}px`;
5251
6457
  const pos = getPos();
5252
6458
  if (typeof pos === "number") {
5253
6459
  editor.chain().updateAttributes("image", {
5254
- width: Math.round(width),
5255
- height: Math.round(height)
6460
+ width: maxWidth,
6461
+ height: Math.round(attrs.height / attrs.width * maxWidth)
5256
6462
  }).run();
5257
6463
  }
5258
6464
  }
@@ -5294,11 +6500,12 @@ var Figure2 = BaseFigure.extend({
5294
6500
  }
5295
6501
  },
5296
6502
  onUpdate: (updatedNode) => {
5297
- if (updatedNode.attrs.width) {
5298
- imageContainer.style.width = `${updatedNode.attrs.width}px`;
5299
- }
5300
- if (updatedNode.attrs.height) {
5301
- imageContainer.style.height = `${updatedNode.attrs.height}px`;
6503
+ const newWidth = updatedNode.attrs.width;
6504
+ const newHeight = updatedNode.attrs.height;
6505
+ if (newWidth) imageContainer.style.width = `${newWidth}px`;
6506
+ if (newWidth && newHeight) {
6507
+ imageContainer.style.aspectRatio = `${newWidth} / ${newHeight}`;
6508
+ imageContainer.style.height = "";
5302
6509
  }
5303
6510
  const existingCaption = figure.querySelector("figcaption");
5304
6511
  if (updatedNode.attrs.caption && !existingCaption) {
@@ -5336,6 +6543,7 @@ var Figure2 = BaseFigure.extend({
5336
6543
  }
5337
6544
  }
5338
6545
  });
6546
+ imageContainer.style.height = "";
5339
6547
  figure.appendChild(resizableView.dom);
5340
6548
  if (attrs.caption) {
5341
6549
  const figcaption = document.createElement("figcaption");
@@ -5442,15 +6650,15 @@ var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
5442
6650
  if (!editor) return;
5443
6651
  const { state } = editor;
5444
6652
  const insertPos = savedPos ?? state.selection.from;
5445
- editor.chain().focus().command(({ tr, state: state2 }) => {
6653
+ editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
5446
6654
  const $pos = state2.doc.resolve(insertPos);
5447
6655
  const imageNode = state2.schema.nodes.image.create({ ...attrs });
5448
6656
  if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
5449
- tr.replaceWith($pos.before(), $pos.after(), imageNode);
5450
- tr.setSelection(TextSelection5.near(tr.doc.resolve($pos.before())));
6657
+ tr2.replaceWith($pos.before(), $pos.after(), imageNode);
6658
+ tr2.setSelection(TextSelection5.near(tr2.doc.resolve($pos.before())));
5451
6659
  } else {
5452
- tr.insert(insertPos, imageNode);
5453
- tr.setSelection(TextSelection5.near(tr.doc.resolve(insertPos)));
6660
+ tr2.insert(insertPos, imageNode);
6661
+ tr2.setSelection(TextSelection5.near(tr2.doc.resolve(insertPos)));
5454
6662
  }
5455
6663
  return true;
5456
6664
  }).run();
@@ -5469,15 +6677,15 @@ var createHandleVideoAdd = (editor, closeDialogCommand, savedPos) => {
5469
6677
  if (!editor) return;
5470
6678
  const { state } = editor;
5471
6679
  const insertPos = savedPos ?? state.selection.from;
5472
- editor.chain().focus().command(({ tr, state: state2 }) => {
6680
+ editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
5473
6681
  const $pos = state2.doc.resolve(insertPos);
5474
6682
  const videoNode = state2.schema.nodes.video.create({ src: url });
5475
6683
  if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
5476
- tr.replaceWith($pos.before(), $pos.after(), videoNode);
5477
- tr.setSelection(TextSelection5.near(tr.doc.resolve($pos.before())));
6684
+ tr2.replaceWith($pos.before(), $pos.after(), videoNode);
6685
+ tr2.setSelection(TextSelection5.near(tr2.doc.resolve($pos.before())));
5478
6686
  } else {
5479
- tr.insert(insertPos, videoNode);
5480
- tr.setSelection(TextSelection5.near(tr.doc.resolve(insertPos)));
6687
+ tr2.insert(insertPos, videoNode);
6688
+ tr2.setSelection(TextSelection5.near(tr2.doc.resolve(insertPos)));
5481
6689
  }
5482
6690
  return true;
5483
6691
  }).run();
@@ -5489,21 +6697,22 @@ var createHandleLinkAdd = (editor, closeDialogCommand, linkParams, savedPos) =>
5489
6697
  const hasSelection = !editor.state.selection.empty;
5490
6698
  const titleLength = linkParams.title?.length ?? 0;
5491
6699
  if (hasSelection) {
5492
- editor.chain().focus().command(({ tr, state }) => {
6700
+ editor.chain().focus().command(({ tr: tr2, state }) => {
5493
6701
  const { from, to } = state.selection;
5494
- tr.insertText(linkParams.title ?? "", from, to);
5495
- tr.addMark(from, from + titleLength, editor.schema.marks.link.create({ ...linkParams }));
6702
+ tr2.insertText(linkParams.title ?? "", from, to);
6703
+ tr2.removeMark(from, from + titleLength);
6704
+ tr2.addMark(from, from + titleLength, editor.schema.marks.link.create({ ...linkParams }));
5496
6705
  return true;
5497
6706
  }).run();
5498
6707
  } else {
5499
6708
  const { state } = editor;
5500
6709
  const insertPos = savedPos ?? state.selection.from;
5501
6710
  const titleLength2 = linkParams.title?.length ?? 0;
5502
- editor.chain().focus().command(({ tr }) => {
6711
+ editor.chain().focus().command(({ tr: tr2 }) => {
5503
6712
  const linkMark = editor.schema.marks.link.create({ ...linkParams });
5504
6713
  const textNode = editor.schema.text(linkParams.title ?? "", [linkMark]);
5505
- tr.insert(insertPos, textNode);
5506
- tr.setSelection(TextSelection5.create(tr.doc, insertPos, insertPos + titleLength2));
6714
+ tr2.insert(insertPos, textNode);
6715
+ tr2.setSelection(TextSelection5.create(tr2.doc, insertPos, insertPos + titleLength2));
5507
6716
  return true;
5508
6717
  }).run();
5509
6718
  }
@@ -5517,10 +6726,10 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
5517
6726
  } else {
5518
6727
  const { state } = editor;
5519
6728
  const insertPos = savedPos ?? state.selection.from;
5520
- editor.chain().focus().command(({ tr, state: state2 }) => {
6729
+ editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
5521
6730
  const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
5522
- tr.insert(insertPos, inlineMathNode);
5523
- tr.setSelection(TextSelection5.near(tr.doc.resolve(insertPos)));
6731
+ tr2.insert(insertPos, inlineMathNode);
6732
+ tr2.setSelection(TextSelection5.near(tr2.doc.resolve(insertPos)));
5524
6733
  return true;
5525
6734
  }).run();
5526
6735
  }