ooxml-core 0.8.0 → 0.10.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 -13
- package/dist/chart/blank-display.d.ts +37 -0
- package/dist/chart/blank-display.d.ts.map +1 -0
- package/dist/chart/box-stats.d.ts +28 -0
- package/dist/chart/box-stats.d.ts.map +1 -0
- package/dist/chart/index.cjs +229 -0
- package/dist/chart/index.d.ts +6 -0
- package/dist/chart/index.d.ts.map +1 -0
- package/dist/chart/index.mjs +220 -0
- package/dist/chart/regression.d.ts +40 -0
- package/dist/chart/regression.d.ts.map +1 -0
- package/dist/chart/stacked-series.d.ts +39 -0
- package/dist/chart/stacked-series.d.ts.map +1 -0
- package/dist/crypto/aes-ecb.d.ts +13 -0
- package/dist/crypto/aes-ecb.d.ts.map +1 -0
- package/dist/crypto/decrypt.d.ts +63 -0
- package/dist/crypto/decrypt.d.ts.map +1 -0
- package/dist/crypto/detect.d.ts +56 -0
- package/dist/crypto/detect.d.ts.map +1 -0
- package/dist/crypto/encrypt.d.ts +27 -0
- package/dist/crypto/encrypt.d.ts.map +1 -0
- package/dist/crypto/encryption-info-write.d.ts +46 -0
- package/dist/crypto/encryption-info-write.d.ts.map +1 -0
- package/dist/crypto/encryption-info.d.ts +22 -0
- package/dist/crypto/encryption-info.d.ts.map +1 -0
- package/dist/crypto/errors.d.ts +39 -0
- package/dist/crypto/errors.d.ts.map +1 -0
- package/dist/crypto/index.cjs +1805 -0
- package/dist/crypto/index.d.ts +26 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.mjs +1774 -0
- package/dist/crypto/key-derivation.d.ts +73 -0
- package/dist/crypto/key-derivation.d.ts.map +1 -0
- package/dist/crypto/types.d.ts +104 -0
- package/dist/crypto/types.d.ts.map +1 -0
- package/dist/docx/embedded.cjs +2 -0
- package/dist/docx/embedded.mjs +2 -0
- package/dist/docx/index.cjs +2 -0
- package/dist/docx/index.mjs +2 -0
- package/dist/docx/load/detect.d.ts +14 -2
- package/dist/docx/load/detect.d.ts.map +1 -1
- package/dist/docx/load/index.cjs +8995 -7728
- package/dist/docx/load/index.d.ts +3 -1
- package/dist/docx/load/index.d.ts.map +1 -1
- package/dist/docx/load/index.mjs +8990 -7729
- package/dist/docx/load/legacy-doc.d.ts.map +1 -1
- package/dist/geometry/index.cjs +192 -0
- package/dist/geometry/index.d.ts +1 -0
- package/dist/geometry/index.d.ts.map +1 -1
- package/dist/geometry/index.mjs +192 -1
- package/dist/geometry/svg-path-curves.d.ts +11 -0
- package/dist/geometry/svg-path-curves.d.ts.map +1 -0
- package/dist/geometry/svg-path-flatten.d.ts +26 -0
- package/dist/geometry/svg-path-flatten.d.ts.map +1 -0
- package/dist/geometry/svg-path-types.d.ts +6 -0
- package/dist/geometry/svg-path-types.d.ts.map +1 -0
- package/dist/index.cjs +1303 -22
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +1302 -23
- package/dist/opc/index.cjs +797 -1
- package/dist/opc/index.d.ts +2 -0
- package/dist/opc/index.d.ts.map +1 -1
- package/dist/opc/index.mjs +784 -3
- package/dist/opc/properties/app.d.ts +10 -0
- package/dist/opc/properties/app.d.ts.map +1 -0
- package/dist/opc/properties/core.d.ts +13 -0
- package/dist/opc/properties/core.d.ts.map +1 -0
- package/dist/opc/properties/custom.d.ts +15 -0
- package/dist/opc/properties/custom.d.ts.map +1 -0
- package/dist/opc/properties/index.d.ts +5 -0
- package/dist/opc/properties/index.d.ts.map +1 -0
- package/dist/opc/properties/types.d.ts +114 -0
- package/dist/opc/properties/types.d.ts.map +1 -0
- package/dist/opc/relationship-types.d.ts +1 -0
- package/dist/opc/relationship-types.d.ts.map +1 -1
- package/dist/opc/safe-href.d.ts +34 -0
- package/dist/opc/safe-href.d.ts.map +1 -1
- package/dist/opc/signature/constants.d.ts +42 -0
- package/dist/opc/signature/constants.d.ts.map +1 -0
- package/dist/opc/signature/detection.d.ts +97 -0
- package/dist/opc/signature/detection.d.ts.map +1 -0
- package/dist/opc/signature/digest.d.ts +16 -0
- package/dist/opc/signature/digest.d.ts.map +1 -0
- package/dist/opc/signature/index.d.ts +8 -0
- package/dist/opc/signature/index.d.ts.map +1 -0
- package/dist/opc/signature/inspection-status.d.ts +24 -0
- package/dist/opc/signature/inspection-status.d.ts.map +1 -0
- package/dist/opc/signature/reference-utils.d.ts +12 -0
- package/dist/opc/signature/reference-utils.d.ts.map +1 -0
- package/dist/opc/signature/types.d.ts +90 -0
- package/dist/opc/signature/types.d.ts.map +1 -0
- package/dist/opc/signature/xml-utils.d.ts +35 -0
- package/dist/opc/signature/xml-utils.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-CojJtI77.d.ts → index-BWUBPGgv.d.ts} +9 -11
- package/dist/pptx/chunks/index-BWUBPGgv.d.ts.map +1 -0
- package/dist/pptx/chunks/{signature-inspection-status-Bh2oap7B.d.ts → inspection-status-B2E-jSpG.d.ts} +8 -8
- package/dist/pptx/chunks/inspection-status-B2E-jSpG.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +1409 -895
- package/dist/pptx/cli/index.mjs +1409 -895
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/index.cjs +1933 -1391
- package/dist/pptx/index.d.ts +20 -67
- package/dist/pptx/index.d.ts.map +1 -1
- package/dist/pptx/index.mjs +1933 -1391
- package/dist/pptx/signature-node/index.cjs +5 -5
- package/dist/pptx/signature-node/index.d.ts +1 -1
- package/dist/pptx/signature-node/index.mjs +5 -5
- package/dist/text/index.cjs +122 -0
- package/dist/text/index.d.ts +3 -0
- package/dist/text/index.d.ts.map +1 -0
- package/dist/text/index.mjs +117 -0
- package/dist/text/unicode-script-detection.d.ts +54 -0
- package/dist/text/unicode-script-detection.d.ts.map +1 -0
- package/dist/visio/edit-master-index.d.ts +10 -0
- package/dist/visio/edit-master-index.d.ts.map +1 -0
- package/dist/visio/edit-master-scope.d.ts +7 -0
- package/dist/visio/edit-master-scope.d.ts.map +1 -0
- package/dist/visio/edit-scope.d.ts.map +1 -1
- package/dist/visio/formula-arithmetic.d.ts +8 -0
- package/dist/visio/formula-arithmetic.d.ts.map +1 -0
- package/dist/visio/formula-evaluate.d.ts.map +1 -1
- package/dist/visio/formula-master.d.ts +13 -0
- package/dist/visio/formula-master.d.ts.map +1 -0
- package/dist/visio/formula-numeric-functions.d.ts +8 -0
- package/dist/visio/formula-numeric-functions.d.ts.map +1 -0
- package/dist/visio/formula.d.ts +1 -1
- package/dist/visio/formula.d.ts.map +1 -1
- package/dist/visio/index.cjs +540 -61
- package/dist/visio/index.mjs +540 -61
- package/dist/xlsx/edit/annotations.d.ts +5 -1
- package/dist/xlsx/edit/annotations.d.ts.map +1 -1
- package/dist/xlsx/edit/cell-values.d.ts +7 -2
- package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
- package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
- package/dist/xlsx/edit/doc-properties.d.ts +14 -0
- package/dist/xlsx/edit/doc-properties.d.ts.map +1 -0
- package/dist/xlsx/edit/fill-series.d.ts.map +1 -1
- package/dist/xlsx/edit/find.d.ts +2 -1
- package/dist/xlsx/edit/find.d.ts.map +1 -1
- package/dist/xlsx/edit/format-lines.d.ts +22 -0
- package/dist/xlsx/edit/format-lines.d.ts.map +1 -0
- package/dist/xlsx/edit/format.d.ts +2 -1
- package/dist/xlsx/edit/format.d.ts.map +1 -1
- package/dist/xlsx/edit/history-refs.d.ts +51 -0
- package/dist/xlsx/edit/history-refs.d.ts.map +1 -0
- package/dist/xlsx/edit/history.d.ts +40 -5
- package/dist/xlsx/edit/history.d.ts.map +1 -1
- package/dist/xlsx/edit/index.d.ts +3 -0
- package/dist/xlsx/edit/index.d.ts.map +1 -1
- package/dist/xlsx/edit/input-text.d.ts +13 -0
- package/dist/xlsx/edit/input-text.d.ts.map +1 -0
- package/dist/xlsx/edit/merge.d.ts +10 -2
- package/dist/xlsx/edit/merge.d.ts.map +1 -1
- package/dist/xlsx/edit/session.d.ts.map +1 -1
- package/dist/xlsx/edit/sheets.d.ts.map +1 -1
- package/dist/xlsx/edit/shift-formulas.d.ts +2 -1
- package/dist/xlsx/edit/shift-formulas.d.ts.map +1 -1
- package/dist/xlsx/edit/shift-preserved.d.ts +17 -0
- package/dist/xlsx/edit/shift-preserved.d.ts.map +1 -0
- package/dist/xlsx/edit/shift-sheet.d.ts +2 -2
- package/dist/xlsx/edit/shift-sheet.d.ts.map +1 -1
- package/dist/xlsx/edit/structure.d.ts.map +1 -1
- package/dist/xlsx/edit/types.d.ts +7 -0
- package/dist/xlsx/edit/types.d.ts.map +1 -1
- package/dist/xlsx/edit/validation-list.d.ts +24 -0
- package/dist/xlsx/edit/validation-list.d.ts.map +1 -0
- package/dist/xlsx/edit/validation.d.ts +2 -1
- package/dist/xlsx/edit/validation.d.ts.map +1 -1
- package/dist/xlsx/formula/area-index.d.ts +18 -0
- package/dist/xlsx/formula/area-index.d.ts.map +1 -0
- package/dist/xlsx/formula/array-context.d.ts.map +1 -1
- package/dist/xlsx/formula/ast.d.ts +5 -1
- package/dist/xlsx/formula/ast.d.ts.map +1 -1
- package/dist/xlsx/formula/call.d.ts.map +1 -1
- package/dist/xlsx/formula/coerce.d.ts.map +1 -1
- package/dist/xlsx/formula/context.d.ts +5 -0
- package/dist/xlsx/formula/context.d.ts.map +1 -1
- package/dist/xlsx/formula/date-serial.d.ts +11 -4
- package/dist/xlsx/formula/date-serial.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-core.d.ts +6 -0
- package/dist/xlsx/formula/engine-core.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-host.d.ts +35 -3
- package/dist/xlsx/formula/engine-host.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-util.d.ts.map +1 -1
- package/dist/xlsx/formula/engine.d.ts.map +1 -1
- package/dist/xlsx/formula/evaluator.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/array-shape.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/array.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/criteria-index.d.ts +12 -0
- package/dist/xlsx/formula/functions/criteria-index.d.ts.map +1 -0
- package/dist/xlsx/formula/functions/criteria.d.ts +24 -16
- package/dist/xlsx/formula/functions/criteria.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/date-calc.d.ts +4 -0
- package/dist/xlsx/formula/functions/date-calc.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/depreciation.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/financial.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/helpers.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/logical.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/lookup-core.d.ts +14 -2
- package/dist/xlsx/formula/functions/lookup-core.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/lookup.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/math-mod.d.ts +8 -0
- package/dist/xlsx/formula/functions/math-mod.d.ts.map +1 -0
- package/dist/xlsx/formula/functions/math-sum.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/math.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/statistical-count.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/statistical.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/stats-core.d.ts +6 -0
- package/dist/xlsx/formula/functions/stats-core.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/text-case.d.ts +14 -0
- package/dist/xlsx/formula/functions/text-case.d.ts.map +1 -0
- package/dist/xlsx/formula/functions/text.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/workdays.d.ts.map +1 -1
- package/dist/xlsx/formula/graph-index.d.ts +15 -0
- package/dist/xlsx/formula/graph-index.d.ts.map +1 -0
- package/dist/xlsx/formula/graph.d.ts +13 -18
- package/dist/xlsx/formula/graph.d.ts.map +1 -1
- package/dist/xlsx/formula/operators.d.ts +9 -0
- package/dist/xlsx/formula/operators.d.ts.map +1 -1
- package/dist/xlsx/formula/parser.d.ts +2 -0
- package/dist/xlsx/formula/parser.d.ts.map +1 -1
- package/dist/xlsx/formula/references.d.ts +4 -1
- package/dist/xlsx/formula/references.d.ts.map +1 -1
- package/dist/xlsx/formula/text-number.d.ts.map +1 -1
- package/dist/xlsx/formula/transform.d.ts.map +1 -1
- package/dist/xlsx/formula/values.d.ts +44 -3
- package/dist/xlsx/formula/values.d.ts.map +1 -1
- package/dist/xlsx/index.cjs +4698 -1322
- package/dist/xlsx/index.mjs +4688 -1323
- package/dist/xlsx/layout/anchors.d.ts +47 -0
- package/dist/xlsx/layout/anchors.d.ts.map +1 -0
- package/dist/xlsx/layout/cf-evaluator.d.ts +1 -2
- package/dist/xlsx/layout/cf-evaluator.d.ts.map +1 -1
- package/dist/xlsx/layout/cf-helpers.d.ts +8 -1
- package/dist/xlsx/layout/cf-helpers.d.ts.map +1 -1
- package/dist/xlsx/layout/index.d.ts +1 -0
- package/dist/xlsx/layout/index.d.ts.map +1 -1
- package/dist/xlsx/load/csv.d.ts +24 -3
- package/dist/xlsx/load/csv.d.ts.map +1 -1
- package/dist/xlsx/load/detect.d.ts +39 -7
- package/dist/xlsx/load/detect.d.ts.map +1 -1
- package/dist/xlsx/load/errors.d.ts +10 -0
- package/dist/xlsx/load/errors.d.ts.map +1 -0
- package/dist/xlsx/load/index.cjs +16220 -12163
- package/dist/xlsx/load/index.d.ts +5 -2
- package/dist/xlsx/load/index.d.ts.map +1 -1
- package/dist/xlsx/load/index.mjs +16213 -12164
- package/dist/xlsx/load/text-decode.d.ts +7 -0
- package/dist/xlsx/load/text-decode.d.ts.map +1 -0
- package/dist/xlsx/model.d.ts +121 -17
- package/dist/xlsx/model.d.ts.map +1 -1
- package/dist/xlsx/numfmt/date.d.ts +7 -0
- package/dist/xlsx/numfmt/date.d.ts.map +1 -1
- package/dist/xlsx/numfmt/format.d.ts.map +1 -1
- package/dist/xlsx/numfmt/fraction.d.ts +5 -1
- package/dist/xlsx/numfmt/fraction.d.ts.map +1 -1
- package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
- package/dist/xlsx/numfmt/input.d.ts.map +1 -1
- package/dist/xlsx/numfmt/number.d.ts.map +1 -1
- package/dist/xlsx/read/conditional.d.ts.map +1 -1
- package/dist/xlsx/read/drawing.d.ts +2 -2
- package/dist/xlsx/read/drawing.d.ts.map +1 -1
- package/dist/xlsx/read/load.d.ts.map +1 -1
- package/dist/xlsx/read/package.d.ts +18 -2
- package/dist/xlsx/read/package.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-data.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-props.d.ts +15 -1
- package/dist/xlsx/read/sheet-props.d.ts.map +1 -1
- package/dist/xlsx/read/smart-art.d.ts +12 -0
- package/dist/xlsx/read/smart-art.d.ts.map +1 -0
- package/dist/xlsx/read/styles.d.ts.map +1 -1
- package/dist/xlsx/read/workbook-part.d.ts +5 -2
- package/dist/xlsx/read/workbook-part.d.ts.map +1 -1
- package/dist/xlsx/read/worksheet.d.ts.map +1 -1
- package/dist/xlsx/write/attr-merge.d.ts +10 -0
- package/dist/xlsx/write/attr-merge.d.ts.map +1 -0
- package/dist/xlsx/write/carried-refs.d.ts +61 -0
- package/dist/xlsx/write/carried-refs.d.ts.map +1 -0
- package/dist/xlsx/write/comments.d.ts +12 -2
- package/dist/xlsx/write/comments.d.ts.map +1 -1
- package/dist/xlsx/write/conditional.d.ts.map +1 -1
- package/dist/xlsx/write/doc-props.d.ts +30 -0
- package/dist/xlsx/write/doc-props.d.ts.map +1 -0
- package/dist/xlsx/write/drawing.d.ts +5 -0
- package/dist/xlsx/write/drawing.d.ts.map +1 -1
- package/dist/xlsx/write/metadata.d.ts +23 -0
- package/dist/xlsx/write/metadata.d.ts.map +1 -0
- package/dist/xlsx/write/package-writer.d.ts +6 -0
- package/dist/xlsx/write/package-writer.d.ts.map +1 -1
- package/dist/xlsx/write/page-setup.d.ts +8 -0
- package/dist/xlsx/write/page-setup.d.ts.map +1 -0
- package/dist/xlsx/write/save.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-data.d.ts +8 -0
- package/dist/xlsx/write/sheet-data.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-parts.d.ts +6 -0
- package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-props.d.ts +0 -6
- package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
- package/dist/xlsx/write/styles.d.ts.map +1 -1
- package/dist/xlsx/write/table-patch.d.ts +12 -0
- package/dist/xlsx/write/table-patch.d.ts.map +1 -0
- package/dist/xlsx/write/tables.d.ts +9 -0
- package/dist/xlsx/write/tables.d.ts.map +1 -1
- package/dist/xlsx/write/vml-ids.d.ts +29 -0
- package/dist/xlsx/write/vml-ids.d.ts.map +1 -0
- package/dist/xlsx/write/workbook-part.d.ts +1 -4
- package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
- package/dist/xlsx/write/worksheet.d.ts.map +1 -1
- package/dist/xml/index.cjs +4 -0
- package/dist/xml/index.mjs +4 -0
- package/dist/xml/namespaces.d.ts +4 -0
- package/dist/xml/namespaces.d.ts.map +1 -1
- package/package.json +16 -1
- package/dist/pptx/chunks/index-CojJtI77.d.ts.map +0 -1
- package/dist/pptx/chunks/signature-inspection-status-Bh2oap7B.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -35,22 +35,30 @@ import { parseXml } from 'ooxml-core/xml'; // one area
|
|
|
35
35
|
import { xml, opc } from 'ooxml-core'; // or by namespace (shared building blocks)
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
| Area | What it is
|
|
39
|
-
| ---------- |
|
|
40
|
-
| `xml` | The shared XML model: strict DOM parsing and serialization, namespaces, namespace-aware helpers.
|
|
41
|
-
| `opc` | Open Packaging Conventions: relationships, content types, part paths, zip helpers,
|
|
42
|
-
| `units` | Branded EMU, twip and point types, constants and conversions.
|
|
43
|
-
| `color` | Hex, RGB, HSL and linear colour primitives, OOXML percent and angle parsing.
|
|
44
|
-
| `geometry` | DrawingML preset shapes, connection sites, clip paths, callouts and boolean shape operations.
|
|
45
|
-
| `diagram` | SmartArt (DiagramML), format-neutral: data model, layout/colour/quick-style parts, the cached `dsp:drawing` shape tree, relationship resolution and a loader. Used by `docx`; `pptx` re-imports its parsers.
|
|
46
|
-
| `digest` | Synchronous pure-TypeScript SHA-1, SHA-256, SHA-384 and SHA-512, ECMA-376 digest name normalisation (`SHA-512`, `SHA512`, `sha_512`, ...) and the agile password hash Office protection elements store (`hashPassword`, `verifyPasswordHash`). No Web Crypto, so it works on `http://`. Used by `xlsx` sheet and workbook protection.
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
38
|
+
| Area | What it is |
|
|
39
|
+
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
40
|
+
| `xml` | The shared XML model: strict DOM parsing and serialization, namespaces, namespace-aware helpers. |
|
|
41
|
+
| `opc` | Open Packaging Conventions: relationships, content types, part paths, zip helpers, the hyperlink safety policy (`hyperlinkPolicy`) and document properties (core, app and custom, `opc/properties`) and digital signatures (`signature`: detection, the parts a writer strips, XML-DSig parsing and digest checks; the Node verifier is `/pptx/signature-node`). |
|
|
42
|
+
| `units` | Branded EMU, twip and point types, constants and conversions. |
|
|
43
|
+
| `color` | Hex, RGB, HSL and linear colour primitives, OOXML percent and angle parsing. |
|
|
44
|
+
| `geometry` | DrawingML preset shapes, connection sites, clip paths, callouts and boolean shape operations. |
|
|
45
|
+
| `diagram` | SmartArt (DiagramML), format-neutral: data model, layout/colour/quick-style parts, the cached `dsp:drawing` shape tree, relationship resolution and a loader. Used by `docx`; `pptx` re-imports its parsers. |
|
|
46
|
+
| `digest` | Synchronous pure-TypeScript SHA-1, SHA-256, SHA-384 and SHA-512, ECMA-376 digest name normalisation (`SHA-512`, `SHA512`, `sha_512`, ...) and the agile password hash Office protection elements store (`hashPassword`, `verifyPasswordHash`). No Web Crypto, so it works on `http://`. Used by `xlsx` sheet and workbook protection. |
|
|
47
|
+
| `crypto` | ECMA-376 package encryption ([MS-OFFCRYPTO]) for every format: `decryptOoxmlPackage`, `encryptOoxmlPackage` (agile AES-256/SHA-512 by default, or Standard), `isEncryptedOoxmlPackage`, and typed errors with a `code` (`password-required`, `incorrect-password`, `data-integrity`). The compound-file container comes from ole2 (inlined); not in the root entry. |
|
|
48
|
+
| `collab` | Format-neutral real-time collaboration on Yjs: session and provider lifecycle, awareness/presence, transport-neutral sync (WebSocket, in-memory, any byte channel), update codecs, ordering helpers, asset sync and the product adapter seam. See `docs/collab-area.md`. |
|
|
49
|
+
| `docx` | WordprocessingML: model, parser, preserving serializer, editing, validation. Also `/docx/embedded`. `/docx/layout` is the DOM-free pagination engine (an approximation of Word, not parity) and `/docx/load` detects and loads DOCX (also password-protected, `{ password }`) and legacy .doc (ole2 inlined). |
|
|
50
|
+
| `pptx` | PresentationML: model, parser, serializer, editing, charts, SmartArt, converters, CLI, signatures. Subpaths `/pptx/converter`, `/pptx/cli`, `/pptx/signature-node`. |
|
|
51
|
+
| `xlsx` | SpreadsheetML: workbook model, `.xlsx`/`.xlsm` reader and preserving writer, formula engine (dependency graph, dynamic arrays, 380+ functions), Excel number formats, editing commands with undo, and the DOM-free grid layout (sizes, colours, conditional formats, charts as SVG, drawing anchors). SmartArt is shown from the cached drawing (not re-laid out) and kept verbatim on save. `/xlsx/load` detects and loads `.xlsx`, `.xlsm` (also password-protected: `loadWorkbook(bytes, { password })`, `saveWorkbook(workbook, 'xlsx', { password })`), legacy `.xls` (ole2 inlined) and CSV, and refuses `.xlsb` with a typed error. Digital signatures are detected and reported, never kept on save. An approximation of Excel, not parity. |
|
|
51
52
|
|
|
52
53
|
Legacy binary formats (`.doc`, `.xls`, `.ppt`) and the compound-file container live in the sibling package [`ole2`](https://github.com/ChristopherVR/ole2); this package never contains binary codecs, and `ole2` never contains modern OOXML.
|
|
53
54
|
|
|
55
|
+
The `chart` subpath provides shared chart data calculations (regression, quartiles,
|
|
56
|
+
blank values and stacked series). The `text` subpath provides script-category
|
|
57
|
+
segmentation primitives. These areas are DOM-free and do not import a product model.
|
|
58
|
+
SVG curve flattening is available from `geometry`. See the
|
|
59
|
+
[PowerPoint reuse audit](docs/pptx-shared-logic-audit.md) for extraction evidence
|
|
60
|
+
and remaining candidates.
|
|
61
|
+
|
|
54
62
|
## Install
|
|
55
63
|
|
|
56
64
|
```bash
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blank-value display resolution for `c:dispBlanksAs`.
|
|
3
|
+
*
|
|
4
|
+
* A chart series carries an optional `blanks` mask (from core) marking category
|
|
5
|
+
* slots whose numeric cache point was absent. This module turns that mask into
|
|
6
|
+
* per-point render instructions per the chart's `c:dispBlanksAs` mode:
|
|
7
|
+
*
|
|
8
|
+
* - `gap` - the blank point is omitted and the line breaks around it.
|
|
9
|
+
* - `zero` - the blank point plots as `0` (its placeholder value).
|
|
10
|
+
* - `span` - the blank is linearly interpolated from its nearest real neighbours.
|
|
11
|
+
*
|
|
12
|
+
* When the mode is unset the output preserves existing behaviour exactly (all
|
|
13
|
+
* points visible, placeholder `0` values), so charts without an explicit
|
|
14
|
+
* `c:dispBlanksAs` render unchanged.
|
|
15
|
+
*
|
|
16
|
+
* @module chart-blank-display
|
|
17
|
+
*/
|
|
18
|
+
/** Values of `c:dispBlanksAs`. */
|
|
19
|
+
export type DispBlanksAs = 'gap' | 'zero' | 'span';
|
|
20
|
+
/** Per-point render instructions after applying a blank mode. */
|
|
21
|
+
export interface BlankDisplay {
|
|
22
|
+
/** Effective values (interpolated for `span`; `0` placeholder otherwise). */
|
|
23
|
+
values: number[];
|
|
24
|
+
/** Whether each point is drawn. `false` only for blanks under `gap`. */
|
|
25
|
+
visible: boolean[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve display values + visibility for a series given its blank mask and mode.
|
|
29
|
+
*
|
|
30
|
+
* @param values - Effective values aligned to display order (blanks carry `0`).
|
|
31
|
+
* @param blanks - Blank mask aligned index-for-index with `values`.
|
|
32
|
+
* @param mode - `c:dispBlanksAs` mode; `undefined` preserves existing behaviour.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveBlankDisplay(values: ReadonlyArray<number>, blanks: ReadonlyArray<boolean> | undefined, mode: DispBlanksAs | undefined): BlankDisplay;
|
|
35
|
+
/** Contiguous runs of visible indices, used to break a line at gaps. */
|
|
36
|
+
export declare function visibleRuns(visible: ReadonlyArray<boolean>): number[][];
|
|
37
|
+
//# sourceMappingURL=blank-display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blank-display.d.ts","sourceRoot":"","sources":["../../src/chart/blank-display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,kCAAkC;AAClC,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC5B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,OAAO,EAAE,CAAC;CACnB;AA+BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,EAC1C,IAAI,EAAE,YAAY,GAAG,SAAS,GAC5B,YAAY,CAad;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,CAevE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row indexes sharing each unique category label, in first-appearance order.
|
|
3
|
+
*
|
|
4
|
+
* A `cx:boxWhisker` chart's raw data repeats its category label once per
|
|
5
|
+
* underlying observation (COM-verified against `charts-com.pptx` slide 32 /
|
|
6
|
+
* `chartEx7.xml`: `Category 1` appears on 9 consecutive rows, `Category 2` on
|
|
7
|
+
* 7, `Category 3` on 6), because every row IS one observation, not one
|
|
8
|
+
* category. A box's quartiles must be computed from the observations that
|
|
9
|
+
* share its category label, not from one value per row.
|
|
10
|
+
*/
|
|
11
|
+
export interface CategoryRowGroups {
|
|
12
|
+
/** Unique category labels, in first-appearance (authoring) order. */
|
|
13
|
+
uniqueCategories: string[];
|
|
14
|
+
/** Every raw row index whose category label equals the map key. */
|
|
15
|
+
rowIndexesByCategory: ReadonlyMap<string, number[]>;
|
|
16
|
+
}
|
|
17
|
+
/** Group raw (possibly repeated) category labels by unique text. */
|
|
18
|
+
export declare function groupRowsByCategory(rawCategories: ReadonlyArray<string>): CategoryRowGroups;
|
|
19
|
+
export interface BoxStats {
|
|
20
|
+
min: number;
|
|
21
|
+
q1: number;
|
|
22
|
+
median: number;
|
|
23
|
+
q3: number;
|
|
24
|
+
max: number;
|
|
25
|
+
}
|
|
26
|
+
/** Compute quartiles, preserving the legacy floor-index result when method is absent. */
|
|
27
|
+
export declare function computeBoxStats(values: ReadonlyArray<number>, method?: 'inclusive' | 'exclusive'): BoxStats | undefined;
|
|
28
|
+
//# sourceMappingURL=box-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-stats.d.ts","sourceRoot":"","sources":["../../src/chart/box-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IACjC,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mEAAmE;IACnE,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACpD;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAc3F;AAED,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACZ;AAeD,yFAAyF;AACzF,wBAAgB,eAAe,CAC9B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,GAChC,QAAQ,GAAG,SAAS,CAqBtB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/chart/regression.ts
|
|
4
|
+
function computeLinearRegression(xVals, yVals) {
|
|
5
|
+
const n = xVals.length;
|
|
6
|
+
if (n < 2) {
|
|
7
|
+
return { slope: 0, intercept: 0, rSquared: 0 };
|
|
8
|
+
}
|
|
9
|
+
let sumX = 0;
|
|
10
|
+
let sumY = 0;
|
|
11
|
+
let sumXY = 0;
|
|
12
|
+
let sumXX = 0;
|
|
13
|
+
for (let i = 0; i < n; i++) {
|
|
14
|
+
sumX += xVals[i];
|
|
15
|
+
sumY += yVals[i];
|
|
16
|
+
sumXY += xVals[i] * yVals[i];
|
|
17
|
+
sumXX += xVals[i] * xVals[i];
|
|
18
|
+
}
|
|
19
|
+
const denom = n * sumXX - sumX * sumX;
|
|
20
|
+
if (Math.abs(denom) < 1e-12) {
|
|
21
|
+
return { slope: 0, intercept: sumY / n, rSquared: 0 };
|
|
22
|
+
}
|
|
23
|
+
const slope = (n * sumXY - sumX * sumY) / denom;
|
|
24
|
+
const intercept = (sumY - slope * sumX) / n;
|
|
25
|
+
const ssRes = yVals.reduce((s, y, i) => s + (y - (slope * xVals[i] + intercept)) ** 2, 0);
|
|
26
|
+
const meanY = sumY / n;
|
|
27
|
+
const ssTot = yVals.reduce((s, y) => s + (y - meanY) ** 2, 0);
|
|
28
|
+
const rSquared = ssTot > 0 ? 1 - ssRes / ssTot : 0;
|
|
29
|
+
return { slope, intercept, rSquared };
|
|
30
|
+
}
|
|
31
|
+
function fitPolynomial(xVals, yVals, order) {
|
|
32
|
+
const n = xVals.length;
|
|
33
|
+
const m = order + 1;
|
|
34
|
+
const matrix = Array.from({ length: m }, () => Array(m + 1).fill(0));
|
|
35
|
+
for (let i = 0; i < m; i++) {
|
|
36
|
+
for (let j = 0; j < m; j++) {
|
|
37
|
+
let sum2 = 0;
|
|
38
|
+
for (let k = 0; k < n; k++) {
|
|
39
|
+
sum2 += xVals[k] ** (i + j);
|
|
40
|
+
}
|
|
41
|
+
matrix[i][j] = sum2;
|
|
42
|
+
}
|
|
43
|
+
let sum = 0;
|
|
44
|
+
for (let k = 0; k < n; k++) {
|
|
45
|
+
sum += yVals[k] * xVals[k] ** i;
|
|
46
|
+
}
|
|
47
|
+
matrix[i][m] = sum;
|
|
48
|
+
}
|
|
49
|
+
for (let i = 0; i < m; i++) {
|
|
50
|
+
let maxRow = i;
|
|
51
|
+
for (let k = i + 1; k < m; k++) {
|
|
52
|
+
if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {
|
|
53
|
+
maxRow = k;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
[matrix[i], matrix[maxRow]] = [matrix[maxRow], matrix[i]];
|
|
57
|
+
const pivot = matrix[i][i];
|
|
58
|
+
if (Math.abs(pivot) < 1e-12) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
for (let j = i; j <= m; j++) {
|
|
62
|
+
matrix[i][j] = matrix[i][j] / pivot;
|
|
63
|
+
}
|
|
64
|
+
for (let k = 0; k < m; k++) {
|
|
65
|
+
if (k === i) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const factor = matrix[k][i];
|
|
69
|
+
for (let j = i; j <= m; j++) {
|
|
70
|
+
matrix[k][j] = matrix[k][j] - factor * matrix[i][j];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return matrix.map((row) => row[m]);
|
|
75
|
+
}
|
|
76
|
+
function computeRSquared(xVals, yVals, evalFn) {
|
|
77
|
+
const n = xVals.length;
|
|
78
|
+
if (n === 0) {
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
const meanY = yVals.reduce((s, y) => s + y, 0) / n;
|
|
82
|
+
let ssRes = 0;
|
|
83
|
+
let ssTot = 0;
|
|
84
|
+
for (let i = 0; i < n; i++) {
|
|
85
|
+
ssRes += (yVals[i] - evalFn(xVals[i])) ** 2;
|
|
86
|
+
ssTot += (yVals[i] - meanY) ** 2;
|
|
87
|
+
}
|
|
88
|
+
return ssTot > 0 ? 1 - ssRes / ssTot : 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/chart/box-stats.ts
|
|
92
|
+
function groupRowsByCategory(rawCategories) {
|
|
93
|
+
const uniqueCategories = [];
|
|
94
|
+
const rowIndexesByCategory = /* @__PURE__ */ new Map();
|
|
95
|
+
rawCategories.forEach((rawLabel, rowIndex) => {
|
|
96
|
+
const label = rawLabel ?? "";
|
|
97
|
+
let rows = rowIndexesByCategory.get(label);
|
|
98
|
+
if (!rows) {
|
|
99
|
+
rows = [];
|
|
100
|
+
rowIndexesByCategory.set(label, rows);
|
|
101
|
+
uniqueCategories.push(label);
|
|
102
|
+
}
|
|
103
|
+
rows.push(rowIndex);
|
|
104
|
+
});
|
|
105
|
+
return { uniqueCategories, rowIndexesByCategory };
|
|
106
|
+
}
|
|
107
|
+
function percentile(sorted, p, method) {
|
|
108
|
+
const rank = method === "inclusive" ? (sorted.length - 1) * p : (sorted.length + 1) * p - 1;
|
|
109
|
+
const clamped = Math.max(0, Math.min(rank, sorted.length - 1));
|
|
110
|
+
const lower = Math.floor(clamped);
|
|
111
|
+
const upper = Math.ceil(clamped);
|
|
112
|
+
const fraction = clamped - lower;
|
|
113
|
+
return sorted[lower] + (sorted[upper] - sorted[lower]) * fraction;
|
|
114
|
+
}
|
|
115
|
+
function computeBoxStats(values, method) {
|
|
116
|
+
if (values.length < 2) {
|
|
117
|
+
return void 0;
|
|
118
|
+
}
|
|
119
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
120
|
+
if (!method) {
|
|
121
|
+
return {
|
|
122
|
+
min: sorted[0],
|
|
123
|
+
q1: sorted[Math.floor(sorted.length * 0.25)],
|
|
124
|
+
median: sorted[Math.floor(sorted.length * 0.5)],
|
|
125
|
+
q3: sorted[Math.floor(sorted.length * 0.75)],
|
|
126
|
+
max: sorted[sorted.length - 1]
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
min: sorted[0],
|
|
131
|
+
q1: percentile(sorted, 0.25, method),
|
|
132
|
+
median: percentile(sorted, 0.5, method),
|
|
133
|
+
q3: percentile(sorted, 0.75, method),
|
|
134
|
+
max: sorted[sorted.length - 1]
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// src/chart/blank-display.ts
|
|
139
|
+
function interpolate(values, blank) {
|
|
140
|
+
const out = [...values];
|
|
141
|
+
for (let i = 0; i < out.length; i++) {
|
|
142
|
+
if (!blank[i]) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
let prev = i - 1;
|
|
146
|
+
while (prev >= 0 && blank[prev]) {
|
|
147
|
+
prev--;
|
|
148
|
+
}
|
|
149
|
+
let next = i + 1;
|
|
150
|
+
while (next < out.length && blank[next]) {
|
|
151
|
+
next++;
|
|
152
|
+
}
|
|
153
|
+
const hasPrev = prev >= 0;
|
|
154
|
+
const hasNext = next < out.length;
|
|
155
|
+
if (hasPrev && hasNext) {
|
|
156
|
+
const t = (i - prev) / (next - prev);
|
|
157
|
+
out[i] = values[prev] + (values[next] - values[prev]) * t;
|
|
158
|
+
} else if (hasPrev) {
|
|
159
|
+
out[i] = values[prev];
|
|
160
|
+
} else if (hasNext) {
|
|
161
|
+
out[i] = values[next];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
function resolveBlankDisplay(values, blanks, mode) {
|
|
167
|
+
const visible = values.map(() => true);
|
|
168
|
+
if (!blanks || !blanks.some(Boolean) || mode === void 0 || mode === "zero") {
|
|
169
|
+
return { values: [...values], visible };
|
|
170
|
+
}
|
|
171
|
+
if (mode === "span") {
|
|
172
|
+
return { values: interpolate(values, blanks), visible };
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
values: [...values],
|
|
176
|
+
visible: values.map((_v, i) => !blanks[i])
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function visibleRuns(visible) {
|
|
180
|
+
const runs = [];
|
|
181
|
+
let current = [];
|
|
182
|
+
for (let i = 0; i < visible.length; i++) {
|
|
183
|
+
if (visible[i]) {
|
|
184
|
+
current.push(i);
|
|
185
|
+
} else if (current.length > 0) {
|
|
186
|
+
runs.push(current);
|
|
187
|
+
current = [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (current.length > 0) {
|
|
191
|
+
runs.push(current);
|
|
192
|
+
}
|
|
193
|
+
return runs;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// src/chart/stacked-series.ts
|
|
197
|
+
function categoryAbsTotals(seriesValues, catCount) {
|
|
198
|
+
return Array.from(
|
|
199
|
+
{ length: catCount },
|
|
200
|
+
(_, ci) => seriesValues.reduce((sum, values) => sum + Math.abs(values[ci] ?? 0), 0)
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
function computeStackedSeriesPlots(seriesValues, catCount, percent) {
|
|
204
|
+
const totals = percent ? categoryAbsTotals(seriesValues, catCount) : void 0, posRunning = new Array(catCount).fill(0), negRunning = new Array(catCount).fill(0);
|
|
205
|
+
return seriesValues.map((values) => {
|
|
206
|
+
const cumulative = [], base = [], own = [];
|
|
207
|
+
for (let ci = 0; ci < catCount; ci++) {
|
|
208
|
+
const raw = values[ci] ?? 0, total = totals?.[ci] ?? 0, val = percent ? total > 0 ? raw / total * 100 : 0 : raw, isNeg = val < 0, from = isNeg ? negRunning[ci] : posRunning[ci], to = from + val;
|
|
209
|
+
base.push(from);
|
|
210
|
+
cumulative.push(to);
|
|
211
|
+
own.push(val);
|
|
212
|
+
if (isNeg) {
|
|
213
|
+
negRunning[ci] = to;
|
|
214
|
+
} else {
|
|
215
|
+
posRunning[ci] = to;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return { cumulative, base, own };
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
exports.computeBoxStats = computeBoxStats;
|
|
223
|
+
exports.computeLinearRegression = computeLinearRegression;
|
|
224
|
+
exports.computeRSquared = computeRSquared;
|
|
225
|
+
exports.computeStackedSeriesPlots = computeStackedSeriesPlots;
|
|
226
|
+
exports.fitPolynomial = fitPolynomial;
|
|
227
|
+
exports.groupRowsByCategory = groupRowsByCategory;
|
|
228
|
+
exports.resolveBlankDisplay = resolveBlankDisplay;
|
|
229
|
+
exports.visibleRuns = visibleRuns;
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// src/chart/regression.ts
|
|
2
|
+
function computeLinearRegression(xVals, yVals) {
|
|
3
|
+
const n = xVals.length;
|
|
4
|
+
if (n < 2) {
|
|
5
|
+
return { slope: 0, intercept: 0, rSquared: 0 };
|
|
6
|
+
}
|
|
7
|
+
let sumX = 0;
|
|
8
|
+
let sumY = 0;
|
|
9
|
+
let sumXY = 0;
|
|
10
|
+
let sumXX = 0;
|
|
11
|
+
for (let i = 0; i < n; i++) {
|
|
12
|
+
sumX += xVals[i];
|
|
13
|
+
sumY += yVals[i];
|
|
14
|
+
sumXY += xVals[i] * yVals[i];
|
|
15
|
+
sumXX += xVals[i] * xVals[i];
|
|
16
|
+
}
|
|
17
|
+
const denom = n * sumXX - sumX * sumX;
|
|
18
|
+
if (Math.abs(denom) < 1e-12) {
|
|
19
|
+
return { slope: 0, intercept: sumY / n, rSquared: 0 };
|
|
20
|
+
}
|
|
21
|
+
const slope = (n * sumXY - sumX * sumY) / denom;
|
|
22
|
+
const intercept = (sumY - slope * sumX) / n;
|
|
23
|
+
const ssRes = yVals.reduce((s, y, i) => s + (y - (slope * xVals[i] + intercept)) ** 2, 0);
|
|
24
|
+
const meanY = sumY / n;
|
|
25
|
+
const ssTot = yVals.reduce((s, y) => s + (y - meanY) ** 2, 0);
|
|
26
|
+
const rSquared = ssTot > 0 ? 1 - ssRes / ssTot : 0;
|
|
27
|
+
return { slope, intercept, rSquared };
|
|
28
|
+
}
|
|
29
|
+
function fitPolynomial(xVals, yVals, order) {
|
|
30
|
+
const n = xVals.length;
|
|
31
|
+
const m = order + 1;
|
|
32
|
+
const matrix = Array.from({ length: m }, () => Array(m + 1).fill(0));
|
|
33
|
+
for (let i = 0; i < m; i++) {
|
|
34
|
+
for (let j = 0; j < m; j++) {
|
|
35
|
+
let sum2 = 0;
|
|
36
|
+
for (let k = 0; k < n; k++) {
|
|
37
|
+
sum2 += xVals[k] ** (i + j);
|
|
38
|
+
}
|
|
39
|
+
matrix[i][j] = sum2;
|
|
40
|
+
}
|
|
41
|
+
let sum = 0;
|
|
42
|
+
for (let k = 0; k < n; k++) {
|
|
43
|
+
sum += yVals[k] * xVals[k] ** i;
|
|
44
|
+
}
|
|
45
|
+
matrix[i][m] = sum;
|
|
46
|
+
}
|
|
47
|
+
for (let i = 0; i < m; i++) {
|
|
48
|
+
let maxRow = i;
|
|
49
|
+
for (let k = i + 1; k < m; k++) {
|
|
50
|
+
if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {
|
|
51
|
+
maxRow = k;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
[matrix[i], matrix[maxRow]] = [matrix[maxRow], matrix[i]];
|
|
55
|
+
const pivot = matrix[i][i];
|
|
56
|
+
if (Math.abs(pivot) < 1e-12) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
for (let j = i; j <= m; j++) {
|
|
60
|
+
matrix[i][j] = matrix[i][j] / pivot;
|
|
61
|
+
}
|
|
62
|
+
for (let k = 0; k < m; k++) {
|
|
63
|
+
if (k === i) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const factor = matrix[k][i];
|
|
67
|
+
for (let j = i; j <= m; j++) {
|
|
68
|
+
matrix[k][j] = matrix[k][j] - factor * matrix[i][j];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return matrix.map((row) => row[m]);
|
|
73
|
+
}
|
|
74
|
+
function computeRSquared(xVals, yVals, evalFn) {
|
|
75
|
+
const n = xVals.length;
|
|
76
|
+
if (n === 0) {
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
const meanY = yVals.reduce((s, y) => s + y, 0) / n;
|
|
80
|
+
let ssRes = 0;
|
|
81
|
+
let ssTot = 0;
|
|
82
|
+
for (let i = 0; i < n; i++) {
|
|
83
|
+
ssRes += (yVals[i] - evalFn(xVals[i])) ** 2;
|
|
84
|
+
ssTot += (yVals[i] - meanY) ** 2;
|
|
85
|
+
}
|
|
86
|
+
return ssTot > 0 ? 1 - ssRes / ssTot : 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// src/chart/box-stats.ts
|
|
90
|
+
function groupRowsByCategory(rawCategories) {
|
|
91
|
+
const uniqueCategories = [];
|
|
92
|
+
const rowIndexesByCategory = /* @__PURE__ */ new Map();
|
|
93
|
+
rawCategories.forEach((rawLabel, rowIndex) => {
|
|
94
|
+
const label = rawLabel ?? "";
|
|
95
|
+
let rows = rowIndexesByCategory.get(label);
|
|
96
|
+
if (!rows) {
|
|
97
|
+
rows = [];
|
|
98
|
+
rowIndexesByCategory.set(label, rows);
|
|
99
|
+
uniqueCategories.push(label);
|
|
100
|
+
}
|
|
101
|
+
rows.push(rowIndex);
|
|
102
|
+
});
|
|
103
|
+
return { uniqueCategories, rowIndexesByCategory };
|
|
104
|
+
}
|
|
105
|
+
function percentile(sorted, p, method) {
|
|
106
|
+
const rank = method === "inclusive" ? (sorted.length - 1) * p : (sorted.length + 1) * p - 1;
|
|
107
|
+
const clamped = Math.max(0, Math.min(rank, sorted.length - 1));
|
|
108
|
+
const lower = Math.floor(clamped);
|
|
109
|
+
const upper = Math.ceil(clamped);
|
|
110
|
+
const fraction = clamped - lower;
|
|
111
|
+
return sorted[lower] + (sorted[upper] - sorted[lower]) * fraction;
|
|
112
|
+
}
|
|
113
|
+
function computeBoxStats(values, method) {
|
|
114
|
+
if (values.length < 2) {
|
|
115
|
+
return void 0;
|
|
116
|
+
}
|
|
117
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
118
|
+
if (!method) {
|
|
119
|
+
return {
|
|
120
|
+
min: sorted[0],
|
|
121
|
+
q1: sorted[Math.floor(sorted.length * 0.25)],
|
|
122
|
+
median: sorted[Math.floor(sorted.length * 0.5)],
|
|
123
|
+
q3: sorted[Math.floor(sorted.length * 0.75)],
|
|
124
|
+
max: sorted[sorted.length - 1]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
min: sorted[0],
|
|
129
|
+
q1: percentile(sorted, 0.25, method),
|
|
130
|
+
median: percentile(sorted, 0.5, method),
|
|
131
|
+
q3: percentile(sorted, 0.75, method),
|
|
132
|
+
max: sorted[sorted.length - 1]
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/chart/blank-display.ts
|
|
137
|
+
function interpolate(values, blank) {
|
|
138
|
+
const out = [...values];
|
|
139
|
+
for (let i = 0; i < out.length; i++) {
|
|
140
|
+
if (!blank[i]) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
let prev = i - 1;
|
|
144
|
+
while (prev >= 0 && blank[prev]) {
|
|
145
|
+
prev--;
|
|
146
|
+
}
|
|
147
|
+
let next = i + 1;
|
|
148
|
+
while (next < out.length && blank[next]) {
|
|
149
|
+
next++;
|
|
150
|
+
}
|
|
151
|
+
const hasPrev = prev >= 0;
|
|
152
|
+
const hasNext = next < out.length;
|
|
153
|
+
if (hasPrev && hasNext) {
|
|
154
|
+
const t = (i - prev) / (next - prev);
|
|
155
|
+
out[i] = values[prev] + (values[next] - values[prev]) * t;
|
|
156
|
+
} else if (hasPrev) {
|
|
157
|
+
out[i] = values[prev];
|
|
158
|
+
} else if (hasNext) {
|
|
159
|
+
out[i] = values[next];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
function resolveBlankDisplay(values, blanks, mode) {
|
|
165
|
+
const visible = values.map(() => true);
|
|
166
|
+
if (!blanks || !blanks.some(Boolean) || mode === void 0 || mode === "zero") {
|
|
167
|
+
return { values: [...values], visible };
|
|
168
|
+
}
|
|
169
|
+
if (mode === "span") {
|
|
170
|
+
return { values: interpolate(values, blanks), visible };
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
values: [...values],
|
|
174
|
+
visible: values.map((_v, i) => !blanks[i])
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function visibleRuns(visible) {
|
|
178
|
+
const runs = [];
|
|
179
|
+
let current = [];
|
|
180
|
+
for (let i = 0; i < visible.length; i++) {
|
|
181
|
+
if (visible[i]) {
|
|
182
|
+
current.push(i);
|
|
183
|
+
} else if (current.length > 0) {
|
|
184
|
+
runs.push(current);
|
|
185
|
+
current = [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (current.length > 0) {
|
|
189
|
+
runs.push(current);
|
|
190
|
+
}
|
|
191
|
+
return runs;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// src/chart/stacked-series.ts
|
|
195
|
+
function categoryAbsTotals(seriesValues, catCount) {
|
|
196
|
+
return Array.from(
|
|
197
|
+
{ length: catCount },
|
|
198
|
+
(_, ci) => seriesValues.reduce((sum, values) => sum + Math.abs(values[ci] ?? 0), 0)
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
function computeStackedSeriesPlots(seriesValues, catCount, percent) {
|
|
202
|
+
const totals = percent ? categoryAbsTotals(seriesValues, catCount) : void 0, posRunning = new Array(catCount).fill(0), negRunning = new Array(catCount).fill(0);
|
|
203
|
+
return seriesValues.map((values) => {
|
|
204
|
+
const cumulative = [], base = [], own = [];
|
|
205
|
+
for (let ci = 0; ci < catCount; ci++) {
|
|
206
|
+
const raw = values[ci] ?? 0, total = totals?.[ci] ?? 0, val = percent ? total > 0 ? raw / total * 100 : 0 : raw, isNeg = val < 0, from = isNeg ? negRunning[ci] : posRunning[ci], to = from + val;
|
|
207
|
+
base.push(from);
|
|
208
|
+
cumulative.push(to);
|
|
209
|
+
own.push(val);
|
|
210
|
+
if (isNeg) {
|
|
211
|
+
negRunning[ci] = to;
|
|
212
|
+
} else {
|
|
213
|
+
posRunning[ci] = to;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return { cumulative, base, own };
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export { computeBoxStats, computeLinearRegression, computeRSquared, computeStackedSeriesPlots, fitPolynomial, groupRowsByCategory, resolveBlankDisplay, visibleRuns };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chart-overlays-regression.ts: least-squares regression / polynomial-fit
|
|
3
|
+
* math for chart trendlines. Split out of chart-overlays.ts to keep that
|
|
4
|
+
* module under the repo's file-size guideline.
|
|
5
|
+
*
|
|
6
|
+
* Ported / adapted from:
|
|
7
|
+
* packages/react/src/viewer/utils/chart-trendlines.tsx (regression engine)
|
|
8
|
+
* packages/shared/src/render/chart-trendlines.ts (shared port)
|
|
9
|
+
*
|
|
10
|
+
* @module chart-overlays-regression
|
|
11
|
+
*/
|
|
12
|
+
/** Result of an ordinary least-squares linear regression. */
|
|
13
|
+
export interface LinearFit {
|
|
14
|
+
slope: number;
|
|
15
|
+
intercept: number;
|
|
16
|
+
rSquared: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Ordinary least-squares linear regression of `yVals` on `xVals`.
|
|
20
|
+
* Returns all zeros for fewer than 2 points. A near-zero denominator
|
|
21
|
+
* (constant-x data) gives slope=0, intercept=mean(y), rSquared=0.
|
|
22
|
+
* Input arrays are finite paired observations of equal length.
|
|
23
|
+
*
|
|
24
|
+
* Mirrors `computeLinearRegression` in chart-trendlines.tsx (React) and
|
|
25
|
+
* chart-trendlines.ts (shared).
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeLinearRegression(xVals: number[], yVals: number[]): LinearFit;
|
|
28
|
+
/**
|
|
29
|
+
* Fit polynomial coefficients (ascending order: [a0, a1, ..., a_order]) via
|
|
30
|
+
* Gaussian elimination on the normal equations.
|
|
31
|
+
* Input arrays are finite paired observations; order is a nonnegative integer.
|
|
32
|
+
* Mirrors `fitPolynomial` in chart-trendlines.tsx (React).
|
|
33
|
+
*/
|
|
34
|
+
export declare function fitPolynomial(xVals: number[], yVals: number[], order: number): number[];
|
|
35
|
+
/**
|
|
36
|
+
* Coefficient of determination (R-squared) of an arbitrary fit function
|
|
37
|
+
* against data. Mirrors `computeRSquared` in chart-trendlines.tsx (React).
|
|
38
|
+
*/
|
|
39
|
+
export declare function computeRSquared(xVals: number[], yVals: number[], evalFn: (x: number) => number): number;
|
|
40
|
+
//# sourceMappingURL=regression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/chart/regression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CA+BnF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA+CvF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC3B,MAAM,CAaR"}
|