@graphty/graph-io 0.3.42 → 0.3.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/approximations-3Q4TsdTh.js +40 -0
- package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
- package/dist/chunks/block-JQiwViEt.js +2777 -0
- package/dist/chunks/block-JQiwViEt.js.map +1 -0
- package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
- package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
- package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
- package/dist/chunks/constants-BFUR_CtU.js.map +1 -0
- package/dist/chunks/convert-BcQ8_jMo.js +59 -0
- package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
- package/dist/chunks/emit-DCwFLts5.js +3456 -0
- package/dist/chunks/emit-DCwFLts5.js.map +1 -0
- package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
- package/dist/chunks/escape-B1rMftd9.js.map +1 -0
- package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
- package/dist/chunks/export-D7IGzTG4.js.map +1 -0
- package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
- package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
- package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
- package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
- package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
- package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
- package/dist/chunks/{exporter-CpRyHZ3H.js → exporter-quPUCBiC.js} +1807 -288
- package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
- package/dist/chunks/format-GDmO6m6Q.js +676 -0
- package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
- package/dist/chunks/generic-BL06jrJf.js +1347 -0
- package/dist/chunks/generic-BL06jrJf.js.map +1 -0
- package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
- package/dist/chunks/importer-B7r2owVf.js.map +1 -0
- package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
- package/dist/chunks/importer-BFmOP96W.js.map +1 -0
- package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
- package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
- package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
- package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
- package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
- package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
- package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
- package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
- package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
- package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
- package/dist/chunks/index-B9fdNpTA.js +4310 -0
- package/dist/chunks/index-B9fdNpTA.js.map +1 -0
- package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
- package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
- package/dist/chunks/lexicon-B-knUi-l.js +508 -0
- package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
- package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
- package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
- package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
- package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
- package/dist/chunks/styles-Brt9JMfs.js +690 -0
- package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
- package/dist/chunks/styles-_N-C8S-U.js +2102 -0
- package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
- package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
- package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
- package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
- package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
- package/dist/chunks/units-XMZFIFe1.js +19 -0
- package/dist/chunks/units-XMZFIFe1.js.map +1 -0
- package/dist/csv.js +5 -4
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +1 -1
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +5 -2
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +295 -414
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +8 -3031
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +354 -240
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +4 -2
- package/dist/graphml.js.map +1 -1
- package/dist/json.js +1 -1
- package/dist/neo4j.js +4 -3
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +1 -1
- package/dist/pajek.js +4 -2
- package/dist/positions.d.ts +1 -0
- package/dist/positions.js +427 -0
- package/dist/positions.js.map +1 -0
- package/dist/src/common/codes.d.ts +6 -0
- package/dist/src/common/codes.d.ts.map +1 -1
- package/dist/src/common/codes.js +6 -0
- package/dist/src/common/codes.js.map +1 -1
- package/dist/src/common/escape.d.ts.map +1 -1
- package/dist/src/common/escape.js +4 -2
- package/dist/src/common/escape.js.map +1 -1
- package/dist/src/common/export.d.ts +10 -0
- package/dist/src/common/export.d.ts.map +1 -1
- package/dist/src/common/export.js +123 -100
- package/dist/src/common/export.js.map +1 -1
- package/dist/src/common/input.d.ts.map +1 -1
- package/dist/src/common/input.js +8 -1
- package/dist/src/common/input.js.map +1 -1
- package/dist/src/common/json-elements.d.ts +12 -9
- package/dist/src/common/json-elements.d.ts.map +1 -1
- package/dist/src/common/json-elements.js +160 -37
- package/dist/src/common/json-elements.js.map +1 -1
- package/dist/src/common/notes.d.ts +42 -0
- package/dist/src/common/notes.d.ts.map +1 -0
- package/dist/src/common/notes.js +72 -0
- package/dist/src/common/notes.js.map +1 -0
- package/dist/src/common/report.d.ts +18 -0
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +36 -1
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/common/units.d.ts +24 -0
- package/dist/src/common/units.d.ts.map +1 -0
- package/dist/src/common/units.js +26 -0
- package/dist/src/common/units.js.map +1 -0
- package/dist/src/common/xml.d.ts +18 -0
- package/dist/src/common/xml.d.ts.map +1 -1
- package/dist/src/common/xml.js +42 -5
- package/dist/src/common/xml.js.map +1 -1
- package/dist/src/formats/cx/exporter.d.ts +6 -0
- package/dist/src/formats/cx/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx/exporter.js +71 -8
- package/dist/src/formats/cx/exporter.js.map +1 -1
- package/dist/src/formats/cx/importer.d.ts +5 -2
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +102 -72
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +102 -0
- package/dist/src/formats/cx/styles.d.ts.map +1 -0
- package/dist/src/formats/cx/styles.js +225 -0
- package/dist/src/formats/cx/styles.js.map +1 -0
- package/dist/src/formats/cx2/exporter.d.ts +5 -0
- package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx2/exporter.js +181 -71
- package/dist/src/formats/cx2/exporter.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts +4 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +19 -1
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts +18 -0
- package/dist/src/formats/cx2/styles.d.ts.map +1 -0
- package/dist/src/formats/cx2/styles.js +24 -0
- package/dist/src/formats/cx2/styles.js.map +1 -0
- package/dist/src/formats/cys/constants.d.ts +2 -0
- package/dist/src/formats/cys/constants.d.ts.map +1 -1
- package/dist/src/formats/cys/constants.js +2 -0
- package/dist/src/formats/cys/constants.js.map +1 -1
- package/dist/src/formats/cys/exporter.d.ts +6 -2
- package/dist/src/formats/cys/exporter.d.ts.map +1 -1
- package/dist/src/formats/cys/exporter.js +215 -53
- package/dist/src/formats/cys/exporter.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts +2 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +119 -6
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/session.d.ts +2 -0
- package/dist/src/formats/cys/session.d.ts.map +1 -1
- package/dist/src/formats/cys/session.js +5 -0
- package/dist/src/formats/cys/session.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +38 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -0
- package/dist/src/formats/cys/styles.js +213 -0
- package/dist/src/formats/cys/styles.js.map +1 -0
- package/dist/src/formats/cys/tables.d.ts +8 -3
- package/dist/src/formats/cys/tables.d.ts.map +1 -1
- package/dist/src/formats/cys/tables.js +88 -34
- package/dist/src/formats/cys/tables.js.map +1 -1
- package/dist/src/formats/dot/exporter.d.ts +2 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +195 -81
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +100 -20
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +1 -0
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +1 -0
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/positions.d.ts +14 -0
- package/dist/src/formats/dot/positions.d.ts.map +1 -0
- package/dist/src/formats/dot/positions.js +70 -0
- package/dist/src/formats/dot/positions.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +82 -0
- package/dist/src/formats/dot/styles.d.ts.map +1 -0
- package/dist/src/formats/dot/styles.js +1484 -0
- package/dist/src/formats/dot/styles.js.map +1 -0
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
- package/dist/src/formats/gexf/exporter.js +23 -7
- package/dist/src/formats/gexf/exporter.js.map +1 -1
- package/dist/src/formats/gexf/importer.d.ts +8 -1
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +251 -131
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/index.d.ts +8 -0
- package/dist/src/formats/gexf/index.d.ts.map +1 -1
- package/dist/src/formats/gexf/index.js +10 -2
- package/dist/src/formats/gexf/index.js.map +1 -1
- package/dist/src/formats/gexf/schema.d.ts +5 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +5 -0
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +74 -0
- package/dist/src/formats/gexf/styles.d.ts.map +1 -0
- package/dist/src/formats/gexf/styles.js +604 -0
- package/dist/src/formats/gexf/styles.js.map +1 -0
- package/dist/src/formats/gml/exporter.d.ts +1 -5
- package/dist/src/formats/gml/exporter.d.ts.map +1 -1
- package/dist/src/formats/gml/exporter.js +19 -8
- package/dist/src/formats/gml/exporter.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +4 -0
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +2 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +2 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +14 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -0
- package/dist/src/formats/gml/positions.js +46 -0
- package/dist/src/formats/gml/positions.js.map +1 -0
- package/dist/src/formats/gml/styles.d.ts +59 -0
- package/dist/src/formats/gml/styles.d.ts.map +1 -0
- package/dist/src/formats/gml/styles.js +1056 -0
- package/dist/src/formats/gml/styles.js.map +1 -0
- package/dist/src/formats/gml/syntax.d.ts +11 -0
- package/dist/src/formats/gml/syntax.d.ts.map +1 -1
- package/dist/src/formats/gml/syntax.js +151 -62
- package/dist/src/formats/gml/syntax.js.map +1 -1
- package/dist/src/formats/graphml/constants.d.ts +4 -0
- package/dist/src/formats/graphml/constants.d.ts.map +1 -1
- package/dist/src/formats/graphml/constants.js +5 -1
- package/dist/src/formats/graphml/constants.js.map +1 -1
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
- package/dist/src/formats/graphml/exporter.js +133 -65
- package/dist/src/formats/graphml/exporter.js.map +1 -1
- package/dist/src/formats/graphml/importer.d.ts +4 -1
- package/dist/src/formats/graphml/importer.d.ts.map +1 -1
- package/dist/src/formats/graphml/importer.js +100 -44
- package/dist/src/formats/graphml/importer.js.map +1 -1
- package/dist/src/formats/graphml/index.d.ts +1 -0
- package/dist/src/formats/graphml/index.d.ts.map +1 -1
- package/dist/src/formats/graphml/index.js +1 -0
- package/dist/src/formats/graphml/index.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
- package/dist/src/formats/graphml/styles-plain.js +187 -0
- package/dist/src/formats/graphml/styles-plain.js.map +1 -0
- package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
- package/dist/src/formats/graphml/styles-yed.js +1086 -0
- package/dist/src/formats/graphml/styles-yed.js.map +1 -0
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
- package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
- package/dist/src/formats/graphml/tree.d.ts.map +1 -1
- package/dist/src/formats/graphml/tree.js +34 -19
- package/dist/src/formats/graphml/tree.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +16 -2
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +83 -12
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/exporter.d.ts +5 -0
- package/dist/src/formats/json/exporter.d.ts.map +1 -1
- package/dist/src/formats/json/exporter.js +68 -25
- package/dist/src/formats/json/exporter.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +22 -3
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +441 -265
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +16 -0
- package/dist/src/formats/json/positions.d.ts.map +1 -0
- package/dist/src/formats/json/positions.js +44 -0
- package/dist/src/formats/json/positions.js.map +1 -0
- package/dist/src/formats/json/styles.d.ts +102 -0
- package/dist/src/formats/json/styles.d.ts.map +1 -0
- package/dist/src/formats/json/styles.js +1753 -0
- package/dist/src/formats/json/styles.js.map +1 -0
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
- package/dist/src/formats/neo4j/exporter.js +2 -1
- package/dist/src/formats/neo4j/exporter.js.map +1 -1
- package/dist/src/formats/pajek/exporter.d.ts +2 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +142 -76
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +4 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +60 -6
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +2 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js +2 -0
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +50 -0
- package/dist/src/formats/pajek/styles.d.ts.map +1 -0
- package/dist/src/formats/pajek/styles.js +569 -0
- package/dist/src/formats/pajek/styles.js.map +1 -0
- package/dist/src/formats/pajek/syntax.d.ts +6 -0
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +6 -0
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
- package/dist/src/formats/xgmml/columns.js +34 -9
- package/dist/src/formats/xgmml/columns.js.map +1 -1
- package/dist/src/formats/xgmml/constants.d.ts +2 -0
- package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
- package/dist/src/formats/xgmml/constants.js +3 -1
- package/dist/src/formats/xgmml/constants.js.map +1 -1
- package/dist/src/formats/xgmml/document.d.ts +12 -8
- package/dist/src/formats/xgmml/document.d.ts.map +1 -1
- package/dist/src/formats/xgmml/document.js +56 -13
- package/dist/src/formats/xgmml/document.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +12 -6
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/exporter.d.ts +3 -1
- package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
- package/dist/src/formats/xgmml/exporter.js +22 -9
- package/dist/src/formats/xgmml/exporter.js.map +1 -1
- package/dist/src/formats/xgmml/importer.d.ts +2 -1
- package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
- package/dist/src/formats/xgmml/importer.js +31 -24
- package/dist/src/formats/xgmml/importer.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +104 -0
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
- package/dist/src/formats/xgmml/styles.js +310 -0
- package/dist/src/formats/xgmml/styles.js.map +1 -0
- package/dist/src/index.d.ts +9 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/codes.d.ts +31 -0
- package/dist/src/positions/codes.d.ts.map +1 -0
- package/dist/src/positions/codes.js +26 -0
- package/dist/src/positions/codes.js.map +1 -0
- package/dist/src/positions/convert.d.ts +58 -0
- package/dist/src/positions/convert.d.ts.map +1 -0
- package/dist/src/positions/convert.js +107 -0
- package/dist/src/positions/convert.js.map +1 -0
- package/dist/src/positions/extract.d.ts +27 -0
- package/dist/src/positions/extract.d.ts.map +1 -0
- package/dist/src/positions/extract.js +526 -0
- package/dist/src/positions/extract.js.map +1 -0
- package/dist/src/positions/index.d.ts +10 -0
- package/dist/src/positions/index.d.ts.map +1 -0
- package/dist/src/positions/index.js +9 -0
- package/dist/src/positions/index.js.map +1 -0
- package/dist/src/positions/types.d.ts +208 -0
- package/dist/src/positions/types.d.ts.map +1 -0
- package/dist/src/positions/types.js +10 -0
- package/dist/src/positions/types.js.map +1 -0
- package/dist/src/registry.d.ts +30 -0
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +130 -9
- package/dist/src/registry.js.map +1 -1
- package/dist/src/styles/annotations.d.ts +132 -0
- package/dist/src/styles/annotations.d.ts.map +1 -0
- package/dist/src/styles/annotations.js +320 -0
- package/dist/src/styles/annotations.js.map +1 -0
- package/dist/src/styles/budget.d.ts +45 -0
- package/dist/src/styles/budget.d.ts.map +1 -0
- package/dist/src/styles/budget.js +58 -0
- package/dist/src/styles/budget.js.map +1 -0
- package/dist/src/styles/canon/bends.d.ts +32 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -0
- package/dist/src/styles/canon/bends.js +74 -0
- package/dist/src/styles/canon/bends.js.map +1 -0
- package/dist/src/styles/canon/color-tables.d.ts +22 -0
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
- package/dist/src/styles/canon/color-tables.js +369 -0
- package/dist/src/styles/canon/color-tables.js.map +1 -0
- package/dist/src/styles/canon/color.d.ts +66 -0
- package/dist/src/styles/canon/color.d.ts.map +1 -0
- package/dist/src/styles/canon/color.js +548 -0
- package/dist/src/styles/canon/color.js.map +1 -0
- package/dist/src/styles/canon/enums.d.ts +25 -0
- package/dist/src/styles/canon/enums.d.ts.map +1 -0
- package/dist/src/styles/canon/enums.js +187 -0
- package/dist/src/styles/canon/enums.js.map +1 -0
- package/dist/src/styles/canon/graphviz.d.ts +48 -0
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
- package/dist/src/styles/canon/graphviz.js +160 -0
- package/dist/src/styles/canon/graphviz.js.map +1 -0
- package/dist/src/styles/canon/index.d.ts +13 -0
- package/dist/src/styles/canon/index.d.ts.map +1 -0
- package/dist/src/styles/canon/index.js +13 -0
- package/dist/src/styles/canon/index.js.map +1 -0
- package/dist/src/styles/canon/number.d.ts +59 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -0
- package/dist/src/styles/canon/number.js +142 -0
- package/dist/src/styles/canon/number.js.map +1 -0
- package/dist/src/styles/canon/site.d.ts +51 -0
- package/dist/src/styles/canon/site.d.ts.map +1 -0
- package/dist/src/styles/canon/site.js +63 -0
- package/dist/src/styles/canon/site.js.map +1 -0
- package/dist/src/styles/canon/text.d.ts +61 -0
- package/dist/src/styles/canon/text.d.ts.map +1 -0
- package/dist/src/styles/canon/text.js +199 -0
- package/dist/src/styles/canon/text.js.map +1 -0
- package/dist/src/styles/codes.d.ts +95 -0
- package/dist/src/styles/codes.d.ts.map +1 -0
- package/dist/src/styles/codes.js +97 -0
- package/dist/src/styles/codes.js.map +1 -0
- package/dist/src/styles/cyjs/cascade.d.ts +134 -0
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
- package/dist/src/styles/cyjs/cascade.js +2252 -0
- package/dist/src/styles/cyjs/cascade.js.map +1 -0
- package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
- package/dist/src/styles/cyjs/defaults-table.js +76 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
- package/dist/src/styles/cyjs/emit.d.ts +82 -0
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
- package/dist/src/styles/cyjs/emit.js +790 -0
- package/dist/src/styles/cyjs/emit.js.map +1 -0
- package/dist/src/styles/cyjs/index.d.ts +13 -0
- package/dist/src/styles/cyjs/index.d.ts.map +1 -0
- package/dist/src/styles/cyjs/index.js +13 -0
- package/dist/src/styles/cyjs/index.js.map +1 -0
- package/dist/src/styles/cyjs/live.d.ts +46 -0
- package/dist/src/styles/cyjs/live.d.ts.map +1 -0
- package/dist/src/styles/cyjs/live.js +108 -0
- package/dist/src/styles/cyjs/live.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +147 -0
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
- package/dist/src/styles/cyjs/mappers.js +744 -0
- package/dist/src/styles/cyjs/mappers.js.map +1 -0
- package/dist/src/styles/cyjs/selector.d.ts +113 -0
- package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
- package/dist/src/styles/cyjs/selector.js +611 -0
- package/dist/src/styles/cyjs/selector.js.map +1 -0
- package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
- package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
- package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
- package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts +125 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/emit.js +1025 -0
- package/dist/src/styles/cytoscape/emit.js.map +1 -0
- package/dist/src/styles/cytoscape/index.d.ts +10 -0
- package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/index.js +10 -0
- package/dist/src/styles/cytoscape/index.js.map +1 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/lexicon.js +603 -0
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
- package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/mappings.js +460 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -0
- package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/resolve.js +381 -0
- package/dist/src/styles/cytoscape/resolve.js.map +1 -0
- package/dist/src/styles/cytoscape/translate.d.ts +50 -0
- package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/translate.js +156 -0
- package/dist/src/styles/cytoscape/translate.js.map +1 -0
- package/dist/src/styles/defaults.d.ts +90 -0
- package/dist/src/styles/defaults.d.ts.map +1 -0
- package/dist/src/styles/defaults.js +414 -0
- package/dist/src/styles/defaults.js.map +1 -0
- package/dist/src/styles/index.d.ts +15 -0
- package/dist/src/styles/index.d.ts.map +1 -0
- package/dist/src/styles/index.js +14 -0
- package/dist/src/styles/index.js.map +1 -0
- package/dist/src/styles/internal.d.ts +17 -0
- package/dist/src/styles/internal.d.ts.map +1 -0
- package/dist/src/styles/internal.js +16 -0
- package/dist/src/styles/internal.js.map +1 -0
- package/dist/src/styles/io/approximations.d.ts +24 -0
- package/dist/src/styles/io/approximations.d.ts.map +1 -0
- package/dist/src/styles/io/approximations.js +51 -0
- package/dist/src/styles/io/approximations.js.map +1 -0
- package/dist/src/styles/io/block.d.ts +166 -0
- package/dist/src/styles/io/block.d.ts.map +1 -0
- package/dist/src/styles/io/block.js +930 -0
- package/dist/src/styles/io/block.js.map +1 -0
- package/dist/src/styles/io/generic.d.ts +88 -0
- package/dist/src/styles/io/generic.d.ts.map +1 -0
- package/dist/src/styles/io/generic.js +516 -0
- package/dist/src/styles/io/generic.js.map +1 -0
- package/dist/src/styles/io/index.d.ts +8 -0
- package/dist/src/styles/io/index.d.ts.map +1 -0
- package/dist/src/styles/io/index.js +7 -0
- package/dist/src/styles/io/index.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts +80 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -0
- package/dist/src/styles/io/writer.js +596 -0
- package/dist/src/styles/io/writer.js.map +1 -0
- package/dist/src/styles/notes.d.ts +47 -0
- package/dist/src/styles/notes.d.ts.map +1 -0
- package/dist/src/styles/notes.js +140 -0
- package/dist/src/styles/notes.js.map +1 -0
- package/dist/src/styles/plan/classes.d.ts +31 -0
- package/dist/src/styles/plan/classes.d.ts.map +1 -0
- package/dist/src/styles/plan/classes.js +139 -0
- package/dist/src/styles/plan/classes.js.map +1 -0
- package/dist/src/styles/plan/continuous.d.ts +32 -0
- package/dist/src/styles/plan/continuous.d.ts.map +1 -0
- package/dist/src/styles/plan/continuous.js +165 -0
- package/dist/src/styles/plan/continuous.js.map +1 -0
- package/dist/src/styles/plan/discrete.d.ts +39 -0
- package/dist/src/styles/plan/discrete.d.ts.map +1 -0
- package/dist/src/styles/plan/discrete.js +127 -0
- package/dist/src/styles/plan/discrete.js.map +1 -0
- package/dist/src/styles/plan/families.d.ts +31 -0
- package/dist/src/styles/plan/families.d.ts.map +1 -0
- package/dist/src/styles/plan/families.js +95 -0
- package/dist/src/styles/plan/families.js.map +1 -0
- package/dist/src/styles/plan/features.d.ts +58 -0
- package/dist/src/styles/plan/features.d.ts.map +1 -0
- package/dist/src/styles/plan/features.js +185 -0
- package/dist/src/styles/plan/features.js.map +1 -0
- package/dist/src/styles/plan/index.d.ts +7 -0
- package/dist/src/styles/plan/index.d.ts.map +1 -0
- package/dist/src/styles/plan/index.js +7 -0
- package/dist/src/styles/plan/index.js.map +1 -0
- package/dist/src/styles/plan/plan.d.ts +71 -0
- package/dist/src/styles/plan/plan.d.ts.map +1 -0
- package/dist/src/styles/plan/plan.js +893 -0
- package/dist/src/styles/plan/plan.js.map +1 -0
- package/dist/src/styles/plan/resolve.d.ts +137 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -0
- package/dist/src/styles/plan/resolve.js +587 -0
- package/dist/src/styles/plan/resolve.js.map +1 -0
- package/dist/src/styles/types.d.ts +702 -0
- package/dist/src/styles/types.d.ts.map +1 -0
- package/dist/src/styles/types.js +10 -0
- package/dist/src/styles/types.js.map +1 -0
- package/dist/src/styles/vocabulary.d.ts +41 -0
- package/dist/src/styles/vocabulary.d.ts.map +1 -0
- package/dist/src/styles/vocabulary.js +140 -0
- package/dist/src/styles/vocabulary.js.map +1 -0
- package/dist/src/types.d.ts +64 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/styles.d.ts +1 -0
- package/dist/styles.js +322 -0
- package/dist/styles.js.map +1 -0
- package/dist/xgmml.js +5 -4
- package/dist/xgmml.js.map +1 -1
- package/package.json +13 -2
- package/src/common/codes.ts +7 -0
- package/src/common/escape.ts +5 -2
- package/src/common/export.ts +179 -140
- package/src/common/input.ts +8 -4
- package/src/common/json-elements.ts +169 -38
- package/src/common/notes.ts +94 -0
- package/src/common/report.ts +41 -1
- package/src/common/units.ts +42 -0
- package/src/common/xml.ts +45 -5
- package/src/formats/cx/exporter.ts +95 -11
- package/src/formats/cx/importer.ts +126 -90
- package/src/formats/cx/styles.ts +304 -0
- package/src/formats/cx2/exporter.ts +234 -77
- package/src/formats/cx2/importer.ts +19 -1
- package/src/formats/cx2/styles.ts +29 -0
- package/src/formats/cys/constants.ts +3 -0
- package/src/formats/cys/exporter.ts +246 -60
- package/src/formats/cys/importer.ts +125 -9
- package/src/formats/cys/session.ts +6 -0
- package/src/formats/cys/styles.ts +254 -0
- package/src/formats/cys/tables.ts +117 -48
- package/src/formats/dot/exporter.ts +262 -126
- package/src/formats/dot/importer.ts +111 -20
- package/src/formats/dot/index.ts +1 -0
- package/src/formats/dot/positions.ts +77 -0
- package/src/formats/dot/styles.ts +1741 -0
- package/src/formats/gexf/exporter.ts +30 -13
- package/src/formats/gexf/importer.ts +308 -158
- package/src/formats/gexf/index.ts +10 -0
- package/src/formats/gexf/schema.ts +5 -0
- package/src/formats/gexf/styles.ts +719 -0
- package/src/formats/gml/exporter.ts +33 -14
- package/src/formats/gml/importer.ts +4 -0
- package/src/formats/gml/index.ts +2 -1
- package/src/formats/gml/positions.ts +52 -0
- package/src/formats/gml/styles.ts +1248 -0
- package/src/formats/gml/syntax.ts +173 -62
- package/src/formats/graphml/constants.ts +5 -0
- package/src/formats/graphml/exporter.ts +163 -71
- package/src/formats/graphml/importer.ts +119 -45
- package/src/formats/graphml/index.ts +1 -0
- package/src/formats/graphml/styles-plain.ts +236 -0
- package/src/formats/graphml/styles-yed.ts +1221 -0
- package/src/formats/graphml/styles-yfiles3.ts +573 -0
- package/src/formats/graphml/tree.ts +36 -20
- package/src/formats/graphml/yfiles.ts +89 -13
- package/src/formats/json/exporter.ts +76 -26
- package/src/formats/json/importer.ts +543 -323
- package/src/formats/json/positions.ts +50 -0
- package/src/formats/json/styles.ts +2082 -0
- package/src/formats/neo4j/exporter.ts +2 -1
- package/src/formats/pajek/exporter.ts +195 -106
- package/src/formats/pajek/importer.ts +78 -9
- package/src/formats/pajek/index.ts +2 -0
- package/src/formats/pajek/styles.ts +685 -0
- package/src/formats/pajek/syntax.ts +7 -0
- package/src/formats/xgmml/columns.ts +39 -9
- package/src/formats/xgmml/constants.ts +3 -0
- package/src/formats/xgmml/document.ts +54 -12
- package/src/formats/xgmml/emit.ts +11 -6
- package/src/formats/xgmml/exporter.ts +32 -13
- package/src/formats/xgmml/importer.ts +43 -29
- package/src/formats/xgmml/styles.ts +400 -0
- package/src/index.ts +16 -0
- package/src/positions/codes.ts +32 -0
- package/src/positions/convert.ts +123 -0
- package/src/positions/extract.ts +619 -0
- package/src/positions/index.ts +23 -0
- package/src/positions/types.ts +221 -0
- package/src/registry.ts +179 -8
- package/src/styles/annotations.ts +478 -0
- package/src/styles/budget.ts +60 -0
- package/src/styles/canon/bends.ts +84 -0
- package/src/styles/canon/color-tables.ts +386 -0
- package/src/styles/canon/color.ts +624 -0
- package/src/styles/canon/enums.ts +211 -0
- package/src/styles/canon/graphviz.ts +189 -0
- package/src/styles/canon/index.ts +13 -0
- package/src/styles/canon/number.ts +152 -0
- package/src/styles/canon/site.ts +87 -0
- package/src/styles/canon/text.ts +221 -0
- package/src/styles/codes.ts +104 -0
- package/src/styles/cyjs/cascade.ts +2670 -0
- package/src/styles/cyjs/defaults-table.ts +82 -0
- package/src/styles/cyjs/emit.ts +951 -0
- package/src/styles/cyjs/index.ts +37 -0
- package/src/styles/cyjs/live.ts +147 -0
- package/src/styles/cyjs/mappers.ts +879 -0
- package/src/styles/cyjs/selector.ts +778 -0
- package/src/styles/cyjs/stylesheet-text.ts +214 -0
- package/src/styles/cytoscape/emit.ts +1264 -0
- package/src/styles/cytoscape/index.ts +40 -0
- package/src/styles/cytoscape/lexicon.ts +656 -0
- package/src/styles/cytoscape/mappings.ts +603 -0
- package/src/styles/cytoscape/resolve.ts +521 -0
- package/src/styles/cytoscape/translate.ts +237 -0
- package/src/styles/defaults.ts +504 -0
- package/src/styles/index.ts +57 -0
- package/src/styles/internal.ts +17 -0
- package/src/styles/io/approximations.ts +47 -0
- package/src/styles/io/block.ts +1138 -0
- package/src/styles/io/generic.ts +687 -0
- package/src/styles/io/index.ts +18 -0
- package/src/styles/io/writer.ts +745 -0
- package/src/styles/notes.ts +165 -0
- package/src/styles/plan/classes.ts +166 -0
- package/src/styles/plan/continuous.ts +218 -0
- package/src/styles/plan/discrete.ts +165 -0
- package/src/styles/plan/families.ts +115 -0
- package/src/styles/plan/features.ts +234 -0
- package/src/styles/plan/index.ts +7 -0
- package/src/styles/plan/plan.ts +1129 -0
- package/src/styles/plan/resolve.ts +685 -0
- package/src/styles/types.ts +814 -0
- package/src/styles/vocabulary.ts +172 -0
- package/src/types.ts +76 -1
- package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
- package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
- package/dist/chunks/export-rKLeGQMo.js.map +0 -1
- package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
- package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
- package/dist/chunks/exporter-CpRyHZ3H.js.map +0 -1
- package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
- package/dist/chunks/importer-C98dpSH4.js.map +0 -1
- package/dist/chunks/importer-D794XUTe.js.map +0 -1
- package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
- package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
- package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
- package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
- package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Style notes are aggregated, never one per element: one note per (code, target, property), with up to 8 distinct
|
|
3
|
+
* samples, a total count and the element indexes the note covers.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { StyleNote, StyleNoteCode, StyleTarget } from "./types.js";
|
|
7
|
+
|
|
8
|
+
/** At most this many samples per note. */
|
|
9
|
+
const MAX_SAMPLES = 8;
|
|
10
|
+
/** A sample is cut to this many characters. */
|
|
11
|
+
const MAX_SAMPLE_LENGTH = 80;
|
|
12
|
+
|
|
13
|
+
/** graph-io's English for each note, used only in its own report. */
|
|
14
|
+
const PHRASES: ReadonlyMap<StyleNoteCode, string> = new Map<StyleNoteCode, string>([
|
|
15
|
+
["W_STYLE_VALUE_TOO_LONG", "values longer than 256 characters were not parsed"],
|
|
16
|
+
["W_STYLE_BAD_VALUE", "values do not parse"],
|
|
17
|
+
["W_STYLE_UNKNOWN_VALUE", "values have no name in the vocabulary and are kept as other:<value>"],
|
|
18
|
+
["W_STYLE_ALPHA_DROPPED", "color alpha was dropped"],
|
|
19
|
+
["W_STYLE_COLOR_LIST", "color lists are not read as one color"],
|
|
20
|
+
["W_STYLE_GRADIENT", "gradients are read as their first color"],
|
|
21
|
+
["W_STYLE_UNFILLED", "nodes with a fill color are drawn unfilled"],
|
|
22
|
+
["W_STYLE_NO_FILL", "fills are marked transparent"],
|
|
23
|
+
["W_STYLE_NO_STROKE", "strokes are marked absent"],
|
|
24
|
+
["W_STYLE_SIZE_MINIMUM", "node sizes are minimums: the node grows to fit its label"],
|
|
25
|
+
["W_STYLE_HTML_LABEL", "HTML-like labels keep their text; markup was dropped"],
|
|
26
|
+
["W_STYLE_RECORD_LABEL", "record label fields were joined"],
|
|
27
|
+
["W_STYLE_EXTRA_LABELS", "elements have more than one label; the first was kept"],
|
|
28
|
+
["W_STYLE_INHERIT_COLOR", "inherited colors cannot be expressed"],
|
|
29
|
+
["W_STYLE_NOT_CARRIED", "style properties have no counterpart and were not carried"],
|
|
30
|
+
["W_STYLE_BAD_MAPPING", "mappings cannot be read"],
|
|
31
|
+
["W_STYLE_MAPPING_COLUMN_MISSING", "mappings read a column the file does not have"],
|
|
32
|
+
["W_STYLE_REFERENCE_CYCLE", "style references are circular or too deep"],
|
|
33
|
+
["W_STYLE_UNRESOLVED", "style references name nothing"],
|
|
34
|
+
["W_STYLE_NESTING", "style structures are nested too deep"],
|
|
35
|
+
["W_STYLE_UNREADABLE", "a style section cannot be read"],
|
|
36
|
+
["W_STYLE_NO_VIZMAP", "the session holds no visual styles"],
|
|
37
|
+
["W_STYLE_VIEW_STYLE_MISSING", "the view names a style the file does not hold"],
|
|
38
|
+
["W_STYLE_OTHER_STYLES", "other visual styles were not read"],
|
|
39
|
+
["W_STYLE_OTHER_VIEWS", "other views were not read"],
|
|
40
|
+
["W_STYLE_SELECTOR", "invalid selectors match every element"],
|
|
41
|
+
["W_STYLE_SELECTOR_AS_COLUMN", "selectors were evaluated into per-element values"],
|
|
42
|
+
["W_STYLE_STATE_ASSUMED", "selector states were evaluated as at load"],
|
|
43
|
+
["W_STYLE_RAMP_ROUNDED", "continuous mappings match within the tool's rounding"],
|
|
44
|
+
["W_STYLE_LAYER_CAP", "rules were folded into per-element copies"],
|
|
45
|
+
["W_STYLE_BUDGET", "the work budget ran out; values were copied per element"],
|
|
46
|
+
["W_STYLE_BLOCK_IGNORED", "the graphty.styles block was ignored"],
|
|
47
|
+
["W_STYLE_NOT_WRITTEN", "the format cannot hold this style"],
|
|
48
|
+
["W_STYLE_APPROXIMATED", "written as the nearest value the format allows"],
|
|
49
|
+
["W_STYLE_RULES_NOT_KEPT", "per-element values were written but not the rules"],
|
|
50
|
+
["W_STYLE_LAYER_FLATTENED", "a style was written as per-element values"],
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
/** One note being collected. */
|
|
54
|
+
interface Collecting {
|
|
55
|
+
readonly code: StyleNoteCode;
|
|
56
|
+
readonly target: StyleTarget | "graph" | null;
|
|
57
|
+
readonly property: string | null;
|
|
58
|
+
count: number;
|
|
59
|
+
readonly samples: string[];
|
|
60
|
+
readonly elements: Set<number>;
|
|
61
|
+
unindexed: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Options of one report to `StyleNotes.add()`.
|
|
66
|
+
* @category Styles
|
|
67
|
+
*/
|
|
68
|
+
export interface StyleNoteReport {
|
|
69
|
+
/** An example of the offending value; kept while the note has fewer than 8 distinct samples. */
|
|
70
|
+
readonly sample?: unknown;
|
|
71
|
+
/** The element the report is about, by index. */
|
|
72
|
+
readonly element?: number;
|
|
73
|
+
/** How many occurrences the report stands for; defaults to 1. */
|
|
74
|
+
readonly count?: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Collects style notes, aggregated per (code, target, property).
|
|
79
|
+
* @category Styles
|
|
80
|
+
*/
|
|
81
|
+
export class StyleNotes {
|
|
82
|
+
readonly #notes = new Map<string, Collecting>();
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Records one occurrence (or `count` occurrences) of a condition.
|
|
86
|
+
* @param code - the condition
|
|
87
|
+
* @param target - nodes, edges, the graph, or null for the file as a whole
|
|
88
|
+
* @param property - the property or the file's name for the construct, or null
|
|
89
|
+
* @param report - a sample, the element index and a count
|
|
90
|
+
*/
|
|
91
|
+
add(
|
|
92
|
+
code: StyleNoteCode,
|
|
93
|
+
target: StyleTarget | "graph" | null,
|
|
94
|
+
property: string | null,
|
|
95
|
+
report: StyleNoteReport = {},
|
|
96
|
+
): void {
|
|
97
|
+
const key = `${code}\u0000${target ?? ""}\u0000${property ?? ""}`;
|
|
98
|
+
let note = this.#notes.get(key);
|
|
99
|
+
if (note === undefined) {
|
|
100
|
+
note = { code, target, property, count: 0, samples: [], elements: new Set(), unindexed: false };
|
|
101
|
+
this.#notes.set(key, note);
|
|
102
|
+
}
|
|
103
|
+
note.count += report.count ?? 1;
|
|
104
|
+
if (report.element === undefined) {
|
|
105
|
+
note.unindexed = true;
|
|
106
|
+
} else {
|
|
107
|
+
note.elements.add(report.element);
|
|
108
|
+
}
|
|
109
|
+
if (report.sample !== undefined && note.samples.length < MAX_SAMPLES) {
|
|
110
|
+
const sample = sampleText(report.sample);
|
|
111
|
+
if (!note.samples.includes(sample)) {
|
|
112
|
+
note.samples.push(sample);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Whether a note with this code, target and property covers an element.
|
|
119
|
+
* @param code - the condition
|
|
120
|
+
* @param target - nodes or edges
|
|
121
|
+
* @param property - the property
|
|
122
|
+
* @param element - the element index
|
|
123
|
+
* @returns true when such a note named the element
|
|
124
|
+
*/
|
|
125
|
+
covers(code: StyleNoteCode, target: StyleTarget, property: string | null, element: number): boolean {
|
|
126
|
+
return this.#notes.get(`${code}\u0000${target}\u0000${property ?? ""}`)?.elements.has(element) === true;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The collected notes, in the order their conditions first occurred.
|
|
131
|
+
* @returns one note per (code, target, property)
|
|
132
|
+
*/
|
|
133
|
+
list(): StyleNote[] {
|
|
134
|
+
const out: StyleNote[] = [];
|
|
135
|
+
for (const n of this.#notes.values()) {
|
|
136
|
+
const where = n.property === null ? (n.target ?? "file") : `${n.target ?? "file"} ${n.property}`;
|
|
137
|
+
out.push({
|
|
138
|
+
code: n.code,
|
|
139
|
+
params: { property: n.property, target: n.target, count: n.count, samples: [...n.samples] },
|
|
140
|
+
elements: n.unindexed ? { count: n.count } : Array.from(n.elements).sort((a, b) => a - b),
|
|
141
|
+
message: `${where}: ${PHRASES.get(n.code) ?? n.code} (${n.count})`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* A sample as at most 80 characters of text.
|
|
150
|
+
* @param value - the sample
|
|
151
|
+
* @returns its text
|
|
152
|
+
*/
|
|
153
|
+
function sampleText(value: unknown): string {
|
|
154
|
+
let text: string;
|
|
155
|
+
if (typeof value === "string") {
|
|
156
|
+
text = value;
|
|
157
|
+
} else {
|
|
158
|
+
try {
|
|
159
|
+
text = JSON.stringify(value) ?? typeof value;
|
|
160
|
+
} catch {
|
|
161
|
+
text = typeof value;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return text.slice(0, MAX_SAMPLE_LENGTH);
|
|
165
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The opaque pool: the families nothing explains. Over their non-text, non-size properties each distinct joint tuple
|
|
3
|
+
* of values is a style class, numbered 1..k by frequency in the style column `class`; a few classes become one group
|
|
4
|
+
* rule each, more become one table keyed by the class. What is left is copied per element.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { StyleRule, StyleTarget, StyleValue } from "../types.js";
|
|
8
|
+
import { STYLE_PROPERTIES } from "../vocabulary.js";
|
|
9
|
+
import { MIN_MAPPED } from "./discrete.js";
|
|
10
|
+
import { valueKey } from "./families.js";
|
|
11
|
+
|
|
12
|
+
/** The most style classes; more distinct tuples are copied per element. */
|
|
13
|
+
const MAX_CLASSES = 64;
|
|
14
|
+
/** At most this many classes become one group rule each. */
|
|
15
|
+
const MAX_CLASS_RULES = 4;
|
|
16
|
+
/** Sizes vary per element by nature and are never joined into a class. */
|
|
17
|
+
const SIZES: ReadonlySet<string> = new Set(["width", "height"]);
|
|
18
|
+
/** The style column holding each element's class. */
|
|
19
|
+
export const CLASS_COLUMN = "class";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The style classes of an opaque pool.
|
|
23
|
+
*/
|
|
24
|
+
interface StyleClasses {
|
|
25
|
+
/** The properties the classes explain. */
|
|
26
|
+
readonly classed: readonly string[];
|
|
27
|
+
/** The class of each element, 1..k, or null. */
|
|
28
|
+
readonly column: (number | null)[];
|
|
29
|
+
/** One group rule per class, or one mapping rule keyed by the class. */
|
|
30
|
+
readonly rules: StyleRule[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Whether a property's values have few enough distinct values to be part of a class.
|
|
35
|
+
* @param values - the values
|
|
36
|
+
* @returns true when they do
|
|
37
|
+
*/
|
|
38
|
+
function fewValues(values: readonly (StyleValue | null)[]): boolean {
|
|
39
|
+
const seen = new Set<string>();
|
|
40
|
+
for (const v of values) {
|
|
41
|
+
seen.add(valueKey(v));
|
|
42
|
+
if (seen.size > MAX_CLASSES + 1) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* One element's combination of values of the classable properties, as a key; null when it has none.
|
|
51
|
+
* @param classable - the properties
|
|
52
|
+
* @param truth - the values per property
|
|
53
|
+
* @param i - the element
|
|
54
|
+
* @returns the key
|
|
55
|
+
*/
|
|
56
|
+
function tupleKey(
|
|
57
|
+
classable: readonly string[],
|
|
58
|
+
truth: ReadonlyMap<string, readonly (StyleValue | null)[]>,
|
|
59
|
+
i: number,
|
|
60
|
+
): string | null {
|
|
61
|
+
let key = "";
|
|
62
|
+
let any = false;
|
|
63
|
+
for (const p of classable) {
|
|
64
|
+
const v = (truth.get(p) ?? [])[i] ?? null;
|
|
65
|
+
any ||= v !== null;
|
|
66
|
+
key += `${valueKey(v)}\u0001`;
|
|
67
|
+
}
|
|
68
|
+
return any ? key : null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Finds the style classes of the opaque properties.
|
|
73
|
+
* @param target - nodes or edges
|
|
74
|
+
* @param props - the opaque properties
|
|
75
|
+
* @param truth - the values per property
|
|
76
|
+
* @param n - the element count
|
|
77
|
+
* @param spend - spends work from the budget
|
|
78
|
+
* @returns the classes, or null when the values have too many combinations
|
|
79
|
+
*/
|
|
80
|
+
export function styleClasses(
|
|
81
|
+
target: StyleTarget,
|
|
82
|
+
props: readonly string[],
|
|
83
|
+
truth: ReadonlyMap<string, readonly (StyleValue | null)[]>,
|
|
84
|
+
n: number,
|
|
85
|
+
spend: (ops: number) => void,
|
|
86
|
+
): StyleClasses | null {
|
|
87
|
+
const classable = props.filter(
|
|
88
|
+
(p) => STYLE_PROPERTIES[target].get(p) !== "text" && !SIZES.has(p) && fewValues(truth.get(p) ?? []),
|
|
89
|
+
);
|
|
90
|
+
if (classable.length === 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
spend(n * (classable.length + 1));
|
|
94
|
+
const counts = new Map<string, { count: number; rep: number }>();
|
|
95
|
+
const tupleOf = new Array<string | null>(n).fill(null);
|
|
96
|
+
let withTuple = 0;
|
|
97
|
+
for (let i = 0; i < n; i++) {
|
|
98
|
+
const key = tupleKey(classable, truth, i);
|
|
99
|
+
if (key === null) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
withTuple++;
|
|
103
|
+
tupleOf[i] = key;
|
|
104
|
+
const c = counts.get(key);
|
|
105
|
+
if (c === undefined) {
|
|
106
|
+
counts.set(key, { count: 1, rep: i });
|
|
107
|
+
if (counts.size > MAX_CLASSES) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
c.count++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (counts.size === 0 || withTuple < MIN_MAPPED || counts.size * 2 > withTuple) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
// classes by frequency, ties by first appearance (a stable sort)
|
|
118
|
+
const order = Array.from(counts.entries()).sort((a, b) => b[1].count - a[1].count);
|
|
119
|
+
const rank = new Map(order.map(([key], j) => [key, j + 1]));
|
|
120
|
+
const column = tupleOf.map((t) => (t === null ? null : (rank.get(t) ?? null)));
|
|
121
|
+
const ref = { style: CLASS_COLUMN };
|
|
122
|
+
const valueOf = (p: string, rep: number): StyleValue | null => (truth.get(p) ?? [])[rep] ?? null;
|
|
123
|
+
const rules: StyleRule[] = [];
|
|
124
|
+
if (order.length <= Math.min(MAX_CLASS_RULES, Math.floor(withTuple / 4))) {
|
|
125
|
+
order.forEach(([, { count, rep }], j) => {
|
|
126
|
+
const set: Record<string, StyleValue> = {};
|
|
127
|
+
for (const p of classable) {
|
|
128
|
+
const v = valueOf(p, rep);
|
|
129
|
+
if (v !== null) {
|
|
130
|
+
set[p] = v;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
rules.push({
|
|
134
|
+
id: `${target}.class.${String(j + 1)}`,
|
|
135
|
+
target,
|
|
136
|
+
role: "group",
|
|
137
|
+
origin: "inferred",
|
|
138
|
+
where: { eq: [ref, j + 1] },
|
|
139
|
+
set,
|
|
140
|
+
facts: { elements: count, reason: "STYLE_CLASS" },
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
} else {
|
|
144
|
+
const map: Record<string, { kind: "discrete"; by: { style: string }; table: [number, StyleValue][] }> = {};
|
|
145
|
+
for (const p of classable) {
|
|
146
|
+
const table: [number, StyleValue][] = [];
|
|
147
|
+
order.forEach(([, { rep }], j) => {
|
|
148
|
+
const v = valueOf(p, rep);
|
|
149
|
+
if (v !== null) {
|
|
150
|
+
table.push([j + 1, v]);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
map[p] = { kind: "discrete", by: ref, table };
|
|
154
|
+
}
|
|
155
|
+
rules.push({
|
|
156
|
+
id: `${target}.classes`,
|
|
157
|
+
target,
|
|
158
|
+
role: "mapping",
|
|
159
|
+
origin: "inferred",
|
|
160
|
+
where: { all: true },
|
|
161
|
+
map,
|
|
162
|
+
facts: { classes: order.length, elements: withTuple, reason: "STYLE_CLASS" },
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return { classed: classable, column, rules };
|
|
166
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A continuous mapping on one numeric feature: the fewest linear pieces (at most 8, each explaining at least 3
|
|
3
|
+
* distinct inputs), exact first, else within the rounding the writing tool did per element.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ContinuousPoint, StyleValue } from "../types.js";
|
|
7
|
+
import { MIN_MAPPED } from "./discrete.js";
|
|
8
|
+
import type { Family } from "./families.js";
|
|
9
|
+
import type { FeatureInfo } from "./features.js";
|
|
10
|
+
import { interpolate, within } from "./resolve.js";
|
|
11
|
+
|
|
12
|
+
/** The most linear pieces a ramp may have. */
|
|
13
|
+
const MAX_PIECES = 8;
|
|
14
|
+
/** The most distinct inputs a ramp is fitted over. */
|
|
15
|
+
const MAX_DISTINCT_X = 4096;
|
|
16
|
+
const HEX6 = /^#[0-9a-f]{6}$/;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A continuous mapping that explains a family.
|
|
20
|
+
*/
|
|
21
|
+
export interface ContinuousCandidate {
|
|
22
|
+
/** The kind of candidate. */
|
|
23
|
+
readonly type: "continuous";
|
|
24
|
+
/** The feature the ramp reads. */
|
|
25
|
+
readonly info: FeatureInfo;
|
|
26
|
+
/** The points per property. */
|
|
27
|
+
readonly points: ReadonlyMap<string, ContinuousPoint[]>;
|
|
28
|
+
/** Whether the ramp matches only within the tool's rounding. */
|
|
29
|
+
readonly tolerant: boolean;
|
|
30
|
+
/** The description cost. */
|
|
31
|
+
readonly cost: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Whether a value can be interpolated: a number or a canonical color.
|
|
36
|
+
* @param v - the value
|
|
37
|
+
* @returns true when it can
|
|
38
|
+
*/
|
|
39
|
+
function interpolable(v: StyleValue | null): v is number | string {
|
|
40
|
+
return typeof v === "number" || (typeof v === "string" && HEX6.test(v));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The fewest linear pieces over sorted distinct points, or null when more than `MAX_PIECES` are needed.
|
|
45
|
+
* @param xs - the inputs, ascending
|
|
46
|
+
* @param ys - the outputs
|
|
47
|
+
* @param tolerant - whether a piece may miss a point by the tool's rounding
|
|
48
|
+
* @param spend - spends work from the budget
|
|
49
|
+
* @returns each piece's first and last point index, or null
|
|
50
|
+
*/
|
|
51
|
+
function fitPieces(
|
|
52
|
+
xs: readonly number[],
|
|
53
|
+
ys: readonly StyleValue[],
|
|
54
|
+
tolerant: boolean,
|
|
55
|
+
spend: (ops: number) => void,
|
|
56
|
+
): [number, number][] | null {
|
|
57
|
+
const pieces: [number, number][] = [];
|
|
58
|
+
let a = 0;
|
|
59
|
+
while (a < xs.length) {
|
|
60
|
+
let b = a;
|
|
61
|
+
// extend while the line from a to b + 1 reproduces every point between
|
|
62
|
+
while (b + 1 < xs.length) {
|
|
63
|
+
const ok = lineFits(xs, ys, a, b + 1, tolerant);
|
|
64
|
+
spend(b + 1 - a);
|
|
65
|
+
if (!ok) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
b++;
|
|
69
|
+
}
|
|
70
|
+
pieces.push([a, b]);
|
|
71
|
+
if (pieces.length > MAX_PIECES) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
a = b + 1;
|
|
75
|
+
}
|
|
76
|
+
return pieces;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Whether the line from point a to point c reproduces every point between.
|
|
81
|
+
* @param xs - the inputs, ascending
|
|
82
|
+
* @param ys - the outputs
|
|
83
|
+
* @param a - the first point
|
|
84
|
+
* @param c - the last point
|
|
85
|
+
* @param tolerant - whether the line may miss a point by the tool's rounding
|
|
86
|
+
* @returns true when it does
|
|
87
|
+
*/
|
|
88
|
+
function lineFits(xs: readonly number[], ys: readonly StyleValue[], a: number, c: number, tolerant: boolean): boolean {
|
|
89
|
+
for (let j = a + 1; j < c; j++) {
|
|
90
|
+
const v = interpolate(ys[a], ys[c], (xs[j] - xs[a]) / (xs[c] - xs[a]));
|
|
91
|
+
if (tolerant ? !within(v, ys[j]) : v !== ys[j]) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The points of a fitted ramp.
|
|
100
|
+
* @param xs - the inputs
|
|
101
|
+
* @param ys - the outputs
|
|
102
|
+
* @param pieces - the pieces
|
|
103
|
+
* @returns the points, ascending
|
|
104
|
+
*/
|
|
105
|
+
function piecesToPoints(
|
|
106
|
+
xs: readonly number[],
|
|
107
|
+
ys: readonly StyleValue[],
|
|
108
|
+
pieces: [number, number][],
|
|
109
|
+
): ContinuousPoint[] {
|
|
110
|
+
const out: ContinuousPoint[] = [];
|
|
111
|
+
for (const [a, b] of pieces) {
|
|
112
|
+
out.push({ at: xs[a], below: ys[a], value: ys[a], above: ys[a] });
|
|
113
|
+
if (b !== a) {
|
|
114
|
+
out.push({ at: xs[b], below: ys[b], value: ys[b], above: ys[b] });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Tests a continuous mapping on one feature.
|
|
122
|
+
* @param fam - the family
|
|
123
|
+
* @param info - the feature
|
|
124
|
+
* @param truth - the values per property
|
|
125
|
+
* @param spend - spends work from the budget
|
|
126
|
+
* @returns the candidate, or null when the feature does not explain the family
|
|
127
|
+
*/
|
|
128
|
+
export function continuousCandidate(
|
|
129
|
+
fam: Family,
|
|
130
|
+
info: FeatureInfo,
|
|
131
|
+
truth: ReadonlyMap<string, readonly (StyleValue | null)[]>,
|
|
132
|
+
spend: (ops: number) => void,
|
|
133
|
+
): ContinuousCandidate | null {
|
|
134
|
+
if (!info.numeric || info.raw || fam.styled.length < MIN_MAPPED) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
const { values } = info.feature;
|
|
138
|
+
spend(values.length);
|
|
139
|
+
// the feature must be a number exactly where the family has a value
|
|
140
|
+
if (values.some((v, i) => (fam.blocks[i] === 0) === (typeof v === "number"))) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
for (const tolerant of [false, true]) {
|
|
144
|
+
const points = rampsOf(fam, values, truth, tolerant, spend);
|
|
145
|
+
if (points !== null) {
|
|
146
|
+
const entries = Array.from(points.values()).reduce((sum, pts) => sum + pts.length, 0);
|
|
147
|
+
return { type: "continuous", info, points, tolerant, cost: 50 + entries + (tolerant ? 10 : 0) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* The ramp of every property of the family over the feature, or null when one has none.
|
|
155
|
+
* @param fam - the family
|
|
156
|
+
* @param values - the feature's values
|
|
157
|
+
* @param truth - the values per property
|
|
158
|
+
* @param tolerant - whether a ramp may miss a value by the tool's rounding
|
|
159
|
+
* @param spend - spends work from the budget
|
|
160
|
+
* @returns the points per property, or null
|
|
161
|
+
*/
|
|
162
|
+
function rampsOf(
|
|
163
|
+
fam: Family,
|
|
164
|
+
values: readonly unknown[],
|
|
165
|
+
truth: ReadonlyMap<string, readonly (StyleValue | null)[]>,
|
|
166
|
+
tolerant: boolean,
|
|
167
|
+
spend: (ops: number) => void,
|
|
168
|
+
): Map<string, ContinuousPoint[]> | null {
|
|
169
|
+
const points = new Map<string, ContinuousPoint[]>();
|
|
170
|
+
for (const p of fam.props) {
|
|
171
|
+
const pts = rampOf(fam, values, truth.get(p) ?? [], tolerant, spend);
|
|
172
|
+
if (pts === null) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
points.set(p, pts);
|
|
176
|
+
}
|
|
177
|
+
return points;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* The ramp of one property over the feature, or null when none explains it.
|
|
182
|
+
* @param fam - the family
|
|
183
|
+
* @param values - the feature's values
|
|
184
|
+
* @param ys0 - the property's values
|
|
185
|
+
* @param tolerant - whether the ramp may miss a value by the tool's rounding
|
|
186
|
+
* @param spend - spends work from the budget
|
|
187
|
+
* @returns the points, or null
|
|
188
|
+
*/
|
|
189
|
+
function rampOf(
|
|
190
|
+
fam: Family,
|
|
191
|
+
values: readonly unknown[],
|
|
192
|
+
ys0: readonly (StyleValue | null)[],
|
|
193
|
+
tolerant: boolean,
|
|
194
|
+
spend: (ops: number) => void,
|
|
195
|
+
): ContinuousPoint[] | null {
|
|
196
|
+
const byX = new Map<number, StyleValue>();
|
|
197
|
+
let good = true;
|
|
198
|
+
for (const i of fam.styled) {
|
|
199
|
+
const y = ys0[i];
|
|
200
|
+
const x = values[i] as number;
|
|
201
|
+
const seen = byX.get(x);
|
|
202
|
+
if (!interpolable(y) || (seen !== undefined && seen !== y)) {
|
|
203
|
+
good = false;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
byX.set(x, y);
|
|
207
|
+
}
|
|
208
|
+
spend(fam.styled.length);
|
|
209
|
+
// a ramp needs at least 3 distinct outputs: two values over a number are a threshold, not a mapping
|
|
210
|
+
if (!good || byX.size < 2 || byX.size > MAX_DISTINCT_X || new Set(byX.values()).size < 3) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
const xs = Array.from(byX.keys()).sort((a, b) => a - b);
|
|
214
|
+
const ys = xs.map((x) => byX.get(x) as StyleValue);
|
|
215
|
+
const pieces = fitPieces(xs, ys, tolerant, spend);
|
|
216
|
+
// every piece must explain at least 3 distinct inputs, or a few points fit anything
|
|
217
|
+
return pieces === null || pieces.length * 3 > xs.length ? null : piecesToPoints(xs, ys, pieces);
|
|
218
|
+
}
|