@graphty/graph-io 0.3.43 → 0.3.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/approximations-3Q4TsdTh.js +40 -0
- package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
- package/dist/chunks/block-JQiwViEt.js +2777 -0
- package/dist/chunks/block-JQiwViEt.js.map +1 -0
- package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
- package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
- package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
- package/dist/chunks/constants-BFUR_CtU.js.map +1 -0
- package/dist/chunks/convert-BcQ8_jMo.js +59 -0
- package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
- package/dist/chunks/emit-DCwFLts5.js +3456 -0
- package/dist/chunks/emit-DCwFLts5.js.map +1 -0
- package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
- package/dist/chunks/escape-B1rMftd9.js.map +1 -0
- package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
- package/dist/chunks/export-D7IGzTG4.js.map +1 -0
- package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
- package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
- package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
- package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
- package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
- package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
- package/dist/chunks/{exporter-RVtXVetw.js → exporter-quPUCBiC.js} +1805 -287
- package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
- package/dist/chunks/format-GDmO6m6Q.js +676 -0
- package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
- package/dist/chunks/generic-BL06jrJf.js +1347 -0
- package/dist/chunks/generic-BL06jrJf.js.map +1 -0
- package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
- package/dist/chunks/importer-B7r2owVf.js.map +1 -0
- package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
- package/dist/chunks/importer-BFmOP96W.js.map +1 -0
- package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
- package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
- package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
- package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
- package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
- package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
- package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
- package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
- package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
- package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
- package/dist/chunks/index-B9fdNpTA.js +4310 -0
- package/dist/chunks/index-B9fdNpTA.js.map +1 -0
- package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
- package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
- package/dist/chunks/lexicon-B-knUi-l.js +508 -0
- package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
- package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
- package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
- package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
- package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
- package/dist/chunks/styles-Brt9JMfs.js +690 -0
- package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
- package/dist/chunks/styles-_N-C8S-U.js +2102 -0
- package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
- package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
- package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
- package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
- package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
- package/dist/chunks/units-XMZFIFe1.js +19 -0
- package/dist/chunks/units-XMZFIFe1.js.map +1 -0
- package/dist/csv.js +5 -4
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +1 -1
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +5 -2
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +292 -412
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +8 -3031
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +354 -240
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +4 -2
- package/dist/graphml.js.map +1 -1
- package/dist/json.js +1 -1
- package/dist/neo4j.js +4 -3
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +1 -1
- package/dist/pajek.js +4 -2
- package/dist/positions.d.ts +1 -0
- package/dist/positions.js +427 -0
- package/dist/positions.js.map +1 -0
- package/dist/src/common/codes.d.ts +6 -0
- package/dist/src/common/codes.d.ts.map +1 -1
- package/dist/src/common/codes.js +6 -0
- package/dist/src/common/codes.js.map +1 -1
- package/dist/src/common/escape.d.ts.map +1 -1
- package/dist/src/common/escape.js +4 -2
- package/dist/src/common/escape.js.map +1 -1
- package/dist/src/common/export.d.ts +10 -0
- package/dist/src/common/export.d.ts.map +1 -1
- package/dist/src/common/export.js +123 -100
- package/dist/src/common/export.js.map +1 -1
- package/dist/src/common/input.d.ts.map +1 -1
- package/dist/src/common/input.js +8 -1
- package/dist/src/common/input.js.map +1 -1
- package/dist/src/common/json-elements.d.ts +12 -9
- package/dist/src/common/json-elements.d.ts.map +1 -1
- package/dist/src/common/json-elements.js +160 -37
- package/dist/src/common/json-elements.js.map +1 -1
- package/dist/src/common/notes.d.ts +42 -0
- package/dist/src/common/notes.d.ts.map +1 -0
- package/dist/src/common/notes.js +72 -0
- package/dist/src/common/notes.js.map +1 -0
- package/dist/src/common/report.d.ts +18 -0
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +36 -1
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/common/units.d.ts +24 -0
- package/dist/src/common/units.d.ts.map +1 -0
- package/dist/src/common/units.js +26 -0
- package/dist/src/common/units.js.map +1 -0
- package/dist/src/common/xml.d.ts +18 -0
- package/dist/src/common/xml.d.ts.map +1 -1
- package/dist/src/common/xml.js +42 -5
- package/dist/src/common/xml.js.map +1 -1
- package/dist/src/formats/cx/exporter.d.ts +6 -0
- package/dist/src/formats/cx/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx/exporter.js +71 -8
- package/dist/src/formats/cx/exporter.js.map +1 -1
- package/dist/src/formats/cx/importer.d.ts +5 -2
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +102 -72
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +102 -0
- package/dist/src/formats/cx/styles.d.ts.map +1 -0
- package/dist/src/formats/cx/styles.js +225 -0
- package/dist/src/formats/cx/styles.js.map +1 -0
- package/dist/src/formats/cx2/exporter.d.ts +5 -0
- package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx2/exporter.js +181 -71
- package/dist/src/formats/cx2/exporter.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts +4 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +19 -1
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts +18 -0
- package/dist/src/formats/cx2/styles.d.ts.map +1 -0
- package/dist/src/formats/cx2/styles.js +24 -0
- package/dist/src/formats/cx2/styles.js.map +1 -0
- package/dist/src/formats/cys/constants.d.ts +2 -0
- package/dist/src/formats/cys/constants.d.ts.map +1 -1
- package/dist/src/formats/cys/constants.js +2 -0
- package/dist/src/formats/cys/constants.js.map +1 -1
- package/dist/src/formats/cys/exporter.d.ts +6 -2
- package/dist/src/formats/cys/exporter.d.ts.map +1 -1
- package/dist/src/formats/cys/exporter.js +215 -53
- package/dist/src/formats/cys/exporter.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts +2 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +119 -6
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/session.d.ts +2 -0
- package/dist/src/formats/cys/session.d.ts.map +1 -1
- package/dist/src/formats/cys/session.js +5 -0
- package/dist/src/formats/cys/session.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +38 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -0
- package/dist/src/formats/cys/styles.js +213 -0
- package/dist/src/formats/cys/styles.js.map +1 -0
- package/dist/src/formats/cys/tables.d.ts +8 -3
- package/dist/src/formats/cys/tables.d.ts.map +1 -1
- package/dist/src/formats/cys/tables.js +88 -34
- package/dist/src/formats/cys/tables.js.map +1 -1
- package/dist/src/formats/dot/exporter.d.ts +2 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +195 -81
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +100 -20
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +1 -0
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +1 -0
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/positions.d.ts +14 -0
- package/dist/src/formats/dot/positions.d.ts.map +1 -0
- package/dist/src/formats/dot/positions.js +70 -0
- package/dist/src/formats/dot/positions.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +82 -0
- package/dist/src/formats/dot/styles.d.ts.map +1 -0
- package/dist/src/formats/dot/styles.js +1484 -0
- package/dist/src/formats/dot/styles.js.map +1 -0
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
- package/dist/src/formats/gexf/exporter.js +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 +790 -0
- package/dist/src/styles/cyjs/emit.js.map +1 -0
- package/dist/src/styles/cyjs/index.d.ts +13 -0
- package/dist/src/styles/cyjs/index.d.ts.map +1 -0
- package/dist/src/styles/cyjs/index.js +13 -0
- package/dist/src/styles/cyjs/index.js.map +1 -0
- package/dist/src/styles/cyjs/live.d.ts +46 -0
- package/dist/src/styles/cyjs/live.d.ts.map +1 -0
- package/dist/src/styles/cyjs/live.js +108 -0
- package/dist/src/styles/cyjs/live.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +147 -0
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
- package/dist/src/styles/cyjs/mappers.js +744 -0
- package/dist/src/styles/cyjs/mappers.js.map +1 -0
- package/dist/src/styles/cyjs/selector.d.ts +113 -0
- package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
- package/dist/src/styles/cyjs/selector.js +611 -0
- package/dist/src/styles/cyjs/selector.js.map +1 -0
- package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
- package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
- package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
- package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts +125 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/emit.js +1025 -0
- package/dist/src/styles/cytoscape/emit.js.map +1 -0
- package/dist/src/styles/cytoscape/index.d.ts +10 -0
- package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/index.js +10 -0
- package/dist/src/styles/cytoscape/index.js.map +1 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/lexicon.js +603 -0
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
- package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/mappings.js +460 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -0
- package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/resolve.js +381 -0
- package/dist/src/styles/cytoscape/resolve.js.map +1 -0
- package/dist/src/styles/cytoscape/translate.d.ts +50 -0
- package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/translate.js +156 -0
- package/dist/src/styles/cytoscape/translate.js.map +1 -0
- package/dist/src/styles/defaults.d.ts +90 -0
- package/dist/src/styles/defaults.d.ts.map +1 -0
- package/dist/src/styles/defaults.js +414 -0
- package/dist/src/styles/defaults.js.map +1 -0
- package/dist/src/styles/index.d.ts +15 -0
- package/dist/src/styles/index.d.ts.map +1 -0
- package/dist/src/styles/index.js +14 -0
- package/dist/src/styles/index.js.map +1 -0
- package/dist/src/styles/internal.d.ts +17 -0
- package/dist/src/styles/internal.d.ts.map +1 -0
- package/dist/src/styles/internal.js +16 -0
- package/dist/src/styles/internal.js.map +1 -0
- package/dist/src/styles/io/approximations.d.ts +24 -0
- package/dist/src/styles/io/approximations.d.ts.map +1 -0
- package/dist/src/styles/io/approximations.js +51 -0
- package/dist/src/styles/io/approximations.js.map +1 -0
- package/dist/src/styles/io/block.d.ts +166 -0
- package/dist/src/styles/io/block.d.ts.map +1 -0
- package/dist/src/styles/io/block.js +930 -0
- package/dist/src/styles/io/block.js.map +1 -0
- package/dist/src/styles/io/generic.d.ts +88 -0
- package/dist/src/styles/io/generic.d.ts.map +1 -0
- package/dist/src/styles/io/generic.js +516 -0
- package/dist/src/styles/io/generic.js.map +1 -0
- package/dist/src/styles/io/index.d.ts +8 -0
- package/dist/src/styles/io/index.d.ts.map +1 -0
- package/dist/src/styles/io/index.js +7 -0
- package/dist/src/styles/io/index.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts +80 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -0
- package/dist/src/styles/io/writer.js +596 -0
- package/dist/src/styles/io/writer.js.map +1 -0
- package/dist/src/styles/notes.d.ts +47 -0
- package/dist/src/styles/notes.d.ts.map +1 -0
- package/dist/src/styles/notes.js +140 -0
- package/dist/src/styles/notes.js.map +1 -0
- package/dist/src/styles/plan/classes.d.ts +31 -0
- package/dist/src/styles/plan/classes.d.ts.map +1 -0
- package/dist/src/styles/plan/classes.js +139 -0
- package/dist/src/styles/plan/classes.js.map +1 -0
- package/dist/src/styles/plan/continuous.d.ts +32 -0
- package/dist/src/styles/plan/continuous.d.ts.map +1 -0
- package/dist/src/styles/plan/continuous.js +165 -0
- package/dist/src/styles/plan/continuous.js.map +1 -0
- package/dist/src/styles/plan/discrete.d.ts +39 -0
- package/dist/src/styles/plan/discrete.d.ts.map +1 -0
- package/dist/src/styles/plan/discrete.js +127 -0
- package/dist/src/styles/plan/discrete.js.map +1 -0
- package/dist/src/styles/plan/families.d.ts +31 -0
- package/dist/src/styles/plan/families.d.ts.map +1 -0
- package/dist/src/styles/plan/families.js +95 -0
- package/dist/src/styles/plan/families.js.map +1 -0
- package/dist/src/styles/plan/features.d.ts +58 -0
- package/dist/src/styles/plan/features.d.ts.map +1 -0
- package/dist/src/styles/plan/features.js +185 -0
- package/dist/src/styles/plan/features.js.map +1 -0
- package/dist/src/styles/plan/index.d.ts +7 -0
- package/dist/src/styles/plan/index.d.ts.map +1 -0
- package/dist/src/styles/plan/index.js +7 -0
- package/dist/src/styles/plan/index.js.map +1 -0
- package/dist/src/styles/plan/plan.d.ts +71 -0
- package/dist/src/styles/plan/plan.d.ts.map +1 -0
- package/dist/src/styles/plan/plan.js +893 -0
- package/dist/src/styles/plan/plan.js.map +1 -0
- package/dist/src/styles/plan/resolve.d.ts +137 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -0
- package/dist/src/styles/plan/resolve.js +587 -0
- package/dist/src/styles/plan/resolve.js.map +1 -0
- package/dist/src/styles/types.d.ts +702 -0
- package/dist/src/styles/types.d.ts.map +1 -0
- package/dist/src/styles/types.js +10 -0
- package/dist/src/styles/types.js.map +1 -0
- package/dist/src/styles/vocabulary.d.ts +41 -0
- package/dist/src/styles/vocabulary.d.ts.map +1 -0
- package/dist/src/styles/vocabulary.js +140 -0
- package/dist/src/styles/vocabulary.js.map +1 -0
- package/dist/src/types.d.ts +64 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/styles.d.ts +1 -0
- package/dist/styles.js +322 -0
- package/dist/styles.js.map +1 -0
- package/dist/xgmml.js +5 -4
- package/dist/xgmml.js.map +1 -1
- package/package.json +13 -2
- package/src/common/codes.ts +7 -0
- package/src/common/escape.ts +5 -2
- package/src/common/export.ts +179 -140
- package/src/common/input.ts +8 -4
- package/src/common/json-elements.ts +169 -38
- package/src/common/notes.ts +94 -0
- package/src/common/report.ts +41 -1
- package/src/common/units.ts +42 -0
- package/src/common/xml.ts +45 -5
- package/src/formats/cx/exporter.ts +95 -11
- package/src/formats/cx/importer.ts +126 -90
- package/src/formats/cx/styles.ts +304 -0
- package/src/formats/cx2/exporter.ts +234 -77
- package/src/formats/cx2/importer.ts +19 -1
- package/src/formats/cx2/styles.ts +29 -0
- package/src/formats/cys/constants.ts +3 -0
- package/src/formats/cys/exporter.ts +246 -60
- package/src/formats/cys/importer.ts +125 -9
- package/src/formats/cys/session.ts +6 -0
- package/src/formats/cys/styles.ts +254 -0
- package/src/formats/cys/tables.ts +117 -48
- package/src/formats/dot/exporter.ts +262 -126
- package/src/formats/dot/importer.ts +111 -20
- package/src/formats/dot/index.ts +1 -0
- package/src/formats/dot/positions.ts +77 -0
- package/src/formats/dot/styles.ts +1741 -0
- package/src/formats/gexf/exporter.ts +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 +951 -0
- package/src/styles/cyjs/index.ts +37 -0
- package/src/styles/cyjs/live.ts +147 -0
- package/src/styles/cyjs/mappers.ts +879 -0
- package/src/styles/cyjs/selector.ts +778 -0
- package/src/styles/cyjs/stylesheet-text.ts +214 -0
- package/src/styles/cytoscape/emit.ts +1264 -0
- package/src/styles/cytoscape/index.ts +40 -0
- package/src/styles/cytoscape/lexicon.ts +656 -0
- package/src/styles/cytoscape/mappings.ts +603 -0
- package/src/styles/cytoscape/resolve.ts +521 -0
- package/src/styles/cytoscape/translate.ts +237 -0
- package/src/styles/defaults.ts +504 -0
- package/src/styles/index.ts +57 -0
- package/src/styles/internal.ts +17 -0
- package/src/styles/io/approximations.ts +47 -0
- package/src/styles/io/block.ts +1138 -0
- package/src/styles/io/generic.ts +687 -0
- package/src/styles/io/index.ts +18 -0
- package/src/styles/io/writer.ts +745 -0
- package/src/styles/notes.ts +165 -0
- package/src/styles/plan/classes.ts +166 -0
- package/src/styles/plan/continuous.ts +218 -0
- package/src/styles/plan/discrete.ts +165 -0
- package/src/styles/plan/families.ts +115 -0
- package/src/styles/plan/features.ts +234 -0
- package/src/styles/plan/index.ts +7 -0
- package/src/styles/plan/plan.ts +1129 -0
- package/src/styles/plan/resolve.ts +685 -0
- package/src/styles/types.ts +814 -0
- package/src/styles/vocabulary.ts +172 -0
- package/src/types.ts +76 -1
- package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
- package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
- package/dist/chunks/export-rKLeGQMo.js.map +0 -1
- package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
- package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
- package/dist/chunks/exporter-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,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The styles of XGMML files and Cytoscape 2.x session networks: Cytoscape writes every element's RESOLVED visual
|
|
3
|
+
* properties into its `<graphics>` (XML attributes in the old spelling, nested `<att>` elements named for the visual
|
|
4
|
+
* property, and the locked ones under `lockedVisualProperties`), and no style. The reader turns those values into
|
|
5
|
+
* the neutral vocabulary; the planner explains them. The writer does the reverse from what graphty draws.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { GraphSnapshot } from "@graphty/graph-format";
|
|
9
|
+
|
|
10
|
+
import { STYLE_ISSUE } from "../../styles/codes.js";
|
|
11
|
+
import {
|
|
12
|
+
type CytoscapeDialect,
|
|
13
|
+
cytoscapeElementProperties,
|
|
14
|
+
cytoscapeWritableProperties,
|
|
15
|
+
} from "../../styles/cytoscape/emit.js";
|
|
16
|
+
import { normalizeVisualProperties } from "../../styles/cytoscape/lexicon.js";
|
|
17
|
+
import { emptyCytoscapeStyle } from "../../styles/cytoscape/mappings.js";
|
|
18
|
+
import { cytoscapeBackground, type CytoscapeBypass, resolveCytoscapeBypasses } from "../../styles/cytoscape/resolve.js";
|
|
19
|
+
import { blockStyles, parseStyleBlock, STYLE_BLOCK_NAME } from "../../styles/io/block.js";
|
|
20
|
+
import type { ExporterStyleInput } from "../../styles/io/writer.js";
|
|
21
|
+
import { StyleNotes } from "../../styles/notes.js";
|
|
22
|
+
import { styleFingerprint } from "../../styles/plan/features.js";
|
|
23
|
+
import { plainCell, resolveStyles } from "../../styles/plan/resolve.js";
|
|
24
|
+
import type {
|
|
25
|
+
EdgeStyleProperty,
|
|
26
|
+
GraphStyle,
|
|
27
|
+
ImporterStyles,
|
|
28
|
+
NodeStyleProperty,
|
|
29
|
+
ReaderOutput,
|
|
30
|
+
StyleColumn,
|
|
31
|
+
StyleProperty,
|
|
32
|
+
StyleReadContext,
|
|
33
|
+
StyleTarget,
|
|
34
|
+
StyleTool,
|
|
35
|
+
StyleValue,
|
|
36
|
+
StyleWriteCapabilities,
|
|
37
|
+
} from "../../styles/types.js";
|
|
38
|
+
import type { LossNote } from "../../types.js";
|
|
39
|
+
import { lossOf } from "../cx/styles.js";
|
|
40
|
+
import { GRAPHICS_COLUMN, XGMML_ORIGIN_NAMESPACE } from "./constants.js";
|
|
41
|
+
|
|
42
|
+
type Table = GraphSnapshot["nodes"];
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The name of a table's graphics column: the json column the XGMML reader keeps `<graphics>` in.
|
|
46
|
+
* @param table - the node, edge or graph table
|
|
47
|
+
* @returns the column's name, or null
|
|
48
|
+
*/
|
|
49
|
+
function graphicsColumnOf(table: Table): string | null {
|
|
50
|
+
for (const col of table) {
|
|
51
|
+
const { origin } = col.meta;
|
|
52
|
+
if (col.dtype === "json" && origin?.type === "graphics" && origin.namespace === XGMML_ORIGIN_NAMESPACE) {
|
|
53
|
+
return col.meta.name;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return table.get(GRAPHICS_COLUMN)?.dtype === "json" ? GRAPHICS_COLUMN : null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Each element's visual properties from its graphics: the graphics values normalized to visual property names, the
|
|
61
|
+
* locked ones (`lockedVisualProperties`, a session view's bypasses) on top.
|
|
62
|
+
* @param table - the node or edge table
|
|
63
|
+
* @param target - nodes or edges
|
|
64
|
+
* @param n - the element count
|
|
65
|
+
* @param notes - where too-deep nesting is noted
|
|
66
|
+
* @returns per element, its visual properties (null without graphics)
|
|
67
|
+
*/
|
|
68
|
+
export function graphicsBypasses(table: Table, target: StyleTarget, n: number, notes: StyleNotes): CytoscapeBypass[] {
|
|
69
|
+
const out = new Array<CytoscapeBypass>(n).fill(null);
|
|
70
|
+
const name = graphicsColumnOf(table);
|
|
71
|
+
if (name === null) {
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
for (let i = 0; i < n; i++) {
|
|
75
|
+
const g = plainCell(table.value(name, i));
|
|
76
|
+
if (g === null || typeof g !== "object" || Array.isArray(g)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const map = normalizeVisualProperties(target, g, notes);
|
|
80
|
+
const locked = Object.hasOwn(g, "lockedVisualProperties")
|
|
81
|
+
? (g as Record<string, unknown>).lockedVisualProperties
|
|
82
|
+
: undefined;
|
|
83
|
+
if (locked !== null && typeof locked === "object") {
|
|
84
|
+
for (const [k, v] of normalizeVisualProperties(target, locked, notes)) {
|
|
85
|
+
map.set(k, v);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
out[i] = map.size > 0 ? map : null;
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** What the XGMML style reader is told by its caller. */
|
|
94
|
+
interface XgmmlStyleSettings {
|
|
95
|
+
/** Whose defaults fill what the file leaves unset. */
|
|
96
|
+
readonly tool: StyleTool;
|
|
97
|
+
/** A bool column marking hidden elements (a Cytoscape 2.x session's hidden state), or null. */
|
|
98
|
+
readonly hiddenColumn?: string | null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The styles of a graph whose elements carry Cytoscape's resolved visual properties in their graphics.
|
|
103
|
+
* @param snapshot - the graph
|
|
104
|
+
* @param context - the budget and cancel signal
|
|
105
|
+
* @param settings - the tool and the hidden-state column
|
|
106
|
+
* @returns the styles (canonical values, no declared rules)
|
|
107
|
+
*/
|
|
108
|
+
export function readXgmmlStyles(
|
|
109
|
+
snapshot: GraphSnapshot,
|
|
110
|
+
context: StyleReadContext,
|
|
111
|
+
settings: XgmmlStyleSettings,
|
|
112
|
+
): ImporterStyles {
|
|
113
|
+
const notes = new StyleNotes();
|
|
114
|
+
const out: Record<StyleTarget, ReaderOutput> = { node: { values: {} }, edge: { values: {} } };
|
|
115
|
+
for (const target of ["node", "edge"] as const) {
|
|
116
|
+
context.signal?.throwIfAborted();
|
|
117
|
+
const table = target === "node" ? snapshot.nodes : snapshot.edges;
|
|
118
|
+
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
119
|
+
const maps = graphicsBypasses(table, target, n, notes);
|
|
120
|
+
const values = maps.some((m) => m !== null)
|
|
121
|
+
? resolveCytoscapeBypasses(target, maps, { notes, budget: context.budget })
|
|
122
|
+
: {};
|
|
123
|
+
hiddenToVisible(table, settings.hiddenColumn ?? null, n, values);
|
|
124
|
+
exactFromBlock(snapshot, target, values);
|
|
125
|
+
out[target] = { values: nonEmpty(values) };
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
canonical: true,
|
|
129
|
+
dialect: "cytoscape",
|
|
130
|
+
tool: settings.tool,
|
|
131
|
+
units: "px",
|
|
132
|
+
node: out.node,
|
|
133
|
+
edge: out.edge,
|
|
134
|
+
graph: graphStyleOf(snapshot, notes),
|
|
135
|
+
notes: notes.list(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The styles of an XGMML file: its elements' resolved values, with Cytoscape desktop's default style beneath.
|
|
141
|
+
* @param snapshot - the graph
|
|
142
|
+
* @param context - the budget and cancel signal
|
|
143
|
+
* @returns the styles
|
|
144
|
+
*/
|
|
145
|
+
export function readXgmmlFileStyles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {
|
|
146
|
+
return readXgmmlStyles(snapshot, context, { tool: "cytoscape" });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* For a file graphty wrote: where an element's value is what the writer's nearest Cytoscape value of the
|
|
151
|
+
* `graphty.styles` block's value reads back as (a font family list written as its first family, a shape Cytoscape
|
|
152
|
+
* does not have), the block's exact value is the truth, so a re-import gives the same rules. A value that differs
|
|
153
|
+
* from what graphty wrote (another program edited it) stays the truth.
|
|
154
|
+
* @param snapshot - the graph
|
|
155
|
+
* @param target - nodes or edges
|
|
156
|
+
* @param values - the values per property, changed in place
|
|
157
|
+
* @param dialect - the Cytoscape dialect the file's values are written in
|
|
158
|
+
*/
|
|
159
|
+
export function exactFromBlock(
|
|
160
|
+
snapshot: GraphSnapshot,
|
|
161
|
+
target: StyleTarget,
|
|
162
|
+
values: Partial<Record<string, StyleColumn>>,
|
|
163
|
+
dialect: CytoscapeDialect = "desktop",
|
|
164
|
+
): void {
|
|
165
|
+
const text = snapshot.graph.has(STYLE_BLOCK_NAME) ? plainCell(snapshot.graph.value(STYLE_BLOCK_NAME, 0)) : null;
|
|
166
|
+
if (typeof text !== "string") {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
|
|
170
|
+
const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "xgmml") : null;
|
|
171
|
+
if (ex === null) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
175
|
+
const want = new Map<string, readonly (StyleValue | null)[]>();
|
|
176
|
+
const exact = (property: string): readonly (StyleValue | null)[] => {
|
|
177
|
+
let held = want.get(property);
|
|
178
|
+
if (held === undefined) {
|
|
179
|
+
held = resolveStyles(ex, target, property as StyleProperty, snapshot);
|
|
180
|
+
want.set(property, held);
|
|
181
|
+
}
|
|
182
|
+
return held;
|
|
183
|
+
};
|
|
184
|
+
// What each element's exact values are written as, read back the way the file is read.
|
|
185
|
+
const written = Array.from({ length: n }, (_v, i) =>
|
|
186
|
+
cytoscapeElementProperties(
|
|
187
|
+
target,
|
|
188
|
+
(property) => exact(property)[i] ?? null,
|
|
189
|
+
dialect,
|
|
190
|
+
() => undefined,
|
|
191
|
+
),
|
|
192
|
+
);
|
|
193
|
+
const readBack = resolveCytoscapeBypasses(target, written, { notes: new StyleNotes() });
|
|
194
|
+
for (const [property, native] of Object.entries(values)) {
|
|
195
|
+
const back = readBack[property];
|
|
196
|
+
if (native !== undefined && back !== undefined) {
|
|
197
|
+
values[property] = withBlockValues(native, back, exact(property));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* A property's values with the block's exact value wherever the file's value is what the writer wrote for it.
|
|
204
|
+
* @param native - the file's values
|
|
205
|
+
* @param back - what the writer wrote for the block's values, read back
|
|
206
|
+
* @param w - the block's values
|
|
207
|
+
* @returns the values, the file's own array when none changes
|
|
208
|
+
*/
|
|
209
|
+
function withBlockValues(
|
|
210
|
+
native: StyleColumn,
|
|
211
|
+
back: readonly (StyleValue | null)[],
|
|
212
|
+
w: readonly (StyleValue | null)[],
|
|
213
|
+
): StyleColumn {
|
|
214
|
+
let changed: (StyleValue | null)[] | null = null;
|
|
215
|
+
for (let i = 0; i < native.length; i++) {
|
|
216
|
+
if (w[i] !== null && native[i] !== w[i] && native[i] === back[i]) {
|
|
217
|
+
changed ??= [...native];
|
|
218
|
+
changed[i] = w[i];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return changed ?? native;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Marks the elements a hidden-state column holds true as not visible.
|
|
226
|
+
* @param table - the node or edge table
|
|
227
|
+
* @param column - the bool column, or null
|
|
228
|
+
* @param n - the element count
|
|
229
|
+
* @param values - the values per property, changed in place
|
|
230
|
+
*/
|
|
231
|
+
export function hiddenToVisible(
|
|
232
|
+
table: Table,
|
|
233
|
+
column: string | null,
|
|
234
|
+
n: number,
|
|
235
|
+
values: Partial<Record<string, StyleColumn>>,
|
|
236
|
+
): void {
|
|
237
|
+
if (column === null || !table.has(column)) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
let visible: (StyleValue | null)[] | null = null;
|
|
241
|
+
for (let i = 0; i < n; i++) {
|
|
242
|
+
if (plainCell(table.value(column, i)) === true) {
|
|
243
|
+
visible ??= values.visible === undefined ? new Array<StyleValue | null>(n).fill(null) : [...values.visible];
|
|
244
|
+
visible[i] = false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (visible !== null) {
|
|
248
|
+
values.visible = visible;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* The properties with at least one value.
|
|
254
|
+
* @param values - per property, each element's value
|
|
255
|
+
* @returns the same without all-null properties
|
|
256
|
+
*/
|
|
257
|
+
export function nonEmpty(values: Partial<Record<string, StyleColumn>>): Partial<Record<StyleProperty, StyleColumn>> {
|
|
258
|
+
const out: Partial<Record<string, StyleColumn>> = {};
|
|
259
|
+
for (const [p, col] of Object.entries(values)) {
|
|
260
|
+
if (col?.some((v) => v !== null) === true) {
|
|
261
|
+
out[p] = col;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* The graph's background from its own graphics (`NETWORK_BACKGROUND_PAINT`).
|
|
269
|
+
* @param snapshot - the graph
|
|
270
|
+
* @param notes - where a bad value is noted
|
|
271
|
+
* @returns the graph style
|
|
272
|
+
*/
|
|
273
|
+
function graphStyleOf(snapshot: GraphSnapshot, notes: StyleNotes): GraphStyle {
|
|
274
|
+
const name = graphicsColumnOf(snapshot.graph);
|
|
275
|
+
const g = name === null ? null : plainCell(snapshot.graph.value(name, 0));
|
|
276
|
+
if (g === null || typeof g !== "object") {
|
|
277
|
+
return {};
|
|
278
|
+
}
|
|
279
|
+
const style = emptyCytoscapeStyle();
|
|
280
|
+
for (const [k, v] of normalizeVisualProperties("node", g, notes)) {
|
|
281
|
+
if (k.startsWith("NETWORK_")) {
|
|
282
|
+
style.network.defaults.set(k, v);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const background = cytoscapeBackground(style, notes);
|
|
286
|
+
return background === null ? {} : { background };
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// ------------------------------------------------------------------ writing
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* What the XGMML writer holds natively: every visual property Cytoscape keeps per element, and the graph's
|
|
293
|
+
* background. The block and the tagged values go into graph and element `<att>`s.
|
|
294
|
+
*/
|
|
295
|
+
export const XGMML_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({
|
|
296
|
+
node: Object.freeze(cytoscapeWritableProperties("node", "desktop") as NodeStyleProperty[]),
|
|
297
|
+
edge: Object.freeze(cytoscapeWritableProperties("edge", "desktop") as EdgeStyleProperty[]),
|
|
298
|
+
graph: Object.freeze(["background"] as const),
|
|
299
|
+
block: "attributes",
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
/** The visual properties Cytoscape also writes as `<graphics>` XML attributes, in its old spelling. */
|
|
303
|
+
const XML_ATTRIBUTES: Readonly<Record<StyleTarget, readonly (readonly [vp: string, attribute: string])[]>> = {
|
|
304
|
+
node: [
|
|
305
|
+
["NODE_SHAPE", "type"],
|
|
306
|
+
["NODE_HEIGHT", "h"],
|
|
307
|
+
["NODE_WIDTH", "w"],
|
|
308
|
+
["NODE_FILL_COLOR", "fill"],
|
|
309
|
+
["NODE_BORDER_WIDTH", "width"],
|
|
310
|
+
["NODE_BORDER_PAINT", "outline"],
|
|
311
|
+
],
|
|
312
|
+
edge: [
|
|
313
|
+
["EDGE_WIDTH", "width"],
|
|
314
|
+
["EDGE_STROKE_UNSELECTED_PAINT", "fill"],
|
|
315
|
+
],
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* One element's graphics record for a file written with styles: what graphty draws as Cytoscape visual properties,
|
|
320
|
+
* the six classic ones also as XML attributes (the importer reads both alike), over the kept graphics' visual
|
|
321
|
+
* properties no neutral property carries (custom graphics, label widths) and edge bends.
|
|
322
|
+
* @param target - nodes or edges
|
|
323
|
+
* @param styles - the exporter's style input
|
|
324
|
+
* @param i - the element index
|
|
325
|
+
* @param kept - the element's kept graphics record, or null
|
|
326
|
+
* @returns the record, or null when there is nothing to write
|
|
327
|
+
*/
|
|
328
|
+
export function styledGraphics(
|
|
329
|
+
target: StyleTarget,
|
|
330
|
+
styles: ExporterStyleInput,
|
|
331
|
+
i: number,
|
|
332
|
+
kept: Record<string, unknown> | null,
|
|
333
|
+
): Record<string, unknown> | null {
|
|
334
|
+
const vps = cytoscapeElementProperties(
|
|
335
|
+
target,
|
|
336
|
+
(p) => styles.picture(target, p as StyleProperty)[i] ?? null,
|
|
337
|
+
"desktop",
|
|
338
|
+
() => undefined,
|
|
339
|
+
);
|
|
340
|
+
const out: Record<string, unknown> = {};
|
|
341
|
+
for (const [vp, attribute] of XML_ATTRIBUTES[target]) {
|
|
342
|
+
if (vps.has(vp)) {
|
|
343
|
+
out[attribute] = String(vps.get(vp));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
for (const [k, v] of Object.entries(kept ?? {})) {
|
|
347
|
+
// a kept visual property the picture does not write, or the edge's bends; old-spelling and nested keys
|
|
348
|
+
// would be read before the picture's values and contradict them
|
|
349
|
+
if (k === "Line" || (/^[A-Z][A-Z_0-9]+$/.test(k) && !vps.has(k))) {
|
|
350
|
+
out[k] = v;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
for (const [vp, v] of vps) {
|
|
354
|
+
out[vp] = String(v);
|
|
355
|
+
}
|
|
356
|
+
return Object.keys(out).length === 0 ? null : out;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* What writing every element's graphics with styles loses: each value written as the nearest one Cytoscape allows,
|
|
361
|
+
* counted per element.
|
|
362
|
+
* @param styles - the exporter's style input
|
|
363
|
+
* @param snapshot - the graph
|
|
364
|
+
* @returns the loss notes
|
|
365
|
+
*/
|
|
366
|
+
export function styledGraphicsNotes(styles: ExporterStyleInput, snapshot: GraphSnapshot): LossNote[] {
|
|
367
|
+
const notes = new StyleNotes();
|
|
368
|
+
for (const target of ["node", "edge"] as const) {
|
|
369
|
+
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
370
|
+
for (let i = 0; i < n; i++) {
|
|
371
|
+
cytoscapeElementProperties(
|
|
372
|
+
target,
|
|
373
|
+
(p) => styles.picture(target, p as StyleProperty)[i] ?? null,
|
|
374
|
+
"desktop",
|
|
375
|
+
(p) => {
|
|
376
|
+
notes.add(STYLE_ISSUE.APPROXIMATED, target, p, { element: i });
|
|
377
|
+
},
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return notes.list().map(lossOf);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* The graph's graphics record for a file written with styles: the kept record with the background replaced.
|
|
386
|
+
* @param styles - the exporter's style input
|
|
387
|
+
* @param kept - the kept graph graphics, or null
|
|
388
|
+
* @returns the record, or null
|
|
389
|
+
*/
|
|
390
|
+
export function styledGraphGraphics(
|
|
391
|
+
styles: ExporterStyleInput,
|
|
392
|
+
kept: Record<string, unknown> | null,
|
|
393
|
+
): Record<string, unknown> | null {
|
|
394
|
+
const { background } = styles.rules.styles.graph;
|
|
395
|
+
const out: Record<string, unknown> = { ...kept };
|
|
396
|
+
if (background !== undefined) {
|
|
397
|
+
out.NETWORK_BACKGROUND_PAINT = background.toUpperCase();
|
|
398
|
+
}
|
|
399
|
+
return Object.keys(out).length === 0 ? null : out;
|
|
400
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -139,6 +139,8 @@ export {
|
|
|
139
139
|
export {
|
|
140
140
|
DOT_ISSUE,
|
|
141
141
|
DOT_LOSS,
|
|
142
|
+
DOT_STYLE_BLOCK_ATTRIBUTE,
|
|
143
|
+
DOT_STYLE_CAPABILITIES,
|
|
142
144
|
dotExporter,
|
|
143
145
|
type DotExportOptions,
|
|
144
146
|
dotImporter,
|
|
@@ -148,15 +150,19 @@ export {
|
|
|
148
150
|
GEXF_1_2_CAPABILITIES,
|
|
149
151
|
GEXF_ISSUE,
|
|
150
152
|
GEXF_LOSS,
|
|
153
|
+
GEXF_STYLE_CAPABILITIES,
|
|
151
154
|
gexfExporter,
|
|
152
155
|
type GexfExportOptions,
|
|
153
156
|
gexfImporter,
|
|
154
157
|
type GexfImportOptions,
|
|
155
158
|
type GexfVersion,
|
|
159
|
+
GRAPHTY_XML_NAMESPACE,
|
|
156
160
|
} from "./formats/gexf/index.js";
|
|
157
161
|
export {
|
|
158
162
|
GML_ISSUE,
|
|
159
163
|
GML_LOSS,
|
|
164
|
+
GML_STYLE_BLOCK_KEY,
|
|
165
|
+
GML_STYLE_CAPABILITIES,
|
|
160
166
|
gmlExporter,
|
|
161
167
|
type GmlExportOptions,
|
|
162
168
|
gmlImporter,
|
|
@@ -165,6 +171,7 @@ export {
|
|
|
165
171
|
export {
|
|
166
172
|
GRAPHML_ISSUE,
|
|
167
173
|
GRAPHML_LOSS,
|
|
174
|
+
GRAPHML_STYLE_CAPABILITIES,
|
|
168
175
|
graphmlExporter,
|
|
169
176
|
type GraphmlExportOptions,
|
|
170
177
|
graphmlImporter,
|
|
@@ -212,6 +219,8 @@ export {
|
|
|
212
219
|
export {
|
|
213
220
|
PAJEK_ISSUE,
|
|
214
221
|
PAJEK_LOSS,
|
|
222
|
+
PAJEK_STYLE_CAPABILITIES,
|
|
223
|
+
PAJEK_STYLE_COMMENT,
|
|
215
224
|
pajekExporter,
|
|
216
225
|
type PajekExportOptions,
|
|
217
226
|
pajekImporter,
|
|
@@ -304,6 +313,7 @@ export {
|
|
|
304
313
|
ImportReportBuilder,
|
|
305
314
|
isAbortError,
|
|
306
315
|
type IssueLocation,
|
|
316
|
+
keptForStyles,
|
|
307
317
|
type MutableCounts,
|
|
308
318
|
PARSE_ERROR_CODE,
|
|
309
319
|
} from "./common/report.js";
|
|
@@ -333,10 +343,16 @@ export {
|
|
|
333
343
|
} from "./common/writer.js";
|
|
334
344
|
export {
|
|
335
345
|
hasIllegalXmlChar,
|
|
346
|
+
MAX_XML_DEPTH,
|
|
336
347
|
tokenizeXml,
|
|
337
348
|
type XmlHandler,
|
|
338
349
|
xmlIllegalTextNotes,
|
|
350
|
+
XmlNestingError,
|
|
339
351
|
type XmlRepairs,
|
|
340
352
|
XmlSyntaxError,
|
|
341
353
|
XmlTokenizer,
|
|
342
354
|
} from "./common/xml.js";
|
|
355
|
+
|
|
356
|
+
// ============================================================ styles through the importer and exporter contracts
|
|
357
|
+
export type { StyleImportOptions } from "./styles/io/generic.js";
|
|
358
|
+
export type { ExporterStyleInput, ExporterStyleOptions } from "./styles/io/writer.js";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The note codes of `extractPositions()`. Singular `W_POSITION_*` codes are about some nodes,
|
|
3
|
+
* plural `W_POSITIONS_*` codes about the file as a whole. Keys drop the `W_` and `POSITION_` /
|
|
4
|
+
* `POSITIONS_` prefixes.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Every code a `PositionNote` carries.
|
|
9
|
+
* @category Positions
|
|
10
|
+
*/
|
|
11
|
+
export const POSITION_ISSUE = Object.freeze({
|
|
12
|
+
/** Every placed node sits on one point; the coordinates are dropped and `usable` is false. */
|
|
13
|
+
STACKED: "W_POSITION_STACKED",
|
|
14
|
+
/** Some nodes have no position. */
|
|
15
|
+
PARTIAL: "W_POSITION_PARTIAL",
|
|
16
|
+
/** Some coordinates are not finite numbers; those nodes count as unplaced. */
|
|
17
|
+
NON_FINITE: "W_POSITION_NON_FINITE",
|
|
18
|
+
/** The file mixes 2- and 3-coordinate positions. */
|
|
19
|
+
DIMS_MIXED: "W_POSITION_DIMS_MIXED",
|
|
20
|
+
/** A top-left coordinate has no width or height, so it was not moved to the center. */
|
|
21
|
+
ANCHOR_NO_SIZE: "W_POSITION_ANCHOR_NO_SIZE",
|
|
22
|
+
/** The file holds more than one view (layout); only the first is used. */
|
|
23
|
+
OTHER_VIEWS: "W_POSITION_OTHER_VIEWS",
|
|
24
|
+
/** The file has position-like columns this format does not read (plain `x` / `y`). */
|
|
25
|
+
NOT_READ: "W_POSITIONS_NOT_READ",
|
|
26
|
+
} as const);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* A code of `POSITION_ISSUE`.
|
|
30
|
+
* @category Positions
|
|
31
|
+
*/
|
|
32
|
+
export type PositionNoteCode = (typeof POSITION_ISSUE)[keyof typeof POSITION_ISSUE];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The coordinate conversions between a file's spelling and the neutral convention (center, y up):
|
|
3
|
+
* the y flip, the top-left anchor shift, and `toFilePositions()`, the inverse a writer uses. Format
|
|
4
|
+
* modules import from here, so they never pull in the reader.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { PositionColumnExtra } from "./types.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A y that grows downward as one that grows upward, and back: a negation that never yields -0.
|
|
11
|
+
* @param y - the coordinate
|
|
12
|
+
* @returns the flipped coordinate
|
|
13
|
+
* @category Positions
|
|
14
|
+
*/
|
|
15
|
+
export function flipY(y: number): number {
|
|
16
|
+
return y === 0 ? 0 : -y;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* One coordinate from a file's spelling into the neutral convention, in place.
|
|
21
|
+
* @param p - x, y, z as the file wrote them; becomes the node's center, y up
|
|
22
|
+
* @param extra - how the file spells it
|
|
23
|
+
* @param size - the node's width and height, for a top-left anchor; null when unknown
|
|
24
|
+
* @param realZ - whether the file has a z that differs between nodes
|
|
25
|
+
*/
|
|
26
|
+
export function toNeutral(
|
|
27
|
+
p: [number, number, number],
|
|
28
|
+
extra: PositionColumnExtra,
|
|
29
|
+
size: readonly [number, number] | null,
|
|
30
|
+
realZ: boolean,
|
|
31
|
+
): void {
|
|
32
|
+
if (extra.anchor === "top-left" && size !== null) {
|
|
33
|
+
p[0] += size[0] / 2;
|
|
34
|
+
p[1] += extra.yAxis === "down" ? size[1] / 2 : -size[1] / 2;
|
|
35
|
+
}
|
|
36
|
+
p[2] = realZ ? p[2] - (extra.zOrigin ?? 0) : 0;
|
|
37
|
+
if (extra.yAxis === "down") {
|
|
38
|
+
// with a real z this turns the drawing 180 degrees about x, so a 3D shape is never mirrored
|
|
39
|
+
p[1] = flipY(p[1]);
|
|
40
|
+
p[2] = flipY(p[2]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Neutral coordinates (center, y up, as `extractPositions()` returns them) back into a column
|
|
46
|
+
* spelled as `extra` declares, for a writer: the y flip, Pajek's z origin and yEd's top-left corner
|
|
47
|
+
* are undone. Rows that are NaN stay NaN.
|
|
48
|
+
* @param coords - x, y, z per node
|
|
49
|
+
* @param extra - the spelling of the column to write
|
|
50
|
+
* @param sizes - each node's width and height, needed for a top-left anchor
|
|
51
|
+
* @param sizes.width - widths by node index
|
|
52
|
+
* @param sizes.height - heights by node index
|
|
53
|
+
* @returns a new array, x, y, z per node in the file's spelling
|
|
54
|
+
* @category Positions
|
|
55
|
+
*/
|
|
56
|
+
export function toFilePositions(
|
|
57
|
+
coords: Float64Array,
|
|
58
|
+
extra: PositionColumnExtra,
|
|
59
|
+
sizes?: { width: Float64Array; height: Float64Array },
|
|
60
|
+
): Float64Array {
|
|
61
|
+
const out = new Float64Array(coords.length);
|
|
62
|
+
const down = extra.yAxis === "down";
|
|
63
|
+
for (let i = 0; i < coords.length; i += 3) {
|
|
64
|
+
let y = coords[i + 1];
|
|
65
|
+
let z = coords[i + 2];
|
|
66
|
+
if (down) {
|
|
67
|
+
y = flipY(y);
|
|
68
|
+
z = flipY(z);
|
|
69
|
+
}
|
|
70
|
+
out[i] = coords[i];
|
|
71
|
+
out[i + 1] = y;
|
|
72
|
+
out[i + 2] = z === 0 && extra.sourceDims !== 3 ? 0 : z + (extra.zOrigin ?? 0);
|
|
73
|
+
const row = i / 3;
|
|
74
|
+
if (extra.anchor === "top-left" && sizes !== undefined) {
|
|
75
|
+
out[i] -= sizes.width[row] / 2;
|
|
76
|
+
out[i + 1] -= down ? sizes.height[row] / 2 : -sizes.height[row] / 2;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The median of some numbers.
|
|
84
|
+
* @param values - the numbers, reordered in place
|
|
85
|
+
* @returns the median, or null for none
|
|
86
|
+
* @category Positions
|
|
87
|
+
*/
|
|
88
|
+
export function median(values: number[]): number | null {
|
|
89
|
+
if (values.length === 0) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
values.sort((a, b) => a - b);
|
|
93
|
+
const mid = values.length >> 1;
|
|
94
|
+
return values.length % 2 === 1 ? values[mid] : (values[mid - 1] + values[mid]) / 2;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* How each built-in writer that writes the position column as it stands spells a coordinate:
|
|
99
|
+
* GML (y down, as yEd draws it) and Pajek (y down, z centered on 0.5). Every other built-in writer
|
|
100
|
+
* either converts the neutral form itself (JSON, XGMML, CX, CX2, Cytoscape sessions, yEd graphics
|
|
101
|
+
* in a styled GraphML) or writes a y-up format (GEXF, DOT).
|
|
102
|
+
*/
|
|
103
|
+
const WRITTEN_SPELLING: Readonly<Record<string, PositionColumnExtra>> = {
|
|
104
|
+
gml: { yAxis: "down" },
|
|
105
|
+
pajek: { yAxis: "down", zOrigin: 0.5 },
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Neutral coordinates (center, y up) as a built-in format's writer expects its position column, so
|
|
110
|
+
* a graph whose positions are in the neutral form is written the way up its program draws it.
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* const column = writtenPositions("gml", coords); // y flipped for GML
|
|
114
|
+
* ```
|
|
115
|
+
* @param format - the format being written
|
|
116
|
+
* @param coords - x, y, z per node; NaN for a node with no position
|
|
117
|
+
* @returns the coordinates to write (the same array when the format needs no conversion)
|
|
118
|
+
* @category Positions
|
|
119
|
+
*/
|
|
120
|
+
export function writtenPositions(format: string, coords: Float64Array): Float64Array {
|
|
121
|
+
const spelling = WRITTEN_SPELLING[format];
|
|
122
|
+
return spelling === undefined ? coords : toFilePositions(coords, spelling);
|
|
123
|
+
}
|