@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/render.js CHANGED
@@ -66,7 +66,7 @@ function handleExitNode(editor, nodeName) {
66
66
  if (!isInsideTargetNode || !isCurrentNodeEmptyParagraph) {
67
67
  return false;
68
68
  }
69
- const { tr } = state;
69
+ const { tr: tr2 } = state;
70
70
  const posAfterTargetNode = $pos.after(targetNodeDepth);
71
71
  const targetNode = $pos.node(targetNodeDepth);
72
72
  let newPosAfterTargetNode = posAfterTargetNode;
@@ -74,14 +74,14 @@ function handleExitNode(editor, nodeName) {
74
74
  const emptyParagraphStart = $pos.before();
75
75
  const emptyParagraphEnd = $pos.after();
76
76
  const deletionLength = emptyParagraphEnd - emptyParagraphStart;
77
- tr.delete(emptyParagraphStart, emptyParagraphEnd);
77
+ tr2.delete(emptyParagraphStart, emptyParagraphEnd);
78
78
  newPosAfterTargetNode = posAfterTargetNode - deletionLength;
79
79
  }
80
80
  const paragraphNode = schema.nodes.paragraph.createAndFill();
81
81
  if (!paragraphNode) return false;
82
- tr.insert(newPosAfterTargetNode, paragraphNode);
83
- tr.setSelection(import_state.TextSelection.create(tr.doc, newPosAfterTargetNode + 1));
84
- view.dispatch(tr);
82
+ tr2.insert(newPosAfterTargetNode, paragraphNode);
83
+ tr2.setSelection(import_state.TextSelection.create(tr2.doc, newPosAfterTargetNode + 1));
84
+ view.dispatch(tr2);
85
85
  return true;
86
86
  }
87
87
 
@@ -101,7 +101,7 @@ function migrateLegacyCallouts(editor) {
101
101
  }
102
102
  });
103
103
  if (calloutsToMigrate.length === 0) return;
104
- const tr = editor.state.tr;
104
+ const tr2 = editor.state.tr;
105
105
  calloutsToMigrate.sort((a, b) => b.pos - a.pos);
