@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,685 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pajek styles: each vertex's shape keyword and drawing parameters (`ic`, `bc`, `bw`, `x_fact`, `y_fact`, `lc`, `fos`)
|
|
3
|
+
* and each line's `c`, `w` and `p`, read the way Pajek draws them, with Pajek's stated defaults beneath (an ellipse,
|
|
4
|
+
* black solid lines, an arrow at the target of every arc). Colors are Pajek's: the dvips names, `GrayNN`,
|
|
5
|
+
* `RGBrrggbb`, `RGB(r,g,b)` and the CMYK forms. `x_fact` and `y_fact` are factors of Pajek's normal vertex size, so the
|
|
6
|
+
* lengths are relative.
|
|
7
|
+
*
|
|
8
|
+
* Writing: the same parameters from what graphty draws, leaving out what Pajek draws by default; a color that is a
|
|
9
|
+
* dvips name is written by name, any other as `RGBrrggbb`, so colors are exact. The `graphty.styles` block, with the
|
|
10
|
+
* per-element values its rules read inside it (Pajek has no other place for them), is one comment line,
|
|
11
|
+
* `% graphty.styles <json>`, which Pajek skips and graph-io reads back.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { GraphSnapshot } from "@graphty/graph-format";
|
|
15
|
+
|
|
16
|
+
import { canonColor, colorOpacity } from "../../styles/canon/color.js";
|
|
17
|
+
import { DVIPS_COLORS } from "../../styles/canon/color-tables.js";
|
|
18
|
+
import { canonEnum } from "../../styles/canon/enums.js";
|
|
19
|
+
import { canonNumber } from "../../styles/canon/number.js";
|
|
20
|
+
import type { CanonSite } from "../../styles/canon/site.js";
|
|
21
|
+
import { canonText } from "../../styles/canon/text.js";
|
|
22
|
+
import { StyleApproximations } from "../../styles/io/approximations.js";
|
|
23
|
+
import { blockStyles, parseStyleBlock, styleBlockLosses, writeStyleBlock } from "../../styles/io/block.js";
|
|
24
|
+
import type { ExporterStyleInput } from "../../styles/io/writer.js";
|
|
25
|
+
import { StyleNotes } from "../../styles/notes.js";
|
|
26
|
+
import { styleFingerprint } from "../../styles/plan/features.js";
|
|
27
|
+
import { plainCell, resolveStyles } from "../../styles/plan/resolve.js";
|
|
28
|
+
import type {
|
|
29
|
+
ImporterStyles,
|
|
30
|
+
StyleColumn,
|
|
31
|
+
StyleReadContext,
|
|
32
|
+
StyleRule,
|
|
33
|
+
StyleTarget,
|
|
34
|
+
StyleValue,
|
|
35
|
+
StyleWriteCapabilities,
|
|
36
|
+
} from "../../styles/types.js";
|
|
37
|
+
import type { LossNote } from "../../types.js";
|
|
38
|
+
import { type ValueColumns, valueColumns } from "../graphml/styles-yed.js";
|
|
39
|
+
import { LABEL_COLUMN, PAJEK_STYLE_COMMENT, SHAPE_COLUMN } from "./syntax.js";
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* What the Pajek writer holds natively: the vertex label, the vertex shape keyword and drawing parameters, the line
|
|
43
|
+
* parameters, and the arrows Pajek draws on arcs. The `graphty.styles` block is a comment line the writer places itself.
|
|
44
|
+
* @category Built-in formats
|
|
45
|
+
*/
|
|
46
|
+
export const PAJEK_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({
|
|
47
|
+
node: Object.freeze([
|
|
48
|
+
"label",
|
|
49
|
+
"fill",
|
|
50
|
+
"fillOpacity",
|
|
51
|
+
"opacity",
|
|
52
|
+
"borderColor",
|
|
53
|
+
"borderWidth",
|
|
54
|
+
"shape",
|
|
55
|
+
"width",
|
|
56
|
+
"height",
|
|
57
|
+
"labelColor",
|
|
58
|
+
"labelSize",
|
|
59
|
+
] as const),
|
|
60
|
+
edge: Object.freeze(["color", "opacity", "width", "lineStyle", "sourceArrow", "targetArrow"] as const),
|
|
61
|
+
block: "native",
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Pajek's default vertex size, in the units of a border width `bw`: `x_fact` and `y_fact` are factors of it, so a
|
|
66
|
+
* border width is read as a factor of it too (`bw 1`, Pajek's default, is a fifth of a normal vertex).
|
|
67
|
+
*/
|
|
68
|
+
const VERTEX_SIZE = 5;
|
|
69
|
+
|
|
70
|
+
/** The vertex parameters read as styles. */
|
|
71
|
+
const NODE_KEYS: readonly string[] = ["ic", "bc", "bw", "x_fact", "y_fact", "lc", "fos"];
|
|
72
|
+
|
|
73
|
+
/** The line parameters read as styles. */
|
|
74
|
+
const EDGE_KEYS: readonly string[] = ["c", "w", "p"];
|
|
75
|
+
|
|
76
|
+
/** The style column marking arcs, which Pajek draws with an arrow at the target. */
|
|
77
|
+
const DIRECTED_KEY = "directed";
|
|
78
|
+
|
|
79
|
+
/** The properties the reader reads, per target: what a file graphty wrote can bring back from its block. */
|
|
80
|
+
const READ: Readonly<Record<StyleTarget, readonly string[]>> = {
|
|
81
|
+
node: [
|
|
82
|
+
"label",
|
|
83
|
+
"shape",
|
|
84
|
+
"fill",
|
|
85
|
+
"fillOpacity",
|
|
86
|
+
"borderColor",
|
|
87
|
+
"borderWidth",
|
|
88
|
+
"width",
|
|
89
|
+
"height",
|
|
90
|
+
"labelColor",
|
|
91
|
+
"labelSize",
|
|
92
|
+
],
|
|
93
|
+
edge: ["color", "opacity", "width", "lineStyle"],
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/** A parameter's value on one element, or null. */
|
|
97
|
+
type Param = (key: string) => unknown;
|
|
98
|
+
|
|
99
|
+
/** Receives one canonical value. */
|
|
100
|
+
type Put = (property: string, value: StyleValue | null) => void;
|
|
101
|
+
|
|
102
|
+
/** The site of a property's value. */
|
|
103
|
+
type At = (property: string) => CanonSite;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Reads a Pajek color and its alpha.
|
|
107
|
+
* @param raw - the parameter's value, or null
|
|
108
|
+
* @param property - the color property
|
|
109
|
+
* @param opacity - its opacity property, or null
|
|
110
|
+
* @param put - receives the values
|
|
111
|
+
* @param at - the sites
|
|
112
|
+
*/
|
|
113
|
+
function readColor(raw: unknown, property: string, opacity: string | null, put: Put, at: At): void {
|
|
114
|
+
if (raw === null) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const c = canonColor(raw, "dvips", at(property));
|
|
118
|
+
if (c === null) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
put(property, c.color);
|
|
122
|
+
const alpha = colorOpacity(c, null, at(property), opacity !== null);
|
|
123
|
+
if (opacity !== null) {
|
|
124
|
+
put(opacity, alpha);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Reads a length or factor.
|
|
130
|
+
* @param raw - the parameter's value, or null
|
|
131
|
+
* @param property - the property
|
|
132
|
+
* @param put - receives the value
|
|
133
|
+
* @param at - the sites
|
|
134
|
+
*/
|
|
135
|
+
function readNumber(raw: unknown, property: string, put: Put, at: At): void {
|
|
136
|
+
if (raw !== null) {
|
|
137
|
+
put(property, canonNumber(raw, at(property)));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* One vertex's style: its label, which Pajek draws beside it, and its shape keyword and drawing parameters.
|
|
143
|
+
* @param get - the vertex's parameters
|
|
144
|
+
* @param put - receives the values
|
|
145
|
+
* @param at - the sites
|
|
146
|
+
*/
|
|
147
|
+
function readVertex(get: Param, put: Put, at: At): void {
|
|
148
|
+
// an empty label draws nothing
|
|
149
|
+
const label = get(LABEL_COLUMN);
|
|
150
|
+
if (label !== null && label !== "") {
|
|
151
|
+
put("label", canonText(label, at("label")));
|
|
152
|
+
}
|
|
153
|
+
const shape = get(SHAPE_COLUMN);
|
|
154
|
+
if (shape !== null) {
|
|
155
|
+
put("shape", canonEnum("shape", shape, "dvips", at("shape")));
|
|
156
|
+
}
|
|
157
|
+
readColor(get("ic"), "fill", "fillOpacity", put, at);
|
|
158
|
+
readColor(get("bc"), "borderColor", null, put, at);
|
|
159
|
+
const bw = get("bw");
|
|
160
|
+
if (bw !== null) {
|
|
161
|
+
const width = canonNumber(bw, at("borderWidth"));
|
|
162
|
+
put("borderWidth", width === null ? null : width / VERTEX_SIZE);
|
|
163
|
+
}
|
|
164
|
+
readNumber(get("x_fact"), "width", put, at);
|
|
165
|
+
readNumber(get("y_fact"), "height", put, at);
|
|
166
|
+
readColor(get("lc"), "labelColor", null, put, at);
|
|
167
|
+
readNumber(get("fos"), "labelSize", put, at);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* One line's style: its color, width and pattern.
|
|
172
|
+
* @param get - the line's parameters
|
|
173
|
+
* @param put - receives the values
|
|
174
|
+
* @param at - the sites
|
|
175
|
+
*/
|
|
176
|
+
function readLine(get: Param, put: Put, at: At): void {
|
|
177
|
+
readColor(get("c"), "color", "opacity", put, at);
|
|
178
|
+
readNumber(get("w"), "width", put, at);
|
|
179
|
+
const p = get("p");
|
|
180
|
+
if (p !== null) {
|
|
181
|
+
put("lineStyle", canonEnum("lineStyle", p, "dvips", at("lineStyle")));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* A table's parameter getter for one element: the cell, or null when the table has no such column or no value.
|
|
187
|
+
* @param table - the node or edge table
|
|
188
|
+
* @param i - the element
|
|
189
|
+
* @returns the getter
|
|
190
|
+
*/
|
|
191
|
+
function cells(table: GraphSnapshot["nodes"], i: number): Param {
|
|
192
|
+
return (key) => (table.has(key) ? plainCell(table.value(key, i)) : null);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Whether each edge is an arc (directed).
|
|
197
|
+
* @param snapshot - the graph
|
|
198
|
+
* @returns one flag per edge
|
|
199
|
+
*/
|
|
200
|
+
function directedEdges(snapshot: GraphSnapshot): boolean[] {
|
|
201
|
+
const out = new Array<boolean>(snapshot.edgeCount).fill(snapshot.directed);
|
|
202
|
+
const col = snapshot.directed ? snapshot.edges.byRole("directed") : null;
|
|
203
|
+
if (col !== null) {
|
|
204
|
+
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
205
|
+
out[e] = plainCell(col.value(e)) !== false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* The columns of a table that hold styles.
|
|
213
|
+
* @param table - the node or edge table
|
|
214
|
+
* @param keys - the style parameters of that table
|
|
215
|
+
* @returns the column names present
|
|
216
|
+
*/
|
|
217
|
+
function styleColumns(table: GraphSnapshot["nodes"], keys: readonly string[]): string[] {
|
|
218
|
+
return keys.filter((k) => table.has(k));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* The styles of a Pajek file, read the way Pajek draws them, with Pajek's stated defaults beneath: a labeled ellipse
|
|
223
|
+
* with a black border, black solid lines, and an arrow at the target of every arc. A file graphty wrote gives back its `graphty.styles` block.
|
|
224
|
+
* @param snapshot - the graph the import built
|
|
225
|
+
* @param context - the work budget and the block text the import kept
|
|
226
|
+
* @returns the styles
|
|
227
|
+
*/
|
|
228
|
+
export function pajekStyles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {
|
|
229
|
+
const notes = new StyleNotes();
|
|
230
|
+
const read = (target: StyleTarget): ValueColumns => {
|
|
231
|
+
const table = target === "node" ? snapshot.nodes : snapshot.edges;
|
|
232
|
+
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
233
|
+
const out = valueColumns(n);
|
|
234
|
+
for (let i = 0; i < n; i++) {
|
|
235
|
+
context.budget.spend(target, 1);
|
|
236
|
+
const at: At = (property) => ({ notes, target, property, element: i, budget: context.budget });
|
|
237
|
+
(target === "node" ? readVertex : readLine)(
|
|
238
|
+
cells(table, i),
|
|
239
|
+
(property, value) => {
|
|
240
|
+
out.put(i, property, value);
|
|
241
|
+
},
|
|
242
|
+
at,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
return out.values;
|
|
246
|
+
};
|
|
247
|
+
const node = read("node");
|
|
248
|
+
const edge = read("edge");
|
|
249
|
+
const block = typeof context.kept === "string" ? context.kept : null;
|
|
250
|
+
if (block !== null) {
|
|
251
|
+
exactFromBlock(snapshot, block, { node, edge });
|
|
252
|
+
}
|
|
253
|
+
// Pajek's default that is a rule: an arc has an arrow at its target, an edge none
|
|
254
|
+
const rules: StyleRule[] = [];
|
|
255
|
+
const columns = new Map<string, StyleColumn>();
|
|
256
|
+
const directed = directedEdges(snapshot);
|
|
257
|
+
if (directed.some(Boolean)) {
|
|
258
|
+
columns.set(
|
|
259
|
+
DIRECTED_KEY,
|
|
260
|
+
directed.map((d) => (d ? true : null)),
|
|
261
|
+
);
|
|
262
|
+
rules.push({
|
|
263
|
+
id: "edge.tool.arrow",
|
|
264
|
+
target: "edge",
|
|
265
|
+
role: "group",
|
|
266
|
+
origin: "tool",
|
|
267
|
+
where: { has: { style: DIRECTED_KEY } },
|
|
268
|
+
set: { targetArrow: "triangle" },
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
canonical: true,
|
|
273
|
+
dialect: "dvips",
|
|
274
|
+
tool: "pajek",
|
|
275
|
+
units: "relative",
|
|
276
|
+
node: { values: node },
|
|
277
|
+
edge: { values: edge, rules, columns },
|
|
278
|
+
notes: notes.list(),
|
|
279
|
+
block,
|
|
280
|
+
readFrom: {
|
|
281
|
+
node: styleColumns(snapshot.nodes, [SHAPE_COLUMN, ...NODE_KEYS]),
|
|
282
|
+
edge: styleColumns(snapshot.edges, EDGE_KEYS),
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ============================================================ writing
|
|
288
|
+
|
|
289
|
+
/** One element's value of a property. */
|
|
290
|
+
type Get = (property: string) => StyleValue | null;
|
|
291
|
+
|
|
292
|
+
/** Records a value written as the nearest one Pajek has. */
|
|
293
|
+
type Approximate = (property: string, value: StyleValue) => void;
|
|
294
|
+
|
|
295
|
+
/** A parameter's written value. */
|
|
296
|
+
type Written = string | number;
|
|
297
|
+
|
|
298
|
+
/** Pajek's shape keywords for graphty's shapes; a shape not listed is written as its nearest. */
|
|
299
|
+
const SHAPES: ReadonlyMap<string, string> = new Map([
|
|
300
|
+
["ellipse", "ellipse"],
|
|
301
|
+
["rectangle", "box"],
|
|
302
|
+
["diamond", "diamond"],
|
|
303
|
+
["triangle", "triangle"],
|
|
304
|
+
["none", "empty"],
|
|
305
|
+
["other:cross", "cross"],
|
|
306
|
+
["other:house", "house"],
|
|
307
|
+
["other:man", "man"],
|
|
308
|
+
["other:woman", "woman"],
|
|
309
|
+
]);
|
|
310
|
+
|
|
311
|
+
/** The nearest Pajek shape of a shape Pajek does not have. */
|
|
312
|
+
const NEAREST_SHAPES: ReadonlyMap<string, string> = new Map([
|
|
313
|
+
["round-rectangle", "box"],
|
|
314
|
+
["parallelogram", "box"],
|
|
315
|
+
["trapezoid", "box"],
|
|
316
|
+
["vee", "triangle"],
|
|
317
|
+
]);
|
|
318
|
+
|
|
319
|
+
/** The dvips name of each color that has one: a color with a name is written by it. */
|
|
320
|
+
const DVIPS_NAMES: ReadonlyMap<string, string> = new Map(
|
|
321
|
+
[...DVIPS_COLORS].reverse().map(([name, hex]) => [hex, name] as const),
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* A color as Pajek writes it: its dvips name when it has one, else `RGBrrggbb`; both are exact.
|
|
326
|
+
* @param color - a canonical `#rrggbb`
|
|
327
|
+
* @returns the text
|
|
328
|
+
*/
|
|
329
|
+
function pajekColorText(color: string): string {
|
|
330
|
+
return DVIPS_NAMES.get(color) ?? `RGB${color.slice(1).toUpperCase()}`;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Notes each opacity below 1: Pajek draws every color opaque.
|
|
335
|
+
* @param get - the element's values
|
|
336
|
+
* @param properties - its opacity properties
|
|
337
|
+
* @param approximate - records approximations
|
|
338
|
+
*/
|
|
339
|
+
function opaque(get: Get, properties: readonly string[], approximate: Approximate): void {
|
|
340
|
+
for (const property of properties) {
|
|
341
|
+
const v = get(property);
|
|
342
|
+
if (v !== null && v !== 1) {
|
|
343
|
+
approximate(property, v);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* A vertex's Pajek shape keyword: its own, else the nearest one (noted), else Pajek's ellipse.
|
|
350
|
+
* @param get - the vertex's values
|
|
351
|
+
* @param approximate - records approximations
|
|
352
|
+
* @returns the keyword
|
|
353
|
+
*/
|
|
354
|
+
function shapeKeyword(get: Get, approximate: Approximate): string {
|
|
355
|
+
const shape = get("shape");
|
|
356
|
+
if (typeof shape !== "string") {
|
|
357
|
+
return "ellipse";
|
|
358
|
+
}
|
|
359
|
+
const keyword = SHAPES.get(shape);
|
|
360
|
+
if (keyword !== undefined) {
|
|
361
|
+
return keyword;
|
|
362
|
+
}
|
|
363
|
+
approximate("shape", shape);
|
|
364
|
+
return NEAREST_SHAPES.get(shape) ?? "ellipse";
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* A vertex's parameters from its values, leaving out the ellipse and the black border 1 wide Pajek draws by default.
|
|
369
|
+
* @param get - the vertex's values
|
|
370
|
+
* @param approximate - records approximations
|
|
371
|
+
* @returns the parameters, the shape keyword under `shape`
|
|
372
|
+
*/
|
|
373
|
+
function vertexParams(get: Get, approximate: Approximate): Map<string, Written> {
|
|
374
|
+
const out = new Map<string, Written>();
|
|
375
|
+
opaque(get, ["fillOpacity", "opacity"], approximate);
|
|
376
|
+
const keyword = shapeKeyword(get, approximate);
|
|
377
|
+
if (keyword !== "ellipse") {
|
|
378
|
+
out.set(SHAPE_COLUMN, keyword);
|
|
379
|
+
}
|
|
380
|
+
const colors = [
|
|
381
|
+
["fill", "ic"],
|
|
382
|
+
["borderColor", "bc"],
|
|
383
|
+
["labelColor", "lc"],
|
|
384
|
+
] as const;
|
|
385
|
+
const numbers = [
|
|
386
|
+
["width", "x_fact"],
|
|
387
|
+
["height", "y_fact"],
|
|
388
|
+
["labelSize", "fos"],
|
|
389
|
+
] as const;
|
|
390
|
+
for (const [property, key] of colors) {
|
|
391
|
+
const v = get(property);
|
|
392
|
+
if (typeof v === "string" && !(property === "borderColor" && v === "#000000")) {
|
|
393
|
+
out.set(key, pajekColorText(v));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
for (const [property, key] of numbers) {
|
|
397
|
+
const v = get(property);
|
|
398
|
+
if (typeof v === "number") {
|
|
399
|
+
out.set(key, v);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
const bw = get("borderWidth");
|
|
403
|
+
if (typeof bw === "number") {
|
|
404
|
+
const written = Number((bw * VERTEX_SIZE).toPrecision(15));
|
|
405
|
+
if (written === 1) {
|
|
406
|
+
out.delete("bw");
|
|
407
|
+
} else {
|
|
408
|
+
out.set("bw", written);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return out;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* A line's parameters from its values, leaving out Pajek's black solid line. Arrows are Pajek's own: an arc has one
|
|
416
|
+
* at its target and an edge none, so any other arrow is noted.
|
|
417
|
+
* @param get - the line's values
|
|
418
|
+
* @param directed - whether the line is an arc
|
|
419
|
+
* @param approximate - records approximations
|
|
420
|
+
* @returns the parameters
|
|
421
|
+
*/
|
|
422
|
+
function lineParams(get: Get, directed: boolean, approximate: Approximate): Map<string, Written> {
|
|
423
|
+
const out = new Map<string, Written>();
|
|
424
|
+
opaque(get, ["opacity"], approximate);
|
|
425
|
+
const color = get("color");
|
|
426
|
+
if (typeof color === "string" && color !== "#000000") {
|
|
427
|
+
out.set("c", pajekColorText(color));
|
|
428
|
+
}
|
|
429
|
+
const width = get("width");
|
|
430
|
+
if (typeof width === "number") {
|
|
431
|
+
out.set("w", width);
|
|
432
|
+
}
|
|
433
|
+
const lineStyle = get("lineStyle");
|
|
434
|
+
if (typeof lineStyle === "string" && lineStyle !== "solid" && pajekDots(lineStyle, approximate)) {
|
|
435
|
+
out.set("p", "Dots");
|
|
436
|
+
}
|
|
437
|
+
const target = get("targetArrow");
|
|
438
|
+
if (target !== null && target !== (directed ? "triangle" : "none")) {
|
|
439
|
+
approximate("targetArrow", target);
|
|
440
|
+
}
|
|
441
|
+
const source = get("sourceArrow");
|
|
442
|
+
if (source !== null && source !== "none") {
|
|
443
|
+
approximate("sourceArrow", source);
|
|
444
|
+
}
|
|
445
|
+
return out;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Whether a line other than a solid one is written as Pajek's Dots: Pajek draws Solid and Dots only; a dashed kind is
|
|
450
|
+
* nearest to Dots, any other line to Solid.
|
|
451
|
+
* @param lineStyle - the line style
|
|
452
|
+
* @param approximate - records approximations
|
|
453
|
+
* @returns true for Dots
|
|
454
|
+
*/
|
|
455
|
+
function pajekDots(lineStyle: string, approximate: Approximate): boolean {
|
|
456
|
+
if (lineStyle === "dotted") {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
approximate("lineStyle", lineStyle);
|
|
460
|
+
return lineStyle === "dashed" || lineStyle === "dash-dot" || lineStyle === "long-dash";
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Each element's values of the properties the writer writes, as a getter per element.
|
|
465
|
+
* @param picture - each element's value of a property
|
|
466
|
+
* @param target - nodes or edges
|
|
467
|
+
* @returns the getter
|
|
468
|
+
*/
|
|
469
|
+
function getter(
|
|
470
|
+
picture: (target: StyleTarget, property: string) => readonly (StyleValue | null)[],
|
|
471
|
+
target: StyleTarget,
|
|
472
|
+
): (i: number) => Get {
|
|
473
|
+
const columns = new Map<string, readonly (StyleValue | null)[]>();
|
|
474
|
+
for (const p of PAJEK_STYLE_CAPABILITIES[target]) {
|
|
475
|
+
columns.set(p, picture(target, p));
|
|
476
|
+
}
|
|
477
|
+
return (i) => (property) => columns.get(property)?.[i] ?? null;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* For a file graphty wrote: where a value read from the parameters is what the writer writes for the block's own
|
|
482
|
+
* value (a hexagon written as an ellipse, a dashed line as Dots), the block's exact value is the truth, so a re-import
|
|
483
|
+
* gives back the same rules; a value another program changed since stays the truth.
|
|
484
|
+
* @param snapshot - the graph
|
|
485
|
+
* @param text - the block's text
|
|
486
|
+
* @param read - the values read, changed in place
|
|
487
|
+
* @param read.node - the node values
|
|
488
|
+
* @param read.edge - the edge values
|
|
489
|
+
*/
|
|
490
|
+
function exactFromBlock(
|
|
491
|
+
snapshot: GraphSnapshot,
|
|
492
|
+
text: string,
|
|
493
|
+
read: { readonly node: ValueColumns; readonly edge: ValueColumns },
|
|
494
|
+
): void {
|
|
495
|
+
const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
|
|
496
|
+
const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "pajek") : null;
|
|
497
|
+
if (ex === null) {
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
const notes = new StyleNotes();
|
|
501
|
+
const directed = directedEdges(snapshot);
|
|
502
|
+
for (const target of ["node", "edge"] as const) {
|
|
503
|
+
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
504
|
+
const get = getter((t, p) => resolveStyles(ex, t, p as never, snapshot), target);
|
|
505
|
+
const values = read[target];
|
|
506
|
+
for (let i = 0; i < n; i++) {
|
|
507
|
+
const want = get(i);
|
|
508
|
+
const back = writtenAndReadBack(target, want, directed[i], notes);
|
|
509
|
+
for (const property of READ[target]) {
|
|
510
|
+
const native = values[property]?.[i] ?? null;
|
|
511
|
+
const w = want(property);
|
|
512
|
+
if (w !== null && native !== w && native === (back.get(property) ?? null)) {
|
|
513
|
+
values[property] ??= new Array<StyleValue | null>(n).fill(null);
|
|
514
|
+
values[property][i] = w;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* An element's values written as the writer writes them and read back as the reader reads them.
|
|
523
|
+
* @param target - nodes or edges
|
|
524
|
+
* @param want - its values
|
|
525
|
+
* @param directed - for a line, whether it is an arc
|
|
526
|
+
* @param notes - a scratch for the notes the round trip makes
|
|
527
|
+
* @returns the values read back, by property
|
|
528
|
+
*/
|
|
529
|
+
function writtenAndReadBack(
|
|
530
|
+
target: StyleTarget,
|
|
531
|
+
want: Get,
|
|
532
|
+
directed: boolean,
|
|
533
|
+
notes: StyleNotes,
|
|
534
|
+
): Map<string, StyleValue> {
|
|
535
|
+
const ignore: Approximate = () => undefined;
|
|
536
|
+
const params = target === "node" ? vertexParams(want, ignore) : lineParams(want, directed, ignore);
|
|
537
|
+
const back = new Map<string, StyleValue>();
|
|
538
|
+
const label = target === "node" ? want("label") : null;
|
|
539
|
+
if (typeof label === "string") {
|
|
540
|
+
params.set(LABEL_COLUMN, pajekLabelText(label));
|
|
541
|
+
}
|
|
542
|
+
(target === "node" ? readVertex : readLine)(
|
|
543
|
+
(key) => params.get(key) ?? null,
|
|
544
|
+
(property, value) => {
|
|
545
|
+
if (value !== null) {
|
|
546
|
+
back.set(property, value);
|
|
547
|
+
}
|
|
548
|
+
},
|
|
549
|
+
(property) => ({ notes, target, property }),
|
|
550
|
+
);
|
|
551
|
+
return back;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/** A Pajek export with styles worked out. */
|
|
555
|
+
interface PajekStyledExport {
|
|
556
|
+
/** The graph to write: the shape keyword and parameters written from the styles. */
|
|
557
|
+
readonly snapshot: GraphSnapshot;
|
|
558
|
+
/** The comment line carrying the `graphty.styles` block, without its line end. */
|
|
559
|
+
readonly comment: string;
|
|
560
|
+
/** W_STYLE_APPROXIMATED for every value written as the nearest one Pajek has. */
|
|
561
|
+
readonly notes: readonly LossNote[];
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Works out a Pajek export with styles: every vertex's shape keyword and drawing parameters and every line's `c`, `w`
|
|
566
|
+
* and `p` from what graphty draws, in place of every such parameter it had, and the `graphty.styles` block, with the
|
|
567
|
+
* per-element values its rules read inside it, as a comment line.
|
|
568
|
+
* @param snapshot - the graph handed to the exporter
|
|
569
|
+
* @param input - the styles, or undefined when none are written
|
|
570
|
+
* @returns the styled export, or null without styles
|
|
571
|
+
*/
|
|
572
|
+
export function pajekStyledExport(
|
|
573
|
+
snapshot: GraphSnapshot,
|
|
574
|
+
input: ExporterStyleInput | undefined,
|
|
575
|
+
): PajekStyledExport | null {
|
|
576
|
+
if (input === undefined) {
|
|
577
|
+
return null;
|
|
578
|
+
}
|
|
579
|
+
const approximated = new StyleApproximations();
|
|
580
|
+
const out = snapshot.withColumns();
|
|
581
|
+
const directed = directedEdges(snapshot);
|
|
582
|
+
for (const target of ["node", "edge"] as const) {
|
|
583
|
+
const table = target === "node" ? out.nodes : out.edges;
|
|
584
|
+
const approximate: Approximate = (property, value) => {
|
|
585
|
+
approximated.add(target, property, value);
|
|
586
|
+
};
|
|
587
|
+
const get = getter((t, p) => input.picture(t, p as never), target);
|
|
588
|
+
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
589
|
+
const params = (i: number): Map<string, Written> =>
|
|
590
|
+
target === "node" ? vertexParams(get(i), approximate) : lineParams(get(i), directed[i], approximate);
|
|
591
|
+
replaceParamColumns(
|
|
592
|
+
table,
|
|
593
|
+
target === "node" ? [SHAPE_COLUMN, ...NODE_KEYS] : EDGE_KEYS,
|
|
594
|
+
paramColumns(n, params),
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
out.nodes.set(
|
|
598
|
+
LABEL_COLUMN,
|
|
599
|
+
drawnLabels(input, snapshot.nodeCount, approximated),
|
|
600
|
+
{ dtype: "string", role: "label" },
|
|
601
|
+
{
|
|
602
|
+
replaceRole: true,
|
|
603
|
+
},
|
|
604
|
+
);
|
|
605
|
+
const notes = approximated.notes("Pajek");
|
|
606
|
+
const block = writeStyleBlock(input.rules, { inlineColumns: true, snapshot });
|
|
607
|
+
notes.push(...styleBlockLosses(block, input.rules.styles.rules.length, "size"));
|
|
608
|
+
return { snapshot: out, comment: PAJEK_STYLE_COMMENT + block, notes };
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Each vertex's label as graphty draws it; a vertex graphty draws without one gets an empty label, which Pajek draws
|
|
613
|
+
* as nothing (with no label, Pajek writes and draws the vertex's id).
|
|
614
|
+
* @param input - the styles
|
|
615
|
+
* @param n - the vertex count
|
|
616
|
+
* @param approximated - records approximations
|
|
617
|
+
* @returns the labels
|
|
618
|
+
*/
|
|
619
|
+
function drawnLabels(input: ExporterStyleInput, n: number, approximated: StyleApproximations): string[] {
|
|
620
|
+
const drawn = input.picture("node", "label");
|
|
621
|
+
const out = new Array<string>(n).fill("");
|
|
622
|
+
for (let i = 0; i < n; i++) {
|
|
623
|
+
const v = drawn[i] ?? null;
|
|
624
|
+
if (typeof v === "string") {
|
|
625
|
+
out[i] = pajekLabelText(v);
|
|
626
|
+
if (out[i] !== v) {
|
|
627
|
+
approximated.add("node", "label", v);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return out;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* A label as Pajek can write it: a line break becomes a space and a double quote a single one, which Pajek's labels
|
|
636
|
+
* cannot hold.
|
|
637
|
+
* @param label - the label graphty draws
|
|
638
|
+
* @returns the text written
|
|
639
|
+
*/
|
|
640
|
+
function pajekLabelText(label: string): string {
|
|
641
|
+
return label.replaceAll(/\r\n|[\r\n]/g, " ").replaceAll('"', "'");
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Replaces every drawing parameter column of a table with the ones written from the styles.
|
|
646
|
+
* @param table - the node or edge columns, changed in place
|
|
647
|
+
* @param keys - every drawing parameter key of the target
|
|
648
|
+
* @param columns - the written columns, by key
|
|
649
|
+
*/
|
|
650
|
+
function replaceParamColumns(
|
|
651
|
+
table: ReturnType<GraphSnapshot["withColumns"]>["nodes"],
|
|
652
|
+
keys: readonly string[],
|
|
653
|
+
columns: Map<string, (Written | null)[]>,
|
|
654
|
+
): void {
|
|
655
|
+
for (const key of keys) {
|
|
656
|
+
if (table.has(key)) {
|
|
657
|
+
table.remove(key);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
for (const [key, col] of columns) {
|
|
661
|
+
const numeric = col.every((v) => v === null || typeof v === "number");
|
|
662
|
+
table.set(key, col, { dtype: numeric ? "f64" : "string" });
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Every element's parameters, as columns.
|
|
668
|
+
* @param n - the element count
|
|
669
|
+
* @param params - an element's parameters
|
|
670
|
+
* @returns the columns, by parameter key
|
|
671
|
+
*/
|
|
672
|
+
function paramColumns(n: number, params: (i: number) => Map<string, Written>): Map<string, (Written | null)[]> {
|
|
673
|
+
const columns = new Map<string, (Written | null)[]>();
|
|
674
|
+
for (let i = 0; i < n; i++) {
|
|
675
|
+
for (const [key, value] of params(i)) {
|
|
676
|
+
let col = columns.get(key);
|
|
677
|
+
if (col === undefined) {
|
|
678
|
+
col = new Array<Written | null>(n).fill(null);
|
|
679
|
+
columns.set(key, col);
|
|
680
|
+
}
|
|
681
|
+
col[i] = value;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
return columns;
|
|
685
|
+
}
|
|
@@ -110,6 +110,13 @@ type SectionKind =
|
|
|
110
110
|
*/
|
|
111
111
|
export const ORIGINAL_ID_KEY = "graphty_originalId";
|
|
112
112
|
|
|
113
|
+
/**
|
|
114
|
+
* How a file graphty wrote carries its `graphty.styles` block: a comment line starting with this text, then the
|
|
115
|
+
* block's JSON. Pajek skips comment lines; graph-io reads the block back.
|
|
116
|
+
* @category Built-in formats
|
|
117
|
+
*/
|
|
118
|
+
export const PAJEK_STYLE_COMMENT = "% graphty.styles ";
|
|
119
|
+
|
|
113
120
|
/**
|
|
114
121
|
* A parsed section header line.
|
|
115
122
|
* @category Plugin helpers
|