@cyberyozh/text-editor 0.2.1 → 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.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 import_state6 = require("@tiptap/pm/state");
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");
@@ -2058,7 +2058,6 @@ var ImageDialog = ({
2058
2058
  setIsUploading(true);
2059
2059
  try {
2060
2060
  const result = await uploadHandler(formState.file);
2061
- console.log("\u{1F440} ~ handleAddImage ~ result:", result);
2062
2061
  onImageAdd({
2063
2062
  fileId: result.fileId,
2064
2063
  src: result.fileUrl,
@@ -3138,6 +3137,7 @@ var BaseCustomQuoteSign = import_core3.Node.create({
3138
3137
  // src/extensions/base/link.ts
3139
3138
  var import_extension_link = __toESM(require("@tiptap/extension-link"));
3140
3139
  var import_core4 = require("@tiptap/core");
3140
+ var import_state3 = require("@tiptap/pm/state");
3141
3141
 
3142
3142
  // node_modules/linkifyjs/dist/linkify.mjs
3143
3143
  var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
@@ -4316,6 +4316,23 @@ var LinkExtension = import_extension_link.default.extend({
4316
4316
  }
4317
4317
  })
4318
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
+ ];
4319
4336
  }
4320
4337
  }).configure({
4321
4338
  openOnClick: false,
@@ -4362,7 +4379,7 @@ var BaseMythReality = import_core5.Node.create({
4362
4379
 
4363
4380
  // src/extensions/base/prompt.ts
4364
4381
  var import_core6 = require("@tiptap/core");
4365
- var import_state3 = require("@tiptap/pm/state");
4382
+ var import_state4 = require("@tiptap/pm/state");
4366
4383
  var BasePrompt = import_core6.Node.create({
4367
4384
  name: "prompt",
4368
4385
  group: "block",
@@ -4394,7 +4411,7 @@ var BasePrompt = import_core6.Node.create({
4394
4411
  const paragraphNode = schema.nodes.paragraph.createAndFill();
4395
4412
  if (!paragraphNode) return false;
4396
4413
  tr2.insert(posAfter, paragraphNode);
4397
- tr2.setSelection(import_state3.TextSelection.create(tr2.doc, posAfter + 1));
4414
+ tr2.setSelection(import_state4.TextSelection.create(tr2.doc, posAfter + 1));
4398
4415
  view.dispatch(tr2);
4399
4416
  return true;
4400
4417
  }
@@ -4636,7 +4653,7 @@ var BaseFigure = import_extension_image.default.extend({
4636
4653
 
4637
4654
  // src/extensions/base/compatibility.ts
4638
4655
  var import_core9 = require("@tiptap/core");
4639
- var import_state4 = require("@tiptap/pm/state");
4656
+ var import_state5 = require("@tiptap/pm/state");
4640
4657
  var import_extension_image2 = __toESM(require("@tiptap/extension-image"));
4641
4658
  var BaseLegacyBookAlert = import_core9.Node.create({
4642
4659
  name: "calloutAlert",
@@ -4780,7 +4797,7 @@ var BaseLegacySEQuote = import_core9.Node.create({
4780
4797
  const paragraphNode = schema.nodes.paragraph.createAndFill();
4781
4798
  if (!paragraphNode) return false;
4782
4799
  tr2.insert(posAfter, paragraphNode);
4783
- tr2.setSelection(import_state4.TextSelection.create(tr2.doc, posAfter + 1));
4800
+ tr2.setSelection(import_state5.TextSelection.create(tr2.doc, posAfter + 1));
4784
4801
  view.dispatch(tr2);
4785
4802
  return true;
4786
4803
  }
@@ -4828,7 +4845,7 @@ var BaseLegacyPromptSE = import_core9.Node.create({
4828
4845
  const paragraphNode = schema.nodes.paragraph.createAndFill();
4829
4846
  if (!paragraphNode) return false;
4830
4847
  tr2.insert(posAfter, paragraphNode);
4831
- tr2.setSelection(import_state4.TextSelection.create(tr2.doc, posAfter + 1));
4848
+ tr2.setSelection(import_state5.TextSelection.create(tr2.doc, posAfter + 1));
4832
4849
  view.dispatch(tr2);
4833
4850
  return true;
4834
4851
  }
@@ -6686,7 +6703,7 @@ function getEditorExtensions(options) {
6686
6703
  }
6687
6704
 
6688
6705
  // src/editor/handlers/dialog-handlers.ts
6689
- var import_state5 = require("@tiptap/pm/state");
6706
+ var import_state6 = require("@tiptap/pm/state");
6690
6707
  var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
6691
6708
  return (attrs) => {
6692
6709
  if (!editor) return;
@@ -6697,10 +6714,10 @@ var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
6697
6714
  const imageNode = state2.schema.nodes.image.create({ ...attrs });
6698
6715
  if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
6699
6716
  tr2.replaceWith($pos.before(), $pos.after(), imageNode);
6700
- tr2.setSelection(import_state5.TextSelection.near(tr2.doc.resolve($pos.before())));
6717
+ tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve($pos.before())));
6701
6718
  } else {
6702
6719
  tr2.insert(insertPos, imageNode);
6703
- tr2.setSelection(import_state5.TextSelection.near(tr2.doc.resolve(insertPos)));
6720
+ tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve(insertPos)));
6704
6721
  }
6705
6722
  return true;
6706
6723
  }).run();
@@ -6724,40 +6741,29 @@ var createHandleVideoAdd = (editor, closeDialogCommand, savedPos) => {
6724
6741
  const videoNode = state2.schema.nodes.video.create({ src: url });
6725
6742
  if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
6726
6743
  tr2.replaceWith($pos.before(), $pos.after(), videoNode);
6727
- tr2.setSelection(import_state5.TextSelection.near(tr2.doc.resolve($pos.before())));
6744
+ tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve($pos.before())));
6728
6745
  } else {
6729
6746
  tr2.insert(insertPos, videoNode);
6730
- tr2.setSelection(import_state5.TextSelection.near(tr2.doc.resolve(insertPos)));
6747
+ tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve(insertPos)));
6731
6748
  }
6732
6749
  return true;
6733
6750
  }).run();
6734
6751
  closeDialogCommand();
6735
6752
  };
6736
6753
  };
6737
- var createHandleLinkAdd = (editor, closeDialogCommand, linkParams, savedPos) => {
6754
+ var createHandleLinkAdd = (editor, closeDialogCommand, linkParams, savedRange) => {
6738
6755
  if (!editor) return;
6739
- const hasSelection = !editor.state.selection.empty;
6740
- const titleLength = linkParams.title?.length ?? 0;
6741
- if (hasSelection) {
6742
- editor.chain().focus().command(({ tr: tr2, state }) => {
6743
- const { from, to } = state.selection;
6744
- tr2.insertText(linkParams.title ?? "", from, to);
6745
- tr2.removeMark(from, from + titleLength);
6746
- tr2.addMark(from, from + titleLength, editor.schema.marks.link.create({ ...linkParams }));
6747
- return true;
6748
- }).run();
6749
- } else {
6750
- const { state } = editor;
6751
- const insertPos = savedPos ?? state.selection.from;
6752
- const titleLength2 = linkParams.title?.length ?? 0;
6753
- editor.chain().focus().command(({ tr: tr2 }) => {
6754
- const linkMark = editor.schema.marks.link.create({ ...linkParams });
6755
- const textNode = editor.schema.text(linkParams.title ?? "", [linkMark]);
6756
- tr2.insert(insertPos, textNode);
6757
- tr2.setSelection(import_state5.TextSelection.create(tr2.doc, insertPos, insertPos + titleLength2));
6758
- return true;
6759
- }).run();
6760
- }
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();
6761
6767
  closeDialogCommand();
6762
6768
  };
6763
6769
  var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
@@ -6771,7 +6777,7 @@ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
6771
6777
  editor.chain().focus().command(({ tr: tr2, state: state2 }) => {
6772
6778
  const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
6773
6779
  tr2.insert(insertPos, inlineMathNode);
6774
- tr2.setSelection(import_state5.TextSelection.near(tr2.doc.resolve(insertPos)));
6780
+ tr2.setSelection(import_state6.TextSelection.near(tr2.doc.resolve(insertPos)));
6775
6781
  return true;
6776
6782
  }).run();
6777
6783
  }
@@ -6808,6 +6814,31 @@ function collectFragmentChildren(fragment, stack) {
6808
6814
  }
6809
6815
  }
