@rowsncolumns/toolkit 24.4.1
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/LICENSE.md +100 -0
- package/Readme.md +27 -0
- package/dist/cjs/autofilter-condition.d.ts +43 -0
- package/dist/cjs/autofilter-condition.d.ts.map +1 -0
- package/dist/cjs/autofilter-condition.js +155 -0
- package/dist/cjs/csv-export.d.ts +49 -0
- package/dist/cjs/csv-export.d.ts.map +1 -0
- package/dist/cjs/csv-export.js +142 -0
- package/dist/cjs/csv-import-worker.d.ts +16 -0
- package/dist/cjs/csv-import-worker.d.ts.map +1 -0
- package/dist/cjs/csv-import-worker.js +60 -0
- package/dist/cjs/csv-import.d.ts +38 -0
- package/dist/cjs/csv-import.d.ts.map +1 -0
- package/dist/cjs/csv-import.js +166 -0
- package/dist/cjs/csv-parser/helpers.d.ts +14 -0
- package/dist/cjs/csv-parser/helpers.d.ts.map +1 -0
- package/dist/cjs/csv-parser/helpers.js +145 -0
- package/dist/cjs/csv-parser/types.d.ts +66 -0
- package/dist/cjs/csv-parser/types.d.ts.map +1 -0
- package/dist/cjs/csv-parser/types.js +14 -0
- package/dist/cjs/csv-parser/worker.d.ts +2 -0
- package/dist/cjs/csv-parser/worker.d.ts.map +1 -0
- package/dist/cjs/csv-parser/worker.js +200 -0
- package/dist/cjs/excel-export.d.ts +11 -0
- package/dist/cjs/excel-export.d.ts.map +1 -0
- package/dist/cjs/excel-export.js +22 -0
- package/dist/cjs/excel-import-session.d.ts +51 -0
- package/dist/cjs/excel-import-session.d.ts.map +1 -0
- package/dist/cjs/excel-import-session.js +307 -0
- package/dist/cjs/excel-import-worker.d.ts +7 -0
- package/dist/cjs/excel-import-worker.d.ts.map +1 -0
- package/dist/cjs/excel-import-worker.js +119 -0
- package/dist/cjs/excel-parser/builtin-numfmts.d.ts +24 -0
- package/dist/cjs/excel-parser/builtin-numfmts.d.ts.map +1 -0
- package/dist/cjs/excel-parser/builtin-numfmts.js +63 -0
- package/dist/cjs/excel-parser/cfb-decryptor.d.ts +53 -0
- package/dist/cjs/excel-parser/cfb-decryptor.d.ts.map +1 -0
- package/dist/cjs/excel-parser/cfb-decryptor.js +553 -0
- package/dist/cjs/excel-parser/cfb-encryptor.d.ts +23 -0
- package/dist/cjs/excel-parser/cfb-encryptor.d.ts.map +1 -0
- package/dist/cjs/excel-parser/cfb-encryptor.js +200 -0
- package/dist/cjs/excel-parser/dv-cell-stamp.d.ts +29 -0
- package/dist/cjs/excel-parser/dv-cell-stamp.d.ts.map +1 -0
- package/dist/cjs/excel-parser/dv-cell-stamp.js +239 -0
- package/dist/cjs/excel-parser/helpers.d.ts +28 -0
- package/dist/cjs/excel-parser/helpers.d.ts.map +1 -0
- package/dist/cjs/excel-parser/helpers.js +188 -0
- package/dist/cjs/excel-parser/interface.d.ts +179 -0
- package/dist/cjs/excel-parser/interface.d.ts.map +1 -0
- package/dist/cjs/excel-parser/interface.js +1 -0
- package/dist/cjs/excel-parser/plugins/base/index.d.ts +31 -0
- package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/base/index.js +101 -0
- package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
- package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.js +488 -0
- package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts +15 -0
- package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/data-validations.js +353 -0
- package/dist/cjs/excel-parser/plugins/ods/formula.d.ts +8 -0
- package/dist/cjs/excel-parser/plugins/ods/formula.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/formula.js +82 -0
- package/dist/cjs/excel-parser/plugins/ods/index.d.ts +122 -0
- package/dist/cjs/excel-parser/plugins/ods/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/index.js +3642 -0
- package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts +25 -0
- package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/sparklines.js +221 -0
- package/dist/cjs/excel-parser/plugins/ods/styles.d.ts +60 -0
- package/dist/cjs/excel-parser/plugins/ods/styles.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/styles.js +808 -0
- package/dist/cjs/excel-parser/plugins/ods/types.d.ts +7 -0
- package/dist/cjs/excel-parser/plugins/ods/types.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/types.js +1 -0
- package/dist/cjs/excel-parser/plugins/xls/index.d.ts +5 -0
- package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xls/index.js +19 -0
- package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
- package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.js +49 -0
- package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts +117 -0
- package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsb/index.js +2972 -0
- package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
- package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.js +527 -0
- package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts +5 -0
- package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsm/index.js +10 -0
- package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts +60 -0
- package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/charts.js +2178 -0
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.js +620 -0
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.js +515 -0
- package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
- package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/drawing.js +941 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +320 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.js +6056 -0
- package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
- package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/numfmt.js +3 -0
- package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
- package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/pivots.js +342 -0
- package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
- package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/relationships.js +26 -0
- package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
- package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.js +59 -0
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +44 -0
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/styles.js +1377 -0
- package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts +50 -0
- package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/theme.js +150 -0
- package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
- package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.js +141 -0
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.js +407 -0
- package/dist/cjs/excel-parser/registry.d.ts +5 -0
- package/dist/cjs/excel-parser/registry.d.ts.map +1 -0
- package/dist/cjs/excel-parser/registry.js +21 -0
- package/dist/cjs/excel-parser/style-registry.d.ts +51 -0
- package/dist/cjs/excel-parser/style-registry.d.ts.map +1 -0
- package/dist/cjs/excel-parser/style-registry.js +175 -0
- package/dist/cjs/excel-parser/theme-default.d.ts +3 -0
- package/dist/cjs/excel-parser/theme-default.d.ts.map +1 -0
- package/dist/cjs/excel-parser/theme-default.js +19 -0
- package/dist/cjs/excel-parser/types.d.ts +365 -0
- package/dist/cjs/excel-parser/types.d.ts.map +1 -0
- package/dist/cjs/excel-parser/types.js +59 -0
- package/dist/cjs/excel-parser/utils.d.ts +6 -0
- package/dist/cjs/excel-parser/utils.d.ts.map +1 -0
- package/dist/cjs/excel-parser/utils.js +30 -0
- package/dist/cjs/excel-parser/workbook.d.ts +51 -0
- package/dist/cjs/excel-parser/workbook.d.ts.map +1 -0
- package/dist/cjs/excel-parser/workbook.js +317 -0
- package/dist/cjs/excel-parser/worker.d.ts +2 -0
- package/dist/cjs/excel-parser/worker.d.ts.map +1 -0
- package/dist/cjs/excel-parser/worker.js +1149 -0
- package/dist/cjs/excel-parser/zip-parser-streaming.d.ts +13 -0
- package/dist/cjs/excel-parser/zip-parser-streaming.d.ts.map +1 -0
- package/dist/cjs/excel-parser/zip-parser-streaming.js +200 -0
- package/dist/cjs/excel-parser/zip-parser.d.ts +11 -0
- package/dist/cjs/excel-parser/zip-parser.d.ts.map +1 -0
- package/dist/cjs/excel-parser/zip-parser.js +49 -0
- package/dist/cjs/exporter/invalid-data-validation.d.ts +19 -0
- package/dist/cjs/exporter/invalid-data-validation.d.ts.map +1 -0
- package/dist/cjs/exporter/invalid-data-validation.js +39 -0
- package/dist/cjs/exporter/ods/ods-export.d.ts +26 -0
- package/dist/cjs/exporter/ods/ods-export.d.ts.map +1 -0
- package/dist/cjs/exporter/ods/ods-export.js +3714 -0
- package/dist/cjs/exporter/ods/sparkline-builder.d.ts +33 -0
- package/dist/cjs/exporter/ods/sparkline-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/ods/sparkline-builder.js +221 -0
- package/dist/cjs/exporter/xlsx/chart-builder.d.ts +3 -0
- package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/chart-builder.js +1901 -0
- package/dist/cjs/exporter/xlsx/chart-templates.d.ts +1781 -0
- package/dist/cjs/exporter/xlsx/chart-templates.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/chart-templates.js +1798 -0
- package/dist/cjs/exporter/xlsx/future-functions.d.ts +10 -0
- package/dist/cjs/exporter/xlsx/future-functions.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/future-functions.js +264 -0
- package/dist/cjs/exporter/xlsx/pivot-builder.d.ts +58 -0
- package/dist/cjs/exporter/xlsx/pivot-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/pivot-builder.js +277 -0
- package/dist/cjs/exporter/xlsx/power-query-builder.d.ts +26 -0
- package/dist/cjs/exporter/xlsx/power-query-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/power-query-builder.js +306 -0
- package/dist/cjs/exporter/xlsx/slicer-builder.d.ts +11 -0
- package/dist/cjs/exporter/xlsx/slicer-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/slicer-builder.js +87 -0
- package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts +61 -0
- package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/sparkline-builder.js +489 -0
- package/dist/cjs/exporter/xlsx/style-builder.d.ts +93 -0
- package/dist/cjs/exporter/xlsx/style-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/style-builder.js +813 -0
- package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
- package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/threaded-comments-builder.js +189 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts +121 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.js +4596 -0
- package/dist/cjs/helpers/theme-xml-generator.d.ts +8 -0
- package/dist/cjs/helpers/theme-xml-generator.d.ts.map +1 -0
- package/dist/cjs/helpers/theme-xml-generator.js +33 -0
- package/dist/cjs/helpers.d.ts +34 -0
- package/dist/cjs/helpers.d.ts.map +1 -0
- package/dist/cjs/helpers.js +189 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/indexed-colors.d.ts +2 -0
- package/dist/cjs/indexed-colors.d.ts.map +1 -0
- package/dist/cjs/indexed-colors.js +75 -0
- package/dist/cjs/ods-export.d.ts +24 -0
- package/dist/cjs/ods-export.d.ts.map +1 -0
- package/dist/cjs/ods-export.js +23 -0
- package/dist/cjs/parse.d.ts +24 -0
- package/dist/cjs/parse.d.ts.map +1 -0
- package/dist/cjs/parse.js +68 -0
- package/dist/cjs/power-query.d.ts +41 -0
- package/dist/cjs/power-query.d.ts.map +1 -0
- package/dist/cjs/power-query.js +22 -0
- package/dist/cjs/server.d.ts +9 -0
- package/dist/cjs/server.d.ts.map +1 -0
- package/dist/cjs/server.js +8 -0
- package/dist/cjs/theme1.d.ts +3 -0
- package/dist/cjs/theme1.d.ts.map +1 -0
- package/dist/cjs/theme1.js +2 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/types.d.ts +14 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +14 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +16 -0
- package/dist/esm/autofilter-condition.d.ts +43 -0
- package/dist/esm/autofilter-condition.d.ts.map +1 -0
- package/dist/esm/autofilter-condition.js +145 -0
- package/dist/esm/csv-export.d.ts +49 -0
- package/dist/esm/csv-export.d.ts.map +1 -0
- package/dist/esm/csv-export.js +126 -0
- package/dist/esm/csv-import-worker.d.ts +16 -0
- package/dist/esm/csv-import-worker.d.ts.map +1 -0
- package/dist/esm/csv-import-worker.js +60 -0
- package/dist/esm/csv-import.d.ts +38 -0
- package/dist/esm/csv-import.d.ts.map +1 -0
- package/dist/esm/csv-import.js +132 -0
- package/dist/esm/csv-parser/helpers.d.ts +14 -0
- package/dist/esm/csv-parser/helpers.d.ts.map +1 -0
- package/dist/esm/csv-parser/helpers.js +0 -0
- package/dist/esm/csv-parser/types.d.ts +66 -0
- package/dist/esm/csv-parser/types.d.ts.map +1 -0
- package/dist/esm/csv-parser/types.js +14 -0
- package/dist/esm/csv-parser/worker.d.ts +2 -0
- package/dist/esm/csv-parser/worker.d.ts.map +1 -0
- package/dist/esm/csv-parser/worker.js +154 -0
- package/dist/esm/excel-export.d.ts +11 -0
- package/dist/esm/excel-export.d.ts.map +1 -0
- package/dist/esm/excel-export.js +13 -0
- package/dist/esm/excel-import-session.d.ts +51 -0
- package/dist/esm/excel-import-session.d.ts.map +1 -0
- package/dist/esm/excel-import-session.js +255 -0
- package/dist/esm/excel-import-worker.d.ts +7 -0
- package/dist/esm/excel-import-worker.d.ts.map +1 -0
- package/dist/esm/excel-import-worker.js +116 -0
- package/dist/esm/excel-parser/builtin-numfmts.d.ts +24 -0
- package/dist/esm/excel-parser/builtin-numfmts.d.ts.map +1 -0
- package/dist/esm/excel-parser/builtin-numfmts.js +59 -0
- package/dist/esm/excel-parser/cfb-decryptor.d.ts +53 -0
- package/dist/esm/excel-parser/cfb-decryptor.d.ts.map +1 -0
- package/dist/esm/excel-parser/cfb-decryptor.js +493 -0
- package/dist/esm/excel-parser/cfb-encryptor.d.ts +23 -0
- package/dist/esm/excel-parser/cfb-encryptor.d.ts.map +1 -0
- package/dist/esm/excel-parser/cfb-encryptor.js +181 -0
- package/dist/esm/excel-parser/dv-cell-stamp.d.ts +29 -0
- package/dist/esm/excel-parser/dv-cell-stamp.d.ts.map +1 -0
- package/dist/esm/excel-parser/dv-cell-stamp.js +155 -0
- package/dist/esm/excel-parser/helpers.d.ts +28 -0
- package/dist/esm/excel-parser/helpers.d.ts.map +1 -0
- package/dist/esm/excel-parser/helpers.js +160 -0
- package/dist/esm/excel-parser/interface.d.ts +179 -0
- package/dist/esm/excel-parser/interface.d.ts.map +1 -0
- package/dist/esm/excel-parser/interface.js +1 -0
- package/dist/esm/excel-parser/plugins/base/index.d.ts +31 -0
- package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/base/index.js +64 -0
- package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
- package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/conditional-formatting.js +405 -0
- package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts +15 -0
- package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/data-validations.js +331 -0
- package/dist/esm/excel-parser/plugins/ods/formula.d.ts +8 -0
- package/dist/esm/excel-parser/plugins/ods/formula.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/formula.js +82 -0
- package/dist/esm/excel-parser/plugins/ods/index.d.ts +122 -0
- package/dist/esm/excel-parser/plugins/ods/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/index.js +2896 -0
- package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts +25 -0
- package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/sparklines.js +188 -0
- package/dist/esm/excel-parser/plugins/ods/styles.d.ts +60 -0
- package/dist/esm/excel-parser/plugins/ods/styles.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/styles.js +732 -0
- package/dist/esm/excel-parser/plugins/ods/types.d.ts +7 -0
- package/dist/esm/excel-parser/plugins/ods/types.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/types.js +1 -0
- package/dist/esm/excel-parser/plugins/xls/index.d.ts +5 -0
- package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xls/index.js +7 -0
- package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
- package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.js +48 -0
- package/dist/esm/excel-parser/plugins/xlsb/index.d.ts +117 -0
- package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsb/index.js +2339 -0
- package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
- package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.js +522 -0
- package/dist/esm/excel-parser/plugins/xlsm/index.d.ts +5 -0
- package/dist/esm/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsm/index.js +6 -0
- package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts +60 -0
- package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/charts.js +2036 -0
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.js +621 -0
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.js +493 -0
- package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
- package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/drawing.js +905 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +320 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.js +4654 -0
- package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
- package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/numfmt.js +3 -0
- package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
- package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/pivots.js +254 -0
- package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
- package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/relationships.js +13 -0
- package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
- package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/sheet-views.js +64 -0
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +44 -0
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/styles.js +1365 -0
- package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts +50 -0
- package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/theme.js +127 -0
- package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
- package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.js +103 -0
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.js +399 -0
- package/dist/esm/excel-parser/registry.d.ts +5 -0
- package/dist/esm/excel-parser/registry.d.ts.map +1 -0
- package/dist/esm/excel-parser/registry.js +20 -0
- package/dist/esm/excel-parser/style-registry.d.ts +51 -0
- package/dist/esm/excel-parser/style-registry.d.ts.map +1 -0
- package/dist/esm/excel-parser/style-registry.js +163 -0
- package/dist/esm/excel-parser/theme-default.d.ts +3 -0
- package/dist/esm/excel-parser/theme-default.d.ts.map +1 -0
- package/dist/esm/excel-parser/theme-default.js +19 -0
- package/dist/esm/excel-parser/types.d.ts +365 -0
- package/dist/esm/excel-parser/types.d.ts.map +1 -0
- package/dist/esm/excel-parser/types.js +59 -0
- package/dist/esm/excel-parser/utils.d.ts +6 -0
- package/dist/esm/excel-parser/utils.d.ts.map +1 -0
- package/dist/esm/excel-parser/utils.js +25 -0
- package/dist/esm/excel-parser/workbook.d.ts +51 -0
- package/dist/esm/excel-parser/workbook.d.ts.map +1 -0
- package/dist/esm/excel-parser/workbook.js +192 -0
- package/dist/esm/excel-parser/worker.d.ts +2 -0
- package/dist/esm/excel-parser/worker.d.ts.map +1 -0
- package/dist/esm/excel-parser/worker.js +862 -0
- package/dist/esm/excel-parser/zip-parser-streaming.d.ts +13 -0
- package/dist/esm/excel-parser/zip-parser-streaming.d.ts.map +1 -0
- package/dist/esm/excel-parser/zip-parser-streaming.js +119 -0
- package/dist/esm/excel-parser/zip-parser.d.ts +11 -0
- package/dist/esm/excel-parser/zip-parser.d.ts.map +1 -0
- package/dist/esm/excel-parser/zip-parser.js +43 -0
- package/dist/esm/exporter/invalid-data-validation.d.ts +19 -0
- package/dist/esm/exporter/invalid-data-validation.d.ts.map +1 -0
- package/dist/esm/exporter/invalid-data-validation.js +37 -0
- package/dist/esm/exporter/ods/ods-export.d.ts +26 -0
- package/dist/esm/exporter/ods/ods-export.d.ts.map +1 -0
- package/dist/esm/exporter/ods/ods-export.js +3238 -0
- package/dist/esm/exporter/ods/sparkline-builder.d.ts +33 -0
- package/dist/esm/exporter/ods/sparkline-builder.d.ts.map +1 -0
- package/dist/esm/exporter/ods/sparkline-builder.js +165 -0
- package/dist/esm/exporter/xlsx/chart-builder.d.ts +3 -0
- package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/chart-builder.js +1805 -0
- package/dist/esm/exporter/xlsx/chart-templates.d.ts +1781 -0
- package/dist/esm/exporter/xlsx/chart-templates.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/chart-templates.js +1798 -0
- package/dist/esm/exporter/xlsx/future-functions.d.ts +10 -0
- package/dist/esm/exporter/xlsx/future-functions.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/future-functions.js +264 -0
- package/dist/esm/exporter/xlsx/pivot-builder.d.ts +58 -0
- package/dist/esm/exporter/xlsx/pivot-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/pivot-builder.js +230 -0
- package/dist/esm/exporter/xlsx/power-query-builder.d.ts +26 -0
- package/dist/esm/exporter/xlsx/power-query-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/power-query-builder.js +257 -0
- package/dist/esm/exporter/xlsx/slicer-builder.d.ts +11 -0
- package/dist/esm/exporter/xlsx/slicer-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/slicer-builder.js +84 -0
- package/dist/esm/exporter/xlsx/sparkline-builder.d.ts +61 -0
- package/dist/esm/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/sparkline-builder.js +437 -0
- package/dist/esm/exporter/xlsx/style-builder.d.ts +93 -0
- package/dist/esm/exporter/xlsx/style-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/style-builder.js +795 -0
- package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
- package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/threaded-comments-builder.js +175 -0
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts +121 -0
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/xlsx-export.js +4062 -0
- package/dist/esm/helpers/theme-xml-generator.d.ts +8 -0
- package/dist/esm/helpers/theme-xml-generator.d.ts.map +1 -0
- package/dist/esm/helpers/theme-xml-generator.js +33 -0
- package/dist/esm/helpers.d.ts +34 -0
- package/dist/esm/helpers.d.ts.map +1 -0
- package/dist/esm/helpers.js +182 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/indexed-colors.d.ts +2 -0
- package/dist/esm/indexed-colors.d.ts.map +1 -0
- package/dist/esm/indexed-colors.js +75 -0
- package/dist/esm/ods-export.d.ts +24 -0
- package/dist/esm/ods-export.d.ts.map +1 -0
- package/dist/esm/ods-export.js +12 -0
- package/dist/esm/parse.d.ts +24 -0
- package/dist/esm/parse.d.ts.map +1 -0
- package/dist/esm/parse.js +55 -0
- package/dist/esm/power-query.d.ts +41 -0
- package/dist/esm/power-query.d.ts.map +1 -0
- package/dist/esm/power-query.js +19 -0
- package/dist/esm/server.d.ts +9 -0
- package/dist/esm/server.d.ts.map +1 -0
- package/dist/esm/server.js +8 -0
- package/dist/esm/theme1.d.ts +3 -0
- package/dist/esm/theme1.d.ts.map +1 -0
- package/dist/esm/theme1.js +2 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +14 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +14 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +16 -0
- package/package.json +62 -0
- package/xlsx.d.ts +52 -0
|
@@ -0,0 +1,941 @@
|
|
|
1
|
+
import { __assign, __awaiter, __generator, __values } from "tslib";
|
|
2
|
+
import { uuid } from "@rowsncolumns/utils";
|
|
3
|
+
import { get } from "lodash-es";
|
|
4
|
+
/**
|
|
5
|
+
* Create a data URL from binary data and MIME type
|
|
6
|
+
* @param data Binary data of the image
|
|
7
|
+
* @param mimeType MIME type of the image
|
|
8
|
+
* @returns Data URL string
|
|
9
|
+
*/
|
|
10
|
+
function createDataUrl(data, mimeType) {
|
|
11
|
+
// Convert ArrayBuffer to Base64 string
|
|
12
|
+
var base64 = arrayBufferToBase64(data);
|
|
13
|
+
return "data:".concat(mimeType, ";base64,").concat(base64);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert an ArrayBuffer to a Base64 string
|
|
17
|
+
* @param buffer ArrayBuffer to convert
|
|
18
|
+
* @returns Base64 string
|
|
19
|
+
*/
|
|
20
|
+
function arrayBufferToBase64(buffer) {
|
|
21
|
+
var bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
22
|
+
// Use Buffer in Node.js, btoa in browser
|
|
23
|
+
if (typeof Buffer !== "undefined") {
|
|
24
|
+
return Buffer.from(bytes).toString("base64");
|
|
25
|
+
}
|
|
26
|
+
var binary = "";
|
|
27
|
+
var len = bytes.byteLength;
|
|
28
|
+
for (var i = 0; i < len; i++) {
|
|
29
|
+
binary += String.fromCharCode(bytes[i]);
|
|
30
|
+
}
|
|
31
|
+
return btoa(binary);
|
|
32
|
+
}
|
|
33
|
+
// Conversion constant: 1 pixel is approximately 9525 EMUs (at 96 DPI)
|
|
34
|
+
var EMU_PER_PIXEL = 9525;
|
|
35
|
+
var DEFAULT_CELL_IMAGE_MAX_SIZE_PX = 60;
|
|
36
|
+
var CELL_IMAGE_OFFSET_THRESHOLD_PX = 1;
|
|
37
|
+
/**
|
|
38
|
+
* Convert EMUs to pixels
|
|
39
|
+
* @param emuValue Value in English Metric Units
|
|
40
|
+
* @returns Value in pixels (at 96 DPI)
|
|
41
|
+
*/
|
|
42
|
+
function emuToPixels(emuValue) {
|
|
43
|
+
return Math.round(emuValue / EMU_PER_PIXEL);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Process different types of image anchors
|
|
47
|
+
* @param anchors The anchor elements from the drawing
|
|
48
|
+
* @param anchorType The type of anchor
|
|
49
|
+
* @param drawingPath The path to the drawing file
|
|
50
|
+
* @param sheetName The name of the worksheet
|
|
51
|
+
* @param zipParser The zip parser instance
|
|
52
|
+
* @param xmlParser The XML parser instance
|
|
53
|
+
* @returns An array of image objects with their properties and binary data
|
|
54
|
+
*/
|
|
55
|
+
export function processAnchors(anchors, anchorType, drawingPath, sheetId, zipParser, xmlParser) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
57
|
+
var images, anchorArray, _loop_1, anchorArray_1, anchorArray_1_1, anchor, e_1_1;
|
|
58
|
+
var e_1, _a;
|
|
59
|
+
var _b;
|
|
60
|
+
return __generator(this, function (_c) {
|
|
61
|
+
switch (_c.label) {
|
|
62
|
+
case 0:
|
|
63
|
+
images = [];
|
|
64
|
+
if (!anchors)
|
|
65
|
+
return [2 /*return*/, images];
|
|
66
|
+
anchorArray = Array.isArray(anchors) ? anchors : [anchors];
|
|
67
|
+
_loop_1 = function (anchor) {
|
|
68
|
+
var isInsideCell, position, fromColBase0, fromRowBase0, toColBase0, toRowBase0, fromCol, fromRow, toCol, toRow, fromColOffEmu, fromRowOffEmu, toColOffEmu, toRowOffEmu, fromColOff, fromRowOff, toColOff, toRowOff, cxEmu, cyEmu, width, height, editAs, fromColBase0, fromRowBase0, fromCol, fromRow, fromColOffEmu, fromRowOffEmu, fromColOff, fromRowOff, cxEmu, cyEmu, width, height, fLocksWithSheet, posXEmu, posYEmu, posX, posY, cxEmu, cyEmu, width, height, picture, shape, shapeSpec, cxEmu, cyEmu, rotUnits, txBody, textBoxName, textBoxId, cxEmu, cyEmu, width, height, textBoxSpec, blipRId, imageName, imageId, imageTitle, drawingDir, drawingFilename, drawingRelsPath, drawingRelsContent, drawingRels, imageRelations, imageRel, imageTarget, imagePath, baseDir, imageData, imageExt, imageType;
|
|
69
|
+
return __generator(this, function (_d) {
|
|
70
|
+
switch (_d.label) {
|
|
71
|
+
case 0:
|
|
72
|
+
isInsideCell = false;
|
|
73
|
+
position = {
|
|
74
|
+
sheetId: sheetId,
|
|
75
|
+
// sheet: sheetName,
|
|
76
|
+
// anchorType: anchorType, // Store the anchor type to differentiate positioning
|
|
77
|
+
};
|
|
78
|
+
if (anchorType === "twoCellAnchors") {
|
|
79
|
+
fromColBase0 = parseInt(get(anchor, "xdr:from.xdr:col.t$") ||
|
|
80
|
+
get(anchor, "from.col.t$") ||
|
|
81
|
+
get(anchor, "xdr:from.xdr:col") ||
|
|
82
|
+
get(anchor, "from.col") ||
|
|
83
|
+
"0");
|
|
84
|
+
fromRowBase0 = parseInt(get(anchor, "xdr:from.xdr:row.t$") ||
|
|
85
|
+
get(anchor, "from.row.t$") ||
|
|
86
|
+
get(anchor, "xdr:from.xdr:row") ||
|
|
87
|
+
get(anchor, "from.row") ||
|
|
88
|
+
"0");
|
|
89
|
+
toColBase0 = parseInt(get(anchor, "xdr:to.xdr:col.t$") ||
|
|
90
|
+
get(anchor, "to.col.t$") ||
|
|
91
|
+
get(anchor, "xdr:to.xdr:col") ||
|
|
92
|
+
get(anchor, "to.col") ||
|
|
93
|
+
"0");
|
|
94
|
+
toRowBase0 = parseInt(get(anchor, "xdr:to.xdr:row.t$") ||
|
|
95
|
+
get(anchor, "to.row.t$") ||
|
|
96
|
+
get(anchor, "xdr:to.xdr:row") ||
|
|
97
|
+
get(anchor, "to.row") ||
|
|
98
|
+
"0");
|
|
99
|
+
fromCol = fromColBase0 + 1;
|
|
100
|
+
fromRow = fromRowBase0 + 1;
|
|
101
|
+
toCol = toColBase0 + 1;
|
|
102
|
+
toRow = toRowBase0 + 1;
|
|
103
|
+
fromColOffEmu = parseInt(get(anchor, "xdr:from.xdr:colOff.t$") ||
|
|
104
|
+
get(anchor, "from.colOff.t$") ||
|
|
105
|
+
get(anchor, "xdr:from.xdr:colOff") ||
|
|
106
|
+
get(anchor, "from.colOff") ||
|
|
107
|
+
"0");
|
|
108
|
+
fromRowOffEmu = parseInt(get(anchor, "xdr:from.xdr:rowOff.t$") ||
|
|
109
|
+
get(anchor, "from.rowOff.t$") ||
|
|
110
|
+
get(anchor, "xdr:from.xdr:rowOff") ||
|
|
111
|
+
get(anchor, "from.rowOff") ||
|
|
112
|
+
"0");
|
|
113
|
+
toColOffEmu = parseInt(get(anchor, "xdr:to.xdr:colOff.t$") ||
|
|
114
|
+
get(anchor, "to.colOff.t$") ||
|
|
115
|
+
get(anchor, "xdr:to.xdr:colOff") ||
|
|
116
|
+
get(anchor, "to.colOff") ||
|
|
117
|
+
"0");
|
|
118
|
+
toRowOffEmu = parseInt(get(anchor, "xdr:to.xdr:rowOff.t$") ||
|
|
119
|
+
get(anchor, "to.rowOff.t$") ||
|
|
120
|
+
get(anchor, "xdr:to.xdr:rowOff") ||
|
|
121
|
+
get(anchor, "to.rowOff") ||
|
|
122
|
+
"0");
|
|
123
|
+
fromColOff = emuToPixels(fromColOffEmu);
|
|
124
|
+
fromRowOff = emuToPixels(fromRowOffEmu);
|
|
125
|
+
toColOff = emuToPixels(toColOffEmu);
|
|
126
|
+
toRowOff = emuToPixels(toRowOffEmu);
|
|
127
|
+
cxEmu = parseInt(get(anchor, "xdr:pic.xdr:spPr.a:xfrm.a:ext.a$.cx") ||
|
|
128
|
+
get(anchor, "pic.spPr.xfrm.ext.a$.cx") ||
|
|
129
|
+
"0");
|
|
130
|
+
cyEmu = parseInt(get(anchor, "xdr:pic.xdr:spPr.a:xfrm.a:ext.a$.cy") ||
|
|
131
|
+
get(anchor, "pic.spPr.xfrm.ext.a$.cy") ||
|
|
132
|
+
"0");
|
|
133
|
+
width = emuToPixels(cxEmu);
|
|
134
|
+
height = emuToPixels(cyEmu);
|
|
135
|
+
editAs = get(anchor, "a$.editAs") || "";
|
|
136
|
+
isInsideCell = determineIfTwoCellInsideCell(editAs, fromColBase0, fromRowBase0, toColBase0, toRowBase0);
|
|
137
|
+
position = __assign(__assign({}, position), { overlayPosition: {
|
|
138
|
+
anchorCell: {
|
|
139
|
+
rowIndex: fromRow,
|
|
140
|
+
columnIndex: fromCol,
|
|
141
|
+
},
|
|
142
|
+
heightPixels: height,
|
|
143
|
+
widthPixels: width,
|
|
144
|
+
offsetXPixels: fromColOff,
|
|
145
|
+
offsetYPixels: fromRowOff,
|
|
146
|
+
} });
|
|
147
|
+
}
|
|
148
|
+
else if (anchorType === "oneCellAnchor") {
|
|
149
|
+
fromColBase0 = parseInt(get(anchor, "xdr:from.xdr:col.t$") ||
|
|
150
|
+
get(anchor, "from.col.t$") ||
|
|
151
|
+
get(anchor, "xdr:from.xdr:col") ||
|
|
152
|
+
get(anchor, "from.col") ||
|
|
153
|
+
"0");
|
|
154
|
+
fromRowBase0 = parseInt(get(anchor, "xdr:from.xdr:row.t$") ||
|
|
155
|
+
get(anchor, "from.row.t$") ||
|
|
156
|
+
get(anchor, "xdr:from.xdr:row") ||
|
|
157
|
+
get(anchor, "from.row") ||
|
|
158
|
+
"0");
|
|
159
|
+
fromCol = fromColBase0 + 1;
|
|
160
|
+
fromRow = fromRowBase0 + 1;
|
|
161
|
+
fromColOffEmu = parseInt(get(anchor, "xdr:from.xdr:colOff.t$") ||
|
|
162
|
+
get(anchor, "from.colOff.t$") ||
|
|
163
|
+
get(anchor, "xdr:from.xdr:colOff") ||
|
|
164
|
+
get(anchor, "from.colOff") ||
|
|
165
|
+
"0");
|
|
166
|
+
fromRowOffEmu = parseInt(get(anchor, "xdr:from.xdr:rowOff.t$") ||
|
|
167
|
+
get(anchor, "from.rowOff.t$") ||
|
|
168
|
+
get(anchor, "xdr:from.xdr:rowOff") ||
|
|
169
|
+
get(anchor, "from.rowOff") ||
|
|
170
|
+
"0");
|
|
171
|
+
fromColOff = emuToPixels(fromColOffEmu);
|
|
172
|
+
fromRowOff = emuToPixels(fromRowOffEmu);
|
|
173
|
+
cxEmu = parseInt(get(anchor, "xdr:ext.a$.cx") || get(anchor, "ext.a$.cx") || "0");
|
|
174
|
+
cyEmu = parseInt(get(anchor, "xdr:ext.a$.cy") || get(anchor, "ext.a$.cy") || "0");
|
|
175
|
+
width = emuToPixels(cxEmu);
|
|
176
|
+
height = emuToPixels(cyEmu);
|
|
177
|
+
fLocksWithSheet = get(anchor, "xdr:clientData.a$.fLocksWithSheet") ||
|
|
178
|
+
get(anchor, "clientData.a$.fLocksWithSheet") ||
|
|
179
|
+
"0";
|
|
180
|
+
isInsideCell = determineIfOneCellInsideCell(fromColOffEmu, fromRowOffEmu, fLocksWithSheet, cxEmu, cyEmu);
|
|
181
|
+
position = __assign(__assign({}, position), { overlayPosition: {
|
|
182
|
+
anchorCell: {
|
|
183
|
+
rowIndex: fromRow,
|
|
184
|
+
columnIndex: fromCol,
|
|
185
|
+
},
|
|
186
|
+
heightPixels: height,
|
|
187
|
+
widthPixels: width,
|
|
188
|
+
offsetXPixels: fromColOff,
|
|
189
|
+
offsetYPixels: fromRowOff,
|
|
190
|
+
} });
|
|
191
|
+
// position = {
|
|
192
|
+
// ...position,
|
|
193
|
+
// fromCol,
|
|
194
|
+
// fromRow,
|
|
195
|
+
// fromColOff,
|
|
196
|
+
// fromRowOff,
|
|
197
|
+
// width,
|
|
198
|
+
// height,
|
|
199
|
+
// // Store original indices in case they're needed
|
|
200
|
+
// _fromColBase0: fromColBase0,
|
|
201
|
+
// _fromRowBase0: fromRowBase0,
|
|
202
|
+
// // Store original EMU values for reference if needed
|
|
203
|
+
// _fromColOffEmu: fromColOffEmu,
|
|
204
|
+
// _fromRowOffEmu: fromRowOffEmu,
|
|
205
|
+
// _widthEmu: cxEmu,
|
|
206
|
+
// _heightEmu: cyEmu,
|
|
207
|
+
// fLocksWithSheet: fLocksWithSheet === "1",
|
|
208
|
+
// // For oneCellAnchor, determine based on offsets and locking
|
|
209
|
+
// isInsideCell: determineIfOneCellInsideCell(
|
|
210
|
+
// fromColOffEmu,
|
|
211
|
+
// fromRowOffEmu,
|
|
212
|
+
// fLocksWithSheet,
|
|
213
|
+
// cxEmu,
|
|
214
|
+
// cyEmu
|
|
215
|
+
// ),
|
|
216
|
+
// };
|
|
217
|
+
}
|
|
218
|
+
else if (anchorType === "absoluteAnchors") {
|
|
219
|
+
posXEmu = parseInt(get(anchor, "xdr:pos.a$.x") || get(anchor, "pos.a$.x") || "0") || 0;
|
|
220
|
+
posYEmu = parseInt(get(anchor, "xdr:pos.a$.y") || get(anchor, "pos.a$.y") || "0") || 0;
|
|
221
|
+
posX = emuToPixels(posXEmu);
|
|
222
|
+
posY = emuToPixels(posYEmu);
|
|
223
|
+
cxEmu = parseInt(get(anchor, "xdr:ext.a$.cx") || get(anchor, "ext.a$.cx") || "0") || 0;
|
|
224
|
+
cyEmu = parseInt(get(anchor, "xdr:ext.a$.cy") || get(anchor, "ext.a$.cy") || "0") || 0;
|
|
225
|
+
width = emuToPixels(cxEmu);
|
|
226
|
+
height = emuToPixels(cyEmu);
|
|
227
|
+
position = __assign(__assign({}, position), { overlayPosition: {
|
|
228
|
+
anchorCell: {
|
|
229
|
+
rowIndex: 1,
|
|
230
|
+
columnIndex: 1,
|
|
231
|
+
},
|
|
232
|
+
heightPixels: height,
|
|
233
|
+
widthPixels: width,
|
|
234
|
+
offsetXPixels: posX,
|
|
235
|
+
offsetYPixels: posY,
|
|
236
|
+
} });
|
|
237
|
+
}
|
|
238
|
+
picture = get(anchor, "xdr:pic") || get(anchor, "pic");
|
|
239
|
+
shape = get(anchor, "xdr:sp") || get(anchor, "sp");
|
|
240
|
+
// Drawing shape (Insert → Shapes): parsed into an `EmbedShapeSpec` so the
|
|
241
|
+
// geometry/fill/outline render. A shape is only routed here when it is
|
|
242
|
+
// visibly a *shape* — a non-rect preset geometry, an explicit fill, or an
|
|
243
|
+
// `<xdr:style>` theme-style block. Plain text boxes (`txBox="1"`, or a bare
|
|
244
|
+
// unstyled rect) keep the textbox path below, so they don't inherit the
|
|
245
|
+
// shape renderer's default accent styling.
|
|
246
|
+
if (shape && isDrawingShape(shape)) {
|
|
247
|
+
shapeSpec = parseShapeSpec(shape);
|
|
248
|
+
cxEmu = parseInt(get(shape, "xdr:spPr.a:xfrm.a:ext.a$.cx") ||
|
|
249
|
+
get(shape, "spPr.xfrm.ext.a$.cx") ||
|
|
250
|
+
"0");
|
|
251
|
+
cyEmu = parseInt(get(shape, "xdr:spPr.a:xfrm.a:ext.a$.cy") ||
|
|
252
|
+
get(shape, "spPr.xfrm.ext.a$.cy") ||
|
|
253
|
+
"0");
|
|
254
|
+
if (cxEmu > 0 && cyEmu > 0 && position.overlayPosition) {
|
|
255
|
+
position.overlayPosition.widthPixels = emuToPixels(cxEmu);
|
|
256
|
+
position.overlayPosition.heightPixels = emuToPixels(cyEmu);
|
|
257
|
+
}
|
|
258
|
+
rotUnits = parseInt(get(shape, "xdr:spPr.a:xfrm.a$.rot") ||
|
|
259
|
+
get(shape, "spPr.xfrm.a$.rot") ||
|
|
260
|
+
"0");
|
|
261
|
+
images.push({
|
|
262
|
+
isInsideCell: isInsideCell,
|
|
263
|
+
embedId: uuid(),
|
|
264
|
+
spec: shapeSpec,
|
|
265
|
+
position: position,
|
|
266
|
+
rotation: rotUnits ? rotUnits / 60000 : undefined,
|
|
267
|
+
draggable: true,
|
|
268
|
+
});
|
|
269
|
+
return [2 /*return*/, "continue"];
|
|
270
|
+
}
|
|
271
|
+
// Process textbox if shape has text body
|
|
272
|
+
if (shape) {
|
|
273
|
+
txBody = get(shape, "xdr:txBody") || get(shape, "txBody");
|
|
274
|
+
if (txBody) {
|
|
275
|
+
textBoxName = get(shape, "xdr:nvSpPr.xdr:cNvPr.a$.name") ||
|
|
276
|
+
get(shape, "nvSpPr.cNvPr.a$.name") ||
|
|
277
|
+
"TextBox";
|
|
278
|
+
textBoxId = get(shape, "xdr:nvSpPr.xdr:cNvPr.a$.id") ||
|
|
279
|
+
get(shape, "nvSpPr.cNvPr.a$.id") ||
|
|
280
|
+
"";
|
|
281
|
+
cxEmu = parseInt(get(shape, "xdr:spPr.a:xfrm.a:ext.a$.cx") ||
|
|
282
|
+
get(shape, "spPr.xfrm.ext.a$.cx") ||
|
|
283
|
+
"0");
|
|
284
|
+
cyEmu = parseInt(get(shape, "xdr:spPr.a:xfrm.a:ext.a$.cy") ||
|
|
285
|
+
get(shape, "spPr.xfrm.ext.a$.cy") ||
|
|
286
|
+
"0");
|
|
287
|
+
// Convert EMUs to pixels and override position dimensions if available
|
|
288
|
+
if (cxEmu > 0 && cyEmu > 0) {
|
|
289
|
+
width = emuToPixels(cxEmu);
|
|
290
|
+
height = emuToPixels(cyEmu);
|
|
291
|
+
if (position.overlayPosition) {
|
|
292
|
+
position.overlayPosition.widthPixels = width;
|
|
293
|
+
position.overlayPosition.heightPixels = height;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
textBoxSpec = parseTextBoxContent(txBody, shape);
|
|
297
|
+
images.push({
|
|
298
|
+
isInsideCell: isInsideCell,
|
|
299
|
+
embedId: uuid(),
|
|
300
|
+
spec: textBoxSpec,
|
|
301
|
+
position: position,
|
|
302
|
+
draggable: true,
|
|
303
|
+
});
|
|
304
|
+
return [2 /*return*/, "continue"];
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (!picture)
|
|
308
|
+
return [2 /*return*/, "continue"];
|
|
309
|
+
blipRId = get(picture, "xdr:blipFill.a:blip.a$.embed") ||
|
|
310
|
+
get(picture, "xdr:blipFill.a:blip.a$.r:embed") ||
|
|
311
|
+
get(picture, "blipFill.a:blip.a$.embed") ||
|
|
312
|
+
get(picture, "blipFill.a:blip.a$.r:embed") ||
|
|
313
|
+
get(picture, "blipFill.blip.a$.embed") ||
|
|
314
|
+
get(picture, "blipFill.blip.a$.r:embed");
|
|
315
|
+
if (!blipRId)
|
|
316
|
+
return [2 /*return*/, "continue"];
|
|
317
|
+
imageName = get(picture, "xdr:nvPicPr.xdr:cNvPr.a$.name") ||
|
|
318
|
+
get(picture, "nvPicPr.cNvPr.a$.name") ||
|
|
319
|
+
"Image";
|
|
320
|
+
imageId = get(picture, "xdr:nvPicPr.xdr:cNvPr.a$.id") ||
|
|
321
|
+
get(picture, "nvPicPr.cNvPr.a$.id") ||
|
|
322
|
+
"";
|
|
323
|
+
imageTitle = get(picture, "xdr:nvPicPr.xdr:cNvPr.a$.title") ||
|
|
324
|
+
get(picture, "nvPicPr.cNvPr.a$.title") ||
|
|
325
|
+
"";
|
|
326
|
+
drawingDir = drawingPath.substring(0, drawingPath.lastIndexOf("/"));
|
|
327
|
+
drawingFilename = drawingPath.split("/").pop();
|
|
328
|
+
drawingRelsPath = "".concat(drawingDir, "/_rels/").concat(drawingFilename, ".rels");
|
|
329
|
+
return [4 /*yield*/, zipParser.getText(drawingRelsPath)];
|
|
330
|
+
case 1:
|
|
331
|
+
drawingRelsContent = _d.sent();
|
|
332
|
+
if (!drawingRelsContent)
|
|
333
|
+
return [2 /*return*/, "continue"];
|
|
334
|
+
drawingRels = xmlParser.parse(drawingRelsContent);
|
|
335
|
+
imageRelations = get(drawingRels, "Relationships.Relationship");
|
|
336
|
+
if (!imageRelations)
|
|
337
|
+
return [2 /*return*/, "continue"];
|
|
338
|
+
imageRel = Array.isArray(imageRelations)
|
|
339
|
+
? imageRelations.find(function (rel) { return rel.a$.Id === blipRId; })
|
|
340
|
+
: imageRelations.a$.Id === blipRId
|
|
341
|
+
? imageRelations
|
|
342
|
+
: null;
|
|
343
|
+
if (!imageRel)
|
|
344
|
+
return [2 /*return*/, "continue"];
|
|
345
|
+
imageTarget = imageRel.a$.Target;
|
|
346
|
+
imagePath = void 0;
|
|
347
|
+
// Handle different path formats
|
|
348
|
+
if (imageTarget.startsWith("/")) {
|
|
349
|
+
// Absolute path from the root of the zip
|
|
350
|
+
imagePath = imageTarget.substring(1);
|
|
351
|
+
}
|
|
352
|
+
else if (imageTarget.startsWith("../")) {
|
|
353
|
+
baseDir = drawingDir.split("/").slice(0, -1).join("/");
|
|
354
|
+
imagePath = "".concat(baseDir, "/").concat(imageTarget.replace("../", ""));
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
// Relative path in the same directory
|
|
358
|
+
imagePath = "".concat(drawingDir, "/").concat(imageTarget);
|
|
359
|
+
}
|
|
360
|
+
return [4 /*yield*/, zipParser.getBinary(imagePath)];
|
|
361
|
+
case 2:
|
|
362
|
+
imageData = _d.sent();
|
|
363
|
+
if (!imageData)
|
|
364
|
+
return [2 /*return*/, "continue"];
|
|
365
|
+
imageExt = ((_b = imagePath.split(".").pop()) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || "";
|
|
366
|
+
imageType = "image/".concat(imageExt === "jpg" ? "jpeg" : imageExt);
|
|
367
|
+
// Add the image to our collection
|
|
368
|
+
images.push({
|
|
369
|
+
isInsideCell: isInsideCell,
|
|
370
|
+
embedId: uuid(),
|
|
371
|
+
spec: {
|
|
372
|
+
id: imageId,
|
|
373
|
+
imageUrl: createDataUrl(imageData, imageType),
|
|
374
|
+
type: "image",
|
|
375
|
+
description: imageName,
|
|
376
|
+
},
|
|
377
|
+
position: position,
|
|
378
|
+
draggable: true,
|
|
379
|
+
lockAspectRatio: true,
|
|
380
|
+
});
|
|
381
|
+
return [2 /*return*/];
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
_c.label = 1;
|
|
386
|
+
case 1:
|
|
387
|
+
_c.trys.push([1, 6, 7, 8]);
|
|
388
|
+
anchorArray_1 = __values(anchorArray), anchorArray_1_1 = anchorArray_1.next();
|
|
389
|
+
_c.label = 2;
|
|
390
|
+
case 2:
|
|
391
|
+
if (!!anchorArray_1_1.done) return [3 /*break*/, 5];
|
|
392
|
+
anchor = anchorArray_1_1.value;
|
|
393
|
+
return [5 /*yield**/, _loop_1(anchor)];
|
|
394
|
+
case 3:
|
|
395
|
+
_c.sent();
|
|
396
|
+
_c.label = 4;
|
|
397
|
+
case 4:
|
|
398
|
+
anchorArray_1_1 = anchorArray_1.next();
|
|
399
|
+
return [3 /*break*/, 2];
|
|
400
|
+
case 5: return [3 /*break*/, 8];
|
|
401
|
+
case 6:
|
|
402
|
+
e_1_1 = _c.sent();
|
|
403
|
+
e_1 = { error: e_1_1 };
|
|
404
|
+
return [3 /*break*/, 8];
|
|
405
|
+
case 7:
|
|
406
|
+
try {
|
|
407
|
+
if (anchorArray_1_1 && !anchorArray_1_1.done && (_a = anchorArray_1.return)) _a.call(anchorArray_1);
|
|
408
|
+
}
|
|
409
|
+
finally { if (e_1) throw e_1.error; }
|
|
410
|
+
return [7 /*endfinally*/];
|
|
411
|
+
case 8: return [2 /*return*/, images];
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Parse color from DrawingML color element
|
|
418
|
+
* Supports both RGB (srgbClr) and theme colors (schemeClr)
|
|
419
|
+
*/
|
|
420
|
+
function parseDrawingColor(colorElement) {
|
|
421
|
+
if (!colorElement)
|
|
422
|
+
return undefined;
|
|
423
|
+
// RGB color
|
|
424
|
+
var srgbClr = get(colorElement, "a:srgbClr.a$.val");
|
|
425
|
+
if (srgbClr) {
|
|
426
|
+
return "#".concat(srgbClr);
|
|
427
|
+
}
|
|
428
|
+
// Theme color - map to approximate RGB values
|
|
429
|
+
var schemeClr = get(colorElement, "a:schemeClr.a$.val");
|
|
430
|
+
if (schemeClr) {
|
|
431
|
+
// Basic theme color mapping (Office theme defaults)
|
|
432
|
+
var themeColorMap = {
|
|
433
|
+
accent1: "#4472C4",
|
|
434
|
+
accent2: "#ED7D31",
|
|
435
|
+
accent3: "#A5A5A5",
|
|
436
|
+
accent4: "#FFC000",
|
|
437
|
+
accent5: "#5B9BD5",
|
|
438
|
+
accent6: "#70AD47",
|
|
439
|
+
dk1: "#000000",
|
|
440
|
+
lt1: "#FFFFFF",
|
|
441
|
+
dk2: "#44546A",
|
|
442
|
+
lt2: "#E7E6E6",
|
|
443
|
+
hlink: "#0563C1",
|
|
444
|
+
folHlink: "#954F72",
|
|
445
|
+
};
|
|
446
|
+
return themeColorMap[schemeClr] || "#000000";
|
|
447
|
+
}
|
|
448
|
+
return undefined;
|
|
449
|
+
}
|
|
450
|
+
var toArray = function (value) {
|
|
451
|
+
return Array.isArray(value) ? value : value ? [value] : [];
|
|
452
|
+
};
|
|
453
|
+
/** DrawingML scheme-color names → the spreadsheet theme's ColorIndex slots. */
|
|
454
|
+
var SCHEME_TO_THEME_INDEX = {
|
|
455
|
+
bg1: 0,
|
|
456
|
+
lt1: 0,
|
|
457
|
+
tx1: 1,
|
|
458
|
+
dk1: 1,
|
|
459
|
+
bg2: 2,
|
|
460
|
+
lt2: 2,
|
|
461
|
+
tx2: 3,
|
|
462
|
+
dk2: 3,
|
|
463
|
+
accent1: 4,
|
|
464
|
+
accent2: 5,
|
|
465
|
+
accent3: 6,
|
|
466
|
+
accent4: 7,
|
|
467
|
+
accent5: 8,
|
|
468
|
+
accent6: 9,
|
|
469
|
+
hlink: 10,
|
|
470
|
+
};
|
|
471
|
+
/** OOXML preset names → the renderer's preset union where they differ. */
|
|
472
|
+
var PRESET_RENAMES = {
|
|
473
|
+
rtTriangle: "rightTriangle",
|
|
474
|
+
snip1Rect: "snipSingleCornerRect",
|
|
475
|
+
};
|
|
476
|
+
/**
|
|
477
|
+
* Parse a DrawingML color element into a `Color` — a live theme reference
|
|
478
|
+
* (`{ theme, tint }`) for `<a:schemeClr>` (so the shape follows document theme
|
|
479
|
+
* changes, unlike {@link parseDrawingColor}'s baked-in hex), or a hex string
|
|
480
|
+
* for `<a:srgbClr>`. Luminance/tint modifiers map onto the theme tint:
|
|
481
|
+
* `lumOff`/`tint` lighten (accent1 "lighter 40%" = lumMod 60000 + lumOff 40000
|
|
482
|
+
* → tint 0.4), `shade`/`lumMod`-only darken.
|
|
483
|
+
*/
|
|
484
|
+
function parseDrawingColorValue(colorElement) {
|
|
485
|
+
if (!colorElement)
|
|
486
|
+
return undefined;
|
|
487
|
+
var srgbClr = get(colorElement, "a:srgbClr.a$.val");
|
|
488
|
+
if (srgbClr)
|
|
489
|
+
return "#".concat(srgbClr);
|
|
490
|
+
var schemeClr = get(colorElement, "a:schemeClr");
|
|
491
|
+
var schemeVal = get(schemeClr, "a$.val");
|
|
492
|
+
if (schemeVal) {
|
|
493
|
+
var theme = SCHEME_TO_THEME_INDEX[schemeVal];
|
|
494
|
+
if (theme === undefined) {
|
|
495
|
+
// Unmapped scheme name (e.g. folHlink): fall back to the baked hex.
|
|
496
|
+
return parseDrawingColor(colorElement);
|
|
497
|
+
}
|
|
498
|
+
var lumOff = parseInt(get(schemeClr, "a:lumOff.a$.val") || "0");
|
|
499
|
+
var tintVal = parseInt(get(schemeClr, "a:tint.a$.val") || "0");
|
|
500
|
+
var shade = parseInt(get(schemeClr, "a:shade.a$.val") || "0");
|
|
501
|
+
var lumMod = parseInt(get(schemeClr, "a:lumMod.a$.val") || "0");
|
|
502
|
+
var tint = void 0;
|
|
503
|
+
if (lumOff > 0)
|
|
504
|
+
tint = lumOff / 100000;
|
|
505
|
+
else if (tintVal > 0)
|
|
506
|
+
tint = tintVal / 100000;
|
|
507
|
+
else if (shade > 0)
|
|
508
|
+
tint = -(1 - shade / 100000);
|
|
509
|
+
else if (lumMod > 0 && lumMod < 100000)
|
|
510
|
+
tint = -(1 - lumMod / 100000);
|
|
511
|
+
return tint !== undefined ? { theme: theme, tint: tint } : { theme: theme };
|
|
512
|
+
}
|
|
513
|
+
return undefined;
|
|
514
|
+
}
|
|
515
|
+
/** `<a:alpha val>` (1/100000) under a color element → 0–1 opacity, if reduced. */
|
|
516
|
+
function parseColorOpacity(colorElement) {
|
|
517
|
+
var alpha = parseInt(get(colorElement, "a:srgbClr.a:alpha.a$.val") ||
|
|
518
|
+
get(colorElement, "a:schemeClr.a:alpha.a$.val") ||
|
|
519
|
+
"0");
|
|
520
|
+
return alpha > 0 && alpha < 100000 ? alpha / 100000 : undefined;
|
|
521
|
+
}
|
|
522
|
+
/** `<a:prstGeom>` → geometry preset + `<a:avLst>` adjust guides. */
|
|
523
|
+
function parseShapeGeometry(spPr) {
|
|
524
|
+
var e_2, _a;
|
|
525
|
+
var _b;
|
|
526
|
+
var prstGeom = get(spPr, "a:prstGeom");
|
|
527
|
+
var prst = get(prstGeom, "a$.prst");
|
|
528
|
+
if (!prst)
|
|
529
|
+
return undefined;
|
|
530
|
+
var adjustments;
|
|
531
|
+
try {
|
|
532
|
+
for (var _c = __values(toArray(get(prstGeom, "a:avLst.a:gd"))), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
533
|
+
var gd = _d.value;
|
|
534
|
+
var name_1 = get(gd, "a$.name");
|
|
535
|
+
var fmla = get(gd, "a$.fmla") || "";
|
|
536
|
+
var match = /^val\s+(-?\d+)$/.exec(fmla);
|
|
537
|
+
if (name_1 && match) {
|
|
538
|
+
(adjustments !== null && adjustments !== void 0 ? adjustments : (adjustments = {}))[name_1] = parseInt(match[1]);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
543
|
+
finally {
|
|
544
|
+
try {
|
|
545
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
546
|
+
}
|
|
547
|
+
finally { if (e_2) throw e_2.error; }
|
|
548
|
+
}
|
|
549
|
+
return { preset: (_b = PRESET_RENAMES[prst]) !== null && _b !== void 0 ? _b : prst, adjustments: adjustments };
|
|
550
|
+
}
|
|
551
|
+
/** Empty elements (`<a:noFill/>`) parse to `""` — presence must not be truthiness. */
|
|
552
|
+
var hasElement = function (obj, path) {
|
|
553
|
+
return get(obj, path) !== undefined;
|
|
554
|
+
};
|
|
555
|
+
/** Explicit `<a:noFill>`/`<a:solidFill>`/`<a:gradFill>` on `spPr` (style refs are separate). */
|
|
556
|
+
function parseShapeFill(spPr) {
|
|
557
|
+
if (hasElement(spPr, "a:noFill"))
|
|
558
|
+
return { kind: "none" };
|
|
559
|
+
var solidFill = get(spPr, "a:solidFill");
|
|
560
|
+
if (solidFill) {
|
|
561
|
+
var color = parseDrawingColorValue(solidFill);
|
|
562
|
+
if (color) {
|
|
563
|
+
return { kind: "solid", color: color, opacity: parseColorOpacity(solidFill) };
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
var gradFill = get(spPr, "a:gradFill");
|
|
567
|
+
if (gradFill) {
|
|
568
|
+
var stops = toArray(get(gradFill, "a:gsLst.a:gs"))
|
|
569
|
+
.map(function (gs) {
|
|
570
|
+
var _a;
|
|
571
|
+
return ({
|
|
572
|
+
position: parseInt(get(gs, "a$.pos") || "0") / 100000,
|
|
573
|
+
color: (_a = parseDrawingColorValue(gs)) !== null && _a !== void 0 ? _a : "#FFFFFF",
|
|
574
|
+
opacity: parseColorOpacity(gs),
|
|
575
|
+
});
|
|
576
|
+
})
|
|
577
|
+
.sort(function (a, b) { return a.position - b.position; });
|
|
578
|
+
if (stops.length) {
|
|
579
|
+
var ang = parseInt(get(gradFill, "a:lin.a$.ang") || "0");
|
|
580
|
+
return {
|
|
581
|
+
kind: "gradient",
|
|
582
|
+
stops: stops,
|
|
583
|
+
angle: ang ? ang / 60000 : 90,
|
|
584
|
+
shading: get(gradFill, "a:path") ? "radial" : "linear",
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
return undefined;
|
|
589
|
+
}
|
|
590
|
+
var DASH_RENAMES = {
|
|
591
|
+
solid: "solid",
|
|
592
|
+
dot: "dot",
|
|
593
|
+
sysDot: "dot",
|
|
594
|
+
dash: "dash",
|
|
595
|
+
sysDash: "dash",
|
|
596
|
+
dashDot: "dashDot",
|
|
597
|
+
sysDashDot: "dashDot",
|
|
598
|
+
lgDash: "longDash",
|
|
599
|
+
lgDashDot: "longDashDot",
|
|
600
|
+
lgDashDotDot: "longDashDotDot",
|
|
601
|
+
};
|
|
602
|
+
/** `<a:ln>` → outline; `<a:noFill>` inside it means explicitly strokeless (width 0). */
|
|
603
|
+
function parseShapeOutline(spPr) {
|
|
604
|
+
var ln = get(spPr, "a:ln");
|
|
605
|
+
if (ln === undefined)
|
|
606
|
+
return undefined;
|
|
607
|
+
if (hasElement(ln, "a:noFill"))
|
|
608
|
+
return { width: 0 };
|
|
609
|
+
var solidFill = get(ln, "a:solidFill");
|
|
610
|
+
var color = parseDrawingColorValue(solidFill);
|
|
611
|
+
var wEmu = parseInt(get(ln, "a$.w") || "0");
|
|
612
|
+
var dashVal = get(ln, "a:prstDash.a$.val");
|
|
613
|
+
if (!color && !wEmu && !dashVal)
|
|
614
|
+
return undefined;
|
|
615
|
+
return {
|
|
616
|
+
color: color,
|
|
617
|
+
width: wEmu ? emuToPixels(wEmu) : undefined,
|
|
618
|
+
dash: dashVal ? DASH_RENAMES[dashVal] : undefined,
|
|
619
|
+
opacity: solidFill ? parseColorOpacity(solidFill) : undefined,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
/** `<a:effectLst><a:outerShdw>` → drop shadow (distance+direction → x/y offsets). */
|
|
623
|
+
function parseShapeShadow(spPr) {
|
|
624
|
+
var shdw = get(spPr, "a:effectLst.a:outerShdw");
|
|
625
|
+
if (!shdw)
|
|
626
|
+
return undefined;
|
|
627
|
+
var distPx = emuToPixels(parseInt(get(shdw, "a$.dist") || "0"));
|
|
628
|
+
var dirRad = (parseInt(get(shdw, "a$.dir") || "0") / 60000) * (Math.PI / 180);
|
|
629
|
+
var blurRad = parseInt(get(shdw, "a$.blurRad") || "0");
|
|
630
|
+
return {
|
|
631
|
+
color: parseDrawingColorValue(shdw),
|
|
632
|
+
opacity: parseColorOpacity(shdw),
|
|
633
|
+
blurRadius: blurRad ? emuToPixels(blurRad) : undefined,
|
|
634
|
+
offsetXPixels: distPx ? Math.round(Math.cos(dirRad) * distPx) : undefined,
|
|
635
|
+
offsetYPixels: distPx ? Math.round(Math.sin(dirRad) * distPx) : undefined,
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
/** `<xdr:style>` fill/line/effect/font references into the theme format scheme. */
|
|
639
|
+
function parseShapeStyleRefs(shape) {
|
|
640
|
+
var style = get(shape, "xdr:style") || get(shape, "style");
|
|
641
|
+
if (!style)
|
|
642
|
+
return undefined;
|
|
643
|
+
var parseRef = function (name) {
|
|
644
|
+
var ref = get(style, name);
|
|
645
|
+
if (!ref)
|
|
646
|
+
return undefined;
|
|
647
|
+
var index = parseInt(get(ref, "a$.idx") || "0");
|
|
648
|
+
var color = parseDrawingColorValue(ref);
|
|
649
|
+
return color ? { index: index, color: color } : undefined;
|
|
650
|
+
};
|
|
651
|
+
var refs = {
|
|
652
|
+
fill: parseRef("a:fillRef"),
|
|
653
|
+
line: parseRef("a:lnRef"),
|
|
654
|
+
effect: parseRef("a:effectRef"),
|
|
655
|
+
};
|
|
656
|
+
var fontRef = get(style, "a:fontRef");
|
|
657
|
+
if (fontRef) {
|
|
658
|
+
var scheme = get(fontRef, "a$.idx");
|
|
659
|
+
if (scheme === "major" || scheme === "minor") {
|
|
660
|
+
refs.font = { scheme: scheme, color: parseDrawingColorValue(fontRef) };
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
return refs.fill || refs.line || refs.effect || refs.font ? refs : undefined;
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Whether an `<xdr:sp>` should import as a drawing shape (`EmbedShapeSpec`)
|
|
667
|
+
* rather than a textbox. Text boxes are excluded explicitly (`txBox="1"`), and
|
|
668
|
+
* a rect with no `<xdr:style>` block stays a textbox too — routing those to
|
|
669
|
+
* the shape renderer would repaint plain text notes with the default accent
|
|
670
|
+
* shape style.
|
|
671
|
+
*/
|
|
672
|
+
export function isDrawingShape(shape) {
|
|
673
|
+
var txBox = get(shape, "xdr:nvSpPr.xdr:cNvSpPr.a$.txBox") ||
|
|
674
|
+
get(shape, "nvSpPr.cNvSpPr.a$.txBox");
|
|
675
|
+
if (txBox === "1" || txBox === true)
|
|
676
|
+
return false;
|
|
677
|
+
var spPr = get(shape, "xdr:spPr") || get(shape, "spPr");
|
|
678
|
+
var preset = get(spPr, "a:prstGeom.a$.prst");
|
|
679
|
+
if (preset && preset !== "rect")
|
|
680
|
+
return true;
|
|
681
|
+
return hasElement(shape, "xdr:style") || hasElement(shape, "style");
|
|
682
|
+
}
|
|
683
|
+
/** Parse an `<xdr:sp>` drawing shape into an {@link EmbedShapeSpec}. */
|
|
684
|
+
export function parseShapeSpec(shape) {
|
|
685
|
+
var _a, _b, _c;
|
|
686
|
+
var spPr = get(shape, "xdr:spPr") || get(shape, "spPr");
|
|
687
|
+
var name = get(shape, "xdr:nvSpPr.xdr:cNvPr.a$.name") ||
|
|
688
|
+
get(shape, "nvSpPr.cNvPr.a$.name");
|
|
689
|
+
// Shape text rides the textbox content model; box-level background/borders
|
|
690
|
+
// are shape fill/outline concerns, so only the text fields carry over. An
|
|
691
|
+
// empty text body (Excel writes one on every shape) is omitted entirely.
|
|
692
|
+
var textBody;
|
|
693
|
+
var txBody = get(shape, "xdr:txBody") || get(shape, "txBody");
|
|
694
|
+
if (txBody) {
|
|
695
|
+
var tb = parseTextBoxContent(txBody, shape);
|
|
696
|
+
var hasText = Boolean((_a = tb.text) === null || _a === void 0 ? void 0 : _a.trim()) ||
|
|
697
|
+
Boolean((_b = tb.richText) === null || _b === void 0 ? void 0 : _b.some(function (run) { return run.text.trim(); }));
|
|
698
|
+
if (hasText) {
|
|
699
|
+
textBody = {
|
|
700
|
+
text: tb.text,
|
|
701
|
+
richText: tb.richText,
|
|
702
|
+
textFormat: tb.textFormat,
|
|
703
|
+
verticalAlignment: tb.verticalAlignment,
|
|
704
|
+
horizontalAlignment: tb.horizontalAlignment,
|
|
705
|
+
wrapStrategy: tb.wrapStrategy,
|
|
706
|
+
textRotation: tb.textRotation,
|
|
707
|
+
padding: tb.padding,
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
var xfrm = get(spPr, "a:xfrm");
|
|
712
|
+
var flipH = get(xfrm, "a$.flipH");
|
|
713
|
+
var flipV = get(xfrm, "a$.flipV");
|
|
714
|
+
return {
|
|
715
|
+
type: "shape",
|
|
716
|
+
name: name,
|
|
717
|
+
geometry: (_c = parseShapeGeometry(spPr)) !== null && _c !== void 0 ? _c : { preset: "rect" },
|
|
718
|
+
fill: parseShapeFill(spPr),
|
|
719
|
+
outline: parseShapeOutline(spPr),
|
|
720
|
+
shadow: parseShapeShadow(spPr),
|
|
721
|
+
styleRefs: parseShapeStyleRefs(shape),
|
|
722
|
+
textBody: textBody,
|
|
723
|
+
flipHorizontal: flipH === "1" || flipH === true ? true : undefined,
|
|
724
|
+
flipVertical: flipV === "1" || flipV === true ? true : undefined,
|
|
725
|
+
};
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Parse textbox content from DrawingML text body
|
|
729
|
+
* @param txBody The text body element from DrawingML
|
|
730
|
+
* @param shape The shape element containing formatting properties
|
|
731
|
+
* @returns EmbedTextBoxSpec object
|
|
732
|
+
*/
|
|
733
|
+
function parseTextBoxContent(txBody, shape) {
|
|
734
|
+
var e_3, _a, e_4, _b;
|
|
735
|
+
var richText = [];
|
|
736
|
+
var plainText = "";
|
|
737
|
+
// Get paragraphs
|
|
738
|
+
var paragraphs = get(txBody, "a:p") || [];
|
|
739
|
+
var paragraphArray = Array.isArray(paragraphs) ? paragraphs : [paragraphs];
|
|
740
|
+
try {
|
|
741
|
+
for (var paragraphArray_1 = __values(paragraphArray), paragraphArray_1_1 = paragraphArray_1.next(); !paragraphArray_1_1.done; paragraphArray_1_1 = paragraphArray_1.next()) {
|
|
742
|
+
var paragraph = paragraphArray_1_1.value;
|
|
743
|
+
// Extract paragraph properties for indentation and bullets
|
|
744
|
+
var pPr = get(paragraph, "a:pPr") || {};
|
|
745
|
+
var indentEmu = parseInt(get(pPr, "a$.marL") || get(pPr, "a$.indent") || "0");
|
|
746
|
+
// Convert EMUs to approximate character spaces (roughly 90000 EMUs ≈ 1 character space)
|
|
747
|
+
var indentSpaces = Math.round(indentEmu / 90000);
|
|
748
|
+
// Check for bullets
|
|
749
|
+
var bulletChar = "";
|
|
750
|
+
var buChar = get(pPr, "a:buChar.a$.char");
|
|
751
|
+
var buAutoNum = get(pPr, "a:buAutoNum");
|
|
752
|
+
var buNone = get(pPr, "a:buNone");
|
|
753
|
+
if (!buNone) {
|
|
754
|
+
if (buChar) {
|
|
755
|
+
// Custom bullet character (e.g., "•", "-", etc.)
|
|
756
|
+
bulletChar = buChar + " ";
|
|
757
|
+
}
|
|
758
|
+
else if (buAutoNum) {
|
|
759
|
+
// Auto-numbered bullets (would need context to track numbering)
|
|
760
|
+
bulletChar = "• ";
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
// Get text runs
|
|
764
|
+
var runs = get(paragraph, "a:r") || [];
|
|
765
|
+
var runArray = Array.isArray(runs) ? runs : runs ? [runs] : [];
|
|
766
|
+
// Add indentation and bullet to the first run of the paragraph
|
|
767
|
+
var isFirstRun = true;
|
|
768
|
+
try {
|
|
769
|
+
for (var runArray_1 = (e_4 = void 0, __values(runArray)), runArray_1_1 = runArray_1.next(); !runArray_1_1.done; runArray_1_1 = runArray_1.next()) {
|
|
770
|
+
var run = runArray_1_1.value;
|
|
771
|
+
var text = get(run, "a:t.t$") || get(run, "a:t") || "";
|
|
772
|
+
// Handle tab characters
|
|
773
|
+
var tabElements = get(run, "a:tab");
|
|
774
|
+
if (tabElements) {
|
|
775
|
+
var tabCount = Array.isArray(tabElements) ? tabElements.length : 1;
|
|
776
|
+
text = "\t".repeat(tabCount) + text;
|
|
777
|
+
}
|
|
778
|
+
// Add indentation and bullet to the first run
|
|
779
|
+
if (isFirstRun) {
|
|
780
|
+
if (indentSpaces > 0) {
|
|
781
|
+
var indent = " ".repeat(indentSpaces);
|
|
782
|
+
text = indent + text;
|
|
783
|
+
}
|
|
784
|
+
if (bulletChar) {
|
|
785
|
+
text = bulletChar + text;
|
|
786
|
+
}
|
|
787
|
+
isFirstRun = false;
|
|
788
|
+
}
|
|
789
|
+
plainText += text;
|
|
790
|
+
// Parse run properties
|
|
791
|
+
var rPr = get(run, "a:rPr") || {};
|
|
792
|
+
var format = {};
|
|
793
|
+
// Font size (in points * 100, e.g., 1100 = 11pt)
|
|
794
|
+
var sz = parseInt(get(rPr, "a$.sz") || "0");
|
|
795
|
+
if (sz > 0) {
|
|
796
|
+
format.fontSize = sz / 100;
|
|
797
|
+
}
|
|
798
|
+
// Bold
|
|
799
|
+
var bold = get(rPr, "a$.b");
|
|
800
|
+
if (bold === "1" || bold === true) {
|
|
801
|
+
format.bold = true;
|
|
802
|
+
}
|
|
803
|
+
// Italic
|
|
804
|
+
var italic = get(rPr, "a$.i");
|
|
805
|
+
if (italic === "1" || italic === true) {
|
|
806
|
+
format.italic = true;
|
|
807
|
+
}
|
|
808
|
+
// Underline
|
|
809
|
+
var underline = get(rPr, "a$.u");
|
|
810
|
+
if (underline && underline !== "none") {
|
|
811
|
+
format.underline = true;
|
|
812
|
+
}
|
|
813
|
+
// Strikethrough
|
|
814
|
+
var strike = get(rPr, "a$.strike");
|
|
815
|
+
if (strike && strike !== "noStrike") {
|
|
816
|
+
format.strikethrough = true;
|
|
817
|
+
}
|
|
818
|
+
// Font family
|
|
819
|
+
var fontFamily = get(rPr, "a:latin.a$.typeface");
|
|
820
|
+
if (fontFamily) {
|
|
821
|
+
format.fontFamily = fontFamily;
|
|
822
|
+
}
|
|
823
|
+
// Text color (supports RGB and theme colors)
|
|
824
|
+
var solidFill_1 = get(rPr, "a:solidFill");
|
|
825
|
+
var color = parseDrawingColor(solidFill_1);
|
|
826
|
+
if (color) {
|
|
827
|
+
format.color = color;
|
|
828
|
+
}
|
|
829
|
+
richText.push({
|
|
830
|
+
text: text,
|
|
831
|
+
format: Object.keys(format).length > 0 ? format : undefined,
|
|
832
|
+
});
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
836
|
+
finally {
|
|
837
|
+
try {
|
|
838
|
+
if (runArray_1_1 && !runArray_1_1.done && (_b = runArray_1.return)) _b.call(runArray_1);
|
|
839
|
+
}
|
|
840
|
+
finally { if (e_4) throw e_4.error; }
|
|
841
|
+
}
|
|
842
|
+
// Add paragraph break (newline) between paragraphs
|
|
843
|
+
if (paragraphArray.indexOf(paragraph) < paragraphArray.length - 1) {
|
|
844
|
+
plainText += "\n";
|
|
845
|
+
richText.push({ text: "\n" });
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
850
|
+
finally {
|
|
851
|
+
try {
|
|
852
|
+
if (paragraphArray_1_1 && !paragraphArray_1_1.done && (_a = paragraphArray_1.return)) _a.call(paragraphArray_1);
|
|
853
|
+
}
|
|
854
|
+
finally { if (e_3) throw e_3.error; }
|
|
855
|
+
}
|
|
856
|
+
// Get shape properties for background, borders, etc.
|
|
857
|
+
var spPr = get(shape, "xdr:spPr") || get(shape, "spPr");
|
|
858
|
+
var spec = {
|
|
859
|
+
type: "textbox",
|
|
860
|
+
text: plainText,
|
|
861
|
+
richText: richText.length > 0 ? richText : undefined,
|
|
862
|
+
};
|
|
863
|
+
// Parse background color (supports RGB and theme colors)
|
|
864
|
+
var solidFill = get(spPr, "a:solidFill");
|
|
865
|
+
var bgColor = parseDrawingColor(solidFill);
|
|
866
|
+
if (bgColor) {
|
|
867
|
+
spec.backgroundColor = bgColor;
|
|
868
|
+
}
|
|
869
|
+
// Parse text alignment and other properties from body properties
|
|
870
|
+
var bodyPr = get(txBody, "a:bodyPr") || {};
|
|
871
|
+
var anchor = get(bodyPr, "a$.anchor");
|
|
872
|
+
if (anchor) {
|
|
873
|
+
// Map DrawingML anchor to our vertical alignment
|
|
874
|
+
var anchorMap = {
|
|
875
|
+
t: "top",
|
|
876
|
+
ctr: "middle",
|
|
877
|
+
b: "bottom",
|
|
878
|
+
};
|
|
879
|
+
spec.verticalAlignment = anchorMap[anchor];
|
|
880
|
+
}
|
|
881
|
+
// Parse wrap strategy
|
|
882
|
+
var wrap = get(bodyPr, "a$.wrap");
|
|
883
|
+
if (wrap) {
|
|
884
|
+
var wrapMap = {
|
|
885
|
+
square: "wrap",
|
|
886
|
+
none: "overflow",
|
|
887
|
+
};
|
|
888
|
+
spec.wrapStrategy = wrapMap[wrap];
|
|
889
|
+
}
|
|
890
|
+
// Parse padding (insets) - convert from EMUs to pixels
|
|
891
|
+
var lIns = parseInt(get(bodyPr, "a$.lIns") || "0");
|
|
892
|
+
var rIns = parseInt(get(bodyPr, "a$.rIns") || "0");
|
|
893
|
+
var tIns = parseInt(get(bodyPr, "a$.tIns") || "0");
|
|
894
|
+
var bIns = parseInt(get(bodyPr, "a$.bIns") || "0");
|
|
895
|
+
// Use average of insets as padding (or could store separately if needed)
|
|
896
|
+
var avgPadding = (lIns + rIns + tIns + bIns) / 4;
|
|
897
|
+
if (avgPadding > 0) {
|
|
898
|
+
spec.padding = emuToPixels(avgPadding);
|
|
899
|
+
}
|
|
900
|
+
return spec;
|
|
901
|
+
}
|
|
902
|
+
/**
|
|
903
|
+
* Determine if a two-cell anchored image is inside a cell
|
|
904
|
+
* @param editAs The editAs attribute value
|
|
905
|
+
* @param fromCol From column
|
|
906
|
+
* @param fromRow From row
|
|
907
|
+
* @param toCol To column
|
|
908
|
+
* @param toRow To row
|
|
909
|
+
* @returns Boolean indicating if image is inside a cell
|
|
910
|
+
*/
|
|
911
|
+
function determineIfTwoCellInsideCell(editAs, fromCol, fromRow, toCol, toRow) {
|
|
912
|
+
// Two-cell anchors represent floating images in Excel. We only mark them as
|
|
913
|
+
// "cell" content when the rectangle is constrained to a single cell.
|
|
914
|
+
return fromCol === toCol && fromRow === toRow;
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Determine if a oneCellAnchor image is inside a cell
|
|
918
|
+
* Using EMU values for accurate assessment
|
|
919
|
+
* @param fromColOff Column offset in EMUs
|
|
920
|
+
* @param fromRowOff Row offset in EMUs
|
|
921
|
+
* @param fLocksWithSheet Whether image locks with sheet
|
|
922
|
+
* @param cx Image width in EMUs
|
|
923
|
+
* @param cy Image height in EMUs
|
|
924
|
+
* @returns Boolean indicating if the image is inside a cell
|
|
925
|
+
*/
|
|
926
|
+
export function determineIfOneCellInsideCell(fromColOff, fromRowOff, fLocksWithSheet, cx, cy) {
|
|
927
|
+
var widthPixels = emuToPixels(Math.max(0, cx));
|
|
928
|
+
var heightPixels = emuToPixels(Math.max(0, cy));
|
|
929
|
+
var exceedsCellSize = (!!widthPixels && widthPixels > DEFAULT_CELL_IMAGE_MAX_SIZE_PX) ||
|
|
930
|
+
(!!heightPixels && heightPixels > DEFAULT_CELL_IMAGE_MAX_SIZE_PX);
|
|
931
|
+
if (exceedsCellSize) {
|
|
932
|
+
return false;
|
|
933
|
+
}
|
|
934
|
+
if (fLocksWithSheet === "1") {
|
|
935
|
+
return true;
|
|
936
|
+
}
|
|
937
|
+
var offsetXPixels = Math.abs(emuToPixels(fromColOff));
|
|
938
|
+
var offsetYPixels = Math.abs(emuToPixels(fromRowOff));
|
|
939
|
+
return (offsetXPixels <= CELL_IMAGE_OFFSET_THRESHOLD_PX &&
|
|
940
|
+
offsetYPixels <= CELL_IMAGE_OFFSET_THRESHOLD_PX);
|
|
941
|
+
}
|