@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.mjs
CHANGED
|
@@ -749,10 +749,16 @@ var BubbleMenuContent = ({ editor, onLinkClick }) => {
|
|
|
749
749
|
} = useEditorState({
|
|
750
750
|
editor,
|
|
751
751
|
selector: (ctx) => {
|
|
752
|
+
let canAvalable = false;
|
|
753
|
+
try {
|
|
754
|
+
ctx.editor.can().undo();
|
|
755
|
+
canAvalable = true;
|
|
756
|
+
} catch {
|
|
757
|
+
}
|
|
752
758
|
return {
|
|
753
|
-
canUndo: ctx.editor.can().undo(),
|
|
754
|
-
canRedo: ctx.editor.can().redo(),
|
|
755
|
-
canClearMarks: ctx.editor.can().unsetAllMarks(),
|
|
759
|
+
canUndo: canAvalable ? ctx.editor.can().undo() : false,
|
|
760
|
+
canRedo: canAvalable ? ctx.editor.can().redo() : false,
|
|
761
|
+
canClearMarks: canAvalable ? ctx.editor.can().unsetAllMarks() : false,
|
|
756
762
|
isHeading2: ctx.editor.isActive("heading", { level: 2 }),
|
|
757
763
|
isHeading3: ctx.editor.isActive("heading", { level: 3 }),
|
|
758
764
|
isHeading4: ctx.editor.isActive("heading", { level: 4 }),
|
|
@@ -1446,10 +1452,12 @@ var CharacterCount = ({ editor }) => {
|
|
|
1446
1452
|
const translations2 = useTiptapTranslations();
|
|
1447
1453
|
const { charactersCount, wordsCount } = useEditorState2({
|
|
1448
1454
|
editor,
|
|
1449
|
-
selector: (context) =>
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1455
|
+
selector: (context) => {
|
|
1456
|
+
return {
|
|
1457
|
+
charactersCount: context.editor.storage.characterCount?.characters() || 0,
|
|
1458
|
+
wordsCount: context.editor.storage.characterCount?.words() || 0
|
|
1459
|
+
};
|
|
1460
|
+
}
|
|
1453
1461
|
});
|
|
1454
1462
|
return /* @__PURE__ */ jsxs14("div", { className: "tiptap__character-count", children: [
|
|
1455
1463
|
/* @__PURE__ */ jsxs14("span", { className: "tiptap__character-count-item", children: [
|
|
@@ -2013,7 +2021,6 @@ var ImageDialog = ({
|
|
|
2013
2021
|
setIsUploading(true);
|
|
2014
2022
|
try {
|
|
2015
2023
|
const result = await uploadHandler(formState.file);
|
|
2016
|
-
console.log("\u{1F440} ~ handleAddImage ~ result:", result);
|
|
2017
2024
|
onImageAdd({
|
|
2018
2025
|
fileId: result.fileId,
|
|
2019
2026
|
src: result.fileUrl,
|
|
@@ -3092,10 +3099,11 @@ var BaseCustomQuoteSign = Node2.create({
|
|
|
3092
3099
|
|
|
3093
3100
|
// src/extensions/base/link.ts
|
|
3094
3101
|
import Link, { isAllowedUri } from "@tiptap/extension-link";
|
|
3095
|
-
import { markPasteRule } from "@tiptap/core";
|
|
3102
|
+
import { getMarkRange, markPasteRule } from "@tiptap/core";
|
|
3103
|
+
import { Plugin, TextSelection as TextSelection3 } from "@tiptap/pm/state";
|
|
3096
3104
|
|
|
3097
3105
|
// node_modules/linkifyjs/dist/linkify.mjs
|
|
3098
|
-
var encodedTlds = "
|
|
3106
|
+
var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
|
|
3099
3107
|
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";
|
|
3100
3108
|
var numeric = "numeric";
|
|
3101
3109
|
var ascii = "ascii";
|
|
@@ -4026,8 +4034,6 @@ function init$1({
|
|
|
4026
4034
|
ta(Email$1, groups.domain, EmailDomain);
|
|
4027
4035
|
tt(Email$1, DOT, EmailDomainDot);
|
|
4028
4036
|
tt(Email$1, HYPHEN, EmailDomainHyphen);
|
|
4029
|
-
const EmailColon = tt(Email$1, COLON);
|
|
4030
|
-
ta(EmailColon, groups.numeric, Email);
|
|
4031
4037
|
const DomainHyphen = tt(Domain, HYPHEN);
|
|
4032
4038
|
const DomainDot = tt(Domain, DOT);
|
|
4033
4039
|
tt(DomainHyphen, HYPHEN, DomainHyphen);
|
|
@@ -4091,11 +4097,11 @@ function init$1({
|
|
|
4091
4097
|
const [OPEN, CLOSE] = bracketPairs[i];
|
|
4092
4098
|
const UrlOpen = tt(Url$1, OPEN);
|
|
4093
4099
|
tt(UrlNonaccept, OPEN, UrlOpen);
|
|
4094
|
-
tt(UrlOpen, CLOSE, Url$1);
|
|
4095
4100
|
const UrlOpenQ = makeState(Url);
|
|
4096
4101
|
ta(UrlOpen, qsAccepting, UrlOpenQ);
|
|
4097
4102
|
const UrlOpenSyms = makeState();
|
|
4098
|
-
ta(UrlOpen, qsNonAccepting);
|
|
4103
|
+
ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
|
|
4104
|
+
tt(UrlOpen, CLOSE, Url$1);
|
|
4099
4105
|
ta(UrlOpenQ, qsAccepting, UrlOpenQ);
|
|
4100
4106
|
ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
|
|
4101
4107
|
ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
|
|
@@ -4273,6 +4279,23 @@ var LinkExtension = Link.extend({
|
|
|
4273
4279
|
}
|
|
4274
4280
|
})
|
|
4275
4281
|
];
|
|
4282
|
+
},
|
|
4283
|
+
addProseMirrorPlugins() {
|
|
4284
|
+
return [
|
|
4285
|
+
...this.parent?.() ?? [],
|
|
4286
|
+
new Plugin({
|
|
4287
|
+
props: {
|
|
4288
|
+
handleClick: (view, pos) => {
|
|
4289
|
+
if (!view.editable) return false;
|
|
4290
|
+
const range = getMarkRange(view.state.doc.resolve(pos), this.type);
|
|
4291
|
+
if (!range) return false;
|
|
4292
|
+
const selection = TextSelection3.create(view.state.doc, range.from, range.to);
|
|
4293
|
+
view.dispatch(view.state.tr.setSelection(selection));
|
|
4294
|
+
return true;
|
|
4295
|
+
}
|
|
4296
|
+
}
|
|
4297
|
+
})
|
|
4298
|
+
];
|
|
4276
4299
|
}
|
|
4277
4300
|
}).configure({
|
|
4278
4301
|
openOnClick: false,
|
|
@@ -4319,7 +4342,7 @@ var BaseMythReality = Node3.create({
|
|
|
4319
4342
|
|
|
4320
4343
|
// src/extensions/base/prompt.ts
|
|
4321
4344
|
import { Node as Node4, mergeAttributes as mergeAttributes5 } from "@tiptap/core";
|
|
4322
|
-
import { TextSelection as
|
|
4345
|
+
import { TextSelection as TextSelection4 } from "@tiptap/pm/state";
|
|
4323
4346
|
var BasePrompt = Node4.create({
|
|
4324
4347
|
name: "prompt",
|
|
4325
4348
|
group: "block",
|
|
@@ -4351,7 +4374,7 @@ var BasePrompt = Node4.create({
|
|
|
4351
4374
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
4352
4375
|
if (!paragraphNode) return false;
|
|
4353
4376
|
tr2.insert(posAfter, paragraphNode);
|
|
4354
|
-
tr2.setSelection(
|
|
4377
|
+
tr2.setSelection(TextSelection4.create(tr2.doc, posAfter + 1));
|
|
4355
4378
|
view.dispatch(tr2);
|
|
4356
4379
|
return true;
|
|
4357
4380
|
}
|
|
@@ -4593,7 +4616,7 @@ var BaseFigure = Image2.extend({
|
|
|
4593
4616
|
|
|
4594
4617
|
// src/extensions/base/compatibility.ts
|
|
4595
4618
|
import { mergeAttributes as mergeAttributes7, Node as Node6 } from "@tiptap/core";
|
|
4596
|
-
import { TextSelection as
|
|
4619
|
+
import { TextSelection as TextSelection5 } from "@tiptap/pm/state";
|
|
4597
4620
|
import Image3 from "@tiptap/extension-image";
|
|
4598
4621
|
var BaseLegacyBookAlert = Node6.create({
|
|
4599
4622
|
name: "calloutAlert",
|
|
@@ -4737,7 +4760,7 @@ var BaseLegacySEQuote = Node6.create({
|
|
|
4737
4760
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
4738
4761
|
if (!paragraphNode) return false;
|
|
4739
4762
|
tr2.insert(posAfter, paragraphNode);
|
|
4740
|
-
tr2.setSelection(
|
|
4763
|
+
tr2.setSelection(TextSelection5.create(tr2.doc, posAfter + 1));
|
|
4741
4764
|
view.dispatch(tr2);
|
|
4742
4765
|
return true;
|
|
4743
4766
|
}
|
|
@@ -4785,7 +4808,7 @@ var BaseLegacyPromptSE = Node6.create({
|
|
|
4785
4808
|
const paragraphNode = schema.nodes.paragraph.createAndFill();
|
|
4786
4809
|
if (!paragraphNode) return false;
|
|
4787
4810
|
tr2.insert(posAfter, paragraphNode);
|
|
4788
|
-
tr2.setSelection(
|
|
4811
|
+
tr2.setSelection(TextSelection5.create(tr2.doc, posAfter + 1));
|
|
4789
4812
|
view.dispatch(tr2);
|
|
4790
4813
|
return true;
|
|
4791
4814
|
}
|
|
@@ -5990,11 +6013,11 @@ import TextAlign from "@tiptap/extension-text-align";
|
|
|
5990
6013
|
|
|
5991
6014
|
// node_modules/@tiptap/extension-text-style/dist/index.js
|
|
5992
6015
|
import { Mark as Mark2, mergeAttributes as mergeAttributes8 } from "@tiptap/core";
|
|
5993
|
-
import { Extension as Extension2 } from "@tiptap/core";
|
|
5994
|
-
import { Extension as Extension22 } from "@tiptap/core";
|
|
5995
|
-
import { Extension as Extension3 } from "@tiptap/core";
|
|
5996
|
-
import { Extension as Extension4 } from "@tiptap/core";
|
|
5997
|
-
import { Extension as Extension5 } from "@tiptap/core";
|
|
6016
|
+
import { Extension as Extension2, getStyleProperty } from "@tiptap/core";
|
|
6017
|
+
import { Extension as Extension22, getStyleProperty as getStyleProperty2 } from "@tiptap/core";
|
|
6018
|
+
import { Extension as Extension3, getStyleProperty as getStyleProperty3 } from "@tiptap/core";
|
|
6019
|
+
import { Extension as Extension4, getStyleProperty as getStyleProperty4 } from "@tiptap/core";
|
|
6020
|
+
import { Extension as Extension5, getStyleProperty as getStyleProperty5 } from "@tiptap/core";
|
|
5998
6021
|
import { Extension as Extension6 } from "@tiptap/core";
|
|
5999
6022
|
var MAX_FIND_CHILD_SPAN_DEPTH = 20;
|
|
6000
6023
|
var findChildSpans = (element, depth = 0) => {
|
|
@@ -6092,21 +6115,8 @@ var BackgroundColor = Extension2.create({
|
|
|
6092
6115
|
default: null,
|
|
6093
6116
|
parseHTML: (element) => {
|
|
6094
6117
|
var _a;
|
|
6095
|
-
const
|
|
6096
|
-
|
|
6097
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
6098
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
6099
|
-
const parts = decls[i].split(":");
|
|
6100
|
-
if (parts.length >= 2) {
|
|
6101
|
-
const prop = parts[0].trim().toLowerCase();
|
|
6102
|
-
const val = parts.slice(1).join(":").trim();
|
|
6103
|
-
if (prop === "background-color") {
|
|
6104
|
-
return val.replace(/['"]+/g, "");
|
|
6105
|
-
}
|
|
6106
|
-
}
|
|
6107
|
-
}
|
|
6108
|
-
}
|
|
6109
|
-
return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
6118
|
+
const value = (_a = getStyleProperty(element, "background-color")) != null ? _a : element.style.backgroundColor;
|
|
6119
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
6110
6120
|
},
|
|
6111
6121
|
renderHTML: (attributes) => {
|
|
6112
6122
|
if (!attributes.backgroundColor) {
|
|
@@ -6148,21 +6158,8 @@ var Color = Extension22.create({
|
|
|
6148
6158
|
default: null,
|
|
6149
6159
|
parseHTML: (element) => {
|
|
6150
6160
|
var _a;
|
|
6151
|
-
const
|
|
6152
|
-
|
|
6153
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
6154
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
6155
|
-
const parts = decls[i].split(":");
|
|
6156
|
-
if (parts.length >= 2) {
|
|
6157
|
-
const prop = parts[0].trim().toLowerCase();
|
|
6158
|
-
const val = parts.slice(1).join(":").trim();
|
|
6159
|
-
if (prop === "color") {
|
|
6160
|
-
return val.replace(/['"]+/g, "");
|
|
6161
|
-
}
|
|
6162
|
-
}
|
|
6163
|
-
}
|
|
6164
|
-
}
|
|
6165
|
-
return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
6161
|
+
const value = (_a = getStyleProperty2(element, "color")) != null ? _a : element.style.color;
|
|
6162
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
6166
6163
|
},
|
|
6167
6164
|
renderHTML: (attributes) => {
|
|
6168
6165
|
if (!attributes.color) {
|
|
@@ -6202,7 +6199,14 @@ var FontFamily = Extension3.create({
|
|
|
6202
6199
|
attributes: {
|
|
6203
6200
|
fontFamily: {
|
|
6204
6201
|
default: null,
|
|
6205
|
-
|
|
6202
|
+
// Prefer the raw inline `style` attribute so unquoted or
|
|
6203
|
+
// single-quoted multi-word names are preserved instead of being
|
|
6204
|
+
// canonicalized by `element.style.fontFamily`, which forces double
|
|
6205
|
+
// quotes that then get HTML-encoded to `"` on serialization.
|
|
6206
|
+
parseHTML: (element) => {
|
|
6207
|
+
var _a;
|
|
6208
|
+
return (_a = getStyleProperty3(element, "font-family")) != null ? _a : element.style.fontFamily;
|
|
6209
|
+
},
|
|
6206
6210
|
renderHTML: (attributes) => {
|
|
6207
6211
|
if (!attributes.fontFamily) {
|
|
6208
6212
|
return {};
|
|
@@ -6241,7 +6245,13 @@ var FontSize = Extension4.create({
|
|
|
6241
6245
|
attributes: {
|
|
6242
6246
|
fontSize: {
|
|
6243
6247
|
default: null,
|
|
6244
|
-
|
|
6248
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
6249
|
+
// is preserved instead of the canonicalized value returned by
|
|
6250
|
+
// `element.style.fontSize`.
|
|
6251
|
+
parseHTML: (element) => {
|
|
6252
|
+
var _a;
|
|
6253
|
+
return (_a = getStyleProperty4(element, "font-size")) != null ? _a : element.style.fontSize;
|
|
6254
|
+
},
|
|
6245
6255
|
renderHTML: (attributes) => {
|
|
6246
6256
|
if (!attributes.fontSize) {
|
|
6247
6257
|
return {};
|
|
@@ -6280,7 +6290,13 @@ var LineHeight = Extension5.create({
|
|
|
6280
6290
|
attributes: {
|
|
6281
6291
|
lineHeight: {
|
|
6282
6292
|
default: null,
|
|
6283
|
-
|
|
6293
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
6294
|
+
// is preserved instead of the canonicalized value returned by
|
|
6295
|
+
// `element.style.lineHeight`.
|
|
6296
|
+
parseHTML: (element) => {
|
|
6297
|
+
var _a;
|
|
6298
|
+
return (_a = getStyleProperty5(element, "line-height")) != null ? _a : element.style.lineHeight;
|
|
6299
|
+
},
|
|
6284
6300
|
renderHTML: (attributes) => {
|
|
6285
6301
|
if (!attributes.lineHeight) {
|
|
6286
6302
|
return {};
|
|
@@ -6650,7 +6666,7 @@ function getEditorExtensions(options) {
|
|
|
6650
6666
|
}
|
|
6651
6667
|
|
|
6652
6668
|
// src/editor/handlers/dialog-handlers.ts
|
|
6653
|
-
import { TextSelection as
|
|
6669
|
+
import { TextSelection as TextSelection6 } from "@tiptap/pm/state";
|
|
6654
6670
|
var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
|
|
6655
6671
|
return (attrs) => {
|
|
6656
6672
|
if (!editor) return;
|
|
@@ -6661,10 +6677,10 @@ var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6661
6677
|
const imageNode = state2.schema.nodes.image.create({ ...attrs });
|
|
6662
6678
|
if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
|
|
6663
6679
|
tr2.replaceWith($pos.before(), $pos.after(), imageNode);
|
|
6664
|
-
tr2.setSelection(
|
|
6680
|
+
tr2.setSelection(TextSelection6.near(tr2.doc.resolve($pos.before())));
|
|
6665
6681
|
} else {
|
|
6666
6682
|
tr2.insert(insertPos, imageNode);
|
|
6667
|
-
tr2.setSelection(
|
|
6683
|
+
tr2.setSelection(TextSelection6.near(tr2.doc.resolve(insertPos)));
|
|
6668
6684
|
}
|
|
6669
6685
|
return true;
|
|
6670
6686
|
}).run();
|
|
@@ -6688,40 +6704,29 @@ var createHandleVideoAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6688
6704
|
const videoNode = state2.schema.nodes.video.create({ src: url });
|
|
6689
6705
|
if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
|
|
6690
6706
|
tr2.replaceWith($pos.before(), $pos.after(), videoNode);
|
|
6691
|
-
tr2.setSelection(
|
|
6707
|
+
tr2.setSelection(TextSelection6.near(tr2.doc.resolve($pos.before())));
|
|
6692
6708
|
} else {
|
|
6693
6709
|
tr2.insert(insertPos, videoNode);
|
|
6694
|
-
tr2.setSelection(
|
|
6710
|
+
tr2.setSelection(TextSelection6.near(tr2.doc.resolve(insertPos)));
|
|
6695
6711
|
}
|
|
6696
6712
|
return true;
|
|
6697
6713
|
}).run();
|
|
6698
6714
|
closeDialogCommand();
|
|
6699
6715
|
};
|
|
6700
6716
|
};
|
|
6701
|
-
var createHandleLinkAdd = (editor, closeDialogCommand, linkParams,
|
|
6717
|
+
var createHandleLinkAdd = (editor, closeDialogCommand, linkParams, savedRange) => {
|
|
6702
6718
|
if (!editor) return;
|
|
6703
|
-
const
|
|
6704
|
-
const titleLength =
|
|
6705
|
-
|
|
6706
|
-
|
|
6707
|
-
|
|
6708
|
-
|
|
6709
|
-
|
|
6710
|
-
|
|
6711
|
-
|
|
6712
|
-
|
|
6713
|
-
}
|
|
6714
|
-
const { state } = editor;
|
|
6715
|
-
const insertPos = savedPos ?? state.selection.from;
|
|
6716
|
-
const titleLength2 = linkParams.title?.length ?? 0;
|
|
6717
|
-
editor.chain().focus().command(({ tr: tr2 }) => {
|
|
6718
|
-
const linkMark = editor.schema.marks.link.create({ ...linkParams });
|
|
6719
|
-
const textNode = editor.schema.text(linkParams.title ?? "", [linkMark]);
|
|
6720
|
-
tr2.insert(insertPos, textNode);
|
|
6721
|
-
tr2.setSelection(TextSelection5.create(tr2.doc, insertPos, insertPos + titleLength2));
|
|
6722
|
-
return true;
|
|
6723
|
-
}).run();
|
|
6724
|
-
}
|
|
6719
|
+
const title = linkParams.title ?? "";
|
|
6720
|
+
const titleLength = title.length;
|
|
6721
|
+
const from = savedRange?.from ?? editor.state.selection.from;
|
|
6722
|
+
const to = savedRange?.to ?? editor.state.selection.to;
|
|
6723
|
+
editor.chain().focus().command(({ tr: tr2 }) => {
|
|
6724
|
+
tr2.insertText(title, from, to);
|
|
6725
|
+
tr2.removeMark(from, from + titleLength);
|
|
6726
|
+
tr2.addMark(from, from + titleLength, editor.schema.marks.link.create({ ...linkParams }));
|
|
6727
|
+
tr2.setSelection(TextSelection6.create(tr2.doc, from, from + titleLength));
|
|
6728
|
+
return true;
|
|
6729
|
+
}).run();
|
|
6725
6730
|
closeDialogCommand();
|
|
6726
6731
|
};
|
|
6727
6732
|
var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
|
|
@@ -6735,7 +6740,7 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6735
6740
|
editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
|
|
6736
6741
|
const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
|
|
6737
6742
|
tr2.insert(insertPos, inlineMathNode);
|
|
6738
|
-
tr2.setSelection(
|
|
6743
|
+
tr2.setSelection(TextSelection6.near(tr2.doc.resolve(insertPos)));
|
|
6739
6744
|
return true;
|
|
6740
6745
|
}).run();
|
|
6741
6746
|
}
|
|
@@ -6772,6 +6777,31 @@ function collectFragmentChildren(fragment, stack) {
|
|
|
6772
6777
|
}
|
|
6773
6778
|
}
|
|
6774
6779
|
|
|
6780
|
+
// src/editor/handlers/markup-insertion.ts
|
|
6781
|
+
function collectRehostableImages(slice) {
|
|
6782
|
+
const imagesToNodes = [];
|
|
6783
|
+
prosemirrorIterator(slice, (node) => {
|
|
6784
|
+
if (node.type.name === "image" && !node.attrs.fileId) {
|
|
6785
|
+
try {
|
|
6786
|
+
const url = new URL(node.attrs.src).toString();
|
|
6787
|
+
imagesToNodes.push([url, node]);
|
|
6788
|
+
} catch {
|
|
6789
|
+
}
|
|
6790
|
+
}
|
|
6791
|
+
});
|
|
6792
|
+
return imagesToNodes;
|
|
6793
|
+
}
|
|
6794
|
+
function applyUploadResultsToNodes(imagesToNodes, results) {
|
|
6795
|
+
results.forEach((result, index) => {
|
|
6796
|
+
if (!result) return;
|
|
6797
|
+
const node = imagesToNodes[index]?.[1];
|
|
6798
|
+
if (!node) return;
|
|
6799
|
+
node.attrs.src = result.fileUrl ?? null;
|
|
6800
|
+
node.attrs.fileId = result.fileId;
|
|
6801
|
+
node.attrs.storageKey = result.storageKey;
|
|
6802
|
+
});
|
|
6803
|
+
}
|
|
6804
|
+
|
|
6775
6805
|
// src/editor/handlers/insertion-handlers.ts
|
|
6776
6806
|
function useInsertionHandlers() {
|
|
6777
6807
|
const [insertedImage, setInsertedImage] = useState12(null);
|
|
@@ -6810,24 +6840,10 @@ function useInsertionHandlers() {
|
|
|
6810
6840
|
hasMarkupInsertion = true;
|
|
6811
6841
|
}
|
|
6812
6842
|
if (hasMarkupInsertion) {
|
|
6813
|
-
const imagesToNodes =
|
|
6843
|
+
const imagesToNodes = collectRehostableImages(slice);
|
|
6814
6844
|
setDisabled(true);
|
|
6815
|
-
prosemirrorIterator(slice, (node) => {
|
|
6816
|
-
if (node.type.name === "image" && !node.attrs.fileId) {
|
|
6817
|
-
try {
|
|
6818
|
-
const url = new URL(node.attrs.src).toString();
|
|
6819
|
-
imagesToNodes.push([url, node]);
|
|
6820
|
-
} catch {
|
|
6821
|
-
}
|
|
6822
|
-
}
|
|
6823
|
-
});
|
|
6824
6845
|
uploadMultipleByURL(imagesToNodes.map(([url]) => url)).then((results) => {
|
|
6825
|
-
|
|
6826
|
-
const node = imagesToNodes[index][1];
|
|
6827
|
-
node.attrs.src = null;
|
|
6828
|
-
node.attrs.fileId = result?.fileId;
|
|
6829
|
-
node.attrs.storageKey = result?.storageKey;
|
|
6830
|
-
});
|
|
6846
|
+
applyUploadResultsToNodes(imagesToNodes, results);
|
|
6831
6847
|
view.dispatch(view.state.tr.replaceSelection(slice));
|
|
6832
6848
|
}).finally(() => {
|
|
6833
6849
|
setDisabled(false);
|
|
@@ -7608,6 +7624,9 @@ function TiptapContent({
|
|
|
7608
7624
|
);
|
|
7609
7625
|
const [editFigureContext, setEditFigureContext] = useState13(null);
|
|
7610
7626
|
const [savedDialogCursorPos, setSavedDialogCursorPos] = useState13(void 0);
|
|
7627
|
+
const [savedDialogRange, setSavedDialogRange] = useState13(
|
|
7628
|
+
void 0
|
|
7629
|
+
);
|
|
7611
7630
|
const { activeDialog, closeDialogCommand, openDialogCommand } = useDialogCommand();
|
|
7612
7631
|
const translations2 = useTiptapTranslations();
|
|
7613
7632
|
const [isDisabledInternal, setIsDisabledInternal] = useState13(isDisabled);
|
|
@@ -7692,8 +7711,9 @@ function TiptapContent({
|
|
|
7692
7711
|
);
|
|
7693
7712
|
useEffect11(() => {
|
|
7694
7713
|
if (activeDialog && editor && !editor.isDestroyed) {
|
|
7695
|
-
const
|
|
7696
|
-
setSavedDialogCursorPos(
|
|
7714
|
+
const { from, to } = editor.state.selection;
|
|
7715
|
+
setSavedDialogCursorPos(from);
|
|
7716
|
+
setSavedDialogRange({ from, to });
|
|
7697
7717
|
}
|
|
7698
7718
|
}, [activeDialog, editor]);
|
|
7699
7719
|
const handleCloseDialog = () => {
|
|
@@ -7701,6 +7721,7 @@ function TiptapContent({
|
|
|
7701
7721
|
setKatexDialogContext(null);
|
|
7702
7722
|
setEditFigureContext(null);
|
|
7703
7723
|
setSavedDialogCursorPos(void 0);
|
|
7724
|
+
setSavedDialogRange(void 0);
|
|
7704
7725
|
closeDialogCommand();
|
|
7705
7726
|
};
|
|
7706
7727
|
const handleImageAdd = (attrs) => {
|
|
@@ -7711,7 +7732,7 @@ function TiptapContent({
|
|
|
7711
7732
|
createHandleVideoAdd(editor, handleCloseDialog, savedDialogCursorPos)(url);
|
|
7712
7733
|
};
|
|
7713
7734
|
const handleLinkAdd = (params) => {
|
|
7714
|
-
createHandleLinkAdd(editor, handleCloseDialog, params,
|
|
7735
|
+
createHandleLinkAdd(editor, handleCloseDialog, params, savedDialogRange);
|
|
7715
7736
|
};
|
|
7716
7737
|
const handleKatexAdd = (latex) => {
|
|
7717
7738
|
const katexHandler = createHandleKatexAdd(editor, handleCloseDialog, savedDialogCursorPos);
|