@cyberyozh/text-editor 0.2.0 → 0.2.2
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 +122 -101
- package/dist/editor.js.map +1 -1
- package/dist/editor.mjs +126 -105
- package/dist/editor.mjs.map +1 -1
- package/dist/render.js +52 -43
- package/dist/render.js.map +1 -1
- package/dist/render.mjs +58 -49
- package/dist/render.mjs.map +1 -1
- package/dist/styles/index.css +1 -0
- package/package.json +42 -39
- package/src/editor/controls/bubble-menu-content.tsx +12 -3
- package/src/editor/controls/character-count.tsx +7 -4
- package/src/editor/dialogs/image-dialog/image-dialog.css +1 -0
- package/src/editor/dialogs/image-dialog/image-dialog.tsx +0 -1
- package/src/editor/editor.tsx +8 -3
- package/src/editor/handlers/dialog-handlers.ts +17 -31
- package/src/editor/handlers/insertion-handlers.ts +4 -25
- package/src/editor/handlers/markup-insertion.test.ts +132 -0
- package/src/editor/handlers/markup-insertion.ts +41 -0
- package/src/extensions/base/link.ts +22 -1
- package/src/utils/image-src-resolver.test.ts +54 -0
package/dist/editor.js
CHANGED
|
@@ -37,7 +37,7 @@ module.exports = __toCommonJS(editor_exports);
|
|
|
37
37
|
|
|
38
38
|
// src/editor/editor.tsx
|
|
39
39
|
var import_react37 = require("react");
|
|
40
|
-
var
|
|
40
|
+
var import_state7 = require("@tiptap/pm/state");
|
|
41
41
|
var import_model2 = require("@tiptap/pm/model");
|
|
42
42
|
var import_react38 = require("@tiptap/react");
|
|
43
43
|
var import_menus = require("@tiptap/react/menus");
|
|
@@ -786,10 +786,16 @@ var BubbleMenuContent = ({ editor, onLinkClick }) => {
|
|
|
786
786
|
} = (0, import_react4.useEditorState)({
|
|
787
787
|
editor,
|
|
788
788
|
selector: (ctx) => {
|
|
789
|
+
let canAvalable = false;
|
|
790
|
+
try {
|
|
791
|
+
ctx.editor.can().undo();
|
|
792
|
+
canAvalable = true;
|
|
793
|
+
} catch {
|
|
794
|
+
}
|
|
789
795
|
return {
|
|
790
|
-
canUndo: ctx.editor.can().undo(),
|
|
791
|
-
canRedo: ctx.editor.can().redo(),
|
|
792
|
-
canClearMarks: ctx.editor.can().unsetAllMarks(),
|
|
796
|
+
canUndo: canAvalable ? ctx.editor.can().undo() : false,
|
|
797
|
+
canRedo: canAvalable ? ctx.editor.can().redo() : false,
|
|
798
|
+
canClearMarks: canAvalable ? ctx.editor.can().unsetAllMarks() : false,
|
|
793
799
|
isHeading2: ctx.editor.isActive("heading", { level: 2 }),
|
|
794
800
|
isHeading3: ctx.editor.isActive("heading", { level: 3 }),
|
|
795
801
|
isHeading4: ctx.editor.isActive("heading", { level: 4 }),
|
|
@@ -1483,10 +1489,12 @@ var CharacterCount = ({ editor }) => {
|
|
|
1483
1489
|
const translations2 = useTiptapTranslations();
|
|
1484
1490
|
const { charactersCount, wordsCount } = (0, import_react8.useEditorState)({
|
|
1485
1491
|
editor,
|
|
1486
|
-
selector: (context) =>
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1492
|
+
selector: (context) => {
|
|
1493
|
+
return {
|
|
1494
|
+
charactersCount: context.editor.storage.characterCount?.characters() || 0,
|
|
1495
|
+
wordsCount: context.editor.storage.characterCount?.words() || 0
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1490
1498
|
});
|
|
1491
1499
|
return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "tiptap__character-count", children: [
|
|
1492
1500
|
/* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("span", { className: "tiptap__character-count-item", children: [
|
|
@@ -2050,7 +2058,6 @@ var ImageDialog = ({
|
|
|
2050
2058
|
setIsUploading(true);
|
|
2051
2059
|
try {
|
|
2052
2060
|
const result = await uploadHandler(formState.file);
|
|
2053
|
-
console.log("\u{1F440} ~ handleAddImage ~ result:", result);
|
|
2054
2061
|
onImageAdd({
|
|
2055
2062
|
fileId: result.fileId,
|
|
2056
2063
|
src: result.fileUrl,
|
|
@@ -3130,9 +3137,10 @@ var BaseCustomQuoteSign = import_core3.Node.create({
|
|
|
3130
3137
|
// src/extensions/base/link.ts
|
|
3131
3138
|
var import_extension_link = __toESM(require("@tiptap/extension-link"));
|
|
3132
3139
|
var import_core4 = require("@tiptap/core");
|
|
3140
|
+
var import_state3 = require("@tiptap/pm/state");
|
|
3133
3141
|
|
|
3134
3142
|
// node_modules/linkifyjs/dist/linkify.mjs
|
|
3135
|
-
var encodedTlds = "
|
|
3143
|
+
var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
|
|
3136
3144
|
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";
|
|
3137
3145
|
var numeric = "numeric";
|
|
3138
3146
|
var ascii = "ascii";
|
|
@@ -4063,8 +4071,6 @@ function init$1({
|
|
|
4063
4071
|
ta(Email$1, groups.domain, EmailDomain);
|
|
4064
4072
|
tt(Email$1, DOT, EmailDomainDot);
|
|
4065
4073
|
tt(Email$1, HYPHEN, EmailDomainHyphen);
|
|
4066
|
-
const EmailColon = tt(Email$1, COLON);
|
|
4067
|
-
ta(EmailColon, groups.numeric, Email);
|
|
4068
4074
|
const DomainHyphen = tt(Domain, HYPHEN);
|
|
4069
4075
|
const DomainDot = tt(Domain, DOT);
|
|
4070
4076
|
tt(DomainHyphen, HYPHEN, DomainHyphen);
|
|
@@ -4128,11 +4134,11 @@ function init$1({
|
|
|
4128
4134
|
const [OPEN, CLOSE] = bracketPairs[i];
|
|
4129
4135
|
const UrlOpen = tt(Url$1, OPEN);
|
|
4130
4136
|
tt(UrlNonaccept, OPEN, UrlOpen);
|
|
4131
|
-
tt(UrlOpen, CLOSE, Url$1);
|
|
4132
4137
|
const UrlOpenQ = makeState(Url);
|
|
4133
4138
|
ta(UrlOpen, qsAccepting, UrlOpenQ);
|
|
4134
4139
|
const UrlOpenSyms = makeState();
|
|
4135
|
-
ta(UrlOpen, qsNonAccepting);
|
|
4140
|
+
ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
|
|
4141
|
+
tt(UrlOpen, CLOSE, Url$1);
|
|
4136
4142
|
ta(UrlOpenQ, qsAccepting, UrlOpenQ);
|
|
4137
4143
|
ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
|
|
4138
4144
|
ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
|
|
@@ -4310,6 +4316,23 @@ var LinkExtension = import_extension_link.default.extend({
|
|
|
4310
4316
|
}
|
|
4311
4317
|
})
|
|
4312
4318
|
];
|
|
4319
|
+
},
|
|
4320
|
+
addProseMirrorPlugins() {
|
|
4321
|
+
return [
|
|
4322
|
+
...this.parent?.() ?? [],
|
|
4323
|
+
new import_state3.Plugin({
|
|
4324
|
+
props: {
|
|
4325
|
+
handleClick: (view, pos) => {
|
|
4326
|
+
if (!view.editable) return false;
|
|
4327
|
+
const range = (0, import_core4.getMarkRange)(view.state.doc.resolve(pos), this.type);
|
|
4328
|
+
if (!range) return false;
|
|
4329
|
+
const selection = import_state3.TextSelection.create(view.state.doc, range.from, range.to);
|
|
4330
|
+
view.dispatch(view.state.tr.setSelection(selection));
|
|
4331
|
+
return true;
|
|
4332
|
+
}
|
|
4333
|
+
}
|
|
4334
|
+
})
|
|
4335
|
+
];
|
|
4313
4336
|
}
|
|
4314
4337
|
}).configure({
|
|
4315
4338
|
openOnClick: false,
|
|
@@ -4356,7 +4379,7 @@ var BaseMythReality = import_core5.Node.create({
|
|
|
4356
4379
|
|
|
4357
4380
|
// src/extensions/base/prompt.ts
|
|
4358
4381
|
var import_core6 = require("@tiptap/core");
|
|
4359
|
-
var
|
|
4382
|
+
var import_state4 = require("@tiptap/pm/state");
|
|
4360
4383
|
var BasePrompt = import_core6.Node.create({
|
|
4361
4384
|
name: "prompt",
|
|
4362
4385
|
group: "block",
|
|
@@ -4388,7 +4411,7 @@ var BasePrompt = import_core6.Node.create({
|
|
|
4388
4411
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
4389
4412
|
if (!paragraphNode) return false;
|
|
4390
4413
|
tr2.insert(posAfter, paragraphNode);
|
|
4391
|
-
tr2.setSelection(
|
|
4414
|
+
tr2.setSelection(import_state4.TextSelection.create(tr2.doc, posAfter + 1));
|
|
4392
4415
|
view.dispatch(tr2);
|
|
4393
4416
|
return true;
|
|
4394
4417
|
}
|
|
@@ -4630,7 +4653,7 @@ var BaseFigure = import_extension_image.default.extend({
|
|
|
4630
4653
|
|
|
4631
4654
|
// src/extensions/base/compatibility.ts
|
|
4632
4655
|
var import_core9 = require("@tiptap/core");
|
|
4633
|
-
var
|
|
4656
|
+
var import_state5 = require("@tiptap/pm/state");
|
|
4634
4657
|
var import_extension_image2 = __toESM(require("@tiptap/extension-image"));
|
|
4635
4658
|
var BaseLegacyBookAlert = import_core9.Node.create({
|
|
4636
4659
|
name: "calloutAlert",
|
|
@@ -4774,7 +4797,7 @@ var BaseLegacySEQuote = import_core9.Node.create({
|
|
|
4774
4797
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
4775
4798
|
if (!paragraphNode) return false;
|
|
4776
4799
|
tr2.insert(posAfter, paragraphNode);
|
|
4777
|
-
tr2.setSelection(
|
|
4800
|
+
tr2.setSelection(import_state5.TextSelection.create(tr2.doc, posAfter + 1));
|
|
4778
4801
|
view.dispatch(tr2);
|
|
4779
4802
|
return true;
|
|
4780
4803
|
}
|
|
@@ -4822,7 +4845,7 @@ var BaseLegacyPromptSE = import_core9.Node.create({
|
|
|
4822
4845
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
4823
4846
|
if (!paragraphNode) return false;
|
|
4824
4847
|
tr2.insert(posAfter, paragraphNode);
|
|
4825
|
-
tr2.setSelection(
|
|
4848
|
+
tr2.setSelection(import_state5.TextSelection.create(tr2.doc, posAfter + 1));
|
|
4826
4849
|
view.dispatch(tr2);
|
|
4827
4850
|
return true;
|
|
4828
4851
|
}
|
|
@@ -6129,21 +6152,8 @@ var BackgroundColor = import_core12.Extension.create({
|
|
|
6129
6152
|
default: null,
|
|
6130
6153
|
parseHTML: (element) => {
|
|
6131
6154
|
var _a;
|
|
6132
|
-
const
|
|
6133
|
-
|
|
6134
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
6135
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
6136
|
-
const parts = decls[i].split(":");
|
|
6137
|
-
if (parts.length >= 2) {
|
|
6138
|
-
const prop = parts[0].trim().toLowerCase();
|
|
6139
|
-
const val = parts.slice(1).join(":").trim();
|
|
6140
|
-
if (prop === "background-color") {
|
|
6141
|
-
return val.replace(/['"]+/g, "");
|
|
6142
|
-
}
|
|
6143
|
-
}
|
|
6144
|
-
}
|
|
6145
|
-
}
|
|
6146
|
-
return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
6155
|
+
const value = (_a = (0, import_core12.getStyleProperty)(element, "background-color")) != null ? _a : element.style.backgroundColor;
|
|
6156
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
6147
6157
|
},
|
|
6148
6158
|
renderHTML: (attributes) => {
|
|
6149
6159
|
if (!attributes.backgroundColor) {
|
|
@@ -6185,21 +6195,8 @@ var Color = import_core13.Extension.create({
|
|
|
6185
6195
|
default: null,
|
|
6186
6196
|
parseHTML: (element) => {
|
|
6187
6197
|
var _a;
|
|
6188
|
-
const
|
|
6189
|
-
|
|
6190
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
6191
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
6192
|
-
const parts = decls[i].split(":");
|
|
6193
|
-
if (parts.length >= 2) {
|
|
6194
|
-
const prop = parts[0].trim().toLowerCase();
|
|
6195
|
-
const val = parts.slice(1).join(":").trim();
|
|
6196
|
-
if (prop === "color") {
|
|
6197
|
-
return val.replace(/['"]+/g, "");
|
|
6198
|
-
}
|
|
6199
|
-
}
|
|
6200
|
-
}
|
|
6201
|
-
}
|
|
6202
|
-
return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
6198
|
+
const value = (_a = (0, import_core13.getStyleProperty)(element, "color")) != null ? _a : element.style.color;
|
|
6199
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
6203
6200
|
},
|
|
6204
6201
|
renderHTML: (attributes) => {
|
|
6205
6202
|
if (!attributes.color) {
|
|
@@ -6239,7 +6236,14 @@ var FontFamily = import_core14.Extension.create({
|
|
|
6239
6236
|
attributes: {
|
|
6240
6237
|
fontFamily: {
|
|
6241
6238
|
default: null,
|
|
6242
|
-
|
|
6239
|
+
// Prefer the raw inline `style` attribute so unquoted or
|
|
6240
|
+
// single-quoted multi-word names are preserved instead of being
|
|
6241
|
+
// canonicalized by `element.style.fontFamily`, which forces double
|
|
6242
|
+
// quotes that then get HTML-encoded to `"` on serialization.
|
|
6243
|
+
parseHTML: (element) => {
|
|
6244
|
+
var _a;
|
|
6245
|
+
return (_a = (0, import_core14.getStyleProperty)(element, "font-family")) != null ? _a : element.style.fontFamily;
|
|
6246
|
+
},
|
|
6243
6247
|
renderHTML: (attributes) => {
|
|
6244
6248
|
if (!attributes.fontFamily) {
|
|
6245
6249
|
return {};
|
|
@@ -6278,7 +6282,13 @@ var FontSize = import_core15.Extension.create({
|
|
|
6278
6282
|
attributes: {
|
|
6279
6283
|
fontSize: {
|
|
6280
6284
|
default: null,
|
|
6281
|
-
|
|
6285
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
6286
|
+
// is preserved instead of the canonicalized value returned by
|
|
6287
|
+
// `element.style.fontSize`.
|
|
6288
|
+
parseHTML: (element) => {
|
|
6289
|
+
var _a;
|
|
6290
|
+
return (_a = (0, import_core15.getStyleProperty)(element, "font-size")) != null ? _a : element.style.fontSize;
|
|
6291
|
+
},
|
|
6282
6292
|
renderHTML: (attributes) => {
|
|
6283
6293
|
if (!attributes.fontSize) {
|
|
6284
6294
|
return {};
|
|
@@ -6317,7 +6327,13 @@ var LineHeight = import_core16.Extension.create({
|
|
|
6317
6327
|
attributes: {
|
|
6318
6328
|
lineHeight: {
|
|
6319
6329
|
default: null,
|
|
6320
|
-
|
|
6330
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
6331
|
+
// is preserved instead of the canonicalized value returned by
|
|
6332
|
+
// `element.style.lineHeight`.
|
|
6333
|
+
parseHTML: (element) => {
|
|
6334
|
+
var _a;
|
|
6335
|
+
return (_a = (0, import_core16.getStyleProperty)(element, "line-height")) != null ? _a : element.style.lineHeight;
|
|
6336
|
+
},
|
|
6321
6337
|
renderHTML: (attributes) => {
|
|
6322
6338
|
if (!attributes.lineHeight) {
|
|
6323
6339
|
return {};
|
|
@@ -6687,7 +6703,7 @@ function getEditorExtensions(options) {
|
|
|
6687
6703
|
}
|
|
6688
6704
|
|
|
6689
6705
|
// src/editor/handlers/dialog-handlers.ts
|
|
6690
|
-
var
|
|
6706
|
+
var import_state6 = require("@tiptap/pm/state");
|
|
6691
6707
|
var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
|
|
6692
6708
|
return (attrs) => {
|
|
6693
6709
|
if (!editor) return;
|
|
@@ -6698,10 +6714,10 @@ var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6698
6714
|
const imageNode = state2.schema.nodes.image.create({ ...attrs });
|
|
6699
6715
|
if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
|
|
6700
6716
|
tr2.replaceWith($pos.before(), $pos.after(), imageNode);
|
|
6701
|
-
tr2.setSelection(
|
|
6717
|
+
tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve($pos.before())));
|
|
6702
6718
|
} else {
|
|
6703
6719
|
tr2.insert(insertPos, imageNode);
|
|
6704
|
-
tr2.setSelection(
|
|
6720
|
+
tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve(insertPos)));
|
|
6705
6721
|
}
|
|
6706
6722
|
return true;
|
|
6707
6723
|
}).run();
|
|
@@ -6725,40 +6741,29 @@ var createHandleVideoAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6725
6741
|
const videoNode = state2.schema.nodes.video.create({ src: url });
|
|
6726
6742
|
if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
|
|
6727
6743
|
tr2.replaceWith($pos.before(), $pos.after(), videoNode);
|
|
6728
|
-
tr2.setSelection(
|
|
6744
|
+
tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve($pos.before())));
|
|
6729
6745
|
} else {
|
|
6730
6746
|
tr2.insert(insertPos, videoNode);
|
|
6731
|
-
tr2.setSelection(
|
|
6747
|
+
tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve(insertPos)));
|
|
6732
6748
|
}
|
|
6733
6749
|
return true;
|
|
6734
6750
|
}).run();
|
|
6735
6751
|
closeDialogCommand();
|
|
6736
6752
|
};
|
|
6737
6753
|
};
|
|
6738
|
-
var createHandleLinkAdd = (editor, closeDialogCommand, linkParams,
|
|
6754
|
+
var createHandleLinkAdd = (editor, closeDialogCommand, linkParams, savedRange) => {
|
|
6739
6755
|
if (!editor) return;
|
|
6740
|
-
const
|
|
6741
|
-
const titleLength =
|
|
6742
|
-
|
|
6743
|
-
|
|
6744
|
-
|
|
6745
|
-
|
|
6746
|
-
|
|
6747
|
-
|
|
6748
|
-
|
|
6749
|
-
|
|
6750
|
-
}
|
|
6751
|
-
const { state } = editor;
|
|
6752
|
-
const insertPos = savedPos ?? state.selection.from;
|
|
6753
|
-
const titleLength2 = linkParams.title?.length ?? 0;
|
|
6754
|
-
editor.chain().focus().command(({ tr: tr2 }) => {
|
|
6755
|
-
const linkMark = editor.schema.marks.link.create({ ...linkParams });
|
|
6756
|
-
const textNode = editor.schema.text(linkParams.title ?? "", [linkMark]);
|
|
6757
|
-
tr2.insert(insertPos, textNode);
|
|
6758
|
-
tr2.setSelection(import_state5.TextSelection.create(tr2.doc, insertPos, insertPos + titleLength2));
|
|
6759
|
-
return true;
|
|
6760
|
-
}).run();
|
|
6761
|
-
}
|
|
6756
|
+
const title = linkParams.title ?? "";
|
|
6757
|
+
const titleLength = title.length;
|
|
6758
|
+
const from = savedRange?.from ?? editor.state.selection.from;
|
|
6759
|
+
const to = savedRange?.to ?? editor.state.selection.to;
|
|
6760
|
+
editor.chain().focus().command(({ tr: tr2 }) => {
|
|
6761
|
+
tr2.insertText(title, from, to);
|
|
6762
|
+
tr2.removeMark(from, from + titleLength);
|
|
6763
|
+
tr2.addMark(from, from + titleLength, editor.schema.marks.link.create({ ...linkParams }));
|
|
6764
|
+
tr2.setSelection(import_state6.TextSelection.create(tr2.doc, from, from + titleLength));
|
|
6765
|
+
return true;
|
|
6766
|
+
}).run();
|
|
6762
6767
|
closeDialogCommand();
|
|
6763
6768
|
};
|
|
6764
6769
|
var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
|
|
@@ -6772,7 +6777,7 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6772
6777
|
editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
|
|
6773
6778
|
const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
|
|
6774
6779
|
tr2.insert(insertPos, inlineMathNode);
|
|
6775
|
-
tr2.setSelection(
|
|
6780
|
+
tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve(insertPos)));
|
|
6776
6781
|
return true;
|
|
6777
6782
|
}).run();
|
|
6778
6783
|
}
|
|
@@ -6809,6 +6814,31 @@ function collectFragmentChildren(fragment, stack) {
|
|
|
6809
6814
|
}
|
|
6810
6815
|
}
|
|
6811
6816
|
|
|
6817
|
+
// src/editor/handlers/markup-insertion.ts
|
|
6818
|
+
function collectRehostableImages(slice) {
|
|
6819
|
+
const imagesToNodes = [];
|
|
6820
|
+
prosemirrorIterator(slice, (node) => {
|
|
6821
|
+
if (node.type.name === "image" && !node.attrs.fileId) {
|
|
6822
|
+
try {
|
|
6823
|
+
const url = new URL(node.attrs.src).toString();
|
|
6824
|
+
imagesToNodes.push([url, node]);
|
|
6825
|
+
} catch {
|
|
6826
|
+
}
|
|
6827
|
+
}
|
|
6828
|
+
});
|
|
6829
|
+
return imagesToNodes;
|
|
6830
|
+
}
|
|
6831
|
+
function applyUploadResultsToNodes(imagesToNodes, results) {
|
|
6832
|
+
results.forEach((result, index) => {
|
|
6833
|
+
if (!result) return;
|
|
6834
|
+
const node = imagesToNodes[index]?.[1];
|
|
6835
|
+
if (!node) return;
|
|
6836
|
+
node.attrs.src = result.fileUrl ?? null;
|
|
6837
|
+
node.attrs.fileId = result.fileId;
|
|
6838
|
+
node.attrs.storageKey = result.storageKey;
|
|
6839
|
+
});
|
|
6840
|
+
}
|
|
6841
|
+
|
|
6812
6842
|
// src/editor/handlers/insertion-handlers.ts
|
|
6813
6843
|
function useInsertionHandlers() {
|
|
6814
6844
|
const [insertedImage, setInsertedImage] = (0, import_react35.useState)(null);
|
|
@@ -6847,24 +6877,10 @@ function useInsertionHandlers() {
|
|
|
6847
6877
|
hasMarkupInsertion = true;
|
|
6848
6878
|
}
|
|
6849
6879
|
if (hasMarkupInsertion) {
|
|
6850
|
-
const imagesToNodes =
|
|
6880
|
+
const imagesToNodes = collectRehostableImages(slice);
|
|
6851
6881
|
setDisabled(true);
|
|
6852
|
-
prosemirrorIterator(slice, (node) => {
|
|
6853
|
-
if (node.type.name === "image" && !node.attrs.fileId) {
|
|
6854
|
-
try {
|
|
6855
|
-
const url = new URL(node.attrs.src).toString();
|
|
6856
|
-
imagesToNodes.push([url, node]);
|
|
6857
|
-
} catch {
|
|
6858
|
-
}
|
|
6859
|
-
}
|
|
6860
|
-
});
|
|
6861
6882
|
uploadMultipleByURL(imagesToNodes.map(([url]) => url)).then((results) => {
|
|
6862
|
-
|
|
6863
|
-
const node = imagesToNodes[index][1];
|
|
6864
|
-
node.attrs.src = null;
|
|
6865
|
-
node.attrs.fileId = result?.fileId;
|
|
6866
|
-
node.attrs.storageKey = result?.storageKey;
|
|
6867
|
-
});
|
|
6883
|
+
applyUploadResultsToNodes(imagesToNodes, results);
|
|
6868
6884
|
view.dispatch(view.state.tr.replaceSelection(slice));
|
|
6869
6885
|
}).finally(() => {
|
|
6870
6886
|
setDisabled(false);
|
|
@@ -7645,6 +7661,9 @@ function TiptapContent({
|
|
|
7645
7661
|
);
|
|
7646
7662
|
const [editFigureContext, setEditFigureContext] = (0, import_react37.useState)(null);
|
|
7647
7663
|
const [savedDialogCursorPos, setSavedDialogCursorPos] = (0, import_react37.useState)(void 0);
|
|
7664
|
+
const [savedDialogRange, setSavedDialogRange] = (0, import_react37.useState)(
|
|
7665
|
+
void 0
|
|
7666
|
+
);
|
|
7648
7667
|
const { activeDialog, closeDialogCommand, openDialogCommand } = useDialogCommand();
|
|
7649
7668
|
const translations2 = useTiptapTranslations();
|
|
7650
7669
|
const [isDisabledInternal, setIsDisabledInternal] = (0, import_react37.useState)(isDisabled);
|
|
@@ -7729,8 +7748,9 @@ function TiptapContent({
|
|
|
7729
7748
|
);
|
|
7730
7749
|
(0, import_react37.useEffect)(() => {
|
|
7731
7750
|
if (activeDialog && editor && !editor.isDestroyed) {
|
|
7732
|
-
const
|
|
7733
|
-
setSavedDialogCursorPos(
|
|
7751
|
+
const { from, to } = editor.state.selection;
|
|
7752
|
+
setSavedDialogCursorPos(from);
|
|
7753
|
+
setSavedDialogRange({ from, to });
|
|
7734
7754
|
}
|
|
7735
7755
|
}, [activeDialog, editor]);
|
|
7736
7756
|
const handleCloseDialog = () => {
|
|
@@ -7738,6 +7758,7 @@ function TiptapContent({
|
|
|
7738
7758
|
setKatexDialogContext(null);
|
|
7739
7759
|
setEditFigureContext(null);
|
|
7740
7760
|
setSavedDialogCursorPos(void 0);
|
|
7761
|
+
setSavedDialogRange(void 0);
|
|
7741
7762
|
closeDialogCommand();
|
|
7742
7763
|
};
|
|
7743
7764
|
const handleImageAdd = (attrs) => {
|
|
@@ -7748,7 +7769,7 @@ function TiptapContent({
|
|
|
7748
7769
|
createHandleVideoAdd(editor, handleCloseDialog, savedDialogCursorPos)(url);
|
|
7749
7770
|
};
|
|
7750
7771
|
const handleLinkAdd = (params) => {
|
|
7751
|
-
createHandleLinkAdd(editor, handleCloseDialog, params,
|
|
7772
|
+
createHandleLinkAdd(editor, handleCloseDialog, params, savedDialogRange);
|
|
7752
7773
|
};
|
|
7753
7774
|
const handleKatexAdd = (latex) => {
|
|
7754
7775
|
const katexHandler = createHandleKatexAdd(editor, handleCloseDialog, savedDialogCursorPos);
|
|
@@ -7761,7 +7782,7 @@ function TiptapContent({
|
|
|
7761
7782
|
});
|
|
7762
7783
|
}, [content, editor]);
|
|
7763
7784
|
const shouldBubbleMenuShow = ({ state }) => {
|
|
7764
|
-
if (state.selection instanceof
|
|
7785
|
+
if (state.selection instanceof import_state7.NodeSelection) {
|
|
7765
7786
|
return false;
|
|
7766
7787
|
}
|
|
7767
7788
|
if (state.selection.empty) {
|