6810
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
+
6811
6842
  // src/editor/handlers/insertion-handlers.ts
6812
6843
  function useInsertionHandlers() {
6813
6844
  const [insertedImage, setInsertedImage] = (0, import_react35.useState)(null);
@@ -6846,24 +6877,10 @@ function useInsertionHandlers() {
6846
6877
  hasMarkupInsertion = true;
6847
6878
  }
6848
6879
  if (hasMarkupInsertion) {
6849
- const imagesToNodes = [];
6880
+ const imagesToNodes = collectRehostableImages(slice);
6850
6881
  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
6882
  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
- });
6883
+ applyUploadResultsToNodes(imagesToNodes, results);
6867
6884
  view.dispatch(view.state.tr.replaceSelection(slice));
6868
6885
  }).finally(() => {
6869
6886
  setDisabled(false);
@@ -7644,6 +7661,9 @@ function TiptapContent({
7644
7661
  );
7645
7662
  const [editFigureContext, setEditFigureContext] = (0, import_react37.useState)(null);
7646
7663
  const [savedDialogCursorPos, setSavedDialogCursorPos] = (0, import_react37.useState)(void 0);
7664
+ const [savedDialogRange, setSavedDialogRange] = (0, import_react37.useState)(
7665
+ void 0
7666
+ );
7647
7667
  const { activeDialog, closeDialogCommand, openDialogCommand } = useDialogCommand();
7648
7668
  const translations2 = useTiptapTranslations();
7649
7669
  const [isDisabledInternal, setIsDisabledInternal] = (0, import_react37.useState)(isDisabled);
@@ -7728,8 +7748,9 @@ function TiptapContent({
7728
7748
  );
7729
7749
  (0, import_react37.useEffect)(() => {
7730
7750
  if (activeDialog && editor && !editor.isDestroyed) {
7731
- const pos = editor.state.selection.from;
7732
- setSavedDialogCursorPos(pos);
7751
+ const { from, to } = editor.state.selection;
7752
+ setSavedDialogCursorPos(from);
7753
+ setSavedDialogRange({ from, to });
7733
7754
  }
7734
7755
  }, [activeDialog, editor]);
7735
7756
  const handleCloseDialog = () => {
@@ -7737,6 +7758,7 @@ function TiptapContent({
7737
7758
  setKatexDialogContext(null);
7738
7759
  setEditFigureContext(null);
7739
7760
  setSavedDialogCursorPos(void 0);
7761
+ setSavedDialogRange(void 0);
7740
7762
  closeDialogCommand();
7741
7763
  };
7742
7764
  const handleImageAdd = (attrs) => {
@@ -7747,7 +7769,7 @@ function TiptapContent({
7747
7769
  createHandleVideoAdd(editor, handleCloseDialog, savedDialogCursorPos)(url);
7748
7770
  };
7749
7771
  const handleLinkAdd = (params) => {
7750
- createHandleLinkAdd(editor, handleCloseDialog, params, savedDialogCursorPos);
7772
+ createHandleLinkAdd(editor, handleCloseDialog, params, savedDialogRange);
7751
7773
  };
7752
7774
  const handleKatexAdd = (latex) => {
7753
7775
  const katexHandler = createHandleKatexAdd(editor, handleCloseDialog, savedDialogCursorPos);
@@ -7760,7 +7782,7 @@ function TiptapContent({
7760
7782
  });
7761
7783
  }, [content, editor]);
7762
7784
  const shouldBubbleMenuShow = ({ state }) => {
7763
- if (state.selection instanceof import_state6.NodeSelection) {
7785
+ if (state.selection instanceof import_state7.NodeSelection) {
7764
7786
  return false;
7765
7787
  }
7766
7788
  if (state.selection.empty) {