@beyondwork/docx-react-component 1.0.27 → 1.0.29
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/canonical-document-BLEbzL2J.d.cts +844 -0
- package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
- package/dist/chunk-2FJS5GZM.js +763 -0
- package/dist/chunk-2FJS5GZM.js.map +1 -0
- package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
- package/dist/chunk-2OQBZS3F.js.map +1 -0
- package/dist/chunk-2S7W4KFO.js +127 -0
- package/dist/chunk-2S7W4KFO.js.map +1 -0
- package/dist/chunk-2TG72QSW.js +3874 -0
- package/dist/chunk-2TG72QSW.js.map +1 -0
- package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
- package/dist/chunk-36QNIZBO.js.map +1 -0
- package/dist/chunk-4AQOYAW4.js +3069 -0
- package/dist/chunk-4AQOYAW4.js.map +1 -0
- package/dist/chunk-4D5EWJ3P.js +77 -0
- package/dist/chunk-4D5EWJ3P.js.map +1 -0
- package/dist/chunk-5FN54NDH.js +2257 -0
- package/dist/chunk-5FN54NDH.js.map +1 -0
- package/dist/chunk-BOYGQYRQ.js +7306 -0
- package/dist/chunk-BOYGQYRQ.js.map +1 -0
- package/dist/chunk-CN3XMECL.js +212 -0
- package/dist/chunk-CN3XMECL.js.map +1 -0
- package/dist/chunk-EBI3BX6U.js +164 -0
- package/dist/chunk-EBI3BX6U.js.map +1 -0
- package/dist/chunk-EILUG3VB.js +1275 -0
- package/dist/chunk-EILUG3VB.js.map +1 -0
- package/dist/chunk-FUDY333O.js +70 -0
- package/dist/chunk-FUDY333O.js.map +1 -0
- package/dist/chunk-GBVOWFIK.js +1237 -0
- package/dist/chunk-GBVOWFIK.js.map +1 -0
- package/dist/chunk-H4TQ3H3Y.js +262 -0
- package/dist/chunk-H4TQ3H3Y.js.map +1 -0
- package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
- package/dist/chunk-JGB3IXZO.js.map +1 -0
- package/dist/chunk-KD2QRQPY.js +4342 -0
- package/dist/chunk-KD2QRQPY.js.map +1 -0
- package/dist/chunk-KLMXQVYK.js +369 -0
- package/dist/chunk-KLMXQVYK.js.map +1 -0
- package/dist/chunk-KZUG5KFQ.js +214 -0
- package/dist/chunk-KZUG5KFQ.js.map +1 -0
- package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
- package/dist/chunk-QDAQ4CJU.js.map +1 -0
- package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
- package/dist/chunk-RMH72RZI.js.map +1 -0
- package/dist/chunk-SWKWQZXM.js +117 -0
- package/dist/chunk-SWKWQZXM.js.map +1 -0
- package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
- package/dist/chunk-TJBP2K4T.js.map +1 -0
- package/dist/chunk-TLCEAQDQ.js +542 -0
- package/dist/chunk-TLCEAQDQ.js.map +1 -0
- package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
- package/dist/chunk-UZXBISGO.js.map +1 -0
- package/dist/chunk-WGBAKP3Q.js +3220 -0
- package/dist/chunk-WGBAKP3Q.js.map +1 -0
- package/dist/compare/index.cjs +5475 -0
- package/dist/compare/index.cjs.map +1 -0
- package/dist/compare/index.d.cts +114 -0
- package/dist/compare/index.d.ts +114 -0
- package/dist/compare/index.js +731 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/commands/formatting-commands.cjs +828 -0
- package/dist/core/commands/formatting-commands.cjs.map +1 -0
- package/dist/core/commands/formatting-commands.d.cts +63 -0
- package/dist/core/commands/formatting-commands.d.ts +63 -0
- package/dist/core/commands/formatting-commands.js +37 -0
- package/dist/core/commands/formatting-commands.js.map +1 -0
- package/dist/core/commands/image-commands.cjs +2023 -0
- package/dist/core/commands/image-commands.cjs.map +1 -0
- package/dist/core/commands/image-commands.d.cts +58 -0
- package/dist/core/commands/image-commands.d.ts +58 -0
- package/dist/core/commands/image-commands.js +18 -0
- package/dist/core/commands/image-commands.js.map +1 -0
- package/dist/core/commands/section-layout-commands.cjs +477 -0
- package/dist/core/commands/section-layout-commands.cjs.map +1 -0
- package/dist/core/commands/section-layout-commands.d.cts +62 -0
- package/dist/core/commands/section-layout-commands.d.ts +62 -0
- package/dist/core/commands/section-layout-commands.js +21 -0
- package/dist/core/commands/section-layout-commands.js.map +1 -0
- package/dist/core/commands/style-commands.cjs +214 -0
- package/dist/core/commands/style-commands.cjs.map +1 -0
- package/dist/core/commands/style-commands.d.cts +13 -0
- package/dist/core/commands/style-commands.d.ts +13 -0
- package/dist/core/commands/style-commands.js +9 -0
- package/dist/core/commands/style-commands.js.map +1 -0
- package/dist/core/commands/table-structure-commands.cjs +1883 -0
- package/dist/core/commands/table-structure-commands.cjs.map +1 -0
- package/dist/core/commands/table-structure-commands.d.cts +59 -0
- package/dist/core/commands/table-structure-commands.d.ts +59 -0
- package/dist/core/commands/table-structure-commands.js +12 -0
- package/dist/core/commands/table-structure-commands.js.map +1 -0
- package/dist/core/commands/text-commands.cjs +2391 -0
- package/dist/core/commands/text-commands.cjs.map +1 -0
- package/dist/core/commands/text-commands.d.cts +24 -0
- package/dist/core/commands/text-commands.d.ts +24 -0
- package/dist/core/commands/text-commands.js +28 -0
- package/dist/core/commands/text-commands.js.map +1 -0
- package/dist/core/selection/mapping.cjs +200 -0
- package/dist/core/selection/mapping.cjs.map +1 -0
- package/dist/core/selection/mapping.d.cts +2 -0
- package/dist/core/selection/mapping.d.ts +2 -0
- package/dist/core/selection/mapping.js +31 -0
- package/dist/core/selection/mapping.js.map +1 -0
- package/dist/core/state/editor-state.cjs +2278 -0
- package/dist/core/state/editor-state.cjs.map +1 -0
- package/dist/core/state/editor-state.d.cts +2 -0
- package/dist/core/state/editor-state.d.ts +2 -0
- package/dist/core/state/editor-state.js +26 -0
- package/dist/core/state/editor-state.js.map +1 -0
- package/dist/index.cjs +38553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7856 -0
- package/dist/index.js.map +1 -0
- package/dist/io/docx-session.cjs +16236 -0
- package/dist/io/docx-session.cjs.map +1 -0
- package/dist/io/docx-session.d.cts +21 -0
- package/dist/io/docx-session.d.ts +21 -0
- package/dist/io/docx-session.js +18 -0
- package/dist/io/docx-session.js.map +1 -0
- package/dist/legal/index.cjs +3900 -0
- package/dist/legal/index.cjs.map +1 -0
- package/dist/legal/index.d.cts +86 -0
- package/dist/legal/index.d.ts +86 -0
- package/dist/legal/index.js +616 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/public-types-7ZL_94cz.d.ts +1573 -0
- package/dist/public-types-CeMaDueh.d.cts +1573 -0
- package/dist/public-types.cjs +19 -0
- package/dist/public-types.cjs.map +1 -0
- package/dist/public-types.d.cts +2 -0
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.js +1 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/document-runtime.cjs +11140 -0
- package/dist/runtime/document-runtime.cjs.map +1 -0
- package/dist/runtime/document-runtime.d.cts +231 -0
- package/dist/runtime/document-runtime.d.ts +231 -0
- package/dist/runtime/document-runtime.js +21 -0
- package/dist/runtime/document-runtime.js.map +1 -0
- package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
- package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
- package/dist/ui-tailwind/index.cjs +4833 -0
- package/dist/ui-tailwind/index.cjs.map +1 -0
- package/dist/ui-tailwind/index.d.cts +617 -0
- package/dist/ui-tailwind/index.d.ts +617 -0
- package/dist/ui-tailwind/index.js +575 -0
- package/dist/ui-tailwind/index.js.map +1 -0
- package/package.json +64 -54
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1418
- package/src/api/session-state.ts +0 -60
- package/src/compare/diff-engine.ts +0 -623
- package/src/compare/export-redlines.ts +0 -280
- package/src/compare/index.ts +0 -25
- package/src/compare/snapshot.ts +0 -97
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/image-commands.ts +0 -373
- package/src/core/commands/index.ts +0 -1757
- package/src/core/commands/list-commands.ts +0 -565
- package/src/core/commands/paragraph-layout-commands.ts +0 -339
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/structural-helpers.ts +0 -309
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -516
- package/src/core/search/search-text.ts +0 -357
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -289
- package/src/core/selection/review-anchors.ts +0 -183
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -892
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -459
- package/src/formats/xlsx/io/parse-styles.ts +0 -59
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
- package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
- package/src/formats/xlsx/io/serialize-styles.ts +0 -98
- package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
- package/src/formats/xlsx/io/xlsx-session.ts +0 -314
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -326
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -453
- package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
- package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
- package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
- package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
- package/src/index.ts +0 -101
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -2882
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -220
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -947
- package/src/io/export/serialize-footnotes.ts +0 -399
- package/src/io/export/serialize-headers-footers.ts +0 -372
- package/src/io/export/serialize-main-document.ts +0 -1376
- package/src/io/export/serialize-numbering.ts +0 -118
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -269
- package/src/io/export/serialize-tables.ts +0 -174
- package/src/io/export/split-review-boundaries.ts +0 -356
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -639
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/highlight-colors.ts +0 -39
- package/src/io/ooxml/numbering-sentinels.ts +0 -44
- package/src/io/ooxml/parse-comments.ts +0 -846
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -834
- package/src/io/ooxml/parse-footnotes.ts +0 -896
- package/src/io/ooxml/parse-headers-footers.ts +0 -1169
- package/src/io/ooxml/parse-inline-media.ts +0 -461
- package/src/io/ooxml/parse-main-document.ts +0 -2877
- package/src/io/ooxml/parse-numbering.ts +0 -432
- package/src/io/ooxml/parse-revisions.ts +0 -931
- package/src/io/ooxml/parse-settings.ts +0 -184
- package/src/io/ooxml/parse-shapes.ts +0 -296
- package/src/io/ooxml/parse-styles.ts +0 -463
- package/src/io/ooxml/parse-tables.ts +0 -618
- package/src/io/ooxml/parse-theme.ts +0 -346
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -325
- package/src/io/opc/package-writer.ts +0 -273
- package/src/io/source-package-provenance.ts +0 -241
- package/src/legal/cross-references.ts +0 -414
- package/src/legal/defined-terms.ts +0 -203
- package/src/legal/index.ts +0 -32
- package/src/legal/signature-blocks.ts +0 -259
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -2632
- package/src/model/cds-1.0.0.ts +0 -212
- package/src/model/snapshot.ts +0 -649
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -113
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -312
- package/src/review/store/revision-types.ts +0 -171
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/collab-review-sync.ts +0 -254
- package/src/runtime/document-layout.ts +0 -332
- package/src/runtime/document-navigation.ts +0 -603
- package/src/runtime/document-runtime.ts +0 -3159
- package/src/runtime/document-search.ts +0 -145
- package/src/runtime/numbering-prefix.ts +0 -216
- package/src/runtime/page-layout-estimation.ts +0 -212
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -192
- package/src/runtime/story-context.ts +0 -164
- package/src/runtime/story-targeting.ts +0 -162
- package/src/runtime/surface-projection.ts +0 -1357
- package/src/runtime/table-commands.ts +0 -173
- package/src/runtime/table-schema.ts +0 -309
- package/src/runtime/view-state.ts +0 -477
- package/src/runtime/virtualized-rendering.ts +0 -258
- package/src/runtime/workflow-markup.ts +0 -353
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -4097
- package/src/ui/browser-export.ts +0 -52
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-command-bag.ts +0 -120
- package/src/ui/editor-runtime-boundary.ts +0 -1457
- package/src/ui/editor-shell-view.tsx +0 -142
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/editor-surface-controller.tsx +0 -63
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/preserve-editor-selection.ts +0 -5
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -54
- package/src/ui/headless/selection-toolbar-model.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -103
- package/src/ui/review/README.md +0 -3
- package/src/ui/runtime-snapshot-selectors.ts +0 -197
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui/workflow-surface-blocked-rails.ts +0 -94
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
- package/src/ui-tailwind/editor-surface/pm-collab-plugins.ts +0 -40
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -178
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -973
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
- package/src/ui-tailwind/index.ts +0 -62
- package/src/ui-tailwind/page-chrome-model.ts +0 -27
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -634
- package/src/validation/compatibility-report.ts +0 -161
- package/src/validation/diagnostics.ts +0 -204
- package/src/validation/docx-comment-proof.ts +0 -707
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
import { inflateSync } from "fflate";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
CONTENT_TYPES_PATH,
|
|
5
|
-
OpcCompressionMethod,
|
|
6
|
-
OpcPackageManifest,
|
|
7
|
-
OpcPackagePart,
|
|
8
|
-
OpcPartManifestEntry,
|
|
9
|
-
OpcRelationship,
|
|
10
|
-
PACKAGE_RELATIONSHIPS_PATH,
|
|
11
|
-
getRelationshipsPartPath,
|
|
12
|
-
getSourcePartPathFromRelationshipsPart,
|
|
13
|
-
normalizePartPath,
|
|
14
|
-
} from "../ooxml/part-manifest.ts";
|
|
15
|
-
|
|
16
|
-
interface ZipCentralDirectoryEntry {
|
|
17
|
-
path: string;
|
|
18
|
-
compression: OpcCompressionMethod;
|
|
19
|
-
crc32: number;
|
|
20
|
-
compressedSize: number;
|
|
21
|
-
uncompressedSize: number;
|
|
22
|
-
localHeaderOffset: number;
|
|
23
|
-
generalPurposeBitFlag: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface OpcPackage {
|
|
27
|
-
manifest: OpcPackageManifest;
|
|
28
|
-
parts: Map<string, OpcPackagePart>;
|
|
29
|
-
sourceByteLength: number;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const EOCD_SIGNATURE = 0x06054b50;
|
|
33
|
-
const CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;
|
|
34
|
-
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
35
|
-
|
|
36
|
-
export function readOpcPackage(source: Uint8Array | ArrayBuffer): OpcPackage {
|
|
37
|
-
const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);
|
|
38
|
-
const centralDirectory = readCentralDirectory(bytes);
|
|
39
|
-
const parts = new Map<string, OpcPackagePart>();
|
|
40
|
-
|
|
41
|
-
for (const entry of centralDirectory) {
|
|
42
|
-
if (entry.path.endsWith("/")) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const storedBytes = readZipEntry(bytes, entry);
|
|
47
|
-
const normalizedPath = normalizePartPath(entry.path);
|
|
48
|
-
const surfaceKind = getSurfaceKind(normalizedPath);
|
|
49
|
-
|
|
50
|
-
parts.set(normalizedPath, {
|
|
51
|
-
path: normalizedPath,
|
|
52
|
-
surfaceKind,
|
|
53
|
-
contentType: null,
|
|
54
|
-
relationshipsPartPath:
|
|
55
|
-
surfaceKind === "content" ? getRelationshipsPartPath(normalizedPath) : null,
|
|
56
|
-
relationships: [],
|
|
57
|
-
compression: entry.compression,
|
|
58
|
-
bytes: storedBytes,
|
|
59
|
-
crc32: entry.crc32 >>> 0,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const contentTypesPart = parts.get(CONTENT_TYPES_PATH);
|
|
64
|
-
if (!contentTypesPart) {
|
|
65
|
-
throw new Error("Invalid OPC package: missing /[Content_Types].xml.");
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const contentTypes = parseContentTypesXml(decodeXml(contentTypesPart.bytes));
|
|
69
|
-
const packageRelationshipsPart = parts.get(PACKAGE_RELATIONSHIPS_PATH);
|
|
70
|
-
const packageRelationships = packageRelationshipsPart
|
|
71
|
-
? parseRelationshipsXml(decodeXml(packageRelationshipsPart.bytes))
|
|
72
|
-
: [];
|
|
73
|
-
|
|
74
|
-
const manifestParts: OpcPartManifestEntry[] = [];
|
|
75
|
-
|
|
76
|
-
for (const [path, part] of [...parts.entries()].sort(([left], [right]) => left.localeCompare(right))) {
|
|
77
|
-
const contentType = resolveContentType(path, contentTypes);
|
|
78
|
-
const relationshipsPartPath = part.surfaceKind === "content" ? getRelationshipsPartPath(path) : null;
|
|
79
|
-
const relationshipsPart = relationshipsPartPath ? parts.get(relationshipsPartPath) : undefined;
|
|
80
|
-
const relationships = relationshipsPart
|
|
81
|
-
? parseRelationshipsXml(decodeXml(relationshipsPart.bytes))
|
|
82
|
-
: [];
|
|
83
|
-
|
|
84
|
-
const nextPart: OpcPackagePart = {
|
|
85
|
-
...part,
|
|
86
|
-
contentType,
|
|
87
|
-
relationshipsPartPath,
|
|
88
|
-
relationships,
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
parts.set(path, nextPart);
|
|
92
|
-
manifestParts.push({
|
|
93
|
-
path,
|
|
94
|
-
surfaceKind: nextPart.surfaceKind,
|
|
95
|
-
contentType,
|
|
96
|
-
relationshipsPartPath,
|
|
97
|
-
relationships,
|
|
98
|
-
compression: nextPart.compression,
|
|
99
|
-
byteLength: nextPart.bytes.byteLength,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
manifest: {
|
|
105
|
-
contentTypes,
|
|
106
|
-
packageRelationships,
|
|
107
|
-
parts: manifestParts,
|
|
108
|
-
},
|
|
109
|
-
parts,
|
|
110
|
-
sourceByteLength: bytes.byteLength,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function readCentralDirectory(archive: Uint8Array): ZipCentralDirectoryEntry[] {
|
|
115
|
-
const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);
|
|
116
|
-
const eocdOffset = findEndOfCentralDirectory(archive, view);
|
|
117
|
-
const entryCount = view.getUint16(eocdOffset + 10, true);
|
|
118
|
-
const centralDirectoryOffset = view.getUint32(eocdOffset + 16, true);
|
|
119
|
-
const entries: ZipCentralDirectoryEntry[] = [];
|
|
120
|
-
let offset = centralDirectoryOffset;
|
|
121
|
-
|
|
122
|
-
for (let index = 0; index < entryCount; index += 1) {
|
|
123
|
-
const signature = view.getUint32(offset, true);
|
|
124
|
-
if (signature !== CENTRAL_DIRECTORY_SIGNATURE) {
|
|
125
|
-
throw new Error(`Invalid ZIP central directory signature at offset ${offset}.`);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const generalPurposeBitFlag = view.getUint16(offset + 8, true);
|
|
129
|
-
const compressionMethod = view.getUint16(offset + 10, true);
|
|
130
|
-
const crc32 = view.getUint32(offset + 16, true);
|
|
131
|
-
const compressedSize = view.getUint32(offset + 20, true);
|
|
132
|
-
const uncompressedSize = view.getUint32(offset + 24, true);
|
|
133
|
-
const fileNameLength = view.getUint16(offset + 28, true);
|
|
134
|
-
const extraFieldLength = view.getUint16(offset + 30, true);
|
|
135
|
-
const fileCommentLength = view.getUint16(offset + 32, true);
|
|
136
|
-
const localHeaderOffset = view.getUint32(offset + 42, true);
|
|
137
|
-
const fileNameOffset = offset + 46;
|
|
138
|
-
const fileName = decodeUtf8(archive.subarray(fileNameOffset, fileNameOffset + fileNameLength));
|
|
139
|
-
|
|
140
|
-
entries.push({
|
|
141
|
-
path: fileName,
|
|
142
|
-
compression: mapCompressionMethod(compressionMethod),
|
|
143
|
-
crc32,
|
|
144
|
-
compressedSize,
|
|
145
|
-
uncompressedSize,
|
|
146
|
-
localHeaderOffset,
|
|
147
|
-
generalPurposeBitFlag,
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
offset += 46 + fileNameLength + extraFieldLength + fileCommentLength;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return entries;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function findEndOfCentralDirectory(archive: Uint8Array, view: DataView): number {
|
|
157
|
-
const minimumEocdSize = 22;
|
|
158
|
-
const maximumCommentSize = 0xffff;
|
|
159
|
-
const searchStart = Math.max(0, archive.length - minimumEocdSize - maximumCommentSize);
|
|
160
|
-
|
|
161
|
-
for (let offset = archive.length - minimumEocdSize; offset >= searchStart; offset -= 1) {
|
|
162
|
-
if (view.getUint32(offset, true) === EOCD_SIGNATURE) {
|
|
163
|
-
return offset;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
throw new Error("Invalid ZIP archive: end of central directory not found.");
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function readZipEntry(archive: Uint8Array, entry: ZipCentralDirectoryEntry): Uint8Array {
|
|
171
|
-
const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);
|
|
172
|
-
const headerOffset = entry.localHeaderOffset;
|
|
173
|
-
const signature = view.getUint32(headerOffset, true);
|
|
174
|
-
if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {
|
|
175
|
-
throw new Error(`Invalid ZIP local file header signature at offset ${headerOffset}.`);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const fileNameLength = view.getUint16(headerOffset + 26, true);
|
|
179
|
-
const extraFieldLength = view.getUint16(headerOffset + 28, true);
|
|
180
|
-
const dataOffset = headerOffset + 30 + fileNameLength + extraFieldLength;
|
|
181
|
-
const compressed = archive.subarray(dataOffset, dataOffset + entry.compressedSize);
|
|
182
|
-
|
|
183
|
-
switch (entry.compression) {
|
|
184
|
-
case "store":
|
|
185
|
-
return new Uint8Array(compressed);
|
|
186
|
-
case "deflate":
|
|
187
|
-
return inflateSync(compressed);
|
|
188
|
-
default:
|
|
189
|
-
throw new Error(`Unsupported ZIP compression for ${entry.path}.`);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function mapCompressionMethod(method: number): OpcCompressionMethod {
|
|
194
|
-
switch (method) {
|
|
195
|
-
case 0:
|
|
196
|
-
return "store";
|
|
197
|
-
case 8:
|
|
198
|
-
return "deflate";
|
|
199
|
-
default:
|
|
200
|
-
throw new Error(`Unsupported ZIP compression method ${method}.`);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function getSurfaceKind(path: string): OpcPartManifestEntry["surfaceKind"] {
|
|
205
|
-
if (path === CONTENT_TYPES_PATH) {
|
|
206
|
-
return "content-types";
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (path === PACKAGE_RELATIONSHIPS_PATH || path.includes("/_rels/")) {
|
|
210
|
-
return "relationships";
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return "content";
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function decodeXml(bytes: Uint8Array): string {
|
|
217
|
-
return new TextDecoder("utf-8").decode(bytes);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
function decodeUtf8(bytes: Uint8Array): string {
|
|
221
|
-
return new TextDecoder("utf-8").decode(bytes);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function parseContentTypesXml(xml: string): OpcPackageManifest["contentTypes"] {
|
|
225
|
-
const defaults: Record<string, string> = {};
|
|
226
|
-
const overrides: Record<string, string> = {};
|
|
227
|
-
|
|
228
|
-
for (const attributes of findTagAttributes(xml, "Default")) {
|
|
229
|
-
const extension = attributes.Extension?.toLowerCase();
|
|
230
|
-
const contentType = attributes.ContentType;
|
|
231
|
-
if (!extension || !contentType) {
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
defaults[extension] = contentType;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
for (const attributes of findTagAttributes(xml, "Override")) {
|
|
239
|
-
const partName = attributes.PartName;
|
|
240
|
-
const contentType = attributes.ContentType;
|
|
241
|
-
if (!partName || !contentType) {
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
overrides[normalizePartPath(partName)] = contentType;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
return { defaults, overrides };
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function parseRelationshipsXml(xml: string): OpcRelationship[] {
|
|
252
|
-
const relationships: OpcRelationship[] = [];
|
|
253
|
-
|
|
254
|
-
for (const attributes of findTagAttributes(xml, "Relationship")) {
|
|
255
|
-
const id = attributes.Id;
|
|
256
|
-
const type = attributes.Type;
|
|
257
|
-
const target = attributes.Target;
|
|
258
|
-
if (!id || !type || !target) {
|
|
259
|
-
continue;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
relationships.push({
|
|
263
|
-
id,
|
|
264
|
-
type,
|
|
265
|
-
target,
|
|
266
|
-
targetMode: attributes.TargetMode === "External" ? "external" : "internal",
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return relationships;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
function findTagAttributes(xml: string, tagName: string): Record<string, string>[] {
|
|
274
|
-
const tagPattern = new RegExp(`<(?:[A-Za-z_][\\w.-]*:)?${tagName}\\b([^>]*)\\/?>`, "g");
|
|
275
|
-
const results: Record<string, string>[] = [];
|
|
276
|
-
let tagMatch: RegExpExecArray | null = tagPattern.exec(xml);
|
|
277
|
-
|
|
278
|
-
while (tagMatch) {
|
|
279
|
-
results.push(parseAttributes(tagMatch[1] ?? ""));
|
|
280
|
-
tagMatch = tagPattern.exec(xml);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return results;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
function parseAttributes(rawAttributes: string): Record<string, string> {
|
|
287
|
-
const attributes: Record<string, string> = {};
|
|
288
|
-
const attributePattern = /([A-Za-z_][\w:.-]*)\s*=\s*(["'])([\s\S]*?)\2/g;
|
|
289
|
-
let match: RegExpExecArray | null = attributePattern.exec(rawAttributes);
|
|
290
|
-
|
|
291
|
-
while (match) {
|
|
292
|
-
attributes[match[1]] = decodeXmlEntities(match[3]);
|
|
293
|
-
match = attributePattern.exec(rawAttributes);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
return attributes;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
function decodeXmlEntities(value: string): string {
|
|
300
|
-
return value
|
|
301
|
-
.replace(/"/g, '"')
|
|
302
|
-
.replace(/'/g, "'")
|
|
303
|
-
.replace(/</g, "<")
|
|
304
|
-
.replace(/>/g, ">")
|
|
305
|
-
.replace(/&/g, "&");
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function resolveContentType(
|
|
309
|
-
path: string,
|
|
310
|
-
contentTypes: OpcPackageManifest["contentTypes"],
|
|
311
|
-
): string | null {
|
|
312
|
-
if (path === CONTENT_TYPES_PATH) {
|
|
313
|
-
return "application/xml";
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
const override = contentTypes.overrides[path];
|
|
317
|
-
if (override) {
|
|
318
|
-
return override;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const extension = path.includes(".") ? path.slice(path.lastIndexOf(".") + 1).toLowerCase() : "";
|
|
322
|
-
return extension ? contentTypes.defaults[extension] ?? null : null;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
export { parseContentTypesXml, parseRelationshipsXml };
|
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CONTENT_TYPES_PATH,
|
|
3
|
-
OpcCompressionMethod,
|
|
4
|
-
OpcPackageManifest,
|
|
5
|
-
OpcPackagePart,
|
|
6
|
-
OpcRelationship,
|
|
7
|
-
PACKAGE_RELATIONSHIPS_PATH,
|
|
8
|
-
comparePartPaths,
|
|
9
|
-
getExtension,
|
|
10
|
-
getRelationshipsPartPath,
|
|
11
|
-
normalizePartPath,
|
|
12
|
-
} from "../ooxml/part-manifest.ts";
|
|
13
|
-
import type { OpcPackage } from "./package-reader.ts";
|
|
14
|
-
|
|
15
|
-
interface ZipEntryPayload {
|
|
16
|
-
path: string;
|
|
17
|
-
compression: OpcCompressionMethod;
|
|
18
|
-
uncompressedBytes: Uint8Array;
|
|
19
|
-
compressedBytes: Uint8Array;
|
|
20
|
-
crc32: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function writeOpcPackage(input: OpcPackage | { manifest: OpcPackageManifest; parts: Map<string, OpcPackagePart> }): Uint8Array {
|
|
24
|
-
const entries = collectZipEntries(input.manifest, input.parts);
|
|
25
|
-
return buildZipArchive(entries);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function collectZipEntries(
|
|
29
|
-
manifest: OpcPackageManifest,
|
|
30
|
-
parts: Map<string, OpcPackagePart>,
|
|
31
|
-
): ZipEntryPayload[] {
|
|
32
|
-
const entries: ZipEntryPayload[] = [];
|
|
33
|
-
const contentParts = [...parts.values()]
|
|
34
|
-
.filter((part) => part.surfaceKind === "content")
|
|
35
|
-
.sort((left, right) => comparePartPaths(left.path, right.path));
|
|
36
|
-
|
|
37
|
-
entries.push(createZipPayload(CONTENT_TYPES_PATH, "deflate", encodeXml(buildContentTypesXml(manifest, contentParts))));
|
|
38
|
-
entries.push(
|
|
39
|
-
createZipPayload(
|
|
40
|
-
PACKAGE_RELATIONSHIPS_PATH,
|
|
41
|
-
"deflate",
|
|
42
|
-
encodeXml(buildRelationshipsXml(manifest.packageRelationships)),
|
|
43
|
-
),
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
for (const part of contentParts) {
|
|
47
|
-
entries.push(createZipPayload(part.path, part.compression, part.bytes));
|
|
48
|
-
|
|
49
|
-
if (part.relationships.length > 0) {
|
|
50
|
-
entries.push(
|
|
51
|
-
createZipPayload(
|
|
52
|
-
getRelationshipsPartPath(part.path),
|
|
53
|
-
"deflate",
|
|
54
|
-
encodeXml(buildRelationshipsXml(part.relationships)),
|
|
55
|
-
),
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return entries.sort((left, right) => comparePartPaths(left.path, right.path));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function buildContentTypesXml(
|
|
64
|
-
manifest: OpcPackageManifest,
|
|
65
|
-
parts: OpcPackagePart[],
|
|
66
|
-
): string {
|
|
67
|
-
const defaults: Record<string, string> = {
|
|
68
|
-
...manifest.contentTypes.defaults,
|
|
69
|
-
rels: manifest.contentTypes.defaults.rels ?? "application/vnd.openxmlformats-package.relationships+xml",
|
|
70
|
-
xml: manifest.contentTypes.defaults.xml ?? "application/xml",
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const overrides = { ...manifest.contentTypes.overrides };
|
|
74
|
-
|
|
75
|
-
for (const part of parts) {
|
|
76
|
-
if (!part.contentType) {
|
|
77
|
-
throw new Error(`Cannot write OPC package: missing content type for ${part.path}.`);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const extension = getExtension(part.path);
|
|
81
|
-
if (!extension) {
|
|
82
|
-
overrides[part.path] = part.contentType;
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const defaultContentType = defaults[extension];
|
|
87
|
-
if (!defaultContentType) {
|
|
88
|
-
defaults[extension] = part.contentType;
|
|
89
|
-
delete overrides[part.path];
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (defaultContentType === part.contentType) {
|
|
94
|
-
delete overrides[part.path];
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
overrides[part.path] = part.contentType;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const defaultEntries = Object.entries(defaults).sort(([left], [right]) => left.localeCompare(right));
|
|
102
|
-
const overrideEntries = Object.entries(overrides).sort(([left], [right]) => comparePartPaths(left, right));
|
|
103
|
-
|
|
104
|
-
const defaultXml = defaultEntries
|
|
105
|
-
.map(([extension, contentType]) => ` <Default Extension="${escapeXml(extension)}" ContentType="${escapeXml(contentType)}"/>`)
|
|
106
|
-
.join("\n");
|
|
107
|
-
const overrideXml = overrideEntries
|
|
108
|
-
.map(([partName, contentType]) => ` <Override PartName="${escapeXml(partName)}" ContentType="${escapeXml(contentType)}"/>`)
|
|
109
|
-
.join("\n");
|
|
110
|
-
const body = [defaultXml, overrideXml].filter((value) => value.length > 0).join("\n");
|
|
111
|
-
|
|
112
|
-
return [
|
|
113
|
-
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>`,
|
|
114
|
-
`<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">`,
|
|
115
|
-
body,
|
|
116
|
-
`</Types>`,
|
|
117
|
-
].join("\n");
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function buildRelationshipsXml(relationships: OpcRelationship[]): string {
|
|
121
|
-
const relationshipXml = [...relationships]
|
|
122
|
-
.sort((left, right) => left.id.localeCompare(right.id))
|
|
123
|
-
.map((relationship) => {
|
|
124
|
-
const targetMode =
|
|
125
|
-
relationship.targetMode === "external"
|
|
126
|
-
? ` TargetMode="External"`
|
|
127
|
-
: "";
|
|
128
|
-
return ` <Relationship Id="${escapeXml(relationship.id)}" Type="${escapeXml(relationship.type)}" Target="${escapeXml(relationship.target)}"${targetMode}/>`;
|
|
129
|
-
})
|
|
130
|
-
.join("\n");
|
|
131
|
-
|
|
132
|
-
return [
|
|
133
|
-
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>`,
|
|
134
|
-
`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">`,
|
|
135
|
-
relationshipXml,
|
|
136
|
-
`</Relationships>`,
|
|
137
|
-
].join("\n");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function createZipPayload(
|
|
141
|
-
path: string,
|
|
142
|
-
compression: OpcCompressionMethod,
|
|
143
|
-
bytes: Uint8Array,
|
|
144
|
-
): ZipEntryPayload {
|
|
145
|
-
const normalizedPath = normalizePartPath(path).slice(1);
|
|
146
|
-
const uncompressedBytes = new Uint8Array(bytes);
|
|
147
|
-
// Keep export browser-safe by storing entries without Node-only compression primitives.
|
|
148
|
-
const compressedBytes = uncompressedBytes;
|
|
149
|
-
const effectiveCompression: OpcCompressionMethod = "store";
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
path: normalizedPath,
|
|
153
|
-
compression: effectiveCompression,
|
|
154
|
-
uncompressedBytes,
|
|
155
|
-
compressedBytes,
|
|
156
|
-
crc32: calculateCrc32(uncompressedBytes),
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function buildZipArchive(entries: ZipEntryPayload[]): Uint8Array {
|
|
161
|
-
const localChunks: Uint8Array[] = [];
|
|
162
|
-
const centralChunks: Uint8Array[] = [];
|
|
163
|
-
let localOffset = 0;
|
|
164
|
-
|
|
165
|
-
for (const entry of entries) {
|
|
166
|
-
const fileName = encodeUtf8(entry.path);
|
|
167
|
-
const localHeader = createByteBuffer(30 + fileName.length);
|
|
168
|
-
const localHeaderView = new DataView(localHeader.buffer);
|
|
169
|
-
localHeaderView.setUint32(0, 0x04034b50, true);
|
|
170
|
-
localHeaderView.setUint16(4, 20, true);
|
|
171
|
-
localHeaderView.setUint16(6, 0, true);
|
|
172
|
-
localHeaderView.setUint16(8, entry.compression === "store" ? 0 : 8, true);
|
|
173
|
-
localHeaderView.setUint16(10, 0, true);
|
|
174
|
-
localHeaderView.setUint16(12, 0, true);
|
|
175
|
-
localHeaderView.setUint32(14, entry.crc32 >>> 0, true);
|
|
176
|
-
localHeaderView.setUint32(18, entry.compressedBytes.byteLength, true);
|
|
177
|
-
localHeaderView.setUint32(22, entry.uncompressedBytes.byteLength, true);
|
|
178
|
-
localHeaderView.setUint16(26, fileName.length, true);
|
|
179
|
-
localHeaderView.setUint16(28, 0, true);
|
|
180
|
-
localHeader.set(fileName, 30);
|
|
181
|
-
|
|
182
|
-
localChunks.push(localHeader, entry.compressedBytes);
|
|
183
|
-
|
|
184
|
-
const centralHeader = createByteBuffer(46 + fileName.length);
|
|
185
|
-
const centralHeaderView = new DataView(centralHeader.buffer);
|
|
186
|
-
centralHeaderView.setUint32(0, 0x02014b50, true);
|
|
187
|
-
centralHeaderView.setUint16(4, 20, true);
|
|
188
|
-
centralHeaderView.setUint16(6, 20, true);
|
|
189
|
-
centralHeaderView.setUint16(8, 0, true);
|
|
190
|
-
centralHeaderView.setUint16(10, entry.compression === "store" ? 0 : 8, true);
|
|
191
|
-
centralHeaderView.setUint16(12, 0, true);
|
|
192
|
-
centralHeaderView.setUint16(14, 0, true);
|
|
193
|
-
centralHeaderView.setUint32(16, entry.crc32 >>> 0, true);
|
|
194
|
-
centralHeaderView.setUint32(20, entry.compressedBytes.byteLength, true);
|
|
195
|
-
centralHeaderView.setUint32(24, entry.uncompressedBytes.byteLength, true);
|
|
196
|
-
centralHeaderView.setUint16(28, fileName.length, true);
|
|
197
|
-
centralHeaderView.setUint16(30, 0, true);
|
|
198
|
-
centralHeaderView.setUint16(32, 0, true);
|
|
199
|
-
centralHeaderView.setUint16(34, 0, true);
|
|
200
|
-
centralHeaderView.setUint16(36, 0, true);
|
|
201
|
-
centralHeaderView.setUint32(38, 0, true);
|
|
202
|
-
centralHeaderView.setUint32(42, localOffset, true);
|
|
203
|
-
centralHeader.set(fileName, 46);
|
|
204
|
-
centralChunks.push(centralHeader);
|
|
205
|
-
|
|
206
|
-
localOffset += localHeader.byteLength + entry.compressedBytes.byteLength;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const centralDirectoryOffset = localOffset;
|
|
210
|
-
const centralDirectory = concatByteArrays(centralChunks);
|
|
211
|
-
const endOfCentralDirectory = createByteBuffer(22);
|
|
212
|
-
const endOfCentralDirectoryView = new DataView(endOfCentralDirectory.buffer);
|
|
213
|
-
endOfCentralDirectoryView.setUint32(0, 0x06054b50, true);
|
|
214
|
-
endOfCentralDirectoryView.setUint16(4, 0, true);
|
|
215
|
-
endOfCentralDirectoryView.setUint16(6, 0, true);
|
|
216
|
-
endOfCentralDirectoryView.setUint16(8, entries.length, true);
|
|
217
|
-
endOfCentralDirectoryView.setUint16(10, entries.length, true);
|
|
218
|
-
endOfCentralDirectoryView.setUint32(12, centralDirectory.byteLength, true);
|
|
219
|
-
endOfCentralDirectoryView.setUint32(16, centralDirectoryOffset, true);
|
|
220
|
-
endOfCentralDirectoryView.setUint16(20, 0, true);
|
|
221
|
-
|
|
222
|
-
return concatByteArrays([...localChunks, centralDirectory, endOfCentralDirectory]);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function encodeXml(xml: string): Uint8Array {
|
|
226
|
-
return encodeUtf8(xml);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
function escapeXml(value: string): string {
|
|
230
|
-
return value
|
|
231
|
-
.replace(/&/g, "&")
|
|
232
|
-
.replace(/"/g, """)
|
|
233
|
-
.replace(/</g, "<")
|
|
234
|
-
.replace(/>/g, ">")
|
|
235
|
-
.replace(/'/g, "'");
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
function calculateCrc32(bytes: Uint8Array): number {
|
|
239
|
-
let crc = 0xffffffff;
|
|
240
|
-
|
|
241
|
-
for (const byte of bytes) {
|
|
242
|
-
crc ^= byte;
|
|
243
|
-
for (let bit = 0; bit < 8; bit += 1) {
|
|
244
|
-
const mask = -(crc & 1);
|
|
245
|
-
crc = (crc >>> 1) ^ (0xedb88320 & mask);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return (crc ^ 0xffffffff) >>> 0;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function createByteBuffer(size: number): Uint8Array {
|
|
253
|
-
return new Uint8Array(size);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function concatByteArrays(chunks: readonly Uint8Array[]): Uint8Array {
|
|
257
|
-
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
|
|
258
|
-
const combined = new Uint8Array(totalLength);
|
|
259
|
-
let offset = 0;
|
|
260
|
-
|
|
261
|
-
for (const chunk of chunks) {
|
|
262
|
-
combined.set(chunk, offset);
|
|
263
|
-
offset += chunk.byteLength;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return combined;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
function encodeUtf8(value: string): Uint8Array {
|
|
270
|
-
return new TextEncoder().encode(value);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
export { buildContentTypesXml, buildRelationshipsXml, calculateCrc32 };
|