ai-word-editor 0.0.21 → 0.0.23
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/ai-word-editor.css +1 -1
- package/dist/index.js +9 -10
- package/dist/types/utils/saveAsBlob.d.ts +6 -0
- package/dist/types/utils/saveAsBlob.d.ts.map +1 -0
- package/dist/types/utils/wordDocxExport.d.ts.map +1 -1
- package/dist/wordDocxExport-CYxYyGfR.js +448 -0
- package/dist/wordDocxExport.js +5 -446
- package/package.json +1 -1
- package/src/App.vue +2 -2
- package/src/utils/saveAsBlob.ts +15 -0
- package/src/utils/wordDocxExport.ts +2 -10
package/dist/ai-word-editor.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.comment-panel[data-v-870abb9c]{width:280px;min-width:280px;height:100%;border-left:1px solid #e5e7eb;background:#fafafa;display:flex;flex-direction:column;overflow:hidden}.comment-panel__header[data-v-870abb9c]{padding:14px 16px 10px;border-bottom:1px solid #e5e7eb;background:#fff}.comment-panel__title[data-v-870abb9c]{margin:0;font-size:14px;font-weight:600;color:#374151;display:flex;align-items:center;gap:6px}.comment-panel__badge[data-v-870abb9c]{background:#f59e0b;color:#fff;border-radius:10px;font-size:11px;padding:1px 6px;font-weight:500}.comment-panel__empty[data-v-870abb9c]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#9ca3af;gap:4px;padding:24px;text-align:center}.comment-panel__empty p[data-v-870abb9c]{margin:0;font-size:13px}.comment-panel__empty-icon[data-v-870abb9c]{font-size:32px;margin-bottom:8px;opacity:.5}.comment-panel__empty-hint[data-v-870abb9c]{font-size:12px!important;color:#d1d5db}.comment-panel__list[data-v-870abb9c]{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:8px}.comment-item[data-v-870abb9c]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:10px 12px;cursor:pointer;transition:border-color .15s,box-shadow .15s}.comment-item[data-v-870abb9c]:hover{border-color:#fbbf24;box-shadow:0 1px 4px #fbbf2426}.comment-item--active[data-v-870abb9c]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b33}.comment-item--resolved[data-v-870abb9c]{opacity:.55}.comment-item--resolved .comment-item__note[data-v-870abb9c]{text-decoration:line-through;color:#9ca3af}.comment-item__quote[data-v-870abb9c]{font-size:12px;color:#6b7280;background:#fef9c3;border-left:3px solid #fbbf24;padding:4px 8px;border-radius:0 4px 4px 0;margin-bottom:6px;line-height:1.4}.comment-item__quote-icon[data-v-870abb9c]{color:#fbbf24;margin-right:2px}.comment-item--c0 .comment-item__quote[data-v-870abb9c]{background:#fef3c7cc;border-left-color:#f97316}.comment-item--c0 .comment-item__quote-icon[data-v-870abb9c]{color:#f97316}.comment-item--c1 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#22c55e}.comment-item--c1 .comment-item__quote-icon[data-v-870abb9c]{color:#22c55e}.comment-item--c2 .comment-item__quote[data-v-870abb9c]{background:#dbeafed9;border-left-color:#3b82f6}.comment-item--c2 .comment-item__quote-icon[data-v-870abb9c]{color:#3b82f6}.comment-item--c3 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#a855f7}.comment-item--c3 .comment-item__quote-icon[data-v-870abb9c]{color:#a855f7}.comment-item--c4 .comment-item__quote[data-v-870abb9c]{background:#fce7f3e6;border-left-color:#ec4899}.comment-item--c4 .comment-item__quote-icon[data-v-870abb9c]{color:#ec4899}.comment-item--c5 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#14b8a6}.comment-item--c5 .comment-item__quote-icon[data-v-870abb9c]{color:#14b8a6}.comment-item--c6 .comment-item__quote[data-v-870abb9c]{background:#fef9c3e6;border-left-color:#eab308}.comment-item--c6 .comment-item__quote-icon[data-v-870abb9c]{color:#eab308}.comment-item--c7 .comment-item__quote[data-v-870abb9c]{background:#ffe4e6e6;border-left-color:#f43f5e}.comment-item--c7 .comment-item__quote-icon[data-v-870abb9c]{color:#f43f5e}.comment-item--c8 .comment-item__quote[data-v-870abb9c]{background:#e0e7ffe6;border-left-color:#6366f1}.comment-item--c8 .comment-item__quote-icon[data-v-870abb9c]{color:#6366f1}.comment-item--c9 .comment-item__quote[data-v-870abb9c]{background:#ecfdc8e6;border-left-color:#84cc16}.comment-item--c9 .comment-item__quote-icon[data-v-870abb9c]{color:#84cc16}.comment-item--c10 .comment-item__quote[data-v-870abb9c]{background:#cffafee6;border-left-color:#06b6d4}.comment-item--c10 .comment-item__quote-icon[data-v-870abb9c]{color:#06b6d4}.comment-item--c11 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#10b981}.comment-item--c11 .comment-item__quote-icon[data-v-870abb9c]{color:#10b981}.comment-item--c12 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#8b5cf6}.comment-item--c12 .comment-item__quote-icon[data-v-870abb9c]{color:#8b5cf6}.comment-item--c13 .comment-item__quote[data-v-870abb9c]{background:#faf0ffe6;border-left-color:#d946ef}.comment-item--c13 .comment-item__quote-icon[data-v-870abb9c]{color:#d946ef}.comment-item--c14 .comment-item__quote[data-v-870abb9c]{background:#e0f2fee6;border-left-color:#0ea5e9}.comment-item--c14 .comment-item__quote-icon[data-v-870abb9c]{color:#0ea5e9}.comment-item--c15 .comment-item__quote[data-v-870abb9c]{background:#ffedd5e6;border-left-color:#ea580c}.comment-item--c15 .comment-item__quote-icon[data-v-870abb9c]{color:#ea580c}.comment-item--c16 .comment-item__quote[data-v-870abb9c]{background:#fefce8e6;border-left-color:#ca8a04}.comment-item--c16 .comment-item__quote-icon[data-v-870abb9c]{color:#ca8a04}.comment-item--c17 .comment-item__quote[data-v-870abb9c]{background:#fee2e2e6;border-left-color:#dc2626}.comment-item--c17 .comment-item__quote-icon[data-v-870abb9c]{color:#dc2626}.comment-item--c18 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#0d9488}.comment-item--c18 .comment-item__quote-icon[data-v-870abb9c]{color:#0d9488}.comment-item--c19 .comment-item__quote[data-v-870abb9c]{background:#f1f5f9e6;border-left-color:#64748b}.comment-item--c19 .comment-item__quote-icon[data-v-870abb9c]{color:#64748b}.comment-item__note[data-v-870abb9c]{font-size:13px;color:#374151;line-height:1.5;margin-bottom:6px;word-break:break-word}.comment-item__meta[data-v-870abb9c]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af;margin-bottom:8px}.comment-item__author[data-v-870abb9c]{font-weight:500}.comment-item__actions[data-v-870abb9c]{display:flex;gap:6px;justify-content:flex-end}.comment-btn[data-v-870abb9c]{border:none;border-radius:4px;padding:3px 8px;font-size:11px;cursor:pointer;transition:background .15s}.comment-btn--resolve[data-v-870abb9c]{background:#ecfdf5;color:#059669}.comment-btn--resolve[data-v-870abb9c]:hover{background:#d1fae5}.comment-btn--delete[data-v-870abb9c]{background:#fef2f2;color:#dc2626}.comment-btn--delete[data-v-870abb9c]:hover{background:#fee2e2}.dialog-backdrop[data-v-8cbc8293]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.dialog[data-v-8cbc8293]{background:#fff;border-radius:10px;box-shadow:0 20px 60px #00000026,0 4px 12px #00000014;width:460px;max-width:calc(100vw - 32px);overflow:hidden}.dialog__header[data-v-8cbc8293]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #e5e7eb}.dialog__title[data-v-8cbc8293]{margin:0;font-size:15px;font-weight:600;color:#111827}.dialog__close[data-v-8cbc8293]{border:none;background:none;font-size:14px;color:#9ca3af;cursor:pointer;padding:4px 6px;border-radius:4px;line-height:1}.dialog__close[data-v-8cbc8293]:hover{background:#f3f4f6;color:#374151}.dialog__quote[data-v-8cbc8293]{padding:12px 20px 0}.dialog__quote-label[data-v-8cbc8293]{font-size:11px;font-weight:500;color:#9ca3af;text-transform:uppercase;letter-spacing:.05em}.dialog__quote-text[data-v-8cbc8293]{margin:4px 0 0;padding:8px 12px;background:#fef9c3;border-left:3px solid #fbbf24;border-radius:0 4px 4px 0;font-size:13px;color:#374151;line-height:1.5}.dialog__body[data-v-8cbc8293]{padding:16px 20px 0}.dialog__label[data-v-8cbc8293]{display:block;font-size:12px;font-weight:500;color:#374151;margin-bottom:6px}.dialog__textarea[data-v-8cbc8293]{width:100%;border:1px solid #d1d5db;border-radius:6px;padding:10px 12px;font-size:14px;font-family:inherit;resize:vertical;box-sizing:border-box;transition:border-color .15s,box-shadow .15s;outline:none;color:#111827;line-height:1.5}.dialog__textarea[data-v-8cbc8293]:focus{border-color:#f59e0b;box-shadow:0 0 0 3px #f59e0b26}.dialog__hint[data-v-8cbc8293]{margin:6px 0 0;font-size:11px;color:#9ca3af}.dialog__footer[data-v-8cbc8293]{display:flex;justify-content:flex-end;gap:8px;padding:16px 20px}.dialog__btn[data-v-8cbc8293]{border:none;border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s}.dialog__btn--cancel[data-v-8cbc8293]{background:#f3f4f6;color:#374151}.dialog__btn--cancel[data-v-8cbc8293]:hover{background:#e5e7eb}.dialog__btn--confirm[data-v-8cbc8293]{background:#f59e0b;color:#fff}.dialog__btn--confirm[data-v-8cbc8293]:hover:not(:disabled){background:#d97706}.dialog__btn--confirm[data-v-8cbc8293]:disabled{opacity:.45;cursor:not-allowed}.comment-gutter[data-v-ac6164bd]{position:absolute;top:12px;right:-300px;width:280px;pointer-events:none;display:flex;flex-direction:column}.gutter-item-wrapper[data-v-ac6164bd]{pointer-events:auto}.gutter-item[data-v-ac6164bd]{position:relative;width:100%;background:#fff;border:1px solid #e5e7eb;border-left-width:4px;border-radius:8px;padding:8px 10px;box-shadow:0 8px 18px #0000000f;cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;transition:transform .12s,box-shadow .12s,border-color .12s}.gutter-item[data-v-ac6164bd]:hover{transform:translateY(-1px);box-shadow:0 10px 22px #00000014}.gutter-item--active[data-v-ac6164bd]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b38,0 10px 22px #00000014}.gutter-item--resolved[data-v-ac6164bd]{opacity:.6}.gutter-item__quote[data-v-ac6164bd]{font-size:12px;color:#6b7280;margin-bottom:4px}.gutter-item__note[data-v-ac6164bd]{font-size:13px;color:#374151;line-height:1.35;margin-bottom:6px;word-break:break-word}.gutter-item__meta[data-v-ac6164bd]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af}.gutter-item--c0[data-v-ac6164bd]{border-left-color:#f97316}.gutter-item--c1[data-v-ac6164bd]{border-left-color:#22c55e}.gutter-item--c2[data-v-ac6164bd]{border-left-color:#3b82f6}.gutter-item--c3[data-v-ac6164bd]{border-left-color:#a855f7}.gutter-item--c4[data-v-ac6164bd]{border-left-color:#ec4899}.gutter-item--c5[data-v-ac6164bd]{border-left-color:#14b8a6}.gutter-item--c6[data-v-ac6164bd]{border-left-color:#eab308}.gutter-item--c7[data-v-ac6164bd]{border-left-color:#f43f5e}.gutter-item--c8[data-v-ac6164bd]{border-left-color:#6366f1}.gutter-item--c9[data-v-ac6164bd]{border-left-color:#84cc16}.gutter-item--c10[data-v-ac6164bd]{border-left-color:#06b6d4}.gutter-item--c11[data-v-ac6164bd]{border-left-color:#10b981}.gutter-item--c12[data-v-ac6164bd]{border-left-color:#8b5cf6}.gutter-item--c13[data-v-ac6164bd]{border-left-color:#d946ef}.gutter-item--c14[data-v-ac6164bd]{border-left-color:#0ea5e9}.gutter-item--c15[data-v-ac6164bd]{border-left-color:#ea580c}.gutter-item--c16[data-v-ac6164bd]{border-left-color:#ca8a04}.gutter-item--c17[data-v-ac6164bd]{border-left-color:#dc2626}.gutter-item--c18[data-v-ac6164bd]{border-left-color:#0d9488}.gutter-item--c19[data-v-ac6164bd]{border-left-color:#64748b}.umo-editor-content table:has(colgroup[data-word-col-layout]) td,.umo-editor-content table:has(colgroup[data-word-col-layout]) th,.umo-editor-content table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}.umo-editor-content table:has(colgroup col:nth-child(2)){table-layout:fixed}.auth-page[data-v-a584dfe0]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f3f4f6}.auth-card[data-v-a584dfe0]{background:#fff;border-radius:12px;padding:40px 36px;width:340px;box-shadow:0 4px 24px #0000001a}.auth-title[data-v-a584dfe0]{font-size:20px;font-weight:700;color:#111827;text-align:center;margin:0 0 24px}.auth-tabs[data-v-a584dfe0]{display:flex;gap:0;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;margin-bottom:20px}.auth-tab[data-v-a584dfe0]{flex:1;padding:8px;border:none;background:transparent;cursor:pointer;font-size:14px;color:#6b7280;transition:background .15s,color .15s}.auth-tab--active[data-v-a584dfe0]{background:#3b82f6;color:#fff}.auth-form[data-v-a584dfe0]{display:flex;flex-direction:column;gap:12px}.auth-input[data-v-a584dfe0]{padding:10px 14px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;outline:none;transition:border-color .15s}.auth-input[data-v-a584dfe0]:focus{border-color:#3b82f6}.auth-submit[data-v-a584dfe0]{padding:10px;border:none;border-radius:8px;background:#3b82f6;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.auth-submit[data-v-a584dfe0]:hover:not(:disabled){background:#2563eb}.auth-submit[data-v-a584dfe0]:disabled{opacity:.6;cursor:not-allowed}.auth-error[data-v-a584dfe0]{color:#ef4444;font-size:13px;margin:0}.app-layout[data-v-a584dfe0]{display:flex;width:100%;height:100vh;overflow:hidden}.editor-wrapper[data-v-a584dfe0]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.comment-toolbar[data-v-a584dfe0]{display:flex;align-items:center;gap:8px;padding:8px 16px;background:#fff;border-bottom:1px solid #e5e7eb;z-index:10;flex-shrink:0}.toolbar-docname[data-v-a584dfe0]{flex:1;min-width:0}.toolbar-docname__input[data-v-a584dfe0]{width:100%;border:1px solid transparent;border-radius:4px;padding:3px 6px;font-size:14px;font-weight:600;color:#111827;background:transparent;outline:none;transition:border-color .15s,background .15s}.toolbar-docname__input[data-v-a584dfe0]:hover,.toolbar-docname__input[data-v-a584dfe0]:focus{border-color:#d1d5db;background:#f9fafb}.toolbar-docname--empty[data-v-a584dfe0]{font-size:13px;color:#9ca3af}.toolbar-actions[data-v-a584dfe0]{display:flex;gap:8px;flex-shrink:0}.toolbar-btn[data-v-a584dfe0]{display:inline-flex;align-items:center;gap:5px;border:none;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,opacity .15s}.toolbar-btn[data-v-a584dfe0]:disabled{opacity:.5;cursor:not-allowed}.toolbar-btn__icon[data-v-a584dfe0]{font-size:15px}.toolbar-btn--save[data-v-a584dfe0]{background:#d1fae5;color:#065f46}.toolbar-btn--save[data-v-a584dfe0]:hover:not(:disabled){background:#a7f3d0}.toolbar-btn--primary[data-v-a584dfe0]{background:#fef3c7;color:#92400e}.toolbar-btn--primary[data-v-a584dfe0]:hover:not(:disabled){background:#fde68a}.toolbar-btn--ai[data-v-a584dfe0]{background:#ede9fe;color:#5b21b6}.toolbar-btn--ai[data-v-a584dfe0]:hover:not(:disabled){background:#ddd6fe}.umo-editor-instance[data-v-a584dfe0]{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.umo-editor-stage[data-v-a584dfe0]{position:relative;flex:1;min-height:0;overflow:hidden}.editor-placeholder[data-v-a584dfe0]{flex:1;display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:14px}.umo-custom-huge-btn[data-v-a584dfe0]{display:inline-flex;align-items:center;justify-content:center;flex-direction:column;width:auto;height:56px;padding:0 5px;margin:0;border:none;border-radius:var(--umo-radius, 3px);background:transparent;cursor:pointer;transition:background .2s;white-space:nowrap}.umo-custom-huge-btn[data-v-a584dfe0]:hover:not(:disabled){background:var(--umo-button-hover-background, rgba(0, 0, 0, .06))}.umo-custom-huge-btn[data-v-a584dfe0]:disabled{opacity:.5;cursor:not-allowed}.umo-custom-huge-btn__icon[data-v-a584dfe0]{display:flex;align-items:center;justify-content:center;color:var(--umo-text-color, #3d3d3d);margin-top:3px}.umo-custom-huge-btn__icon svg[data-v-a584dfe0]{width:24px;height:24px}.umo-custom-huge-btn__text[data-v-a584dfe0]{display:block;font-size:12px;color:var(--umo-text-color, #3d3d3d);margin-top:2px;line-height:1.2}.html-dialog-mask[data-v-a584dfe0]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.html-dialog[data-v-a584dfe0]{background:#1e1e2e;border-radius:10px;width:min(860px,92vw);max-height:80vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0006}.html-dialog__header[data-v-a584dfe0]{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__title[data-v-a584dfe0]{font-size:14px;font-weight:600;color:#cdd6f4}.html-dialog__close[data-v-a584dfe0]{background:none;border:none;color:#6c7086;font-size:16px;cursor:pointer;padding:2px 6px;border-radius:4px;line-height:1;transition:color .15s,background .15s}.html-dialog__close[data-v-a584dfe0]:hover{color:#cdd6f4;background:#313244}.html-dialog__toolbar[data-v-a584dfe0]{display:flex;justify-content:flex-end;padding:8px 16px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__copy-btn[data-v-a584dfe0]{font-size:12px;padding:4px 14px;border-radius:5px;border:1px solid #45475a;background:#313244;color:#cdd6f4;cursor:pointer;transition:background .15s,border-color .15s}.html-dialog__copy-btn[data-v-a584dfe0]:hover{background:#45475a;border-color:#89b4fa;color:#89b4fa}.html-dialog__content[data-v-a584dfe0]{flex:1;overflow:auto;margin:0;padding:16px 20px;font-family:Fira Code,Consolas,Courier New,monospace;font-size:12.5px;line-height:1.7;color:#a6e3a1;white-space:pre-wrap;word-break:break-all}[data-v-a584dfe0] table:has(colgroup[data-word-col-layout]) td,[data-v-a584dfe0] table:has(colgroup[data-word-col-layout]) th,[data-v-a584dfe0] table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}
|
|
1
|
+
.comment-panel[data-v-870abb9c]{width:280px;min-width:280px;height:100%;border-left:1px solid #e5e7eb;background:#fafafa;display:flex;flex-direction:column;overflow:hidden}.comment-panel__header[data-v-870abb9c]{padding:14px 16px 10px;border-bottom:1px solid #e5e7eb;background:#fff}.comment-panel__title[data-v-870abb9c]{margin:0;font-size:14px;font-weight:600;color:#374151;display:flex;align-items:center;gap:6px}.comment-panel__badge[data-v-870abb9c]{background:#f59e0b;color:#fff;border-radius:10px;font-size:11px;padding:1px 6px;font-weight:500}.comment-panel__empty[data-v-870abb9c]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#9ca3af;gap:4px;padding:24px;text-align:center}.comment-panel__empty p[data-v-870abb9c]{margin:0;font-size:13px}.comment-panel__empty-icon[data-v-870abb9c]{font-size:32px;margin-bottom:8px;opacity:.5}.comment-panel__empty-hint[data-v-870abb9c]{font-size:12px!important;color:#d1d5db}.comment-panel__list[data-v-870abb9c]{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:8px}.comment-item[data-v-870abb9c]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:10px 12px;cursor:pointer;transition:border-color .15s,box-shadow .15s}.comment-item[data-v-870abb9c]:hover{border-color:#fbbf24;box-shadow:0 1px 4px #fbbf2426}.comment-item--active[data-v-870abb9c]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b33}.comment-item--resolved[data-v-870abb9c]{opacity:.55}.comment-item--resolved .comment-item__note[data-v-870abb9c]{text-decoration:line-through;color:#9ca3af}.comment-item__quote[data-v-870abb9c]{font-size:12px;color:#6b7280;background:#fef9c3;border-left:3px solid #fbbf24;padding:4px 8px;border-radius:0 4px 4px 0;margin-bottom:6px;line-height:1.4}.comment-item__quote-icon[data-v-870abb9c]{color:#fbbf24;margin-right:2px}.comment-item--c0 .comment-item__quote[data-v-870abb9c]{background:#fef3c7cc;border-left-color:#f97316}.comment-item--c0 .comment-item__quote-icon[data-v-870abb9c]{color:#f97316}.comment-item--c1 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#22c55e}.comment-item--c1 .comment-item__quote-icon[data-v-870abb9c]{color:#22c55e}.comment-item--c2 .comment-item__quote[data-v-870abb9c]{background:#dbeafed9;border-left-color:#3b82f6}.comment-item--c2 .comment-item__quote-icon[data-v-870abb9c]{color:#3b82f6}.comment-item--c3 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#a855f7}.comment-item--c3 .comment-item__quote-icon[data-v-870abb9c]{color:#a855f7}.comment-item--c4 .comment-item__quote[data-v-870abb9c]{background:#fce7f3e6;border-left-color:#ec4899}.comment-item--c4 .comment-item__quote-icon[data-v-870abb9c]{color:#ec4899}.comment-item--c5 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#14b8a6}.comment-item--c5 .comment-item__quote-icon[data-v-870abb9c]{color:#14b8a6}.comment-item--c6 .comment-item__quote[data-v-870abb9c]{background:#fef9c3e6;border-left-color:#eab308}.comment-item--c6 .comment-item__quote-icon[data-v-870abb9c]{color:#eab308}.comment-item--c7 .comment-item__quote[data-v-870abb9c]{background:#ffe4e6e6;border-left-color:#f43f5e}.comment-item--c7 .comment-item__quote-icon[data-v-870abb9c]{color:#f43f5e}.comment-item--c8 .comment-item__quote[data-v-870abb9c]{background:#e0e7ffe6;border-left-color:#6366f1}.comment-item--c8 .comment-item__quote-icon[data-v-870abb9c]{color:#6366f1}.comment-item--c9 .comment-item__quote[data-v-870abb9c]{background:#ecfdc8e6;border-left-color:#84cc16}.comment-item--c9 .comment-item__quote-icon[data-v-870abb9c]{color:#84cc16}.comment-item--c10 .comment-item__quote[data-v-870abb9c]{background:#cffafee6;border-left-color:#06b6d4}.comment-item--c10 .comment-item__quote-icon[data-v-870abb9c]{color:#06b6d4}.comment-item--c11 .comment-item__quote[data-v-870abb9c]{background:#d1fae5d9;border-left-color:#10b981}.comment-item--c11 .comment-item__quote-icon[data-v-870abb9c]{color:#10b981}.comment-item--c12 .comment-item__quote[data-v-870abb9c]{background:#ede9fee6;border-left-color:#8b5cf6}.comment-item--c12 .comment-item__quote-icon[data-v-870abb9c]{color:#8b5cf6}.comment-item--c13 .comment-item__quote[data-v-870abb9c]{background:#faf0ffe6;border-left-color:#d946ef}.comment-item--c13 .comment-item__quote-icon[data-v-870abb9c]{color:#d946ef}.comment-item--c14 .comment-item__quote[data-v-870abb9c]{background:#e0f2fee6;border-left-color:#0ea5e9}.comment-item--c14 .comment-item__quote-icon[data-v-870abb9c]{color:#0ea5e9}.comment-item--c15 .comment-item__quote[data-v-870abb9c]{background:#ffedd5e6;border-left-color:#ea580c}.comment-item--c15 .comment-item__quote-icon[data-v-870abb9c]{color:#ea580c}.comment-item--c16 .comment-item__quote[data-v-870abb9c]{background:#fefce8e6;border-left-color:#ca8a04}.comment-item--c16 .comment-item__quote-icon[data-v-870abb9c]{color:#ca8a04}.comment-item--c17 .comment-item__quote[data-v-870abb9c]{background:#fee2e2e6;border-left-color:#dc2626}.comment-item--c17 .comment-item__quote-icon[data-v-870abb9c]{color:#dc2626}.comment-item--c18 .comment-item__quote[data-v-870abb9c]{background:#ccfbf1d9;border-left-color:#0d9488}.comment-item--c18 .comment-item__quote-icon[data-v-870abb9c]{color:#0d9488}.comment-item--c19 .comment-item__quote[data-v-870abb9c]{background:#f1f5f9e6;border-left-color:#64748b}.comment-item--c19 .comment-item__quote-icon[data-v-870abb9c]{color:#64748b}.comment-item__note[data-v-870abb9c]{font-size:13px;color:#374151;line-height:1.5;margin-bottom:6px;word-break:break-word}.comment-item__meta[data-v-870abb9c]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af;margin-bottom:8px}.comment-item__author[data-v-870abb9c]{font-weight:500}.comment-item__actions[data-v-870abb9c]{display:flex;gap:6px;justify-content:flex-end}.comment-btn[data-v-870abb9c]{border:none;border-radius:4px;padding:3px 8px;font-size:11px;cursor:pointer;transition:background .15s}.comment-btn--resolve[data-v-870abb9c]{background:#ecfdf5;color:#059669}.comment-btn--resolve[data-v-870abb9c]:hover{background:#d1fae5}.comment-btn--delete[data-v-870abb9c]{background:#fef2f2;color:#dc2626}.comment-btn--delete[data-v-870abb9c]:hover{background:#fee2e2}.dialog-backdrop[data-v-8cbc8293]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.dialog[data-v-8cbc8293]{background:#fff;border-radius:10px;box-shadow:0 20px 60px #00000026,0 4px 12px #00000014;width:460px;max-width:calc(100vw - 32px);overflow:hidden}.dialog__header[data-v-8cbc8293]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #e5e7eb}.dialog__title[data-v-8cbc8293]{margin:0;font-size:15px;font-weight:600;color:#111827}.dialog__close[data-v-8cbc8293]{border:none;background:none;font-size:14px;color:#9ca3af;cursor:pointer;padding:4px 6px;border-radius:4px;line-height:1}.dialog__close[data-v-8cbc8293]:hover{background:#f3f4f6;color:#374151}.dialog__quote[data-v-8cbc8293]{padding:12px 20px 0}.dialog__quote-label[data-v-8cbc8293]{font-size:11px;font-weight:500;color:#9ca3af;text-transform:uppercase;letter-spacing:.05em}.dialog__quote-text[data-v-8cbc8293]{margin:4px 0 0;padding:8px 12px;background:#fef9c3;border-left:3px solid #fbbf24;border-radius:0 4px 4px 0;font-size:13px;color:#374151;line-height:1.5}.dialog__body[data-v-8cbc8293]{padding:16px 20px 0}.dialog__label[data-v-8cbc8293]{display:block;font-size:12px;font-weight:500;color:#374151;margin-bottom:6px}.dialog__textarea[data-v-8cbc8293]{width:100%;border:1px solid #d1d5db;border-radius:6px;padding:10px 12px;font-size:14px;font-family:inherit;resize:vertical;box-sizing:border-box;transition:border-color .15s,box-shadow .15s;outline:none;color:#111827;line-height:1.5}.dialog__textarea[data-v-8cbc8293]:focus{border-color:#f59e0b;box-shadow:0 0 0 3px #f59e0b26}.dialog__hint[data-v-8cbc8293]{margin:6px 0 0;font-size:11px;color:#9ca3af}.dialog__footer[data-v-8cbc8293]{display:flex;justify-content:flex-end;gap:8px;padding:16px 20px}.dialog__btn[data-v-8cbc8293]{border:none;border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s}.dialog__btn--cancel[data-v-8cbc8293]{background:#f3f4f6;color:#374151}.dialog__btn--cancel[data-v-8cbc8293]:hover{background:#e5e7eb}.dialog__btn--confirm[data-v-8cbc8293]{background:#f59e0b;color:#fff}.dialog__btn--confirm[data-v-8cbc8293]:hover:not(:disabled){background:#d97706}.dialog__btn--confirm[data-v-8cbc8293]:disabled{opacity:.45;cursor:not-allowed}.comment-gutter[data-v-ac6164bd]{position:absolute;top:12px;right:-300px;width:280px;pointer-events:none;display:flex;flex-direction:column}.gutter-item-wrapper[data-v-ac6164bd]{pointer-events:auto}.gutter-item[data-v-ac6164bd]{position:relative;width:100%;background:#fff;border:1px solid #e5e7eb;border-left-width:4px;border-radius:8px;padding:8px 10px;box-shadow:0 8px 18px #0000000f;cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;transition:transform .12s,box-shadow .12s,border-color .12s}.gutter-item[data-v-ac6164bd]:hover{transform:translateY(-1px);box-shadow:0 10px 22px #00000014}.gutter-item--active[data-v-ac6164bd]{border-color:#f59e0b;box-shadow:0 0 0 2px #f59e0b38,0 10px 22px #00000014}.gutter-item--resolved[data-v-ac6164bd]{opacity:.6}.gutter-item__quote[data-v-ac6164bd]{font-size:12px;color:#6b7280;margin-bottom:4px}.gutter-item__note[data-v-ac6164bd]{font-size:13px;color:#374151;line-height:1.35;margin-bottom:6px;word-break:break-word}.gutter-item__meta[data-v-ac6164bd]{display:flex;justify-content:space-between;font-size:11px;color:#9ca3af}.gutter-item--c0[data-v-ac6164bd]{border-left-color:#f97316}.gutter-item--c1[data-v-ac6164bd]{border-left-color:#22c55e}.gutter-item--c2[data-v-ac6164bd]{border-left-color:#3b82f6}.gutter-item--c3[data-v-ac6164bd]{border-left-color:#a855f7}.gutter-item--c4[data-v-ac6164bd]{border-left-color:#ec4899}.gutter-item--c5[data-v-ac6164bd]{border-left-color:#14b8a6}.gutter-item--c6[data-v-ac6164bd]{border-left-color:#eab308}.gutter-item--c7[data-v-ac6164bd]{border-left-color:#f43f5e}.gutter-item--c8[data-v-ac6164bd]{border-left-color:#6366f1}.gutter-item--c9[data-v-ac6164bd]{border-left-color:#84cc16}.gutter-item--c10[data-v-ac6164bd]{border-left-color:#06b6d4}.gutter-item--c11[data-v-ac6164bd]{border-left-color:#10b981}.gutter-item--c12[data-v-ac6164bd]{border-left-color:#8b5cf6}.gutter-item--c13[data-v-ac6164bd]{border-left-color:#d946ef}.gutter-item--c14[data-v-ac6164bd]{border-left-color:#0ea5e9}.gutter-item--c15[data-v-ac6164bd]{border-left-color:#ea580c}.gutter-item--c16[data-v-ac6164bd]{border-left-color:#ca8a04}.gutter-item--c17[data-v-ac6164bd]{border-left-color:#dc2626}.gutter-item--c18[data-v-ac6164bd]{border-left-color:#0d9488}.gutter-item--c19[data-v-ac6164bd]{border-left-color:#64748b}.umo-editor-content table:has(colgroup[data-word-col-layout]) td,.umo-editor-content table:has(colgroup[data-word-col-layout]) th,.umo-editor-content table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}.umo-editor-content table:has(colgroup col:nth-child(2)){table-layout:fixed}.auth-page[data-v-d6ad3b04]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f3f4f6}.auth-card[data-v-d6ad3b04]{background:#fff;border-radius:12px;padding:40px 36px;width:340px;box-shadow:0 4px 24px #0000001a}.auth-title[data-v-d6ad3b04]{font-size:20px;font-weight:700;color:#111827;text-align:center;margin:0 0 24px}.auth-tabs[data-v-d6ad3b04]{display:flex;gap:0;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;margin-bottom:20px}.auth-tab[data-v-d6ad3b04]{flex:1;padding:8px;border:none;background:transparent;cursor:pointer;font-size:14px;color:#6b7280;transition:background .15s,color .15s}.auth-tab--active[data-v-d6ad3b04]{background:#3b82f6;color:#fff}.auth-form[data-v-d6ad3b04]{display:flex;flex-direction:column;gap:12px}.auth-input[data-v-d6ad3b04]{padding:10px 14px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;outline:none;transition:border-color .15s}.auth-input[data-v-d6ad3b04]:focus{border-color:#3b82f6}.auth-submit[data-v-d6ad3b04]{padding:10px;border:none;border-radius:8px;background:#3b82f6;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s}.auth-submit[data-v-d6ad3b04]:hover:not(:disabled){background:#2563eb}.auth-submit[data-v-d6ad3b04]:disabled{opacity:.6;cursor:not-allowed}.auth-error[data-v-d6ad3b04]{color:#ef4444;font-size:13px;margin:0}.app-layout[data-v-d6ad3b04]{display:flex;width:100%;height:100vh;overflow:hidden}.editor-wrapper[data-v-d6ad3b04]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.comment-toolbar[data-v-d6ad3b04]{display:flex;align-items:center;gap:8px;padding:8px 16px;background:#fff;border-bottom:1px solid #e5e7eb;z-index:10;flex-shrink:0}.toolbar-docname[data-v-d6ad3b04]{flex:1;min-width:0}.toolbar-docname__input[data-v-d6ad3b04]{width:100%;border:1px solid transparent;border-radius:4px;padding:3px 6px;font-size:14px;font-weight:600;color:#111827;background:transparent;outline:none;transition:border-color .15s,background .15s}.toolbar-docname__input[data-v-d6ad3b04]:hover,.toolbar-docname__input[data-v-d6ad3b04]:focus{border-color:#d1d5db;background:#f9fafb}.toolbar-docname--empty[data-v-d6ad3b04]{font-size:13px;color:#9ca3af}.toolbar-actions[data-v-d6ad3b04]{display:flex;gap:8px;flex-shrink:0}.toolbar-btn[data-v-d6ad3b04]{display:inline-flex;align-items:center;gap:5px;border:none;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background .15s,opacity .15s}.toolbar-btn[data-v-d6ad3b04]:disabled{opacity:.5;cursor:not-allowed}.toolbar-btn__icon[data-v-d6ad3b04]{font-size:15px}.toolbar-btn--save[data-v-d6ad3b04]{background:#d1fae5;color:#065f46}.toolbar-btn--save[data-v-d6ad3b04]:hover:not(:disabled){background:#a7f3d0}.toolbar-btn--primary[data-v-d6ad3b04]{background:#fef3c7;color:#92400e}.toolbar-btn--primary[data-v-d6ad3b04]:hover:not(:disabled){background:#fde68a}.toolbar-btn--ai[data-v-d6ad3b04]{background:#ede9fe;color:#5b21b6}.toolbar-btn--ai[data-v-d6ad3b04]:hover:not(:disabled){background:#ddd6fe}.umo-editor-instance[data-v-d6ad3b04]{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.umo-editor-stage[data-v-d6ad3b04]{position:relative;flex:1;min-height:0;overflow:hidden}.editor-placeholder[data-v-d6ad3b04]{flex:1;display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:14px}.umo-custom-huge-btn[data-v-d6ad3b04]{display:inline-flex;align-items:center;justify-content:center;flex-direction:column;width:auto;height:56px;padding:0 5px;margin:0;border:none;border-radius:var(--umo-radius, 3px);background:transparent;cursor:pointer;transition:background .2s;white-space:nowrap}.umo-custom-huge-btn[data-v-d6ad3b04]:hover:not(:disabled){background:var(--umo-button-hover-background, rgba(0, 0, 0, .06))}.umo-custom-huge-btn[data-v-d6ad3b04]:disabled{opacity:.5;cursor:not-allowed}.umo-custom-huge-btn__icon[data-v-d6ad3b04]{display:flex;align-items:center;justify-content:center;color:var(--umo-text-color, #3d3d3d);margin-top:3px}.umo-custom-huge-btn__icon svg[data-v-d6ad3b04]{width:24px;height:24px}.umo-custom-huge-btn__text[data-v-d6ad3b04]{display:block;font-size:12px;color:var(--umo-text-color, #3d3d3d);margin-top:2px;line-height:1.2}.html-dialog-mask[data-v-d6ad3b04]{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:9999}.html-dialog[data-v-d6ad3b04]{background:#1e1e2e;border-radius:10px;width:min(860px,92vw);max-height:80vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0006}.html-dialog__header[data-v-d6ad3b04]{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__title[data-v-d6ad3b04]{font-size:14px;font-weight:600;color:#cdd6f4}.html-dialog__close[data-v-d6ad3b04]{background:none;border:none;color:#6c7086;font-size:16px;cursor:pointer;padding:2px 6px;border-radius:4px;line-height:1;transition:color .15s,background .15s}.html-dialog__close[data-v-d6ad3b04]:hover{color:#cdd6f4;background:#313244}.html-dialog__toolbar[data-v-d6ad3b04]{display:flex;justify-content:flex-end;padding:8px 16px;border-bottom:1px solid #313244;flex-shrink:0}.html-dialog__copy-btn[data-v-d6ad3b04]{font-size:12px;padding:4px 14px;border-radius:5px;border:1px solid #45475a;background:#313244;color:#cdd6f4;cursor:pointer;transition:background .15s,border-color .15s}.html-dialog__copy-btn[data-v-d6ad3b04]:hover{background:#45475a;border-color:#89b4fa;color:#89b4fa}.html-dialog__content[data-v-d6ad3b04]{flex:1;overflow:auto;margin:0;padding:16px 20px;font-family:Fira Code,Consolas,Courier New,monospace;font-size:12.5px;line-height:1.7;color:#a6e3a1;white-space:pre-wrap;word-break:break-all}[data-v-d6ad3b04] table:has(colgroup[data-word-col-layout]) td,[data-v-d6ad3b04] table:has(colgroup[data-word-col-layout]) th,[data-v-d6ad3b04] table:has(colgroup[data-word-col-layout]){border:none!important;outline:none!important}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { useUmoEditor as bo } from "@umoteam/editor";
|
|
2
2
|
import { ref as z, computed as Ne, openBlock as q, createElementBlock as rt, createElementVNode as y, createTextVNode as Ln, toDisplayString as Y, createCommentVNode as le, unref as oe, Fragment as pr, renderList as mr, normalizeClass as gr, onMounted as yr, createBlock as Ie, Teleport as wr, withModifiers as ze, withDirectives as vo, withKeys as hn, vModelText as So, watch as pn, normalizeStyle as Co, onUnmounted as To, resolveComponent as Ao, mergeProps as Mo, withCtx as Eo, createVNode as No, createApp as Io, h as Oo } from "vue";
|
|
3
|
-
import {
|
|
4
|
-
import { exportToDocx as Bo, exportHtmlToDocxBlob as Ro } from "./wordDocxExport.js";
|
|
3
|
+
import { e as $o, a as Bo, s as Ro } from "./wordDocxExport-CYxYyGfR.js";
|
|
5
4
|
import * as Pe from "jszip";
|
|
6
5
|
const zo = "http://localhost:8000";
|
|
7
6
|
async function Tt(r, t = {}) {
|
|
@@ -6899,7 +6898,7 @@ const ga = { class: "app-layout" }, ya = { class: "editor-wrapper" }, wa = { cla
|
|
|
6899
6898
|
}
|
|
6900
6899
|
T.value = !0;
|
|
6901
6900
|
try {
|
|
6902
|
-
await
|
|
6901
|
+
await $o(w, f.value, e.value || "文档");
|
|
6903
6902
|
} catch (C) {
|
|
6904
6903
|
console.error("导出 Word 失败:", C), alert("导出 Word 失败,请稍后重试");
|
|
6905
6904
|
} finally {
|
|
@@ -6914,8 +6913,8 @@ const ga = { class: "app-layout" }, ya = { class: "editor-wrapper" }, wa = { cla
|
|
|
6914
6913
|
}
|
|
6915
6914
|
B.value = !0;
|
|
6916
6915
|
try {
|
|
6917
|
-
const C = await
|
|
6918
|
-
|
|
6916
|
+
const C = await Bo(w, e.value || "文档");
|
|
6917
|
+
Ro(C, `${e.value || "文档"}.docx`);
|
|
6919
6918
|
} catch (C) {
|
|
6920
6919
|
console.error("Word 流导出失败:", C), alert("Word 流导出失败,请稍后重试");
|
|
6921
6920
|
} finally {
|
|
@@ -7462,16 +7461,16 @@ const ga = { class: "app-layout" }, ya = { class: "editor-wrapper" }, wa = { cla
|
|
|
7462
7461
|
]);
|
|
7463
7462
|
};
|
|
7464
7463
|
}
|
|
7465
|
-
}, za = /* @__PURE__ */ Ue(Ra, [["__scopeId", "data-v-
|
|
7466
|
-
function
|
|
7464
|
+
}, za = /* @__PURE__ */ Ue(Ra, [["__scopeId", "data-v-d6ad3b04"]]);
|
|
7465
|
+
function Da() {
|
|
7467
7466
|
}
|
|
7468
|
-
const
|
|
7467
|
+
const Ja = {
|
|
7469
7468
|
install(r, t) {
|
|
7470
7469
|
r.use(bo, t ?? {}), r.component("UmoEditorApp", za);
|
|
7471
7470
|
}
|
|
7472
7471
|
};
|
|
7473
7472
|
export {
|
|
7474
7473
|
za as UmoEditorApp,
|
|
7475
|
-
|
|
7476
|
-
|
|
7474
|
+
Ja as UmoEditorAppPlugin,
|
|
7475
|
+
Da as ensureUmoEditorGlobals
|
|
7477
7476
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saveAsBlob.d.ts","sourceRoot":"","sources":["../../../src/utils/saveAsBlob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,SAAa,GAAG,IAAI,CAUzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wordDocxExport.d.ts","sourceRoot":"","sources":["../../../src/utils/wordDocxExport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wordDocxExport.d.ts","sourceRoot":"","sources":["../../../src/utils/wordDocxExport.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAClC,YAAY;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAuBD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,SAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxF"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import * as _ from "jszip";
|
|
2
|
+
function K(o, r = "download") {
|
|
3
|
+
const t = URL.createObjectURL(o), e = document.createElement("a");
|
|
4
|
+
e.href = t, e.download = r, e.style.display = "none", document.body.appendChild(e), e.click(), document.body.removeChild(e), URL.revokeObjectURL(t);
|
|
5
|
+
}
|
|
6
|
+
const L = _.default || _;
|
|
7
|
+
async function V(o, r, t = "文档") {
|
|
8
|
+
const s = new DOMParser().parseFromString(o, "text/html"), n = /* @__PURE__ */ new Map(), l = [], w = new Map((r || []).map((v) => [v.id, v]));
|
|
9
|
+
s.body.querySelectorAll("span[data-comment-id]").forEach((v) => {
|
|
10
|
+
const a = v.getAttribute("data-comment-id");
|
|
11
|
+
if (a && w.has(a) && !n.has(a)) {
|
|
12
|
+
const u = l.length;
|
|
13
|
+
n.set(a, u), l.push({ ...w.get(a), ooxmlId: u });
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const i = U(s.body, n), m = l.length > 0, d = new L();
|
|
17
|
+
d.file("[Content_Types].xml", E(m)), d.file("_rels/.rels", W()), d.file("word/document.xml", X(i)), d.file("word/styles.xml", Z()), d.file("word/_rels/document.xml.rels", G(m)), m && d.file("word/comments.xml", wt(l));
|
|
18
|
+
const c = await d.generateAsync({
|
|
19
|
+
type: "blob",
|
|
20
|
+
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
21
|
+
});
|
|
22
|
+
K(c, `${t}.docx`);
|
|
23
|
+
}
|
|
24
|
+
async function it(o, r = "文档") {
|
|
25
|
+
return V(o, [], r);
|
|
26
|
+
}
|
|
27
|
+
async function ct(o, r = "文档") {
|
|
28
|
+
const e = new DOMParser().parseFromString(o, "text/html"), s = U(e.body, /* @__PURE__ */ new Map()), n = new L();
|
|
29
|
+
return n.file("[Content_Types].xml", E(!1)), n.file("_rels/.rels", W()), n.file("word/document.xml", X(s)), n.file("word/styles.xml", Z()), n.file("word/_rels/document.xml.rels", G(!1)), n.generateAsync({
|
|
30
|
+
type: "blob",
|
|
31
|
+
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const Y = /* @__PURE__ */ new Set(["p", "div", "h1", "h2", "h3", "h4", "h5", "h6", "li", "blockquote", "pre"]), Q = /* @__PURE__ */ new Set(["script", "style", "head"]), tt = {
|
|
35
|
+
signle: { val: "single", sz: "6" },
|
|
36
|
+
"signle-bold": { val: "thick", sz: "12" },
|
|
37
|
+
double: { val: "double", sz: "6" },
|
|
38
|
+
dotted: { val: "dotted", sz: "6" },
|
|
39
|
+
dashed: { val: "dashed", sz: "6" },
|
|
40
|
+
"dashed-double": { val: "dashSmallGap", sz: "6" },
|
|
41
|
+
"double-bold-top": { val: "thinThickSmallGap", sz: "24" },
|
|
42
|
+
"double-bold-bottom": { val: "thickThinSmallGap", sz: "24" },
|
|
43
|
+
wavy: { val: "wave", sz: "6" }
|
|
44
|
+
};
|
|
45
|
+
function U(o, r) {
|
|
46
|
+
let t = "";
|
|
47
|
+
for (const e of o.childNodes)
|
|
48
|
+
t += k(e, r);
|
|
49
|
+
return t.includes("<w:p") || (t = "<w:p><w:r><w:t></w:t></w:r></w:p>"), t;
|
|
50
|
+
}
|
|
51
|
+
function k(o, r) {
|
|
52
|
+
if (o.nodeType === 3) {
|
|
53
|
+
const n = o.textContent;
|
|
54
|
+
return !n || !n.trim() ? "" : `<w:p><w:r><w:t xml:space="preserve">${N(n)}</w:t></w:r></w:p>`;
|
|
55
|
+
}
|
|
56
|
+
if (o.nodeType !== 1) return "";
|
|
57
|
+
const t = o, e = t.tagName.toLowerCase();
|
|
58
|
+
if (Q.has(e)) return "";
|
|
59
|
+
if (Y.has(e)) {
|
|
60
|
+
const n = lt(e, t), l = S(t, r, {});
|
|
61
|
+
return e === "p" ? `<w:p>${n}${l || "<w:r><w:t></w:t></w:r>"}</w:p>` : l ? `<w:p>${n}${l}</w:p>` : "";
|
|
62
|
+
}
|
|
63
|
+
if (e === "table") {
|
|
64
|
+
const n = t.querySelector("colgroup[data-word-col-layout]"), l = t.querySelectorAll("tbody tr, tr"), w = l.length === 1, i = l[0] ? [...l[0].querySelectorAll("td, th")] : [];
|
|
65
|
+
return n || w && i.length >= 2 ? ot(t, r) : et(t, r);
|
|
66
|
+
}
|
|
67
|
+
if (["ul", "ol", "tbody", "thead", "tfoot", "tr", "td", "th"].includes(e)) {
|
|
68
|
+
let n = "";
|
|
69
|
+
for (const l of t.childNodes)
|
|
70
|
+
n += k(l, r);
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
if (e === "hr") {
|
|
74
|
+
const n = t.getAttribute("data-type") || "signle", w = (t.getAttribute("data-color") || "#000000").replace(/^#/, ""), i = tt[n] || { val: "single", sz: "6" };
|
|
75
|
+
return `<w:p><w:pPr><w:pBdr><w:bottom w:val="${i.val}" w:color="${w}" w:sz="${i.sz}" w:space="1"/></w:pBdr></w:pPr></w:p>`;
|
|
76
|
+
}
|
|
77
|
+
const s = S(t, r, {});
|
|
78
|
+
return s ? `<w:p>${s}</w:p>` : "";
|
|
79
|
+
}
|
|
80
|
+
function et(o, r) {
|
|
81
|
+
const t = o.querySelectorAll("tr");
|
|
82
|
+
if (!t.length) return "";
|
|
83
|
+
const e = o.querySelector("colgroup"), s = e ? [...e.querySelectorAll("col")] : [], n = t[0], l = n ? [...n.querySelectorAll("td, th")] : [], w = Math.max(s.length, l.length, 1), i = 8306, m = (f, b) => {
|
|
84
|
+
const h = (f && f.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
|
|
85
|
+
return h ? parseFloat(h[1]) : 100 / b;
|
|
86
|
+
}, d = Array.from({ length: w }).map((f, b) => {
|
|
87
|
+
const $ = s[b], h = m($, w);
|
|
88
|
+
return Math.round(h / 100 * i);
|
|
89
|
+
}), c = d.map((f) => `<w:gridCol w:w="${f}"/>`).join(""), v = o.getAttribute("data-word-tbl-borders");
|
|
90
|
+
let a = null;
|
|
91
|
+
if (v)
|
|
92
|
+
try {
|
|
93
|
+
const f = JSON.parse(v), b = f.val || "single", $ = f.sz || "4", h = f.color || "auto", C = f.space || "0";
|
|
94
|
+
a = `
|
|
95
|
+
<w:tblBorders>
|
|
96
|
+
<w:top w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
|
|
97
|
+
<w:left w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
|
|
98
|
+
<w:bottom w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
|
|
99
|
+
<w:right w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
|
|
100
|
+
<w:insideH w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
|
|
101
|
+
<w:insideV w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${h}"/>
|
|
102
|
+
</w:tblBorders>`;
|
|
103
|
+
} catch {
|
|
104
|
+
a = null;
|
|
105
|
+
}
|
|
106
|
+
a || (a = `
|
|
107
|
+
<w:tblBorders>
|
|
108
|
+
<w:top w:val="single" w:sz="8" w:color="000000"/>
|
|
109
|
+
<w:left w:val="single" w:sz="8" w:color="000000"/>
|
|
110
|
+
<w:bottom w:val="single" w:sz="8" w:color="000000"/>
|
|
111
|
+
<w:right w:val="single" w:sz="8" w:color="000000"/>
|
|
112
|
+
<w:insideH w:val="single" w:sz="8" w:color="000000"/>
|
|
113
|
+
<w:insideV w:val="single" w:sz="8" w:color="000000"/>
|
|
114
|
+
</w:tblBorders>`);
|
|
115
|
+
const u = `
|
|
116
|
+
<w:tblPr>
|
|
117
|
+
<w:tblW w:w="${i}" w:type="dxa"/>
|
|
118
|
+
<w:tblLayout w:type="fixed"/>${a}
|
|
119
|
+
</w:tblPr>`, p = Array(w).fill(0);
|
|
120
|
+
let z = "";
|
|
121
|
+
return t.forEach((f) => {
|
|
122
|
+
const b = [...f.querySelectorAll("td, th")];
|
|
123
|
+
if (!b.length) return;
|
|
124
|
+
const $ = [];
|
|
125
|
+
let h = 0;
|
|
126
|
+
b.forEach((A) => {
|
|
127
|
+
for (; h < w && p[h] > 0; )
|
|
128
|
+
h++;
|
|
129
|
+
const g = parseInt(A.getAttribute("colspan") ?? "", 10), y = !Number.isNaN(g) && g > 1 ? g : 1, x = parseInt(A.getAttribute("rowspan") ?? "", 10), R = !Number.isNaN(x) && x > 1 ? x : 1;
|
|
130
|
+
$.push({
|
|
131
|
+
startCol: h,
|
|
132
|
+
colspan: y,
|
|
133
|
+
rowspan: R,
|
|
134
|
+
el: A
|
|
135
|
+
}), h += y;
|
|
136
|
+
});
|
|
137
|
+
let C = "", P = 0;
|
|
138
|
+
for (; P < w; ) {
|
|
139
|
+
const A = $.find((g) => g.startCol === P);
|
|
140
|
+
if (A) {
|
|
141
|
+
const { el: g, colspan: y, rowspan: x } = A, R = y > 1, F = x > 1, D = (g.getAttribute("style") || "").match(/vertical-align\s*:\s*(top|middle|bottom)/i), q = D ? D[1].toLowerCase() : "middle", j = { top: "top", middle: "center", bottom: "bottom" };
|
|
142
|
+
let I = 0;
|
|
143
|
+
for (let T = 0; T < y; T++) {
|
|
144
|
+
const B = d[P + T];
|
|
145
|
+
I += Number.isFinite(B) ? B : Math.round(i / w);
|
|
146
|
+
}
|
|
147
|
+
const M = [];
|
|
148
|
+
if (R && M.push(`<w:gridSpan w:val="${y}"/>`), q && j[q] && M.push(`<w:vAlign w:val="${j[q]}"/>`), F) {
|
|
149
|
+
M.push('<w:vMerge w:val="restart"/>');
|
|
150
|
+
for (let T = 0; T < y; T++)
|
|
151
|
+
p[P + T] = x;
|
|
152
|
+
}
|
|
153
|
+
I > 0 && M.push(`<w:tcW w:w="${I}" w:type="dxa"/>`);
|
|
154
|
+
const J = `<w:tcPr>${M.join("")}</w:tcPr>`;
|
|
155
|
+
let H = "";
|
|
156
|
+
for (const T of g.childNodes)
|
|
157
|
+
H += k(T, r);
|
|
158
|
+
H || (H = "<w:p><w:r><w:t></w:t></w:r></w:p>"), C += `<w:tc>${J}${H}</w:tc>`, P += y;
|
|
159
|
+
} else if (p[P] > 0) {
|
|
160
|
+
let g = 0;
|
|
161
|
+
for (; P + g < w && p[P + g] > 0; )
|
|
162
|
+
g += 1;
|
|
163
|
+
const y = Math.max(g, 1);
|
|
164
|
+
let x = 0;
|
|
165
|
+
for (let O = 0; O < y; O++) {
|
|
166
|
+
const D = d[P + O];
|
|
167
|
+
x += Number.isFinite(D) ? D : Math.round(i / w);
|
|
168
|
+
}
|
|
169
|
+
const F = `<w:tcPr>${[
|
|
170
|
+
y > 1 ? `<w:gridSpan w:val="${y}"/>` : "",
|
|
171
|
+
"<w:vMerge/>",
|
|
172
|
+
'<w:vAlign w:val="center"/>',
|
|
173
|
+
x > 0 ? `<w:tcW w:w="${x}" w:type="dxa"/>` : ""
|
|
174
|
+
].filter(Boolean).join("")}</w:tcPr>`;
|
|
175
|
+
C += `<w:tc>${F}<w:p/></w:tc>`, P += y;
|
|
176
|
+
} else {
|
|
177
|
+
const g = d[P], y = Number.isFinite(g) ? g : Math.round(i / w), x = [];
|
|
178
|
+
y > 0 && x.push(`<w:tcW w:w="${y}" w:type="dxa"/>`);
|
|
179
|
+
const R = `<w:tcPr>${x.join("")}</w:tcPr>`;
|
|
180
|
+
C += `<w:tc>${R}<w:p><w:r><w:t></w:t></w:r></w:p></w:tc>`, P += 1;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
for (let A = 0; A < p.length; A++)
|
|
184
|
+
p[A] > 0 && (p[A] -= 1);
|
|
185
|
+
z += `<w:tr>${C}</w:tr>`;
|
|
186
|
+
}), z ? `<w:tbl>${u}<w:tblGrid>${c}</w:tblGrid>${z}</w:tbl>` : "";
|
|
187
|
+
}
|
|
188
|
+
function ot(o, r) {
|
|
189
|
+
const t = o.querySelector("colgroup"), e = t ? [...t.querySelectorAll("col")] : [], s = o.querySelectorAll("tbody tr, tr"), n = s[0] ? [...s[0].querySelectorAll("td, th")] : [], l = Math.max(e.length, n.length, 1), w = 8306, i = 720, m = (a) => {
|
|
190
|
+
const p = (a && a.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
|
|
191
|
+
return p ? parseFloat(p[1]) : 100 / l;
|
|
192
|
+
}, d = e.length > 0 ? e.map((a) => Math.round(m(a) / 100 * w)) : Array.from({ length: l }, () => Math.round((w - i * (l - 1)) / l));
|
|
193
|
+
let c = "";
|
|
194
|
+
n.forEach((a, u) => {
|
|
195
|
+
for (const p of a.childNodes)
|
|
196
|
+
c += k(p, r);
|
|
197
|
+
u < n.length - 1 && (c += '<w:p><w:r><w:br w:type="column"/></w:r></w:p>');
|
|
198
|
+
});
|
|
199
|
+
const v = d.map((a) => `<w:col w:w="${a}" w:space="${i}"/>`).join("");
|
|
200
|
+
return c += `<w:p><w:pPr><w:sectPr>
|
|
201
|
+
<w:cols w:num="${l}" w:space="${i}" w:equalWidth="0">${v}</w:cols>
|
|
202
|
+
<w:pgSz w:w="11906" w:h="16838"/>
|
|
203
|
+
<w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
|
|
204
|
+
</w:sectPr></w:pPr></w:p>`, c;
|
|
205
|
+
}
|
|
206
|
+
function S(o, r, t) {
|
|
207
|
+
let e = "";
|
|
208
|
+
for (const s of o.childNodes)
|
|
209
|
+
e += rt(s, r, t);
|
|
210
|
+
return e;
|
|
211
|
+
}
|
|
212
|
+
function rt(o, r, t) {
|
|
213
|
+
if (o.nodeType === 3) {
|
|
214
|
+
const n = o.textContent;
|
|
215
|
+
return n ? st(n, t) : "";
|
|
216
|
+
}
|
|
217
|
+
if (o.nodeType !== 1) return "";
|
|
218
|
+
const e = o, s = e.tagName.toLowerCase();
|
|
219
|
+
if (s === "span" && e.hasAttribute("data-comment-id")) {
|
|
220
|
+
const n = e.getAttribute("data-comment-id"), l = n !== null ? r.get(n) : void 0;
|
|
221
|
+
if (l !== void 0) {
|
|
222
|
+
const w = S(e, r, t);
|
|
223
|
+
return `<w:commentRangeStart w:id="${l}"/>` + w + `<w:commentRangeEnd w:id="${l}"/><w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="${l}"/></w:r>`;
|
|
224
|
+
}
|
|
225
|
+
return S(e, r, t);
|
|
226
|
+
}
|
|
227
|
+
if (s === "span") {
|
|
228
|
+
const n = nt(e, t);
|
|
229
|
+
return S(e, r, n);
|
|
230
|
+
}
|
|
231
|
+
return s === "strong" || s === "b" ? S(e, r, { ...t, bold: !0 }) : s === "em" || s === "i" ? S(e, r, { ...t, italic: !0 }) : s === "u" ? S(e, r, { ...t, underline: !0 }) : s === "s" || s === "del" || s === "strike" ? S(e, r, { ...t, strike: !0 }) : s === "br" ? "<w:r><w:br/></w:r>" : S(e, r, t);
|
|
232
|
+
}
|
|
233
|
+
function nt(o, r) {
|
|
234
|
+
const t = o.getAttribute("style") || "", e = t.match(/font-family\s*:\s*([^;]+)/i), s = e ? e[1].trim().replace(/["']/g, "") : null, n = t.match(/font-size\s*:\s*([\d.]+)(px|pt)/i);
|
|
235
|
+
let l = null;
|
|
236
|
+
if (n) {
|
|
237
|
+
const m = parseFloat(n[1]);
|
|
238
|
+
l = n[2].toLowerCase() === "pt" ? Math.round(m * 2) : Math.round(m * 1.5);
|
|
239
|
+
}
|
|
240
|
+
const w = t.match(/(?:^|;)\s*color\s*:\s*([^;]+)/i), i = w ? at(w[1].trim()) : null;
|
|
241
|
+
return {
|
|
242
|
+
...r,
|
|
243
|
+
bold: r.bold || /font-weight\s*:\s*(bold|[789]\d\d)/i.test(t),
|
|
244
|
+
italic: r.italic || /font-style\s*:\s*italic/i.test(t),
|
|
245
|
+
underline: r.underline || /text-decoration[^;]*underline/i.test(t),
|
|
246
|
+
strike: r.strike || /text-decoration[^;]*line-through/i.test(t),
|
|
247
|
+
fontFamily: s || r.fontFamily,
|
|
248
|
+
fontSize: l ?? r.fontSize,
|
|
249
|
+
color: i || r.color,
|
|
250
|
+
// 从导入阶段保留下来的语言 / 拼写检查标记(data-word-*)
|
|
251
|
+
lang: o.getAttribute("data-word-lang") || r.lang || null,
|
|
252
|
+
langEastAsia: o.getAttribute("data-word-lang-eastAsia") || // 兼容一下大小写差异
|
|
253
|
+
o.getAttribute("data-word-lang-eastasia") || r.langEastAsia || null,
|
|
254
|
+
noProof: o.hasAttribute("data-word-no-proof") ? o.getAttribute("data-word-no-proof") !== "0" && o.getAttribute("data-word-no-proof") !== "false" : r.noProof
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function st(o, { bold: r, italic: t, underline: e, strike: s, fontFamily: n, fontSize: l, color: w, lang: i, langEastAsia: m, noProof: d } = {}) {
|
|
258
|
+
let c = "";
|
|
259
|
+
if (n) {
|
|
260
|
+
const a = N(n);
|
|
261
|
+
c += `<w:rFonts w:ascii="${a}" w:eastAsia="${a}" w:hAnsi="${a}" w:cs="${a}"/>`;
|
|
262
|
+
}
|
|
263
|
+
if (l && (c += `<w:sz w:val="${l}"/><w:szCs w:val="${l}"/>`), w && (c += `<w:color w:val="${w}"/>`), r && (c += "<w:b/><w:bCs/>"), t && (c += "<w:i/><w:iCs/>"), e && (c += '<w:u w:val="single"/>'), s && (c += "<w:strike/>"), i || m) {
|
|
264
|
+
const a = [];
|
|
265
|
+
i && a.push(`w:val="${N(i)}"`), m && a.push(`w:eastAsia="${N(m)}"`), c += `<w:lang ${a.join(" ")}/>`;
|
|
266
|
+
}
|
|
267
|
+
return d && (c += "<w:noProof/>"), `<w:r>${c ? `<w:rPr>${c}</w:rPr>` : ""}<w:t xml:space="preserve">${N(o)}</w:t></w:r>`;
|
|
268
|
+
}
|
|
269
|
+
function lt(o, r) {
|
|
270
|
+
let t = "";
|
|
271
|
+
const e = { h1: "Heading1", h2: "Heading2", h3: "Heading3", h4: "Heading4", h5: "Heading5", h6: "Heading6" };
|
|
272
|
+
e[o] && (t += `<w:pStyle w:val="${e[o]}"/>`), (o === "li" || o === "blockquote" || o === "pre") && (t = '<w:ind w:left="720"/>');
|
|
273
|
+
const s = r.getAttribute("style") || "", n = r.closest ? r.closest("td,th") : null, l = n && n.getAttribute("style") || "", w = (r.getAttribute("align") || n?.getAttribute("align") || "").toLowerCase(), i = s.match(/text-align\s*:\s*(left|center|right|justify)/i) || l.match(/text-align\s*:\s*(left|center|right|justify)/i), m = { left: "left", center: "center", right: "right", justify: "both" };
|
|
274
|
+
i ? t += `<w:jc w:val="${m[i[1].toLowerCase()]}"/>` : w && m[w] && (t += `<w:jc w:val="${m[w]}"/>`);
|
|
275
|
+
const d = s.match(/line-height\s*:\s*([^;]+)/i), c = s.match(/margin-top\s*:\s*([\d.]+)px/i), v = s.match(/margin-bottom\s*:\s*([\d.]+)px/i);
|
|
276
|
+
let a = "";
|
|
277
|
+
if (d) {
|
|
278
|
+
const u = d[1].trim(), p = parseFloat(u);
|
|
279
|
+
if (!Number.isNaN(p) && p > 0.25 && p < 4) {
|
|
280
|
+
const z = Math.round(p * 240);
|
|
281
|
+
a += ` w:line="${z}" w:lineRule="auto"`;
|
|
282
|
+
} else {
|
|
283
|
+
const z = u.match(/([\d.]+)px/i);
|
|
284
|
+
if (z) {
|
|
285
|
+
const f = parseFloat(z[1]);
|
|
286
|
+
if (!Number.isNaN(f) && f > 0) {
|
|
287
|
+
const b = Math.round(f * 15);
|
|
288
|
+
a += ` w:line="${b}" w:lineRule="exact"`;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (c) {
|
|
294
|
+
const u = parseFloat(c[1]);
|
|
295
|
+
if (!Number.isNaN(u) && u > 0) {
|
|
296
|
+
const p = Math.round(u * 15);
|
|
297
|
+
a += ` w:before="${p}"`;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (v) {
|
|
301
|
+
const u = parseFloat(v[1]);
|
|
302
|
+
if (!Number.isNaN(u) && u > 0) {
|
|
303
|
+
const p = Math.round(u * 15);
|
|
304
|
+
a += ` w:after="${p}"`;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return a && (t += `<w:spacing${a}/>`), t ? `<w:pPr>${t}</w:pPr>` : "";
|
|
308
|
+
}
|
|
309
|
+
function N(o) {
|
|
310
|
+
return String(o).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
311
|
+
}
|
|
312
|
+
function at(o) {
|
|
313
|
+
if (!o || typeof o != "string") return null;
|
|
314
|
+
const r = o.trim();
|
|
315
|
+
if (/^#[0-9a-f]{3,6}$/i.test(r)) {
|
|
316
|
+
let e = r.slice(1);
|
|
317
|
+
return e.length === 3 && (e = e.split("").map((s) => s + s).join("")), e.toUpperCase();
|
|
318
|
+
}
|
|
319
|
+
const t = r.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);
|
|
320
|
+
return t ? [t[1], t[2], t[3]].map((e) => (+e).toString(16).padStart(2, "0")).join("").toUpperCase() : null;
|
|
321
|
+
}
|
|
322
|
+
function E(o) {
|
|
323
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
324
|
+
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
|
325
|
+
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
|
|
326
|
+
<Default Extension="xml" ContentType="application/xml"/>
|
|
327
|
+
<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
|
|
328
|
+
<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>${o ? `
|
|
329
|
+
<Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>` : ""}
|
|
330
|
+
</Types>`;
|
|
331
|
+
}
|
|
332
|
+
function W() {
|
|
333
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
334
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
335
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
|
|
336
|
+
</Relationships>`;
|
|
337
|
+
}
|
|
338
|
+
function G(o) {
|
|
339
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
340
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
341
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>${o ? `
|
|
342
|
+
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/>` : ""}
|
|
343
|
+
</Relationships>`;
|
|
344
|
+
}
|
|
345
|
+
function X(o) {
|
|
346
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
347
|
+
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
|
|
348
|
+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
349
|
+
xmlns:o="urn:schemas-microsoft-com:office:office"
|
|
350
|
+
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
|
351
|
+
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
|
352
|
+
xmlns:v="urn:schemas-microsoft-com:vml"
|
|
353
|
+
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
|
354
|
+
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
355
|
+
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
|
|
356
|
+
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
|
|
357
|
+
mc:Ignorable="w14 w15">
|
|
358
|
+
<w:body>
|
|
359
|
+
${o}
|
|
360
|
+
<w:sectPr>
|
|
361
|
+
<w:pgSz w:w="11906" w:h="16838"/>
|
|
362
|
+
<w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
|
|
363
|
+
</w:sectPr>
|
|
364
|
+
</w:body>
|
|
365
|
+
</w:document>`;
|
|
366
|
+
}
|
|
367
|
+
function wt(o) {
|
|
368
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
369
|
+
<w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
370
|
+
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
371
|
+
${o.map(({ ooxmlId: t, author: e, createdAt: s, note: n }) => {
|
|
372
|
+
const l = N(String(e || "作者")), w = N(String(e || "作").charAt(0)), i = s ? new Date(s).toISOString().slice(0, 19) + "Z" : (/* @__PURE__ */ new Date()).toISOString().slice(0, 19) + "Z", m = N(String(n || ""));
|
|
373
|
+
return ` <w:comment w:id="${t}" w:author="${l}" w:date="${i}" w:initials="${w}">
|
|
374
|
+
<w:p>
|
|
375
|
+
<w:pPr><w:pStyle w:val="CommentText"/></w:pPr>
|
|
376
|
+
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:annotationRef/></w:r>
|
|
377
|
+
<w:r><w:t>${m}</w:t></w:r>
|
|
378
|
+
</w:p>
|
|
379
|
+
</w:comment>`;
|
|
380
|
+
}).join(`
|
|
381
|
+
`)}
|
|
382
|
+
</w:comments>`;
|
|
383
|
+
}
|
|
384
|
+
function Z() {
|
|
385
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
386
|
+
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
387
|
+
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
388
|
+
<w:docDefaults>
|
|
389
|
+
<w:rPrDefault>
|
|
390
|
+
<w:rPr>
|
|
391
|
+
<w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体" w:cs="宋体"/>
|
|
392
|
+
<w:sz w:val="24"/>
|
|
393
|
+
<w:szCs w:val="24"/>
|
|
394
|
+
<w:lang w:val="zh-CN" w:eastAsia="zh-CN" w:bidi="zh-CN"/>
|
|
395
|
+
</w:rPr>
|
|
396
|
+
</w:rPrDefault>
|
|
397
|
+
</w:docDefaults>
|
|
398
|
+
<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
|
|
399
|
+
<w:name w:val="Normal"/>
|
|
400
|
+
<w:qFormat/>
|
|
401
|
+
</w:style>
|
|
402
|
+
<w:style w:type="paragraph" w:styleId="Heading1">
|
|
403
|
+
<w:name w:val="heading 1"/>
|
|
404
|
+
<w:basedOn w:val="Normal"/>
|
|
405
|
+
<w:rPr><w:b/><w:sz w:val="40"/></w:rPr>
|
|
406
|
+
</w:style>
|
|
407
|
+
<w:style w:type="paragraph" w:styleId="Heading2">
|
|
408
|
+
<w:name w:val="heading 2"/>
|
|
409
|
+
<w:basedOn w:val="Normal"/>
|
|
410
|
+
<w:rPr><w:b/><w:sz w:val="32"/></w:rPr>
|
|
411
|
+
</w:style>
|
|
412
|
+
<w:style w:type="paragraph" w:styleId="Heading3">
|
|
413
|
+
<w:name w:val="heading 3"/>
|
|
414
|
+
<w:basedOn w:val="Normal"/>
|
|
415
|
+
<w:rPr><w:b/><w:sz w:val="28"/></w:rPr>
|
|
416
|
+
</w:style>
|
|
417
|
+
<w:style w:type="paragraph" w:styleId="Heading4">
|
|
418
|
+
<w:name w:val="heading 4"/>
|
|
419
|
+
<w:basedOn w:val="Normal"/>
|
|
420
|
+
<w:rPr><w:b/><w:sz w:val="26"/></w:rPr>
|
|
421
|
+
</w:style>
|
|
422
|
+
<w:style w:type="paragraph" w:styleId="Heading5">
|
|
423
|
+
<w:name w:val="heading 5"/>
|
|
424
|
+
<w:basedOn w:val="Normal"/>
|
|
425
|
+
<w:rPr><w:b/><w:sz w:val="24"/></w:rPr>
|
|
426
|
+
</w:style>
|
|
427
|
+
<w:style w:type="paragraph" w:styleId="Heading6">
|
|
428
|
+
<w:name w:val="heading 6"/>
|
|
429
|
+
<w:basedOn w:val="Normal"/>
|
|
430
|
+
<w:rPr><w:sz w:val="24"/></w:rPr>
|
|
431
|
+
</w:style>
|
|
432
|
+
<w:style w:type="paragraph" w:styleId="CommentText">
|
|
433
|
+
<w:name w:val="annotation text"/>
|
|
434
|
+
<w:basedOn w:val="Normal"/>
|
|
435
|
+
<w:rPr><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr>
|
|
436
|
+
</w:style>
|
|
437
|
+
<w:style w:type="character" w:styleId="CommentReference">
|
|
438
|
+
<w:name w:val="annotation reference"/>
|
|
439
|
+
<w:rPr><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr>
|
|
440
|
+
</w:style>
|
|
441
|
+
</w:styles>`;
|
|
442
|
+
}
|
|
443
|
+
export {
|
|
444
|
+
ct as a,
|
|
445
|
+
it as b,
|
|
446
|
+
V as e,
|
|
447
|
+
K as s
|
|
448
|
+
};
|
package/dist/wordDocxExport.js
CHANGED
|
@@ -1,448 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
const W = L.default || L, V = (
|
|
4
|
-
// ESM 构建下常见:具名导出 saveAs
|
|
5
|
-
k.saveAs || // UMD / default 导出下可能直接是函数
|
|
6
|
-
k.default || k
|
|
7
|
-
);
|
|
8
|
-
async function Y(e, o, t = "文档") {
|
|
9
|
-
const s = new DOMParser().parseFromString(e, "text/html"), n = /* @__PURE__ */ new Map(), l = [], w = new Map((o || []).map((v) => [v.id, v]));
|
|
10
|
-
s.body.querySelectorAll("span[data-comment-id]").forEach((v) => {
|
|
11
|
-
const a = v.getAttribute("data-comment-id");
|
|
12
|
-
if (a && w.has(a) && !n.has(a)) {
|
|
13
|
-
const u = l.length;
|
|
14
|
-
n.set(a, u), l.push({ ...w.get(a), ooxmlId: u });
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
const i = E(s.body, n), m = l.length > 0, d = new W();
|
|
18
|
-
d.file("[Content_Types].xml", G(m)), d.file("_rels/.rels", U()), d.file("word/document.xml", Z(i)), d.file("word/styles.xml", J()), d.file("word/_rels/document.xml.rels", X(m)), m && d.file("word/comments.xml", it(l));
|
|
19
|
-
const c = await d.generateAsync({
|
|
20
|
-
type: "blob",
|
|
21
|
-
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
22
|
-
});
|
|
23
|
-
V(c, `${t}.docx`);
|
|
24
|
-
}
|
|
25
|
-
async function ct(e, o = "文档") {
|
|
26
|
-
return Y(e, [], o);
|
|
27
|
-
}
|
|
28
|
-
async function mt(e, o = "文档") {
|
|
29
|
-
const r = new DOMParser().parseFromString(e, "text/html"), s = E(r.body, /* @__PURE__ */ new Map()), n = new W();
|
|
30
|
-
return n.file("[Content_Types].xml", G(!1)), n.file("_rels/.rels", U()), n.file("word/document.xml", Z(s)), n.file("word/styles.xml", J()), n.file("word/_rels/document.xml.rels", X(!1)), n.generateAsync({
|
|
31
|
-
type: "blob",
|
|
32
|
-
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
const Q = /* @__PURE__ */ new Set(["p", "div", "h1", "h2", "h3", "h4", "h5", "h6", "li", "blockquote", "pre"]), tt = /* @__PURE__ */ new Set(["script", "style", "head"]), et = {
|
|
36
|
-
signle: { val: "single", sz: "6" },
|
|
37
|
-
"signle-bold": { val: "thick", sz: "12" },
|
|
38
|
-
double: { val: "double", sz: "6" },
|
|
39
|
-
dotted: { val: "dotted", sz: "6" },
|
|
40
|
-
dashed: { val: "dashed", sz: "6" },
|
|
41
|
-
"dashed-double": { val: "dashSmallGap", sz: "6" },
|
|
42
|
-
"double-bold-top": { val: "thinThickSmallGap", sz: "24" },
|
|
43
|
-
"double-bold-bottom": { val: "thickThinSmallGap", sz: "24" },
|
|
44
|
-
wavy: { val: "wave", sz: "6" }
|
|
45
|
-
};
|
|
46
|
-
function E(e, o) {
|
|
47
|
-
let t = "";
|
|
48
|
-
for (const r of e.childNodes)
|
|
49
|
-
t += q(r, o);
|
|
50
|
-
return t.includes("<w:p") || (t = "<w:p><w:r><w:t></w:t></w:r></w:p>"), t;
|
|
51
|
-
}
|
|
52
|
-
function q(e, o) {
|
|
53
|
-
if (e.nodeType === 3) {
|
|
54
|
-
const n = e.textContent;
|
|
55
|
-
return !n || !n.trim() ? "" : `<w:p><w:r><w:t xml:space="preserve">${N(n)}</w:t></w:r></w:p>`;
|
|
56
|
-
}
|
|
57
|
-
if (e.nodeType !== 1) return "";
|
|
58
|
-
const t = e, r = t.tagName.toLowerCase();
|
|
59
|
-
if (tt.has(r)) return "";
|
|
60
|
-
if (Q.has(r)) {
|
|
61
|
-
const n = at(r, t), l = S(t, o, {});
|
|
62
|
-
return r === "p" ? `<w:p>${n}${l || "<w:r><w:t></w:t></w:r>"}</w:p>` : l ? `<w:p>${n}${l}</w:p>` : "";
|
|
63
|
-
}
|
|
64
|
-
if (r === "table") {
|
|
65
|
-
const n = t.querySelector("colgroup[data-word-col-layout]"), l = t.querySelectorAll("tbody tr, tr"), w = l.length === 1, i = l[0] ? [...l[0].querySelectorAll("td, th")] : [];
|
|
66
|
-
return n || w && i.length >= 2 ? rt(t, o) : ot(t, o);
|
|
67
|
-
}
|
|
68
|
-
if (["ul", "ol", "tbody", "thead", "tfoot", "tr", "td", "th"].includes(r)) {
|
|
69
|
-
let n = "";
|
|
70
|
-
for (const l of t.childNodes)
|
|
71
|
-
n += q(l, o);
|
|
72
|
-
return n;
|
|
73
|
-
}
|
|
74
|
-
if (r === "hr") {
|
|
75
|
-
const n = t.getAttribute("data-type") || "signle", w = (t.getAttribute("data-color") || "#000000").replace(/^#/, ""), i = et[n] || { val: "single", sz: "6" };
|
|
76
|
-
return `<w:p><w:pPr><w:pBdr><w:bottom w:val="${i.val}" w:color="${w}" w:sz="${i.sz}" w:space="1"/></w:pBdr></w:pPr></w:p>`;
|
|
77
|
-
}
|
|
78
|
-
const s = S(t, o, {});
|
|
79
|
-
return s ? `<w:p>${s}</w:p>` : "";
|
|
80
|
-
}
|
|
81
|
-
function ot(e, o) {
|
|
82
|
-
const t = e.querySelectorAll("tr");
|
|
83
|
-
if (!t.length) return "";
|
|
84
|
-
const r = e.querySelector("colgroup"), s = r ? [...r.querySelectorAll("col")] : [], n = t[0], l = n ? [...n.querySelectorAll("td, th")] : [], w = Math.max(s.length, l.length, 1), i = 8306, m = (h, b) => {
|
|
85
|
-
const f = (h && h.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
|
|
86
|
-
return f ? parseFloat(f[1]) : 100 / b;
|
|
87
|
-
}, d = Array.from({ length: w }).map((h, b) => {
|
|
88
|
-
const $ = s[b], f = m($, w);
|
|
89
|
-
return Math.round(f / 100 * i);
|
|
90
|
-
}), c = d.map((h) => `<w:gridCol w:w="${h}"/>`).join(""), v = e.getAttribute("data-word-tbl-borders");
|
|
91
|
-
let a = null;
|
|
92
|
-
if (v)
|
|
93
|
-
try {
|
|
94
|
-
const h = JSON.parse(v), b = h.val || "single", $ = h.sz || "4", f = h.color || "auto", C = h.space || "0";
|
|
95
|
-
a = `
|
|
96
|
-
<w:tblBorders>
|
|
97
|
-
<w:top w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
|
|
98
|
-
<w:left w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
|
|
99
|
-
<w:bottom w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
|
|
100
|
-
<w:right w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
|
|
101
|
-
<w:insideH w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
|
|
102
|
-
<w:insideV w:val="${b}" w:sz="${$}" w:space="${C}" w:color="${f}"/>
|
|
103
|
-
</w:tblBorders>`;
|
|
104
|
-
} catch {
|
|
105
|
-
a = null;
|
|
106
|
-
}
|
|
107
|
-
a || (a = `
|
|
108
|
-
<w:tblBorders>
|
|
109
|
-
<w:top w:val="single" w:sz="8" w:color="000000"/>
|
|
110
|
-
<w:left w:val="single" w:sz="8" w:color="000000"/>
|
|
111
|
-
<w:bottom w:val="single" w:sz="8" w:color="000000"/>
|
|
112
|
-
<w:right w:val="single" w:sz="8" w:color="000000"/>
|
|
113
|
-
<w:insideH w:val="single" w:sz="8" w:color="000000"/>
|
|
114
|
-
<w:insideV w:val="single" w:sz="8" w:color="000000"/>
|
|
115
|
-
</w:tblBorders>`);
|
|
116
|
-
const u = `
|
|
117
|
-
<w:tblPr>
|
|
118
|
-
<w:tblW w:w="${i}" w:type="dxa"/>
|
|
119
|
-
<w:tblLayout w:type="fixed"/>${a}
|
|
120
|
-
</w:tblPr>`, p = Array(w).fill(0);
|
|
121
|
-
let z = "";
|
|
122
|
-
return t.forEach((h) => {
|
|
123
|
-
const b = [...h.querySelectorAll("td, th")];
|
|
124
|
-
if (!b.length) return;
|
|
125
|
-
const $ = [];
|
|
126
|
-
let f = 0;
|
|
127
|
-
b.forEach((A) => {
|
|
128
|
-
for (; f < w && p[f] > 0; )
|
|
129
|
-
f++;
|
|
130
|
-
const g = parseInt(A.getAttribute("colspan") ?? "", 10), y = !Number.isNaN(g) && g > 1 ? g : 1, x = parseInt(A.getAttribute("rowspan") ?? "", 10), R = !Number.isNaN(x) && x > 1 ? x : 1;
|
|
131
|
-
$.push({
|
|
132
|
-
startCol: f,
|
|
133
|
-
colspan: y,
|
|
134
|
-
rowspan: R,
|
|
135
|
-
el: A
|
|
136
|
-
}), f += y;
|
|
137
|
-
});
|
|
138
|
-
let C = "", P = 0;
|
|
139
|
-
for (; P < w; ) {
|
|
140
|
-
const A = $.find((g) => g.startCol === P);
|
|
141
|
-
if (A) {
|
|
142
|
-
const { el: g, colspan: y, rowspan: x } = A, R = y > 1, F = x > 1, D = (g.getAttribute("style") || "").match(/vertical-align\s*:\s*(top|middle|bottom)/i), I = D ? D[1].toLowerCase() : "middle", B = { top: "top", middle: "center", bottom: "bottom" };
|
|
143
|
-
let _ = 0;
|
|
144
|
-
for (let T = 0; T < y; T++) {
|
|
145
|
-
const j = d[P + T];
|
|
146
|
-
_ += Number.isFinite(j) ? j : Math.round(i / w);
|
|
147
|
-
}
|
|
148
|
-
const M = [];
|
|
149
|
-
if (R && M.push(`<w:gridSpan w:val="${y}"/>`), I && B[I] && M.push(`<w:vAlign w:val="${B[I]}"/>`), F) {
|
|
150
|
-
M.push('<w:vMerge w:val="restart"/>');
|
|
151
|
-
for (let T = 0; T < y; T++)
|
|
152
|
-
p[P + T] = x;
|
|
153
|
-
}
|
|
154
|
-
_ > 0 && M.push(`<w:tcW w:w="${_}" w:type="dxa"/>`);
|
|
155
|
-
const K = `<w:tcPr>${M.join("")}</w:tcPr>`;
|
|
156
|
-
let H = "";
|
|
157
|
-
for (const T of g.childNodes)
|
|
158
|
-
H += q(T, o);
|
|
159
|
-
H || (H = "<w:p><w:r><w:t></w:t></w:r></w:p>"), C += `<w:tc>${K}${H}</w:tc>`, P += y;
|
|
160
|
-
} else if (p[P] > 0) {
|
|
161
|
-
let g = 0;
|
|
162
|
-
for (; P + g < w && p[P + g] > 0; )
|
|
163
|
-
g += 1;
|
|
164
|
-
const y = Math.max(g, 1);
|
|
165
|
-
let x = 0;
|
|
166
|
-
for (let O = 0; O < y; O++) {
|
|
167
|
-
const D = d[P + O];
|
|
168
|
-
x += Number.isFinite(D) ? D : Math.round(i / w);
|
|
169
|
-
}
|
|
170
|
-
const F = `<w:tcPr>${[
|
|
171
|
-
y > 1 ? `<w:gridSpan w:val="${y}"/>` : "",
|
|
172
|
-
"<w:vMerge/>",
|
|
173
|
-
'<w:vAlign w:val="center"/>',
|
|
174
|
-
x > 0 ? `<w:tcW w:w="${x}" w:type="dxa"/>` : ""
|
|
175
|
-
].filter(Boolean).join("")}</w:tcPr>`;
|
|
176
|
-
C += `<w:tc>${F}<w:p/></w:tc>`, P += y;
|
|
177
|
-
} else {
|
|
178
|
-
const g = d[P], y = Number.isFinite(g) ? g : Math.round(i / w), x = [];
|
|
179
|
-
y > 0 && x.push(`<w:tcW w:w="${y}" w:type="dxa"/>`);
|
|
180
|
-
const R = `<w:tcPr>${x.join("")}</w:tcPr>`;
|
|
181
|
-
C += `<w:tc>${R}<w:p><w:r><w:t></w:t></w:r></w:p></w:tc>`, P += 1;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
for (let A = 0; A < p.length; A++)
|
|
185
|
-
p[A] > 0 && (p[A] -= 1);
|
|
186
|
-
z += `<w:tr>${C}</w:tr>`;
|
|
187
|
-
}), z ? `<w:tbl>${u}<w:tblGrid>${c}</w:tblGrid>${z}</w:tbl>` : "";
|
|
188
|
-
}
|
|
189
|
-
function rt(e, o) {
|
|
190
|
-
const t = e.querySelector("colgroup"), r = t ? [...t.querySelectorAll("col")] : [], s = e.querySelectorAll("tbody tr, tr"), n = s[0] ? [...s[0].querySelectorAll("td, th")] : [], l = Math.max(r.length, n.length, 1), w = 8306, i = 720, m = (a) => {
|
|
191
|
-
const p = (a && a.getAttribute("style") || "").match(/width\s*:\s*([\d.]+)%/);
|
|
192
|
-
return p ? parseFloat(p[1]) : 100 / l;
|
|
193
|
-
}, d = r.length > 0 ? r.map((a) => Math.round(m(a) / 100 * w)) : Array.from({ length: l }, () => Math.round((w - i * (l - 1)) / l));
|
|
194
|
-
let c = "";
|
|
195
|
-
n.forEach((a, u) => {
|
|
196
|
-
for (const p of a.childNodes)
|
|
197
|
-
c += q(p, o);
|
|
198
|
-
u < n.length - 1 && (c += '<w:p><w:r><w:br w:type="column"/></w:r></w:p>');
|
|
199
|
-
});
|
|
200
|
-
const v = d.map((a) => `<w:col w:w="${a}" w:space="${i}"/>`).join("");
|
|
201
|
-
return c += `<w:p><w:pPr><w:sectPr>
|
|
202
|
-
<w:cols w:num="${l}" w:space="${i}" w:equalWidth="0">${v}</w:cols>
|
|
203
|
-
<w:pgSz w:w="11906" w:h="16838"/>
|
|
204
|
-
<w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
|
|
205
|
-
</w:sectPr></w:pPr></w:p>`, c;
|
|
206
|
-
}
|
|
207
|
-
function S(e, o, t) {
|
|
208
|
-
let r = "";
|
|
209
|
-
for (const s of e.childNodes)
|
|
210
|
-
r += nt(s, o, t);
|
|
211
|
-
return r;
|
|
212
|
-
}
|
|
213
|
-
function nt(e, o, t) {
|
|
214
|
-
if (e.nodeType === 3) {
|
|
215
|
-
const n = e.textContent;
|
|
216
|
-
return n ? lt(n, t) : "";
|
|
217
|
-
}
|
|
218
|
-
if (e.nodeType !== 1) return "";
|
|
219
|
-
const r = e, s = r.tagName.toLowerCase();
|
|
220
|
-
if (s === "span" && r.hasAttribute("data-comment-id")) {
|
|
221
|
-
const n = r.getAttribute("data-comment-id"), l = n !== null ? o.get(n) : void 0;
|
|
222
|
-
if (l !== void 0) {
|
|
223
|
-
const w = S(r, o, t);
|
|
224
|
-
return `<w:commentRangeStart w:id="${l}"/>` + w + `<w:commentRangeEnd w:id="${l}"/><w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="${l}"/></w:r>`;
|
|
225
|
-
}
|
|
226
|
-
return S(r, o, t);
|
|
227
|
-
}
|
|
228
|
-
if (s === "span") {
|
|
229
|
-
const n = st(r, t);
|
|
230
|
-
return S(r, o, n);
|
|
231
|
-
}
|
|
232
|
-
return s === "strong" || s === "b" ? S(r, o, { ...t, bold: !0 }) : s === "em" || s === "i" ? S(r, o, { ...t, italic: !0 }) : s === "u" ? S(r, o, { ...t, underline: !0 }) : s === "s" || s === "del" || s === "strike" ? S(r, o, { ...t, strike: !0 }) : s === "br" ? "<w:r><w:br/></w:r>" : S(r, o, t);
|
|
233
|
-
}
|
|
234
|
-
function st(e, o) {
|
|
235
|
-
const t = e.getAttribute("style") || "", r = t.match(/font-family\s*:\s*([^;]+)/i), s = r ? r[1].trim().replace(/["']/g, "") : null, n = t.match(/font-size\s*:\s*([\d.]+)(px|pt)/i);
|
|
236
|
-
let l = null;
|
|
237
|
-
if (n) {
|
|
238
|
-
const m = parseFloat(n[1]);
|
|
239
|
-
l = n[2].toLowerCase() === "pt" ? Math.round(m * 2) : Math.round(m * 1.5);
|
|
240
|
-
}
|
|
241
|
-
const w = t.match(/(?:^|;)\s*color\s*:\s*([^;]+)/i), i = w ? wt(w[1].trim()) : null;
|
|
242
|
-
return {
|
|
243
|
-
...o,
|
|
244
|
-
bold: o.bold || /font-weight\s*:\s*(bold|[789]\d\d)/i.test(t),
|
|
245
|
-
italic: o.italic || /font-style\s*:\s*italic/i.test(t),
|
|
246
|
-
underline: o.underline || /text-decoration[^;]*underline/i.test(t),
|
|
247
|
-
strike: o.strike || /text-decoration[^;]*line-through/i.test(t),
|
|
248
|
-
fontFamily: s || o.fontFamily,
|
|
249
|
-
fontSize: l ?? o.fontSize,
|
|
250
|
-
color: i || o.color,
|
|
251
|
-
// 从导入阶段保留下来的语言 / 拼写检查标记(data-word-*)
|
|
252
|
-
lang: e.getAttribute("data-word-lang") || o.lang || null,
|
|
253
|
-
langEastAsia: e.getAttribute("data-word-lang-eastAsia") || // 兼容一下大小写差异
|
|
254
|
-
e.getAttribute("data-word-lang-eastasia") || o.langEastAsia || null,
|
|
255
|
-
noProof: e.hasAttribute("data-word-no-proof") ? e.getAttribute("data-word-no-proof") !== "0" && e.getAttribute("data-word-no-proof") !== "false" : o.noProof
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
function lt(e, { bold: o, italic: t, underline: r, strike: s, fontFamily: n, fontSize: l, color: w, lang: i, langEastAsia: m, noProof: d } = {}) {
|
|
259
|
-
let c = "";
|
|
260
|
-
if (n) {
|
|
261
|
-
const a = N(n);
|
|
262
|
-
c += `<w:rFonts w:ascii="${a}" w:eastAsia="${a}" w:hAnsi="${a}" w:cs="${a}"/>`;
|
|
263
|
-
}
|
|
264
|
-
if (l && (c += `<w:sz w:val="${l}"/><w:szCs w:val="${l}"/>`), w && (c += `<w:color w:val="${w}"/>`), o && (c += "<w:b/><w:bCs/>"), t && (c += "<w:i/><w:iCs/>"), r && (c += '<w:u w:val="single"/>'), s && (c += "<w:strike/>"), i || m) {
|
|
265
|
-
const a = [];
|
|
266
|
-
i && a.push(`w:val="${N(i)}"`), m && a.push(`w:eastAsia="${N(m)}"`), c += `<w:lang ${a.join(" ")}/>`;
|
|
267
|
-
}
|
|
268
|
-
return d && (c += "<w:noProof/>"), `<w:r>${c ? `<w:rPr>${c}</w:rPr>` : ""}<w:t xml:space="preserve">${N(e)}</w:t></w:r>`;
|
|
269
|
-
}
|
|
270
|
-
function at(e, o) {
|
|
271
|
-
let t = "";
|
|
272
|
-
const r = { h1: "Heading1", h2: "Heading2", h3: "Heading3", h4: "Heading4", h5: "Heading5", h6: "Heading6" };
|
|
273
|
-
r[e] && (t += `<w:pStyle w:val="${r[e]}"/>`), (e === "li" || e === "blockquote" || e === "pre") && (t = '<w:ind w:left="720"/>');
|
|
274
|
-
const s = o.getAttribute("style") || "", n = o.closest ? o.closest("td,th") : null, l = n && n.getAttribute("style") || "", w = (o.getAttribute("align") || n?.getAttribute("align") || "").toLowerCase(), i = s.match(/text-align\s*:\s*(left|center|right|justify)/i) || l.match(/text-align\s*:\s*(left|center|right|justify)/i), m = { left: "left", center: "center", right: "right", justify: "both" };
|
|
275
|
-
i ? t += `<w:jc w:val="${m[i[1].toLowerCase()]}"/>` : w && m[w] && (t += `<w:jc w:val="${m[w]}"/>`);
|
|
276
|
-
const d = s.match(/line-height\s*:\s*([^;]+)/i), c = s.match(/margin-top\s*:\s*([\d.]+)px/i), v = s.match(/margin-bottom\s*:\s*([\d.]+)px/i);
|
|
277
|
-
let a = "";
|
|
278
|
-
if (d) {
|
|
279
|
-
const u = d[1].trim(), p = parseFloat(u);
|
|
280
|
-
if (!Number.isNaN(p) && p > 0.25 && p < 4) {
|
|
281
|
-
const z = Math.round(p * 240);
|
|
282
|
-
a += ` w:line="${z}" w:lineRule="auto"`;
|
|
283
|
-
} else {
|
|
284
|
-
const z = u.match(/([\d.]+)px/i);
|
|
285
|
-
if (z) {
|
|
286
|
-
const h = parseFloat(z[1]);
|
|
287
|
-
if (!Number.isNaN(h) && h > 0) {
|
|
288
|
-
const b = Math.round(h * 15);
|
|
289
|
-
a += ` w:line="${b}" w:lineRule="exact"`;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
if (c) {
|
|
295
|
-
const u = parseFloat(c[1]);
|
|
296
|
-
if (!Number.isNaN(u) && u > 0) {
|
|
297
|
-
const p = Math.round(u * 15);
|
|
298
|
-
a += ` w:before="${p}"`;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
if (v) {
|
|
302
|
-
const u = parseFloat(v[1]);
|
|
303
|
-
if (!Number.isNaN(u) && u > 0) {
|
|
304
|
-
const p = Math.round(u * 15);
|
|
305
|
-
a += ` w:after="${p}"`;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
return a && (t += `<w:spacing${a}/>`), t ? `<w:pPr>${t}</w:pPr>` : "";
|
|
309
|
-
}
|
|
310
|
-
function N(e) {
|
|
311
|
-
return String(e).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
312
|
-
}
|
|
313
|
-
function wt(e) {
|
|
314
|
-
if (!e || typeof e != "string") return null;
|
|
315
|
-
const o = e.trim();
|
|
316
|
-
if (/^#[0-9a-f]{3,6}$/i.test(o)) {
|
|
317
|
-
let r = o.slice(1);
|
|
318
|
-
return r.length === 3 && (r = r.split("").map((s) => s + s).join("")), r.toUpperCase();
|
|
319
|
-
}
|
|
320
|
-
const t = o.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);
|
|
321
|
-
return t ? [t[1], t[2], t[3]].map((r) => (+r).toString(16).padStart(2, "0")).join("").toUpperCase() : null;
|
|
322
|
-
}
|
|
323
|
-
function G(e) {
|
|
324
|
-
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
325
|
-
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
|
326
|
-
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
|
|
327
|
-
<Default Extension="xml" ContentType="application/xml"/>
|
|
328
|
-
<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
|
|
329
|
-
<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>${e ? `
|
|
330
|
-
<Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>` : ""}
|
|
331
|
-
</Types>`;
|
|
332
|
-
}
|
|
333
|
-
function U() {
|
|
334
|
-
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
335
|
-
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
336
|
-
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
|
|
337
|
-
</Relationships>`;
|
|
338
|
-
}
|
|
339
|
-
function X(e) {
|
|
340
|
-
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
341
|
-
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
342
|
-
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>${e ? `
|
|
343
|
-
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/>` : ""}
|
|
344
|
-
</Relationships>`;
|
|
345
|
-
}
|
|
346
|
-
function Z(e) {
|
|
347
|
-
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
348
|
-
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
|
|
349
|
-
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
350
|
-
xmlns:o="urn:schemas-microsoft-com:office:office"
|
|
351
|
-
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
|
352
|
-
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
|
353
|
-
xmlns:v="urn:schemas-microsoft-com:vml"
|
|
354
|
-
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
|
355
|
-
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
356
|
-
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
|
|
357
|
-
xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
|
|
358
|
-
mc:Ignorable="w14 w15">
|
|
359
|
-
<w:body>
|
|
360
|
-
${e}
|
|
361
|
-
<w:sectPr>
|
|
362
|
-
<w:pgSz w:w="11906" w:h="16838"/>
|
|
363
|
-
<w:pgMar w:top="1800" w:right="1800" w:bottom="1800" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
|
|
364
|
-
</w:sectPr>
|
|
365
|
-
</w:body>
|
|
366
|
-
</w:document>`;
|
|
367
|
-
}
|
|
368
|
-
function it(e) {
|
|
369
|
-
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
370
|
-
<w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
371
|
-
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
372
|
-
${e.map(({ ooxmlId: t, author: r, createdAt: s, note: n }) => {
|
|
373
|
-
const l = N(String(r || "作者")), w = N(String(r || "作").charAt(0)), i = s ? new Date(s).toISOString().slice(0, 19) + "Z" : (/* @__PURE__ */ new Date()).toISOString().slice(0, 19) + "Z", m = N(String(n || ""));
|
|
374
|
-
return ` <w:comment w:id="${t}" w:author="${l}" w:date="${i}" w:initials="${w}">
|
|
375
|
-
<w:p>
|
|
376
|
-
<w:pPr><w:pStyle w:val="CommentText"/></w:pPr>
|
|
377
|
-
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:annotationRef/></w:r>
|
|
378
|
-
<w:r><w:t>${m}</w:t></w:r>
|
|
379
|
-
</w:p>
|
|
380
|
-
</w:comment>`;
|
|
381
|
-
}).join(`
|
|
382
|
-
`)}
|
|
383
|
-
</w:comments>`;
|
|
384
|
-
}
|
|
385
|
-
function J() {
|
|
386
|
-
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
387
|
-
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
388
|
-
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
389
|
-
<w:docDefaults>
|
|
390
|
-
<w:rPrDefault>
|
|
391
|
-
<w:rPr>
|
|
392
|
-
<w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体" w:cs="宋体"/>
|
|
393
|
-
<w:sz w:val="24"/>
|
|
394
|
-
<w:szCs w:val="24"/>
|
|
395
|
-
<w:lang w:val="zh-CN" w:eastAsia="zh-CN" w:bidi="zh-CN"/>
|
|
396
|
-
</w:rPr>
|
|
397
|
-
</w:rPrDefault>
|
|
398
|
-
</w:docDefaults>
|
|
399
|
-
<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
|
|
400
|
-
<w:name w:val="Normal"/>
|
|
401
|
-
<w:qFormat/>
|
|
402
|
-
</w:style>
|
|
403
|
-
<w:style w:type="paragraph" w:styleId="Heading1">
|
|
404
|
-
<w:name w:val="heading 1"/>
|
|
405
|
-
<w:basedOn w:val="Normal"/>
|
|
406
|
-
<w:rPr><w:b/><w:sz w:val="40"/></w:rPr>
|
|
407
|
-
</w:style>
|
|
408
|
-
<w:style w:type="paragraph" w:styleId="Heading2">
|
|
409
|
-
<w:name w:val="heading 2"/>
|
|
410
|
-
<w:basedOn w:val="Normal"/>
|
|
411
|
-
<w:rPr><w:b/><w:sz w:val="32"/></w:rPr>
|
|
412
|
-
</w:style>
|
|
413
|
-
<w:style w:type="paragraph" w:styleId="Heading3">
|
|
414
|
-
<w:name w:val="heading 3"/>
|
|
415
|
-
<w:basedOn w:val="Normal"/>
|
|
416
|
-
<w:rPr><w:b/><w:sz w:val="28"/></w:rPr>
|
|
417
|
-
</w:style>
|
|
418
|
-
<w:style w:type="paragraph" w:styleId="Heading4">
|
|
419
|
-
<w:name w:val="heading 4"/>
|
|
420
|
-
<w:basedOn w:val="Normal"/>
|
|
421
|
-
<w:rPr><w:b/><w:sz w:val="26"/></w:rPr>
|
|
422
|
-
</w:style>
|
|
423
|
-
<w:style w:type="paragraph" w:styleId="Heading5">
|
|
424
|
-
<w:name w:val="heading 5"/>
|
|
425
|
-
<w:basedOn w:val="Normal"/>
|
|
426
|
-
<w:rPr><w:b/><w:sz w:val="24"/></w:rPr>
|
|
427
|
-
</w:style>
|
|
428
|
-
<w:style w:type="paragraph" w:styleId="Heading6">
|
|
429
|
-
<w:name w:val="heading 6"/>
|
|
430
|
-
<w:basedOn w:val="Normal"/>
|
|
431
|
-
<w:rPr><w:sz w:val="24"/></w:rPr>
|
|
432
|
-
</w:style>
|
|
433
|
-
<w:style w:type="paragraph" w:styleId="CommentText">
|
|
434
|
-
<w:name w:val="annotation text"/>
|
|
435
|
-
<w:basedOn w:val="Normal"/>
|
|
436
|
-
<w:rPr><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr>
|
|
437
|
-
</w:style>
|
|
438
|
-
<w:style w:type="character" w:styleId="CommentReference">
|
|
439
|
-
<w:name w:val="annotation reference"/>
|
|
440
|
-
<w:rPr><w:sz w:val="16"/><w:szCs w:val="16"/></w:rPr>
|
|
441
|
-
</w:style>
|
|
442
|
-
</w:styles>`;
|
|
443
|
-
}
|
|
1
|
+
import "jszip";
|
|
2
|
+
import { b as r, a as e, e as p } from "./wordDocxExport-CYxYyGfR.js";
|
|
444
3
|
export {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
4
|
+
r as exportHtmlToDocx,
|
|
5
|
+
e as exportHtmlToDocxBlob,
|
|
6
|
+
p as exportToDocx
|
|
448
7
|
};
|
package/package.json
CHANGED
package/src/App.vue
CHANGED
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
|
|
138
138
|
<script setup>
|
|
139
139
|
import { ref, onMounted, onUnmounted, watch, createApp, h } from 'vue'
|
|
140
|
-
import {
|
|
140
|
+
import { saveAsBlob } from './utils/saveAsBlob'
|
|
141
141
|
import CommentPanel from './components/CommentPanel.vue'
|
|
142
142
|
import CommentAddDialog from './components/CommentAddDialog.vue'
|
|
143
143
|
import { CommentMark } from './extensions/CommentMark.js'
|
|
@@ -394,7 +394,7 @@ const exportWordBlob = async () => {
|
|
|
394
394
|
exportBlobLoading.value = true
|
|
395
395
|
try {
|
|
396
396
|
const blob = await exportHtmlToDocxBlob(html, currentDocTitle.value || '文档')
|
|
397
|
-
|
|
397
|
+
saveAsBlob(blob, `${currentDocTitle.value || '文档'}.docx`)
|
|
398
398
|
} catch (err) {
|
|
399
399
|
console.error('Word 流导出失败:', err)
|
|
400
400
|
alert('Word 流导出失败,请稍后重试')
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 使用原生 API 触发 Blob/File 下载。
|
|
3
|
+
* 不依赖 file-saver,避免其 UMD 在 ESM 环境下报 "Cannot set properties of undefined (setting 'FileSaver')"。
|
|
4
|
+
*/
|
|
5
|
+
export function saveAsBlob(blob: Blob | File, filename = 'download'): void {
|
|
6
|
+
const url = URL.createObjectURL(blob)
|
|
7
|
+
const a = document.createElement('a')
|
|
8
|
+
a.href = url
|
|
9
|
+
a.download = filename
|
|
10
|
+
a.style.display = 'none'
|
|
11
|
+
document.body.appendChild(a)
|
|
12
|
+
a.click()
|
|
13
|
+
document.body.removeChild(a)
|
|
14
|
+
URL.revokeObjectURL(url)
|
|
15
|
+
}
|
|
@@ -10,19 +10,11 @@
|
|
|
10
10
|
* word/_rels/document.xml.rels
|
|
11
11
|
*/
|
|
12
12
|
import * as JSZipNS from 'jszip'
|
|
13
|
-
import
|
|
13
|
+
import { saveAsBlob } from './saveAsBlob'
|
|
14
14
|
|
|
15
15
|
// jszip 在不同打包方式下可能没有 default 导出,这里做一层兼容
|
|
16
16
|
const JSZip = (JSZipNS as any).default || (JSZipNS as any)
|
|
17
17
|
|
|
18
|
-
// file-saver 在不同打包方式下也可能没有命名导出 saveAs,这里统一兼容
|
|
19
|
-
const saveAs: (data: Blob | File, filename?: string) => void =
|
|
20
|
-
// ESM 构建下常见:具名导出 saveAs
|
|
21
|
-
((FileSaverNS as any).saveAs as any) ||
|
|
22
|
-
// UMD / default 导出下可能直接是函数
|
|
23
|
-
((FileSaverNS as any).default as any) ||
|
|
24
|
-
(FileSaverNS as any)
|
|
25
|
-
|
|
26
18
|
// ─── 公开类型 ─────────────────────────────────────────────────
|
|
27
19
|
|
|
28
20
|
export interface WordComment {
|
|
@@ -108,7 +100,7 @@ export async function exportToDocx(
|
|
|
108
100
|
mimeType:
|
|
109
101
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
110
102
|
})
|
|
111
|
-
|
|
103
|
+
saveAsBlob(blob, `${filename}.docx`)
|
|
112
104
|
}
|
|
113
105
|
|
|
114
106
|
/**
|