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.mjs CHANGED
@@ -5,42 +5,6 @@ import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
6
6
  // src/DocxDiffEditor.tsx
7
7
 
8
- // src/blankTemplate.ts
9
- var BLANK_DOCX_BASE64 = `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`;
10
- function base64ToBlob(base64, mimeType) {
11
- const byteCharacters = atob(base64.replace(/\s/g, ""));
12
- const byteNumbers = new Array(byteCharacters.length);
13
- for (let i = 0; i < byteCharacters.length; i++) {
14
- byteNumbers[i] = byteCharacters.charCodeAt(i);
15
- }
16
- const byteArray = new Uint8Array(byteNumbers);
17
- return new Blob([byteArray], { type: mimeType });
18
- }
19
- function base64ToFile(base64, filename, mimeType) {
20
- const blob = base64ToBlob(base64, mimeType);
21
- return new File([blob], filename, { type: mimeType });
22
- }
23
- function getBlankTemplateFile() {
24
- return base64ToFile(
25
- BLANK_DOCX_BASE64,
26
- "blank-template.docx",
27
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
28
- );
29
- }
30
- function getBlankTemplateBlob() {
31
- return base64ToBlob(
32
- BLANK_DOCX_BASE64,
33
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
34
- );
35
- }
36
- function isValidDocxFile(file) {
37
- const validTypes = [
38
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
39
- "application/msword"
40
- ];
41
- return validTypes.includes(file.type) || file.name.endsWith(".docx");
42
- }
43
-
44
8
  // src/constants.ts
45
9
  var DEFAULT_AUTHOR = {
46
10
  name: "DocxDiff Editor",
@@ -151,104 +115,6 @@ async function parseDocxFile(file, SuperDoc) {
151
115
  }, 50);
152
116
  });
153
117
  }
154
- async function parseHtmlContent(html, SuperDoc, templateDocx) {
155
- const template = templateDocx || getBlankTemplateFile();
156
- const container = document.createElement("div");
157
- container.style.cssText = "position:absolute;top:-9999px;left:-9999px;width:800px;height:600px;visibility:hidden;";
158
- document.body.appendChild(container);
159
- return new Promise((resolve, reject) => {
160
- let superdoc = null;
161
- let resolved = false;
162
- const cleanup = () => {
163
- setTimeout(() => {
164
- if (superdoc) {
165
- try {
166
- const sd = superdoc;
167
- superdoc = null;
168
- sd.destroy?.();
169
- } catch {
170
- }
171
- }
172
- if (container.parentNode) {
173
- container.parentNode.removeChild(container);
174
- }
175
- }, TIMEOUTS.CLEANUP_DELAY);
176
- };
177
- setTimeout(async () => {
178
- if (resolved) return;
179
- try {
180
- superdoc = new SuperDoc({
181
- selector: container,
182
- document: template,
183
- html,
184
- // SuperDoc's HTML initialization option
185
- documentMode: "viewing",
186
- rulers: false,
187
- user: { name: "Parser", email: "parser@local" },
188
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
- onReady: ({ superdoc: sd }) => {
190
- if (resolved) return;
191
- try {
192
- const editor = sd?.activeEditor;
193
- if (!editor) {
194
- throw new Error("No active editor found");
195
- }
196
- const json = editor.getJSON();
197
- resolved = true;
198
- cleanup();
199
- resolve(json);
200
- } catch (err) {
201
- resolved = true;
202
- cleanup();
203
- reject(err);
204
- }
205
- },
206
- onException: ({ error: err }) => {
207
- if (resolved) return;
208
- resolved = true;
209
- cleanup();
210
- reject(err);
211
- }
212
- });
213
- setTimeout(() => {
214
- if (!resolved) {
215
- resolved = true;
216
- cleanup();
217
- reject(new Error("HTML parsing timed out"));
218
- }
219
- }, TIMEOUTS.PARSE_TIMEOUT);
220
- } catch (err) {
221
- cleanup();
222
- reject(err);
223
- }
224
- }, 50);
225
- });
226
- }
227
- async function resolveContent(content, SuperDoc, templateDocx) {
228
- const type = detectContentType(content);
229
- switch (type) {
230
- case "file":
231
- return {
232
- json: await parseDocxFile(content, SuperDoc),
233
- type: "file"
234
- };
235
- case "html":
236
- return {
237
- json: await parseHtmlContent(content, SuperDoc, templateDocx),
238
- type: "html"
239
- };
240
- case "json":
241
- if (!isProseMirrorJSON(content)) {
242
- throw new Error("Invalid ProseMirror JSON structure");
243
- }
244
- return {
245
- json: content,
246
- type: "json"
247
- };
248
- default:
249
- throw new Error(`Unknown content type: ${type}`);
250
- }
251
- }
252
118
  var dmp = new DiffMatchPatch();
