ooxml-core 0.19.0 → 0.21.0
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/README.md +21 -43
- package/dist/automation/index.cjs +195 -193
- package/dist/automation/index.mjs +195 -193
- package/dist/chart/axis-nice.d.ts +97 -0
- package/dist/chart/axis-nice.d.ts.map +1 -0
- package/dist/chart/histogram-binning.d.ts +40 -0
- package/dist/chart/histogram-binning.d.ts.map +1 -0
- package/dist/chart/index.cjs +167 -0
- package/dist/chart/index.d.ts +2 -0
- package/dist/chart/index.d.ts.map +1 -1
- package/dist/chart/index.mjs +162 -1
- package/dist/diagram/index.cjs +2 -1
- package/dist/diagram/index.mjs +2 -1
- package/dist/docx/attr-units.d.ts +11 -0
- package/dist/docx/attr-units.d.ts.map +1 -0
- package/dist/docx/block-parser.d.ts.map +1 -1
- package/dist/docx/case-transform.d.ts +9 -0
- package/dist/docx/case-transform.d.ts.map +1 -0
- package/dist/docx/embedded.cjs +2 -1
- package/dist/docx/embedded.mjs +2 -1
- package/dist/docx/index.cjs +289 -3
- package/dist/docx/index.d.ts +5 -0
- package/dist/docx/index.d.ts.map +1 -1
- package/dist/docx/index.mjs +269 -4
- package/dist/docx/layout/adapter.d.ts.map +1 -1
- package/dist/docx/layout/table-layout.d.ts.map +1 -1
- package/dist/docx/load/index.cjs +2 -1
- package/dist/docx/load/index.mjs +2 -1
- package/dist/docx/page-setup-model.d.ts +29 -0
- package/dist/docx/page-setup-model.d.ts.map +1 -0
- package/dist/docx/page-size.d.ts +11 -0
- package/dist/docx/page-size.d.ts.map +1 -0
- package/dist/docx/parse.d.ts.map +1 -1
- package/dist/docx/section-edit.d.ts +19 -0
- package/dist/docx/section-edit.d.ts.map +1 -0
- package/dist/docx/tab-stops.d.ts.map +1 -1
- package/dist/docx/ui/backstage-focus.d.ts +6 -0
- package/dist/docx/ui/backstage-focus.d.ts.map +1 -0
- package/dist/docx/ui/break-note-schema.d.ts +11 -0
- package/dist/docx/ui/break-note-schema.d.ts.map +1 -0
- package/dist/docx/ui/collaboration-authority.d.ts +31 -0
- package/dist/docx/ui/collaboration-authority.d.ts.map +1 -0
- package/dist/docx/ui/collaboration-identity.d.ts +8 -0
- package/dist/docx/ui/collaboration-identity.d.ts.map +1 -0
- package/dist/docx/ui/collaboration-protocol.d.ts +25 -0
- package/dist/docx/ui/collaboration-protocol.d.ts.map +1 -0
- package/dist/docx/ui/collaboration.d.ts +30 -0
- package/dist/docx/ui/collaboration.d.ts.map +1 -0
- package/dist/docx/ui/defined.d.ts +3 -0
- package/dist/docx/ui/defined.d.ts.map +1 -0
- package/dist/docx/ui/dirty-state.d.ts +9 -0
- package/dist/docx/ui/dirty-state.d.ts.map +1 -0
- package/dist/docx/ui/field-guard.d.ts +21 -0
- package/dist/docx/ui/field-guard.d.ts.map +1 -0
- package/dist/docx/ui/header-footer-history.d.ts +15 -0
- package/dist/docx/ui/header-footer-history.d.ts.map +1 -0
- package/dist/docx/ui/index.cjs +2380 -0
- package/dist/docx/ui/index.d.ts +30 -0
- package/dist/docx/ui/index.d.ts.map +1 -0
- package/dist/docx/ui/index.mjs +2317 -0
- package/dist/docx/ui/inline-content-schema.d.ts +15 -0
- package/dist/docx/ui/inline-content-schema.d.ts.map +1 -0
- package/dist/docx/ui/ligature-style.d.ts +4 -0
- package/dist/docx/ui/ligature-style.d.ts.map +1 -0
- package/dist/docx/ui/node-numbering.d.ts +8 -0
- package/dist/docx/ui/node-numbering.d.ts.map +1 -0
- package/dist/docx/ui/review-schema.d.ts +90 -0
- package/dist/docx/ui/review-schema.d.ts.map +1 -0
- package/dist/docx/ui/ribbon-action-ids.d.ts +26 -0
- package/dist/docx/ui/ribbon-action-ids.d.ts.map +1 -0
- package/dist/docx/ui/ribbon-colors.d.ts +3 -0
- package/dist/docx/ui/ribbon-colors.d.ts.map +1 -0
- package/dist/docx/ui/ribbon-legacy-labels.d.ts +6 -0
- package/dist/docx/ui/ribbon-legacy-labels.d.ts.map +1 -0
- package/dist/docx/ui/run-compare.d.ts +5 -0
- package/dist/docx/ui/run-compare.d.ts.map +1 -0
- package/dist/docx/ui/run-extra-mark.d.ts +17 -0
- package/dist/docx/ui/run-extra-mark.d.ts.map +1 -0
- package/dist/docx/ui/schema-marks.d.ts +273 -0
- package/dist/docx/ui/schema-marks.d.ts.map +1 -0
- package/dist/docx/ui/smartart-theme.d.ts +21 -0
- package/dist/docx/ui/smartart-theme.d.ts.map +1 -0
- package/dist/docx/ui/table-render.d.ts +24 -0
- package/dist/docx/ui/table-render.d.ts.map +1 -0
- package/dist/docx/ui/table-visuals.d.ts +3 -0
- package/dist/docx/ui/table-visuals.d.ts.map +1 -0
- package/dist/docx/ui/theme/css-vars.d.ts +6 -0
- package/dist/docx/ui/theme/css-vars.d.ts.map +1 -0
- package/dist/docx/ui/theme/defaults.d.ts +12 -0
- package/dist/docx/ui/theme/defaults.d.ts.map +1 -0
- package/dist/docx/ui/theme/element.d.ts +9 -0
- package/dist/docx/ui/theme/element.d.ts.map +1 -0
- package/dist/docx/ui/theme/index.d.ts +5 -0
- package/dist/docx/ui/theme/index.d.ts.map +1 -0
- package/dist/docx/ui/theme/types.d.ts +42 -0
- package/dist/docx/ui/theme/types.d.ts.map +1 -0
- package/dist/docx/ui/word-count.d.ts +3 -0
- package/dist/docx/ui/word-count.d.ts.map +1 -0
- package/dist/docx/ui/zoom-fit.d.ts +16 -0
- package/dist/docx/ui/zoom-fit.d.ts.map +1 -0
- package/dist/docx/validate-paragraph.d.ts.map +1 -1
- package/dist/index.cjs +169 -1
- package/dist/index.mjs +169 -1
- package/dist/math/index.cjs +2 -1
- package/dist/math/index.mjs +2 -1
- package/dist/opc/index.cjs +2 -1
- package/dist/opc/index.mjs +2 -1
- package/dist/pptx/automation/index.cjs +1572 -863
- package/dist/pptx/automation/index.d.ts +4 -3
- package/dist/pptx/automation/index.d.ts.map +1 -1
- package/dist/pptx/automation/index.mjs +1572 -863
- package/dist/pptx/chunks/color-ref-BM66NGFP.d.ts +42 -0
- package/dist/pptx/chunks/color-ref-BM66NGFP.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-D0yGoLyw.d.ts → index-CcQTCBnT.d.ts} +63 -479
- package/dist/pptx/chunks/index-CcQTCBnT.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-BtBj3VG1.d.ts → index-DHoPgFcH.d.ts} +529 -11
- package/dist/pptx/chunks/index-DHoPgFcH.d.ts.map +1 -0
- package/dist/pptx/chunks/{text-operations-GuisjlbR.d.ts → text-operations-BzdehTeY.d.ts} +50 -51
- package/dist/pptx/chunks/text-operations-BzdehTeY.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +1204 -489
- package/dist/pptx/cli/index.d.ts +1 -1
- package/dist/pptx/cli/index.mjs +1204 -489
- package/dist/pptx/converter/index.cjs +8 -5
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/converter/index.mjs +8 -5
- package/dist/pptx/index.cjs +1699 -989
- package/dist/pptx/index.d.ts +5 -4
- package/dist/pptx/index.mjs +1698 -990
- package/dist/pptx/ui/index.cjs +510 -0
- package/dist/pptx/ui/index.d.ts +80 -0
- package/dist/pptx/ui/index.d.ts.map +1 -0
- package/dist/pptx/ui/index.mjs +499 -0
- package/dist/visio/index.cjs +2 -1
- package/dist/visio/index.mjs +2 -1
- package/dist/visio/ui/contract.d.ts +33 -0
- package/dist/visio/ui/contract.d.ts.map +1 -0
- package/dist/visio/ui/demo-document.d.ts +4 -0
- package/dist/visio/ui/demo-document.d.ts.map +1 -0
- package/dist/visio/ui/diagnostics.d.ts +10 -0
- package/dist/visio/ui/diagnostics.d.ts.map +1 -0
- package/dist/visio/ui/document-history.d.ts +43 -0
- package/dist/visio/ui/document-history.d.ts.map +1 -0
- package/dist/visio/ui/document-text-search.d.ts +45 -0
- package/dist/visio/ui/document-text-search.d.ts.map +1 -0
- package/dist/visio/ui/edit-commands.d.ts +4 -0
- package/dist/visio/ui/edit-commands.d.ts.map +1 -0
- package/dist/visio/ui/edit-error.d.ts +5 -0
- package/dist/visio/ui/edit-error.d.ts.map +1 -0
- package/dist/visio/ui/foreign-vector-budget.d.ts +25 -0
- package/dist/visio/ui/foreign-vector-budget.d.ts.map +1 -0
- package/dist/visio/ui/index.cjs +1523 -0
- package/dist/visio/ui/index.d.ts +12 -0
- package/dist/visio/ui/index.d.ts.map +1 -0
- package/dist/visio/ui/index.mjs +1498 -0
- package/dist/visio/ui/scene-details.d.ts +8 -0
- package/dist/visio/ui/scene-details.d.ts.map +1 -0
- package/dist/visio/ui/scene-validation.d.ts +5 -0
- package/dist/visio/ui/scene-validation.d.ts.map +1 -0
- package/dist/visio/ui/snapshot-scene.d.ts +9 -0
- package/dist/visio/ui/snapshot-scene.d.ts.map +1 -0
- package/dist/xlsx/index.cjs +100 -98
- package/dist/xlsx/index.mjs +100 -98
- package/dist/xlsx/load/index.cjs +68 -66
- package/dist/xlsx/load/index.mjs +68 -66
- package/dist/xlsx/ui/backstage/templates.d.ts +16 -0
- package/dist/xlsx/ui/backstage/templates.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/alignment.d.ts +4 -0
- package/dist/xlsx/ui/commands/alignment.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/cells.d.ts +3 -0
- package/dist/xlsx/ui/commands/cells.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/cf-presets.d.ts +15 -0
- package/dist/xlsx/ui/commands/cf-presets.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/clipboard.d.ts +22 -0
- package/dist/xlsx/ui/commands/clipboard.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/contextual.d.ts +13 -0
- package/dist/xlsx/ui/commands/contextual.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/data.d.ts +3 -0
- package/dist/xlsx/ui/commands/data.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/editing.d.ts +13 -0
- package/dist/xlsx/ui/commands/editing.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/font.d.ts +21 -0
- package/dist/xlsx/ui/commands/font.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/formulas.d.ts +15 -0
- package/dist/xlsx/ui/commands/formulas.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/core-features.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/core-features.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/format-cells.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/format-cells.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/index.d.ts +4 -0
- package/dist/xlsx/ui/commands/i18n/index.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/messages.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/messages.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/navigation.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/ribbon-home.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/ribbon-home.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/ribbon-tabs.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/ribbon-tabs.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/rules.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/rules.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/tools.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/tools.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/types.d.ts +5 -0
- package/dist/xlsx/ui/commands/i18n/types.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/icons.d.ts +4 -0
- package/dist/xlsx/ui/commands/icons.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/number.d.ts +11 -0
- package/dist/xlsx/ui/commands/number.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/page-layout.d.ts +10 -0
- package/dist/xlsx/ui/commands/page-layout.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/select-special.d.ts +12 -0
- package/dist/xlsx/ui/commands/select-special.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/sort-filter.d.ts +3 -0
- package/dist/xlsx/ui/commands/sort-filter.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/style-presets.d.ts +21 -0
- package/dist/xlsx/ui/commands/style-presets.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/util.d.ts +59 -0
- package/dist/xlsx/ui/commands/util.d.ts.map +1 -0
- package/dist/xlsx/ui/commands.d.ts +36 -0
- package/dist/xlsx/ui/commands.d.ts.map +1 -0
- package/dist/xlsx/ui/context-menu/items.d.ts +36 -0
- package/dist/xlsx/ui/context-menu/items.d.ts.map +1 -0
- package/dist/xlsx/ui/context.d.ts +65 -0
- package/dist/xlsx/ui/context.d.ts.map +1 -0
- package/dist/xlsx/ui/dialogs/format-cells/number-categories.d.ts +28 -0
- package/dist/xlsx/ui/dialogs/format-cells/number-categories.d.ts.map +1 -0
- package/dist/xlsx/ui/dialogs/format-cells/types.d.ts +40 -0
- package/dist/xlsx/ui/dialogs/format-cells/types.d.ts.map +1 -0
- package/dist/xlsx/ui/dialogs/insert-chart-model.d.ts +9 -0
- package/dist/xlsx/ui/dialogs/insert-chart-model.d.ts.map +1 -0
- package/dist/xlsx/ui/dialogs.d.ts +9 -0
- package/dist/xlsx/ui/dialogs.d.ts.map +1 -0
- package/dist/xlsx/ui/dirty-state.d.ts +9 -0
- package/dist/xlsx/ui/dirty-state.d.ts.map +1 -0
- package/dist/xlsx/ui/formula-bar/name-resolve.d.ts +23 -0
- package/dist/xlsx/ui/formula-bar/name-resolve.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/cell-items.d.ts +42 -0
- package/dist/xlsx/ui/grid/cell-items.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/cell-paint.d.ts +26 -0
- package/dist/xlsx/ui/grid/cell-paint.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/edit-bridge.d.ts +47 -0
- package/dist/xlsx/ui/grid/edit-bridge.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/geometry.d.ts +76 -0
- package/dist/xlsx/ui/grid/geometry.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/icon-sets.d.ts +3 -0
- package/dist/xlsx/ui/grid/icon-sets.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/number-fit.d.ts +3 -0
- package/dist/xlsx/ui/grid/number-fit.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/selection-ops.d.ts +32 -0
- package/dist/xlsx/ui/grid/selection-ops.d.ts.map +1 -0
- package/dist/xlsx/ui/grid/view-cache.d.ts +15 -0
- package/dist/xlsx/ui/grid/view-cache.d.ts.map +1 -0
- package/dist/xlsx/ui/index.cjs +28484 -0
- package/dist/xlsx/ui/index.d.ts +56 -0
- package/dist/xlsx/ui/index.d.ts.map +1 -0
- package/dist/xlsx/ui/index.mjs +28290 -0
- package/dist/xlsx/ui/locales/de/commands.d.ts +2 -0
- package/dist/xlsx/ui/locales/de/commands.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/de/grid.d.ts +2 -0
- package/dist/xlsx/ui/locales/de/grid.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/de/index.d.ts +2 -0
- package/dist/xlsx/ui/locales/de/index.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/de/shell.d.ts +2 -0
- package/dist/xlsx/ui/locales/de/shell.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/en/commands.d.ts +2 -0
- package/dist/xlsx/ui/locales/en/commands.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/en/grid.d.ts +2 -0
- package/dist/xlsx/ui/locales/en/grid.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/en/index.d.ts +2 -0
- package/dist/xlsx/ui/locales/en/index.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/en/shell.d.ts +2 -0
- package/dist/xlsx/ui/locales/en/shell.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/es/commands.d.ts +2 -0
- package/dist/xlsx/ui/locales/es/commands.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/es/grid.d.ts +2 -0
- package/dist/xlsx/ui/locales/es/grid.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/es/index.d.ts +2 -0
- package/dist/xlsx/ui/locales/es/index.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/es/shell.d.ts +2 -0
- package/dist/xlsx/ui/locales/es/shell.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/fr/commands.d.ts +2 -0
- package/dist/xlsx/ui/locales/fr/commands.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/fr/grid.d.ts +2 -0
- package/dist/xlsx/ui/locales/fr/grid.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/fr/index.d.ts +2 -0
- package/dist/xlsx/ui/locales/fr/index.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/fr/shell.d.ts +2 -0
- package/dist/xlsx/ui/locales/fr/shell.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/merge.d.ts +7 -0
- package/dist/xlsx/ui/locales/merge.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/zh-CN/commands.d.ts +2 -0
- package/dist/xlsx/ui/locales/zh-CN/commands.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/zh-CN/grid.d.ts +2 -0
- package/dist/xlsx/ui/locales/zh-CN/grid.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/zh-CN/index.d.ts +2 -0
- package/dist/xlsx/ui/locales/zh-CN/index.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/zh-CN/shell.d.ts +2 -0
- package/dist/xlsx/ui/locales/zh-CN/shell.d.ts.map +1 -0
- package/dist/xlsx/ui/localization.d.ts +23 -0
- package/dist/xlsx/ui/localization.d.ts.map +1 -0
- package/dist/xlsx/ui/ribbon/icon-paths.d.ts +9 -0
- package/dist/xlsx/ui/ribbon/icon-paths.d.ts.map +1 -0
- package/dist/xlsx/ui/ribbon/parts.d.ts +88 -0
- package/dist/xlsx/ui/ribbon/parts.d.ts.map +1 -0
- package/dist/xlsx/ui/ribbon/tab-api.d.ts +21 -0
- package/dist/xlsx/ui/ribbon/tab-api.d.ts.map +1 -0
- package/dist/xlsx/ui/ribbon/tabs/review-view.d.ts +5 -0
- package/dist/xlsx/ui/ribbon/tabs/review-view.d.ts.map +1 -0
- package/dist/xlsx/ui/ribbon/tabs/theme-palette.d.ts +8 -0
- package/dist/xlsx/ui/ribbon/tabs/theme-palette.d.ts.map +1 -0
- package/dist/xlsx/ui/ribbon/tell-me.d.ts +16 -0
- package/dist/xlsx/ui/ribbon/tell-me.d.ts.map +1 -0
- package/dist/xlsx/ui/selection.d.ts +34 -0
- package/dist/xlsx/ui/selection.d.ts.map +1 -0
- package/dist/xlsx/ui/theme/css-vars.d.ts +6 -0
- package/dist/xlsx/ui/theme/css-vars.d.ts.map +1 -0
- package/dist/xlsx/ui/theme/defaults.d.ts +6 -0
- package/dist/xlsx/ui/theme/defaults.d.ts.map +1 -0
- package/dist/xlsx/ui/theme/element.d.ts +9 -0
- package/dist/xlsx/ui/theme/element.d.ts.map +1 -0
- package/dist/xlsx/ui/theme/types.d.ts +54 -0
- package/dist/xlsx/ui/theme/types.d.ts.map +1 -0
- package/dist/xml/index.cjs +2 -1
- package/dist/xml/index.mjs +2 -1
- package/package.json +42 -4
- package/dist/pptx/chunks/index-BtBj3VG1.d.ts.map +0 -1
- package/dist/pptx/chunks/index-D0yGoLyw.d.ts.map +0 -1
- package/dist/pptx/chunks/text-operations-GuisjlbR.d.ts.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PowerPoint's automatic value-axis scale.
|
|
3
|
+
*
|
|
4
|
+
* A chart that declares no `c:min` / `c:max` / `c:majorUnit` leaves the bounds
|
|
5
|
+
* to the application, and PowerPoint does NOT simply run the axis to the largest
|
|
6
|
+
* data point. It anchors the axis at zero, pads the data, then rounds out to a
|
|
7
|
+
* round number and labels it in round steps. The reporter's deck (issue #132)
|
|
8
|
+
* shows the difference plainly: a percentage chart whose bars top out at 52%
|
|
9
|
+
* gets `0% 20% 40% 60%` from PowerPoint and got `0% 10% 21% 31% 42% 52%` here,
|
|
10
|
+
* because the axis ran to the data maximum and was then divided into five.
|
|
11
|
+
*
|
|
12
|
+
* The rules, from Microsoft's documented automatic-scaling behaviour:
|
|
13
|
+
*
|
|
14
|
+
* - **Zero anchor.** With all-positive data, the axis starts at zero unless the
|
|
15
|
+
* smallest value is at least 5/6 of the largest, in which case the data
|
|
16
|
+
* occupies a narrow band high up and a zero-anchored axis would flatten it.
|
|
17
|
+
* All-negative data mirrors this, ending at zero.
|
|
18
|
+
* - **Headroom.** The far end is pushed out by 5% of the data span so the
|
|
19
|
+
* tallest bar does not touch the top of the plot.
|
|
20
|
+
* - **Round steps.** The major unit is the first "nice" number (1, 2, 2.5 or 5
|
|
21
|
+
* times a power of ten) at or above `span / targetIntervals`, and the bounds
|
|
22
|
+
* are then snapped outwards to whole multiples of it.
|
|
23
|
+
*
|
|
24
|
+
* The snap is what makes the interval count differ from `targetIntervals`:
|
|
25
|
+
* rounding 0.544 up to a multiple of 0.2 lands on 0.6, which is three steps, not
|
|
26
|
+
* four. That is the intent, and it is why PowerPoint's axes read in round
|
|
27
|
+
* numbers while an evenly-divided one does not.
|
|
28
|
+
*/
|
|
29
|
+
/** A resolved automatic axis scale. */
|
|
30
|
+
export interface NiceAxisBounds {
|
|
31
|
+
min: number;
|
|
32
|
+
max: number;
|
|
33
|
+
/** Step between major gridlines; `max - min` is always a whole multiple. */
|
|
34
|
+
majorUnit: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* How many gridline intervals PowerPoint's automatic value-axis scale aims
|
|
38
|
+
* for, given the chart's plot-area height in the "px" unit `computePlotLayout`
|
|
39
|
+
* returns (96 px/inch; see `PX_PER_POINT` above).
|
|
40
|
+
*
|
|
41
|
+
* This is NOT a universal constant (see this module's original doc comment,
|
|
42
|
+
* which admitted as much: "matches the axes PowerPoint draws for a chart of
|
|
43
|
+
* ORDINARY height"): a short chart gets fewer, coarser gridlines than a tall
|
|
44
|
+
* one, up to a point, because PowerPoint only has room to label so many
|
|
45
|
+
* without the axis text crowding.
|
|
46
|
+
*
|
|
47
|
+
* Measured via PowerPoint COM automation (`New-Object -ComObject
|
|
48
|
+
* PowerPoint.Application`, `Shapes.AddChart2`, reading back
|
|
49
|
+
* `chart.Axes(2).MinimumScale/.MaximumScale/.MajorUnit`): building a fresh
|
|
50
|
+
* clustered-column chart at increasing shape heights with the SAME 8-point,
|
|
51
|
+
* single-category data (values 1.2-3.2, the exact case reported against this
|
|
52
|
+
* engine, which this engine rendered 0-4 while PowerPoint drew 0-3.5):
|
|
53
|
+
*
|
|
54
|
+
* | chart height | plot height | PowerPoint axis | gridlines |
|
|
55
|
+
* |--------------|-------------|------------------|-----------|
|
|
56
|
+
* | 100pt | ~33pt | 0 to 5, unit 5 | 1 |
|
|
57
|
+
* | 150pt | ~83pt | 0 to 4, unit 1 | 4 |
|
|
58
|
+
* | 200pt | ~133pt | 0 to 3.5, unit 0.5 | 7 |
|
|
59
|
+
* | 300pt | ~233pt | 0 to 3.5, unit 0.5 | 7 |
|
|
60
|
+
* | 1000pt | ~933pt | 0 to 3.5, unit 0.5 | 7 (unchanged) |
|
|
61
|
+
*
|
|
62
|
+
* Cross-checked against two more datasets (0-52 and 0-9) at the same set of
|
|
63
|
+
* heights to separate "the target interval count" from "which nice-number
|
|
64
|
+
* bucket a particular span happens to round into": PowerPoint never asked for
|
|
65
|
+
* more than about 10 intervals even at a 1000pt-tall chart, it only asks for
|
|
66
|
+
* FEWER on a plot area too short to fit that many labels. That saturation
|
|
67
|
+
* (not a straight line) is why this is clamped at the top, not just scaled.
|
|
68
|
+
*
|
|
69
|
+
* Modelled as one gridline interval per ~20pt of plot height (roughly one
|
|
70
|
+
* axis-label line plus padding), clamped to `[1, 10]`. This will not be exact
|
|
71
|
+
* for every data range: the actual PowerPoint algorithm also nudges the count
|
|
72
|
+
* by how the span happens to snap to a nice number (see the module doc
|
|
73
|
+
* comment), which this simplified model does not attempt to reproduce. It is
|
|
74
|
+
* a large improvement over hard-coding the short-chart answer (4) for every
|
|
75
|
+
* chart regardless of size, which is the bug this was added to fix.
|
|
76
|
+
*/
|
|
77
|
+
export declare function axisTargetIntervals(plotHeightPx: number): number;
|
|
78
|
+
/** The smallest nice step at or above `value`. */
|
|
79
|
+
export declare function niceAxisStep(value: number): number;
|
|
80
|
+
/**
|
|
81
|
+
* Resolve the automatic bounds and major unit for a value axis.
|
|
82
|
+
*
|
|
83
|
+
* @param dataMin Smallest plotted value.
|
|
84
|
+
* @param dataMax Largest plotted value.
|
|
85
|
+
* @param targetIntervals Roughly how many gridline steps to aim for. The snap to
|
|
86
|
+
* a round unit means the result is usually one fewer. Defaults to 4 only
|
|
87
|
+
* when the caller has no idea how tall the chart's plot area is; pass
|
|
88
|
+
* {@link axisTargetIntervals}`(plotHeightPx)` instead whenever that height is
|
|
89
|
+
* known; see that function's doc comment for why a fixed constant undershot
|
|
90
|
+
* real PowerPoint on any chart of ordinary-or-larger size.
|
|
91
|
+
* @param headroom Fraction of the data span added beyond the far end. 2D
|
|
92
|
+
* charts get PowerPoint's 5%; a right-angle-axes 3D bar chart gets none
|
|
93
|
+
* (its axis on data topping out at exactly 5 ends at 5, see
|
|
94
|
+
* `chart-3d-oblique-layout.ts`).
|
|
95
|
+
*/
|
|
96
|
+
export declare function niceValueAxisBounds(dataMin: number, dataMax: number, targetIntervals?: number, headroom?: number): NiceAxisBounds;
|
|
97
|
+
//# sourceMappingURL=axis-nice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axis-nice.d.ts","sourceRoot":"","sources":["../../src/chart/axis-nice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;CAClB;AAwCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAOhE;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASlD;AAUD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,SAA2B,EAC1C,QAAQ,SAAW,GACjB,cAAc,CA6ChB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** The `cx:layoutPr/cx:binning` properties that drive numeric binning. */
|
|
2
|
+
export interface HistogramOptions {
|
|
3
|
+
binSize?: number | undefined;
|
|
4
|
+
binCount?: number | undefined;
|
|
5
|
+
intervalClosed?: 'l' | 'r' | undefined;
|
|
6
|
+
underflow?: number | 'auto' | undefined;
|
|
7
|
+
overflow?: number | 'auto' | undefined;
|
|
8
|
+
}
|
|
9
|
+
/** Formats a bin edge for a label. */
|
|
10
|
+
export type HistogramValueFormatter = (value: number) => string;
|
|
11
|
+
export interface HistogramBin {
|
|
12
|
+
value: number;
|
|
13
|
+
label: string;
|
|
14
|
+
sourceIndices: number[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Excel/PowerPoint's automatic histogram bin count when the author specifies
|
|
18
|
+
* neither `binSize` nor `binCount` (Scott's normal reference rule: bin width
|
|
19
|
+
* = 3.49 * sample standard deviation * n^(-1/3), then the count needed to
|
|
20
|
+
* span the data at that width). COM-verified against charts-com.pptx slide
|
|
21
|
+
* 30 / chartEx5.xml: 76 raw values spanning 1-24 (sample sd ~4.898) gave
|
|
22
|
+
* PowerPoint's own 6 bins of width 4 each; Scott's rule on the same data
|
|
23
|
+
* gives a raw width of ~4.035, which needs exactly 6 bins to span the range,
|
|
24
|
+
* matching PowerPoint bin-for-bin. The previous `ceil(sqrt(n))` fallback
|
|
25
|
+
* gave 9 bins on the same data, visibly narrower than PowerPoint's own.
|
|
26
|
+
*/
|
|
27
|
+
export declare function scottBinCount(values: ReadonlyArray<number>, min: number, max: number): number;
|
|
28
|
+
/** Bin raw observations according to ChartEx binning properties. */
|
|
29
|
+
export declare function computeHistogramBins(values: ReadonlyArray<number>, options: HistogramOptions, format?: HistogramValueFormatter): HistogramBin[];
|
|
30
|
+
/**
|
|
31
|
+
* Aggregate raw observations by their (repeated) category label instead of by
|
|
32
|
+
* numeric value range: `cx:layoutPr/cx:aggregation` (COM-verified against
|
|
33
|
+
* charts-com.pptx slide 31 / chartEx6.xml) means the source rows are
|
|
34
|
+
* CATEGORICAL, one row per occurrence, with the value column carrying a
|
|
35
|
+
* constant `1` so summing it counts occurrences per category. Summing
|
|
36
|
+
* (rather than literally counting rows) also does the right thing for a
|
|
37
|
+
* dataset that authors a real numeric measure per row instead of a bare `1`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function aggregateByCategory(values: ReadonlyArray<number>, rawCategories: ReadonlyArray<string>): HistogramBin[];
|
|
40
|
+
//# sourceMappingURL=histogram-binning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram-binning.d.ts","sourceRoot":"","sources":["../../src/chart/histogram-binning.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,sCAAsC;AACtC,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AAaD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa7F;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,OAAO,EAAE,gBAAgB,EACzB,MAAM,GAAE,uBAAgC,GACtC,YAAY,EAAE,CA8EhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAClC,YAAY,EAAE,CAUhB"}
|
package/dist/chart/index.cjs
CHANGED
|
@@ -219,11 +219,178 @@ function computeStackedSeriesPlots(seriesValues, catCount, percent) {
|
|
|
219
219
|
});
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
+
// src/chart/axis-nice.ts
|
|
223
|
+
var NICE_STEPS = [1, 2, 2.5, 5, 10];
|
|
224
|
+
var HEADROOM = 0.05;
|
|
225
|
+
var POINTS_PER_GRIDLINE = 20;
|
|
226
|
+
var MIN_TARGET_INTERVALS = 1;
|
|
227
|
+
var MAX_TARGET_INTERVALS = 10;
|
|
228
|
+
var PX_PER_POINT = 4 / 3;
|
|
229
|
+
var DEFAULT_TARGET_INTERVALS = 4;
|
|
230
|
+
var ZERO_ANCHOR_RATIO = 5 / 6;
|
|
231
|
+
function axisTargetIntervals(plotHeightPx) {
|
|
232
|
+
if (!Number.isFinite(plotHeightPx) || plotHeightPx <= 0) {
|
|
233
|
+
return DEFAULT_TARGET_INTERVALS;
|
|
234
|
+
}
|
|
235
|
+
const plotHeightPt = plotHeightPx / PX_PER_POINT;
|
|
236
|
+
const raw = Math.round(plotHeightPt / POINTS_PER_GRIDLINE);
|
|
237
|
+
return Math.min(MAX_TARGET_INTERVALS, Math.max(MIN_TARGET_INTERVALS, raw));
|
|
238
|
+
}
|
|
239
|
+
function niceAxisStep(value) {
|
|
240
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
241
|
+
return 1;
|
|
242
|
+
}
|
|
243
|
+
const exponent = Math.floor(Math.log10(value));
|
|
244
|
+
const power = 10 ** exponent;
|
|
245
|
+
const mantissa = value / power;
|
|
246
|
+
const step = NICE_STEPS.find((candidate) => mantissa <= candidate + 1e-12) ?? 10;
|
|
247
|
+
return step * power;
|
|
248
|
+
}
|
|
249
|
+
function snap(value, unit, direction) {
|
|
250
|
+
const scaled = value / unit;
|
|
251
|
+
const rounded = direction === "up" ? Math.ceil(scaled - 1e-9) : Math.floor(scaled + 1e-9);
|
|
252
|
+
return rounded * unit;
|
|
253
|
+
}
|
|
254
|
+
function niceValueAxisBounds(dataMin, dataMax, targetIntervals = DEFAULT_TARGET_INTERVALS, headroom = HEADROOM) {
|
|
255
|
+
if (!Number.isFinite(dataMin) || !Number.isFinite(dataMax)) {
|
|
256
|
+
return { min: 0, max: 1, majorUnit: 0.5 };
|
|
257
|
+
}
|
|
258
|
+
const low = Math.min(dataMin, dataMax);
|
|
259
|
+
const high = Math.max(dataMin, dataMax);
|
|
260
|
+
const intervals = Math.max(1, Math.round(targetIntervals));
|
|
261
|
+
if (low === high) {
|
|
262
|
+
if (low === 0) {
|
|
263
|
+
return { min: 0, max: 1, majorUnit: 1 / intervals };
|
|
264
|
+
}
|
|
265
|
+
const unit2 = niceAxisStep(Math.abs(low) / intervals);
|
|
266
|
+
return low > 0 ? { min: 0, max: snap(low, unit2, "up") || unit2, majorUnit: unit2 } : { min: snap(low, unit2, "down"), max: 0, majorUnit: unit2 };
|
|
267
|
+
}
|
|
268
|
+
const dataSpan = high - low;
|
|
269
|
+
const padding = dataSpan * headroom;
|
|
270
|
+
let paddedMin;
|
|
271
|
+
let paddedMax;
|
|
272
|
+
if (low >= 0) {
|
|
273
|
+
paddedMin = low < high * ZERO_ANCHOR_RATIO ? 0 : low - padding;
|
|
274
|
+
paddedMax = high + padding;
|
|
275
|
+
} else if (high <= 0) {
|
|
276
|
+
paddedMax = high > low * ZERO_ANCHOR_RATIO ? 0 : high + padding;
|
|
277
|
+
paddedMin = low - padding;
|
|
278
|
+
} else {
|
|
279
|
+
paddedMin = low - padding;
|
|
280
|
+
paddedMax = high + padding;
|
|
281
|
+
}
|
|
282
|
+
const unit = niceAxisStep((paddedMax - paddedMin) / intervals);
|
|
283
|
+
const min = paddedMin === 0 ? 0 : snap(paddedMin, unit, "down");
|
|
284
|
+
let max = paddedMax === 0 ? 0 : snap(paddedMax, unit, "up");
|
|
285
|
+
if (max <= min) {
|
|
286
|
+
max = min + unit;
|
|
287
|
+
}
|
|
288
|
+
return { min, max, majorUnit: unit };
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// src/chart/histogram-binning.ts
|
|
292
|
+
function binLabel(lower, upper, closed, format) {
|
|
293
|
+
return closed === "r" ? `(${format(lower)}, ${format(upper)}]` : `[${format(lower)}, ${format(upper)})`;
|
|
294
|
+
}
|
|
295
|
+
function scottBinCount(values, min, max) {
|
|
296
|
+
if (values.length < 2 || max <= min) {
|
|
297
|
+
return 1;
|
|
298
|
+
}
|
|
299
|
+
const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
300
|
+
const variance = values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / (values.length - 1);
|
|
301
|
+
const sd = Math.sqrt(variance);
|
|
302
|
+
if (!(sd > 0)) {
|
|
303
|
+
return 1;
|
|
304
|
+
}
|
|
305
|
+
const width = 3.49 * sd * values.length ** (-1 / 3);
|
|
306
|
+
return Math.max(1, Math.ceil((max - min) / width));
|
|
307
|
+
}
|
|
308
|
+
function computeHistogramBins(values, options, format = String) {
|
|
309
|
+
const closed = options.intervalClosed ?? "l";
|
|
310
|
+
const finite = values.map((value, sourceIndex) => ({ value, sourceIndex })).filter((item) => Number.isFinite(item.value));
|
|
311
|
+
if (finite.length === 0) {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
const underflow = typeof options.underflow === "number" ? options.underflow : void 0;
|
|
315
|
+
const overflow = typeof options.overflow === "number" ? options.overflow : void 0;
|
|
316
|
+
const under = underflow === void 0 ? [] : finite.filter(
|
|
317
|
+
(item) => closed === "r" ? item.value <= underflow : item.value < underflow
|
|
318
|
+
);
|
|
319
|
+
const over = overflow === void 0 ? [] : finite.filter((item) => closed === "l" ? item.value >= overflow : item.value > overflow);
|
|
320
|
+
const regular = finite.filter((item) => !under.includes(item) && !over.includes(item));
|
|
321
|
+
const result = [];
|
|
322
|
+
if (underflow !== void 0) {
|
|
323
|
+
result.push({
|
|
324
|
+
value: under.length,
|
|
325
|
+
label: `${closed === "r" ? "\u2264" : "<"} ${format(underflow)}`,
|
|
326
|
+
sourceIndices: under.map((item) => item.sourceIndex)
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
if (regular.length > 0) {
|
|
330
|
+
const min = Math.min(...regular.map((item) => item.value));
|
|
331
|
+
const max = Math.max(...regular.map((item) => item.value));
|
|
332
|
+
const requestedSize = options.binSize && options.binSize > 0 ? options.binSize : void 0;
|
|
333
|
+
const requestedCount = options.binCount && options.binCount > 0 ? options.binCount : void 0;
|
|
334
|
+
const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
|
|
335
|
+
const count = requestedSize ? Math.max(
|
|
336
|
+
closed === "l" ? Math.floor((max - start) / requestedSize) + 1 : Math.ceil((max - start) / requestedSize),
|
|
337
|
+
1
|
|
338
|
+
) : Math.max(
|
|
339
|
+
requestedCount ?? scottBinCount(
|
|
340
|
+
regular.map((item) => item.value),
|
|
341
|
+
min,
|
|
342
|
+
max
|
|
343
|
+
),
|
|
344
|
+
1
|
|
345
|
+
);
|
|
346
|
+
const width = requestedSize ?? Math.max((max - start) / count, 1);
|
|
347
|
+
const bins = Array.from({ length: count }, (_, index) => ({
|
|
348
|
+
value: 0,
|
|
349
|
+
label: binLabel(start + index * width, start + (index + 1) * width, closed, format),
|
|
350
|
+
sourceIndices: []
|
|
351
|
+
}));
|
|
352
|
+
for (const item of regular) {
|
|
353
|
+
const rawIndex = closed === "r" ? Math.ceil((item.value - start) / width) - 1 : Math.floor((item.value - start) / width);
|
|
354
|
+
const index = Math.max(0, Math.min(rawIndex, bins.length - 1));
|
|
355
|
+
const bin = bins[index];
|
|
356
|
+
if (!bin) continue;
|
|
357
|
+
bin.value += 1;
|
|
358
|
+
bin.sourceIndices.push(item.sourceIndex);
|
|
359
|
+
}
|
|
360
|
+
result.push(...bins);
|
|
361
|
+
}
|
|
362
|
+
if (overflow !== void 0) {
|
|
363
|
+
result.push({
|
|
364
|
+
value: over.length,
|
|
365
|
+
label: `${closed === "l" ? "\u2265" : ">"} ${format(overflow)}`,
|
|
366
|
+
sourceIndices: over.map((item) => item.sourceIndex)
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
function aggregateByCategory(values, rawCategories) {
|
|
372
|
+
const { uniqueCategories, rowIndexesByCategory } = groupRowsByCategory(rawCategories);
|
|
373
|
+
return uniqueCategories.map((label) => {
|
|
374
|
+
const rows = rowIndexesByCategory.get(label) ?? [];
|
|
375
|
+
return {
|
|
376
|
+
value: rows.reduce((sum, row) => sum + (values[row] ?? 0), 0),
|
|
377
|
+
label,
|
|
378
|
+
sourceIndices: rows
|
|
379
|
+
};
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
exports.aggregateByCategory = aggregateByCategory;
|
|
384
|
+
exports.axisTargetIntervals = axisTargetIntervals;
|
|
222
385
|
exports.computeBoxStats = computeBoxStats;
|
|
386
|
+
exports.computeHistogramBins = computeHistogramBins;
|
|
223
387
|
exports.computeLinearRegression = computeLinearRegression;
|
|
224
388
|
exports.computeRSquared = computeRSquared;
|
|
225
389
|
exports.computeStackedSeriesPlots = computeStackedSeriesPlots;
|
|
226
390
|
exports.fitPolynomial = fitPolynomial;
|
|
227
391
|
exports.groupRowsByCategory = groupRowsByCategory;
|
|
392
|
+
exports.niceAxisStep = niceAxisStep;
|
|
393
|
+
exports.niceValueAxisBounds = niceValueAxisBounds;
|
|
228
394
|
exports.resolveBlankDisplay = resolveBlankDisplay;
|
|
395
|
+
exports.scottBinCount = scottBinCount;
|
|
229
396
|
exports.visibleRuns = visibleRuns;
|
package/dist/chart/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC"}
|
package/dist/chart/index.mjs
CHANGED
|
@@ -217,4 +217,165 @@ function computeStackedSeriesPlots(seriesValues, catCount, percent) {
|
|
|
217
217
|
});
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
// src/chart/axis-nice.ts
|
|
221
|
+
var NICE_STEPS = [1, 2, 2.5, 5, 10];
|
|
222
|
+
var HEADROOM = 0.05;
|
|
223
|
+
var POINTS_PER_GRIDLINE = 20;
|
|
224
|
+
var MIN_TARGET_INTERVALS = 1;
|
|
225
|
+
var MAX_TARGET_INTERVALS = 10;
|
|
226
|
+
var PX_PER_POINT = 4 / 3;
|
|
227
|
+
var DEFAULT_TARGET_INTERVALS = 4;
|
|
228
|
+
var ZERO_ANCHOR_RATIO = 5 / 6;
|
|
229
|
+
function axisTargetIntervals(plotHeightPx) {
|
|
230
|
+
if (!Number.isFinite(plotHeightPx) || plotHeightPx <= 0) {
|
|
231
|
+
return DEFAULT_TARGET_INTERVALS;
|
|
232
|
+
}
|
|
233
|
+
const plotHeightPt = plotHeightPx / PX_PER_POINT;
|
|
234
|
+
const raw = Math.round(plotHeightPt / POINTS_PER_GRIDLINE);
|
|
235
|
+
return Math.min(MAX_TARGET_INTERVALS, Math.max(MIN_TARGET_INTERVALS, raw));
|
|
236
|
+
}
|
|
237
|
+
function niceAxisStep(value) {
|
|
238
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
239
|
+
return 1;
|
|
240
|
+
}
|
|
241
|
+
const exponent = Math.floor(Math.log10(value));
|
|
242
|
+
const power = 10 ** exponent;
|
|
243
|
+
const mantissa = value / power;
|
|
244
|
+
const step = NICE_STEPS.find((candidate) => mantissa <= candidate + 1e-12) ?? 10;
|
|
245
|
+
return step * power;
|
|
246
|
+
}
|
|
247
|
+
function snap(value, unit, direction) {
|
|
248
|
+
const scaled = value / unit;
|
|
249
|
+
const rounded = direction === "up" ? Math.ceil(scaled - 1e-9) : Math.floor(scaled + 1e-9);
|
|
250
|
+
return rounded * unit;
|
|
251
|
+
}
|
|
252
|
+
function niceValueAxisBounds(dataMin, dataMax, targetIntervals = DEFAULT_TARGET_INTERVALS, headroom = HEADROOM) {
|
|
253
|
+
if (!Number.isFinite(dataMin) || !Number.isFinite(dataMax)) {
|
|
254
|
+
return { min: 0, max: 1, majorUnit: 0.5 };
|
|
255
|
+
}
|
|
256
|
+
const low = Math.min(dataMin, dataMax);
|
|
257
|
+
const high = Math.max(dataMin, dataMax);
|
|
258
|
+
const intervals = Math.max(1, Math.round(targetIntervals));
|
|
259
|
+
if (low === high) {
|
|
260
|
+
if (low === 0) {
|
|
261
|
+
return { min: 0, max: 1, majorUnit: 1 / intervals };
|
|
262
|
+
}
|
|
263
|
+
const unit2 = niceAxisStep(Math.abs(low) / intervals);
|
|
264
|
+
return low > 0 ? { min: 0, max: snap(low, unit2, "up") || unit2, majorUnit: unit2 } : { min: snap(low, unit2, "down"), max: 0, majorUnit: unit2 };
|
|
265
|
+
}
|
|
266
|
+
const dataSpan = high - low;
|
|
267
|
+
const padding = dataSpan * headroom;
|
|
268
|
+
let paddedMin;
|
|
269
|
+
let paddedMax;
|
|
270
|
+
if (low >= 0) {
|
|
271
|
+
paddedMin = low < high * ZERO_ANCHOR_RATIO ? 0 : low - padding;
|
|
272
|
+
paddedMax = high + padding;
|
|
273
|
+
} else if (high <= 0) {
|
|
274
|
+
paddedMax = high > low * ZERO_ANCHOR_RATIO ? 0 : high + padding;
|
|
275
|
+
paddedMin = low - padding;
|
|
276
|
+
} else {
|
|
277
|
+
paddedMin = low - padding;
|
|
278
|
+
paddedMax = high + padding;
|
|
279
|
+
}
|
|
280
|
+
const unit = niceAxisStep((paddedMax - paddedMin) / intervals);
|
|
281
|
+
const min = paddedMin === 0 ? 0 : snap(paddedMin, unit, "down");
|
|
282
|
+
let max = paddedMax === 0 ? 0 : snap(paddedMax, unit, "up");
|
|
283
|
+
if (max <= min) {
|
|
284
|
+
max = min + unit;
|
|
285
|
+
}
|
|
286
|
+
return { min, max, majorUnit: unit };
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// src/chart/histogram-binning.ts
|
|
290
|
+
function binLabel(lower, upper, closed, format) {
|
|
291
|
+
return closed === "r" ? `(${format(lower)}, ${format(upper)}]` : `[${format(lower)}, ${format(upper)})`;
|
|
292
|
+
}
|
|
293
|
+
function scottBinCount(values, min, max) {
|
|
294
|
+
if (values.length < 2 || max <= min) {
|
|
295
|
+
return 1;
|
|
296
|
+
}
|
|
297
|
+
const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
298
|
+
const variance = values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / (values.length - 1);
|
|
299
|
+
const sd = Math.sqrt(variance);
|
|
300
|
+
if (!(sd > 0)) {
|
|
301
|
+
return 1;
|
|
302
|
+
}
|
|
303
|
+
const width = 3.49 * sd * values.length ** (-1 / 3);
|
|
304
|
+
return Math.max(1, Math.ceil((max - min) / width));
|
|
305
|
+
}
|
|
306
|
+
function computeHistogramBins(values, options, format = String) {
|
|
307
|
+
const closed = options.intervalClosed ?? "l";
|
|
308
|
+
const finite = values.map((value, sourceIndex) => ({ value, sourceIndex })).filter((item) => Number.isFinite(item.value));
|
|
309
|
+
if (finite.length === 0) {
|
|
310
|
+
return [];
|
|
311
|
+
}
|
|
312
|
+
const underflow = typeof options.underflow === "number" ? options.underflow : void 0;
|
|
313
|
+
const overflow = typeof options.overflow === "number" ? options.overflow : void 0;
|
|
314
|
+
const under = underflow === void 0 ? [] : finite.filter(
|
|
315
|
+
(item) => closed === "r" ? item.value <= underflow : item.value < underflow
|
|
316
|
+
);
|
|
317
|
+
const over = overflow === void 0 ? [] : finite.filter((item) => closed === "l" ? item.value >= overflow : item.value > overflow);
|
|
318
|
+
const regular = finite.filter((item) => !under.includes(item) && !over.includes(item));
|
|
319
|
+
const result = [];
|
|
320
|
+
if (underflow !== void 0) {
|
|
321
|
+
result.push({
|
|
322
|
+
value: under.length,
|
|
323
|
+
label: `${closed === "r" ? "\u2264" : "<"} ${format(underflow)}`,
|
|
324
|
+
sourceIndices: under.map((item) => item.sourceIndex)
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
if (regular.length > 0) {
|
|
328
|
+
const min = Math.min(...regular.map((item) => item.value));
|
|
329
|
+
const max = Math.max(...regular.map((item) => item.value));
|
|
330
|
+
const requestedSize = options.binSize && options.binSize > 0 ? options.binSize : void 0;
|
|
331
|
+
const requestedCount = options.binCount && options.binCount > 0 ? options.binCount : void 0;
|
|
332
|
+
const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
|
|
333
|
+
const count = requestedSize ? Math.max(
|
|
334
|
+
closed === "l" ? Math.floor((max - start) / requestedSize) + 1 : Math.ceil((max - start) / requestedSize),
|
|
335
|
+
1
|
|
336
|
+
) : Math.max(
|
|
337
|
+
requestedCount ?? scottBinCount(
|
|
338
|
+
regular.map((item) => item.value),
|
|
339
|
+
min,
|
|
340
|
+
max
|
|
341
|
+
),
|
|
342
|
+
1
|
|
343
|
+
);
|
|
344
|
+
const width = requestedSize ?? Math.max((max - start) / count, 1);
|
|
345
|
+
const bins = Array.from({ length: count }, (_, index) => ({
|
|
346
|
+
value: 0,
|
|
347
|
+
label: binLabel(start + index * width, start + (index + 1) * width, closed, format),
|
|
348
|
+
sourceIndices: []
|
|
349
|
+
}));
|
|
350
|
+
for (const item of regular) {
|
|
351
|
+
const rawIndex = closed === "r" ? Math.ceil((item.value - start) / width) - 1 : Math.floor((item.value - start) / width);
|
|
352
|
+
const index = Math.max(0, Math.min(rawIndex, bins.length - 1));
|
|
353
|
+
const bin = bins[index];
|
|
354
|
+
if (!bin) continue;
|
|
355
|
+
bin.value += 1;
|
|
356
|
+
bin.sourceIndices.push(item.sourceIndex);
|
|
357
|
+
}
|
|
358
|
+
result.push(...bins);
|
|
359
|
+
}
|
|
360
|
+
if (overflow !== void 0) {
|
|
361
|
+
result.push({
|
|
362
|
+
value: over.length,
|
|
363
|
+
label: `${closed === "l" ? "\u2265" : ">"} ${format(overflow)}`,
|
|
364
|
+
sourceIndices: over.map((item) => item.sourceIndex)
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
return result;
|
|
368
|
+
}
|
|
369
|
+
function aggregateByCategory(values, rawCategories) {
|
|
370
|
+
const { uniqueCategories, rowIndexesByCategory } = groupRowsByCategory(rawCategories);
|
|
371
|
+
return uniqueCategories.map((label) => {
|
|
372
|
+
const rows = rowIndexesByCategory.get(label) ?? [];
|
|
373
|
+
return {
|
|
374
|
+
value: rows.reduce((sum, row) => sum + (values[row] ?? 0), 0),
|
|
375
|
+
label,
|
|
376
|
+
sourceIndices: rows
|
|
377
|
+
};
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
export { aggregateByCategory, axisTargetIntervals, computeBoxStats, computeHistogramBins, computeLinearRegression, computeRSquared, computeStackedSeriesPlots, fitPolynomial, groupRowsByCategory, niceAxisStep, niceValueAxisBounds, resolveBlankDisplay, scottBinCount, visibleRuns };
|
package/dist/diagram/index.cjs
CHANGED
|
@@ -151,7 +151,8 @@ function parseXml(xml, options = {}) {
|
|
|
151
151
|
}).parseFromString(xml, "application/xml");
|
|
152
152
|
} catch (error) {
|
|
153
153
|
throw new Error(
|
|
154
|
-
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}
|
|
154
|
+
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
|
|
155
|
+
{ cause: error }
|
|
155
156
|
);
|
|
156
157
|
}
|
|
157
158
|
if (parseError || !parsed.documentElement)
|
package/dist/diagram/index.mjs
CHANGED
|
@@ -149,7 +149,8 @@ function parseXml(xml, options = {}) {
|
|
|
149
149
|
}).parseFromString(xml, "application/xml");
|
|
150
150
|
} catch (error) {
|
|
151
151
|
throw new Error(
|
|
152
|
-
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}
|
|
152
|
+
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
|
|
153
|
+
{ cause: error }
|
|
153
154
|
);
|
|
154
155
|
}
|
|
155
156
|
if (parseError || !parsed.documentElement)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SignedTwips, type Twips } from '../units/units.js';
|
|
2
|
+
import type { Paragraph } from './model-paragraph.js';
|
|
3
|
+
/** A non-negative twip attribute as `Twips`, or undefined when absent or not a valid length. */
|
|
4
|
+
export declare function twipsAttr(value: unknown): Twips | undefined;
|
|
5
|
+
/** A possibly negative twip attribute as `SignedTwips`, or undefined when absent or not finite. */
|
|
6
|
+
export declare function signedTwipsAttr(value: unknown): SignedTwips | undefined;
|
|
7
|
+
type ParagraphTwips = Pick<Paragraph, 'spacingBeforeTwips' | 'spacingAfterTwips' | 'lineSpacingTwips' | 'indentLeftTwips' | 'indentRightTwips' | 'indentStartTwips' | 'indentEndTwips' | 'firstLineTwips' | 'hangingTwips'>;
|
|
8
|
+
/** The paragraph's direct spacing and indent attributes as model fields; absent ones are omitted. */
|
|
9
|
+
export declare function paragraphTwipsFromAttrs(attrs: Record<string, unknown>): ParagraphTwips;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=attr-units.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attr-units.d.ts","sourceRoot":"","sources":["../../src/docx/attr-units.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAI3D;AACD,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAEvE;AAED,KAAK,cAAc,GAAG,IAAI,CACzB,SAAS,EACP,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,CAChB,CAAC;AACF,qGAAqG;AACrG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAqBtF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-parser.d.ts","sourceRoot":"","sources":["../../src/docx/block-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAY,KAAK,
|
|
1
|
+
{"version":3,"file":"block-parser.d.ts","sourceRoot":"","sources":["../../src/docx/block-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAY,KAAK,EAAW,MAAM,YAAY,CAAC;AAC7E,OAAO,EAMN,KAAK,UAAU,EACf,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAsIjE,iBAAS,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CA0G/D;AAED,iBAAS,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,UAAU,EACrB,QAAQ,SAAK,EACb,OAAO,CAAC,EAAE,cAAc,GACtB,KAAK,EAAE,CAcT;AAYD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type CaseMode = 'sentence' | 'lower' | 'upper' | 'title' | 'toggle';
|
|
2
|
+
/** Characters that make up a word, shared with the editor's caret-word lookup. */
|
|
3
|
+
export declare const WORD: RegExp;
|
|
4
|
+
/**
|
|
5
|
+
* Applies a Word "Change Case" mode to `text`. `atSentenceStart` says whether the text begins a
|
|
6
|
+
* sentence; it matters only for sentence case, which capitalises the first letter after `. ! ?`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function transformCase(text: string, mode: CaseMode, atSentenceStart?: boolean): string;
|
|
9
|
+
//# sourceMappingURL=case-transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-transform.d.ts","sourceRoot":"","sources":["../../src/docx/case-transform.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3E,kFAAkF;AAClF,eAAO,MAAM,IAAI,QAAoB,CAAC;AAOtC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,UAAO,GAAG,MAAM,CAsB1F"}
|
package/dist/docx/embedded.cjs
CHANGED
|
@@ -37,7 +37,8 @@ function parseXml(xml, options = {}) {
|
|
|
37
37
|
}).parseFromString(xml, "application/xml");
|
|
38
38
|
} catch (error) {
|
|
39
39
|
throw new Error(
|
|
40
|
-
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}
|
|
40
|
+
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
|
|
41
|
+
{ cause: error }
|
|
41
42
|
);
|
|
42
43
|
}
|
|
43
44
|
if (parseError || !parsed.documentElement)
|
package/dist/docx/embedded.mjs
CHANGED
|
@@ -31,7 +31,8 @@ function parseXml(xml, options = {}) {
|
|
|
31
31
|
}).parseFromString(xml, "application/xml");
|
|
32
32
|
} catch (error) {
|
|
33
33
|
throw new Error(
|
|
34
|
-
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}
|
|
34
|
+
`Invalid ${label} XML: ${error instanceof Error ? error.message : String(error)}`,
|
|
35
|
+
{ cause: error }
|
|
35
36
|
);
|
|
36
37
|
}
|
|
37
38
|
if (parseError || !parsed.documentElement)
|