@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,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The annotations a file draws beside its graph: shapes, text notes and arrows that are not nodes or edges. Cytoscape
|
|
3
|
+
* desktop keeps them in the network's `__Annotations` column (sessions, XGMML, CX and CX2 all carry it), one
|
|
4
|
+
* `key=value|key=value` string per annotation; this reads them as neutral facts in the position convention (y up,
|
|
5
|
+
* the file's own units), so they line up with `extractPositions()`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { GraphSnapshot } from "@graphty/graph-format";
|
|
9
|
+
|
|
10
|
+
import type { StyleArrowShape, StyleColor, StyleNodeShape } from "./types.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A point in the position convention: y up, in the file's own units.
|
|
14
|
+
* @category Styles
|
|
15
|
+
*/
|
|
16
|
+
export interface AnnotationPoint {
|
|
17
|
+
/** The x coordinate. */
|
|
18
|
+
readonly x: number;
|
|
19
|
+
/** The y coordinate, y up. */
|
|
20
|
+
readonly y: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* What every annotation has.
|
|
25
|
+
* @category Styles
|
|
26
|
+
*/
|
|
27
|
+
export interface AnnotationBase {
|
|
28
|
+
/** The file's id for the annotation, or its index when the file gives none. */
|
|
29
|
+
readonly id: string;
|
|
30
|
+
/** Whether it is drawn behind the graph or in front of it. */
|
|
31
|
+
readonly layer: "background" | "foreground";
|
|
32
|
+
/** Its drawing order within its layer, lowest first. */
|
|
33
|
+
readonly z: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A filled, outlined shape.
|
|
38
|
+
* @category Styles
|
|
39
|
+
*/
|
|
40
|
+
export interface ShapeAnnotation extends AnnotationBase {
|
|
41
|
+
/** Which kind of annotation this is: always "shape". */
|
|
42
|
+
readonly kind: "shape";
|
|
43
|
+
/** The box's center. */
|
|
44
|
+
readonly center: AnnotationPoint;
|
|
45
|
+
/** The box's width. */
|
|
46
|
+
readonly width: number;
|
|
47
|
+
/** The box's height. */
|
|
48
|
+
readonly height: number;
|
|
49
|
+
/** The outline's shape. */
|
|
50
|
+
readonly shape: StyleNodeShape;
|
|
51
|
+
/** The fill color, or null for none. */
|
|
52
|
+
readonly fill: StyleColor | null;
|
|
53
|
+
/** The fill's opacity, 0..1. */
|
|
54
|
+
readonly fillOpacity: number;
|
|
55
|
+
/** The outline's color. */
|
|
56
|
+
readonly borderColor: StyleColor;
|
|
57
|
+
/** The outline's opacity, 0..1. */
|
|
58
|
+
readonly borderOpacity: number;
|
|
59
|
+
/** The outline's width. */
|
|
60
|
+
readonly borderWidth: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A line of text.
|
|
65
|
+
* @category Styles
|
|
66
|
+
*/
|
|
67
|
+
export interface TextAnnotation extends AnnotationBase {
|
|
68
|
+
/** Which kind of annotation this is: always "text". */
|
|
69
|
+
readonly kind: "text";
|
|
70
|
+
/** The text. */
|
|
71
|
+
readonly text: string;
|
|
72
|
+
/** Where the text is placed: the top-left corner of its box, or its center. */
|
|
73
|
+
readonly at: AnnotationPoint;
|
|
74
|
+
/** What `at` is. */
|
|
75
|
+
readonly anchor: "top-left" | "center";
|
|
76
|
+
/** The font size, in the file's units. */
|
|
77
|
+
readonly fontSize: number;
|
|
78
|
+
/** The font family. */
|
|
79
|
+
readonly fontFamily: string;
|
|
80
|
+
/** Whether the text is bold. */
|
|
81
|
+
readonly bold: boolean;
|
|
82
|
+
/** Whether the text is italic. */
|
|
83
|
+
readonly italic: boolean;
|
|
84
|
+
/** The text color. */
|
|
85
|
+
readonly color: StyleColor;
|
|
86
|
+
/** The text's opacity, 0..1. */
|
|
87
|
+
readonly opacity: number;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A line between two points, with an arrowhead at either end.
|
|
92
|
+
* @category Styles
|
|
93
|
+
*/
|
|
94
|
+
export interface ArrowAnnotation extends AnnotationBase {
|
|
95
|
+
/** Which kind of annotation this is: always "arrow". */
|
|
96
|
+
readonly kind: "arrow";
|
|
97
|
+
/** Where the line starts. */
|
|
98
|
+
readonly from: AnnotationPoint;
|
|
99
|
+
/** Where it ends. */
|
|
100
|
+
readonly to: AnnotationPoint;
|
|
101
|
+
/** The line color. */
|
|
102
|
+
readonly color: StyleColor;
|
|
103
|
+
/** The line's opacity, 0..1. */
|
|
104
|
+
readonly opacity: number;
|
|
105
|
+
/** The line width. */
|
|
106
|
+
readonly width: number;
|
|
107
|
+
/** The arrowhead at the start. */
|
|
108
|
+
readonly sourceArrow: StyleArrowShape;
|
|
109
|
+
/** The arrowhead at the end. */
|
|
110
|
+
readonly targetArrow: StyleArrowShape;
|
|
111
|
+
/** The start's arrowhead size as a factor of the normal size. */
|
|
112
|
+
readonly sourceSize: number;
|
|
113
|
+
/** The end's arrowhead size as a factor of the normal size. */
|
|
114
|
+
readonly targetSize: number;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* One annotation.
|
|
119
|
+
* @category Styles
|
|
120
|
+
*/
|
|
121
|
+
export type GraphAnnotation = ShapeAnnotation | TextAnnotation | ArrowAnnotation;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* A file's annotations, and the kinds it holds that are not read (images, groups of annotations), by the file's
|
|
125
|
+
* own type name, once each.
|
|
126
|
+
* @category Styles
|
|
127
|
+
*/
|
|
128
|
+
export interface FileAnnotations {
|
|
129
|
+
/** The annotations read, in the file's order. */
|
|
130
|
+
readonly annotations: readonly GraphAnnotation[];
|
|
131
|
+
/** The file's type names of the annotations not read. */
|
|
132
|
+
readonly skipped: readonly string[];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** The graph column Cytoscape desktop keeps its annotations in. */
|
|
136
|
+
const CYTOSCAPE_ANNOTATIONS_COLUMN = "__Annotations";
|
|
137
|
+
|
|
138
|
+
const TYPE_PREFIX = "org.cytoscape.view.presentation.annotations.";
|
|
139
|
+
|
|
140
|
+
/** Cytoscape's annotation shape names, lowercase, as neutral shapes. */
|
|
141
|
+
const SHAPES: ReadonlyMap<string, StyleNodeShape> = new Map<string, StyleNodeShape>([
|
|
142
|
+
["rectangle", "rectangle"],
|
|
143
|
+
["roundedrectangle", "round-rectangle"],
|
|
144
|
+
["rounded_rectangle", "round-rectangle"],
|
|
145
|
+
["ellipse", "ellipse"],
|
|
146
|
+
["triangle", "triangle"],
|
|
147
|
+
["diamond", "diamond"],
|
|
148
|
+
["pentagon", "pentagon"],
|
|
149
|
+
["hexagon", "hexagon"],
|
|
150
|
+
["octagon", "octagon"],
|
|
151
|
+
["parallelogram", "parallelogram"],
|
|
152
|
+
["star5", "star"],
|
|
153
|
+
["star6", "star"],
|
|
154
|
+
]);
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Cytoscape's annotation arrowheads, by the position in its `ArrowType` list (older sessions) and by name (newer
|
|
158
|
+
* ones), lowercase.
|
|
159
|
+
*/
|
|
160
|
+
const ARROW_ORDER: readonly StyleArrowShape[] = [
|
|
161
|
+
"circle",
|
|
162
|
+
"triangle",
|
|
163
|
+
"vee",
|
|
164
|
+
"diamond",
|
|
165
|
+
"triangle-open",
|
|
166
|
+
"none",
|
|
167
|
+
"tee",
|
|
168
|
+
"triangle",
|
|
169
|
+
"triangle",
|
|
170
|
+
"triangle",
|
|
171
|
+
"tee",
|
|
172
|
+
"other:x",
|
|
173
|
+
];
|
|
174
|
+
const ARROW_NAMES: ReadonlyMap<string, StyleArrowShape> = new Map<string, StyleArrowShape>([
|
|
175
|
+
["circle", "circle"],
|
|
176
|
+
["closed arrow", "triangle"],
|
|
177
|
+
["concave arrow", "vee"],
|
|
178
|
+
["diamond", "diamond"],
|
|
179
|
+
["open arrow", "triangle-open"],
|
|
180
|
+
["no arrow", "none"],
|
|
181
|
+
["pipe", "tee"],
|
|
182
|
+
["triangle", "triangle"],
|
|
183
|
+
["t", "tee"],
|
|
184
|
+
["x", "other:x"],
|
|
185
|
+
]);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The annotations a graph holds, from the column Cytoscape desktop keeps them in.
|
|
189
|
+
* @param snapshot - the graph
|
|
190
|
+
* @returns the annotations; none when the graph has the column empty or not at all
|
|
191
|
+
* @category Styles
|
|
192
|
+
*/
|
|
193
|
+
export function readAnnotations(snapshot: GraphSnapshot): FileAnnotations {
|
|
194
|
+
const { graph } = snapshot;
|
|
195
|
+
const cell = graph.has(CYTOSCAPE_ANNOTATIONS_COLUMN) ? graph.value(CYTOSCAPE_ANNOTATIONS_COLUMN, 0) : null;
|
|
196
|
+
const entries = cellStrings(cell);
|
|
197
|
+
const fields = entries.map(parseEntry);
|
|
198
|
+
const byId = new Map(fields.map((f, i) => [f.get("uuid") ?? String(i), f]));
|
|
199
|
+
const annotations: GraphAnnotation[] = [];
|
|
200
|
+
const skipped = new Set<string>();
|
|
201
|
+
fields.forEach((f, i) => {
|
|
202
|
+
const read = readOne(f, String(i), byId);
|
|
203
|
+
if (read === null) {
|
|
204
|
+
skipped.add((f.get("type") ?? "").replace(TYPE_PREFIX, ""));
|
|
205
|
+
} else {
|
|
206
|
+
annotations.push(...read);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
return { annotations, skipped: [...skipped] };
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* A cell's strings: a list cell's items, or the lines of a text cell.
|
|
214
|
+
* @param cell - the cell
|
|
215
|
+
* @returns the strings
|
|
216
|
+
*/
|
|
217
|
+
function cellStrings(cell: unknown): string[] {
|
|
218
|
+
if (typeof cell === "string") {
|
|
219
|
+
return cell.split(/[\r\n]+/).filter((s) => s !== "");
|
|
220
|
+
}
|
|
221
|
+
if (cell !== null && typeof cell === "object" && Symbol.iterator in cell) {
|
|
222
|
+
return Array.from(cell as Iterable<unknown>).filter((s): s is string => typeof s === "string" && s !== "");
|
|
223
|
+
}
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* One annotation string's fields.
|
|
229
|
+
* @param entry - `key=value|key=value`
|
|
230
|
+
* @returns the fields
|
|
231
|
+
*/
|
|
232
|
+
function parseEntry(entry: string): Map<string, string> {
|
|
233
|
+
const out = new Map<string, string>();
|
|
234
|
+
for (const part of entry.split("|")) {
|
|
235
|
+
const eq = part.indexOf("=");
|
|
236
|
+
if (eq > 0) {
|
|
237
|
+
out.set(part.slice(0, eq), part.slice(eq + 1));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return out;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* One annotation as neutral facts; a bounded text annotation is a shape and its text.
|
|
245
|
+
* @param f - its fields
|
|
246
|
+
* @param index - its position, its id when it has no uuid
|
|
247
|
+
* @param byId - every annotation's fields by id, for an arrow's ends
|
|
248
|
+
* @returns the annotations, or null for a kind not read
|
|
249
|
+
*/
|
|
250
|
+
function readOne(
|
|
251
|
+
f: ReadonlyMap<string, string>,
|
|
252
|
+
index: string,
|
|
253
|
+
byId: ReadonlyMap<string, ReadonlyMap<string, string>>,
|
|
254
|
+
): GraphAnnotation[] | null {
|
|
255
|
+
const type = (f.get("type") ?? "").replace(TYPE_PREFIX, "");
|
|
256
|
+
const zoom = positive(f.get("zoom")) ?? 1;
|
|
257
|
+
const base: AnnotationBase = {
|
|
258
|
+
id: f.get("uuid") ?? index,
|
|
259
|
+
layer: f.get("canvas") === "background" ? "background" : "foreground",
|
|
260
|
+
z: num(f.get("z")) ?? 0,
|
|
261
|
+
};
|
|
262
|
+
switch (type) {
|
|
263
|
+
case "ShapeAnnotation":
|
|
264
|
+
return [shapeOf(f, base, zoom)];
|
|
265
|
+
case "TextAnnotation":
|
|
266
|
+
return [textOf(f, base, zoom, { x: num(f.get("x")) ?? 0, y: -(num(f.get("y")) ?? 0) }, "top-left")];
|
|
267
|
+
case "BoundedTextAnnotation": {
|
|
268
|
+
const shape = shapeOf(f, base, zoom);
|
|
269
|
+
return [shape, textOf(f, { ...base, id: `${base.id}:text` }, zoom, shape.center, "center")];
|
|
270
|
+
}
|
|
271
|
+
case "ArrowAnnotation":
|
|
272
|
+
return arrowOf(f, base, zoom, byId);
|
|
273
|
+
default:
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* A shape annotation: `x`, `y` its top-left corner, y down; `width`, `height` and the outline at the saved zoom.
|
|
280
|
+
* @param f - its fields
|
|
281
|
+
* @param base - its id, layer and order
|
|
282
|
+
* @param zoom - the zoom its sizes were saved at
|
|
283
|
+
* @returns the shape
|
|
284
|
+
*/
|
|
285
|
+
function shapeOf(f: ReadonlyMap<string, string>, base: AnnotationBase, zoom: number): ShapeAnnotation {
|
|
286
|
+
const x = num(f.get("x")) ?? 0;
|
|
287
|
+
const y = num(f.get("y")) ?? 0;
|
|
288
|
+
const width = (positive(f.get("width")) ?? 0) / zoom;
|
|
289
|
+
const height = (positive(f.get("height")) ?? 0) / zoom;
|
|
290
|
+
const fill = javaColor(f.get("fillColor"));
|
|
291
|
+
const border = javaColor(f.get("edgeColor")) ?? { color: "#000000", alpha: 1 };
|
|
292
|
+
return {
|
|
293
|
+
...base,
|
|
294
|
+
kind: "shape",
|
|
295
|
+
center: { x: x + width / 2, y: -(y + height / 2) },
|
|
296
|
+
width,
|
|
297
|
+
height,
|
|
298
|
+
shape: SHAPES.get((f.get("shapeType") ?? "rectangle").toLowerCase()) ?? "rectangle",
|
|
299
|
+
fill: fill?.color ?? null,
|
|
300
|
+
fillOpacity: fill === null ? 0 : fill.alpha * percent(f.get("fillOpacity")),
|
|
301
|
+
borderColor: border.color,
|
|
302
|
+
borderOpacity: border.alpha * percent(f.get("edgeOpacity")),
|
|
303
|
+
borderWidth: (num(f.get("edgeThickness")) ?? 1) / zoom,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* A text annotation, or the text of a bounded one.
|
|
309
|
+
* @param f - its fields
|
|
310
|
+
* @param base - its id, layer and order
|
|
311
|
+
* @param zoom - the zoom its font size was saved at
|
|
312
|
+
* @param at - where it is placed
|
|
313
|
+
* @param anchor - what `at` is
|
|
314
|
+
* @returns the text
|
|
315
|
+
*/
|
|
316
|
+
function textOf(
|
|
317
|
+
f: ReadonlyMap<string, string>,
|
|
318
|
+
base: AnnotationBase,
|
|
319
|
+
zoom: number,
|
|
320
|
+
at: AnnotationPoint,
|
|
321
|
+
anchor: TextAnnotation["anchor"],
|
|
322
|
+
): TextAnnotation {
|
|
323
|
+
// java.awt.Font styles: 1 bold, 2 italic, 3 both
|
|
324
|
+
const style = num(f.get("fontStyle")) ?? 0;
|
|
325
|
+
const color = javaColor(f.get("color")) ?? { color: "#000000", alpha: 1 };
|
|
326
|
+
return {
|
|
327
|
+
...base,
|
|
328
|
+
kind: "text",
|
|
329
|
+
text: f.get("text") ?? "",
|
|
330
|
+
at,
|
|
331
|
+
anchor,
|
|
332
|
+
fontSize: (positive(f.get("fontSize")) ?? 12) / zoom,
|
|
333
|
+
fontFamily: f.get("fontFamily") ?? "sans-serif",
|
|
334
|
+
bold: (style & 1) !== 0,
|
|
335
|
+
italic: (style & 2) !== 0,
|
|
336
|
+
color: color.color,
|
|
337
|
+
opacity: color.alpha,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* An arrow annotation. Cytoscape keeps its start as the annotation it leaves (`sourceAnnotation`) and its end as a
|
|
343
|
+
* point, a node's center at save time (`targetNode`) or another annotation, and saves the arrow's top-left corner
|
|
344
|
+
* as `x`, `y`: the start wherever the end lies right of and below it, which is taken for the start, else the center
|
|
345
|
+
* of the annotation it leaves.
|
|
346
|
+
* @param f - its fields
|
|
347
|
+
* @param base - its id, layer and order
|
|
348
|
+
* @param zoom - the zoom its line width was saved at
|
|
349
|
+
* @param byId - every annotation's fields by id
|
|
350
|
+
* @returns the arrow, or null when it has no end
|
|
351
|
+
*/
|
|
352
|
+
function arrowOf(
|
|
353
|
+
f: ReadonlyMap<string, string>,
|
|
354
|
+
base: AnnotationBase,
|
|
355
|
+
zoom: number,
|
|
356
|
+
byId: ReadonlyMap<string, ReadonlyMap<string, string>>,
|
|
357
|
+
): ArrowAnnotation[] | null {
|
|
358
|
+
const target = f.get("targetAnnotation");
|
|
359
|
+
const to = point(f.get("targetPoint")) ?? point(f.get("targetNode")) ?? centerOf(byId.get(target ?? ""), zoom);
|
|
360
|
+
if (to === null) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
const corner = { x: num(f.get("x")) ?? 0, y: num(f.get("y")) ?? 0 };
|
|
364
|
+
const source = centerOf(byId.get(f.get("sourceAnnotation") ?? ""), zoom) ?? corner;
|
|
365
|
+
// ponytail: the start is exact only when the end lies right of and below it; elsewhere the center of the
|
|
366
|
+
// annotation it leaves, as Cytoscape stores no other start. Clip to that annotation's box if it matters.
|
|
367
|
+
const from = { x: to.x > corner.x ? corner.x : source.x, y: to.y > corner.y ? corner.y : source.y };
|
|
368
|
+
const color = javaColor(f.get("lineColor")) ?? { color: "#000000", alpha: 1 };
|
|
369
|
+
return [
|
|
370
|
+
{
|
|
371
|
+
...base,
|
|
372
|
+
kind: "arrow",
|
|
373
|
+
from: { x: from.x, y: -from.y },
|
|
374
|
+
to: { x: to.x, y: -to.y },
|
|
375
|
+
color: color.color,
|
|
376
|
+
opacity: color.alpha * percent(f.get("lineOpacity")),
|
|
377
|
+
width: (positive(f.get("lineThickness")) ?? 1) / zoom,
|
|
378
|
+
sourceArrow: arrowShape(f.get("sourceType")),
|
|
379
|
+
targetArrow: arrowShape(f.get("targetType")),
|
|
380
|
+
sourceSize: positive(f.get("sourceSize")) ?? 1,
|
|
381
|
+
targetSize: positive(f.get("targetSize")) ?? 1,
|
|
382
|
+
},
|
|
383
|
+
];
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* An annotation's center, y down as the file writes it: a shape's box center, a text's corner.
|
|
388
|
+
* @param f - its fields, or undefined
|
|
389
|
+
* @param zoom - the zoom the arrow was saved at
|
|
390
|
+
* @returns the point, or null
|
|
391
|
+
*/
|
|
392
|
+
function centerOf(f: ReadonlyMap<string, string> | undefined, zoom: number): AnnotationPoint | null {
|
|
393
|
+
if (f === undefined) {
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
const x = num(f.get("x"));
|
|
397
|
+
const y = num(f.get("y"));
|
|
398
|
+
if (x === null || y === null) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
return { x: x + (positive(f.get("width")) ?? 0) / zoom / 2, y: y + (positive(f.get("height")) ?? 0) / zoom / 2 };
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* An arrowhead by its `ArrowType` position or name.
|
|
406
|
+
* @param raw - the field
|
|
407
|
+
* @returns the shape; a triangle for one not known
|
|
408
|
+
*/
|
|
409
|
+
function arrowShape(raw: string | undefined): StyleArrowShape {
|
|
410
|
+
if (raw === undefined) {
|
|
411
|
+
return "none";
|
|
412
|
+
}
|
|
413
|
+
const n = num(raw);
|
|
414
|
+
if (n !== null) {
|
|
415
|
+
return ARROW_ORDER[n] ?? "triangle";
|
|
416
|
+
}
|
|
417
|
+
return ARROW_NAMES.get(raw.trim().toLowerCase()) ?? "triangle";
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* A `x,y` point as the file writes it.
|
|
422
|
+
* @param raw - the field
|
|
423
|
+
* @returns the point, or null
|
|
424
|
+
*/
|
|
425
|
+
function point(raw: string | undefined): AnnotationPoint | null {
|
|
426
|
+
const [x, y] = (raw ?? "").split(",").map((s) => num(s));
|
|
427
|
+
return x === null || x === undefined || y === null || y === undefined ? null : { x, y };
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* A Java color as a signed ARGB integer.
|
|
432
|
+
* @param raw - the field
|
|
433
|
+
* @returns the color and its alpha, or null
|
|
434
|
+
*/
|
|
435
|
+
function javaColor(raw: string | undefined): { color: StyleColor; alpha: number } | null {
|
|
436
|
+
const n = num(raw);
|
|
437
|
+
if (n === null || !Number.isInteger(n)) {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
const argb = n >>> 0;
|
|
441
|
+
return {
|
|
442
|
+
color: `#${(argb & 0xffffff).toString(16).padStart(6, "0")}`,
|
|
443
|
+
alpha: (argb >>> 24) / 255,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* A 0..100 percentage as 0..1; 1 when absent.
|
|
449
|
+
* @param raw - the field
|
|
450
|
+
* @returns the fraction
|
|
451
|
+
*/
|
|
452
|
+
function percent(raw: string | undefined): number {
|
|
453
|
+
const n = num(raw);
|
|
454
|
+
return n === null ? 1 : Math.min(1, Math.max(0, n / 100));
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* A finite number.
|
|
459
|
+
* @param raw - the field
|
|
460
|
+
* @returns the number, or null
|
|
461
|
+
*/
|
|
462
|
+
function num(raw: string | undefined): number | null {
|
|
463
|
+
if (raw === undefined || raw.trim() === "") {
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
const n = Number(raw);
|
|
467
|
+
return Number.isFinite(n) ? n : null;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* A positive number.
|
|
472
|
+
* @param raw - the field
|
|
473
|
+
* @returns the number, or null
|
|
474
|
+
*/
|
|
475
|
+
function positive(raw: string | undefined): number | null {
|
|
476
|
+
const n = num(raw);
|
|
477
|
+
return n !== null && n > 0 ? n : null;
|
|
478
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one counted work budget of a style extraction: the readers' cascades, the planner, the translation and the
|
|
3
|
+
* replay all spend from it. It counts operations, never time, so the same file always stops at the same place.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { StyleTarget, StyleWorkBudget } from "./types.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Operations one extraction may spend per target (nodes, edges) before what is left is copied per element.
|
|
10
|
+
* @category Styles
|
|
11
|
+
*/
|
|
12
|
+
export const STYLE_WORK_BUDGET = 2e8;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A counted work budget per target. `spend()` adds operations and answers whether the target is still within its
|
|
16
|
+
* limit; once a target has spent more than the limit it stays exhausted.
|
|
17
|
+
* @category Styles
|
|
18
|
+
*/
|
|
19
|
+
export class StyleBudget implements StyleWorkBudget {
|
|
20
|
+
/** Operations allowed per target. */
|
|
21
|
+
readonly limit: number;
|
|
22
|
+
readonly #used = { node: 0, edge: 0 };
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Creates a budget.
|
|
26
|
+
* @param limit - operations allowed per target; defaults to `STYLE_WORK_BUDGET`
|
|
27
|
+
*/
|
|
28
|
+
constructor(limit: number = STYLE_WORK_BUDGET) {
|
|
29
|
+
this.limit = limit;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Spends operations for a target.
|
|
34
|
+
* @param target - nodes or edges
|
|
35
|
+
* @param operations - how many operations the work costs
|
|
36
|
+
* @returns true while the target has spent at most `limit` operations
|
|
37
|
+
*/
|
|
38
|
+
spend(target: StyleTarget, operations: number): boolean {
|
|
39
|
+
this.#used[target] += operations;
|
|
40
|
+
return this.#used[target] <= this.limit;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Whether a target has spent more than `limit` operations.
|
|
45
|
+
* @param target - nodes or edges
|
|
46
|
+
* @returns true once the target's budget is exhausted
|
|
47
|
+
*/
|
|
48
|
+
exhausted(target: StyleTarget): boolean {
|
|
49
|
+
return this.#used[target] > this.limit;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* How many operations a target has spent.
|
|
54
|
+
* @param target - nodes or edges
|
|
55
|
+
* @returns the operations spent so far
|
|
56
|
+
*/
|
|
57
|
+
used(target: StyleTarget): number {
|
|
58
|
+
return this.#used[target];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The neutral `bends` value of an edge: the points its route passes through between its two nodes, each relative to
|
|
3
|
+
* the straight line from the source node's center to the target node's center. `along` is how far along that line
|
|
4
|
+
* the point lies (0 at the source center, 1 at the target center) and `across` how far to its left, y up, both as
|
|
5
|
+
* fractions of the line's length. Written `along,across` per point, in order from the source, separated by spaces:
|
|
6
|
+
* `"0,-0.5 1,-0.5"` is a route that leaves the source, runs parallel to the line half its length to the right, and
|
|
7
|
+
* comes back to the target. Relative, so a drawing that moves or scales the nodes keeps the route's shape and its
|
|
8
|
+
* right angles.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** A point in the file's own coordinates. */
|
|
12
|
+
export type BendPoint = readonly [x: number, y: number];
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Rounds a fraction to 4 decimals, so a value spells the same whatever float noise the file's numbers carry.
|
|
16
|
+
* @param v - the fraction
|
|
17
|
+
* @returns its spelling
|
|
18
|
+
*/
|
|
19
|
+
const fraction = (v: number): string => String(Math.round(v * 1e4) / 1e4);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The `bends` value of an edge whose route passes through `points`.
|
|
23
|
+
* @param source - the source node's center
|
|
24
|
+
* @param target - the target node's center
|
|
25
|
+
* @param points - the bend points, from the source end
|
|
26
|
+
* @param yDown - true when the file's y axis points down (the value is always y up)
|
|
27
|
+
* @returns the value, or null with no bends, no line between distinct centers, or a coordinate that is not finite
|
|
28
|
+
* @category Styles
|
|
29
|
+
*/
|
|
30
|
+
export function canonBends(
|
|
31
|
+
source: BendPoint,
|
|
32
|
+
target: BendPoint,
|
|
33
|
+
points: readonly BendPoint[],
|
|
34
|
+
yDown: boolean,
|
|
35
|
+
): string | null {
|
|
36
|
+
const flip = yDown ? -1 : 1;
|
|
37
|
+
const dx = target[0] - source[0];
|
|
38
|
+
const dy = (target[1] - source[1]) * flip;
|
|
39
|
+
const length2 = dx * dx + dy * dy;
|
|
40
|
+
if (points.length === 0 || length2 <= 0 || !Number.isFinite(length2)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const out: string[] = [];
|
|
44
|
+
for (const [px, py] of points) {
|
|
45
|
+
const rx = px - source[0];
|
|
46
|
+
const ry = (py - source[1]) * flip;
|
|
47
|
+
const along = (rx * dx + ry * dy) / length2;
|
|
48
|
+
const across = (dx * ry - dy * rx) / length2;
|
|
49
|
+
if (!Number.isFinite(along) || !Number.isFinite(across)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
out.push(`${fraction(along)},${fraction(across)}`);
|
|
53
|
+
}
|
|
54
|
+
return out.join(" ");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The bend points a `bends` value places between two node centers: the inverse of {@link canonBends}.
|
|
59
|
+
* @param source - the source node's center
|
|
60
|
+
* @param target - the target node's center
|
|
61
|
+
* @param value - the `bends` value
|
|
62
|
+
* @param yDown - true when the points are wanted in a y-down file's coordinates
|
|
63
|
+
* @returns the points, or null when the value is not `along,across` pairs or a coordinate is not finite
|
|
64
|
+
* @category Styles
|
|
65
|
+
*/
|
|
66
|
+
export function bendsToPoints(source: BendPoint, target: BendPoint, value: string, yDown: boolean): BendPoint[] | null {
|
|
67
|
+
const flip = yDown ? -1 : 1;
|
|
68
|
+
const dx = target[0] - source[0];
|
|
69
|
+
const dy = (target[1] - source[1]) * flip;
|
|
70
|
+
const out: BendPoint[] = [];
|
|
71
|
+
for (const pair of value.trim().split(/\s+/)) {
|
|
72
|
+
const [a, c, extra] = pair.split(",").map(Number);
|
|
73
|
+
if (extra !== undefined || !Number.isFinite(a) || !Number.isFinite(c)) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const x = source[0] + a * dx - c * dy;
|
|
77
|
+
const y = source[1] + (a * dy + c * dx) * flip;
|
|
78
|
+
if (!Number.isFinite(x) || !Number.isFinite(y)) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
out.push([x, y]);
|
|
82
|
+
}
|
|
83
|
+
return out.length === 0 ? null : out;
|
|
84
|
+
}
|