253
119
  var DIFF_DELETE = -1;
254
120
  var DIFF_INSERT = 1;
@@ -828,12 +694,9 @@ var DocxDiffEditor = forwardRef(
828
694
  }, []);
829
695
  const setEditingMode = useCallback((sd) => {
830
696
  if (sd.setTrackedChangesPreferences) {
831
- sd.setTrackedChangesPreferences({ mode: "editing", enabled: false });
697
+ sd.setTrackedChangesPreferences({ mode: "simple", enabled: false });
832
698
  }
833
699
  }, []);
834
- const getTemplateFile = useCallback(() => {
835
- return templateDocx || getBlankTemplateFile();
836
- }, [templateDocx]);
837
700
  const handleError = useCallback(
838
701
  (err) => {
839
702
  const error2 = err instanceof Error ? err : new Error(err);
@@ -842,6 +705,72 @@ var DocxDiffEditor = forwardRef(
842
705
  },
843
706
  [onError]
844
707
  );
708
+ const destroySuperdoc = useCallback(() => {
709
+ if (superdocRef.current) {
710
+ try {
711
+ superdocRef.current.destroy?.();
712
+ } catch {
713
+ }
714
+ superdocRef.current = null;
715
+ }
716
+ readyRef.current = false;
717
+ }, []);
718
+ const createSuperdoc = useCallback(
719
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
720
+ async (options) => {
721
+ if (!SuperDocRef.current) {
722
+ throw new Error("SuperDoc not loaded");
723
+ }
724
+ if (!containerRef.current) {
725
+ throw new Error("Container not available");
726
+ }
727
+ containerRef.current.id = editorId;
728
+ if (toolbarRef.current) {
729
+ toolbarRef.current.id = toolbarId;
730
+ }
731
+ return new Promise((resolve, reject) => {
732
+ try {
733
+ const superdoc = new SuperDocRef.current({
734
+ selector: `#${editorId}`,
735
+ toolbar: showToolbar ? `#${toolbarId}` : void 0,
736
+ document: options.document,
737
+ html: options.html,
738
+ documentMode: "editing",
739
+ role: "editor",
740
+ rulers: showRulers,
741
+ user: DEFAULT_SUPERDOC_USER,
742
+ permissionResolver,
743
+ onReady: ({ superdoc: sd }) => {
744
+ superdocRef.current = sd;
745
+ readyRef.current = true;
746
+ let json = { type: "doc", content: [] };
747
+ if (sd?.activeEditor) {
748
+ try {
749
+ json = sd.activeEditor.getJSON();
750
+ } catch (err) {
751
+ console.error("Failed to extract JSON:", err);
752
+ }
753
+ }
754
+ resolve({ superdoc: sd, json });
755
+ },
756
+ onException: ({ error: err }) => {
757
+ console.error("SuperDoc error:", err);
758
+ reject(err);
759
+ }
760
+ });
761
+ superdocRef.current = superdoc;
762
+ setTimeout(() => {
763
+ if (!readyRef.current) {
764
+ reject(new Error("SuperDoc initialization timed out"));
765
+ }
766
+ }, TIMEOUTS.PARSE_TIMEOUT);
767
+ } catch (err) {
768
+ reject(err);
769
+ }
770
+ });
771
+ },
772
+ [editorId, toolbarId, showToolbar, showRulers]
773
+ );
845
774
  const initialize = useCallback(async () => {
846
775
  if (initRef.current || !containerRef.current || !mountedRef.current) return;
847
776
  if (!showToolbar && !toolbarRef.current) ; else if (showToolbar && !toolbarRef.current) {
@@ -855,78 +784,37 @@ var DocxDiffEditor = forwardRef(
855
784
  }
856
785
  setIsLoading(true);
857
786
  setError(null);
858
- if (superdocRef.current) {
859
- try {
860
- superdocRef.current.destroy?.();
861
- } catch {
862
- }
863
- superdocRef.current = null;
864
- }
865
- containerRef.current.id = editorId;
866
- if (toolbarRef.current) {
867
- toolbarRef.current.id = toolbarId;
868
- }
787
+ destroySuperdoc();
869
788
  try {
870
789
  const { SuperDoc } = await import('superdoc');
871
790
  await import('superdoc/style.css');
872
791
  SuperDocRef.current = SuperDoc;
873
- let initialDoc;
874
- let initialContent = null;
792
+ let initOptions = {};
875
793
  if (initialSource) {
876
794
  const contentType = detectContentType(initialSource);
877
795
  if (contentType === "file") {
878
- initialDoc = initialSource;
879
- } else {
880
- initialDoc = getTemplateFile();
881
- try {
882
- const resolved = await resolveContent(initialSource, SuperDoc, templateDocx);
883
- initialContent = resolved.json;
884
- } catch (err) {
885
- handleError(err instanceof Error ? err : new Error("Failed to resolve initial content"));
886
- }
796
+ initOptions = { document: initialSource };
797
+ } else if (contentType === "html") {
798
+ initOptions = { html: initialSource };
799
+ } else if (contentType === "json") {
800
+ initOptions = templateDocx ? { document: templateDocx } : {};
887
801
  }
888
- } else {
889
- initialDoc = getTemplateFile();
802
+ } else if (templateDocx) {
803
+ initOptions = { document: templateDocx };
890
804
  }
891
- const superdoc = new SuperDoc({
892
- selector: `#${editorId}`,
893
- toolbar: showToolbar ? `#${toolbarId}` : void 0,
894
- document: initialDoc,
895
- documentMode: "editing",
896
- role: "editor",
897
- rulers: showRulers,
898
- user: DEFAULT_SUPERDOC_USER,
899
- permissionResolver,
900
- onReady: ({ superdoc: sd }) => {
901
- superdocRef.current = sd;
902
- readyRef.current = true;
903
- if (initialContent && sd?.activeEditor) {
904
- try {
905
- setEditorContent(sd.activeEditor, initialContent);
906
- setSourceJson(initialContent);
907
- onSourceLoaded?.(initialContent);
908
- } catch (err) {
909
- console.error("Failed to set initial content:", err);
910
- }
911
- } else if (sd?.activeEditor) {
912
- try {
913
- const json = sd.activeEditor.getJSON();
914
- setSourceJson(json);
915
- onSourceLoaded?.(json);
916
- } catch (err) {
917
- console.error("Failed to extract JSON:", err);
918
- }
919
- }
920
- setIsLoading(false);
921
- onReady?.();
922
- },
923
- onException: ({ error: err }) => {
924
- console.error("SuperDoc error:", err);
925
- handleError(err);
926
- setIsLoading(false);
805
+ const { superdoc: sd, json } = await createSuperdoc(initOptions);
806
+ if (initialSource && detectContentType(initialSource) === "json") {
807
+ if (sd?.activeEditor && isProseMirrorJSON(initialSource)) {
808
+ setEditorContent(sd.activeEditor, initialSource);
809
+ setSourceJson(initialSource);
810
+ onSourceLoaded?.(initialSource);
927
811
  }
928
- });
929
- superdocRef.current = superdoc;
812
+ } else {
813
+ setSourceJson(json);
814
+ onSourceLoaded?.(json);
815
+ }
816
+ setIsLoading(false);
817
+ onReady?.();
930
818
  } catch (err) {
931
819
  console.error("Failed to initialize SuperDoc:", err);
932
820
  handleError(err instanceof Error ? err : new Error("Failed to load editor"));
@@ -938,11 +826,10 @@ var DocxDiffEditor = forwardRef(
938
826
  showRulers,
939
827
  showToolbar,
940
828
  templateDocx,
941
- editorId,
942
- toolbarId,
943
829
  onReady,
944
830
  onSourceLoaded,
945
- getTemplateFile,
831
+ destroySuperdoc,
832
+ createSuperdoc,
946
833
  setEditorContent,
947
834
  handleError
948
835
  ]);
@@ -951,15 +838,9 @@ var DocxDiffEditor = forwardRef(
951
838
  initialize();
952
839
  return () => {
953
840
  mountedRef.current = false;
954
- if (superdocRef.current) {
955
- try {
956
- superdocRef.current.destroy?.();
957
- } catch {
958
- }
959
- superdocRef.current = null;
960
- }
841
+ destroySuperdoc();
961
842
  };
962
- }, [initialize]);
843
+ }, [initialize, destroySuperdoc]);
963
844
  useImperativeHandle(
964
845
  ref,
965
846
  () => ({
@@ -971,16 +852,31 @@ var DocxDiffEditor = forwardRef(
971
852
  throw new Error("Editor not initialized");
972
853
  }
973
854
  setIsLoading(true);
855
+ setError(null);
974
856
  try {
975
- const resolved = await resolveContent(content, SuperDocRef.current, templateDocx);
976
- setSourceJson(resolved.json);
857
+ const contentType = detectContentType(content);
858
+ let json;
859
+ destroySuperdoc();
860
+ if (contentType === "file") {
861
+ const result = await createSuperdoc({ document: content });
862
+ json = result.json;
863
+ } else if (contentType === "html") {
864
+ const result = await createSuperdoc({ html: content });
865
+ json = result.json;
866
+ } else {
867
+ const result = await createSuperdoc(templateDocx ? { document: templateDocx } : {});
868
+ if (result.superdoc?.activeEditor && isProseMirrorJSON(content)) {
869
+ setEditorContent(result.superdoc.activeEditor, content);
870
+ json = content;
871
+ } else {
872
+ json = result.json;
873
+ }
874
+ }
875
+ setSourceJson(json);
977
876
  setMergedJson(null);
978
877
  setDiffResult(null);
979
- if (superdocRef.current?.activeEditor) {
980
- setEditorContent(superdocRef.current.activeEditor, resolved.json);
981
- setEditingMode(superdocRef.current);
982
- }
983
- onSourceLoaded?.(resolved.json);
878
+ setEditingMode(superdocRef.current);
879
+ onSourceLoaded?.(json);
984
880
  } catch (err) {
985
881
  handleError(err instanceof Error ? err : new Error("Failed to set source"));
986
882
  throw err;
@@ -1000,10 +896,65 @@ var DocxDiffEditor = forwardRef(
1000
896
  }
1001
897
  setIsLoading(true);
1002
898
  try {
1003
- const resolved = await resolveContent(content, SuperDocRef.current, templateDocx);
1004
- const diff = diffDocuments(sourceJson, resolved.json);
899
+ const contentType = detectContentType(content);
900
+ let newJson;
901
+ if (contentType === "file") {
902
+ newJson = await parseDocxFile(content, SuperDocRef.current);
903
+ } else if (contentType === "html") {
904
+ const tempContainer = document.createElement("div");
905
+ tempContainer.style.cssText = "position:absolute;top:-9999px;left:-9999px;width:800px;height:600px;visibility:hidden;";
906
+ document.body.appendChild(tempContainer);
907
+ try {
908
+ newJson = await new Promise((resolve, reject) => {
909
+ const tempSuperdoc = new SuperDocRef.current({
910
+ selector: tempContainer,
911
+ html: content,
912
+ documentMode: "viewing",
913
+ rulers: false,
914
+ user: { name: "Parser", email: "parser@local" },
915
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
916
+ onReady: ({ superdoc: sd }) => {
917
+ try {
918
+ const json = sd?.activeEditor?.getJSON() || { type: "doc", content: [] };
919
+ setTimeout(() => {
920
+ try {
921
+ sd?.destroy?.();
922
+ } catch {
923
+ }
924
+ tempContainer.parentNode?.removeChild(tempContainer);
925
+ }, 100);
926
+ resolve(json);
927
+ } catch (err) {
928
+ reject(err);
929
+ }
930
+ },
931
+ onException: ({ error: err }) => {
932
+ tempContainer.parentNode?.removeChild(tempContainer);
933
+ reject(err);
934
+ }
935
+ });
936
+ setTimeout(() => {
937
+ try {
938
+ tempSuperdoc?.destroy?.();
939
+ } catch {
940
+ }
941
+ tempContainer.parentNode?.removeChild(tempContainer);
942
+ reject(new Error("HTML parsing timed out"));
943
+ }, TIMEOUTS.PARSE_TIMEOUT);
944
+ });
945
+ } catch (err) {
946
+ tempContainer.parentNode?.removeChild(tempContainer);
947
+ throw err;
948
+ }
949
+ } else {
950
+ if (!isProseMirrorJSON(content)) {
951
+ throw new Error("Invalid ProseMirror JSON structure");
952
+ }
953
+ newJson = content;
954
+ }
955
+ const diff = diffDocuments(sourceJson, newJson);
1005
956
  setDiffResult(diff);
1006
- const merged = mergeDocuments(sourceJson, resolved.json, diff, author);
957
+ const merged = mergeDocuments(sourceJson, newJson, diff, author);
1007
958
  setMergedJson(merged);
1008
959
  if (superdocRef.current?.activeEditor) {
1009
960
  setEditorContent(superdocRef.current.activeEditor, merged);
@@ -1096,6 +1047,8 @@ var DocxDiffEditor = forwardRef(
1096
1047
  diffResult,
1097
1048
  templateDocx,
1098
1049
  author,
1050
+ destroySuperdoc,
1051
+ createSuperdoc,
1099
1052
  setEditorContent,
1100
1053
  enableReviewMode,
1101
1054
  setEditingMode,
@@ -1150,6 +1103,42 @@ var DocxDiffEditor = forwardRef(
1150
1103
  );
1151
1104
  var DocxDiffEditor_default = DocxDiffEditor;
1152
1105
 
1153
- export { CSS_PREFIX, DEFAULT_AUTHOR, DEFAULT_SUPERDOC_USER, DocxDiffEditor, createTrackDeleteMark, createTrackFormatMark, createTrackInsertMark, DocxDiffEditor_default as default, detectContentType, diffDocuments, extractEnrichedChanges, getBlankTemplateBlob, getBlankTemplateFile, isProseMirrorJSON, isValidDocxFile, mergeDocuments, parseDocxFile, parseHtmlContent, resolveContent };
1106
+ // src/blankTemplate.ts
1107
+ var BLANK_DOCX_BASE64 = `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`;
1108
+ function base64ToBlob(base64, mimeType) {
1109
+ const byteCharacters = atob(base64.replace(/\s/g, ""));
1110
+ const byteNumbers = new Array(byteCharacters.length);
1111
+ for (let i = 0; i < byteCharacters.length; i++) {
1112
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
1113
+ }
1114
+ const byteArray = new Uint8Array(byteNumbers);
1115
+ return new Blob([byteArray], { type: mimeType });
1116
+ }
1117
+ function base64ToFile(base64, filename, mimeType) {
1118
+ const blob = base64ToBlob(base64, mimeType);
1119
+ return new File([blob], filename, { type: mimeType });
1120
+ }
1121
+ function getBlankTemplateFile() {
1122
+ return base64ToFile(
1123
+ BLANK_DOCX_BASE64,
1124
+ "blank-template.docx",
1125
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
1126
+ );
1127
+ }
1128
+ function getBlankTemplateBlob() {
1129
+ return base64ToBlob(
1130
+ BLANK_DOCX_BASE64,
1131
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
1132
+ );
1133
+ }
1134
+ function isValidDocxFile(file) {
1135
+ const validTypes = [
1136
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1137
+ "application/msword"
1138
+ ];
1139
+ return validTypes.includes(file.type) || file.name.endsWith(".docx");
1140
+ }
1141
+
1142
+ export { CSS_PREFIX, DEFAULT_AUTHOR, DEFAULT_SUPERDOC_USER, DocxDiffEditor, createTrackDeleteMark, createTrackFormatMark, createTrackInsertMark, DocxDiffEditor_default as default, detectContentType, diffDocuments, extractEnrichedChanges, getBlankTemplateBlob, getBlankTemplateFile, isProseMirrorJSON, isValidDocxFile, mergeDocuments, parseDocxFile };
1154
1143
  //# sourceMappingURL=index.mjs.map
1155
1144
  //# sourceMappingURL=index.mjs.map