@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,685 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reference semantics of a file's styles: which value each element gets for one property. Walk the rules from
|
|
3
|
+
* the top; the first rule whose predicate matches and that gives the property a non-null value wins. A passthrough
|
|
4
|
+
* over a null, a discrete key absent from its table and a continuous mapping over a missing or non-numeric value give
|
|
5
|
+
* no value, so the walk continues downward.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { GraphSnapshot } from "@graphty/graph-format";
|
|
9
|
+
|
|
10
|
+
import { formatF32 } from "../../common/format.js";
|
|
11
|
+
import { canonEnum } from "../canon/enums.js";
|
|
12
|
+
import { canonBoolean, canonNumber, canonOpacity } from "../canon/number.js";
|
|
13
|
+
import type { CanonSite } from "../canon/site.js";
|
|
14
|
+
import { canonText } from "../canon/text.js";
|
|
15
|
+
import { StyleNotes } from "../notes.js";
|
|
16
|
+
import type {
|
|
17
|
+
ColumnRef,
|
|
18
|
+
ContinuousPoint,
|
|
19
|
+
ExtractedStyles,
|
|
20
|
+
Mapping,
|
|
21
|
+
Predicate,
|
|
22
|
+
Scalar,
|
|
23
|
+
StyleColumn,
|
|
24
|
+
StyleFeature,
|
|
25
|
+
StyleProperty,
|
|
26
|
+
StyleRule,
|
|
27
|
+
StyleTarget,
|
|
28
|
+
StyleValue,
|
|
29
|
+
StyleWorkBudget,
|
|
30
|
+
} from "../types.js";
|
|
31
|
+
import { STYLE_PROPERTIES } from "../vocabulary.js";
|
|
32
|
+
|
|
33
|
+
/** Predicates nested deeper than this match nothing: a file never makes the resolver recurse without bound. */
|
|
34
|
+
const MAX_PREDICATE_DEPTH = 32;
|
|
35
|
+
/** The most values an `in` predicate may hold in a short predicate. */
|
|
36
|
+
const MAX_PREDICATE_TERMS = 8;
|
|
37
|
+
const HEX6 = /^#[0-9a-f]{6}$/;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Where the per-element values a rule reads come from.
|
|
41
|
+
*/
|
|
42
|
+
interface RefSource {
|
|
43
|
+
/** The number of elements. */
|
|
44
|
+
readonly n: number;
|
|
45
|
+
/**
|
|
46
|
+
* The values of a column, by element index, or null when nothing holds it.
|
|
47
|
+
* @param ref - the column
|
|
48
|
+
* @returns the values, or null
|
|
49
|
+
*/
|
|
50
|
+
column(ref: ColumnRef): ArrayLike<unknown> | null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The cache key of a column reference.
|
|
55
|
+
* @param ref - the column
|
|
56
|
+
* @returns a key unique per column
|
|
57
|
+
*/
|
|
58
|
+
function refKey(ref: ColumnRef): string {
|
|
59
|
+
if ("style" in ref) {
|
|
60
|
+
return `style:${ref.style}`;
|
|
61
|
+
}
|
|
62
|
+
if ("computed" in ref) {
|
|
63
|
+
return `computed:${ref.computed}`;
|
|
64
|
+
}
|
|
65
|
+
return `data:${(ref as { data: string }).data}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A cell of a snapshot column as a plain value: 64-bit integers as numbers, typed-array items as arrays, unset as
|
|
70
|
+
* null.
|
|
71
|
+
* @param v - the value the table returns
|
|
72
|
+
* @returns the plain value
|
|
73
|
+
*/
|
|
74
|
+
export function plainCell(v: unknown): unknown {
|
|
75
|
+
if (v === undefined || v === null) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
if (typeof v === "bigint") {
|
|
79
|
+
return Number(v);
|
|
80
|
+
}
|
|
81
|
+
if (ArrayBuffer.isView(v)) {
|
|
82
|
+
return Array.from(v as unknown as ArrayLike<number>);
|
|
83
|
+
}
|
|
84
|
+
return v;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* One cell of a data column as a plain value; a 32-bit float as its shortest decimal, so a value gives the same style
|
|
89
|
+
* value whether a file kept it as a 32-bit or a 64-bit number.
|
|
90
|
+
* @param table - the node or edge table
|
|
91
|
+
* @param name - the column
|
|
92
|
+
* @param i - the element
|
|
93
|
+
* @returns the value
|
|
94
|
+
*/
|
|
95
|
+
export function dataCell(table: GraphSnapshot["nodes"], name: string, i: number): unknown {
|
|
96
|
+
const v = plainCell(table.value(name, i));
|
|
97
|
+
return typeof v === "number" && table.get(name)?.dtype === "f32" ? Number(formatF32(v)) : v;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The degree arrays of a snapshot as plain numbers.
|
|
102
|
+
* @param snapshot - the graph
|
|
103
|
+
* @param which - which degree
|
|
104
|
+
* @returns the degree of every node
|
|
105
|
+
*/
|
|
106
|
+
export function degreeValues(snapshot: GraphSnapshot, which: "degree" | "indegree" | "outdegree"): number[] {
|
|
107
|
+
let arr: ArrayLike<number>;
|
|
108
|
+
if (which === "degree") {
|
|
109
|
+
arr = snapshot.degree();
|
|
110
|
+
} else if (which === "indegree") {
|
|
111
|
+
arr = snapshot.inDegree();
|
|
112
|
+
} else {
|
|
113
|
+
arr = snapshot.outDegree();
|
|
114
|
+
}
|
|
115
|
+
return Array.from(arr);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* A reference source over a target's style columns, its features and, when given, the snapshot itself.
|
|
120
|
+
* @param target - nodes or edges
|
|
121
|
+
* @param n - the element count
|
|
122
|
+
* @param columns - the style columns
|
|
123
|
+
* @param features - candidate features (used for data and computed columns when no snapshot is given)
|
|
124
|
+
* @param snapshot - the graph, read for data and computed columns when given
|
|
125
|
+
* @returns the source
|
|
126
|
+
*/
|
|
127
|
+
export function refSource(
|
|
128
|
+
target: StyleTarget,
|
|
129
|
+
n: number,
|
|
130
|
+
columns: ReadonlyMap<string, StyleColumn>,
|
|
131
|
+
features: readonly StyleFeature[],
|
|
132
|
+
snapshot?: GraphSnapshot,
|
|
133
|
+
): RefSource {
|
|
134
|
+
const cache = new Map<string, ArrayLike<unknown> | null>();
|
|
135
|
+
const byKey = new Map<string, StyleFeature>();
|
|
136
|
+
for (const f of features) {
|
|
137
|
+
byKey.set(refKey(f.ref), f);
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
n,
|
|
141
|
+
column(ref: ColumnRef): ArrayLike<unknown> | null {
|
|
142
|
+
if ("style" in ref) {
|
|
143
|
+
return columns.get(ref.style) ?? null;
|
|
144
|
+
}
|
|
145
|
+
const k = refKey(ref);
|
|
146
|
+
if (cache.has(k)) {
|
|
147
|
+
return cache.get(k) ?? null;
|
|
148
|
+
}
|
|
149
|
+
const out =
|
|
150
|
+
snapshot === undefined ? (byKey.get(k)?.values ?? null) : snapshotColumn(snapshot, target, n, ref);
|
|
151
|
+
cache.set(k, out);
|
|
152
|
+
return out;
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* A data or computed column read from the graph.
|
|
159
|
+
* @param snapshot - the graph
|
|
160
|
+
* @param target - nodes or edges
|
|
161
|
+
* @param n - the element count
|
|
162
|
+
* @param ref - the column, not a style column
|
|
163
|
+
* @returns the values, or null when the graph has no such column (a degree of an edge)
|
|
164
|
+
*/
|
|
165
|
+
function snapshotColumn(
|
|
166
|
+
snapshot: GraphSnapshot,
|
|
167
|
+
target: StyleTarget,
|
|
168
|
+
n: number,
|
|
169
|
+
ref: Exclude<ColumnRef, { style: string }>,
|
|
170
|
+
): ArrayLike<unknown> | null {
|
|
171
|
+
if ("computed" in ref) {
|
|
172
|
+
return target === "node" ? degreeValues(snapshot, ref.computed) : null;
|
|
173
|
+
}
|
|
174
|
+
const table = target === "node" ? snapshot.nodes : snapshot.edges;
|
|
175
|
+
return table.has(ref.data) ? Array.from({ length: n }, (_, i) => dataCell(table, ref.data, i)) : null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* One element's value of a column.
|
|
180
|
+
* @param src - the reference source
|
|
181
|
+
* @param ref - the column
|
|
182
|
+
* @param i - the element
|
|
183
|
+
* @returns the value, or null
|
|
184
|
+
*/
|
|
185
|
+
function readRef(src: RefSource, ref: ColumnRef, i: number): unknown {
|
|
186
|
+
const col = src.column(ref);
|
|
187
|
+
if (col === null) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
return col[i] ?? null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Whether a predicate is short: `all`, `has`, `not has`, `eq` or `in` with at most 8 values, combined with at most
|
|
195
|
+
* one `and` of at most 8 terms.
|
|
196
|
+
* @param where - the predicate
|
|
197
|
+
* @returns true when it is short
|
|
198
|
+
*/
|
|
199
|
+
export function isShortPredicate(where: Predicate): boolean {
|
|
200
|
+
if ("and" in where) {
|
|
201
|
+
if (!Array.isArray(where.and) || where.and.length === 0) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
let terms = 0;
|
|
205
|
+
for (const p of where.and as Predicate[]) {
|
|
206
|
+
const t = atomTerms(p);
|
|
207
|
+
if (t === 0) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
terms += t;
|
|
211
|
+
}
|
|
212
|
+
return terms <= MAX_PREDICATE_TERMS;
|
|
213
|
+
}
|
|
214
|
+
return atomTerms(where) > 0;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* The terms of a short atom, or 0 when the predicate is not one.
|
|
219
|
+
* @param p - the predicate
|
|
220
|
+
* @returns its term count, or 0
|
|
221
|
+
*/
|
|
222
|
+
function atomTerms(p: Predicate): number {
|
|
223
|
+
if ("all" in p) {
|
|
224
|
+
return p.all ? 1 : 0;
|
|
225
|
+
}
|
|
226
|
+
if ("has" in p) {
|
|
227
|
+
return 1;
|
|
228
|
+
}
|
|
229
|
+
if ("not" in p) {
|
|
230
|
+
// `not` over a degree test stays a predicate, so it follows later edits.
|
|
231
|
+
return "has" in p.not || "computed" in refOfTest(p.not) ? atomTerms(p.not) : 0;
|
|
232
|
+
}
|
|
233
|
+
if ("eq" in p) {
|
|
234
|
+
return 1;
|
|
235
|
+
}
|
|
236
|
+
if ("in" in p) {
|
|
237
|
+
const n = Array.isArray(p.in[1]) ? p.in[1].length : 0;
|
|
238
|
+
return n >= 1 && n <= MAX_PREDICATE_TERMS ? n : 0;
|
|
239
|
+
}
|
|
240
|
+
return 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The column an `eq` or `in` test reads, or an empty reference for any other predicate.
|
|
245
|
+
* @param p - the predicate
|
|
246
|
+
* @returns the column reference
|
|
247
|
+
*/
|
|
248
|
+
function refOfTest(p: Predicate): ColumnRef | Record<string, never> {
|
|
249
|
+
if ("eq" in p) {
|
|
250
|
+
return p.eq[0];
|
|
251
|
+
}
|
|
252
|
+
if ("in" in p) {
|
|
253
|
+
return p.in[0];
|
|
254
|
+
}
|
|
255
|
+
return {};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Whether a column value equals a predicate's scalar. A boolean also equals the 1 or 0 and the "true" or "false" (any
|
|
260
|
+
* case) of a format that has no booleans (GML writes them as 1 and 0), so a rule over a boolean column still selects
|
|
261
|
+
* the same elements after such a file is read back.
|
|
262
|
+
* @param v - the element's value
|
|
263
|
+
* @param k - the scalar
|
|
264
|
+
* @returns true when equal
|
|
265
|
+
*/
|
|
266
|
+
function scalarEq(v: unknown, k: Scalar): boolean {
|
|
267
|
+
if (v === k) {
|
|
268
|
+
return v !== null && v !== undefined;
|
|
269
|
+
}
|
|
270
|
+
if (typeof k === "boolean") {
|
|
271
|
+
return boolEq(k, v);
|
|
272
|
+
}
|
|
273
|
+
return typeof v === "boolean" && boolEq(v, k);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Whether a value is a boolean's 1 or 0, or its "true" or "false" in any case.
|
|
278
|
+
* @param b - the boolean
|
|
279
|
+
* @param other - the value
|
|
280
|
+
* @returns true when equal
|
|
281
|
+
*/
|
|
282
|
+
function boolEq(b: boolean, other: unknown): boolean {
|
|
283
|
+
return other === (b ? 1 : 0) || (typeof other === "string" && other.toLowerCase() === String(b));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Whether a predicate matches an element. Unknown predicate kinds and predicates nested deeper than 32 match nothing.
|
|
288
|
+
* @param where - the predicate
|
|
289
|
+
* @param src - the reference source
|
|
290
|
+
* @param i - the element
|
|
291
|
+
* @param depth - the current nesting depth
|
|
292
|
+
* @returns true when the predicate matches
|
|
293
|
+
*/
|
|
294
|
+
export function matches(where: Predicate, src: RefSource, i: number, depth = 0): boolean {
|
|
295
|
+
if (depth > MAX_PREDICATE_DEPTH) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
if ("all" in where) {
|
|
299
|
+
return where.all;
|
|
300
|
+
}
|
|
301
|
+
if ("has" in where) {
|
|
302
|
+
const v = readRef(src, where.has, i);
|
|
303
|
+
return v !== null && v !== false;
|
|
304
|
+
}
|
|
305
|
+
if ("eq" in where) {
|
|
306
|
+
return scalarEq(readRef(src, where.eq[0], i), where.eq[1]);
|
|
307
|
+
}
|
|
308
|
+
if ("in" in where) {
|
|
309
|
+
const v = readRef(src, where.in[0], i);
|
|
310
|
+
return where.in[1].some((k) => scalarEq(v, k));
|
|
311
|
+
}
|
|
312
|
+
if ("and" in where) {
|
|
313
|
+
return where.and.every((p) => matches(p, src, i, depth + 1));
|
|
314
|
+
}
|
|
315
|
+
if ("or" in where) {
|
|
316
|
+
return where.or.some((p) => matches(p, src, i, depth + 1));
|
|
317
|
+
}
|
|
318
|
+
if ("not" in where) {
|
|
319
|
+
return !matches(where.not, src, i, depth + 1);
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const ENUM_KINDS: ReadonlySet<string> = new Set(["shape", "borderStyle", "lineStyle", "arrow", "weight", "position"]);
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* How a passthrough reads a raw value as a property's canonical value (CSS spelling for colors).
|
|
328
|
+
* @param target - nodes or edges
|
|
329
|
+
* @param property - the property
|
|
330
|
+
* @returns the reader: a canonical value or null
|
|
331
|
+
*/
|
|
332
|
+
export function canonicalFor(target: StyleTarget, property: string): (raw: unknown) => StyleValue | null {
|
|
333
|
+
const kind = STYLE_PROPERTIES[target].get(property);
|
|
334
|
+
const site: CanonSite = { notes: new StyleNotes(), target, property };
|
|
335
|
+
if (kind === undefined) {
|
|
336
|
+
return (raw) => (typeof raw === "string" || typeof raw === "number" || typeof raw === "boolean" ? raw : null);
|
|
337
|
+
}
|
|
338
|
+
switch (kind) {
|
|
339
|
+
case "color":
|
|
340
|
+
// only an already canonical color: a CSS function or a name may parse differently elsewhere
|
|
341
|
+
return (raw) => (typeof raw === "string" && /^#[0-9a-fA-F]{6}$/.test(raw) ? raw.toLowerCase() : null);
|
|
342
|
+
case "number":
|
|
343
|
+
return (raw) => canonNumber(raw, site);
|
|
344
|
+
case "opacity":
|
|
345
|
+
return (raw) => canonOpacity(raw, "css", site);
|
|
346
|
+
case "boolean":
|
|
347
|
+
return (raw) => canonBoolean(raw, site);
|
|
348
|
+
case "text":
|
|
349
|
+
return (raw) => canonText(raw, site);
|
|
350
|
+
default:
|
|
351
|
+
if (!ENUM_KINDS.has(kind)) {
|
|
352
|
+
return () => null;
|
|
353
|
+
}
|
|
354
|
+
return (raw) =>
|
|
355
|
+
typeof raw === "string" && raw.startsWith("other:") ? raw : canonEnum(kind, raw, "css", site);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const LOOKUPS = new WeakMap<object, (value: unknown) => number>();
|
|
360
|
+
const DECIMAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* A number from a number or a decimal string.
|
|
364
|
+
* @param v - the value
|
|
365
|
+
* @returns the number, or null
|
|
366
|
+
*/
|
|
367
|
+
export function numberOf(v: unknown): number | null {
|
|
368
|
+
if (typeof v === "number") {
|
|
369
|
+
return Number.isFinite(v) ? v : null;
|
|
370
|
+
}
|
|
371
|
+
if (typeof v === "string" && v.length <= 64 && DECIMAL.test(v.trim())) {
|
|
372
|
+
return Number(v.trim());
|
|
373
|
+
}
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* The lookup of a discrete table: keys compared by their text (numbers numerically, booleans without case), a list
|
|
379
|
+
* value matched by its first item that has an entry. Built once per table through hash indexes.
|
|
380
|
+
* @param table - the table
|
|
381
|
+
* @returns the index of the matching entry, or -1
|
|
382
|
+
*/
|
|
383
|
+
export function discreteLookup(table: readonly (readonly [Scalar, StyleValue])[]): (value: unknown) => number {
|
|
384
|
+
const cached = LOOKUPS.get(table);
|
|
385
|
+
if (cached !== undefined) {
|
|
386
|
+
return cached;
|
|
387
|
+
}
|
|
388
|
+
const byStr = new Map<string, number>();
|
|
389
|
+
const byNum = new Map<number, number>();
|
|
390
|
+
const byBool = new Map<string, number>();
|
|
391
|
+
table.forEach(([k], j) => {
|
|
392
|
+
if (k === null || typeof k === "object") {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const ks = String(k);
|
|
396
|
+
if (!byStr.has(ks)) {
|
|
397
|
+
byStr.set(ks, j);
|
|
398
|
+
}
|
|
399
|
+
const kn = numberOf(k);
|
|
400
|
+
if (kn !== null && !byNum.has(kn)) {
|
|
401
|
+
byNum.set(kn, j);
|
|
402
|
+
}
|
|
403
|
+
const kb = ks.toLowerCase();
|
|
404
|
+
if ((kb === "true" || kb === "false") && !byBool.has(kb)) {
|
|
405
|
+
byBool.set(kb, j);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
const one = (value: unknown): number => {
|
|
409
|
+
if (typeof value === "number") {
|
|
410
|
+
return byNum.get(value) ?? -1;
|
|
411
|
+
}
|
|
412
|
+
if (typeof value === "boolean") {
|
|
413
|
+
return byBool.get(String(value)) ?? -1;
|
|
414
|
+
}
|
|
415
|
+
if (typeof value === "string") {
|
|
416
|
+
return byStr.get(value) ?? -1;
|
|
417
|
+
}
|
|
418
|
+
return -1;
|
|
419
|
+
};
|
|
420
|
+
const f = (value: unknown): number => {
|
|
421
|
+
if (Array.isArray(value)) {
|
|
422
|
+
for (const v of value) {
|
|
423
|
+
const j = one(v);
|
|
424
|
+
if (j >= 0) {
|
|
425
|
+
return j;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return -1;
|
|
429
|
+
}
|
|
430
|
+
return one(value);
|
|
431
|
+
};
|
|
432
|
+
LOOKUPS.set(table, f);
|
|
433
|
+
return f;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Two hex digits.
|
|
438
|
+
* @param v - a channel 0..255
|
|
439
|
+
* @returns its hex
|
|
440
|
+
*/
|
|
441
|
+
function hex2(v: number): string {
|
|
442
|
+
return Math.min(255, Math.max(0, Math.round(v)))
|
|
443
|
+
.toString(16)
|
|
444
|
+
.padStart(2, "0");
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* A number at 6 significant digits.
|
|
449
|
+
* @param x - the number
|
|
450
|
+
* @returns the rounded number
|
|
451
|
+
*/
|
|
452
|
+
function num6(x: number): number {
|
|
453
|
+
return Number(x.toPrecision(6)) + 0;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Interpolates two values: numbers linearly at 6 significant digits, colors per sRGB channel; anything else steps at
|
|
458
|
+
* the right end.
|
|
459
|
+
* @param a - the left value
|
|
460
|
+
* @param b - the right value
|
|
461
|
+
* @param t - 0..1
|
|
462
|
+
* @returns the value
|
|
463
|
+
*/
|
|
464
|
+
export function interpolate(a: StyleValue, b: StyleValue, t: number): StyleValue {
|
|
465
|
+
if (typeof a === "number" && typeof b === "number") {
|
|
466
|
+
return num6(a + (b - a) * t);
|
|
467
|
+
}
|
|
468
|
+
if (typeof a === "string" && typeof b === "string" && HEX6.test(a) && HEX6.test(b)) {
|
|
469
|
+
let out = "#";
|
|
470
|
+
for (const k of [1, 3, 5]) {
|
|
471
|
+
const ca = Number.parseInt(a.slice(k, k + 2), 16);
|
|
472
|
+
const cb = Number.parseInt(b.slice(k, k + 2), 16);
|
|
473
|
+
out += hex2(ca + (cb - ca) * t);
|
|
474
|
+
}
|
|
475
|
+
return out;
|
|
476
|
+
}
|
|
477
|
+
return t < 1 ? a : b;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Evaluates a continuous mapping at x.
|
|
482
|
+
* @param points - the points, in increasing `at`
|
|
483
|
+
* @param x - the input
|
|
484
|
+
* @returns the value, or null for a missing or non-finite input
|
|
485
|
+
*/
|
|
486
|
+
export function evalContinuous(points: readonly ContinuousPoint[], x: number | null): StyleValue | null {
|
|
487
|
+
if (x === null || !Number.isFinite(x) || points.length === 0) {
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
if (x < points[0].at) {
|
|
491
|
+
return points[0].below;
|
|
492
|
+
}
|
|
493
|
+
for (let i = 0; i < points.length; i++) {
|
|
494
|
+
const p = points[i];
|
|
495
|
+
if (x === p.at) {
|
|
496
|
+
return p.value;
|
|
497
|
+
}
|
|
498
|
+
const q = points.at(i + 1);
|
|
499
|
+
if (q === undefined) {
|
|
500
|
+
return p.above;
|
|
501
|
+
}
|
|
502
|
+
if (x < q.at) {
|
|
503
|
+
return interpolate(p.above, q.below, (x - p.at) / (q.at - p.at));
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* The value one mapping gives one element.
|
|
511
|
+
* @param m - the mapping
|
|
512
|
+
* @param canon - the property's passthrough reader
|
|
513
|
+
* @param src - the reference source
|
|
514
|
+
* @param i - the element
|
|
515
|
+
* @returns the value, or null when the mapping gives none
|
|
516
|
+
*/
|
|
517
|
+
function evalMapping(
|
|
518
|
+
m: Mapping,
|
|
519
|
+
canon: (raw: unknown) => StyleValue | null,
|
|
520
|
+
src: RefSource,
|
|
521
|
+
i: number,
|
|
522
|
+
): StyleValue | null {
|
|
523
|
+
const v = readRef(src, m.by, i);
|
|
524
|
+
if (v === null || v === undefined) {
|
|
525
|
+
return null;
|
|
526
|
+
}
|
|
527
|
+
switch (m.kind) {
|
|
528
|
+
case "passthrough":
|
|
529
|
+
if (Array.isArray(v)) {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
// a style column already holds canonical values; a data column is read as the property's value
|
|
533
|
+
if ("style" in m.by) {
|
|
534
|
+
return typeof v === "string" || typeof v === "number" || typeof v === "boolean" ? v : null;
|
|
535
|
+
}
|
|
536
|
+
return canon(v);
|
|
537
|
+
case "discrete": {
|
|
538
|
+
const j = discreteLookup(m.table)(v);
|
|
539
|
+
return j < 0 ? null : m.table[j][1];
|
|
540
|
+
}
|
|
541
|
+
case "continuous":
|
|
542
|
+
return Array.isArray(v) ? null : evalContinuous(m.points, numberOf(v));
|
|
543
|
+
default:
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* A rule's constant value of a property: its own member only, so a property named like a built-in object member
|
|
550
|
+
* (`constructor`, `toString`) is never found on the prototype.
|
|
551
|
+
* @param rule - the rule
|
|
552
|
+
* @param property - the property
|
|
553
|
+
* @returns the value, or undefined
|
|
554
|
+
*/
|
|
555
|
+
function setOf(rule: StyleRule, property: string): StyleValue | undefined {
|
|
556
|
+
const set: Readonly<Record<string, StyleValue | undefined>> = rule.set ?? {};
|
|
557
|
+
return Object.hasOwn(set, property) ? set[property] : undefined;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* A rule's mapping of a property: its own member only.
|
|
562
|
+
* @param rule - the rule
|
|
563
|
+
* @param property - the property
|
|
564
|
+
* @returns the mapping, or undefined
|
|
565
|
+
*/
|
|
566
|
+
function mapOf(rule: StyleRule, property: string): Mapping | undefined {
|
|
567
|
+
const map: Readonly<Record<string, Mapping | undefined>> = rule.map ?? {};
|
|
568
|
+
return Object.hasOwn(map, property) ? map[property] : undefined;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Resolves one property for every element over a rule list.
|
|
573
|
+
* @param rules - the rules, bottom to top (other targets are skipped)
|
|
574
|
+
* @param target - nodes or edges
|
|
575
|
+
* @param property - the property
|
|
576
|
+
* @param src - the reference source
|
|
577
|
+
* @param budget - spent once per rule visited, when given
|
|
578
|
+
* @returns each element's value, or null where no rule gives one
|
|
579
|
+
*/
|
|
580
|
+
export function resolveRules(
|
|
581
|
+
rules: readonly StyleRule[],
|
|
582
|
+
target: StyleTarget,
|
|
583
|
+
property: string,
|
|
584
|
+
src: RefSource,
|
|
585
|
+
budget?: StyleWorkBudget,
|
|
586
|
+
): (StyleValue | null)[] {
|
|
587
|
+
// the rules that write the property, top first
|
|
588
|
+
const writers = rules
|
|
589
|
+
.filter(
|
|
590
|
+
(rule) =>
|
|
591
|
+
rule.target === target && (setOf(rule, property) !== undefined || mapOf(rule, property) !== undefined),
|
|
592
|
+
)
|
|
593
|
+
.reverse();
|
|
594
|
+
const canon = canonicalFor(target, property);
|
|
595
|
+
const out = new Array<StyleValue | null>(src.n).fill(null);
|
|
596
|
+
let visits = 0;
|
|
597
|
+
for (let i = 0; i < src.n; i++) {
|
|
598
|
+
for (const rule of writers) {
|
|
599
|
+
visits++;
|
|
600
|
+
const v = ruleValue(rule, property, canon, src, i);
|
|
601
|
+
if (v !== null) {
|
|
602
|
+
out[i] = v;
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
budget?.spend(target, visits + src.n);
|
|
608
|
+
return out;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* The value one rule gives an element, or null when it selects the element but gives no value, or does not select it.
|
|
613
|
+
* @param rule - the rule
|
|
614
|
+
* @param property - the property
|
|
615
|
+
* @param canon - the property's canonicalizer
|
|
616
|
+
* @param src - the reference source
|
|
617
|
+
* @param i - the element
|
|
618
|
+
* @returns the value, or null
|
|
619
|
+
*/
|
|
620
|
+
function ruleValue(
|
|
621
|
+
rule: StyleRule,
|
|
622
|
+
property: string,
|
|
623
|
+
canon: ReturnType<typeof canonicalFor>,
|
|
624
|
+
src: RefSource,
|
|
625
|
+
i: number,
|
|
626
|
+
): StyleValue | null {
|
|
627
|
+
if (!matches(rule.where, src, i)) {
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
const set = setOf(rule, property);
|
|
631
|
+
if (set !== undefined) {
|
|
632
|
+
return set;
|
|
633
|
+
}
|
|
634
|
+
const mapping = mapOf(rule, property);
|
|
635
|
+
return mapping === undefined ? null : evalMapping(mapping, canon, src, i);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* Every element's value of one property under a file's styles: the reference semantics of the format.
|
|
640
|
+
* @param extracted - the styles
|
|
641
|
+
* @param target - nodes or edges
|
|
642
|
+
* @param property - the property
|
|
643
|
+
* @param snapshot - the graph; when given, data columns and degrees are read from it (so a degree mapping follows
|
|
644
|
+
* the graph), otherwise from `extracted.features`
|
|
645
|
+
* @returns each element's value, or null where the file gives none
|
|
646
|
+
* @category Styles
|
|
647
|
+
*/
|
|
648
|
+
export function resolveStyles(
|
|
649
|
+
extracted: ExtractedStyles,
|
|
650
|
+
target: StyleTarget,
|
|
651
|
+
property: StyleProperty,
|
|
652
|
+
snapshot?: GraphSnapshot,
|
|
653
|
+
): readonly (StyleValue | null)[] {
|
|
654
|
+
let n = extracted.fingerprint[target === "node" ? "nodes" : "edges"];
|
|
655
|
+
if (snapshot !== undefined) {
|
|
656
|
+
n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
657
|
+
}
|
|
658
|
+
const src = refSource(target, n, extracted.columns[target], extracted.features[target], snapshot);
|
|
659
|
+
return resolveRules(extracted.styles.rules, target, property, src);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Whether two values agree within the rounding a writing tool does: 2 of 255 per color channel, or 1e-5 relative for
|
|
664
|
+
* numbers.
|
|
665
|
+
* @param a - one value
|
|
666
|
+
* @param b - the other
|
|
667
|
+
* @returns true when equal or within the rounding
|
|
668
|
+
*/
|
|
669
|
+
export function within(a: StyleValue | null, b: StyleValue | null): boolean {
|
|
670
|
+
if (a === b) {
|
|
671
|
+
return true;
|
|
672
|
+
}
|
|
673
|
+
if (typeof a === "number" && typeof b === "number") {
|
|
674
|
+
return Math.abs(a - b) <= 1e-5 * Math.max(Math.abs(a), Math.abs(b), 1e-9);
|
|
675
|
+
}
|
|
676
|
+
if (typeof a === "string" && typeof b === "string" && HEX6.test(a) && HEX6.test(b)) {
|
|
677
|
+
for (const k of [1, 3, 5]) {
|
|
678
|
+
if (Math.abs(Number.parseInt(a.slice(k, k + 2), 16) - Number.parseInt(b.slice(k, k + 2), 16)) > 2) {
|
|
679
|
+
return false;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
return true;
|
|
683
|
+
}
|
|
684
|
+
return false;
|
|
685
|
+
}
|