106
106
  for (const { node, pos } of calloutsToMigrate) {
107
107
  const oldType = node.attrs.calloutType;
@@ -110,7 +110,7 @@ function migrateLegacyCallouts(editor) {
110
110
  if (hasInlineContent) {
111
111
  const paragraph = schema.nodes.paragraph?.create(null, node.content);
112
112
  const newContent = paragraph ? [paragraph] : [];
113
- tr.replaceRangeWith(
113
+ tr2.replaceRangeWith(
114
114
  pos,
115
115
  pos + node.nodeSize,
116
116
  schema.nodes.callout.create(
@@ -123,7 +123,7 @@ function migrateLegacyCallouts(editor) {
123
123
  )
124
124
  );
125
125
  } else {
126
- tr.setNodeMarkup(pos, void 0, {
126
+ tr2.setNodeMarkup(pos, void 0, {
127
127
  ...node.attrs,
128
128
  type: newType,
129
129
  calloutType: null,
@@ -131,7 +131,7 @@ function migrateLegacyCallouts(editor) {
131
131
  });
132
132
  }
133
133
  }
134
- editor.view.dispatch(tr);
134
+ editor.view.dispatch(tr2);
135
135
  }
136
136
 
137
137
  // src/extensions/base/callout.ts
@@ -339,13 +339,13 @@ var BaseCustomQuote = import_core3.Node.create({
339
339
  if (!isInsideCustomQuote) {
340
340
  return false;
341
341
  }
342
- const { tr } = state;
342
+ const { tr: tr2 } = state;
343
343
  const posAfter = $pos.after(depth);
344
344
  const paragraphNode = schema.nodes.paragraph.createAndFill();
345
345
  if (!paragraphNode) return false;
346
- tr.insert(posAfter, paragraphNode);
347
- tr.setSelection(import_state2.TextSelection.create(tr.doc, posAfter + 1));
348
- view.dispatch(tr);
346
+ tr2.insert(posAfter, paragraphNode);
347
+ tr2.setSelection(import_state2.TextSelection.create(tr2.doc, posAfter + 1));
348
+ view.dispatch(tr2);
349
349
  return true;
350
350
  }
351
351
  };
@@ -378,7 +378,7 @@ var BaseCustomQuoteText = import_core3.Node.create({
378
378
  return {
379
379
  Enter: () => {
380
380
  const { view, state } = this.editor;
381
- const { tr, selection } = state;
381
+ const { tr: tr2, selection } = state;
382
382
  const { $from } = selection;
383
383
  if ($from.parent.type.name !== "customQuoteText") {
384
384
  return false;
@@ -387,8 +387,8 @@ var BaseCustomQuoteText = import_core3.Node.create({
387
387
  const nextNode = state.doc.nodeAt(posAfter);
388
388
  if (!nextNode || nextNode.type.name !== "customQuoteAuthor") return false;
389
389
  const nextNodeEnd = posAfter + nextNode.nodeSize - 1;
390
- tr.setSelection(import_state2.TextSelection.create(tr.doc, nextNodeEnd));
391
- view.dispatch(tr);
390
+ tr2.setSelection(import_state2.TextSelection.create(tr2.doc, nextNodeEnd));
391
+ view.dispatch(tr2);
392
392
  return true;
393
393
  }
394
394
  };
@@ -413,7 +413,7 @@ var BaseCustomQuoteAuthor = import_core3.Node.create({
413
413
  return {
414
414
  Enter: () => {
415
415
  const { view, state } = this.editor;
416
- const { tr, selection } = state;
416
+ const { tr: tr2, selection } = state;
417
417
  const { $from } = selection;
418
418
  if ($from.parent.type.name !== "customQuoteAuthor") {
419
419
  return false;
@@ -422,8 +422,8 @@ var BaseCustomQuoteAuthor = import_core3.Node.create({
422
422
  const nextNode = state.doc.nodeAt(posAfter);
423
423
  if (!nextNode || nextNode.type.name !== "customQuoteSign") return false;
424
424
  const nextNodeEnd = posAfter + nextNode.nodeSize - 1;
425
- tr.setSelection(import_state2.TextSelection.create(tr.doc, nextNodeEnd));
426
- view.dispatch(tr);
425
+ tr2.setSelection(import_state2.TextSelection.create(tr2.doc, nextNodeEnd));
426
+ view.dispatch(tr2);
427
427
  return true;
428
428
  }
429
429
  };
@@ -458,15 +458,1187 @@ var BaseCustomQuoteSign = import_core3.Node.create({
458
458
 
459
459
  // src/extensions/base/link.ts
460
460
  var import_extension_link = __toESM(require("@tiptap/extension-link"));
461
+ var import_core4 = require("@tiptap/core");
462
+
463
+ // node_modules/linkifyjs/dist/linkify.mjs
464
+ var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
465
+ 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";
466
+ var numeric = "numeric";
467
+ var ascii = "ascii";
468
+ var alpha = "alpha";
469
+ var asciinumeric = "asciinumeric";
470
+ var alphanumeric = "alphanumeric";
471
+ var domain = "domain";
472
+ var emoji = "emoji";
473
+ var scheme = "scheme";
474
+ var slashscheme = "slashscheme";
475
+ var whitespace = "whitespace";
476
+ function registerGroup(name, groups) {
477
+ if (!(name in groups)) {
478
+ groups[name] = [];
479
+ }
480
+ return groups[name];
481
+ }
482
+ function addToGroups(t, flags, groups) {
483
+ if (flags[numeric]) {
484
+ flags[asciinumeric] = true;
485
+ flags[alphanumeric] = true;
486
+ }
487
+ if (flags[ascii]) {
488
+ flags[asciinumeric] = true;
489
+ flags[alpha] = true;
490
+ }
491
+ if (flags[asciinumeric]) {
492
+ flags[alphanumeric] = true;
493
+ }
494
+ if (flags[alpha]) {
495
+ flags[alphanumeric] = true;
496
+ }
497
+ if (flags[alphanumeric]) {
498
+ flags[domain] = true;
499
+ }
500
+ if (flags[emoji]) {
501
+ flags[domain] = true;
502
+ }
503
+ for (const k in flags) {
504
+ const group = registerGroup(k, groups);
505
+ if (group.indexOf(t) < 0) {
506
+ group.push(t);
507
+ }
508
+ }
509
+ }
510
+ function flagsForToken(t, groups) {
511
+ const result = {};
512
+ for (const c in groups) {
513
+ if (groups[c].indexOf(t) >= 0) {
514
+ result[c] = true;
515
+ }
516
+ }
517
+ return result;
518
+ }
519
+ function State(token = null) {
520
+ this.j = {};
521
+ this.jr = [];
522
+ this.jd = null;
523
+ this.t = token;
524
+ }
525
+ State.groups = {};
526
+ State.prototype = {
527
+ accepts() {
528
+ return !!this.t;
529
+ },
530
+ /**
531
+ * Follow an existing transition from the given input to the next state.
532
+ * Does not mutate.
533
+ * @param {string} input character or token type to transition on
534
+ * @returns {?State<T>} the next state, if any
535
+ */
536
+ go(input) {
537
+ const state = this;
538
+ const nextState = state.j[input];
539
+ if (nextState) {
540
+ return nextState;
541
+ }
542
+ for (let i = 0; i < state.jr.length; i++) {
543
+ const regex = state.jr[i][0];
544
+ const nextState2 = state.jr[i][1];
545
+ if (nextState2 && regex.test(input)) {
546
+ return nextState2;
547
+ }
548
+ }
549
+ return state.jd;
550
+ },
551
+ /**
552
+ * Whether the state has a transition for the given input. Set the second
553
+ * argument to true to only look for an exact match (and not a default or
554
+ * regular-expression-based transition)
555
+ * @param {string} input
556
+ * @param {boolean} exactOnly
557
+ */
558
+ has(input, exactOnly = false) {
559
+ return exactOnly ? input in this.j : !!this.go(input);
560
+ },
561
+ /**
562
+ * Short for "transition all"; create a transition from the array of items
563
+ * in the given list to the same final resulting state.
564
+ * @param {string | string[]} inputs Group of inputs to transition on
565
+ * @param {Transition<T> | State<T>} [next] Transition options
566
+ * @param {Flags} [flags] Collections flags to add token to
567
+ * @param {Collections<T>} [groups] Master list of token groups
568
+ */
569
+ ta(inputs, next, flags, groups) {
570
+ for (let i = 0; i < inputs.length; i++) {
571
+ this.tt(inputs[i], next, flags, groups);
572
+ }
573
+ },
574
+ /**
575
+ * Short for "take regexp transition"; defines a transition for this state
576
+ * when it encounters a token which matches the given regular expression
577
+ * @param {RegExp} regexp Regular expression transition (populate first)
578
+ * @param {T | State<T>} [next] Transition options
579
+ * @param {Flags} [flags] Collections flags to add token to
580
+ * @param {Collections<T>} [groups] Master list of token groups
581
+ * @returns {State<T>} taken after the given input
582
+ */
583
+ tr(regexp, next, flags, groups) {
584
+ groups = groups || State.groups;
585
+ let nextState;
586
+ if (next && next.j) {
587
+ nextState = next;
588
+ } else {
589
+ nextState = new State(next);
590
+ if (flags && groups) {
591
+ addToGroups(next, flags, groups);
592
+ }
593
+ }
594
+ this.jr.push([regexp, nextState]);
595
+ return nextState;
596
+ },
597
+ /**
598
+ * Short for "take transitions", will take as many sequential transitions as
599
+ * the length of the given input and returns the
600
+ * resulting final state.
601
+ * @param {string | string[]} input
602
+ * @param {T | State<T>} [next] Transition options
603
+ * @param {Flags} [flags] Collections flags to add token to
604
+ * @param {Collections<T>} [groups] Master list of token groups
605
+ * @returns {State<T>} taken after the given input
606
+ */
607
+ ts(input, next, flags, groups) {
608
+ let state = this;
609
+ const len = input.length;
610
+ if (!len) {
611
+ return state;
612
+ }
613
+ for (let i = 0; i < len - 1; i++) {
614
+ state = state.tt(input[i]);
615
+ }
616
+ return state.tt(input[len - 1], next, flags, groups);
617
+ },
618
+ /**
619
+ * Short for "take transition", this is a method for building/working with
620
+ * state machines.
621
+ *
622
+ * If a state already exists for the given input, returns it.
623
+ *
624
+ * If a token is specified, that state will emit that token when reached by
625
+ * the linkify engine.
626
+ *
627
+ * If no state exists, it will be initialized with some default transitions
628
+ * that resemble existing default transitions.
629
+ *
630
+ * If a state is given for the second argument, that state will be
631
+ * transitioned to on the given input regardless of what that input
632
+ * previously did.
633
+ *
634
+ * Specify a token group flags to define groups that this token belongs to.
635
+ * The token will be added to corresponding entires in the given groups
636
+ * object.
637
+ *
638
+ * @param {string} input character, token type to transition on
639
+ * @param {T | State<T>} [next] Transition options
640
+ * @param {Flags} [flags] Collections flags to add token to
641
+ * @param {Collections<T>} [groups] Master list of groups
642
+ * @returns {State<T>} taken after the given input
643
+ */
644
+ tt(input, next, flags, groups) {
645
+ groups = groups || State.groups;
646
+ const state = this;
647
+ if (next && next.j) {
648
+ state.j[input] = next;
649
+ return next;
650
+ }
651
+ const t = next;
652
+ let nextState, templateState = state.go(input);
653
+ if (templateState) {
654
+ nextState = new State();
655
+ Object.assign(nextState.j, templateState.j);
656
+ nextState.jr.push.apply(nextState.jr, templateState.jr);
657
+ nextState.jd = templateState.jd;
658
+ nextState.t = templateState.t;
659
+ } else {
660
+ nextState = new State();
661
+ }
662
+ if (t) {
663
+ if (groups) {
664
+ if (nextState.t && typeof nextState.t === "string") {
665
+ const allFlags = Object.assign(flagsForToken(nextState.t, groups), flags);
666
+ addToGroups(t, allFlags, groups);
667
+ } else if (flags) {
668
+ addToGroups(t, flags, groups);
669
+ }
670
+ }
671
+ nextState.t = t;
672
+ }
673
+ state.j[input] = nextState;
674
+ return nextState;
675
+ }
676
+ };
677
+ var ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);
678
+ var tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);
679
+ var ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);
680
+ var tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);
681
+ var WORD = "WORD";
682
+ var UWORD = "UWORD";
683
+ var ASCIINUMERICAL = "ASCIINUMERICAL";
684
+ var ALPHANUMERICAL = "ALPHANUMERICAL";
685
+ var LOCALHOST = "LOCALHOST";
686
+ var TLD = "TLD";
687
+ var UTLD = "UTLD";
688
+ var SCHEME = "SCHEME";
689
+ var SLASH_SCHEME = "SLASH_SCHEME";
690
+ var NUM = "NUM";
691
+ var WS = "WS";
692
+ var NL = "NL";
693
+ var OPENBRACE = "OPENBRACE";
694
+ var CLOSEBRACE = "CLOSEBRACE";
695
+ var OPENBRACKET = "OPENBRACKET";
696
+ var CLOSEBRACKET = "CLOSEBRACKET";
697
+ var OPENPAREN = "OPENPAREN";
698
+ var CLOSEPAREN = "CLOSEPAREN";
699
+ var OPENANGLEBRACKET = "OPENANGLEBRACKET";
700
+ var CLOSEANGLEBRACKET = "CLOSEANGLEBRACKET";
701
+ var FULLWIDTHLEFTPAREN = "FULLWIDTHLEFTPAREN";
702
+ var FULLWIDTHRIGHTPAREN = "FULLWIDTHRIGHTPAREN";
703
+ var LEFTCORNERBRACKET = "LEFTCORNERBRACKET";
704
+ var RIGHTCORNERBRACKET = "RIGHTCORNERBRACKET";
705
+ var LEFTWHITECORNERBRACKET = "LEFTWHITECORNERBRACKET";
706
+ var RIGHTWHITECORNERBRACKET = "RIGHTWHITECORNERBRACKET";
707
+ var FULLWIDTHLESSTHAN = "FULLWIDTHLESSTHAN";
708
+ var FULLWIDTHGREATERTHAN = "FULLWIDTHGREATERTHAN";
709
+ var AMPERSAND = "AMPERSAND";
710
+ var APOSTROPHE = "APOSTROPHE";
711
+ var ASTERISK = "ASTERISK";
712
+ var AT = "AT";
713
+ var BACKSLASH = "BACKSLASH";
714
+ var BACKTICK = "BACKTICK";
715
+ var CARET = "CARET";
716
+ var COLON = "COLON";
717
+ var COMMA = "COMMA";
718
+ var DOLLAR = "DOLLAR";
719
+ var DOT = "DOT";
720
+ var EQUALS = "EQUALS";
721
+ var EXCLAMATION = "EXCLAMATION";
722
+ var HYPHEN = "HYPHEN";
723
+ var PERCENT = "PERCENT";
724
+ var PIPE = "PIPE";
725
+ var PLUS = "PLUS";
726
+ var POUND = "POUND";
727
+ var QUERY = "QUERY";
728
+ var QUOTE = "QUOTE";
729
+ var FULLWIDTHMIDDLEDOT = "FULLWIDTHMIDDLEDOT";
730
+ var SEMI = "SEMI";
731
+ var SLASH = "SLASH";
732
+ var TILDE = "TILDE";
733
+ var UNDERSCORE = "UNDERSCORE";
734
+ var EMOJI$1 = "EMOJI";
735
+ var SYM = "SYM";
736
+ var tk = /* @__PURE__ */ Object.freeze({
737
+ __proto__: null,
738
+ ALPHANUMERICAL,
739
+ AMPERSAND,
740
+ APOSTROPHE,
741
+ ASCIINUMERICAL,
742
+ ASTERISK,
743
+ AT,
744
+ BACKSLASH,
745
+ BACKTICK,
746
+ CARET,
747
+ CLOSEANGLEBRACKET,
748
+ CLOSEBRACE,
749
+ CLOSEBRACKET,
750
+ CLOSEPAREN,
751
+ COLON,
752
+ COMMA,
753
+ DOLLAR,
754
+ DOT,
755
+ EMOJI: EMOJI$1,
756
+ EQUALS,
757
+ EXCLAMATION,
758
+ FULLWIDTHGREATERTHAN,
759
+ FULLWIDTHLEFTPAREN,
760
+ FULLWIDTHLESSTHAN,
761
+ FULLWIDTHMIDDLEDOT,
762
+ FULLWIDTHRIGHTPAREN,
763
+ HYPHEN,
764
+ LEFTCORNERBRACKET,
765
+ LEFTWHITECORNERBRACKET,
766
+ LOCALHOST,
767
+ NL,
768
+ NUM,
769
+ OPENANGLEBRACKET,
770
+ OPENBRACE,
771
+ OPENBRACKET,
772
+ OPENPAREN,
773
+ PERCENT,
774
+ PIPE,
775
+ PLUS,
776
+ POUND,
777
+ QUERY,
778
+ QUOTE,
779
+ RIGHTCORNERBRACKET,
780
+ RIGHTWHITECORNERBRACKET,
781
+ SCHEME,
782
+ SEMI,
783
+ SLASH,
784
+ SLASH_SCHEME,
785
+ SYM,
786
+ TILDE,
787
+ TLD,
788
+ UNDERSCORE,
789
+ UTLD,
790
+ UWORD,
791
+ WORD,
792
+ WS
793
+ });
794
+ var ASCII_LETTER = /[a-z]/;
795
+ var LETTER = /\p{L}/u;
796
+ var EMOJI = /\p{Emoji}/u;
797
+ var DIGIT = /\d/;
798
+ var SPACE = /\s/;
799
+ var CR = "\r";
800
+ var LF = "\n";
801
+ var EMOJI_VARIATION = "\uFE0F";
802
+ var EMOJI_JOINER = "\u200D";
803
+ var OBJECT_REPLACEMENT = "\uFFFC";
804
+ var tlds = null;
805
+ var utlds = null;
806
+ function init$2(customSchemes = []) {
807
+ const groups = {};
808
+ State.groups = groups;
809
+ const Start = new State();
810
+ if (tlds == null) {
811
+ tlds = decodeTlds(encodedTlds);
812
+ }
813
+ if (utlds == null) {
814
+ utlds = decodeTlds(encodedUtlds);
815
+ }
816
+ tt(Start, "'", APOSTROPHE);
817
+ tt(Start, "{", OPENBRACE);
818
+ tt(Start, "}", CLOSEBRACE);
819
+ tt(Start, "[", OPENBRACKET);
820
+ tt(Start, "]", CLOSEBRACKET);
821
+ tt(Start, "(", OPENPAREN);
822
+ tt(Start, ")", CLOSEPAREN);
823
+ tt(Start, "<", OPENANGLEBRACKET);
824
+ tt(Start, ">", CLOSEANGLEBRACKET);
825
+ tt(Start, "\uFF08", FULLWIDTHLEFTPAREN);
826
+ tt(Start, "\uFF09", FULLWIDTHRIGHTPAREN);
827
+ tt(Start, "\u300C", LEFTCORNERBRACKET);
828
+ tt(Start, "\u300D", RIGHTCORNERBRACKET);
829
+ tt(Start, "\u300E", LEFTWHITECORNERBRACKET);
830
+ tt(Start, "\u300F", RIGHTWHITECORNERBRACKET);
831
+ tt(Start, "\uFF1C", FULLWIDTHLESSTHAN);
832
+ tt(Start, "\uFF1E", FULLWIDTHGREATERTHAN);
833
+ tt(Start, "&", AMPERSAND);
834
+ tt(Start, "*", ASTERISK);
835
+ tt(Start, "@", AT);
836
+ tt(Start, "`", BACKTICK);
837
+ tt(Start, "^", CARET);
838
+ tt(Start, ":", COLON);
839
+ tt(Start, ",", COMMA);
840
+ tt(Start, "$", DOLLAR);
841
+ tt(Start, ".", DOT);
842
+ tt(Start, "=", EQUALS);
843
+ tt(Start, "!", EXCLAMATION);
844
+ tt(Start, "-", HYPHEN);
845
+ tt(Start, "%", PERCENT);
846
+ tt(Start, "|", PIPE);
847
+ tt(Start, "+", PLUS);
848
+ tt(Start, "#", POUND);
849
+ tt(Start, "?", QUERY);
850
+ tt(Start, '"', QUOTE);
851
+ tt(Start, "/", SLASH);
852
+ tt(Start, ";", SEMI);
853
+ tt(Start, "~", TILDE);
854
+ tt(Start, "_", UNDERSCORE);
855
+ tt(Start, "\\", BACKSLASH);
856
+ tt(Start, "\u30FB", FULLWIDTHMIDDLEDOT);
857
+ const Num = tr(Start, DIGIT, NUM, {
858
+ [numeric]: true
859
+ });
860
+ tr(Num, DIGIT, Num);
861
+ const Asciinumeric = tr(Num, ASCII_LETTER, ASCIINUMERICAL, {
862
+ [asciinumeric]: true
863
+ });
864
+ const Alphanumeric = tr(Num, LETTER, ALPHANUMERICAL, {
865
+ [alphanumeric]: true
866
+ });
867
+ const Word = tr(Start, ASCII_LETTER, WORD, {
868
+ [ascii]: true
869
+ });
870
+ tr(Word, DIGIT, Asciinumeric);
871
+ tr(Word, ASCII_LETTER, Word);
872
+ tr(Asciinumeric, DIGIT, Asciinumeric);
873
+ tr(Asciinumeric, ASCII_LETTER, Asciinumeric);
874
+ const UWord = tr(Start, LETTER, UWORD, {
875
+ [alpha]: true
876
+ });
877
+ tr(UWord, ASCII_LETTER);
878
+ tr(UWord, DIGIT, Alphanumeric);
879
+ tr(UWord, LETTER, UWord);
880
+ tr(Alphanumeric, DIGIT, Alphanumeric);
881
+ tr(Alphanumeric, ASCII_LETTER);
882
+ tr(Alphanumeric, LETTER, Alphanumeric);
883
+ const Nl2 = tt(Start, LF, NL, {
884
+ [whitespace]: true
885
+ });
886
+ const Cr = tt(Start, CR, WS, {
887
+ [whitespace]: true
888
+ });
889
+ const Ws = tr(Start, SPACE, WS, {
890
+ [whitespace]: true
891
+ });
892
+ tt(Start, OBJECT_REPLACEMENT, Ws);
893
+ tt(Cr, LF, Nl2);
894
+ tt(Cr, OBJECT_REPLACEMENT, Ws);
895
+ tr(Cr, SPACE, Ws);
896
+ tt(Ws, CR);
897
+ tt(Ws, LF);
898
+ tr(Ws, SPACE, Ws);
899
+ tt(Ws, OBJECT_REPLACEMENT, Ws);
900
+ const Emoji = tr(Start, EMOJI, EMOJI$1, {
901
+ [emoji]: true
902
+ });
903
+ tt(Emoji, "#");
904
+ tr(Emoji, EMOJI, Emoji);
905
+ tt(Emoji, EMOJI_VARIATION, Emoji);
906
+ const EmojiJoiner = tt(Emoji, EMOJI_JOINER);
907
+ tt(EmojiJoiner, "#");
908
+ tr(EmojiJoiner, EMOJI, Emoji);
909
+ const wordjr = [[ASCII_LETTER, Word], [DIGIT, Asciinumeric]];
910
+ const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord], [DIGIT, Alphanumeric]];
911
+ for (let i = 0; i < tlds.length; i++) {
912
+ fastts(Start, tlds[i], TLD, WORD, wordjr);
913
+ }
914
+ for (let i = 0; i < utlds.length; i++) {
915
+ fastts(Start, utlds[i], UTLD, UWORD, uwordjr);
916
+ }
917
+ addToGroups(TLD, {
918
+ tld: true,
919
+ ascii: true
920
+ }, groups);
921
+ addToGroups(UTLD, {
922
+ utld: true,
923
+ alpha: true
924
+ }, groups);
925
+ fastts(Start, "file", SCHEME, WORD, wordjr);
926
+ fastts(Start, "mailto", SCHEME, WORD, wordjr);
927
+ fastts(Start, "http", SLASH_SCHEME, WORD, wordjr);
928
+ fastts(Start, "https", SLASH_SCHEME, WORD, wordjr);
929
+ fastts(Start, "ftp", SLASH_SCHEME, WORD, wordjr);
930
+ fastts(Start, "ftps", SLASH_SCHEME, WORD, wordjr);
931
+ addToGroups(SCHEME, {
932
+ scheme: true,
933
+ ascii: true
934
+ }, groups);
935
+ addToGroups(SLASH_SCHEME, {
936
+ slashscheme: true,
937
+ ascii: true
938
+ }, groups);
939
+ customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1);
940
+ for (let i = 0; i < customSchemes.length; i++) {
941
+ const sch = customSchemes[i][0];
942
+ const optionalSlashSlash = customSchemes[i][1];
943
+ const flags = optionalSlashSlash ? {
944
+ [scheme]: true
945
+ } : {
946
+ [slashscheme]: true
947
+ };
948
+ if (sch.indexOf("-") >= 0) {
949
+ flags[domain] = true;
950
+ } else if (!ASCII_LETTER.test(sch)) {
951
+ flags[numeric] = true;
952
+ } else if (DIGIT.test(sch)) {
953
+ flags[asciinumeric] = true;
954
+ } else {
955
+ flags[ascii] = true;
956
+ }
957
+ ts(Start, sch, sch, flags);
958
+ }
959
+ ts(Start, "localhost", LOCALHOST, {
960
+ ascii: true
961
+ });
962
+ Start.jd = new State(SYM);
963
+ return {
964
+ start: Start,
965
+ tokens: Object.assign({
966
+ groups
967
+ }, tk)
968
+ };
969
+ }
970
+ function run$1(start, str) {
971
+ const iterable = stringToArray(str.replace(/[A-Z]/g, (c) => c.toLowerCase()));
972
+ const charCount = iterable.length;
973
+ const tokens = [];
974
+ let cursor = 0;
975
+ let charCursor = 0;
976
+ while (charCursor < charCount) {
977
+ let state = start;
978
+ let nextState = null;
979
+ let tokenLength = 0;
980
+ let latestAccepting = null;
981
+ let sinceAccepts = -1;
982
+ let charsSinceAccepts = -1;
983
+ while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) {
984
+ state = nextState;
985
+ if (state.accepts()) {
986
+ sinceAccepts = 0;
987
+ charsSinceAccepts = 0;
988
+ latestAccepting = state;
989
+ } else if (sinceAccepts >= 0) {
990
+ sinceAccepts += iterable[charCursor].length;
991
+ charsSinceAccepts++;
992
+ }
993
+ tokenLength += iterable[charCursor].length;
994
+ cursor += iterable[charCursor].length;
995
+ charCursor++;
996
+ }
997
+ cursor -= sinceAccepts;
998
+ charCursor -= charsSinceAccepts;
999
+ tokenLength -= sinceAccepts;
1000
+ tokens.push({
1001
+ t: latestAccepting.t,
1002
+ // token type/name
1003
+ v: str.slice(cursor - tokenLength, cursor),
1004
+ // string value
1005
+ s: cursor - tokenLength,
1006
+ // start index
1007
+ e: cursor
1008
+ // end index (excluding)
1009
+ });
1010
+ }
1011
+ return tokens;
1012
+ }
1013
+ function stringToArray(str) {
1014
+ const result = [];
1015
+ const len = str.length;
1016
+ let index = 0;
1017
+ while (index < len) {
1018
+ let first = str.charCodeAt(index);
1019
+ let second;
1020
+ let char = first < 55296 || first > 56319 || index + 1 === len || (second = str.charCodeAt(index + 1)) < 56320 || second > 57343 ? str[index] : str.slice(index, index + 2);
1021
+ result.push(char);
1022
+ index += char.length;
1023
+ }
1024
+ return result;
1025
+ }
1026
+ function fastts(state, input, t, defaultt, jr) {
1027
+ let next;
1028
+ const len = input.length;
1029
+ for (let i = 0; i < len - 1; i++) {
1030
+ const char = input[i];
1031
+ if (state.j[char]) {
1032
+ next = state.j[char];
1033
+ } else {
1034
+ next = new State(defaultt);
1035
+ next.jr = jr.slice();
1036
+ state.j[char] = next;
1037
+ }
1038
+ state = next;
1039
+ }
1040
+ next = new State(t);
1041
+ next.jr = jr.slice();
1042
+ state.j[input[len - 1]] = next;
1043
+ return next;
1044
+ }
1045
+ function decodeTlds(encoded) {
1046
+ const words = [];
1047
+ const stack = [];
1048
+ let i = 0;
1049
+ let digits = "0123456789";
1050
+ while (i < encoded.length) {
1051
+ let popDigitCount = 0;
1052
+ while (digits.indexOf(encoded[i + popDigitCount]) >= 0) {
1053
+ popDigitCount++;
1054
+ }
1055
+ if (popDigitCount > 0) {
1056
+ words.push(stack.join(""));
1057
+ for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) {
1058
+ stack.pop();
1059
+ }
1060
+ i += popDigitCount;
1061
+ } else {
1062
+ stack.push(encoded[i]);
1063
+ i++;
1064
+ }
1065
+ }
1066
+ return words;
1067
+ }
1068
+ var defaults = {
1069
+ defaultProtocol: "http",
1070
+ events: null,
1071
+ format: noop,
1072
+ formatHref: noop,
1073
+ nl2br: false,
1074
+ tagName: "a",
1075
+ target: null,
1076
+ rel: null,
1077
+ validate: true,
1078
+ truncate: Infinity,
1079
+ className: null,
1080
+ attributes: null,
1081
+ ignoreTags: [],
1082
+ render: null
1083
+ };
1084
+ function Options(opts, defaultRender = null) {
1085
+ let o = Object.assign({}, defaults);
1086
+ if (opts) {
1087
+ o = Object.assign(o, opts instanceof Options ? opts.o : opts);
1088
+ }
1089
+ const ignoredTags = o.ignoreTags;
1090
+ const uppercaseIgnoredTags = [];
1091
+ for (let i = 0; i < ignoredTags.length; i++) {
1092
+ uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase());
1093
+ }
1094
+ this.o = o;
1095
+ if (defaultRender) {
1096
+ this.defaultRender = defaultRender;
1097
+ }
1098
+ this.ignoreTags = uppercaseIgnoredTags;
1099
+ }
1100
+ Options.prototype = {
1101
+ o: defaults,
1102
+ /**
1103
+ * @type string[]
1104
+ */
1105
+ ignoreTags: [],
1106
+ /**
1107
+ * @param {IntermediateRepresentation} ir
1108
+ * @returns {any}
1109
+ */
1110
+ defaultRender(ir) {
1111
+ return ir;
1112
+ },
1113
+ /**
1114
+ * Returns true or false based on whether a token should be displayed as a
1115
+ * link based on the user options.
1116
+ * @param {MultiToken} token
1117
+ * @returns {boolean}
1118
+ */
1119
+ check(token) {
1120
+ return this.get("validate", token.toString(), token);
1121
+ },
1122
+ // Private methods
1123
+ /**
1124
+ * Resolve an option's value based on the value of the option and the given
1125
+ * params. If operator and token are specified and the target option is
1126
+ * callable, automatically calls the function with the given argument.
1127
+ * @template {keyof Opts} K
1128
+ * @param {K} key Name of option to use
1129
+ * @param {string} [operator] will be passed to the target option if it's a
1130
+ * function. If not specified, RAW function value gets returned
1131
+ * @param {MultiToken} [token] The token from linkify.tokenize
1132
+ * @returns {Opts[K] | any}
1133
+ */
1134
+ get(key, operator, token) {
1135
+ const isCallable = operator != null;
1136
+ let option = this.o[key];
1137
+ if (!option) {
1138
+ return option;
1139
+ }
1140
+ if (typeof option === "object") {
1141
+ option = token.t in option ? option[token.t] : defaults[key];
1142
+ if (typeof option === "function" && isCallable) {
1143
+ option = option(operator, token);
1144
+ }
1145
+ } else if (typeof option === "function" && isCallable) {
1146
+ option = option(operator, token.t, token);
1147
+ }
1148
+ return option;
1149
+ },
1150
+ /**
1151
+ * @template {keyof Opts} L
1152
+ * @param {L} key Name of options object to use
1153
+ * @param {string} [operator]
1154
+ * @param {MultiToken} [token]
1155
+ * @returns {Opts[L] | any}
1156
+ */
1157
+ getObj(key, operator, token) {
1158
+ let obj = this.o[key];
1159
+ if (typeof obj === "function" && operator != null) {
1160
+ obj = obj(operator, token.t, token);
1161
+ }
1162
+ return obj;
1163
+ },
1164
+ /**
1165
+ * Convert the given token to a rendered element that may be added to the
1166
+ * calling-interface's DOM
1167
+ * @param {MultiToken} token Token to render to an HTML element
1168
+ * @returns {any} Render result; e.g., HTML string, DOM element, React
1169
+ * Component, etc.
1170
+ */
1171
+ render(token) {
1172
+ const ir = token.render(this);
1173
+ const renderFn = this.get("render", null, token) || this.defaultRender;
1174
+ return renderFn(ir, token.t, token);
1175
+ }
1176
+ };
1177
+ function noop(val) {
1178
+ return val;
1179
+ }
1180
+ function MultiToken(value, tokens) {
1181
+ this.t = "token";
1182
+ this.v = value;
1183
+ this.tk = tokens;
1184
+ }
1185
+ MultiToken.prototype = {
1186
+ isLink: false,
1187
+ /**
1188
+ * Return the string this token represents.
1189
+ * @return {string}
1190
+ */
1191
+ toString() {
1192
+ return this.v;
1193
+ },
1194
+ /**
1195
+ * What should the value for this token be in the `href` HTML attribute?
1196
+ * Returns the `.toString` value by default.
1197
+ * @param {string} [scheme]
1198
+ * @return {string}
1199
+ */
1200
+ toHref(scheme2) {
1201
+ return this.toString();
1202
+ },
1203
+ /**
1204
+ * @param {Options} options Formatting options
1205
+ * @returns {string}
1206
+ */
1207
+ toFormattedString(options) {
1208
+ const val = this.toString();
1209
+ const truncate = options.get("truncate", val, this);
1210
+ const formatted = options.get("format", val, this);
1211
+ return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + "\u2026" : formatted;
1212
+ },
1213
+ /**
1214
+ *
1215
+ * @param {Options} options
1216
+ * @returns {string}
1217
+ */
1218
+ toFormattedHref(options) {
1219
+ return options.get("formatHref", this.toHref(options.get("defaultProtocol")), this);
1220
+ },
1221
+ /**
1222
+ * The start index of this token in the original input string
1223
+ * @returns {number}
1224
+ */
1225
+ startIndex() {
1226
+ return this.tk[0].s;
1227
+ },
1228
+ /**
1229
+ * The end index of this token in the original input string (up to this
1230
+ * index but not including it)
1231
+ * @returns {number}
1232
+ */
1233
+ endIndex() {
1234
+ return this.tk[this.tk.length - 1].e;
1235
+ },
1236
+ /**
1237
+ Returns an object of relevant values for this token, which includes keys
1238
+ * type - Kind of token ('url', 'email', etc.)
1239
+ * value - Original text
1240
+ * href - The value that should be added to the anchor tag's href
1241
+ attribute
1242
+ @method toObject
1243
+ @param {string} [protocol] `'http'` by default
1244
+ */
1245
+ toObject(protocol = defaults.defaultProtocol) {
1246
+ return {
1247
+ type: this.t,
1248
+ value: this.toString(),
1249
+ isLink: this.isLink,
1250
+ href: this.toHref(protocol),
1251
+ start: this.startIndex(),
1252
+ end: this.endIndex()
1253
+ };
1254
+ },
1255
+ /**
1256
+ *
1257
+ * @param {Options} options Formatting option
1258
+ */
1259
+ toFormattedObject(options) {
1260
+ return {
1261
+ type: this.t,
1262
+ value: this.toFormattedString(options),
1263
+ isLink: this.isLink,
1264
+ href: this.toFormattedHref(options),
1265
+ start: this.startIndex(),
1266
+ end: this.endIndex()
1267
+ };
1268
+ },
1269
+ /**
1270
+ * Whether this token should be rendered as a link according to the given options
1271
+ * @param {Options} options
1272
+ * @returns {boolean}
1273
+ */
1274
+ validate(options) {
1275
+ return options.get("validate", this.toString(), this);
1276
+ },
1277
+ /**
1278
+ * Return an object that represents how this link should be rendered.
1279
+ * @param {Options} options Formattinng options
1280
+ */
1281
+ render(options) {
1282
+ const token = this;
1283
+ const href = this.toHref(options.get("defaultProtocol"));
1284
+ const formattedHref = options.get("formatHref", href, this);
1285
+ const tagName = options.get("tagName", href, token);
1286
+ const content = this.toFormattedString(options);
1287
+ const attributes = {};
1288
+ const className = options.get("className", href, token);
1289
+ const target = options.get("target", href, token);
1290
+ const rel = options.get("rel", href, token);
1291
+ const attrs = options.getObj("attributes", href, token);
1292
+ const eventListeners = options.getObj("events", href, token);
1293
+ attributes.href = formattedHref;
1294
+ if (className) {
1295
+ attributes.class = className;
1296
+ }
1297
+ if (target) {
1298
+ attributes.target = target;
1299
+ }
1300
+ if (rel) {
1301
+ attributes.rel = rel;
1302
+ }
1303
+ if (attrs) {
1304
+ Object.assign(attributes, attrs);
1305
+ }
1306
+ return {
1307
+ tagName,
1308
+ attributes,
1309
+ content,
1310
+ eventListeners
1311
+ };
1312
+ }
1313
+ };
1314
+ function createTokenClass(type, props) {
1315
+ class Token extends MultiToken {
1316
+ constructor(value, tokens) {
1317
+ super(value, tokens);
1318
+ this.t = type;
1319
+ }
1320
+ }
1321
+ for (const p in props) {
1322
+ Token.prototype[p] = props[p];
1323
+ }
1324
+ Token.t = type;
1325
+ return Token;
1326
+ }
1327
+ var Email = createTokenClass("email", {
1328
+ isLink: true,
1329
+ toHref() {
1330
+ return "mailto:" + this.toString();
1331
+ }
1332
+ });
1333
+ var Text = createTokenClass("text");
1334
+ var Nl = createTokenClass("nl");
1335
+ var Url = createTokenClass("url", {
1336
+ isLink: true,
1337
+ /**
1338
+ Lowercases relevant parts of the domain and adds the protocol if
1339
+ required. Note that this will not escape unsafe HTML characters in the
1340
+ URL.
1341
+ @param {string} [scheme] default scheme (e.g., 'https')
1342
+ @return {string} the full href
1343
+ */
1344
+ toHref(scheme2 = defaults.defaultProtocol) {
1345
+ return this.hasProtocol() ? this.v : `${scheme2}://${this.v}`;
1346
+ },
1347
+ /**
1348
+ * Check whether this URL token has a protocol
1349
+ * @return {boolean}
1350
+ */
1351
+ hasProtocol() {
1352
+ const tokens = this.tk;
1353
+ return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON;
1354
+ }
1355
+ });
1356
+ var makeState = (arg) => new State(arg);
1357
+ function init$1({
1358
+ groups
1359
+ }) {
1360
+ const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]);
1361
+ 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];
1362
+ const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE];
1363
+ const Start = makeState();
1364
+ const Localpart = tt(Start, TILDE);
1365
+ ta(Localpart, localpartAccepting, Localpart);
1366
+ ta(Localpart, groups.domain, Localpart);
1367
+ const Domain = makeState(), Scheme = makeState(), SlashScheme = makeState();
1368
+ ta(Start, groups.domain, Domain);
1369
+ ta(Start, groups.scheme, Scheme);
1370
+ ta(Start, groups.slashscheme, SlashScheme);
1371
+ ta(Domain, localpartAccepting, Localpart);
1372
+ ta(Domain, groups.domain, Domain);
1373
+ const LocalpartAt = tt(Domain, AT);
1374
+ tt(Localpart, AT, LocalpartAt);
1375
+ tt(Scheme, AT, LocalpartAt);
1376
+ tt(SlashScheme, AT, LocalpartAt);
1377
+ const LocalpartDot = tt(Localpart, DOT);
1378
+ ta(LocalpartDot, localpartAccepting, Localpart);
1379
+ ta(LocalpartDot, groups.domain, Localpart);
1380
+ const EmailDomain = makeState();
1381
+ ta(LocalpartAt, groups.domain, EmailDomain);
1382
+ ta(EmailDomain, groups.domain, EmailDomain);
1383
+ const EmailDomainDot = tt(EmailDomain, DOT);
1384
+ ta(EmailDomainDot, groups.domain, EmailDomain);
1385
+ const Email$1 = makeState(Email);
1386
+ ta(EmailDomainDot, groups.tld, Email$1);
1387
+ ta(EmailDomainDot, groups.utld, Email$1);
1388
+ tt(LocalpartAt, LOCALHOST, Email$1);
1389
+ const EmailDomainHyphen = tt(EmailDomain, HYPHEN);
1390
+ tt(EmailDomainHyphen, HYPHEN, EmailDomainHyphen);
1391
+ ta(EmailDomainHyphen, groups.domain, EmailDomain);
1392
+ ta(Email$1, groups.domain, EmailDomain);
1393
+ tt(Email$1, DOT, EmailDomainDot);
1394
+ tt(Email$1, HYPHEN, EmailDomainHyphen);
1395
+ const EmailColon = tt(Email$1, COLON);
1396
+ ta(EmailColon, groups.numeric, Email);
1397
+ const DomainHyphen = tt(Domain, HYPHEN);
1398
+ const DomainDot = tt(Domain, DOT);
1399
+ tt(DomainHyphen, HYPHEN, DomainHyphen);
1400
+ ta(DomainHyphen, groups.domain, Domain);
1401
+ ta(DomainDot, localpartAccepting, Localpart);
1402
+ ta(DomainDot, groups.domain, Domain);
1403
+ const DomainDotTld = makeState(Url);
1404
+ ta(DomainDot, groups.tld, DomainDotTld);
1405
+ ta(DomainDot, groups.utld, DomainDotTld);
1406
+ ta(DomainDotTld, groups.domain, Domain);
1407
+ ta(DomainDotTld, localpartAccepting, Localpart);
1408
+ tt(DomainDotTld, DOT, DomainDot);
1409
+ tt(DomainDotTld, HYPHEN, DomainHyphen);
1410
+ tt(DomainDotTld, AT, LocalpartAt);
1411
+ const DomainDotTldColon = tt(DomainDotTld, COLON);
1412
+ const DomainDotTldColonPort = makeState(Url);
1413
+ ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort);
1414
+ const Url$1 = makeState(Url);
1415
+ const UrlNonaccept = makeState();
1416
+ ta(Url$1, qsAccepting, Url$1);
1417
+ ta(Url$1, qsNonAccepting, UrlNonaccept);
1418
+ ta(UrlNonaccept, qsAccepting, Url$1);
1419
+ ta(UrlNonaccept, qsNonAccepting, UrlNonaccept);
1420
+ tt(DomainDotTld, SLASH, Url$1);
1421
+ tt(DomainDotTldColonPort, SLASH, Url$1);
1422
+ const SchemeColon = tt(Scheme, COLON);
1423
+ const SlashSchemeColon = tt(SlashScheme, COLON);
1424
+ const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH);
1425
+ const UriPrefix = tt(SlashSchemeColonSlash, SLASH);
1426
+ ta(Scheme, groups.domain, Domain);
1427
+ tt(Scheme, DOT, DomainDot);
1428
+ tt(Scheme, HYPHEN, DomainHyphen);
1429
+ ta(SlashScheme, groups.domain, Domain);
1430
+ tt(SlashScheme, DOT, DomainDot);
1431
+ tt(SlashScheme, HYPHEN, DomainHyphen);
1432
+ ta(SchemeColon, groups.domain, Url$1);
1433
+ tt(SchemeColon, SLASH, Url$1);
1434
+ tt(SchemeColon, QUERY, Url$1);
1435
+ ta(UriPrefix, groups.domain, Url$1);
1436
+ ta(UriPrefix, qsAccepting, Url$1);
1437
+ tt(UriPrefix, SLASH, Url$1);
1438
+ const bracketPairs = [
1439
+ [OPENBRACE, CLOSEBRACE],
1440
+ // {}
1441
+ [OPENBRACKET, CLOSEBRACKET],
1442
+ // []
1443
+ [OPENPAREN, CLOSEPAREN],
1444
+ // ()
1445
+ [OPENANGLEBRACKET, CLOSEANGLEBRACKET],
1446
+ // <>
1447
+ [FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN],
1448
+ // ()
1449
+ [LEFTCORNERBRACKET, RIGHTCORNERBRACKET],
1450
+ // 「」
1451
+ [LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET],
1452
+ // 『』
1453
+ [FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN]
1454
+ // <>
1455
+ ];
1456
+ for (let i = 0; i < bracketPairs.length; i++) {
1457
+ const [OPEN, CLOSE] = bracketPairs[i];
1458
+ const UrlOpen = tt(Url$1, OPEN);
1459
+ tt(UrlNonaccept, OPEN, UrlOpen);
1460
+ tt(UrlOpen, CLOSE, Url$1);
1461
+ const UrlOpenQ = makeState(Url);
1462
+ ta(UrlOpen, qsAccepting, UrlOpenQ);
1463
+ const UrlOpenSyms = makeState();
1464
+ ta(UrlOpen, qsNonAccepting);
1465
+ ta(UrlOpenQ, qsAccepting, UrlOpenQ);
1466
+ ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
1467
+ ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
1468
+ ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms);
1469
+ tt(UrlOpenQ, CLOSE, Url$1);
1470
+ tt(UrlOpenSyms, CLOSE, Url$1);
1471
+ }
1472
+ tt(Start, LOCALHOST, DomainDotTld);
1473
+ tt(Start, NL, Nl);
1474
+ return {
1475
+ start: Start,
1476
+ tokens: tk
1477
+ };
1478
+ }
1479
+ function run(start, input, tokens) {
1480
+ let len = tokens.length;
1481
+ let cursor = 0;
1482
+ let multis = [];
1483
+ let textTokens = [];
1484
+ while (cursor < len) {
1485
+ let state = start;
1486
+ let secondState = null;
1487
+ let nextState = null;
1488
+ let multiLength = 0;
1489
+ let latestAccepting = null;
1490
+ let sinceAccepts = -1;
1491
+ while (cursor < len && !(secondState = state.go(tokens[cursor].t))) {
1492
+ textTokens.push(tokens[cursor++]);
1493
+ }
1494
+ while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) {
1495
+ secondState = null;
1496
+ state = nextState;
1497
+ if (state.accepts()) {
1498
+ sinceAccepts = 0;
1499
+ latestAccepting = state;
1500
+ } else if (sinceAccepts >= 0) {
1501
+ sinceAccepts++;
1502
+ }
1503
+ cursor++;
1504
+ multiLength++;
1505
+ }
1506
+ if (sinceAccepts < 0) {
1507
+ cursor -= multiLength;
1508
+ if (cursor < len) {
1509
+ textTokens.push(tokens[cursor]);
1510
+ cursor++;
1511
+ }
1512
+ } else {
1513
+ if (textTokens.length > 0) {
1514
+ multis.push(initMultiToken(Text, input, textTokens));
1515
+ textTokens = [];
1516
+ }
1517
+ cursor -= sinceAccepts;
1518
+ multiLength -= sinceAccepts;
1519
+ const Multi = latestAccepting.t;
1520
+ const subtokens = tokens.slice(cursor - multiLength, cursor);
1521
+ multis.push(initMultiToken(Multi, input, subtokens));
1522
+ }
1523
+ }
1524
+ if (textTokens.length > 0) {
1525
+ multis.push(initMultiToken(Text, input, textTokens));
1526
+ }
1527
+ return multis;
1528
+ }
1529
+ function initMultiToken(Multi, input, tokens) {
1530
+ const startIdx = tokens[0].s;
1531
+ const endIdx = tokens[tokens.length - 1].e;
1532
+ const value = input.slice(startIdx, endIdx);
1533
+ return new Multi(value, tokens);
1534
+ }
1535
+ var INIT = {
1536
+ scanner: null,
1537
+ parser: null,
1538
+ tokenQueue: [],
1539
+ pluginQueue: [],
1540
+ customSchemes: [],
1541
+ initialized: false
1542
+ };
1543
+ function init() {
1544
+ INIT.scanner = init$2(INIT.customSchemes);
1545
+ for (let i = 0; i < INIT.tokenQueue.length; i++) {
1546
+ INIT.tokenQueue[i][1]({
1547
+ scanner: INIT.scanner
1548
+ });
1549
+ }
1550
+ INIT.parser = init$1(INIT.scanner.tokens);
1551
+ for (let i = 0; i < INIT.pluginQueue.length; i++) {
1552
+ INIT.pluginQueue[i][1]({
1553
+ scanner: INIT.scanner,
1554
+ parser: INIT.parser
1555
+ });
1556
+ }
1557
+ INIT.initialized = true;
1558
+ return INIT;
1559
+ }
1560
+ function tokenize(str) {
1561
+ if (!INIT.initialized) {
1562
+ init();
1563
+ }
1564
+ return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));
1565
+ }
1566
+ tokenize.scan = run$1;
1567
+ function find(str, type = null, opts = null) {
1568
+ if (type && typeof type === "object") {
1569
+ if (opts) {
1570
+ throw Error(`linkifyjs: Invalid link type ${type}; must be a string`);
1571
+ }
1572
+ opts = type;
1573
+ type = null;
1574
+ }
1575
+ const options = new Options(opts);
1576
+ const tokens = tokenize(str);
1577
+ const filtered = [];
1578
+ for (let i = 0; i < tokens.length; i++) {
1579
+ const token = tokens[i];
1580
+ if (token.isLink && (!type || token.t === type) && options.check(token)) {
1581
+ filtered.push(token.toFormattedObject(options));
1582
+ }
1583
+ }
1584
+ return filtered;
1585
+ }
1586
+
1587
+ // src/extensions/base/link.ts
1588
+ var isSameDomain = (url) => {
1589
+ if (typeof window === "undefined") return false;
1590
+ try {
1591
+ return new URL(url).hostname === window.location.hostname;
1592
+ } catch {
1593
+ return false;
1594
+ }
1595
+ };
461
1596
  var LinkExtension = import_extension_link.default.extend({
462
- addOptions() {
1597
+ addAttributes() {
463
1598
  return {
464
1599
  ...this.parent?.(),
465
- openOnClick: false,
466
- linkOnPaste: true,
467
- autolink: true,
468
- protocols: ["http", "https", "mailto", "tel"]
1600
+ target: {
1601
+ default: "_blank",
1602
+ parseHTML: (element) => {
1603
+ const href = element.getAttribute("href") ?? "";
1604
+ return isSameDomain(href) ? "_self" : "_blank";
1605
+ }
1606
+ },
1607
+ rel: {
1608
+ default: null,
1609
+ parseHTML: (element) => {
1610
+ const href = element.getAttribute("href") ?? "";
1611
+ return isSameDomain(href) ? null : "noopener noreferrer nofollow";
1612
+ }
1613
+ }
469
1614
  };
1615
+ },
1616
+ addPasteRules() {
1617
+ if (!this.options.linkOnPaste) {
1618
+ return this.parent?.() ?? [];
1619
+ }
1620
+ const { protocols, defaultProtocol } = this.options;
1621
+ return [
1622
+ (0, import_core4.markPasteRule)({
1623
+ find: (text) => find(text).filter(
1624
+ (link) => link.isLink && this.options.isAllowedUri(link.value, {
1625
+ defaultValidate: (href) => !!(0, import_extension_link.isAllowedUri)(href, protocols),
1626
+ protocols,
1627
+ defaultProtocol
1628
+ })
1629
+ ).filter((link) => this.options.shouldAutoLink?.(link.value) !== false).map((link) => ({ text: link.value, data: { href: link.href }, index: link.start })),
1630
+ type: this.type,
1631
+ getAttributes: (match) => {
1632
+ const href = match.data?.href ?? "";
1633
+ const sameDomain = isSameDomain(href);
1634
+ return {
1635
+ href,
1636
+ target: sameDomain ? "_self" : "_blank",
1637
+ rel: sameDomain ? null : "noopener noreferrer nofollow"
1638
+ };
1639
+ }
1640
+ })
1641
+ ];
470
1642
  }
471
1643
  }).configure({
472
1644
  openOnClick: false,
@@ -476,8 +1648,8 @@ var LinkExtension = import_extension_link.default.extend({
476
1648
  });
477
1649
 
478
1650
  // src/extensions/base/myth-reality.ts
479
- var import_core4 = require("@tiptap/core");
480
- var BaseMythRealityBlock = import_core4.Node.create({
1651
+ var import_core5 = require("@tiptap/core");
1652
+ var BaseMythRealityBlock = import_core5.Node.create({
481
1653
  name: "mythRealityBlock",
482
1654
  group: "block",
483
1655
  content: "block+",
@@ -487,12 +1659,12 @@ var BaseMythRealityBlock = import_core4.Node.create({
487
1659
  renderHTML({ HTMLAttributes }) {
488
1660
  return [
489
1661
  "div",
490
- (0, import_core4.mergeAttributes)(HTMLAttributes, { "data-myth-reality-block": "" }),
1662
+ (0, import_core5.mergeAttributes)(HTMLAttributes, { "data-myth-reality-block": "" }),
491
1663
  ["div", { class: "myth-reality-block-content" }, 0]
492
1664
  ];
493
1665
  }
494
1666
  });
495
- var BaseMythReality = import_core4.Node.create({
1667
+ var BaseMythReality = import_core5.Node.create({
496
1668
  name: "mythReality",
497
1669
  group: "block",
498
1670
  content: "(mythRealityBlock) (mythRealityBlock)",
@@ -502,7 +1674,7 @@ var BaseMythReality = import_core4.Node.create({
502
1674
  return [{ tag: "div[data-myth-reality]" }];
503
1675
  },
504
1676
  renderHTML({ HTMLAttributes }) {
505
- return ["div", (0, import_core4.mergeAttributes)(HTMLAttributes, { "data-myth-reality": "" }), 0];
1677
+ return ["div", (0, import_core5.mergeAttributes)(HTMLAttributes, { "data-myth-reality": "" }), 0];
506
1678
  },
507
1679
  addKeyboardShortcuts() {
508
1680
  return {
@@ -512,9 +1684,9 @@ var BaseMythReality = import_core4.Node.create({
512
1684
  });
513
1685
 
514
1686
  // src/extensions/base/prompt.ts
515
- var import_core5 = require("@tiptap/core");
1687
+ var import_core6 = require("@tiptap/core");
516
1688
  var import_state3 = require("@tiptap/pm/state");
517
- var BasePrompt = import_core5.Node.create({
1689
+ var BasePrompt = import_core6.Node.create({
518
1690
  name: "prompt",
519
1691
  group: "block",
520
1692
  content: "(promptHeader | promptV2Header) (promptContent | promptV2Content)",
@@ -540,13 +1712,13 @@ var BasePrompt = import_core5.Node.create({
540
1712
  if (!isInsidePrompt) {
541
1713
  return false;
542
1714
  }
543
- const { tr } = state;
1715
+ const { tr: tr2 } = state;
544
1716
  const posAfter = $pos.after(depth);
545
1717
  const paragraphNode = schema.nodes.paragraph.createAndFill();
546
1718
  if (!paragraphNode) return false;
547
- tr.insert(posAfter, paragraphNode);
548
- tr.setSelection(import_state3.TextSelection.create(tr.doc, posAfter + 1));
549
- view.dispatch(tr);
1719
+ tr2.insert(posAfter, paragraphNode);
1720
+ tr2.setSelection(import_state3.TextSelection.create(tr2.doc, posAfter + 1));
1721
+ view.dispatch(tr2);
550
1722
  return true;
551
1723
  }
552
1724
  };
@@ -559,10 +1731,10 @@ var BasePrompt = import_core5.Node.create({
559
1731
  ];
560
1732
  },
561
1733
  renderHTML({ HTMLAttributes }) {
562
- return ["div", (0, import_core5.mergeAttributes)(HTMLAttributes, { "data-prompt": "" }), 0];
1734
+ return ["div", (0, import_core6.mergeAttributes)(HTMLAttributes, { "data-prompt": "" }), 0];
563
1735
  }
564
1736
  });
565
- var BasePromptHeader = import_core5.Node.create({
1737
+ var BasePromptHeader = import_core6.Node.create({
566
1738
  name: "promptHeader",
567
1739
  group: "block",
568
1740
  content: "inline*",
@@ -576,13 +1748,13 @@ var BasePromptHeader = import_core5.Node.create({
576
1748
  ];
577
1749
  },
578
1750
  renderHTML({ HTMLAttributes }) {
579
- return ["div", (0, import_core5.mergeAttributes)(HTMLAttributes, { "data-prompt-header": "" }), 0];
1751
+ return ["div", (0, import_core6.mergeAttributes)(HTMLAttributes, { "data-prompt-header": "" }), 0];
580
1752
  }
581
1753
  // addNodeView() {
582
1754
  // return ReactNodeViewRenderer(PromptHeaderView);
583
1755
  // },
584
1756
  });
585
- var BasePromptContent = import_core5.Node.create({
1757
+ var BasePromptContent = import_core6.Node.create({
586
1758
  name: "promptContent",
587
1759
  group: "block",
588
1760
  content: "text*",
@@ -596,7 +1768,7 @@ var BasePromptContent = import_core5.Node.create({
596
1768
  ];
597
1769
  },
598
1770
  renderHTML({ HTMLAttributes }) {
599
- return ["div", (0, import_core5.mergeAttributes)(HTMLAttributes, { "data-prompt-content": "" }), 0];
1771
+ return ["div", (0, import_core6.mergeAttributes)(HTMLAttributes, { "data-prompt-content": "" }), 0];
600
1772
  }
601
1773
  // addNodeView() {
602
1774
  // return ReactNodeViewRenderer(PromptContentView);
@@ -604,8 +1776,8 @@ var BasePromptContent = import_core5.Node.create({
604
1776
  });
605
1777
 
606
1778
  // src/extensions/base/video.ts
607
- var import_core6 = require("@tiptap/core");
608
- var BaseVideo = import_core6.Node.create({
1779
+ var import_core7 = require("@tiptap/core");
1780
+ var BaseVideo = import_core7.Node.create({
609
1781
  name: "video",
610
1782
  group: "block",
611
1783
  selectable: true,
@@ -631,7 +1803,7 @@ var BaseVideo = import_core6.Node.create({
631
1803
  });
632
1804
 
633
1805
  // src/extensions/base/figure.ts
634
- var import_core7 = require("@tiptap/core");
1806
+ var import_core8 = require("@tiptap/core");
635
1807
  var import_extension_image = __toESM(require("@tiptap/extension-image"));
636
1808
 
637
1809
  // src/utils/image-src-resolver.ts
@@ -675,6 +1847,43 @@ var BaseFigure = import_extension_image.default.extend({
675
1847
  addAttributes() {
676
1848
  return {
677
1849
  ...this.parent?.(),
1850
+ src: {
1851
+ default: null,
1852
+ parseHTML: (element) => {
1853
+ const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
1854
+ return img?.getAttribute("src") ?? null;
1855
+ }
1856
+ },
1857
+ alt: {
1858
+ default: null,
1859
+ parseHTML: (element) => {
1860
+ const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
1861
+ return img?.getAttribute("alt") ?? null;
1862
+ }
1863
+ },
1864
+ title: {
1865
+ default: null,
1866
+ parseHTML: (element) => {
1867
+ const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
1868
+ return img?.getAttribute("title") ?? null;
1869
+ }
1870
+ },
1871
+ width: {
1872
+ default: null,
1873
+ parseHTML: (element) => {
1874
+ const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
1875
+ const val = img?.getAttribute("width");
1876
+ return val ? parseInt(val) : null;
1877
+ }
1878
+ },
1879
+ height: {
1880
+ default: null,
1881
+ parseHTML: (element) => {
1882
+ const img = element.tagName === "FIGURE" ? element.querySelector("img") : element;
1883
+ const val = img?.getAttribute("height");
1884
+ return val ? parseInt(val) : null;
1885
+ }
1886
+ },
678
1887
  fileId: {
679
1888
  default: null,
680
1889
  parseHTML: (element) => {
@@ -726,7 +1935,7 @@ var BaseFigure = import_extension_image.default.extend({
726
1935
  },
727
1936
  { getImageById: this.options.getImageById }
728
1937
  );
729
- const figureAttrs = (0, import_core7.mergeAttributes)(this.options.HTMLAttributes);
1938
+ const figureAttrs = (0, import_core8.mergeAttributes)(this.options.HTMLAttributes);
730
1939
  const imgAttrs = {
731
1940
  src: resolvedSrc
732
1941
  };
@@ -760,7 +1969,7 @@ var BaseFigure = import_extension_image.default.extend({
760
1969
  },
761
1970
  addPasteRules() {
762
1971
  return [
763
- (0, import_core7.nodePasteRule)({
1972
+ (0, import_core8.nodePasteRule)({
764
1973
  find: /!\[(.*?)\]\((.*?)(?:\s+"(.*?)")?\)/g,
765
1974
  type: this.type,
766
1975
  getAttributes: (match) => {
@@ -781,13 +1990,13 @@ var import_extension_superscript = __toESM(require("@tiptap/extension-superscrip
781
1990
  var import_extension_text_align = __toESM(require("@tiptap/extension-text-align"));
782
1991
 
783
1992
  // node_modules/@tiptap/extension-text-style/dist/index.js
784
- var import_core8 = require("@tiptap/core");
785
1993
  var import_core9 = require("@tiptap/core");
786
1994
  var import_core10 = require("@tiptap/core");
787
1995
  var import_core11 = require("@tiptap/core");
788
1996
  var import_core12 = require("@tiptap/core");
789
1997
  var import_core13 = require("@tiptap/core");
790
1998
  var import_core14 = require("@tiptap/core");
1999
+ var import_core15 = require("@tiptap/core");
791
2000
  var MAX_FIND_CHILD_SPAN_DEPTH = 20;
792
2001
  var findChildSpans = (element, depth = 0) => {
793
2002
  const childSpans = [];
@@ -818,7 +2027,7 @@ var mergeNestedSpanStyles = (element) => {
818
2027
  childSpan.setAttribute("style", `${closestParentSpanStyleOfChild};${childStyle}`);
819
2028
  });
820
2029
  };
821
- var TextStyle = import_core8.Mark.create({
2030
+ var TextStyle = import_core9.Mark.create({
822
2031
  name: "textStyle",
823
2032
  priority: 101,
824
2033
  addOptions() {
@@ -846,21 +2055,21 @@ var TextStyle = import_core8.Mark.create({
846
2055
  ];
847
2056
  },
848
2057
  renderHTML({ HTMLAttributes }) {
849
- return ["span", (0, import_core8.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes), 0];
2058
+ return ["span", (0, import_core9.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes), 0];
850
2059
  },
851
2060
  addCommands() {
852
2061
  return {
853
2062
  toggleTextStyle: (attributes) => ({ commands }) => {
854
2063
  return commands.toggleMark(this.name, attributes);
855
2064
  },
856
- removeEmptyTextStyle: () => ({ tr }) => {
857
- const { selection } = tr;
858
- tr.doc.nodesBetween(selection.from, selection.to, (node, pos) => {
2065
+ removeEmptyTextStyle: () => ({ tr: tr2 }) => {
2066
+ const { selection } = tr2;
2067
+ tr2.doc.nodesBetween(selection.from, selection.to, (node, pos) => {
859
2068
  if (node.isTextblock) {
860
2069
  return true;
861
2070
  }
862
2071
  if (!node.marks.filter((mark) => mark.type === this.type).some((mark) => Object.values(mark.attrs).some((value) => !!value))) {
863
- tr.removeMark(pos, pos + node.nodeSize, this.type);
2072
+ tr2.removeMark(pos, pos + node.nodeSize, this.type);
864
2073
  }
865
2074
  });
866
2075
  return true;
@@ -868,7 +2077,7 @@ var TextStyle = import_core8.Mark.create({
868
2077
  };
869
2078
  }
870
2079
  });
871
- var BackgroundColor = import_core9.Extension.create({
2080
+ var BackgroundColor = import_core10.Extension.create({
872
2081
  name: "backgroundColor",
873
2082
  addOptions() {
874
2083
  return {
@@ -924,7 +2133,7 @@ var BackgroundColor = import_core9.Extension.create({
924
2133
  };
925
2134
  }
926
2135
  });
927
- var Color = import_core10.Extension.create({
2136
+ var Color = import_core11.Extension.create({
928
2137
  name: "color",
929
2138
  addOptions() {
930
2139
  return {
@@ -980,7 +2189,7 @@ var Color = import_core10.Extension.create({
980
2189
  };
981
2190
  }
982
2191
  });
983
- var FontFamily = import_core11.Extension.create({
2192
+ var FontFamily = import_core12.Extension.create({
984
2193
  name: "fontFamily",
985
2194
  addOptions() {
986
2195
  return {
@@ -1019,7 +2228,7 @@ var FontFamily = import_core11.Extension.create({
1019
2228
  };
1020
2229
  }
1021
2230
  });
1022
- var FontSize = import_core12.Extension.create({
2231
+ var FontSize = import_core13.Extension.create({
1023
2232
  name: "fontSize",
1024
2233
  addOptions() {
1025
2234
  return {
@@ -1058,7 +2267,7 @@ var FontSize = import_core12.Extension.create({
1058
2267
  };
1059
2268
  }
1060
2269
  });
1061
- var LineHeight = import_core13.Extension.create({
2270
+ var LineHeight = import_core14.Extension.create({
1062
2271
  name: "lineHeight",
1063
2272
  addOptions() {
1064
2273
  return {
@@ -1097,7 +2306,7 @@ var LineHeight = import_core13.Extension.create({
1097
2306
  };
1098
2307
  }
1099
2308
  });
1100
- var TextStyleKit = import_core14.Extension.create({
2309
+ var TextStyleKit = import_core15.Extension.create({
1101
2310
  name: "textStyleKit",
1102
2311
  addExtensions() {
1103
2312
  const extensions = [];
@@ -1124,10 +2333,10 @@ var TextStyleKit = import_core14.Extension.create({
1124
2333
  });
1125
2334
 
1126
2335
  // src/extensions/base/compatibility.ts
1127
- var import_core15 = require("@tiptap/core");
2336
+ var import_core16 = require("@tiptap/core");
1128
2337
  var import_state4 = require("@tiptap/pm/state");
1129
2338
  var import_extension_image2 = __toESM(require("@tiptap/extension-image"));
1130
- var BaseLegacyBookAlert = import_core15.Node.create({
2339
+ var BaseLegacyBookAlert = import_core16.Node.create({
1131
2340
  name: "calloutAlert",
1132
2341
  group: "block",
1133
2342
  content: "block+",
@@ -1179,10 +2388,10 @@ var BaseLegacyBookAlert = import_core15.Node.create({
1179
2388
  };
1180
2389
  },
1181
2390
  renderHTML({ HTMLAttributes }) {
1182
- return ["div", (0, import_core15.mergeAttributes)(HTMLAttributes, { "data-type": "callout-alert" }), 0];
2391
+ return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-type": "callout-alert" }), 0];
1183
2392
  }
1184
2393
  });
1185
- var BaseLegacyBookTip = import_core15.Node.create({
2394
+ var BaseLegacyBookTip = import_core16.Node.create({
1186
2395
  name: "calloutTip",
1187
2396
  group: "block",
1188
2397
  content: "block+",
@@ -1229,7 +2438,7 @@ var BaseLegacyBookTip = import_core15.Node.create({
1229
2438
  ];
1230
2439
  },
1231
2440
  renderHTML({ HTMLAttributes }) {
1232
- return ["div", (0, import_core15.mergeAttributes)(HTMLAttributes, { "data-type": "callout-tip" }), 0];
2441
+ return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-type": "callout-tip" }), 0];
1233
2442
  },
1234
2443
  addKeyboardShortcuts() {
1235
2444
  return {
@@ -1237,7 +2446,7 @@ var BaseLegacyBookTip = import_core15.Node.create({
1237
2446
  };
1238
2447
  }
1239
2448
  });
1240
- var BaseLegacySEQuote = import_core15.Node.create({
2449
+ var BaseLegacySEQuote = import_core16.Node.create({
1241
2450
  name: "customQuoteV2",
1242
2451
  group: "block",
1243
2452
  content: "customQuoteText customQuoteAuthor customQuoteSign",
@@ -1264,13 +2473,13 @@ var BaseLegacySEQuote = import_core15.Node.create({
1264
2473
  if (!isInsideCustomQuoteV2) {
1265
2474
  return false;
1266
2475
  }
1267
- const { tr } = state;
2476
+ const { tr: tr2 } = state;
1268
2477
  const posAfter = $pos.after(depth);
1269
2478
  const paragraphNode = schema.nodes.paragraph.createAndFill();
1270
2479
  if (!paragraphNode) return false;
1271
- tr.insert(posAfter, paragraphNode);
1272
- tr.setSelection(import_state4.TextSelection.create(tr.doc, posAfter + 1));
1273
- view.dispatch(tr);
2480
+ tr2.insert(posAfter, paragraphNode);
2481
+ tr2.setSelection(import_state4.TextSelection.create(tr2.doc, posAfter + 1));
2482
+ view.dispatch(tr2);
1274
2483
  return true;
1275
2484
  }
1276
2485
  };
@@ -1283,10 +2492,10 @@ var BaseLegacySEQuote = import_core15.Node.create({
1283
2492
  ];
1284
2493
  },
1285
2494
  renderHTML({ HTMLAttributes }) {
1286
- return ["div", (0, import_core15.mergeAttributes)(HTMLAttributes, { "data-custom-quote-v2": "" }), 0];
2495
+ return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-custom-quote-v2": "" }), 0];
1287
2496
  }
1288
2497
  });
1289
- var BaseLegacyPromptSE = import_core15.Node.create({
2498
+ var BaseLegacyPromptSE = import_core16.Node.create({
1290
2499
  name: "promptV2",
1291
2500
  group: "block",
1292
2501
  content: "(promptHeader | promptV2Header) (promptContent | promptV2Content)",
@@ -1312,13 +2521,13 @@ var BaseLegacyPromptSE = import_core15.Node.create({
1312
2521
  if (!isInsidePromptV2) {
1313
2522
  return false;
1314
2523
  }
1315
- const { tr } = state;
2524
+ const { tr: tr2 } = state;
1316
2525
  const posAfter = $pos.after(depth);
1317
2526
  const paragraphNode = schema.nodes.paragraph.createAndFill();
1318
2527
  if (!paragraphNode) return false;
1319
- tr.insert(posAfter, paragraphNode);
1320
- tr.setSelection(import_state4.TextSelection.create(tr.doc, posAfter + 1));
1321
- view.dispatch(tr);
2528
+ tr2.insert(posAfter, paragraphNode);
2529
+ tr2.setSelection(import_state4.TextSelection.create(tr2.doc, posAfter + 1));
2530
+ view.dispatch(tr2);
1322
2531
  return true;
1323
2532
  }
1324
2533
  };
@@ -1331,10 +2540,10 @@ var BaseLegacyPromptSE = import_core15.Node.create({
1331
2540
  ];
1332
2541
  },
1333
2542
  renderHTML({ HTMLAttributes }) {
1334
- return ["div", (0, import_core15.mergeAttributes)(HTMLAttributes, { "data-prompt": "" }), 0];
2543
+ return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-prompt": "" }), 0];
1335
2544
  }
1336
2545
  });
1337
- var BaseLegacyPromptSEHeader = import_core15.Node.create({
2546
+ var BaseLegacyPromptSEHeader = import_core16.Node.create({
1338
2547
  name: "promptV2Header",
1339
2548
  group: "block",
1340
2549
  content: "inline*",
@@ -1348,13 +2557,13 @@ var BaseLegacyPromptSEHeader = import_core15.Node.create({
1348
2557
  ];
1349
2558
  },
1350
2559
  renderHTML({ HTMLAttributes }) {
1351
- return ["div", (0, import_core15.mergeAttributes)(HTMLAttributes, { "data-prompt-header": "" }), 0];
2560
+ return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-prompt-header": "" }), 0];
1352
2561
  }
1353
2562
  // addNodeView() {
1354
2563
  // return ReactNodeViewRenderer(PromptHeaderView);
1355
2564
  // },
1356
2565
  });
1357
- var BaseLegacyPromptSEContent = import_core15.Node.create({
2566
+ var BaseLegacyPromptSEContent = import_core16.Node.create({
1358
2567
  name: "promptV2Content",
1359
2568
  group: "block",
1360
2569
  content: "text*",
@@ -1368,10 +2577,10 @@ var BaseLegacyPromptSEContent = import_core15.Node.create({
1368
2577
  ];
1369
2578
  },
1370
2579
  renderHTML({ HTMLAttributes }) {
1371
- return ["div", (0, import_core15.mergeAttributes)(HTMLAttributes, { "data-prompt-content": "" }), 0];
2580
+ return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-prompt-content": "" }), 0];
1372
2581
  }
1373
2582
  });
1374
- var BaseLegacyCustomBlockquote = import_core15.Node.create({
2583
+ var BaseLegacyCustomBlockquote = import_core16.Node.create({
1375
2584
  name: "customBlockquote",
1376
2585
  group: "block",
1377
2586
  content: "block+",
@@ -1387,7 +2596,7 @@ var BaseLegacyCustomBlockquote = import_core15.Node.create({
1387
2596
  return ["blockquote", 0];
1388
2597
  }
1389
2598
  });
1390
- var BaseLegacyYouTube = import_core15.Node.create({
2599
+ var BaseLegacyYouTube = import_core16.Node.create({
1391
2600
  name: "youtube",
1392
2601
  group: "block",
1393
2602
  selectable: true,
@@ -1423,7 +2632,7 @@ var BaseLegacyYouTube = import_core15.Node.create({
1423
2632
  return ["video-embed", { src: HTMLAttributes.src }];
1424
2633
  }
1425
2634
  });
1426
- var LegacyInlineLatexSE = import_core15.Node.create({
2635
+ var LegacyInlineLatexSE = import_core16.Node.create({
1427
2636
  name: "inlineLatex",
1428
2637
  group: "inline",
1429
2638
  inline: true,
@@ -1445,7 +2654,7 @@ var LegacyInlineLatexSE = import_core15.Node.create({
1445
2654
  ];
1446
2655
  },
1447
2656
  renderHTML({ HTMLAttributes }) {
1448
- return ["code", (0, import_core15.mergeAttributes)(HTMLAttributes, { class: "inline-latex" }), 0];
2657
+ return ["code", (0, import_core16.mergeAttributes)(HTMLAttributes, { class: "inline-latex" }), 0];
1449
2658
  }
1450
2659
  });
1451
2660
  var BaseLegacyFigure = import_extension_image2.default.extend({
@@ -1530,7 +2739,7 @@ var BaseLegacyFigure = import_extension_image2.default.extend({
1530
2739
  },
1531
2740
  { getImageById: this.options.getImageById }
1532
2741
  );
1533
- const figureAttrs = (0, import_core15.mergeAttributes)(this.options.HTMLAttributes);
2742
+ const figureAttrs = (0, import_core16.mergeAttributes)(this.options.HTMLAttributes);
1534
2743
  const imgAttrs = {
1535
2744
  src: resolvedSrc
1536
2745
  };
@@ -1822,19 +3031,19 @@ var legacyTypeMap3 = {
1822
3031
  info: "success",
1823
3032
  error: "error"
1824
3033
  };
1825
- var Callout = ({ type, bgColor, emoji, children, iconWrapper, calloutType }) => {
3034
+ var Callout = ({ type, bgColor, emoji: emoji2, children, iconWrapper, calloutType }) => {
1826
3035
  const isLegacySECallout = !!calloutType;
1827
3036
  const finalType = isLegacySECallout ? legacyTypeMap3[calloutType] : type;
1828
3037
  const hasCustomColor = !!bgColor;
1829
3038
  const className = hasCustomColor ? "callout-node" : `callout-node callout-${finalType}`;
1830
3039
  const style = hasCustomColor ? { backgroundColor: bgColor } : void 0;
1831
3040
  let icon;
1832
- if (emoji) {
1833
- if (emoji in calloutIconComponents) {
1834
- const IconComponent = calloutIconComponents[emoji];
3041
+ if (emoji2) {
3042
+ if (emoji2 in calloutIconComponents) {
3043
+ const IconComponent = calloutIconComponents[emoji2];
1835
3044
  icon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(IconComponent, {});
1836
3045
  } else {
1837
- icon = emoji;
3046
+ icon = emoji2;
1838
3047
  }
1839
3048
  } else {
1840
3049
  icon = calloutIcons[finalType];
@@ -1846,7 +3055,7 @@ var Callout = ({ type, bgColor, emoji, children, iconWrapper, calloutType }) =>
1846
3055
  className,
1847
3056
  "data-callout-type": hasCustomColor ? void 0 : type,
1848
3057
  "data-bg-color": bgColor || void 0,
1849
- "data-emoji": emoji || void 0,
3058
+ "data-emoji": emoji2 || void 0,
1850
3059
  style,
1851
3060
  children: [
1852
3061
  iconContent,
@@ -2588,7 +3797,7 @@ function TiptapRender({ content, getImageById }) {
2588
3797
  }
2589
3798
 
2590
3799
  // src/utils/html-to-tiptap-content.ts
2591
- var import_core16 = require("@tiptap/core");
3800
+ var import_core17 = require("@tiptap/core");
2592
3801
  var import_extension_table2 = require("@tiptap/extension-table");
2593
3802
  function isJSONContent(value) {
2594
3803
  return typeof value === "object" && value !== null && "type" in value && typeof value.type === "string";
@@ -2612,7 +3821,7 @@ function htmlToTiptapContent(content) {
2612
3821
  const sharedExtensions = getSharedExtensions();
2613
3822
  const extensions = [...sharedExtensions, BaseFigure, import_extension_table2.TableKit, BaseCodeBlock];
2614
3823
  try {
2615
- return (0, import_core16.generateJSON)(content, extensions);
3824
+ return (0, import_core17.generateJSON)(content, extensions);
2616
3825
  } catch (error) {
2617
3826
  console.error("Failed to convert HTML to Tiptap content:", error);
2618
3827
  return { type: "doc", content: [{ type: "paragraph" }] };