@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,624 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical colors: lowercase `#rrggbb` plus an alpha from 0 to 1, read in the namespace of the file's dialect. The
|
|
3
|
+
* alpha never stays in the color: `colorOpacity()` moves it into the property's opacity or drops it with a note.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { STYLE_ISSUE } from "../codes.js";
|
|
7
|
+
import type { StyleColor, StyleDialect } from "../types.js";
|
|
8
|
+
import { CSS_COLORS, DVIPS_COLORS, JAVA_COLORS } from "./color-tables.js";
|
|
9
|
+
import { graphvizColor, type GraphvizColorUse } from "./graphviz.js";
|
|
10
|
+
import { num6 } from "./number.js";
|
|
11
|
+
import { type CanonSite, noteAt, scalarText, spendAt } from "./site.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A canonical color and the alpha the file gave it.
|
|
15
|
+
* @category Styles
|
|
16
|
+
*/
|
|
17
|
+
export interface CanonColor {
|
|
18
|
+
/** Lowercase `#rrggbb`. */
|
|
19
|
+
readonly color: StyleColor;
|
|
20
|
+
/** 0..1 at 6 significant digits; 1 when the file gave none. */
|
|
21
|
+
readonly alpha: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Options of `canonColor()`.
|
|
26
|
+
* @category Styles
|
|
27
|
+
*/
|
|
28
|
+
export interface CanonColorOptions {
|
|
29
|
+
/** Graphviz only: the object's `colorscheme`. */
|
|
30
|
+
readonly scheme?: string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Graphviz only: how the value is drawn, which decides how a color list is read (`line` for an outline or a
|
|
33
|
+
* font color, `fill`, or `edge` for an edge's line); defaults to `line`.
|
|
34
|
+
*/
|
|
35
|
+
readonly use?: GraphvizColorUse;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A byte as two hex digits, clamped and rounded.
|
|
40
|
+
* @param v - a channel 0..255
|
|
41
|
+
* @returns two lowercase hex digits
|
|
42
|
+
*/
|
|
43
|
+
function hex2(v: number): string {
|
|
44
|
+
return Math.max(0, Math.min(255, Math.round(v)))
|
|
45
|
+
.toString(16)
|
|
46
|
+
.padStart(2, "0");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* `#rrggbb` from channels 0..255.
|
|
51
|
+
* @param r - red
|
|
52
|
+
* @param g - green
|
|
53
|
+
* @param b - blue
|
|
54
|
+
* @returns the color
|
|
55
|
+
*/
|
|
56
|
+
function rgbHex(r: number, g: number, b: number): StyleColor {
|
|
57
|
+
return `#${hex2(r)}${hex2(g)}${hex2(b)}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* An alpha clamped to 0..1 at 6 significant digits.
|
|
62
|
+
* @param a - the alpha
|
|
63
|
+
* @returns the canonical alpha
|
|
64
|
+
*/
|
|
65
|
+
function alpha01(a: number): number {
|
|
66
|
+
return num6(Math.max(0, Math.min(1, a)));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ------------------------------------------------------------ CSS Color 4 gamut mapping, as graphty-element draws
|
|
70
|
+
|
|
71
|
+
type Vec3 = readonly [number, number, number];
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A 3x3 matrix times a vector.
|
|
75
|
+
* @param m - the matrix, row by row
|
|
76
|
+
* @param v - the vector
|
|
77
|
+
* @returns m * v
|
|
78
|
+
*/
|
|
79
|
+
function mul(m: readonly Vec3[], v: Vec3): Vec3 {
|
|
80
|
+
return [
|
|
81
|
+
m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2],
|
|
82
|
+
m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2],
|
|
83
|
+
m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2],
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const LIN_TO_XYZ: readonly Vec3[] = [
|
|
88
|
+
[0.41239079926595934, 0.357584339383878, 0.1804807884018343],
|
|
89
|
+
[0.21263900587151027, 0.715168678767756, 0.07219231536073371],
|
|
90
|
+
[0.01933081871559182, 0.11919477979462598, 0.9505321522496607],
|
|
91
|
+
];
|
|
92
|
+
const XYZ_TO_LIN: readonly Vec3[] = [
|
|
93
|
+
[3.2409699419045226, -1.537383177570094, -0.4986107602930034],
|
|
94
|
+
[-0.9692436362808796, 1.8759675015077202, 0.04155505740717559],
|
|
95
|
+
[0.05563007969699366, -0.20397695888897652, 1.0569715142428786],
|
|
96
|
+
];
|
|
97
|
+
const XYZ_TO_LMS: readonly Vec3[] = [
|
|
98
|
+
[0.819022437996703, 0.3619062600528904, -0.1288737815209879],
|
|
99
|
+
[0.0329836539323885, 0.929286861586343, 0.0361446663506424],
|
|
100
|
+
[0.0481771893596242, 0.2642395317527308, 0.6335478284694309],
|
|
101
|
+
];
|
|
102
|
+
const LMS_TO_XYZ: readonly Vec3[] = [
|
|
103
|
+
[1.2268798758459243, -0.5578149944602171, 0.2813910456659647],
|
|
104
|
+
[-0.0405757452148008, 1.112286803280317, -0.0717110580655164],
|
|
105
|
+
[-0.0763729366746601, -0.4214933324022432, 1.5869240198367816],
|
|
106
|
+
];
|
|
107
|
+
const LMS_TO_LAB: readonly Vec3[] = [
|
|
108
|
+
[0.210454268309314, 0.7936177747023054, -0.0040720430116193],
|
|
109
|
+
[1.9779985324311684, -2.42859224204858, 0.450593709617411],
|
|
110
|
+
[0.0259040424655478, 0.7827717124575296, -0.8086757549230774],
|
|
111
|
+
];
|
|
112
|
+
const LAB_TO_LMS: readonly Vec3[] = [
|
|
113
|
+
[1, 0.3963377773761749, 0.2158037573099136],
|
|
114
|
+
[1, -0.1055613458156586, -0.0638541728258133],
|
|
115
|
+
[1, -0.0894841775298119, -1.2914855480194092],
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* sRGB (0..1, possibly out of range) to OKLab.
|
|
120
|
+
* @param rgb - the channels
|
|
121
|
+
* @returns L, a, b
|
|
122
|
+
*/
|
|
123
|
+
function srgbToOklab(rgb: Vec3): Vec3 {
|
|
124
|
+
const lin = rgb.map((c) => {
|
|
125
|
+
const a = Math.abs(c);
|
|
126
|
+
return Math.sign(c) * (a <= 0.04045 ? a / 12.92 : ((a + 0.055) / 1.055) ** 2.4);
|
|
127
|
+
}) as unknown as Vec3;
|
|
128
|
+
const lms = mul(XYZ_TO_LMS, mul(LIN_TO_XYZ, lin));
|
|
129
|
+
return mul(LMS_TO_LAB, lms.map(Math.cbrt) as unknown as Vec3);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* OKLab to sRGB (0..1, possibly out of range).
|
|
134
|
+
* @param lab - L, a, b
|
|
135
|
+
* @returns the channels
|
|
136
|
+
*/
|
|
137
|
+
function oklabToSrgb(lab: Vec3): Vec3 {
|
|
138
|
+
const lms = mul(LAB_TO_LMS, lab).map((c) => c ** 3) as unknown as Vec3;
|
|
139
|
+
return mul(XYZ_TO_LIN, mul(LMS_TO_XYZ, lms)).map((c) => {
|
|
140
|
+
const a = Math.abs(c);
|
|
141
|
+
return Math.sign(c) * (a > 0.0031308 ? 1.055 * a ** (1 / 2.4) - 0.055 : 12.92 * a);
|
|
142
|
+
}) as unknown as Vec3;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Whether sRGB channels are within 0..1.
|
|
147
|
+
* @param rgb - the channels
|
|
148
|
+
* @returns true when every channel is in range
|
|
149
|
+
*/
|
|
150
|
+
function inGamut(rgb: Vec3): boolean {
|
|
151
|
+
return rgb.every((c) => c >= 0 && c <= 1);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Clamps sRGB channels to 0..1.
|
|
156
|
+
* @param rgb - the channels
|
|
157
|
+
* @returns the clamped channels
|
|
158
|
+
*/
|
|
159
|
+
function clip(rgb: Vec3): Vec3 {
|
|
160
|
+
return rgb.map((c) => Math.max(0, Math.min(1, c))) as unknown as Vec3;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Distance in OKLab.
|
|
165
|
+
* @param p - one color
|
|
166
|
+
* @param q - the other
|
|
167
|
+
* @returns delta E OK
|
|
168
|
+
*/
|
|
169
|
+
function deltaEOK(p: Vec3, q: Vec3): number {
|
|
170
|
+
return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2]);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* CSS Color 4's gamut mapping into sRGB: chroma is reduced in OKLCh until clipping changes the color by less than
|
|
175
|
+
* a just noticeable difference. It is what graphty-element's color parser does with an out-of-range `rgb()` or
|
|
176
|
+
* `hsl()`, so a canonical color equals the color graphty-element draws for the same text.
|
|
177
|
+
* @param rgb - sRGB channels 0..1, possibly out of range
|
|
178
|
+
* @returns channels within 0..1
|
|
179
|
+
*/
|
|
180
|
+
function toGamut(rgb: Vec3): Vec3 {
|
|
181
|
+
if (inGamut(rgb)) {
|
|
182
|
+
return rgb;
|
|
183
|
+
}
|
|
184
|
+
const JND = 0.02;
|
|
185
|
+
const [l, a, b] = srgbToOklab(rgb);
|
|
186
|
+
if (l >= 1) {
|
|
187
|
+
return [1, 1, 1];
|
|
188
|
+
}
|
|
189
|
+
if (l <= 0) {
|
|
190
|
+
return [0, 0, 0];
|
|
191
|
+
}
|
|
192
|
+
// The hue in degrees and back, as graphty-element's OKLCh does, so channels on a rounding edge round the same way.
|
|
193
|
+
const achromatic = Math.abs(a) < 0.0002 && Math.abs(b) < 0.0002;
|
|
194
|
+
const degrees = ((((Math.atan2(b, a) * 180) / Math.PI) % 360) + 360) % 360;
|
|
195
|
+
const at = (chroma: number): Vec3 =>
|
|
196
|
+
achromatic
|
|
197
|
+
? [l, 0, 0]
|
|
198
|
+
: [l, chroma * Math.cos((degrees * Math.PI) / 180), chroma * Math.sin((degrees * Math.PI) / 180)];
|
|
199
|
+
const chroma0 = Math.sqrt(a ** 2 + b ** 2); // NOSONAR(S7769): colorjs.io's own formula, so chroma matches it bit for bit
|
|
200
|
+
const first = oklabToSrgb(at(chroma0));
|
|
201
|
+
if (inGamut(first)) {
|
|
202
|
+
return first;
|
|
203
|
+
}
|
|
204
|
+
const clipped = clip(first);
|
|
205
|
+
if (deltaEOK(srgbToOklab(clipped), at(chroma0)) < JND) {
|
|
206
|
+
// Clipping is close enough: clip the channels as given, without the round trip's rounding noise.
|
|
207
|
+
return clip(rgb);
|
|
208
|
+
}
|
|
209
|
+
return bisectChroma(at, chroma0, clipped);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* CSS Color 4's chroma bisection: the largest chroma whose clipped color is within a just noticeable difference.
|
|
214
|
+
* A bisection: log2(chroma / EPSILON) rounds, about 30 for the most extreme finite input.
|
|
215
|
+
* @param at - the OKLab color of a chroma at the color's lightness and hue
|
|
216
|
+
* @param chroma0 - the color's own chroma
|
|
217
|
+
* @param first - the clipped color at that chroma
|
|
218
|
+
* @returns the clipped color found
|
|
219
|
+
*/
|
|
220
|
+
function bisectChroma(at: (chroma: number) => Vec3, chroma0: number, first: Vec3): Vec3 {
|
|
221
|
+
const JND = 0.02;
|
|
222
|
+
const EPSILON = 0.0001;
|
|
223
|
+
let clipped = first;
|
|
224
|
+
let min = 0;
|
|
225
|
+
let max = chroma0;
|
|
226
|
+
let minInGamut = true;
|
|
227
|
+
while (max - min > EPSILON) {
|
|
228
|
+
const chroma = (min + max) / 2;
|
|
229
|
+
const current = at(chroma);
|
|
230
|
+
const rgbNow = oklabToSrgb(current);
|
|
231
|
+
if (minInGamut && inGamut(rgbNow)) {
|
|
232
|
+
min = chroma;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
clipped = clip(rgbNow);
|
|
236
|
+
const e = deltaEOK(srgbToOklab(clipped), current);
|
|
237
|
+
if (e >= JND) {
|
|
238
|
+
max = chroma;
|
|
239
|
+
} else if (JND - e < EPSILON) {
|
|
240
|
+
break;
|
|
241
|
+
} else {
|
|
242
|
+
minInGamut = false;
|
|
243
|
+
min = chroma;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return clipped;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* sRGB channels 0..1 (after gamut mapping) as `#rrggbb`.
|
|
251
|
+
* @param rgb - the channels
|
|
252
|
+
* @returns the color
|
|
253
|
+
*/
|
|
254
|
+
function srgbHex(rgb: Vec3): StyleColor {
|
|
255
|
+
const [r, g, b] = toGamut(rgb);
|
|
256
|
+
return rgbHex(r * 255, g * 255, b * 255);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ------------------------------------------------------------ CSS functional notation
|
|
260
|
+
|
|
261
|
+
/** One CSS number, without its unit. */
|
|
262
|
+
const CSS_NUMBER = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
|
|
263
|
+
|
|
264
|
+
/** A CSS number's unit: a percentage or an angle. */
|
|
265
|
+
const CSS_UNIT = /(%|deg|grad|rad|turn)$/i;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Splits a functional color's arguments: commas or blanks, with an optional `/` before the alpha.
|
|
269
|
+
* @param body - the text between the parentheses
|
|
270
|
+
* @returns the arguments and the alpha argument, or null when malformed
|
|
271
|
+
*/
|
|
272
|
+
function cssArgs(body: string): { parts: string[]; alpha: string | undefined } | null {
|
|
273
|
+
const slash = body.split("/");
|
|
274
|
+
if (slash.length > 2) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
const parts = slash[0].split(/[\s,]+/).filter((p) => p !== "");
|
|
278
|
+
let alpha = slash.length === 2 ? slash[1].trim() : undefined;
|
|
279
|
+
if (alpha === undefined && parts.length === 4) {
|
|
280
|
+
alpha = parts.pop();
|
|
281
|
+
}
|
|
282
|
+
return parts.length === 3 && alpha !== "" ? { parts, alpha } : null;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Reads one CSS number.
|
|
287
|
+
* @param text - the argument
|
|
288
|
+
* @returns the value and its unit (lowercase, "" for none), or null
|
|
289
|
+
*/
|
|
290
|
+
function cssNumber(text: string): { value: number; unit: string } | null {
|
|
291
|
+
const unit = CSS_UNIT.exec(text)?.[1] ?? "";
|
|
292
|
+
const number = text.slice(0, text.length - unit.length);
|
|
293
|
+
if (!CSS_NUMBER.test(number)) {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
const value = Number(number);
|
|
297
|
+
return Number.isFinite(value) ? { value, unit: unit.toLowerCase() } : null;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Reads a CSS alpha: a number 0..1 or a percentage, clamped.
|
|
302
|
+
* @param text - the argument, or undefined for none
|
|
303
|
+
* @returns the alpha, or null when malformed
|
|
304
|
+
*/
|
|
305
|
+
function cssAlpha(text: string | undefined): number | null {
|
|
306
|
+
if (text === undefined) {
|
|
307
|
+
return 1;
|
|
308
|
+
}
|
|
309
|
+
const n = cssNumber(text);
|
|
310
|
+
if (n === null || (n.unit !== "" && n.unit !== "%")) {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
return alpha01(n.unit === "%" ? n.value / 100 : n.value);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* `rgb()`, `rgba()`, `hsl()` and `hsla()` as graphty-element reads them: channels and lightness out of range are
|
|
318
|
+
* gamut mapped, not refused.
|
|
319
|
+
* @param text - the value, trimmed
|
|
320
|
+
* @returns the color, or null when it is not one
|
|
321
|
+
*/
|
|
322
|
+
function cssFunction(text: string): { hex: StyleColor; alpha: number } | null {
|
|
323
|
+
const m = /^(rgba?|hsla?)\(([^()]*)\)$/i.exec(text);
|
|
324
|
+
if (m === null) {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
const args = cssArgs(m[2]);
|
|
328
|
+
if (args === null) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
const nums = args.parts.map(cssNumber);
|
|
332
|
+
const alpha = cssAlpha(args.alpha);
|
|
333
|
+
if (nums.includes(null) || alpha === null) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
const [x, y, z] = nums as { value: number; unit: string }[];
|
|
337
|
+
if (m[1].toLowerCase().startsWith("rgb")) {
|
|
338
|
+
if ([x, y, z].some((n) => n.unit !== "" && n.unit !== "%")) {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
const ch = [x, y, z].map((n) => (n.unit === "%" ? n.value / 100 : n.value / 255)) as unknown as Vec3;
|
|
342
|
+
return { hex: srgbHex(ch), alpha };
|
|
343
|
+
}
|
|
344
|
+
const turns: Readonly<Record<string, number>> = { "": 360, deg: 360, grad: 400, rad: 2 * Math.PI, turn: 1 };
|
|
345
|
+
if (x.unit === "%" || !Object.hasOwn(turns, x.unit) || [y, z].some((n) => n.unit !== "" && n.unit !== "%")) {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
const h = ((((x.value / turns[x.unit]) * 360) % 360) + 360) % 360;
|
|
349
|
+
const s = y.value / 100;
|
|
350
|
+
const l = z.value / 100;
|
|
351
|
+
const f = (n: number): number => {
|
|
352
|
+
const k = (n + h / 30) % 12;
|
|
353
|
+
return l - s * Math.min(l, 1 - l) * Math.max(-1, Math.min(k - 3, 9 - k, 1));
|
|
354
|
+
};
|
|
355
|
+
return { hex: srgbHex([f(0), f(8), f(4)]), alpha };
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// ------------------------------------------------------------ hex and names
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* A `#` hex color of 3, 4, 6 or 8 digits. Eight digits put the alpha last, except in yFiles 3, which puts it first.
|
|
362
|
+
* @param text - the value, trimmed
|
|
363
|
+
* @param alphaFirst - whether 8 digits are `#AARRGGBB`
|
|
364
|
+
* @returns the color, or null
|
|
365
|
+
*/
|
|
366
|
+
function hexColor(text: string, alphaFirst: boolean): { hex: StyleColor; alpha: number } | null {
|
|
367
|
+
const m = /^#([0-9a-f]+)$/i.exec(text);
|
|
368
|
+
if (m === null) {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
const h = m[1];
|
|
372
|
+
const byte = (i: number): number => Number.parseInt(h.slice(i, i + 2), 16);
|
|
373
|
+
switch (h.length) {
|
|
374
|
+
case 3:
|
|
375
|
+
case 4: {
|
|
376
|
+
const v = Array.from(h, (c) => Number.parseInt(c + c, 16));
|
|
377
|
+
return { hex: rgbHex(v[0], v[1], v[2]), alpha: h.length === 4 ? alpha01(v[3] / 255) : 1 };
|
|
378
|
+
}
|
|
379
|
+
case 6:
|
|
380
|
+
return { hex: `#${h.toLowerCase()}`, alpha: 1 };
|
|
381
|
+
case 8:
|
|
382
|
+
return alphaFirst
|
|
383
|
+
? { hex: rgbHex(byte(2), byte(4), byte(6)), alpha: alpha01(byte(0) / 255) }
|
|
384
|
+
: { hex: rgbHex(byte(0), byte(2), byte(4)), alpha: alpha01(byte(6) / 255) };
|
|
385
|
+
default:
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* A CSS color as graphty-element reads it: hex, `rgb()`/`hsl()` and their alpha forms, a CSS name or
|
|
392
|
+
* `transparent`.
|
|
393
|
+
* @param text - the value, trimmed
|
|
394
|
+
* @returns the color, or null
|
|
395
|
+
*/
|
|
396
|
+
function cssColor(text: string): { hex: StyleColor; alpha: number } | null {
|
|
397
|
+
const lower = text.toLowerCase();
|
|
398
|
+
if (lower === "transparent") {
|
|
399
|
+
return { hex: "#000000", alpha: 0 };
|
|
400
|
+
}
|
|
401
|
+
const named = CSS_COLORS.get(lower);
|
|
402
|
+
if (named !== undefined) {
|
|
403
|
+
return { hex: named as StyleColor, alpha: 1 };
|
|
404
|
+
}
|
|
405
|
+
return hexColor(text, false) ?? cssFunction(text);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** One of Pajek's decimal color channels in `RGB(1,0.8,0)`: 0..1, no spaces (Pajek 6.02 manual p. 76). */
|
|
409
|
+
const PAJEK_CHANNEL = /^(?:\d+(?:\.\d*)?|\.\d+)$/;
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Pajek's color names: the dvips names as written, `GrayNN` (NN percent black), `RGBrrggbb`, `RGB(r,g,b)` with
|
|
413
|
+
* channels 0..1, `CMYKccmmyykk` and `CMYK(c,m,y,k)` (CMYK converted as dvips converts its names: each channel is
|
|
414
|
+
* 1 - min(1, c + k)).
|
|
415
|
+
* @param text - the value, trimmed
|
|
416
|
+
* @returns the color, or null
|
|
417
|
+
*/
|
|
418
|
+
function pajekColor(text: string): { hex: StyleColor; alpha: number } | null {
|
|
419
|
+
const named = DVIPS_COLORS.get(text);
|
|
420
|
+
if (named !== undefined) {
|
|
421
|
+
return { hex: named as StyleColor, alpha: 1 };
|
|
422
|
+
}
|
|
423
|
+
const gray = /^Gray(\d\d)$/.exec(text);
|
|
424
|
+
if (gray !== null) {
|
|
425
|
+
const v = 255 * (1 - Number(gray[1]) / 100);
|
|
426
|
+
return { hex: rgbHex(v, v, v), alpha: 1 };
|
|
427
|
+
}
|
|
428
|
+
const rgb = /^RGB([0-9A-Fa-f]{6})$/.exec(text);
|
|
429
|
+
if (rgb !== null) {
|
|
430
|
+
return { hex: `#${rgb[1].toLowerCase()}`, alpha: 1 };
|
|
431
|
+
}
|
|
432
|
+
const cmyk = /^CMYK([0-9A-Fa-f]{8})$/.exec(text);
|
|
433
|
+
let parts: number[] | null = null;
|
|
434
|
+
let model = "";
|
|
435
|
+
if (cmyk === null) {
|
|
436
|
+
const fn = /^(RGB|CMYK)\(([^()]*)\)$/.exec(text);
|
|
437
|
+
const channels = fn === null ? [] : fn[2].split(",");
|
|
438
|
+
if (fn !== null && channels.every((c) => PAJEK_CHANNEL.test(c))) {
|
|
439
|
+
model = fn[1];
|
|
440
|
+
parts = channels.map(Number);
|
|
441
|
+
}
|
|
442
|
+
} else {
|
|
443
|
+
model = "CMYK";
|
|
444
|
+
parts = [0, 2, 4, 6].map((i) => Number.parseInt(cmyk[1].slice(i, i + 2), 16) / 255);
|
|
445
|
+
}
|
|
446
|
+
if (parts === null || parts.some((p) => p > 1) || parts.length !== (model === "RGB" ? 3 : 4)) {
|
|
447
|
+
return hexColor(text, false);
|
|
448
|
+
}
|
|
449
|
+
if (model === "RGB") {
|
|
450
|
+
return { hex: rgbHex(parts[0] * 255, parts[1] * 255, parts[2] * 255), alpha: 1 };
|
|
451
|
+
}
|
|
452
|
+
const [c, m, y, k] = parts;
|
|
453
|
+
const ch = (v: number): number => 255 * (1 - Math.min(1, v + k));
|
|
454
|
+
return { hex: rgbHex(ch(c), ch(m), ch(y)), alpha: 1 };
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* A color given as separate channels (`{ r, g, b, a? }`, GEXF's `viz:color` and Gephi's keys): r, g and b 0..255,
|
|
459
|
+
* a 0..1.
|
|
460
|
+
* @param raw - the object
|
|
461
|
+
* @returns the color, or null when a channel is missing or out of range
|
|
462
|
+
*/
|
|
463
|
+
function channels(raw: object): { hex: StyleColor; alpha: number } | null {
|
|
464
|
+
if (!Object.hasOwn(raw, "r") || !Object.hasOwn(raw, "g") || !Object.hasOwn(raw, "b")) {
|
|
465
|
+
return null;
|
|
466
|
+
}
|
|
467
|
+
const o = raw as { r: unknown; g: unknown; b: unknown; a?: unknown };
|
|
468
|
+
const [r, g, b] = [o.r, o.g, o.b].map((v) =>
|
|
469
|
+
typeof v === "number" || typeof v === "string" ? Number(v) : Number.NaN,
|
|
470
|
+
);
|
|
471
|
+
if (![r, g, b].every((v) => Number.isFinite(v) && v >= 0 && v <= 255)) {
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
const a = Object.hasOwn(raw, "a") && o.a !== undefined && o.a !== null ? Number(o.a) : 1;
|
|
475
|
+
return Number.isFinite(a) ? { hex: rgbHex(r, g, b), alpha: alpha01(a) } : null;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* A canonical color in the file's dialect, or null with a note.
|
|
480
|
+
*
|
|
481
|
+
* - CSS (`css`, `vis`, `graphology`, `cytoscape-js`, `graphty` and any dialect not listed): `#rgb`, `#rgba`,
|
|
482
|
+
* `#rrggbb`, `#rrggbbaa`, `rgb()`, `rgba()`, `hsl()`, `hsla()`, CSS names and `transparent`, resolved as
|
|
483
|
+
* graphty-element resolves them (out-of-range channels are gamut mapped).
|
|
484
|
+
* - `graphviz`: Graphviz's own rules (see `graphvizColor`); an unknown color is BLACK, with a note, because that is
|
|
485
|
+
* what Graphviz draws. `x11`: the same names, and an unknown one is null.
|
|
486
|
+
* - `java`, `gephi`, `cytoscape`: the `java.awt.Color` names first, then CSS; a `java` integer is an RGB value.
|
|
487
|
+
* - `dvips`: Pajek's names.
|
|
488
|
+
* - `yed`: `#RRGGBBAA` with the alpha last; `yfiles3`: `#AARRGGBB` with the alpha first and constants such as
|
|
489
|
+
* `DARK_ORANGE`.
|
|
490
|
+
* - `gexf` and `gephi` also take `{ r, g, b, a }` objects.
|
|
491
|
+
*
|
|
492
|
+
* A Graphviz color list is read as `options.use` says and noted (`W_STYLE_GRADIENT`, `W_STYLE_COLOR_LIST`).
|
|
493
|
+
* @param raw - the file's value
|
|
494
|
+
* @param dialect - the file's dialect
|
|
495
|
+
* @param site - where it was read
|
|
496
|
+
* @param options - Graphviz's scheme and use
|
|
497
|
+
* @returns the color and its alpha, or null
|
|
498
|
+
* @category Styles
|
|
499
|
+
*/
|
|
500
|
+
export function canonColor(
|
|
501
|
+
raw: unknown,
|
|
502
|
+
dialect: StyleDialect,
|
|
503
|
+
site: CanonSite,
|
|
504
|
+
options: CanonColorOptions = {},
|
|
505
|
+
): CanonColor | null {
|
|
506
|
+
if (raw !== null && typeof raw === "object") {
|
|
507
|
+
return objectColor(raw, dialect, site);
|
|
508
|
+
}
|
|
509
|
+
if (typeof raw === "number" && dialect === "java" && Number.isInteger(raw) && Math.abs(raw) <= 0xffffffff) {
|
|
510
|
+
spendAt(site, 1);
|
|
511
|
+
const v = raw >>> 0;
|
|
512
|
+
return { color: rgbHex((v >>> 16) & 255, (v >>> 8) & 255, v & 255), alpha: 1 };
|
|
513
|
+
}
|
|
514
|
+
const text = scalarText(raw, site);
|
|
515
|
+
if (text === null) {
|
|
516
|
+
return null;
|
|
517
|
+
}
|
|
518
|
+
if (dialect === "graphviz" || dialect === "x11") {
|
|
519
|
+
return graphvizCanon(text, dialect === "x11" ? "x11" : "graphviz", site, options);
|
|
520
|
+
}
|
|
521
|
+
const c = textColor(text.trim(), dialect);
|
|
522
|
+
if (c === null) {
|
|
523
|
+
noteAt(site, STYLE_ISSUE.BAD_VALUE, text);
|
|
524
|
+
return null;
|
|
525
|
+
}
|
|
526
|
+
return { color: c.hex, alpha: c.alpha };
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* A color given as an object: only GEXF and Gephi write one, as channels.
|
|
531
|
+
* @param raw - the object
|
|
532
|
+
* @param dialect - the file's dialect
|
|
533
|
+
* @param site - where it was read
|
|
534
|
+
* @returns the color and its alpha, or null with a note
|
|
535
|
+
*/
|
|
536
|
+
function objectColor(raw: object, dialect: StyleDialect, site: CanonSite): CanonColor | null {
|
|
537
|
+
spendAt(site, 1);
|
|
538
|
+
const c = dialect === "gexf" || dialect === "gephi" ? channels(raw) : null;
|
|
539
|
+
if (c === null) {
|
|
540
|
+
noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
543
|
+
return { color: c.hex, alpha: c.alpha };
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* A Graphviz or X11 color: Graphviz draws an unknown color black; a plain X11 name that is unknown is no color at all.
|
|
548
|
+
* @param text - the value
|
|
549
|
+
* @param dialect - `graphviz` or `x11`
|
|
550
|
+
* @param site - where it was read
|
|
551
|
+
* @param options - Graphviz's scheme and use
|
|
552
|
+
* @returns the color and its alpha, or null
|
|
553
|
+
*/
|
|
554
|
+
function graphvizCanon(
|
|
555
|
+
text: string,
|
|
556
|
+
dialect: "graphviz" | "x11",
|
|
557
|
+
site: CanonSite,
|
|
558
|
+
options: CanonColorOptions,
|
|
559
|
+
): CanonColor | null {
|
|
560
|
+
const g = graphvizColor(text, dialect === "x11" ? null : (options.scheme ?? null), options.use ?? "line");
|
|
561
|
+
if (g.unknown) {
|
|
562
|
+
noteAt(site, STYLE_ISSUE.BAD_VALUE, text);
|
|
563
|
+
if (dialect === "x11") {
|
|
564
|
+
return null;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (g.list !== null) {
|
|
568
|
+
noteAt(site, g.list === "gradient" ? STYLE_ISSUE.GRADIENT : STYLE_ISSUE.COLOR_LIST, text);
|
|
569
|
+
}
|
|
570
|
+
return { color: g.hex as StyleColor, alpha: alpha01(g.alpha) };
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* A color written as text in a dialect other than Graphviz's.
|
|
575
|
+
* @param trimmed - the value, trimmed
|
|
576
|
+
* @param dialect - the file's dialect
|
|
577
|
+
* @returns the color and its alpha, or null
|
|
578
|
+
*/
|
|
579
|
+
function textColor(trimmed: string, dialect: StyleDialect): { hex: StyleColor; alpha: number } | null {
|
|
580
|
+
const lower = trimmed.toLowerCase();
|
|
581
|
+
switch (dialect) {
|
|
582
|
+
case "dvips":
|
|
583
|
+
return pajekColor(trimmed);
|
|
584
|
+
case "yfiles3":
|
|
585
|
+
return hexColor(trimmed, true) ?? cssColor(lower.replaceAll("_", ""));
|
|
586
|
+
case "java":
|
|
587
|
+
case "gephi":
|
|
588
|
+
case "cytoscape": {
|
|
589
|
+
const java = JAVA_COLORS.get(lower);
|
|
590
|
+
return java === undefined ? cssColor(trimmed) : { hex: java as StyleColor, alpha: 1 };
|
|
591
|
+
}
|
|
592
|
+
default:
|
|
593
|
+
return cssColor(trimmed);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Moves a color's alpha into the property's opacity. When the property has an opacity (`fill` has `fillOpacity`,
|
|
599
|
+
* an edge's `color` has `opacity`) the alpha is multiplied with any opacity the file also states; when it has none
|
|
600
|
+
* (an outline, a label color) an alpha below 1 is dropped and noted as `W_STYLE_ALPHA_DROPPED`.
|
|
601
|
+
* @param color - the canonical color
|
|
602
|
+
* @param stated - the opacity the file states for the same element, or null
|
|
603
|
+
* @param site - where the color was read
|
|
604
|
+
* @param carried - whether the property has an opacity to carry the alpha
|
|
605
|
+
* @returns the opacity to write, or null when there is none to write
|
|
606
|
+
* @category Styles
|
|
607
|
+
*/
|
|
608
|
+
export function colorOpacity(
|
|
609
|
+
color: CanonColor,
|
|
610
|
+
stated: number | null,
|
|
611
|
+
site: CanonSite,
|
|
612
|
+
carried: boolean,
|
|
613
|
+
): number | null {
|
|
614
|
+
if (!carried) {
|
|
615
|
+
if (color.alpha < 1) {
|
|
616
|
+
noteAt(site, STYLE_ISSUE.ALPHA_DROPPED, color.color);
|
|
617
|
+
}
|
|
618
|
+
return stated;
|
|
619
|
+
}
|
|
620
|
+
if (color.alpha === 1) {
|
|
621
|
+
return stated;
|
|
622
|
+
}
|
|
623
|
+
return num6((stated ?? 1) * color.alpha);
|
|
624
|
+
}
|