@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.css +1 -0
- package/dist/editor.css.map +1 -1
- package/dist/editor.js +1345 -136
- package/dist/editor.js.map +1 -1
- package/dist/editor.mjs +1293 -84
- package/dist/editor.mjs.map +1 -1
- package/dist/render.js +1301 -92
- package/dist/render.js.map +1 -1
- package/dist/render.mjs +1256 -47
- package/dist/render.mjs.map +1 -1
- package/dist/styles/index.css +1 -0
- package/package.json +38 -38
- package/src/editor/controls/bubble-menu-content.tsx +1 -1
- package/src/editor/dialogs/add-link-dialog/add-link-dialog.tsx +2 -6
- package/src/editor/handlers/dialog-handlers.ts +1 -0
- package/src/extensions/base/figure.ts +37 -0
- package/src/extensions/base/link.ts +63 -6
- package/src/extensions/editor/figure.ts +14 -15
- package/src/styles/extensions/figure.css +1 -0
- package/src/types/link.ts +1 -0
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
view.dispatch(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
view.dispatch(
|
|
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
|
-
|
|
391
|
-
view.dispatch(
|
|
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
|
-
|
|
426
|
-
view.dispatch(
|
|
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
|
-
|
|
1597
|
+
addAttributes() {
|
|
463
1598
|
return {
|
|
464
1599
|
...this.parent?.(),
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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
|
|
480
|
-
var BaseMythRealityBlock =
|
|
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,
|
|
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 =
|
|
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,
|
|
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
|
|
1687
|
+
var import_core6 = require("@tiptap/core");
|
|
516
1688
|
var import_state3 = require("@tiptap/pm/state");
|
|
517
|
-
var BasePrompt =
|
|
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
|
-
|
|
548
|
-
|
|
549
|
-
view.dispatch(
|
|
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,
|
|
1734
|
+
return ["div", (0, import_core6.mergeAttributes)(HTMLAttributes, { "data-prompt": "" }), 0];
|
|
563
1735
|
}
|
|
564
1736
|
});
|
|
565
|
-
var BasePromptHeader =
|
|
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,
|
|
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 =
|
|
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,
|
|
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
|
|
608
|
-
var BaseVideo =
|
|
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
|
|
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,
|
|
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,
|
|
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 =
|
|
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,
|
|
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 } =
|
|
858
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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,
|
|
2391
|
+
return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-type": "callout-alert" }), 0];
|
|
1183
2392
|
}
|
|
1184
2393
|
});
|
|
1185
|
-
var BaseLegacyBookTip =
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
1272
|
-
|
|
1273
|
-
view.dispatch(
|
|
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,
|
|
2495
|
+
return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-custom-quote-v2": "" }), 0];
|
|
1287
2496
|
}
|
|
1288
2497
|
});
|
|
1289
|
-
var BaseLegacyPromptSE =
|
|
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
|
-
|
|
1320
|
-
|
|
1321
|
-
view.dispatch(
|
|
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,
|
|
2543
|
+
return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-prompt": "" }), 0];
|
|
1335
2544
|
}
|
|
1336
2545
|
});
|
|
1337
|
-
var BaseLegacyPromptSEHeader =
|
|
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,
|
|
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 =
|
|
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,
|
|
2580
|
+
return ["div", (0, import_core16.mergeAttributes)(HTMLAttributes, { "data-prompt-content": "" }), 0];
|
|
1372
2581
|
}
|
|
1373
2582
|
});
|
|
1374
|
-
var BaseLegacyCustomBlockquote =
|
|
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 =
|
|
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 =
|
|
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,
|
|
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,
|
|
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 (
|
|
1833
|
-
if (
|
|
1834
|
-
const IconComponent = calloutIconComponents[
|
|
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 =
|
|
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":
|
|
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
|
|
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,
|
|
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" }] };
|