@cyberyozh/text-editor 0.1.17 → 0.2.1
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.d.mts +9 -1
- package/dist/editor.d.ts +9 -1
- package/dist/editor.js +204 -66
- package/dist/editor.js.map +1 -1
- package/dist/editor.mjs +216 -78
- package/dist/editor.mjs.map +1 -1
- package/dist/render.js +29 -38
- package/dist/render.js.map +1 -1
- package/dist/render.mjs +34 -43
- package/dist/render.mjs.map +1 -1
- package/dist/styles/index.css +1 -0
- package/package.json +40 -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 +9 -1
- package/src/editor/editor.tsx +52 -9
- package/src/editor/handlers/index.ts +4 -0
- package/src/editor/handlers/insertion-handlers.ts +113 -0
- package/src/editor/index.ts +1 -1
- package/src/types/image-handler.ts +5 -0
- package/src/utils/prosemirror-iterator.ts +38 -0
package/dist/editor.js
CHANGED
|
@@ -36,10 +36,10 @@ __export(editor_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(editor_exports);
|
|
37
37
|
|
|
38
38
|
// src/editor/editor.tsx
|
|
39
|
-
var
|
|
39
|
+
var import_react37 = require("react");
|
|
40
40
|
var import_state6 = require("@tiptap/pm/state");
|
|
41
|
-
var
|
|
42
|
-
var
|
|
41
|
+
var import_model2 = require("@tiptap/pm/model");
|
|
42
|
+
var import_react38 = require("@tiptap/react");
|
|
43
43
|
var import_menus = require("@tiptap/react/menus");
|
|
44
44
|
var import_github_dark = require("highlight.js/styles/github-dark.css");
|
|
45
45
|
var import_katex_min = require("katex/dist/katex.min.css");
|
|
@@ -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: [
|
|
@@ -1917,6 +1925,7 @@ var import_jsx_runtime67 = require("react/jsx-runtime");
|
|
|
1917
1925
|
var ImageDialog = ({
|
|
1918
1926
|
open,
|
|
1919
1927
|
onClose,
|
|
1928
|
+
defaultFile,
|
|
1920
1929
|
onImageAdd,
|
|
1921
1930
|
onImageEdit,
|
|
1922
1931
|
uploadHandler,
|
|
@@ -2000,6 +2009,11 @@ var ImageDialog = ({
|
|
|
2000
2009
|
}));
|
|
2001
2010
|
};
|
|
2002
2011
|
};
|
|
2012
|
+
(0, import_react13.useEffect)(() => {
|
|
2013
|
+
if (defaultFile) {
|
|
2014
|
+
handleSelectFile(defaultFile);
|
|
2015
|
+
}
|
|
2016
|
+
}, []);
|
|
2003
2017
|
const handleAreaClick = () => {
|
|
2004
2018
|
inputRef.current?.click();
|
|
2005
2019
|
};
|
|
@@ -3126,7 +3140,7 @@ var import_extension_link = __toESM(require("@tiptap/extension-link"));
|
|
|
3126
3140
|
var import_core4 = require("@tiptap/core");
|
|
3127
3141
|
|
|
3128
3142
|
// node_modules/linkifyjs/dist/linkify.mjs
|
|
3129
|
-
var encodedTlds = "
|
|
3143
|
+
var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
|
|
3130
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";
|
|
3131
3145
|
var numeric = "numeric";
|
|
3132
3146
|
var ascii = "ascii";
|
|
@@ -4057,8 +4071,6 @@ function init$1({
|
|
|
4057
4071
|
ta(Email$1, groups.domain, EmailDomain);
|
|
4058
4072
|
tt(Email$1, DOT, EmailDomainDot);
|
|
4059
4073
|
tt(Email$1, HYPHEN, EmailDomainHyphen);
|
|
4060
|
-
const EmailColon = tt(Email$1, COLON);
|
|
4061
|
-
ta(EmailColon, groups.numeric, Email);
|
|
4062
4074
|
const DomainHyphen = tt(Domain, HYPHEN);
|
|
4063
4075
|
const DomainDot = tt(Domain, DOT);
|
|
4064
4076
|
tt(DomainHyphen, HYPHEN, DomainHyphen);
|
|
@@ -4122,11 +4134,11 @@ function init$1({
|
|
|
4122
4134
|
const [OPEN, CLOSE] = bracketPairs[i];
|
|
4123
4135
|
const UrlOpen = tt(Url$1, OPEN);
|
|
4124
4136
|
tt(UrlNonaccept, OPEN, UrlOpen);
|
|
4125
|
-
tt(UrlOpen, CLOSE, Url$1);
|
|
4126
4137
|
const UrlOpenQ = makeState(Url);
|
|
4127
4138
|
ta(UrlOpen, qsAccepting, UrlOpenQ);
|
|
4128
4139
|
const UrlOpenSyms = makeState();
|
|
4129
|
-
ta(UrlOpen, qsNonAccepting);
|
|
4140
|
+
ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
|
|
4141
|
+
tt(UrlOpen, CLOSE, Url$1);
|
|
4130
4142
|
ta(UrlOpenQ, qsAccepting, UrlOpenQ);
|
|
4131
4143
|
ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
|
|
4132
4144
|
ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
|
|
@@ -6123,21 +6135,8 @@ var BackgroundColor = import_core12.Extension.create({
|
|
|
6123
6135
|
default: null,
|
|
6124
6136
|
parseHTML: (element) => {
|
|
6125
6137
|
var _a;
|
|
6126
|
-
const
|
|
6127
|
-
|
|
6128
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
6129
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
6130
|
-
const parts = decls[i].split(":");
|
|
6131
|
-
if (parts.length >= 2) {
|
|
6132
|
-
const prop = parts[0].trim().toLowerCase();
|
|
6133
|
-
const val = parts.slice(1).join(":").trim();
|
|
6134
|
-
if (prop === "background-color") {
|
|
6135
|
-
return val.replace(/['"]+/g, "");
|
|
6136
|
-
}
|
|
6137
|
-
}
|
|
6138
|
-
}
|
|
6139
|
-
}
|
|
6140
|
-
return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
6138
|
+
const value = (_a = (0, import_core12.getStyleProperty)(element, "background-color")) != null ? _a : element.style.backgroundColor;
|
|
6139
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
6141
6140
|
},
|
|
6142
6141
|
renderHTML: (attributes) => {
|
|
6143
6142
|
if (!attributes.backgroundColor) {
|
|
@@ -6179,21 +6178,8 @@ var Color = import_core13.Extension.create({
|
|
|
6179
6178
|
default: null,
|
|
6180
6179
|
parseHTML: (element) => {
|
|
6181
6180
|
var _a;
|
|
6182
|
-
const
|
|
6183
|
-
|
|
6184
|
-
const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
|
|
6185
|
-
for (let i = decls.length - 1; i >= 0; i -= 1) {
|
|
6186
|
-
const parts = decls[i].split(":");
|
|
6187
|
-
if (parts.length >= 2) {
|
|
6188
|
-
const prop = parts[0].trim().toLowerCase();
|
|
6189
|
-
const val = parts.slice(1).join(":").trim();
|
|
6190
|
-
if (prop === "color") {
|
|
6191
|
-
return val.replace(/['"]+/g, "");
|
|
6192
|
-
}
|
|
6193
|
-
}
|
|
6194
|
-
}
|
|
6195
|
-
}
|
|
6196
|
-
return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
|
|
6181
|
+
const value = (_a = (0, import_core13.getStyleProperty)(element, "color")) != null ? _a : element.style.color;
|
|
6182
|
+
return value == null ? void 0 : value.replace(/['"]+/g, "");
|
|
6197
6183
|
},
|
|
6198
6184
|
renderHTML: (attributes) => {
|
|
6199
6185
|
if (!attributes.color) {
|
|
@@ -6233,7 +6219,14 @@ var FontFamily = import_core14.Extension.create({
|
|
|
6233
6219
|
attributes: {
|
|
6234
6220
|
fontFamily: {
|
|
6235
6221
|
default: null,
|
|
6236
|
-
|
|
6222
|
+
// Prefer the raw inline `style` attribute so unquoted or
|
|
6223
|
+
// single-quoted multi-word names are preserved instead of being
|
|
6224
|
+
// canonicalized by `element.style.fontFamily`, which forces double
|
|
6225
|
+
// quotes that then get HTML-encoded to `"` on serialization.
|
|
6226
|
+
parseHTML: (element) => {
|
|
6227
|
+
var _a;
|
|
6228
|
+
return (_a = (0, import_core14.getStyleProperty)(element, "font-family")) != null ? _a : element.style.fontFamily;
|
|
6229
|
+
},
|
|
6237
6230
|
renderHTML: (attributes) => {
|
|
6238
6231
|
if (!attributes.fontFamily) {
|
|
6239
6232
|
return {};
|
|
@@ -6272,7 +6265,13 @@ var FontSize = import_core15.Extension.create({
|
|
|
6272
6265
|
attributes: {
|
|
6273
6266
|
fontSize: {
|
|
6274
6267
|
default: null,
|
|
6275
|
-
|
|
6268
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
6269
|
+
// is preserved instead of the canonicalized value returned by
|
|
6270
|
+
// `element.style.fontSize`.
|
|
6271
|
+
parseHTML: (element) => {
|
|
6272
|
+
var _a;
|
|
6273
|
+
return (_a = (0, import_core15.getStyleProperty)(element, "font-size")) != null ? _a : element.style.fontSize;
|
|
6274
|
+
},
|
|
6276
6275
|
renderHTML: (attributes) => {
|
|
6277
6276
|
if (!attributes.fontSize) {
|
|
6278
6277
|
return {};
|
|
@@ -6311,7 +6310,13 @@ var LineHeight = import_core16.Extension.create({
|
|
|
6311
6310
|
attributes: {
|
|
6312
6311
|
lineHeight: {
|
|
6313
6312
|
default: null,
|
|
6314
|
-
|
|
6313
|
+
// Prefer the raw inline `style` attribute so the original format
|
|
6314
|
+
// is preserved instead of the canonicalized value returned by
|
|
6315
|
+
// `element.style.lineHeight`.
|
|
6316
|
+
parseHTML: (element) => {
|
|
6317
|
+
var _a;
|
|
6318
|
+
return (_a = (0, import_core16.getStyleProperty)(element, "line-height")) != null ? _a : element.style.lineHeight;
|
|
6319
|
+
},
|
|
6315
6320
|
renderHTML: (attributes) => {
|
|
6316
6321
|
if (!attributes.lineHeight) {
|
|
6317
6322
|
return {};
|
|
@@ -6774,10 +6779,110 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
|
|
|
6774
6779
|
};
|
|
6775
6780
|
};
|
|
6776
6781
|
|
|
6782
|
+
// src/editor/handlers/insertion-handlers.ts
|
|
6783
|
+
var import_react35 = require("react");
|
|
6784
|
+
|
|
6785
|
+
// src/utils/prosemirror-iterator.ts
|
|
6786
|
+
var import_model = require("@tiptap/pm/model");
|
|
6787
|
+
function prosemirrorIterator(slice, cb) {
|
|
6788
|
+
const stack = [];
|
|
6789
|
+
if (slice instanceof import_model.Slice) {
|
|
6790
|
+
collectFragmentChildren(slice.content, stack);
|
|
6791
|
+
} else if (slice instanceof import_model.Fragment) {
|
|
6792
|
+
collectFragmentChildren(slice, stack);
|
|
6793
|
+
} else {
|
|
6794
|
+
stack.push(slice);
|
|
6795
|
+
}
|
|
6796
|
+
while (stack.length > 0) {
|
|
6797
|
+
const node = stack.pop();
|
|
6798
|
+
const shouldStop = cb(node);
|
|
6799
|
+
if (shouldStop === true) break;
|
|
6800
|
+
if (node.content.size > 0) {
|
|
6801
|
+
collectFragmentChildren(node.content, stack);
|
|
6802
|
+
}
|
|
6803
|
+
}
|
|
6804
|
+
}
|
|
6805
|
+
function collectFragmentChildren(fragment, stack) {
|
|
6806
|
+
for (let i = fragment.childCount - 1; i >= 0; i--) {
|
|
6807
|
+
stack.push(fragment.child(i));
|
|
6808
|
+
}
|
|
6809
|
+
}
|
|
6810
|
+
|
|
6811
|
+
// src/editor/handlers/insertion-handlers.ts
|
|
6812
|
+
function useInsertionHandlers() {
|
|
6813
|
+
const [insertedImage, setInsertedImage] = (0, import_react35.useState)(null);
|
|
6814
|
+
const { activeDialog, openDialogCommand } = useDialogCommand();
|
|
6815
|
+
(0, import_react35.useEffect)(() => {
|
|
6816
|
+
if (insertedImage && !activeDialog) {
|
|
6817
|
+
setInsertedImage(null);
|
|
6818
|
+
}
|
|
6819
|
+
}, [insertedImage, activeDialog]);
|
|
6820
|
+
function genericInsertionHandler(file, event) {
|
|
6821
|
+
if (!file || !file.type.startsWith("image/")) return;
|
|
6822
|
+
event.preventDefault();
|
|
6823
|
+
event.stopPropagation();
|
|
6824
|
+
setInsertedImage(file);
|
|
6825
|
+
openDialogCommand("image");
|
|
6826
|
+
}
|
|
6827
|
+
function onPaste(_, event) {
|
|
6828
|
+
const file = event.clipboardData?.files?.[0];
|
|
6829
|
+
genericInsertionHandler(file, event);
|
|
6830
|
+
}
|
|
6831
|
+
function onDrop(_, event) {
|
|
6832
|
+
const file = event.dataTransfer?.files?.[0];
|
|
6833
|
+
genericInsertionHandler(file, event);
|
|
6834
|
+
}
|
|
6835
|
+
function onMarkupInsertion(view, event, slice, setDisabled, uploadMultipleByURL) {
|
|
6836
|
+
if (!uploadMultipleByURL) return;
|
|
6837
|
+
let hasMarkupInsertion = false;
|
|
6838
|
+
if ("clipboardData" in event && Array.from(event.clipboardData?.items ?? []).some(
|
|
6839
|
+
(item) => item.type === "text/html"
|
|
6840
|
+
)) {
|
|
6841
|
+
hasMarkupInsertion = true;
|
|
6842
|
+
}
|
|
6843
|
+
if ("dataTransfer" in event && Array.from(event.dataTransfer?.items ?? []).some(
|
|
6844
|
+
(item) => item.type === "text/html"
|
|
6845
|
+
)) {
|
|
6846
|
+
hasMarkupInsertion = true;
|
|
6847
|
+
}
|
|
6848
|
+
if (hasMarkupInsertion) {
|
|
6849
|
+
const imagesToNodes = [];
|
|
6850
|
+
setDisabled(true);
|
|
6851
|
+
prosemirrorIterator(slice, (node) => {
|
|
6852
|
+
if (node.type.name === "image" && !node.attrs.fileId) {
|
|
6853
|
+
try {
|
|
6854
|
+
const url = new URL(node.attrs.src).toString();
|
|
6855
|
+
imagesToNodes.push([url, node]);
|
|
6856
|
+
} catch {
|
|
6857
|
+
}
|
|
6858
|
+
}
|
|
6859
|
+
});
|
|
6860
|
+
uploadMultipleByURL(imagesToNodes.map(([url]) => url)).then((results) => {
|
|
6861
|
+
results.forEach((result, index) => {
|
|
6862
|
+
const node = imagesToNodes[index][1];
|
|
6863
|
+
node.attrs.src = null;
|
|
6864
|
+
node.attrs.fileId = result?.fileId;
|
|
6865
|
+
node.attrs.storageKey = result?.storageKey;
|
|
6866
|
+
});
|
|
6867
|
+
view.dispatch(view.state.tr.replaceSelection(slice));
|
|
6868
|
+
}).finally(() => {
|
|
6869
|
+
setDisabled(false);
|
|
6870
|
+
});
|
|
6871
|
+
return true;
|
|
6872
|
+
}
|
|
6873
|
+
}
|
|
6874
|
+
return {
|
|
6875
|
+
insertedImage,
|
|
6876
|
+
onPaste,
|
|
6877
|
+
onDrop,
|
|
6878
|
+
onMarkupInsertion
|
|
6879
|
+
};
|
|
6880
|
+
}
|
|
6881
|
+
|
|
6777
6882
|
// src/editor/commands/suggestion.tsx
|
|
6778
6883
|
var import_dom = require("@floating-ui/dom");
|
|
6779
6884
|
var import_core19 = require("@tiptap/core");
|
|
6780
|
-
var
|
|
6885
|
+
var import_react36 = require("@tiptap/react");
|
|
6781
6886
|
|
|
6782
6887
|
// src/editor/commands/items.ts
|
|
6783
6888
|
var getCommandItems = (translations2, hasImageHandlers) => [
|
|
@@ -7110,7 +7215,7 @@ var createSuggestions = (translations2, hasImageHandlers) => ({
|
|
|
7110
7215
|
render: () => {
|
|
7111
7216
|
return {
|
|
7112
7217
|
onStart: async (props) => {
|
|
7113
|
-
component = new
|
|
7218
|
+
component = new import_react36.ReactRenderer(CommandsList, {
|
|
7114
7219
|
props,
|
|
7115
7220
|
editor: props.editor
|
|
7116
7221
|
});
|
|
@@ -7533,27 +7638,35 @@ function TiptapContent({
|
|
|
7533
7638
|
lang,
|
|
7534
7639
|
error
|
|
7535
7640
|
}) {
|
|
7536
|
-
const [linkDialogContext, setLinkDialogContext] = (0,
|
|
7537
|
-
const [katexDialogContext, setKatexDialogContext] = (0,
|
|
7641
|
+
const [linkDialogContext, setLinkDialogContext] = (0, import_react37.useState)(null);
|
|
7642
|
+
const [katexDialogContext, setKatexDialogContext] = (0, import_react37.useState)(
|
|
7538
7643
|
null
|
|
7539
7644
|
);
|
|
7540
|
-
const [editFigureContext, setEditFigureContext] = (0,
|
|
7541
|
-
const [savedDialogCursorPos, setSavedDialogCursorPos] = (0,
|
|
7645
|
+
const [editFigureContext, setEditFigureContext] = (0, import_react37.useState)(null);
|
|
7646
|
+
const [savedDialogCursorPos, setSavedDialogCursorPos] = (0, import_react37.useState)(void 0);
|
|
7542
7647
|
const { activeDialog, closeDialogCommand, openDialogCommand } = useDialogCommand();
|
|
7543
7648
|
const translations2 = useTiptapTranslations();
|
|
7649
|
+
const [isDisabledInternal, setIsDisabledInternal] = (0, import_react37.useState)(isDisabled);
|
|
7650
|
+
const disabled = isDisabled || isDisabledInternal;
|
|
7544
7651
|
let safeContent;
|
|
7545
7652
|
try {
|
|
7546
7653
|
safeContent = JSON.parse(content);
|
|
7547
7654
|
} catch {
|
|
7548
7655
|
safeContent = { type: "doc", content: [{ type: "paragraph" }] };
|
|
7549
7656
|
}
|
|
7550
|
-
const
|
|
7657
|
+
const {
|
|
7658
|
+
insertedImage,
|
|
7659
|
+
onPaste,
|
|
7660
|
+
onDrop,
|
|
7661
|
+
onMarkupInsertion
|
|
7662
|
+
} = useInsertionHandlers();
|
|
7663
|
+
const editor = (0, import_react38.useEditor)(
|
|
7551
7664
|
{
|
|
7552
|
-
editable: isEditable && !
|
|
7665
|
+
editable: isEditable && !disabled,
|
|
7553
7666
|
extensions: getEditorExtensions({
|
|
7554
7667
|
translations: translations2,
|
|
7555
7668
|
suggestion: createSuggestions(translations2, !!imageHandlers),
|
|
7556
|
-
isEditable: isEditable && !
|
|
7669
|
+
isEditable: isEditable && !disabled,
|
|
7557
7670
|
getImageById: imageHandlers?.getImage,
|
|
7558
7671
|
onKatexClick: (latex, pos) => {
|
|
7559
7672
|
setKatexDialogContext({ latex, pos });
|
|
@@ -7567,14 +7680,38 @@ function TiptapContent({
|
|
|
7567
7680
|
content: safeContent,
|
|
7568
7681
|
immediatelyRender: false,
|
|
7569
7682
|
editorProps: {
|
|
7570
|
-
|
|
7683
|
+
handleDOMEvents: {
|
|
7684
|
+
paste: onPaste,
|
|
7685
|
+
drop: onDrop
|
|
7686
|
+
},
|
|
7687
|
+
handleDrop: (view, event, slice) => {
|
|
7688
|
+
if (view.dragging) return false;
|
|
7689
|
+
const toReturn = onMarkupInsertion(
|
|
7690
|
+
view,
|
|
7691
|
+
event,
|
|
7692
|
+
slice,
|
|
7693
|
+
setIsDisabledInternal,
|
|
7694
|
+
imageHandlers?.uploadMultipleByURL
|
|
7695
|
+
);
|
|
7696
|
+
if (typeof toReturn === "boolean") return toReturn;
|
|
7697
|
+
return false;
|
|
7698
|
+
},
|
|
7699
|
+
handlePaste: (view, event, slice) => {
|
|
7700
|
+
const toReturn = onMarkupInsertion(
|
|
7701
|
+
view,
|
|
7702
|
+
event,
|
|
7703
|
+
slice,
|
|
7704
|
+
setIsDisabledInternal,
|
|
7705
|
+
imageHandlers?.uploadMultipleByURL
|
|
7706
|
+
);
|
|
7707
|
+
if (typeof toReturn === "boolean") return toReturn;
|
|
7571
7708
|
try {
|
|
7572
7709
|
const text = event.clipboardData?.getData("text/plain");
|
|
7573
7710
|
if (!text) return false;
|
|
7574
7711
|
const json = JSON.parse(text);
|
|
7575
7712
|
if (json.type === "doc" && json.content) {
|
|
7576
7713
|
const node = view.state.schema.nodeFromJSON(json);
|
|
7577
|
-
const newSlice = new
|
|
7714
|
+
const newSlice = new import_model2.Slice(node.content, 0, 0);
|
|
7578
7715
|
view.dispatch(view.state.tr.replaceSelection(newSlice));
|
|
7579
7716
|
return true;
|
|
7580
7717
|
}
|
|
@@ -7589,7 +7726,7 @@ function TiptapContent({
|
|
|
7589
7726
|
},
|
|
7590
7727
|
[lang]
|
|
7591
7728
|
);
|
|
7592
|
-
(0,
|
|
7729
|
+
(0, import_react37.useEffect)(() => {
|
|
7593
7730
|
if (activeDialog && editor && !editor.isDestroyed) {
|
|
7594
7731
|
const pos = editor.state.selection.from;
|
|
7595
7732
|
setSavedDialogCursorPos(pos);
|
|
@@ -7616,7 +7753,7 @@ function TiptapContent({
|
|
|
7616
7753
|
const katexHandler = createHandleKatexAdd(editor, handleCloseDialog, savedDialogCursorPos);
|
|
7617
7754
|
katexHandler(latex, katexDialogContext?.pos);
|
|
7618
7755
|
};
|
|
7619
|
-
(0,
|
|
7756
|
+
(0, import_react37.useEffect)(() => {
|
|
7620
7757
|
if (!editor || editor.isDestroyed) return;
|
|
7621
7758
|
editor.commands.setContent(safeContent, {
|
|
7622
7759
|
emitUpdate: false
|
|
@@ -7637,8 +7774,8 @@ function TiptapContent({
|
|
|
7637
7774
|
if (!editor) return null;
|
|
7638
7775
|
return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(import_jsx_runtime92.Fragment, { children: [
|
|
7639
7776
|
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)(DragHandle, { editor }),
|
|
7640
|
-
isEditable && !
|
|
7641
|
-
isEditable && !
|
|
7777
|
+
isEditable && !disabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(TableMenu, { editor }),
|
|
7778
|
+
isEditable && !disabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
7642
7779
|
import_menus.BubbleMenu,
|
|
7643
7780
|
{
|
|
7644
7781
|
shouldShow: shouldBubbleMenuShow,
|
|
@@ -7656,10 +7793,10 @@ function TiptapContent({
|
|
|
7656
7793
|
/* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(
|
|
7657
7794
|
"div",
|
|
7658
7795
|
{
|
|
7659
|
-
className: `tiptap-content-wrapper ${!!error ? "has-error" : ""} ${
|
|
7796
|
+
className: `tiptap-content-wrapper ${!!error ? "has-error" : ""} ${disabled ? "is-disabled" : ""}`,
|
|
7660
7797
|
children: [
|
|
7661
|
-
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
7662
|
-
isEditable && !
|
|
7798
|
+
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)(import_react38.EditorContent, { editor }),
|
|
7799
|
+
isEditable && !disabled && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(CharacterCount, { editor })
|
|
7663
7800
|
]
|
|
7664
7801
|
}
|
|
7665
7802
|
),
|
|
@@ -7670,6 +7807,7 @@ function TiptapContent({
|
|
|
7670
7807
|
{
|
|
7671
7808
|
open: true,
|
|
7672
7809
|
onClose: handleCloseDialog,
|
|
7810
|
+
defaultFile: insertedImage,
|
|
7673
7811
|
onImageAdd: handleImageAdd,
|
|
7674
7812
|
onImageEdit: handleImageEdit,
|
|
7675
7813
|
uploadHandler: imageHandlers?.upload,
|