docx-diff-editor 1.0.1 → 1.0.4

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/index.js CHANGED
@@ -13,42 +13,6 @@ var DiffMatchPatch__default = /*#__PURE__*/_interopDefault(DiffMatchPatch);
13
13
 
14
14
  // src/DocxDiffEditor.tsx
15
15
 
16
- // src/blankTemplate.ts
17
- var BLANK_DOCX_BASE64 = `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`;
18
- function base64ToBlob(base64, mimeType) {
19
- const byteCharacters = atob(base64.replace(/\s/g, ""));
20
- const byteNumbers = new Array(byteCharacters.length);
21
- for (let i = 0; i < byteCharacters.length; i++) {
22
- byteNumbers[i] = byteCharacters.charCodeAt(i);
23
- }
24
- const byteArray = new Uint8Array(byteNumbers);
25
- return new Blob([byteArray], { type: mimeType });
26
- }
27
- function base64ToFile(base64, filename, mimeType) {
28
- const blob = base64ToBlob(base64, mimeType);
29
- return new File([blob], filename, { type: mimeType });
30
- }
31
- function getBlankTemplateFile() {
32
- return base64ToFile(
33
- BLANK_DOCX_BASE64,
34
- "blank-template.docx",
35
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
36
- );
37
- }
38
- function getBlankTemplateBlob() {
39
- return base64ToBlob(
40
- BLANK_DOCX_BASE64,
41
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
42
- );
43
- }
44
- function isValidDocxFile(file) {
45
- const validTypes = [
46
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
47
- "application/msword"
48
- ];
49
- return validTypes.includes(file.type) || file.name.endsWith(".docx");
50
- }
51
-
52
16
  // src/constants.ts
53
17
  var DEFAULT_AUTHOR = {
54
18
  name: "DocxDiff Editor",
@@ -159,104 +123,6 @@ async function parseDocxFile(file, SuperDoc) {
159
123
  }, 50);
160
124
  });
161
125
  }
162
- async function parseHtmlContent(html, SuperDoc, templateDocx) {
163
- const template = templateDocx || getBlankTemplateFile();
164
- const container = document.createElement("div");
165
- container.style.cssText = "position:absolute;top:-9999px;left:-9999px;width:800px;height:600px;visibility:hidden;";
166
- document.body.appendChild(container);
167
- return new Promise((resolve, reject) => {
168
- let superdoc = null;
169
- let resolved = false;
170
- const cleanup = () => {
171
- setTimeout(() => {
172
- if (superdoc) {
173
- try {
174
- const sd = superdoc;
175
- superdoc = null;
176
- sd.destroy?.();
177
- } catch {
178
- }
179
- }
180
- if (container.parentNode) {
181
- container.parentNode.removeChild(container);
182
- }
183
- }, TIMEOUTS.CLEANUP_DELAY);
184
- };
185
- setTimeout(async () => {
186
- if (resolved) return;
187
- try {
188
- superdoc = new SuperDoc({
189
- selector: container,
190
- document: template,
191
- html,
192
- // SuperDoc's HTML initialization option
193
- documentMode: "viewing",
194
- rulers: false,
195
- user: { name: "Parser", email: "parser@local" },
196
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
197
- onReady: ({ superdoc: sd }) => {
198
- if (resolved) return;
199
- try {
200
- const editor = sd?.activeEditor;
201
- if (!editor) {
202
- throw new Error("No active editor found");
203
- }
204
- const json = editor.getJSON();
205
- resolved = true;
206
- cleanup();
207
- resolve(json);
208
- } catch (err) {
209
- resolved = true;
210
- cleanup();
211
- reject(err);
212
- }
213
- },
214
- onException: ({ error: err }) => {
215
- if (resolved) return;
216
- resolved = true;
217
- cleanup();
218
- reject(err);
219
- }
220
- });
221
- setTimeout(() => {
222
- if (!resolved) {
223
- resolved = true;
224
- cleanup();
225
- reject(new Error("HTML parsing timed out"));
226
- }
227
- }, TIMEOUTS.PARSE_TIMEOUT);
228
- } catch (err) {
229
- cleanup();
230
- reject(err);
231
- }
232
- }, 50);
233
- });
234
- }
235
- async function resolveContent(content, SuperDoc, templateDocx) {
236
- const type = detectContentType(content);
237
- switch (type) {
238
- case "file":
239
- return {
240
- json: await parseDocxFile(content, SuperDoc),
241
- type: "file"
242
- };
243
- case "html":
244
- return {
245
- json: await parseHtmlContent(content, SuperDoc, templateDocx),
246
- type: "html"
247
- };
248
- case "json":
249
- if (!isProseMirrorJSON(content)) {
250
- throw new Error("Invalid ProseMirror JSON structure");
251
- }
252
- return {
253
- json: content,
254
- type: "json"
255
- };
256
- default:
257
- throw new Error(`Unknown content type: ${type}`);
258
- }
259
- }
260
126
  var dmp = new DiffMatchPatch__default.default();
