@graphty/graph-io 0.3.43 → 0.3.45
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-DJMHdDvv.js +40 -0
- package/dist/chunks/approximations-DJMHdDvv.js.map +1 -0
- package/dist/chunks/block-CPCHkX42.js +2777 -0
- package/dist/chunks/block-CPCHkX42.js.map +1 -0
- package/dist/chunks/{choose-DvpbdRuz.js → choose--jM0yYCo.js} +3 -2
- package/dist/chunks/{choose-DvpbdRuz.js.map → choose--jM0yYCo.js.map} +1 -1
- package/dist/chunks/{constants-fT3E8JYY.js → constants-BKwqelYD.js} +6 -2
- package/dist/chunks/constants-BKwqelYD.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-DZy6JgdA.js +3456 -0
- package/dist/chunks/emit-DZy6JgdA.js.map +1 -0
- package/dist/chunks/{escape-B62ZGM_a.js → escape-CgzxiYPg.js} +44 -21
- package/dist/chunks/escape-CgzxiYPg.js.map +1 -0
- package/dist/chunks/{export-rKLeGQMo.js → export-BvqAXCKh.js} +196 -792
- package/dist/chunks/export-BvqAXCKh.js.map +1 -0
- package/dist/chunks/{exporter-yLxKBvLE.js → exporter--Mk9gXCJ.js} +4 -3
- package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter--Mk9gXCJ.js.map} +1 -1
- package/dist/chunks/{exporter-RVtXVetw.js → exporter-C-9cgZKa.js} +1805 -287
- package/dist/chunks/exporter-C-9cgZKa.js.map +1 -0
- package/dist/chunks/{exporter-8hLNemFk.js → exporter-DFqJhBnj.js} +133 -74
- package/dist/chunks/exporter-DFqJhBnj.js.map +1 -0
- package/dist/chunks/{exporter-BWwEuOPT.js → exporter-DteVeJki.js} +22 -12
- package/dist/chunks/exporter-DteVeJki.js.map +1 -0
- package/dist/chunks/format-BpQBx8MZ.js +676 -0
- package/dist/chunks/format-BpQBx8MZ.js.map +1 -0
- package/dist/chunks/generic-BGO71QBv.js +1347 -0
- package/dist/chunks/generic-BGO71QBv.js.map +1 -0
- package/dist/chunks/{importer-C98dpSH4.js → importer-B-9Rc1zO.js} +141 -82
- package/dist/chunks/importer-B-9Rc1zO.js.map +1 -0
- package/dist/chunks/{importer-D794XUTe.js → importer-BVVR740x.js} +31 -8
- package/dist/chunks/importer-BVVR740x.js.map +1 -0
- package/dist/chunks/{importer-WrGRZb0N.js → importer-C0AjA3Ax.js} +449 -102
- package/dist/chunks/importer-C0AjA3Ax.js.map +1 -0
- package/dist/chunks/{importer-BbNb7eNg.js → importer-C7pvJe1L.js} +1398 -129
- package/dist/chunks/importer-C7pvJe1L.js.map +1 -0
- package/dist/chunks/{importer-xZ-3suY1.js → importer-ClwoVx3O.js} +791 -135
- package/dist/chunks/importer-ClwoVx3O.js.map +1 -0
- package/dist/chunks/{importer-Ht7LNg8L.js → importer-D0sC_6bO.js} +116 -296
- package/dist/chunks/importer-D0sC_6bO.js.map +1 -0
- package/dist/chunks/{importer-Dz7tI8Sa.js → importer-EHQk1jbM.js} +617 -115
- package/dist/chunks/importer-EHQk1jbM.js.map +1 -0
- package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-DJZRZ6jd.js} +123 -32
- package/dist/chunks/json-elements-DJZRZ6jd.js.map +1 -0
- package/dist/chunks/lexicon-WMsNddyU.js +509 -0
- package/dist/chunks/lexicon-WMsNddyU.js.map +1 -0
- package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-G4MqRdux.js} +3 -2
- package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-G4MqRdux.js.map} +1 -1
- package/dist/chunks/{records-Cu4bxYOm.js → records-CiaWZrFH.js} +2 -2
- package/dist/chunks/{records-Cu4bxYOm.js.map → records-CiaWZrFH.js.map} +1 -1
- package/dist/chunks/styles-DvoFBKCK.js +690 -0
- package/dist/chunks/styles-DvoFBKCK.js.map +1 -0
- package/dist/chunks/styles-yed-Cz9rLBCP.js +842 -0
- package/dist/chunks/styles-yed-Cz9rLBCP.js.map +1 -0
- package/dist/chunks/styles-zNTmz5R7.js +2102 -0
- package/dist/chunks/styles-zNTmz5R7.js.map +1 -0
- package/dist/chunks/{text-DHOJXnED.js → text-CzJNFOS9.js} +2 -2
- package/dist/chunks/{text-DHOJXnED.js.map → text-CzJNFOS9.js.map} +1 -1
- package/dist/chunks/units-XMZFIFe1.js +19 -0
- package/dist/chunks/units-XMZFIFe1.js.map +1 -0
- package/dist/chunks/writer-gQ8kx99H.js +448 -0
- package/dist/chunks/writer-gQ8kx99H.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 +292 -412
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +927 -74
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +351 -236
- 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 +1496 -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 +20 -5
- 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 +439 -264
- 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 +791 -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 +605 -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 +89 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -0
- package/dist/src/styles/io/writer.js +626 -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 +1755 -0
- package/src/formats/gexf/exporter.ts +27 -11
- 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 +541 -322
- 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 +952 -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 +658 -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 +780 -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-RVtXVetw.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,687 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a file's styles after an import: the importer's own `styles()` (the simple path, canonicalized and planned
|
|
3
|
+
* here, or the advanced path), the generic reader of the style roles (`color`, `size`, `shape`, `thickness`,
|
|
4
|
+
* `hidden`) for an importer without one, and the `graphty.styles` block when a file graphty wrote carries it as a
|
|
5
|
+
* graph attribute.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { GraphSnapshot } from "@graphty/graph-format";
|
|
9
|
+
|
|
10
|
+
import { keptForStyles } from "../../common/report.js";
|
|
11
|
+
import type { GraphImporter, ImportReport } from "../../types.js";
|
|
12
|
+
import { StyleBudget } from "../budget.js";
|
|
13
|
+
import { canonColor, colorOpacity } from "../canon/color.js";
|
|
14
|
+
import { canonEnum, type StyleEnumKind } from "../canon/enums.js";
|
|
15
|
+
import { canonBoolean, canonNumber, canonOpacity, DOT_POINTS_PER_INCH, styleLengthUnit } from "../canon/number.js";
|
|
16
|
+
import type { CanonSite } from "../canon/site.js";
|
|
17
|
+
import { canonText } from "../canon/text.js";
|
|
18
|
+
import { STYLE_ISSUE } from "../codes.js";
|
|
19
|
+
import { StyleNotes } from "../notes.js";
|
|
20
|
+
import { featuresOf, styleFingerprint } from "../plan/features.js";
|
|
21
|
+
import { planStyles } from "../plan/plan.js";
|
|
22
|
+
import { plainCell } from "../plan/resolve.js";
|
|
23
|
+
import type {
|
|
24
|
+
ExtractedStyles,
|
|
25
|
+
GraphStyle,
|
|
26
|
+
ImporterStyles,
|
|
27
|
+
ReaderOutput,
|
|
28
|
+
StyleColumn,
|
|
29
|
+
StyleDialect,
|
|
30
|
+
StyleNote,
|
|
31
|
+
StyleProperty,
|
|
32
|
+
StyleTarget,
|
|
33
|
+
StyleTool,
|
|
34
|
+
StyleValue,
|
|
35
|
+
} from "../types.js";
|
|
36
|
+
import { STYLE_PROPERTIES } from "../vocabulary.js";
|
|
37
|
+
import { blockStyles, parseStyleBlock, STYLE_BLOCK_NAME } from "./block.js";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The `styles` option of `importGraph()` given as an object.
|
|
41
|
+
* @category Styles
|
|
42
|
+
*/
|
|
43
|
+
export interface StyleImportOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Whether a property the file leaves to its writing program's default gets that program's default (Cytoscape's,
|
|
46
|
+
* Graphviz's, Gephi's ...), so the graph looks as it does there. Defaults to true.
|
|
47
|
+
*/
|
|
48
|
+
readonly toolDefaults?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Options of `extractStyles()`.
|
|
53
|
+
* @category Styles
|
|
54
|
+
*/
|
|
55
|
+
export interface ExtractStylesOptions extends StyleImportOptions {
|
|
56
|
+
/** Cancels the extraction. */
|
|
57
|
+
readonly signal?: AbortSignal | null;
|
|
58
|
+
/**
|
|
59
|
+
* The counted work budget to spend (and read back after: `budget.used("node")`); a new one of
|
|
60
|
+
* `STYLE_WORK_BUDGET` operations per target when absent.
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
readonly budget?: StyleBudget;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const TARGETS: readonly StyleTarget[] = ["node", "edge"];
|
|
67
|
+
const ENUM_KINDS: ReadonlySet<string> = new Set(["shape", "borderStyle", "lineStyle", "arrow", "weight", "position"]);
|
|
68
|
+
|
|
69
|
+
/** What the readers here produce before planning: canonical values and the data columns they came from. */
|
|
70
|
+
interface StyleTruth {
|
|
71
|
+
readonly dialect: StyleDialect | null;
|
|
72
|
+
readonly tool: StyleTool | null;
|
|
73
|
+
readonly units: "px" | "relative";
|
|
74
|
+
readonly graph: GraphStyle;
|
|
75
|
+
readonly node: ReaderOutput;
|
|
76
|
+
readonly edge: ReaderOutput;
|
|
77
|
+
readonly raw: { readonly node: readonly string[]; readonly edge: readonly string[] };
|
|
78
|
+
readonly notes: readonly StyleNote[];
|
|
79
|
+
/** A `graphty.styles` block the importer found outside the graph attributes, or null. */
|
|
80
|
+
readonly block?: string | null;
|
|
81
|
+
/** Whether the format writes an opacity as its color's alpha (see `ImporterStyles`). */
|
|
82
|
+
readonly opacityInColor?: boolean;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Reads the styles of a file after its import: the reading importer's own `styles()` (with what its `import()` kept
|
|
87
|
+
* for it), or the columns whose role is a style role when it has none; a `graphty.styles` block carried as a graph
|
|
88
|
+
* attribute gives the rules, with the importer's values as the truth. Called by `importGraph()` when styles are
|
|
89
|
+
* requested; a caller that drives an importer itself (into its own builder) calls it with the report `import()`
|
|
90
|
+
* returned.
|
|
91
|
+
* @param importer - the importer that read the file
|
|
92
|
+
* @param snapshot - the graph it built
|
|
93
|
+
* @param report - the report its `import()` returned
|
|
94
|
+
* @param options - tool defaults and a cancel signal
|
|
95
|
+
* @returns the styles, or null when the file has none
|
|
96
|
+
* @category Styles
|
|
97
|
+
*/
|
|
98
|
+
export function extractStyles(
|
|
99
|
+
importer: GraphImporter,
|
|
100
|
+
snapshot: GraphSnapshot,
|
|
101
|
+
report: ImportReport,
|
|
102
|
+
options: ExtractStylesOptions = {},
|
|
103
|
+
): ExtractedStyles | null {
|
|
104
|
+
const signal = options.signal ?? undefined;
|
|
105
|
+
const notes = new StyleNotes();
|
|
106
|
+
const budget = options.budget ?? new StyleBudget();
|
|
107
|
+
const canonical = readStyleValues(importer, snapshot, report, { notes, budget, signal });
|
|
108
|
+
const fingerprint = styleFingerprint(snapshot);
|
|
109
|
+
const blockText = canonical?.block ?? graphValue(snapshot, STYLE_BLOCK_NAME);
|
|
110
|
+
if (blockText !== undefined) {
|
|
111
|
+
const parsed = parseStyleBlock(blockText, fingerprint);
|
|
112
|
+
if (parsed.ok) {
|
|
113
|
+
const truth = canonical === null ? {} : { node: canonical.node.values, edge: canonical.edge.values };
|
|
114
|
+
const fromBlock = blockStyles(
|
|
115
|
+
parsed.block,
|
|
116
|
+
snapshot,
|
|
117
|
+
importer.format,
|
|
118
|
+
truth,
|
|
119
|
+
canonical?.notes ?? [],
|
|
120
|
+
canonical?.tool ?? null,
|
|
121
|
+
canonical?.opacityInColor === true,
|
|
122
|
+
);
|
|
123
|
+
if (fromBlock !== null) {
|
|
124
|
+
return fromBlock;
|
|
125
|
+
}
|
|
126
|
+
notes.add(STYLE_ISSUE.BLOCK_IGNORED, null, null, { sample: "INVALID" });
|
|
127
|
+
} else {
|
|
128
|
+
notes.add(STYLE_ISSUE.BLOCK_IGNORED, null, null, { sample: parsed.reason });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (canonical === null) {
|
|
132
|
+
const list = notes.list();
|
|
133
|
+
return list.length === 0 ? null : emptyStyles(importer.format, list, snapshot, fingerprint);
|
|
134
|
+
}
|
|
135
|
+
const raw = { node: new Set(canonical.raw.node), edge: new Set(canonical.raw.edge) };
|
|
136
|
+
const features = {
|
|
137
|
+
node: featuresOf(snapshot, "node").filter((f) => !("data" in f.ref && raw.node.has(f.ref.data))),
|
|
138
|
+
edge: featuresOf(snapshot, "edge").filter((f) => !("data" in f.ref && raw.edge.has(f.ref.data))),
|
|
139
|
+
};
|
|
140
|
+
const planned = planStyles(
|
|
141
|
+
{
|
|
142
|
+
format: importer.format,
|
|
143
|
+
dialect: canonical.dialect,
|
|
144
|
+
tool: canonical.tool,
|
|
145
|
+
units: canonical.units,
|
|
146
|
+
graph: canonical.graph,
|
|
147
|
+
node: canonical.node,
|
|
148
|
+
edge: canonical.edge,
|
|
149
|
+
fingerprint,
|
|
150
|
+
},
|
|
151
|
+
features,
|
|
152
|
+
{
|
|
153
|
+
toolDefaults: options.toolDefaults,
|
|
154
|
+
budget,
|
|
155
|
+
notes,
|
|
156
|
+
rawColumns: { node: canonical.raw.node, edge: canonical.raw.edge },
|
|
157
|
+
signal,
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
if (canonical.notes.length === 0) {
|
|
161
|
+
return planned;
|
|
162
|
+
}
|
|
163
|
+
return { ...planned, styles: { ...planned.styles, notes: [...canonical.notes, ...planned.styles.notes] } };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* What a file's styles are before planning: each element's canonical value per property, as the importer's own
|
|
168
|
+
* `styles()` gives them (the simple path canonicalized) or, for an importer without one, as the generic reader reads
|
|
169
|
+
* the columns with a style role. The truth the planned rules must reproduce; not part of the published entry.
|
|
170
|
+
* @param importer - the importer that read the file
|
|
171
|
+
* @param snapshot - the graph it built
|
|
172
|
+
* @param report - the report its `import()` returned
|
|
173
|
+
* @param context - where problems are noted, the work budget and a cancel signal
|
|
174
|
+
* @param context.notes - where problems are noted
|
|
175
|
+
* @param context.budget - the work budget
|
|
176
|
+
* @param context.signal - cancels the work
|
|
177
|
+
* @returns the canonical values, or null when the file has no styles
|
|
178
|
+
*/
|
|
179
|
+
export function readStyleValues(
|
|
180
|
+
importer: GraphImporter,
|
|
181
|
+
snapshot: GraphSnapshot,
|
|
182
|
+
report: ImportReport,
|
|
183
|
+
context: { readonly notes: StyleNotes; readonly budget: StyleBudget; readonly signal?: AbortSignal | undefined },
|
|
184
|
+
): StyleTruth | null {
|
|
185
|
+
const { notes, budget, signal } = context;
|
|
186
|
+
signal?.throwIfAborted();
|
|
187
|
+
let canonical: StyleTruth | null;
|
|
188
|
+
if (importer.styles === undefined) {
|
|
189
|
+
canonical = roleStyles(snapshot, importer.format, notes, budget);
|
|
190
|
+
} else {
|
|
191
|
+
const got = importer.styles(snapshot, { signal, budget, kept: keptForStyles(report) });
|
|
192
|
+
canonical = got === null ? null : canonicalOf(got, snapshot, notes, budget, signal);
|
|
193
|
+
}
|
|
194
|
+
signal?.throwIfAborted();
|
|
195
|
+
return canonical === null ? null : withPairedHalves(canonical, snapshot);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* The values with the second half of each undirected edge of a directed graph given its first half's value: the file
|
|
200
|
+
* holds the edge once, its program draws it once, and the import read the element's values onto the first half.
|
|
201
|
+
* @param truth - the values read
|
|
202
|
+
* @param snapshot - the graph
|
|
203
|
+
* @returns the values
|
|
204
|
+
*/
|
|
205
|
+
function withPairedHalves(truth: StyleTruth, snapshot: GraphSnapshot): StyleTruth {
|
|
206
|
+
const pair = snapshot.edges.byRole("pair");
|
|
207
|
+
if (pair === null) {
|
|
208
|
+
return truth;
|
|
209
|
+
}
|
|
210
|
+
const values: Partial<Record<StyleProperty, StyleColumn>> = {};
|
|
211
|
+
for (const [property, col] of Object.entries(truth.edge.values) as [StyleProperty, StyleColumn | undefined][]) {
|
|
212
|
+
if (col === undefined) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const out = [...col];
|
|
216
|
+
for (let e = 0; e < out.length; e++) {
|
|
217
|
+
const first = pair.isSet(e) ? (pair.value(e) as number) : e;
|
|
218
|
+
if (first < e) {
|
|
219
|
+
out[e] = col[first] ?? null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
values[property] = out;
|
|
223
|
+
}
|
|
224
|
+
return { ...truth, edge: { ...truth.edge, values } };
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* A graph attribute's value, or undefined.
|
|
229
|
+
* @param snapshot - the graph
|
|
230
|
+
* @param name - the attribute
|
|
231
|
+
* @returns its value
|
|
232
|
+
*/
|
|
233
|
+
function graphValue(snapshot: GraphSnapshot, name: string): unknown {
|
|
234
|
+
return snapshot.graph.has(name) ? plainCell(snapshot.graph.value(name, 0)) : undefined;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Styles holding nothing but notes.
|
|
239
|
+
* @param format - the format
|
|
240
|
+
* @param notes - the notes
|
|
241
|
+
* @param snapshot - the graph
|
|
242
|
+
* @param fingerprint - its fingerprint
|
|
243
|
+
* @returns the styles
|
|
244
|
+
*/
|
|
245
|
+
function emptyStyles(
|
|
246
|
+
format: string,
|
|
247
|
+
notes: readonly StyleNote[],
|
|
248
|
+
snapshot: GraphSnapshot,
|
|
249
|
+
fingerprint: ExtractedStyles["fingerprint"],
|
|
250
|
+
): ExtractedStyles {
|
|
251
|
+
return {
|
|
252
|
+
styles: {
|
|
253
|
+
version: 1,
|
|
254
|
+
source: { format, dialect: null, tool: null },
|
|
255
|
+
units: { length: "px" },
|
|
256
|
+
graph: {},
|
|
257
|
+
rules: [],
|
|
258
|
+
notes,
|
|
259
|
+
},
|
|
260
|
+
columns: { node: new Map(), edge: new Map() },
|
|
261
|
+
features: { node: featuresOf(snapshot, "node"), edge: featuresOf(snapshot, "edge") },
|
|
262
|
+
fingerprint,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* An importer's styles as canonical values: the advanced path as it is, the simple path read and canonicalized.
|
|
268
|
+
* @param got - what the importer's `styles()` returned
|
|
269
|
+
* @param snapshot - the graph
|
|
270
|
+
* @param notes - where problems are noted
|
|
271
|
+
* @param budget - the work budget
|
|
272
|
+
* @param signal - cancels the work
|
|
273
|
+
* @returns the canonical values
|
|
274
|
+
*/
|
|
275
|
+
function canonicalOf(
|
|
276
|
+
got: ImporterStyles,
|
|
277
|
+
snapshot: GraphSnapshot,
|
|
278
|
+
notes: StyleNotes,
|
|
279
|
+
budget: StyleBudget,
|
|
280
|
+
signal: AbortSignal | undefined,
|
|
281
|
+
): StyleTruth {
|
|
282
|
+
if ("canonical" in got) {
|
|
283
|
+
return {
|
|
284
|
+
dialect: got.dialect ?? null,
|
|
285
|
+
tool: got.tool ?? null,
|
|
286
|
+
units: got.units ?? "px",
|
|
287
|
+
graph: got.graph ?? {},
|
|
288
|
+
node: got.node ?? { values: {} },
|
|
289
|
+
edge: got.edge ?? { values: {} },
|
|
290
|
+
raw: { node: got.readFrom?.node ?? [], edge: got.readFrom?.edge ?? [] },
|
|
291
|
+
notes: got.notes ?? [],
|
|
292
|
+
block: got.block ?? null,
|
|
293
|
+
opacityInColor: got.opacityInColor === true,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
const { dialect } = got;
|
|
297
|
+
const raw = { node: [] as string[], edge: [] as string[] };
|
|
298
|
+
const out = { node: { values: {} } as ReaderOutput, edge: { values: {} } as ReaderOutput };
|
|
299
|
+
for (const target of TARGETS) {
|
|
300
|
+
const given = got[target];
|
|
301
|
+
if (given === undefined) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const columns = new Map<string, readonly unknown[]>();
|
|
305
|
+
for (const [property, source] of Object.entries(given)) {
|
|
306
|
+
signal?.throwIfAborted();
|
|
307
|
+
const values = rawValues(snapshot, target, property, source, notes, raw[target]);
|
|
308
|
+
if (values !== null) {
|
|
309
|
+
columns.set(property, values);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
out[target] = { values: canonicalize(target, columns, dialect, count(snapshot, target), notes, budget) };
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
dialect,
|
|
316
|
+
tool: null,
|
|
317
|
+
units: styleLengthUnit(dialect),
|
|
318
|
+
graph: {},
|
|
319
|
+
node: out.node,
|
|
320
|
+
edge: out.edge,
|
|
321
|
+
raw,
|
|
322
|
+
notes: [],
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* The element count of a target.
|
|
328
|
+
* @param snapshot - the graph
|
|
329
|
+
* @param target - nodes or edges
|
|
330
|
+
* @returns the count
|
|
331
|
+
*/
|
|
332
|
+
function count(snapshot: GraphSnapshot, target: StyleTarget): number {
|
|
333
|
+
return target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* The raw values of one property on the simple path: a snapshot column by name, or an array by element index.
|
|
338
|
+
* @param snapshot - the graph
|
|
339
|
+
* @param target - nodes or edges
|
|
340
|
+
* @param property - the property
|
|
341
|
+
* @param source - `{ data: "<column>" }` or an array
|
|
342
|
+
* @param notes - where a missing column is noted
|
|
343
|
+
* @param raw - collects the names of the columns read
|
|
344
|
+
* @returns the values, or null
|
|
345
|
+
*/
|
|
346
|
+
function rawValues(
|
|
347
|
+
snapshot: GraphSnapshot,
|
|
348
|
+
target: StyleTarget,
|
|
349
|
+
property: string,
|
|
350
|
+
source: unknown,
|
|
351
|
+
notes: StyleNotes,
|
|
352
|
+
raw: string[],
|
|
353
|
+
): readonly unknown[] | null {
|
|
354
|
+
if (Array.isArray(source)) {
|
|
355
|
+
return source as unknown[];
|
|
356
|
+
}
|
|
357
|
+
if (source === null || typeof source !== "object" || typeof (source as { data?: unknown }).data !== "string") {
|
|
358
|
+
notes.add(STYLE_ISSUE.BAD_MAPPING, target, property, { sample: source });
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
const name = (source as { data: string }).data;
|
|
362
|
+
const table = target === "node" ? snapshot.nodes : snapshot.edges;
|
|
363
|
+
if (!table.has(name)) {
|
|
364
|
+
notes.add(STYLE_ISSUE.MAPPING_COLUMN_MISSING, target, property, { sample: name });
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
raw.push(name);
|
|
368
|
+
const n = count(snapshot, target);
|
|
369
|
+
const out = new Array<unknown>(n);
|
|
370
|
+
for (let i = 0; i < n; i++) {
|
|
371
|
+
out[i] = plainCell(table.value(name, i));
|
|
372
|
+
}
|
|
373
|
+
return out;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Canonical values of every property of one target. A list value is read as its first item. A color's alpha moves
|
|
378
|
+
* into the fill's or the edge's opacity (multiplied with an opacity the file also states) or is dropped with a note.
|
|
379
|
+
* @param target - nodes or edges
|
|
380
|
+
* @param columns - the raw values per property
|
|
381
|
+
* @param dialect - how they are spelled
|
|
382
|
+
* @param n - the element count
|
|
383
|
+
* @param notes - where problems are noted
|
|
384
|
+
* @param budget - the work budget
|
|
385
|
+
* @returns the canonical values per property
|
|
386
|
+
*/
|
|
387
|
+
function canonicalize(
|
|
388
|
+
target: StyleTarget,
|
|
389
|
+
columns: ReadonlyMap<string, readonly unknown[]>,
|
|
390
|
+
dialect: StyleDialect,
|
|
391
|
+
n: number,
|
|
392
|
+
notes: StyleNotes,
|
|
393
|
+
budget: StyleBudget,
|
|
394
|
+
): Record<string, StyleColumn> {
|
|
395
|
+
const cx: CanonContext = { target, dialect, n, notes, budget };
|
|
396
|
+
// keyed by the importer's property names: no prototype, so `__proto__` is a property like any other
|
|
397
|
+
const out: Record<string, (StyleValue | null)[]> = Object.create(null) as Record<string, (StyleValue | null)[]>;
|
|
398
|
+
const alphas = new Map<string, (number | null)[]>();
|
|
399
|
+
for (const [property, raws] of columns) {
|
|
400
|
+
const { col, alpha } = canonicalColumn(cx, property, raws);
|
|
401
|
+
out[property] = col;
|
|
402
|
+
if (alpha !== null) {
|
|
403
|
+
alphas.set(property, alpha);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
for (const [property, alpha] of alphas) {
|
|
407
|
+
moveAlpha(cx, out, property, alpha);
|
|
408
|
+
}
|
|
409
|
+
return out;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/** What canonicalize() reads one target's values with. */
|
|
413
|
+
interface CanonContext {
|
|
414
|
+
readonly target: StyleTarget;
|
|
415
|
+
readonly dialect: StyleDialect;
|
|
416
|
+
/** The element count. */
|
|
417
|
+
readonly n: number;
|
|
418
|
+
readonly notes: StyleNotes;
|
|
419
|
+
readonly budget: StyleBudget;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Canonical values of one property; a color's alpha below 1 is kept apart.
|
|
424
|
+
* @param cx - the target being read
|
|
425
|
+
* @param property - the property
|
|
426
|
+
* @param raws - its raw values
|
|
427
|
+
* @returns the values, and the alphas (null when every color is opaque)
|
|
428
|
+
*/
|
|
429
|
+
function canonicalColumn(
|
|
430
|
+
cx: CanonContext,
|
|
431
|
+
property: string,
|
|
432
|
+
raws: readonly unknown[],
|
|
433
|
+
): { col: (StyleValue | null)[]; alpha: (number | null)[] | null } {
|
|
434
|
+
const { target, dialect, n, notes, budget } = cx;
|
|
435
|
+
const kind = STYLE_PROPERTIES[target].get(property);
|
|
436
|
+
const col = new Array<StyleValue | null>(n).fill(null);
|
|
437
|
+
let alpha: (number | null)[] | null = null;
|
|
438
|
+
for (let i = 0; i < n && i < raws.length; i++) {
|
|
439
|
+
const site: CanonSite = { notes, target, property, element: i, budget };
|
|
440
|
+
const v = firstItem(raws[i], site);
|
|
441
|
+
if (v === null || v === undefined) {
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
if (kind !== "color") {
|
|
445
|
+
col[i] = canonValue(kind, property, v, dialect, site);
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
const c = canonColor(v, dialect, site, { use: colorUse(target, property) });
|
|
449
|
+
col[i] = c?.color ?? null;
|
|
450
|
+
if (c !== null && c.alpha < 1) {
|
|
451
|
+
alpha ??= new Array<number | null>(n).fill(null);
|
|
452
|
+
alpha[i] = c.alpha;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
return { col, alpha };
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* A raw value, a list read as its first item (a longer list noted).
|
|
460
|
+
* @param v - the raw value
|
|
461
|
+
* @param site - where it was read
|
|
462
|
+
* @returns the value
|
|
463
|
+
*/
|
|
464
|
+
function firstItem(v: unknown, site: CanonSite): unknown {
|
|
465
|
+
if (!Array.isArray(v)) {
|
|
466
|
+
return v;
|
|
467
|
+
}
|
|
468
|
+
if (v.length > 1) {
|
|
469
|
+
site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, { sample: v, element: site.element });
|
|
470
|
+
}
|
|
471
|
+
return v.length === 0 ? null : v[0];
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Moves a color property's alphas into its opacity (multiplied with an opacity the file also states), or drops them
|
|
476
|
+
* with a note where the property has none.
|
|
477
|
+
* @param cx - the target being read
|
|
478
|
+
* @param out - the canonical values, changed in place
|
|
479
|
+
* @param property - the color property
|
|
480
|
+
* @param alpha - its alphas
|
|
481
|
+
*/
|
|
482
|
+
function moveAlpha(
|
|
483
|
+
cx: CanonContext,
|
|
484
|
+
out: Record<string, (StyleValue | null)[]>,
|
|
485
|
+
property: string,
|
|
486
|
+
alpha: readonly (number | null)[],
|
|
487
|
+
): void {
|
|
488
|
+
const { target, n, notes, budget } = cx;
|
|
489
|
+
const carrier = OPACITY_OF.get(`${target}.${property}`) ?? null;
|
|
490
|
+
let opacity: (StyleValue | null)[] | null = null;
|
|
491
|
+
if (carrier !== null) {
|
|
492
|
+
out[carrier] ??= new Array<StyleValue | null>(n).fill(null);
|
|
493
|
+
opacity = out[carrier];
|
|
494
|
+
}
|
|
495
|
+
for (let i = 0; i < n; i++) {
|
|
496
|
+
const a = alpha[i];
|
|
497
|
+
if (a === null) {
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
const site: CanonSite = { notes, target, property, element: i, budget };
|
|
501
|
+
const stated = opacity === null ? null : (opacity[i] as number | null);
|
|
502
|
+
const merged = colorOpacity(
|
|
503
|
+
{ color: out[property][i] as `#${string}`, alpha: a },
|
|
504
|
+
stated,
|
|
505
|
+
site,
|
|
506
|
+
opacity !== null,
|
|
507
|
+
);
|
|
508
|
+
if (opacity !== null) {
|
|
509
|
+
opacity[i] = merged;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/** The opacity property that carries a color's alpha: a node's fill and an edge's line. */
|
|
515
|
+
const OPACITY_OF: ReadonlyMap<string, string> = new Map([
|
|
516
|
+
["node.fill", "fillOpacity"],
|
|
517
|
+
["edge.color", "opacity"],
|
|
518
|
+
]);
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* How a color is drawn, which decides how a Graphviz color list is read.
|
|
522
|
+
* @param target - nodes or edges
|
|
523
|
+
* @param property - the property
|
|
524
|
+
* @returns the use
|
|
525
|
+
*/
|
|
526
|
+
function colorUse(target: StyleTarget, property: string): "fill" | "edge" | "line" {
|
|
527
|
+
if (property === "fill") {
|
|
528
|
+
return "fill";
|
|
529
|
+
}
|
|
530
|
+
return target === "edge" && property === "color" ? "edge" : "line";
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* The canonical value of a property that is not a color.
|
|
535
|
+
* @param kind - the property's value kind, or undefined for a property outside the vocabulary
|
|
536
|
+
* @param property - the property
|
|
537
|
+
* @param raw - the raw value
|
|
538
|
+
* @param dialect - how it is spelled
|
|
539
|
+
* @param site - where it was read
|
|
540
|
+
* @returns the value, or null
|
|
541
|
+
*/
|
|
542
|
+
function canonValue(
|
|
543
|
+
kind: string | undefined,
|
|
544
|
+
property: string,
|
|
545
|
+
raw: unknown,
|
|
546
|
+
dialect: StyleDialect,
|
|
547
|
+
site: CanonSite,
|
|
548
|
+
): StyleValue | null {
|
|
549
|
+
switch (kind) {
|
|
550
|
+
case "number":
|
|
551
|
+
return canonNumber(
|
|
552
|
+
raw,
|
|
553
|
+
site,
|
|
554
|
+
dialect === "graphviz" && (property === "width" || property === "height") ? DOT_POINTS_PER_INCH : 1,
|
|
555
|
+
);
|
|
556
|
+
case "opacity":
|
|
557
|
+
return canonOpacity(raw, dialect, site);
|
|
558
|
+
case "boolean":
|
|
559
|
+
return canonBoolean(raw, site);
|
|
560
|
+
case "text":
|
|
561
|
+
return canonText(raw, site);
|
|
562
|
+
case undefined:
|
|
563
|
+
// a property only one consumer draws (graphty:<channel>) is carried as it is
|
|
564
|
+
return typeof raw === "string" ||
|
|
565
|
+
typeof raw === "boolean" ||
|
|
566
|
+
(typeof raw === "number" && Number.isFinite(raw))
|
|
567
|
+
? raw
|
|
568
|
+
: null;
|
|
569
|
+
default:
|
|
570
|
+
return ENUM_KINDS.has(kind) ? canonEnum(kind as StyleEnumKind, raw, dialect, site) : null;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/** The style roles and the property each sets, per target; `size` sets a node's width and height. */
|
|
575
|
+
const ROLE_PROPERTIES: Readonly<Record<StyleTarget, readonly (readonly [string, readonly string[]])[]>> = {
|
|
576
|
+
node: [
|
|
577
|
+
["color", ["fill"]],
|
|
578
|
+
["size", ["width", "height"]],
|
|
579
|
+
["shape", ["shape"]],
|
|
580
|
+
["hidden", ["visible"]],
|
|
581
|
+
],
|
|
582
|
+
edge: [
|
|
583
|
+
["color", ["color"]],
|
|
584
|
+
["thickness", ["width"]],
|
|
585
|
+
["shape", ["lineStyle"]],
|
|
586
|
+
["hidden", ["visible"]],
|
|
587
|
+
],
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* The generic reader: the styles of the columns whose role is `color`, `size`, `shape`, `thickness` or `hidden`, so a
|
|
592
|
+
* format that tags its style columns needs no reader of its own. A color column holds CSS text or channel numbers
|
|
593
|
+
* (0..1 in a float column, 0..255 otherwise, with an optional alpha); a hidden column holds booleans.
|
|
594
|
+
* @param snapshot - the graph
|
|
595
|
+
* @param dialect - how text values are spelled (the format's name; CSS for a format with no dialect of its own)
|
|
596
|
+
* @param notes - where problems are noted
|
|
597
|
+
* @param budget - the work budget
|
|
598
|
+
* @returns the canonical values, or null when no column has a style role
|
|
599
|
+
*/
|
|
600
|
+
function roleStyles(
|
|
601
|
+
snapshot: GraphSnapshot,
|
|
602
|
+
dialect: StyleDialect,
|
|
603
|
+
notes: StyleNotes,
|
|
604
|
+
budget: StyleBudget,
|
|
605
|
+
): StyleTruth | null {
|
|
606
|
+
const raw = { node: [] as string[], edge: [] as string[] };
|
|
607
|
+
const out = { node: { values: {} } as ReaderOutput, edge: { values: {} } as ReaderOutput };
|
|
608
|
+
for (const target of TARGETS) {
|
|
609
|
+
const table = target === "node" ? snapshot.nodes : snapshot.edges;
|
|
610
|
+
const n = count(snapshot, target);
|
|
611
|
+
const columns = new Map<string, readonly unknown[]>();
|
|
612
|
+
for (const [role, properties] of ROLE_PROPERTIES[target]) {
|
|
613
|
+
const col = table.byRole(role);
|
|
614
|
+
if (col === null) {
|
|
615
|
+
continue;
|
|
616
|
+
}
|
|
617
|
+
raw[target].push(col.meta.name);
|
|
618
|
+
const vals = roleValues(table, col.meta, role, n);
|
|
619
|
+
for (const p of properties) {
|
|
620
|
+
columns.set(p, vals);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
out[target] = { values: canonicalize(target, columns, dialect, n, notes, budget) };
|
|
624
|
+
}
|
|
625
|
+
if (raw.node.length === 0 && raw.edge.length === 0) {
|
|
626
|
+
return null;
|
|
627
|
+
}
|
|
628
|
+
return {
|
|
629
|
+
dialect,
|
|
630
|
+
tool: null,
|
|
631
|
+
units: styleLengthUnit(dialect),
|
|
632
|
+
graph: {},
|
|
633
|
+
node: out.node,
|
|
634
|
+
edge: out.edge,
|
|
635
|
+
raw,
|
|
636
|
+
notes: [],
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* A role column's raw values: a color as text, a hidden flag as the visibility it says the opposite of.
|
|
642
|
+
* @param table - the node or edge table
|
|
643
|
+
* @param meta - the column's name and dtype
|
|
644
|
+
* @param meta.name - the column's name
|
|
645
|
+
* @param meta.dtype - its dtype
|
|
646
|
+
* @param role - its role
|
|
647
|
+
* @param n - the element count
|
|
648
|
+
* @returns the values
|
|
649
|
+
*/
|
|
650
|
+
function roleValues(
|
|
651
|
+
table: GraphSnapshot["nodes"],
|
|
652
|
+
meta: { readonly name: string; readonly dtype: string },
|
|
653
|
+
role: string,
|
|
654
|
+
n: number,
|
|
655
|
+
): unknown[] {
|
|
656
|
+
return Array.from({ length: n }, (_, i) => {
|
|
657
|
+
const v = plainCell(table.value(meta.name, i));
|
|
658
|
+
if (role === "color") {
|
|
659
|
+
return channelsColor(v, meta.dtype);
|
|
660
|
+
}
|
|
661
|
+
if (role === "hidden") {
|
|
662
|
+
return typeof v === "boolean" ? !v : null;
|
|
663
|
+
}
|
|
664
|
+
return v;
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* A color cell as text: channel numbers become `rgba()` (floats 0..1, integers 0..255); text stays as it is.
|
|
670
|
+
* @param v - the cell
|
|
671
|
+
* @param dtype - the column's dtype
|
|
672
|
+
* @returns the color's text, or the cell unchanged
|
|
673
|
+
*/
|
|
674
|
+
function channelsColor(v: unknown, dtype: string): unknown {
|
|
675
|
+
if (
|
|
676
|
+
!Array.isArray(v) ||
|
|
677
|
+
(v.length !== 3 && v.length !== 4) ||
|
|
678
|
+
!v.every((x) => typeof x === "number" && Number.isFinite(x))
|
|
679
|
+
) {
|
|
680
|
+
return v;
|
|
681
|
+
}
|
|
682
|
+
const scale = dtype === "f32" || dtype === "f64" ? 255 : 1;
|
|
683
|
+
const [r, g, b] = (v as number[]).map((x) => Math.round(x * scale));
|
|
684
|
+
const alphaScale = scale === 255 ? 1 : 255;
|
|
685
|
+
const a = v.length === 4 ? (v[3] as number) / alphaScale : 1;
|
|
686
|
+
return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${String(a)})`;
|
|
687
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading and writing styles through the importer and exporter contracts: the `graphty.styles` block, the generic
|
|
3
|
+
* reader of style roles, and what an exporter receives when styles are written.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
blockStyles,
|
|
8
|
+
MAX_STYLE_BLOCK_LENGTH,
|
|
9
|
+
type ParsedStyleBlock,
|
|
10
|
+
parseStyleBlock,
|
|
11
|
+
STYLE_BLOCK_NAME,
|
|
12
|
+
type StyleBlock,
|
|
13
|
+
styleTag,
|
|
14
|
+
writeStyleBlock,
|
|
15
|
+
type WriteStyleBlockOptions,
|
|
16
|
+
} from "./block.js";
|
|
17
|
+
export { extractStyles, type ExtractStylesOptions, type StyleImportOptions } from "./generic.js";
|
|
18
|
+
export { type ExporterStyleInput, type ExporterStyleOptions } from "./writer.js";
|