@graphty/graph-io 0.3.42 → 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-CpRyHZ3H.js → exporter-quPUCBiC.js} +1807 -288
- 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 +295 -414
- 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 +23 -7
- 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 +441 -265
- 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 +30 -13
- 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 +543 -323
- 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-CpRyHZ3H.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
|
@@ -423,7 +423,8 @@ class ExportPlan {
|
|
|
423
423
|
this.fatalEdges = new GraphFormatError("E_DIRECTED", gen.message, { reason: "mixed direction" });
|
|
424
424
|
}
|
|
425
425
|
if ((gen.code === LOSS.POSITIONS || gen.code === LOSS.VIZ) && gen.column !== null) {
|
|
426
|
-
// written as a plain property (a point for a position); the role is what is lost
|
|
426
|
+
// written as a plain property (a point for a position); the role is what is lost. Deprecated for
|
|
427
|
+
// the style roles (next major): styles reach a file only through the style writer.
|
|
427
428
|
this.notes.push(
|
|
428
429
|
Object.freeze({
|
|
429
430
|
code: gen.code,
|
|
@@ -24,7 +24,9 @@ import { agree, plural } from "../../common/plural.js";
|
|
|
24
24
|
import { inferTextDtype } from "../../common/text.js";
|
|
25
25
|
import { explicitWeights } from "../../common/weights.js";
|
|
26
26
|
import { encodeChunks, joinText } from "../../common/writer.js";
|
|
27
|
+
import type { ExporterStyleOptions } from "../../styles/io/writer.js";
|
|
27
28
|
import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
|
|
29
|
+
import { PAJEK_STYLE_CAPABILITIES, pajekStyledExport } from "./styles.js";
|
|
28
30
|
import {
|
|
29
31
|
encodeCharacterReferences,
|
|
30
32
|
formatIntervals,
|
|
@@ -37,6 +39,9 @@ import {
|
|
|
37
39
|
SHAPES,
|
|
38
40
|
} from "./syntax.js";
|
|
39
41
|
|
|
42
|
+
/** What the writer takes: the format's options, the common ones and the styles. */
|
|
43
|
+
type PajekWriteOptions = PajekExportOptions & CommonExportOptions & ExporterStyleOptions;
|
|
44
|
+
|
|
40
45
|
/**
|
|
41
46
|
* The format-specific options of the Pajek exporter.
|
|
42
47
|
* @category Built-in formats
|
|
@@ -105,6 +110,8 @@ export const PAJEK_LOSS = Object.freeze({
|
|
|
105
110
|
* reads back with that role.
|
|
106
111
|
*/
|
|
107
112
|
ROLE_ASSUMED: LOSS.ROLE_ASSUMED,
|
|
113
|
+
/** The label column, when a role-less column named `label` is read over it on import. */
|
|
114
|
+
COLUMN_DROPPED: LOSS.COLUMN_DROPPED,
|
|
108
115
|
/**
|
|
109
116
|
* With `sanitizeIds: "mangle"`: an original id that reads back as a different type, such as the text "7" as the
|
|
110
117
|
* number 7.
|
|
@@ -392,16 +399,19 @@ function labelNotes(snapshot: GraphSnapshot, nodePlan: readonly PlannedColumn[],
|
|
|
392
399
|
plain.length - plain.nullCount,
|
|
393
400
|
),
|
|
394
401
|
);
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
402
|
+
// the labels written second on each vertex line are then read over by that parameter
|
|
403
|
+
if (labels !== null && labels !== plain) {
|
|
404
|
+
notes.push(
|
|
405
|
+
note(
|
|
406
|
+
PAJEK_LOSS.COLUMN_DROPPED,
|
|
407
|
+
`node column "${labels.meta.name}" (the labels) reads back replaced by the parameter "${LABEL_COLUMN}"`,
|
|
408
|
+
labels.meta.name,
|
|
409
|
+
labels.length - labels.nullCount,
|
|
410
|
+
),
|
|
411
|
+
);
|
|
403
412
|
}
|
|
404
413
|
}
|
|
414
|
+
const gained = carried === 0 ? 0 : unlabeled(snapshot.nodeCount, labels);
|
|
405
415
|
if (gained > 0) {
|
|
406
416
|
notes.push(
|
|
407
417
|
note(
|
|
@@ -414,6 +424,22 @@ function labelNotes(snapshot: GraphSnapshot, nodePlan: readonly PlannedColumn[],
|
|
|
414
424
|
}
|
|
415
425
|
}
|
|
416
426
|
|
|
427
|
+
/**
|
|
428
|
+
* How many nodes have no label value.
|
|
429
|
+
* @param nodeCount - the node count
|
|
430
|
+
* @param labels - the label column, or null
|
|
431
|
+
* @returns the count
|
|
432
|
+
*/
|
|
433
|
+
function unlabeled(nodeCount: number, labels: Column | null): number {
|
|
434
|
+
let count = 0;
|
|
435
|
+
for (let i = 0; i < nodeCount; i++) {
|
|
436
|
+
if (!labels?.isSet(i)) {
|
|
437
|
+
count++;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return count;
|
|
441
|
+
}
|
|
442
|
+
|
|
417
443
|
/**
|
|
418
444
|
* Whether every set value of a shape column is a Pajek shape keyword.
|
|
419
445
|
* @param column - the shape column (string or dict)
|
|
@@ -689,12 +715,14 @@ function needsZ(column: Column): boolean {
|
|
|
689
715
|
* @param options.networkHeader - whether the `*Network` line is written
|
|
690
716
|
* @param options.name - the name on that line, or null for a bare line
|
|
691
717
|
* @param options.mangle - whether the original ids are written as `graphty_originalId` parameters
|
|
718
|
+
* @param comment - a comment line written first (the `graphty.styles` block), or null
|
|
692
719
|
* @yields lines with their terminator
|
|
693
720
|
* @returns nothing
|
|
694
721
|
*/
|
|
695
722
|
function* writeParts(
|
|
696
723
|
snapshot: GraphSnapshot,
|
|
697
724
|
options: { networkHeader: boolean; name: string | null; mangle: boolean },
|
|
725
|
+
comment: string | null = null,
|
|
698
726
|
): Generator<string, void, undefined> {
|
|
699
727
|
const ids = sanitizeIds(snapshot, CAPABILITIES.idCharset, options.mangle ? "mangle" : "error");
|
|
700
728
|
const nodePlan = withoutReservedKey(plan(snapshot.nodes, "node", null), options.mangle);
|
|
@@ -714,6 +742,9 @@ function* writeParts(
|
|
|
714
742
|
}
|
|
715
743
|
}
|
|
716
744
|
|
|
745
|
+
if (comment !== null) {
|
|
746
|
+
yield `${comment}\n`;
|
|
747
|
+
}
|
|
717
748
|
if (options.networkHeader) {
|
|
718
749
|
yield options.name === null ? "*Network\n" : `*Network ${options.name}\n`;
|
|
719
750
|
}
|
|
@@ -1008,105 +1039,21 @@ export const pajekExporter: GraphExporter<PajekExportOptions> = Object.freeze({
|
|
|
1008
1039
|
format: "pajek",
|
|
1009
1040
|
options: Object.freeze(["name", "networkHeader"]),
|
|
1010
1041
|
capabilities: CAPABILITIES,
|
|
1042
|
+
styles: Object.freeze({ capabilities: PAJEK_STYLE_CAPABILITIES }),
|
|
1011
1043
|
|
|
1012
1044
|
/**
|
|
1013
|
-
* Pre-flight: the generic capability gaps plus the Pajek-specific ones
|
|
1045
|
+
* Pre-flight: the generic capability gaps plus the Pajek-specific ones; with styles, also the values written as
|
|
1046
|
+
* the nearest ones Pajek has.
|
|
1014
1047
|
* @param snapshot - the snapshot
|
|
1015
1048
|
* @param options - export options
|
|
1016
1049
|
* @returns the loss notes, empty when the export is exact
|
|
1017
1050
|
*/
|
|
1018
|
-
check(snapshot: GraphSnapshot, options?:
|
|
1019
|
-
const
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
const planned = plan(snapshot.nodes, "node", notes);
|
|
1023
|
-
const nodePlan = withoutReservedKey(planned, mangle);
|
|
1024
|
-
const edgePlan = plan(snapshot.edges, "edge", notes);
|
|
1025
|
-
const ids = sanitizeIds(snapshot, CAPABILITIES.idCharset, mangle ? "mangle" : "error");
|
|
1026
|
-
checkIdTexts(snapshot.nodeCount, ids, mangle, notes);
|
|
1027
|
-
if (nodePlan.length !== planned.length) {
|
|
1028
|
-
const reserved = planned.find((p) => p.slot === "param" && p.column.meta.name === ORIGINAL_ID_KEY);
|
|
1029
|
-
if (reserved !== undefined) {
|
|
1030
|
-
notes.push(
|
|
1031
|
-
note(
|
|
1032
|
-
PAJEK_LOSS.KEY_DROPPED,
|
|
1033
|
-
`node column "${ORIGINAL_ID_KEY}" is the parameter the exporter writes the original ids under (sanitizeIds "mangle"); it is not written`,
|
|
1034
|
-
ORIGINAL_ID_KEY,
|
|
1035
|
-
reserved.column.length - reserved.column.nullCount,
|
|
1036
|
-
),
|
|
1037
|
-
);
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
// columns this exporter handles itself although the generic table says otherwise: the spells
|
|
1041
|
-
// list (written as an interval token, or reported above with the spells code), the shape
|
|
1042
|
-
// keyword and the relation name (dict columns written as keywords)
|
|
1043
|
-
const owned = new Set<string>();
|
|
1044
|
-
for (const { column, slot } of [...nodePlan, ...edgePlan]) {
|
|
1045
|
-
// a shape written as a parameter is owned too: its note already says the column reads back as string
|
|
1046
|
-
if (
|
|
1047
|
-
slot === "shape" ||
|
|
1048
|
-
slot === "relation" ||
|
|
1049
|
-
(slot === "param" && column.meta.domain === "node" && column.meta.name === SHAPE_COLUMN)
|
|
1050
|
-
) {
|
|
1051
|
-
owned.add(`${column.meta.domain}:${column.meta.name}`);
|
|
1052
|
-
}
|
|
1053
|
-
}
|
|
1054
|
-
for (const table of [snapshot.nodes, snapshot.edges]) {
|
|
1055
|
-
for (const column of table) {
|
|
1056
|
-
if (column.meta.role === "spells") {
|
|
1057
|
-
owned.add(`${column.meta.domain}:${column.meta.name}`);
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
}
|
|
1061
|
-
for (const n of checkCapabilities(snapshot, CAPABILITIES, resolved, {
|
|
1062
|
-
roles: SLOT_ROLES,
|
|
1063
|
-
roleNames: ROLE_NAMES,
|
|
1064
|
-
// the label slot is a vertex slot; an edge label is a parameter under its own name
|
|
1065
|
-
edgeRoleNames: {},
|
|
1066
|
-
})) {
|
|
1067
|
-
if (n.column !== null && (n.code === LOSS.LIST || n.code === LOSS.DTYPE)) {
|
|
1068
|
-
const domain = n.message.startsWith("node column") ? "node" : "edge";
|
|
1069
|
-
if (owned.has(`${domain}:${n.column}`)) {
|
|
1070
|
-
continue;
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
notes.push(n);
|
|
1074
|
-
}
|
|
1075
|
-
labelNotes(snapshot, nodePlan, notes);
|
|
1076
|
-
for (const column of snapshot.edges) {
|
|
1077
|
-
if (column.meta.role === "label") {
|
|
1078
|
-
notes.push(
|
|
1079
|
-
note(
|
|
1080
|
-
LOSS.ROLE,
|
|
1081
|
-
`edge column "${column.meta.name}" (label) is written as a plain parameter; Pajek labels vertices only and the role is lost`,
|
|
1082
|
-
column.meta.name,
|
|
1083
|
-
column.length - column.nullCount,
|
|
1084
|
-
),
|
|
1085
|
-
);
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
checkCells(nodePlan, "node", notes);
|
|
1089
|
-
checkCells(edgePlan, "edge", notes);
|
|
1090
|
-
const folding = pairFolding(snapshot, { foldMutual: true });
|
|
1091
|
-
if (folding.mutualCount > 0) {
|
|
1092
|
-
notes.push(
|
|
1093
|
-
note(
|
|
1094
|
-
PAJEK_LOSS.MUTUAL_AS_UNDIRECTED,
|
|
1095
|
-
`${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as undirected edges; the mutual mark is lost`,
|
|
1096
|
-
snapshot.edges.byRole("mutual")?.meta.name ?? null,
|
|
1097
|
-
folding.mutualCount,
|
|
1098
|
-
),
|
|
1099
|
-
);
|
|
1051
|
+
check(snapshot: GraphSnapshot, options?: PajekWriteOptions): readonly LossNote[] {
|
|
1052
|
+
const styled = pajekStyledExport(snapshot, options?.styles);
|
|
1053
|
+
if (styled === null) {
|
|
1054
|
+
return checkPlain(snapshot, options);
|
|
1100
1055
|
}
|
|
1101
|
-
|
|
1102
|
-
notes.push(
|
|
1103
|
-
note(
|
|
1104
|
-
PAJEK_LOSS.FIRST_MODE_DROPPED,
|
|
1105
|
-
"meta.extra.pajek.firstMode is not a count within 0..nodeCount; the two-mode header is not written",
|
|
1106
|
-
),
|
|
1107
|
-
);
|
|
1108
|
-
}
|
|
1109
|
-
return notes;
|
|
1056
|
+
return Object.freeze([...checkPlain(styled.snapshot, withOriginalIds(options)), ...styled.notes]);
|
|
1110
1057
|
},
|
|
1111
1058
|
|
|
1112
1059
|
/**
|
|
@@ -1115,9 +1062,8 @@ export const pajekExporter: GraphExporter<PajekExportOptions> = Object.freeze({
|
|
|
1115
1062
|
* @param options - export options
|
|
1116
1063
|
* @returns the chunks
|
|
1117
1064
|
*/
|
|
1118
|
-
export(snapshot: GraphSnapshot, options?:
|
|
1119
|
-
|
|
1120
|
-
return encodeChunks(writeParts(snapshot, resolved));
|
|
1065
|
+
export(snapshot: GraphSnapshot, options?: PajekWriteOptions): AsyncIterable<Uint8Array> {
|
|
1066
|
+
return encodeChunks(styledParts(snapshot, options));
|
|
1121
1067
|
},
|
|
1122
1068
|
|
|
1123
1069
|
/**
|
|
@@ -1126,8 +1072,151 @@ export const pajekExporter: GraphExporter<PajekExportOptions> = Object.freeze({
|
|
|
1126
1072
|
* @param options - export options
|
|
1127
1073
|
* @returns the document
|
|
1128
1074
|
*/
|
|
1129
|
-
exportToString(snapshot: GraphSnapshot, options?:
|
|
1130
|
-
|
|
1131
|
-
return joinText(writeParts(snapshot, resolved));
|
|
1075
|
+
exportToString(snapshot: GraphSnapshot, options?: PajekWriteOptions): Promise<string> {
|
|
1076
|
+
return joinText(styledParts(snapshot, options));
|
|
1132
1077
|
},
|
|
1133
1078
|
});
|
|
1079
|
+
|
|
1080
|
+
/**
|
|
1081
|
+
* The text parts of a Pajek document, with its styles when they are given.
|
|
1082
|
+
* @param snapshot - the snapshot
|
|
1083
|
+
* @param options - export options
|
|
1084
|
+
* @returns the parts
|
|
1085
|
+
*/
|
|
1086
|
+
function styledParts(snapshot: GraphSnapshot, options?: PajekWriteOptions): Generator<string, void, undefined> {
|
|
1087
|
+
const styled = pajekStyledExport(snapshot, options?.styles);
|
|
1088
|
+
if (styled === null) {
|
|
1089
|
+
return writeParts(snapshot, resolvePajekOptions(snapshot, options));
|
|
1090
|
+
}
|
|
1091
|
+
return writeParts(styled.snapshot, resolvePajekOptions(styled.snapshot, withOriginalIds(options)), styled.comment);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
/**
|
|
1095
|
+
* The options of an export with styles: unless `sanitizeIds` is given, the original ids of renumbered vertices are
|
|
1096
|
+
* written too (`"mangle"`), so the file reads back as the same graph and its `graphty.styles` block applies.
|
|
1097
|
+
* @param options - export options
|
|
1098
|
+
* @returns the options to write with
|
|
1099
|
+
*/
|
|
1100
|
+
function withOriginalIds(
|
|
1101
|
+
options: (PajekExportOptions & CommonExportOptions) | undefined,
|
|
1102
|
+
): PajekExportOptions & CommonExportOptions {
|
|
1103
|
+
return options?.sanitizeIds === undefined ? { ...options, sanitizeIds: "mangle" } : options;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
/**
|
|
1107
|
+
* The columns this exporter handles itself although the generic table says otherwise: the spells list (written as an
|
|
1108
|
+
* interval token, or reported with the spells code), the shape keyword and the relation name (dict columns written as
|
|
1109
|
+
* keywords), and a shape written as a parameter (its own note says the column reads back as string).
|
|
1110
|
+
* @param snapshot - the snapshot
|
|
1111
|
+
* @param planned - the node and edge column plans
|
|
1112
|
+
* @returns the columns, as `<domain>:<name>`
|
|
1113
|
+
*/
|
|
1114
|
+
function ownedColumns(snapshot: GraphSnapshot, planned: readonly PlannedColumn[]): Set<string> {
|
|
1115
|
+
const owned = new Set<string>();
|
|
1116
|
+
const key = (column: Column): string => `${column.meta.domain}:${column.meta.name}`;
|
|
1117
|
+
for (const { column, slot } of planned) {
|
|
1118
|
+
const shapeParam = slot === "param" && column.meta.domain === "node" && column.meta.name === SHAPE_COLUMN;
|
|
1119
|
+
if (slot === "shape" || slot === "relation" || shapeParam) {
|
|
1120
|
+
owned.add(key(column));
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
for (const column of [...snapshot.nodes, ...snapshot.edges]) {
|
|
1124
|
+
if (column.meta.role === "spells") {
|
|
1125
|
+
owned.add(key(column));
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
return owned;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
/**
|
|
1132
|
+
* The generic capability gaps, without the list and dtype notes of a column Pajek writes in a slot of its own.
|
|
1133
|
+
* @param snapshot - the snapshot
|
|
1134
|
+
* @param resolved - the resolved export options
|
|
1135
|
+
* @param owned - the columns written in a slot of their own, as `<domain>:<name>`
|
|
1136
|
+
* @returns the loss notes
|
|
1137
|
+
*/
|
|
1138
|
+
function capabilityNotes(
|
|
1139
|
+
snapshot: GraphSnapshot,
|
|
1140
|
+
resolved: ReturnType<typeof resolveExportOptions>,
|
|
1141
|
+
owned: ReadonlySet<string>,
|
|
1142
|
+
): LossNote[] {
|
|
1143
|
+
const notes = checkCapabilities(snapshot, CAPABILITIES, resolved, {
|
|
1144
|
+
roles: SLOT_ROLES,
|
|
1145
|
+
roleNames: ROLE_NAMES,
|
|
1146
|
+
// the label slot is a vertex slot; an edge label is a parameter under its own name
|
|
1147
|
+
edgeRoleNames: {},
|
|
1148
|
+
});
|
|
1149
|
+
return notes.filter((n) => {
|
|
1150
|
+
if (n.column === null || (n.code !== LOSS.LIST && n.code !== LOSS.DTYPE)) {
|
|
1151
|
+
return true;
|
|
1152
|
+
}
|
|
1153
|
+
const domain = n.message.startsWith("node column") ? "node" : "edge";
|
|
1154
|
+
return !owned.has(`${domain}:${n.column}`);
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
/**
|
|
1159
|
+
* Every loss the Pajek text of a snapshot would incur: the generic capability gaps plus the Pajek-specific ones.
|
|
1160
|
+
* @param snapshot - the snapshot
|
|
1161
|
+
* @param options - export options
|
|
1162
|
+
* @returns the loss notes
|
|
1163
|
+
*/
|
|
1164
|
+
function checkPlain(snapshot: GraphSnapshot, options?: PajekExportOptions & CommonExportOptions): LossNote[] {
|
|
1165
|
+
const resolved = resolveExportOptions(options);
|
|
1166
|
+
const { mangle } = resolvePajekOptions(snapshot, options);
|
|
1167
|
+
const notes: LossNote[] = [];
|
|
1168
|
+
const planned = plan(snapshot.nodes, "node", notes);
|
|
1169
|
+
const nodePlan = withoutReservedKey(planned, mangle);
|
|
1170
|
+
const edgePlan = plan(snapshot.edges, "edge", notes);
|
|
1171
|
+
const ids = sanitizeIds(snapshot, CAPABILITIES.idCharset, mangle ? "mangle" : "error");
|
|
1172
|
+
checkIdTexts(snapshot.nodeCount, ids, mangle, notes);
|
|
1173
|
+
const reserved =
|
|
1174
|
+
nodePlan.length === planned.length
|
|
1175
|
+
? undefined
|
|
1176
|
+
: planned.find((p) => p.slot === "param" && p.column.meta.name === ORIGINAL_ID_KEY);
|
|
1177
|
+
if (reserved !== undefined) {
|
|
1178
|
+
notes.push(
|
|
1179
|
+
note(
|
|
1180
|
+
PAJEK_LOSS.KEY_DROPPED,
|
|
1181
|
+
`node column "${ORIGINAL_ID_KEY}" is the parameter the exporter writes the original ids under (sanitizeIds "mangle"); it is not written`,
|
|
1182
|
+
ORIGINAL_ID_KEY,
|
|
1183
|
+
reserved.column.length - reserved.column.nullCount,
|
|
1184
|
+
),
|
|
1185
|
+
);
|
|
1186
|
+
}
|
|
1187
|
+
const owned = ownedColumns(snapshot, [...nodePlan, ...edgePlan]);
|
|
1188
|
+
notes.push(...capabilityNotes(snapshot, resolved, owned));
|
|
1189
|
+
labelNotes(snapshot, nodePlan, notes);
|
|
1190
|
+
for (const column of [...snapshot.edges].filter((c) => c.meta.role === "label")) {
|
|
1191
|
+
notes.push(
|
|
1192
|
+
note(
|
|
1193
|
+
LOSS.ROLE,
|
|
1194
|
+
`edge column "${column.meta.name}" (label) is written as a plain parameter; Pajek labels vertices only and the role is lost`,
|
|
1195
|
+
column.meta.name,
|
|
1196
|
+
column.length - column.nullCount,
|
|
1197
|
+
),
|
|
1198
|
+
);
|
|
1199
|
+
}
|
|
1200
|
+
checkCells(nodePlan, "node", notes);
|
|
1201
|
+
checkCells(edgePlan, "edge", notes);
|
|
1202
|
+
const folding = pairFolding(snapshot, { foldMutual: true });
|
|
1203
|
+
if (folding.mutualCount > 0) {
|
|
1204
|
+
notes.push(
|
|
1205
|
+
note(
|
|
1206
|
+
PAJEK_LOSS.MUTUAL_AS_UNDIRECTED,
|
|
1207
|
+
`${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as undirected edges; the mutual mark is lost`,
|
|
1208
|
+
snapshot.edges.byRole("mutual")?.meta.name ?? null,
|
|
1209
|
+
folding.mutualCount,
|
|
1210
|
+
),
|
|
1211
|
+
);
|
|
1212
|
+
}
|
|
1213
|
+
if (Number.isNaN(firstModeOf(snapshot))) {
|
|
1214
|
+
notes.push(
|
|
1215
|
+
note(
|
|
1216
|
+
PAJEK_LOSS.FIRST_MODE_DROPPED,
|
|
1217
|
+
"meta.extra.pajek.firstMode is not a count within 0..nodeCount; the two-mode header is not written",
|
|
1218
|
+
),
|
|
1219
|
+
);
|
|
1220
|
+
}
|
|
1221
|
+
return notes;
|
|
1222
|
+
}
|
|
@@ -68,6 +68,7 @@ import {
|
|
|
68
68
|
type ImportInput,
|
|
69
69
|
type ImportReport,
|
|
70
70
|
} from "../../types.js";
|
|
71
|
+
import { pajekStyles } from "./styles.js";
|
|
71
72
|
import {
|
|
72
73
|
decodeCharacterReferences,
|
|
73
74
|
isCommentOrBlank,
|
|
@@ -78,6 +79,7 @@ import {
|
|
|
78
79
|
isVertexNumber,
|
|
79
80
|
LABEL_COLUMN,
|
|
80
81
|
ORIGINAL_ID_KEY,
|
|
82
|
+
PAJEK_STYLE_COMMENT,
|
|
81
83
|
parseIntervals,
|
|
82
84
|
parseSectionHeader,
|
|
83
85
|
PARTITION_COLUMN,
|
|
@@ -222,6 +224,10 @@ export const PAJEK_ISSUE = Object.freeze({
|
|
|
222
224
|
NEGATIVE_LIST_ENTRY: "W_PAJEK_NEGATIVE_LIST_ENTRY",
|
|
223
225
|
/** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: "string"` to keep every digit. */
|
|
224
226
|
PRECISION: PRECISION_CODE,
|
|
227
|
+
/** A number alone at the end of a row, after its parameters (Pajek writes a trailing `0`); it is ignored. */
|
|
228
|
+
TRAILING_VALUE: "W_PAJEK_TRAILING_VALUE",
|
|
229
|
+
/** A line whose value is `NaN`; the line is kept without a value. */
|
|
230
|
+
NAN_VALUE: "W_PAJEK_NAN_VALUE",
|
|
225
231
|
});
|
|
226
232
|
|
|
227
233
|
/** The common options the Pajek importer reads (the rest is reported by reportUnusedOptions). */
|
|
@@ -251,6 +257,8 @@ const FIRST_VERTEX_VALUES: ReadonlySet<unknown> = new Set([0, 1, "auto"]);
|
|
|
251
257
|
/** A numeral that is not a finite number (`1e999`, `NaN`, `Infinity`): never a parameter key. */
|
|
252
258
|
const NUMERAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
|
|
253
259
|
const NON_FINITE_WORD = /^[+-]?(?:nan|inf|infinity)$/i;
|
|
260
|
+
/** A line value Pajek writes for a missing value. */
|
|
261
|
+
const NAN_WORD = /^[+-]?nan$/i;
|
|
254
262
|
|
|
255
263
|
const LABEL_DECL: ColumnDecl = {
|
|
256
264
|
name: LABEL_COLUMN,
|
|
@@ -291,7 +299,8 @@ function spellsDecl(): ColumnDecl {
|
|
|
291
299
|
}
|
|
292
300
|
|
|
293
301
|
/**
|
|
294
|
-
* The position column declaration (design section 5.2: f64 x 3, role position, units "file")
|
|
302
|
+
* The position column declaration (design section 5.2: f64 x 3, role position, units "file"), with
|
|
303
|
+
* its spelling for `extractPositions()`.
|
|
295
304
|
* @param sourceDims - 2 or 3, the coordinate count of the first vertex line with coordinates
|
|
296
305
|
* @returns a fresh declaration
|
|
297
306
|
*/
|
|
@@ -303,7 +312,9 @@ function positionDecl(sourceDims: number): ColumnDecl {
|
|
|
303
312
|
nullable: true,
|
|
304
313
|
role: "position",
|
|
305
314
|
origin: { format: "pajek", id: "coordinates" },
|
|
306
|
-
|
|
315
|
+
// Pajek draws y downward (USAir97.net has Deadhorse, Alaska at y 0.10 and Miami at 0.53),
|
|
316
|
+
// centers depth on 0.5, and NetworkX writes "0.0 0.0" for a node with no position
|
|
317
|
+
extra: { sourceDims, units: "file", yAxis: "down", zOrigin: 0.5, zeroUnplaced: true },
|
|
307
318
|
};
|
|
308
319
|
}
|
|
309
320
|
|
|
@@ -335,6 +346,8 @@ interface RowExtras {
|
|
|
335
346
|
readonly values: string[];
|
|
336
347
|
/** The spells of an interval token, or null. */
|
|
337
348
|
spells: [number, number][] | null;
|
|
349
|
+
/** A vertex shape keyword written among the parameters (Pajek reads it anywhere), lower-cased, or null. */
|
|
350
|
+
shape: string | null;
|
|
338
351
|
}
|
|
339
352
|
|
|
340
353
|
/** The section the parser is in. */
|
|
@@ -483,6 +496,9 @@ class PajekParser {
|
|
|
483
496
|
|
|
484
497
|
private readonly edgeParams = new Map<string, TextCellWriter>();
|
|
485
498
|
|
|
499
|
+
/** Whether a `% graphty.styles` comment was kept for the style reader. */
|
|
500
|
+
private styleBlockKept = false;
|
|
501
|
+
|
|
486
502
|
/**
|
|
487
503
|
* Create the parser for one import call.
|
|
488
504
|
* @param sink - the sink
|
|
@@ -504,6 +520,22 @@ class PajekParser {
|
|
|
504
520
|
this.coercer = new IdCoercer(options.ids);
|
|
505
521
|
}
|
|
506
522
|
|
|
523
|
+
/**
|
|
524
|
+
* Keep the first `% graphty.styles <json>` comment for the style reader (a file graphty wrote carries its styles
|
|
525
|
+
* there; Pajek skips comment lines).
|
|
526
|
+
* @param text - a comment or blank line
|
|
527
|
+
*/
|
|
528
|
+
private comment(text: string): void {
|
|
529
|
+
if (this.styleBlockKept) {
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
const trimmed = text.trimStart();
|
|
533
|
+
if (trimmed.startsWith(PAJEK_STYLE_COMMENT)) {
|
|
534
|
+
this.styleBlockKept = true;
|
|
535
|
+
this.report.keepForStyles(trimmed.slice(PAJEK_STYLE_COMMENT.length));
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
507
539
|
/**
|
|
508
540
|
* Handle one line; every problem of the line is recorded as an issue and the line skipped.
|
|
509
541
|
* @param text - the line without its terminator
|
|
@@ -512,6 +544,7 @@ class PajekParser {
|
|
|
512
544
|
*/
|
|
513
545
|
line(text: string, line: number): boolean {
|
|
514
546
|
if (isCommentOrBlank(text)) {
|
|
547
|
+
this.comment(text);
|
|
515
548
|
return false;
|
|
516
549
|
}
|
|
517
550
|
const afterObjectHeader = this.objectHeader;
|
|
@@ -1050,6 +1083,7 @@ class PajekParser {
|
|
|
1050
1083
|
i++;
|
|
1051
1084
|
}
|
|
1052
1085
|
const extras = this.extras(tokens, i, "node", line);
|
|
1086
|
+
shape = extras.shape ?? shape;
|
|
1053
1087
|
const restored = this.restoredId(extras);
|
|
1054
1088
|
this.createNodes();
|
|
1055
1089
|
// write
|
|
@@ -1329,6 +1363,14 @@ class PajekParser {
|
|
|
1329
1363
|
if (i < tokens.length && isNumericText(tokens[i])) {
|
|
1330
1364
|
valueText = tokens[i];
|
|
1331
1365
|
i++;
|
|
1366
|
+
} else if (i < tokens.length && NAN_WORD.test(tokens[i])) {
|
|
1367
|
+
this.report.warnOnce(
|
|
1368
|
+
"validation-error",
|
|
1369
|
+
PAJEK_ISSUE.NAN_VALUE,
|
|
1370
|
+
`a line value ${JSON.stringify(tokens[i])} is not a number; the line is kept without a value`,
|
|
1371
|
+
{ line },
|
|
1372
|
+
);
|
|
1373
|
+
i++;
|
|
1332
1374
|
}
|
|
1333
1375
|
const extras = this.extras(tokens, i, "edge", line);
|
|
1334
1376
|
const { weightFrom } = this.options;
|
|
@@ -1607,7 +1649,7 @@ class PajekParser {
|
|
|
1607
1649
|
* @returns the parsed extras
|
|
1608
1650
|
*/
|
|
1609
1651
|
private extras(tokens: readonly string[], start: number, domain: "node" | "edge", line: number): RowExtras {
|
|
1610
|
-
const extras: RowExtras = { keys: [], values: [], spells: null };
|
|
1652
|
+
const extras: RowExtras = { keys: [], values: [], spells: null, shape: null };
|
|
1611
1653
|
const seen = new Set<string>();
|
|
1612
1654
|
for (let i = start; i < tokens.length;) {
|
|
1613
1655
|
const token = tokens[i];
|
|
@@ -1616,13 +1658,14 @@ class PajekParser {
|
|
|
1616
1658
|
i++;
|
|
1617
1659
|
continue;
|
|
1618
1660
|
}
|
|
1661
|
+
if (domain === "node" && isShapeKeyword(token)) {
|
|
1662
|
+
extras.shape = token.toLowerCase();
|
|
1663
|
+
i++;
|
|
1664
|
+
continue;
|
|
1665
|
+
}
|
|
1619
1666
|
if (i + 1 >= tokens.length) {
|
|
1620
|
-
this.
|
|
1621
|
-
|
|
1622
|
-
"parse-error",
|
|
1623
|
-
domain === "node" ? PAJEK_ISSUE.VERTEX_LINE : PAJEK_ISSUE.LINE,
|
|
1624
|
-
`parameter "${token}" has no value`,
|
|
1625
|
-
);
|
|
1667
|
+
this.loneLastToken(token, domain, line);
|
|
1668
|
+
break;
|
|
1626
1669
|
}
|
|
1627
1670
|
if (seen.has(token)) {
|
|
1628
1671
|
this.report.warning(
|
|
@@ -1640,6 +1683,31 @@ class PajekParser {
|
|
|
1640
1683
|
return extras;
|
|
1641
1684
|
}
|
|
1642
1685
|
|
|
1686
|
+
/**
|
|
1687
|
+
* A token alone at the end of a row, with no value after it: a number is ignored (reported once);
|
|
1688
|
+
* anything else is a parameter without its value, which skips the row.
|
|
1689
|
+
* @param token - the token
|
|
1690
|
+
* @param domain - what is skipped when the row is malformed
|
|
1691
|
+
* @param line - the line number
|
|
1692
|
+
*/
|
|
1693
|
+
private loneLastToken(token: string, domain: "node" | "edge", line: number): void {
|
|
1694
|
+
if (isNumericText(token)) {
|
|
1695
|
+
this.report.warnOnce(
|
|
1696
|
+
"validation-error",
|
|
1697
|
+
PAJEK_ISSUE.TRAILING_VALUE,
|
|
1698
|
+
`the number ${JSON.stringify(token)} alone at the end of a row is not a parameter; it is ignored`,
|
|
1699
|
+
{ line },
|
|
1700
|
+
);
|
|
1701
|
+
return;
|
|
1702
|
+
}
|
|
1703
|
+
this.skip(domain);
|
|
1704
|
+
throw new LineError(
|
|
1705
|
+
"parse-error",
|
|
1706
|
+
domain === "node" ? PAJEK_ISSUE.VERTEX_LINE : PAJEK_ISSUE.LINE,
|
|
1707
|
+
`parameter "${token}" has no value`,
|
|
1708
|
+
);
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1643
1711
|
/**
|
|
1644
1712
|
* The spells of a row's interval token; a malformed one skips the row.
|
|
1645
1713
|
* @param token - the token, starting with "["
|
|
@@ -1780,6 +1848,7 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
|
|
|
1780
1848
|
options: Object.freeze(["firstVertex"]),
|
|
1781
1849
|
extensions: Object.freeze([".net", ".paj"]),
|
|
1782
1850
|
mimeTypes: Object.freeze(["text/x-pajek", "text/plain"]),
|
|
1851
|
+
styles: pajekStyles,
|
|
1783
1852
|
|
|
1784
1853
|
/**
|
|
1785
1854
|
* Confidence that the input is a Pajek network: it starts with `*Vertices` (or `*Network`),
|
|
@@ -6,3 +6,5 @@
|
|
|
6
6
|
|
|
7
7
|
export { PAJEK_LOSS, pajekExporter, type PajekExportOptions } from "./exporter.js";
|
|
8
8
|
export { PAJEK_ISSUE, pajekImporter, type PajekImportOptions } from "./importer.js";
|
|
9
|
+
export { PAJEK_STYLE_CAPABILITIES } from "./styles.js";
|
|
10
|
+
export { PAJEK_STYLE_COMMENT } from "./syntax.js";
|