261
127
  var DIFF_DELETE = -1;
262
128
  var DIFF_INSERT = 1;
@@ -836,12 +702,9 @@ var DocxDiffEditor = react.forwardRef(
836
702
  }, []);
837
703
  const setEditingMode = react.useCallback((sd) => {
838
704
  if (sd.setTrackedChangesPreferences) {
839
- sd.setTrackedChangesPreferences({ mode: "editing", enabled: false });
705
+ sd.setTrackedChangesPreferences({ mode: "simple", enabled: false });
840
706
  }
841
707
  }, []);
842
- const getTemplateFile = react.useCallback(() => {
843
- return templateDocx || getBlankTemplateFile();
844
- }, [templateDocx]);
845
708
  const handleError = react.useCallback(
846
709
  (err) => {
847
710
  const error2 = err instanceof Error ? err : new Error(err);
@@ -850,6 +713,72 @@ var DocxDiffEditor = react.forwardRef(
850
713
  },
851
714
  [onError]
852
715
  );
716
+ const destroySuperdoc = react.useCallback(() => {
717
+ if (superdocRef.current) {
718
+ try {
719
+ superdocRef.current.destroy?.();
720
+ } catch {
721
+ }
722
+ superdocRef.current = null;
723
+ }
724
+ readyRef.current = false;
725
+ }, []);
726
+ const createSuperdoc = react.useCallback(
727
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
728
+ async (options) => {
729
+ if (!SuperDocRef.current) {
730
+ throw new Error("SuperDoc not loaded");
731
+ }
732
+ if (!containerRef.current) {
733
+ throw new Error("Container not available");
734
+ }
735
+ containerRef.current.id = editorId;
736
+ if (toolbarRef.current) {
737
+ toolbarRef.current.id = toolbarId;
738
+ }
739
+ return new Promise((resolve, reject) => {
740
+ try {
741
+ const superdoc = new SuperDocRef.current({
742
+ selector: `#${editorId}`,
743
+ toolbar: showToolbar ? `#${toolbarId}` : void 0,
744
+ document: options.document,
745
+ html: options.html,
746
+ documentMode: "editing",
747
+ role: "editor",
748
+ rulers: showRulers,
749
+ user: DEFAULT_SUPERDOC_USER,
750
+ permissionResolver,
751
+ onReady: ({ superdoc: sd }) => {
752
+ superdocRef.current = sd;
753
+ readyRef.current = true;
754
+ let json = { type: "doc", content: [] };
755
+ if (sd?.activeEditor) {
756
+ try {
757
+ json = sd.activeEditor.getJSON();
758
+ } catch (err) {
759
+ console.error("Failed to extract JSON:", err);
760
+ }
761
+ }
762
+ resolve({ superdoc: sd, json });
763
+ },
764
+ onException: ({ error: err }) => {
765
+ console.error("SuperDoc error:", err);
766
+ reject(err);
767
+ }
768
+ });
769
+ superdocRef.current = superdoc;
770
+ setTimeout(() => {
771
+ if (!readyRef.current) {
772
+ reject(new Error("SuperDoc initialization timed out"));
773
+ }
774
+ }, TIMEOUTS.PARSE_TIMEOUT);
775
+ } catch (err) {
776
+ reject(err);
777
+ }
778
+ });
779
+ },
780
+ [editorId, toolbarId, showToolbar, showRulers]
781
+ );
853
782
  const initialize = react.useCallback(async () => {
854
783
  if (initRef.current || !containerRef.current || !mountedRef.current) return;
855
784
  if (!showToolbar && !toolbarRef.current) ; else if (showToolbar && !toolbarRef.current) {
@@ -863,78 +792,37 @@ var DocxDiffEditor = react.forwardRef(
863
792
  }
864
793
  setIsLoading(true);
865
794
  setError(null);
866
- if (superdocRef.current) {
867
- try {
868
- superdocRef.current.destroy?.();
869
- } catch {
870
- }
871
- superdocRef.current = null;
872
- }
873
- containerRef.current.id = editorId;
874
- if (toolbarRef.current) {
875
- toolbarRef.current.id = toolbarId;
876
- }
795
+ destroySuperdoc();
877
796
  try {
878
797
  const { SuperDoc } = await import('superdoc');
879
798
  await import('superdoc/style.css');
880
799
  SuperDocRef.current = SuperDoc;
881
- let initialDoc;
882
- let initialContent = null;
800
+ let initOptions = {};
883
801
  if (initialSource) {
884
802
  const contentType = detectContentType(initialSource);
885
803
  if (contentType === "file") {
886
- initialDoc = initialSource;
887
- } else {
888
- initialDoc = getTemplateFile();
889
- try {
890
- const resolved = await resolveContent(initialSource, SuperDoc, templateDocx);
891
- initialContent = resolved.json;
892
- } catch (err) {
893
- handleError(err instanceof Error ? err : new Error("Failed to resolve initial content"));
894
- }
804
+ initOptions = { document: initialSource };
805
+ } else if (contentType === "html") {
806
+ initOptions = { html: initialSource };
807
+ } else if (contentType === "json") {
808
+ initOptions = templateDocx ? { document: templateDocx } : {};
895
809
  }
896
- } else {
897
- initialDoc = getTemplateFile();
810
+ } else if (templateDocx) {
811
+ initOptions = { document: templateDocx };
898
812
  }
899
- const superdoc = new SuperDoc({
900
- selector: `#${editorId}`,
901
- toolbar: showToolbar ? `#${toolbarId}` : void 0,
902
- document: initialDoc,
903
- documentMode: "editing",
904
- role: "editor",
905
- rulers: showRulers,
906
- user: DEFAULT_SUPERDOC_USER,
907
- permissionResolver,
908
- onReady: ({ superdoc: sd }) => {
909
- superdocRef.current = sd;
910
- readyRef.current = true;
911
- if (initialContent && sd?.activeEditor) {
912
- try {
913
- setEditorContent(sd.activeEditor, initialContent);
914
- setSourceJson(initialContent);
915
- onSourceLoaded?.(initialContent);
916
- } catch (err) {
917
- console.error("Failed to set initial content:", err);
918
- }
919
- } else if (sd?.activeEditor) {
920
- try {
921
- const json = sd.activeEditor.getJSON();
922
- setSourceJson(json);
923
- onSourceLoaded?.(json);
924
- } catch (err) {
925
- console.error("Failed to extract JSON:", err);
926
- }
927
- }
928
- setIsLoading(false);
929
- onReady?.();
930
- },
931
- onException: ({ error: err }) => {
932
- console.error("SuperDoc error:", err);
933
- handleError(err);
934
- setIsLoading(false);
813
+ const { superdoc: sd, json } = await createSuperdoc(initOptions);
814
+ if (initialSource && detectContentType(initialSource) === "json") {
815
+ if (sd?.activeEditor && isProseMirrorJSON(initialSource)) {
816
+ setEditorContent(sd.activeEditor, initialSource);
817
+ setSourceJson(initialSource);
818
+ onSourceLoaded?.(initialSource);
935
819
  }
936
- });
937
- superdocRef.current = superdoc;
820
+ } else {
821
+ setSourceJson(json);
822
+ onSourceLoaded?.(json);
823
+ }
824
+ setIsLoading(false);
825
+ onReady?.();
938
826
  } catch (err) {
939
827
  console.error("Failed to initialize SuperDoc:", err);
940
828
  handleError(err instanceof Error ? err : new Error("Failed to load editor"));
@@ -946,11 +834,10 @@ var DocxDiffEditor = react.forwardRef(
946
834
  showRulers,
947
835
  showToolbar,
948
836
  templateDocx,
949
- editorId,
950
- toolbarId,
951
837
  onReady,
952
838
  onSourceLoaded,
953
- getTemplateFile,
839
+ destroySuperdoc,
840
+ createSuperdoc,
954
841
  setEditorContent,
955
842
  handleError
956
843
  ]);
@@ -959,15 +846,9 @@ var DocxDiffEditor = react.forwardRef(
959
846
  initialize();
960
847
  return () => {
961
848
  mountedRef.current = false;
962
- if (superdocRef.current) {
963
- try {
964
- superdocRef.current.destroy?.();
965
- } catch {
966
- }
967
- superdocRef.current = null;
968
- }
849
+ destroySuperdoc();
969
850
  };
970
- }, [initialize]);
851
+ }, [initialize, destroySuperdoc]);
971
852
  react.useImperativeHandle(
972
853
  ref,
973
854
  () => ({
@@ -979,16 +860,31 @@ var DocxDiffEditor = react.forwardRef(
979
860
  throw new Error("Editor not initialized");
980
861
  }
981
862
  setIsLoading(true);
863
+ setError(null);
982
864
  try {
983
- const resolved = await resolveContent(content, SuperDocRef.current, templateDocx);
984
- setSourceJson(resolved.json);
865
+ const contentType = detectContentType(content);
866
+ let json;
867
+ destroySuperdoc();
868
+ if (contentType === "file") {
869
+ const result = await createSuperdoc({ document: content });
870
+ json = result.json;
871
+ } else if (contentType === "html") {
872
+ const result = await createSuperdoc({ html: content });
873
+ json = result.json;
874
+ } else {
875
+ const result = await createSuperdoc(templateDocx ? { document: templateDocx } : {});
876
+ if (result.superdoc?.activeEditor && isProseMirrorJSON(content)) {
877
+ setEditorContent(result.superdoc.activeEditor, content);
878
+ json = content;
879
+ } else {
880
+ json = result.json;
881
+ }
882
+ }
883
+ setSourceJson(json);
985
884
  setMergedJson(null);
986
885
  setDiffResult(null);
987
- if (superdocRef.current?.activeEditor) {
988
- setEditorContent(superdocRef.current.activeEditor, resolved.json);
989
- setEditingMode(superdocRef.current);
990
- }
991
- onSourceLoaded?.(resolved.json);
886
+ setEditingMode(superdocRef.current);
887
+ onSourceLoaded?.(json);
992
888
  } catch (err) {
993
889
  handleError(err instanceof Error ? err : new Error("Failed to set source"));
994
890
  throw err;
@@ -1008,10 +904,65 @@ var DocxDiffEditor = react.forwardRef(
1008
904
  }
1009
905
  setIsLoading(true);
1010
906
  try {
1011
- const resolved = await resolveContent(content, SuperDocRef.current, templateDocx);
1012
- const diff = diffDocuments(sourceJson, resolved.json);
907
+ const contentType = detectContentType(content);
908
+ let newJson;
909
+ if (contentType === "file") {
910
+ newJson = await parseDocxFile(content, SuperDocRef.current);
911
+ } else if (contentType === "html") {
912
+ const tempContainer = document.createElement("div");
913
+ tempContainer.style.cssText = "position:absolute;top:-9999px;left:-9999px;width:800px;height:600px;visibility:hidden;";
914
+ document.body.appendChild(tempContainer);
915
+ try {
916
+ newJson = await new Promise((resolve, reject) => {
917
+ const tempSuperdoc = new SuperDocRef.current({
918
+ selector: tempContainer,
919
+ html: content,
920
+ documentMode: "viewing",
921
+ rulers: false,
922
+ user: { name: "Parser", email: "parser@local" },
923
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
924
+ onReady: ({ superdoc: sd }) => {
925
+ try {
926
+ const json = sd?.activeEditor?.getJSON() || { type: "doc", content: [] };
927
+ setTimeout(() => {
928
+ try {
929
+ sd?.destroy?.();
930
+ } catch {
931
+ }
932
+ tempContainer.parentNode?.removeChild(tempContainer);
933
+ }, 100);
934
+ resolve(json);
935
+ } catch (err) {
936
+ reject(err);
937
+ }
938
+ },
939
+ onException: ({ error: err }) => {
940
+ tempContainer.parentNode?.removeChild(tempContainer);
941
+ reject(err);
942
+ }
943
+ });
944
+ setTimeout(() => {
945
+ try {
946
+ tempSuperdoc?.destroy?.();
947
+ } catch {
948
+ }
949
+ tempContainer.parentNode?.removeChild(tempContainer);
950
+ reject(new Error("HTML parsing timed out"));
951
+ }, TIMEOUTS.PARSE_TIMEOUT);
952
+ });
953
+ } catch (err) {
954
+ tempContainer.parentNode?.removeChild(tempContainer);
955
+ throw err;
956
+ }
957
+ } else {
958
+ if (!isProseMirrorJSON(content)) {
959
+ throw new Error("Invalid ProseMirror JSON structure");
960
+ }
961
+ newJson = content;
962
+ }
963
+ const diff = diffDocuments(sourceJson, newJson);
1013
964
  setDiffResult(diff);
1014
- const merged = mergeDocuments(sourceJson, resolved.json, diff, author);
965
+ const merged = mergeDocuments(sourceJson, newJson, diff, author);
1015
966
  setMergedJson(merged);
1016
967
  if (superdocRef.current?.activeEditor) {
1017
968
  setEditorContent(superdocRef.current.activeEditor, merged);
@@ -1104,6 +1055,8 @@ var DocxDiffEditor = react.forwardRef(
1104
1055
  diffResult,
1105
1056
  templateDocx,
1106
1057
  author,
1058
+ destroySuperdoc,
1059
+ createSuperdoc,
1107
1060
  setEditorContent,
1108
1061
  enableReviewMode,
1109
1062
  setEditingMode,
@@ -1158,6 +1111,42 @@ var DocxDiffEditor = react.forwardRef(
1158
1111
  );
1159
1112
  var DocxDiffEditor_default = DocxDiffEditor;
1160
1113
 
1114
+ // src/blankTemplate.ts
1115
+ var BLANK_DOCX_BASE64 = `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`;
1116
+ function base64ToBlob(base64, mimeType) {
1117
+ const byteCharacters = atob(base64.replace(/\s/g, ""));
1118
+ const byteNumbers = new Array(byteCharacters.length);
1119
+ for (let i = 0; i < byteCharacters.length; i++) {
1120
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
1121
+ }
1122
+ const byteArray = new Uint8Array(byteNumbers);
1123
+ return new Blob([byteArray], { type: mimeType });
1124
+ }
1125
+ function base64ToFile(base64, filename, mimeType) {
1126
+ const blob = base64ToBlob(base64, mimeType);
1127
+ return new File([blob], filename, { type: mimeType });
1128
+ }
1129
+ function getBlankTemplateFile() {
1130
+ return base64ToFile(
1131
+ BLANK_DOCX_BASE64,
1132
+ "blank-template.docx",
1133
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
1134
+ );
1135
+ }
1136
+ function getBlankTemplateBlob() {
1137
+ return base64ToBlob(
1138
+ BLANK_DOCX_BASE64,
1139
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
1140
+ );
1141
+ }
1142
+ function isValidDocxFile(file) {
1143
+ const validTypes = [
1144
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1145
+ "application/msword"
1146
+ ];
1147
+ return validTypes.includes(file.type) || file.name.endsWith(".docx");
1148
+ }
1149
+
1161
1150
  exports.CSS_PREFIX = CSS_PREFIX;
1162
1151
  exports.DEFAULT_AUTHOR = DEFAULT_AUTHOR;
1163
1152
  exports.DEFAULT_SUPERDOC_USER = DEFAULT_SUPERDOC_USER;
@@ -1175,7 +1164,5 @@ exports.isProseMirrorJSON = isProseMirrorJSON;
1175
1164
  exports.isValidDocxFile = isValidDocxFile;
1176
1165
  exports.mergeDocuments = mergeDocuments;
1177
1166
  exports.parseDocxFile = parseDocxFile;
1178
- exports.parseHtmlContent = parseHtmlContent;
1179
- exports.resolveContent = resolveContent;
1180
1167
  //# sourceMappingURL=index.js.map
1181
1168
  //# sourceMappingURL=index.js.map