@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
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
UNKNOWN_ELEMENT_CODE,
|
|
68
68
|
UNKNOWN_PARENT_CODE,
|
|
69
69
|
UNKNOWN_XML_ATTRIBUTE_CODE,
|
|
70
|
+
XML_NESTING_CODE,
|
|
70
71
|
XML_SYNTAX_CODE,
|
|
71
72
|
} from "../../common/codes.js";
|
|
72
73
|
import { type DeclaredTypeSpec, overflowsToInfinity, parseDecimalText } from "../../common/declared-types.js";
|
|
@@ -91,8 +92,10 @@ import {
|
|
|
91
92
|
xmlDeclaredEncoding,
|
|
92
93
|
XmlEmptyInputError,
|
|
93
94
|
type XmlHandler,
|
|
95
|
+
XmlNestingError,
|
|
94
96
|
XmlSyntaxError,
|
|
95
97
|
} from "../../common/xml.js";
|
|
98
|
+
import { MAX_STYLE_BLOCK_LENGTH } from "../../styles/io/block.js";
|
|
96
99
|
import { type CommonImportOptions, type GraphImporter, type ImportInput, type ImportReport } from "../../types.js";
|
|
97
100
|
import {
|
|
98
101
|
EDGE_DECLS,
|
|
@@ -109,6 +112,7 @@ import {
|
|
|
109
112
|
TIME_FORMATS,
|
|
110
113
|
TIME_REPRESENTATIONS,
|
|
111
114
|
} from "./schema.js";
|
|
115
|
+
import { canonVizColor, gexfStyles, GRAPHTY_XML_NAMESPACE } from "./styles.js";
|
|
112
116
|
|
|
113
117
|
/**
|
|
114
118
|
* The format-specific options of the GEXF importer.
|
|
@@ -118,7 +122,9 @@ export interface GexfImportOptions extends CommonImportOptions {
|
|
|
118
122
|
/**
|
|
119
123
|
* Whether to read the visual attributes of Gephi's viz namespace (color, position, size, shape,
|
|
120
124
|
* thickness) into node and edge attributes; false skips them, with one W_GEXF_VIZ_SKIPPED
|
|
121
|
-
* warning.
|
|
125
|
+
* warning. The color, size, shape and thickness columns are deprecated and leave the import
|
|
126
|
+
* result in the next major version: read a file's styles with `styles: true` instead. The
|
|
127
|
+
* position column stays.
|
|
122
128
|
* @defaultValue true
|
|
123
129
|
*/
|
|
124
130
|
viz?: boolean | undefined;
|
|
@@ -184,6 +190,11 @@ export const WEIGHT_IGNORED_CODE = "W_GEXF_WEIGHT_IGNORED";
|
|
|
184
190
|
* @category Issue and loss codes
|
|
185
191
|
*/
|
|
186
192
|
export const VIZ_SKIPPED_CODE = "W_GEXF_VIZ_SKIPPED";
|
|
193
|
+
/**
|
|
194
|
+
* GEXF 1.0 only: a `pid` naming no node. Gephi 0.6 wrote `pid="0"` on top-level nodes; the node stays top-level.
|
|
195
|
+
* @category Built-in formats
|
|
196
|
+
*/
|
|
197
|
+
export const UNKNOWN_PID_CODE = "W_GEXF_UNKNOWN_PID";
|
|
187
198
|
/**
|
|
188
199
|
* A 1.2 dynamic viz element (its bounds are dropped, the value kept).
|
|
189
200
|
* @category Issue and loss codes
|
|
@@ -234,6 +245,10 @@ const VERSIONS: ReadonlySet<string> = new Set(["1.0", "1.1", "1.2", "1.3"]);
|
|
|
234
245
|
* @returns the version, or null
|
|
235
246
|
*/
|
|
236
247
|
function namespaceVersion(ns: string | null): string | null {
|
|
248
|
+
if (ns !== null && /gephi\.org\/gexf\/?$/.test(ns)) {
|
|
249
|
+
// GEXF 1.0, as Gephi 0.6 wrote it
|
|
250
|
+
return "1.0";
|
|
251
|
+
}
|
|
237
252
|
const match = ns === null ? null : /gexf\.net\/(1\.[0-3])/.exec(ns);
|
|
238
253
|
return match === null ? null : match[1];
|
|
239
254
|
}
|
|
@@ -313,8 +328,16 @@ const EDGE_TYPES: ReadonlySet<string> = new Set(["directed", "undirected", "mutu
|
|
|
313
328
|
* @returns the text trimmed and in lower case
|
|
314
329
|
*/
|
|
315
330
|
function edgeTypeKeyword(text: string): string {
|
|
316
|
-
|
|
331
|
+
const keyword = text.trim().toLowerCase();
|
|
332
|
+
return EDGE_TYPE_ALIASES.get(keyword) ?? keyword;
|
|
317
333
|
}
|
|
334
|
+
|
|
335
|
+
/** GEXF 1.0's spellings of the edge types. */
|
|
336
|
+
const EDGE_TYPE_ALIASES: ReadonlyMap<string, string> = new Map([
|
|
337
|
+
["dir", "directed"],
|
|
338
|
+
["undir", "undirected"],
|
|
339
|
+
["double", "mutual"],
|
|
340
|
+
]);
|
|
318
341
|
const ABORT_CHECK_INTERVAL = 64;
|
|
319
342
|
|
|
320
343
|
/** The XML attributes the importer reads on `<node>`; any other one is reported once. */
|
|
@@ -392,6 +415,16 @@ interface TrackedAttribute {
|
|
|
392
415
|
table: ExtensionHandle;
|
|
393
416
|
}
|
|
394
417
|
|
|
418
|
+
/** A `<parents>` list waiting for every node to be declared. */
|
|
419
|
+
interface ParentsRef {
|
|
420
|
+
/** The child's node index. */
|
|
421
|
+
readonly child: number;
|
|
422
|
+
/** The parents' ids. */
|
|
423
|
+
readonly ids: readonly NodeId[];
|
|
424
|
+
/** Where the list was read. */
|
|
425
|
+
readonly where: IssueLocation;
|
|
426
|
+
}
|
|
427
|
+
|
|
395
428
|
/** A pending containment reference resolved after every node is declared. */
|
|
396
429
|
interface ParentRef {
|
|
397
430
|
/** The child's node index. */
|
|
@@ -537,6 +570,8 @@ const enum Ctx {
|
|
|
537
570
|
Edges,
|
|
538
571
|
Edge,
|
|
539
572
|
Skip,
|
|
573
|
+
/** graphty's `graphty.styles` block inside `<meta>`. */
|
|
574
|
+
StyleBlock,
|
|
540
575
|
}
|
|
541
576
|
|
|
542
577
|
/** An open `<node>`: its index (INVALID_INDEX when the node was skipped) and location. */
|
|
@@ -603,6 +638,15 @@ class GexfReader implements XmlHandler {
|
|
|
603
638
|
|
|
604
639
|
private metaField: "creator" | "description" | "keywords" | null = null;
|
|
605
640
|
|
|
641
|
+
/** The text of graphty's `graphty.styles` block, read up to one character past the longest block read. */
|
|
642
|
+
private styleBlock = "";
|
|
643
|
+
|
|
644
|
+
/** GEXF 1.0 only: nodes added for edges read before `<nodes>`, until their `<node>` declares them. */
|
|
645
|
+
private readonly implicitNodes = new Map<number, NodeId>();
|
|
646
|
+
|
|
647
|
+
/** GEXF 1.0 only: `<edges>` came before `<nodes>`, so an edge's ends are added until `<node>` declares them. */
|
|
648
|
+
private edgesFirst = false;
|
|
649
|
+
|
|
606
650
|
private readonly nodeAttrs = new Map<string, TrackedAttribute>();
|
|
607
651
|
|
|
608
652
|
private readonly edgeAttrs = new Map<string, TrackedAttribute>();
|
|
@@ -638,8 +682,7 @@ class GexfReader implements XmlHandler {
|
|
|
638
682
|
|
|
639
683
|
private parentRefs: ParentRef[] = [];
|
|
640
684
|
|
|
641
|
-
private parentsRefs:
|
|
642
|
-
[];
|
|
685
|
+
private parentsRefs: ParentsRef[] = [];
|
|
643
686
|
|
|
644
687
|
private readonly unknownAttributes = new Set<string>();
|
|
645
688
|
|
|
@@ -748,6 +791,7 @@ class GexfReader implements XmlHandler {
|
|
|
748
791
|
parent !== Ctx.Skip &&
|
|
749
792
|
parent !== Ctx.MetaText &&
|
|
750
793
|
parent !== Ctx.AttributeText &&
|
|
794
|
+
parent !== Ctx.StyleBlock &&
|
|
751
795
|
!name.startsWith("viz:")
|
|
752
796
|
) {
|
|
753
797
|
// an undeclared prefix or a name that is not namespace-well-formed (<:node>, <a:b:node>)
|
|
@@ -767,7 +811,7 @@ class GexfReader implements XmlHandler {
|
|
|
767
811
|
this.startInGexf(name, local, attrs, line);
|
|
768
812
|
return;
|
|
769
813
|
case Ctx.Meta:
|
|
770
|
-
this.startInMeta(name, local, line);
|
|
814
|
+
this.startInMeta(name, local, line, ns);
|
|
771
815
|
return;
|
|
772
816
|
case Ctx.Graph:
|
|
773
817
|
this.startInGraph(name, local, attrs, line);
|
|
@@ -801,6 +845,7 @@ class GexfReader implements XmlHandler {
|
|
|
801
845
|
return;
|
|
802
846
|
case Ctx.MetaText:
|
|
803
847
|
case Ctx.AttributeText:
|
|
848
|
+
case Ctx.StyleBlock:
|
|
804
849
|
case Ctx.Skip:
|
|
805
850
|
this.ctx.push(Ctx.Skip);
|
|
806
851
|
return;
|
|
@@ -823,8 +868,21 @@ class GexfReader implements XmlHandler {
|
|
|
823
868
|
case Ctx.MetaText:
|
|
824
869
|
this.finishMetaText();
|
|
825
870
|
return;
|
|
871
|
+
case Ctx.StyleBlock:
|
|
872
|
+
this.report.keepForStyles(this.styleBlock);
|
|
873
|
+
this.styleBlock = "";
|
|
874
|
+
return;
|
|
826
875
|
case Ctx.Graph:
|
|
827
876
|
this.resolveParents();
|
|
877
|
+
if (!this.nodesSeen && this.implicitNodes.size > 0) {
|
|
878
|
+
this.report.error(
|
|
879
|
+
"validation-error",
|
|
880
|
+
MISSING_NODES_CODE,
|
|
881
|
+
"the graph declares <edges> but no <nodes>",
|
|
882
|
+
);
|
|
883
|
+
} else if (!this.options.addMissingNodes) {
|
|
884
|
+
this.dropUndeclaredNodes();
|
|
885
|
+
}
|
|
828
886
|
return;
|
|
829
887
|
case Ctx.Attributes:
|
|
830
888
|
this.attributeGroup = null;
|
|
@@ -878,6 +936,12 @@ class GexfReader implements XmlHandler {
|
|
|
878
936
|
case Ctx.AttributeText:
|
|
879
937
|
this.attributeTextValue += text;
|
|
880
938
|
return;
|
|
939
|
+
case Ctx.StyleBlock:
|
|
940
|
+
// past the longest block read, one more character is enough to say it is too large
|
|
941
|
+
if (this.styleBlock.length <= MAX_STYLE_BLOCK_LENGTH) {
|
|
942
|
+
this.styleBlock += text.slice(0, MAX_STYLE_BLOCK_LENGTH + 1 - this.styleBlock.length);
|
|
943
|
+
}
|
|
944
|
+
return;
|
|
881
945
|
case Ctx.Skip:
|
|
882
946
|
return;
|
|
883
947
|
default:
|
|
@@ -990,8 +1054,14 @@ class GexfReader implements XmlHandler {
|
|
|
990
1054
|
* @param name - the element name
|
|
991
1055
|
* @param local - its local name
|
|
992
1056
|
* @param line - the line
|
|
1057
|
+
* @param ns - its namespace
|
|
993
1058
|
*/
|
|
994
|
-
private startInMeta(name: string, local: string, line: number): void {
|
|
1059
|
+
private startInMeta(name: string, local: string, line: number, ns: string | null): void {
|
|
1060
|
+
if (ns === GRAPHTY_XML_NAMESPACE && local === "styles") {
|
|
1061
|
+
this.styleBlock = "";
|
|
1062
|
+
this.ctx.push(Ctx.StyleBlock);
|
|
1063
|
+
return;
|
|
1064
|
+
}
|
|
995
1065
|
if (local === "creator" || local === "description" || local === "keywords") {
|
|
996
1066
|
this.metaField = local;
|
|
997
1067
|
this.metaText = "";
|
|
@@ -1134,7 +1204,10 @@ class GexfReader implements XmlHandler {
|
|
|
1134
1204
|
this.beginSection(attrs, "node", line);
|
|
1135
1205
|
return;
|
|
1136
1206
|
case "edges":
|
|
1137
|
-
if (!this.nodesSeen) {
|
|
1207
|
+
if (!this.nodesSeen && this.meta.sourceVersion === "1.0") {
|
|
1208
|
+
// GEXF 1.0 files (Gephi 0.6) may list their edges before their nodes
|
|
1209
|
+
this.edgesFirst = true;
|
|
1210
|
+
} else if (!this.nodesSeen) {
|
|
1138
1211
|
this.report.error(
|
|
1139
1212
|
"validation-error",
|
|
1140
1213
|
MISSING_NODES_CODE,
|
|
@@ -1534,7 +1607,9 @@ class GexfReader implements XmlHandler {
|
|
|
1534
1607
|
try {
|
|
1535
1608
|
const id = this.coerceId(idText, where);
|
|
1536
1609
|
const existing = sink.indexOf(id);
|
|
1537
|
-
if (existing !== INVALID_INDEX) {
|
|
1610
|
+
if (existing !== INVALID_INDEX && this.implicitNodes.delete(existing)) {
|
|
1611
|
+
index = existing;
|
|
1612
|
+
} else if (existing !== INVALID_INDEX) {
|
|
1538
1613
|
report.warning(
|
|
1539
1614
|
"validation-error",
|
|
1540
1615
|
DUPLICATE_NODE_CODE,
|
|
@@ -1728,20 +1803,8 @@ class GexfReader implements XmlHandler {
|
|
|
1728
1803
|
return false;
|
|
1729
1804
|
};
|
|
1730
1805
|
for (const ref of refs) {
|
|
1731
|
-
|
|
1732
|
-
if (ref.
|
|
1733
|
-
parent = sink.indexOf(ref.parentId);
|
|
1734
|
-
if (parent === INVALID_INDEX) {
|
|
1735
|
-
report.error(
|
|
1736
|
-
"missing-value",
|
|
1737
|
-
UNKNOWN_PARENT_CODE,
|
|
1738
|
-
`pid "${String(ref.parentId)}" names a node the document does not declare`,
|
|
1739
|
-
ref.where,
|
|
1740
|
-
);
|
|
1741
|
-
continue;
|
|
1742
|
-
}
|
|
1743
|
-
}
|
|
1744
|
-
if (parentOf.get(ref.child) === parent) {
|
|
1806
|
+
const parent = this.parentIndexOf(ref);
|
|
1807
|
+
if (parent === null || parentOf.get(ref.child) === parent) {
|
|
1745
1808
|
continue;
|
|
1746
1809
|
}
|
|
1747
1810
|
if (isAncestorOrSelf(ref.child, parent)) {
|
|
@@ -1768,27 +1831,66 @@ class GexfReader implements XmlHandler {
|
|
|
1768
1831
|
* @param lists - the queued `<parents>` lists
|
|
1769
1832
|
*/
|
|
1770
1833
|
private resolveParentsLists(lists: readonly (typeof this.parentsRefs)[number][]): void {
|
|
1771
|
-
const { sink, report } = this;
|
|
1772
1834
|
for (const ref of lists) {
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1835
|
+
this.resolveParentsList(ref);
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
/**
|
|
1840
|
+
* The parent a `pid` or a nesting names.
|
|
1841
|
+
* @param ref - the reference
|
|
1842
|
+
* @returns its index, or null when the id names no node (reported)
|
|
1843
|
+
*/
|
|
1844
|
+
private parentIndexOf(ref: ParentRef): number | null {
|
|
1845
|
+
if (ref.parentId === null) {
|
|
1846
|
+
return ref.parentIndex;
|
|
1847
|
+
}
|
|
1848
|
+
const parent = this.sink.indexOf(ref.parentId);
|
|
1849
|
+
if (parent !== INVALID_INDEX) {
|
|
1850
|
+
return parent;
|
|
1851
|
+
}
|
|
1852
|
+
if (this.meta.sourceVersion === "1.0") {
|
|
1853
|
+
this.report.warnOnce(
|
|
1854
|
+
"missing-value",
|
|
1855
|
+
UNKNOWN_PID_CODE,
|
|
1856
|
+
`pid "${String(ref.parentId)}" names no node; GEXF 1.0 files write it on top-level nodes, which stay top-level`,
|
|
1857
|
+
ref.where,
|
|
1858
|
+
);
|
|
1859
|
+
} else {
|
|
1860
|
+
this.report.error(
|
|
1861
|
+
"missing-value",
|
|
1862
|
+
UNKNOWN_PARENT_CODE,
|
|
1863
|
+
`pid "${String(ref.parentId)}" names a node the document does not declare`,
|
|
1864
|
+
ref.where,
|
|
1865
|
+
);
|
|
1866
|
+
}
|
|
1867
|
+
return null;
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
/**
|
|
1871
|
+
* Resolve one `<parents>` list; an id that names no node is reported and left out.
|
|
1872
|
+
* @param ref - the list
|
|
1873
|
+
*/
|
|
1874
|
+
private resolveParentsList(ref: ParentsRef): void {
|
|
1875
|
+
const { sink, report } = this;
|
|
1876
|
+
const indices: number[] = [];
|
|
1877
|
+
for (const id of ref.ids) {
|
|
1878
|
+
const parent = sink.indexOf(id);
|
|
1879
|
+
if (parent === INVALID_INDEX) {
|
|
1880
|
+
report.error(
|
|
1881
|
+
"missing-value",
|
|
1882
|
+
UNKNOWN_PARENT_CODE,
|
|
1883
|
+
`<parent for="${String(id)}"> names a node the document does not declare`,
|
|
1884
|
+
ref.where,
|
|
1885
|
+
);
|
|
1886
|
+
continue;
|
|
1791
1887
|
}
|
|
1888
|
+
indices.push(parent);
|
|
1889
|
+
}
|
|
1890
|
+
try {
|
|
1891
|
+
this.parentsColumn.set(sink, report, ref.child, indices, ref.where);
|
|
1892
|
+
} catch (err) {
|
|
1893
|
+
report.recordError(err, ref.where);
|
|
1792
1894
|
}
|
|
1793
1895
|
}
|
|
1794
1896
|
|
|
@@ -1838,21 +1940,10 @@ class GexfReader implements XmlHandler {
|
|
|
1838
1940
|
report.counts.skippedEdges++;
|
|
1839
1941
|
return;
|
|
1840
1942
|
}
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
if (!EDGE_TYPES.has(type)) {
|
|
1846
|
-
report.error(
|
|
1847
|
-
"validation-error",
|
|
1848
|
-
EDGE_TYPE_CODE,
|
|
1849
|
-
`edge type "${typeText}" is not directed, undirected or mutual`,
|
|
1850
|
-
where,
|
|
1851
|
-
);
|
|
1852
|
-
report.counts.skippedEdges++;
|
|
1853
|
-
return;
|
|
1854
|
-
}
|
|
1855
|
-
kind = type as EdgeKind;
|
|
1943
|
+
const kind = this.edgeKindOf(attrs, where);
|
|
1944
|
+
if (kind === null) {
|
|
1945
|
+
report.counts.skippedEdges++;
|
|
1946
|
+
return;
|
|
1856
1947
|
}
|
|
1857
1948
|
if (idText !== undefined && this.edgeIds.has(idText)) {
|
|
1858
1949
|
report.error(
|
|
@@ -1866,9 +1957,7 @@ class GexfReader implements XmlHandler {
|
|
|
1866
1957
|
}
|
|
1867
1958
|
let index: number;
|
|
1868
1959
|
try {
|
|
1869
|
-
const source = this.
|
|
1870
|
-
const target = this.coerceId(targetText, where);
|
|
1871
|
-
this.requireDeclaredEndpoints(source, target, sourceText, targetText);
|
|
1960
|
+
const [source, target] = this.endpoints(sourceText, targetText, where);
|
|
1872
1961
|
const weight = this.xmlWeight(attrs, where);
|
|
1873
1962
|
const before = sink.edgeCount;
|
|
1874
1963
|
index = this.resolver.addEdge(source, target, kind, weight, where);
|
|
@@ -1887,47 +1976,71 @@ class GexfReader implements XmlHandler {
|
|
|
1887
1976
|
frame.mirror = this.resolver.lastMirror;
|
|
1888
1977
|
frame.xmlWeight = attrs.get("weight") ?? null;
|
|
1889
1978
|
this.edge = frame;
|
|
1890
|
-
this.
|
|
1979
|
+
this.writeEdgeAttributes(attrs, index, where);
|
|
1891
1980
|
}
|
|
1892
1981
|
|
|
1893
1982
|
/**
|
|
1894
|
-
*
|
|
1895
|
-
* @param
|
|
1896
|
-
* @param
|
|
1897
|
-
* @
|
|
1898
|
-
* @param targetText - the target as written
|
|
1983
|
+
* The kind of an `<edge>`: its `type`, else the graph's default.
|
|
1984
|
+
* @param attrs - its attributes
|
|
1985
|
+
* @param where - where it was read
|
|
1986
|
+
* @returns the kind, or null for a type GEXF does not have (reported)
|
|
1899
1987
|
*/
|
|
1900
|
-
private
|
|
1901
|
-
const
|
|
1902
|
-
if (
|
|
1903
|
-
return;
|
|
1988
|
+
private edgeKindOf(attrs: ReadonlyMap<string, string>, where: IssueLocation): EdgeKind | null {
|
|
1989
|
+
const typeText = attrs.get("type");
|
|
1990
|
+
if (typeText === undefined) {
|
|
1991
|
+
return this.defaultKind;
|
|
1904
1992
|
}
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1993
|
+
const type = edgeTypeKeyword(typeText);
|
|
1994
|
+
if (!EDGE_TYPES.has(type)) {
|
|
1995
|
+
this.report.error(
|
|
1996
|
+
"validation-error",
|
|
1997
|
+
EDGE_TYPE_CODE,
|
|
1998
|
+
`edge type "${typeText}" is not directed, undirected or mutual`,
|
|
1999
|
+
where,
|
|
2000
|
+
);
|
|
2001
|
+
return null;
|
|
2002
|
+
}
|
|
2003
|
+
return type as EdgeKind;
|
|
2004
|
+
}
|
|
2005
|
+
|
|
2006
|
+
/**
|
|
2007
|
+
* An edge's endpoints: in GEXF 1.0 with its edges first, a node no `<node>` declared yet is added for now; without
|
|
2008
|
+
* addMissingNodes, a node the document does not declare throws E_UNKNOWN_NODE.
|
|
2009
|
+
* @param sourceText - the source's id text
|
|
2010
|
+
* @param targetText - the target's id text
|
|
2011
|
+
* @param where - where it was read
|
|
2012
|
+
* @returns the ids
|
|
2013
|
+
*/
|
|
2014
|
+
private endpoints(sourceText: string, targetText: string, where: IssueLocation): [NodeId, NodeId] {
|
|
2015
|
+
const { sink } = this;
|
|
2016
|
+
const ends: [NodeId, NodeId] = [this.coerceId(sourceText, where), this.coerceId(targetText, where)];
|
|
2017
|
+
if (this.edgesFirst && !this.nodesSeen) {
|
|
2018
|
+
for (const end of ends) {
|
|
2019
|
+
if (sink.indexOf(end) === INVALID_INDEX) {
|
|
2020
|
+
this.implicitNodes.set(sink.addNode(end), end);
|
|
2021
|
+
this.report.counts.nodes++;
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
1909
2024
|
}
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
2025
|
+
const texts = [sourceText, targetText];
|
|
2026
|
+
const unknown = this.options.addMissingNodes ? -1 : ends.findIndex((id) => sink.indexOf(id) === INVALID_INDEX);
|
|
2027
|
+
if (unknown !== -1) {
|
|
2028
|
+
throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${texts[unknown]}"`, {
|
|
2029
|
+
id: ends[unknown],
|
|
1913
2030
|
});
|
|
1914
2031
|
}
|
|
2032
|
+
return ends;
|
|
1915
2033
|
}
|
|
1916
2034
|
|
|
1917
2035
|
/**
|
|
1918
|
-
* Write
|
|
1919
|
-
* @param attrs -
|
|
1920
|
-
* @param index -
|
|
1921
|
-
* @param
|
|
1922
|
-
* @param where - the edge's location
|
|
2036
|
+
* Write an added edge's id, label, kind and lifetime.
|
|
2037
|
+
* @param attrs - its attributes
|
|
2038
|
+
* @param index - its index
|
|
2039
|
+
* @param where - where it was read
|
|
1923
2040
|
*/
|
|
1924
|
-
private
|
|
1925
|
-
attrs: ReadonlyMap<string, string>,
|
|
1926
|
-
index: number,
|
|
1927
|
-
idText: string | undefined,
|
|
1928
|
-
where: IssueLocation,
|
|
1929
|
-
): void {
|
|
2041
|
+
private writeEdgeAttributes(attrs: ReadonlyMap<string, string>, index: number, where: IssueLocation): void {
|
|
1930
2042
|
const { report, sink } = this;
|
|
2043
|
+
const idText = attrs.get("id");
|
|
1931
2044
|
try {
|
|
1932
2045
|
if (idText !== undefined) {
|
|
1933
2046
|
this.edgeIdColumn.set(sink, report, index, idText, where);
|
|
@@ -1946,6 +2059,26 @@ class GexfReader implements XmlHandler {
|
|
|
1946
2059
|
}
|
|
1947
2060
|
}
|
|
1948
2061
|
|
|
2062
|
+
/**
|
|
2063
|
+
* GEXF 1.0 with its edges first, addMissingNodes false: a node an edge named that no `<node>` declared is an
|
|
2064
|
+
* unknown node, as it is when the nodes come first. It is reported, and it and its edges are removed when the
|
|
2065
|
+
* sink can remove nodes.
|
|
2066
|
+
*/
|
|
2067
|
+
private dropUndeclaredNodes(): void {
|
|
2068
|
+
const { sink, report } = this;
|
|
2069
|
+
const removable = sink as GraphSink & { removeNodeByIndex?: (index: number) => ArrayLike<number> };
|
|
2070
|
+
for (const [index, id] of this.implicitNodes) {
|
|
2071
|
+
report.error("validation-error", "E_UNKNOWN_NODE", `edge references undeclared node "${String(id)}"`);
|
|
2072
|
+
if (typeof removable.removeNodeByIndex === "function") {
|
|
2073
|
+
const edges = removable.removeNodeByIndex(index);
|
|
2074
|
+
report.counts.nodes--;
|
|
2075
|
+
report.counts.edges -= edges.length;
|
|
2076
|
+
report.counts.skippedEdges += edges.length;
|
|
2077
|
+
}
|
|
2078
|
+
}
|
|
2079
|
+
this.implicitNodes.clear();
|
|
2080
|
+
}
|
|
2081
|
+
|
|
1949
2082
|
/**
|
|
1950
2083
|
* The weight argument of one edge from its `weight` XML attribute; undefined when absent (the
|
|
1951
2084
|
* sink records a defaulted weight, design section 3.7).
|
|
@@ -2069,7 +2202,8 @@ class GexfReader implements XmlHandler {
|
|
|
2069
2202
|
if (index === INVALID_INDEX) {
|
|
2070
2203
|
return;
|
|
2071
2204
|
}
|
|
2072
|
-
|
|
2205
|
+
// GEXF 1.0 names the attribute with `id`
|
|
2206
|
+
const forId = attrs.get("for") ?? attrs.get("id");
|
|
2073
2207
|
const { valueWhere } = this;
|
|
2074
2208
|
valueWhere.line = line;
|
|
2075
2209
|
valueWhere.element = element;
|
|
@@ -2600,6 +2734,51 @@ class GexfReader implements XmlHandler {
|
|
|
2600
2734
|
|
|
2601
2735
|
// ---------------------------------------------------------------- viz
|
|
2602
2736
|
|
|
2737
|
+
/**
|
|
2738
|
+
* Write a `<viz:position>` into the node position column, declared on first use with the
|
|
2739
|
+
* dimensions the element writes.
|
|
2740
|
+
* @param attrs - its attributes
|
|
2741
|
+
* @param index - the node's index
|
|
2742
|
+
* @param where - the element's location
|
|
2743
|
+
*/
|
|
2744
|
+
private writeVizPosition(attrs: ReadonlyMap<string, string>, index: number, where: IssueLocation): void {
|
|
2745
|
+
const x = vizNumber(attrs, "x");
|
|
2746
|
+
const y = vizNumber(attrs, "y");
|
|
2747
|
+
const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
|
|
2748
|
+
this.positionColumn ??= new LazyColumn("node", {
|
|
2749
|
+
...NODE_DECLS.position,
|
|
2750
|
+
extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
|
|
2751
|
+
});
|
|
2752
|
+
this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2755
|
+
/**
|
|
2756
|
+
* Write a `<viz:shape>` into the shape column, and a node's image `uri` beside it.
|
|
2757
|
+
* @param name - the element name as written
|
|
2758
|
+
* @param attrs - its attributes
|
|
2759
|
+
* @param domain - node or edge
|
|
2760
|
+
* @param index - the element's index
|
|
2761
|
+
* @param where - the element's location
|
|
2762
|
+
*/
|
|
2763
|
+
private writeVizShape(
|
|
2764
|
+
name: string,
|
|
2765
|
+
attrs: ReadonlyMap<string, string>,
|
|
2766
|
+
domain: "node" | "edge",
|
|
2767
|
+
index: number,
|
|
2768
|
+
where: IssueLocation,
|
|
2769
|
+
): void {
|
|
2770
|
+
const value = attrs.get("value");
|
|
2771
|
+
if (value === undefined) {
|
|
2772
|
+
throw new GraphFormatError("E_COLUMN_TYPE", "<viz:shape> without a value", { element: name });
|
|
2773
|
+
}
|
|
2774
|
+
const columns = domain === "node" ? this.nodeColumns : this.edgeColumns;
|
|
2775
|
+
columns.shape.set(this.sink, this.report, index, value, where);
|
|
2776
|
+
const uri = attrs.get("uri");
|
|
2777
|
+
if (domain === "node" && uri !== undefined) {
|
|
2778
|
+
this.shapeUriColumn.set(this.sink, this.report, index, uri, where);
|
|
2779
|
+
}
|
|
2780
|
+
}
|
|
2781
|
+
|
|
2603
2782
|
/**
|
|
2604
2783
|
* Write one viz element into its role column; a value that does not parse is a recorded
|
|
2605
2784
|
* warning and the element is skipped.
|
|
@@ -2635,10 +2814,10 @@ class GexfReader implements XmlHandler {
|
|
|
2635
2814
|
try {
|
|
2636
2815
|
switch (local) {
|
|
2637
2816
|
case "color":
|
|
2638
|
-
columns.color.set(sink, report, index,
|
|
2817
|
+
columns.color.set(sink, report, index, this.vizColor(attrs, name, where), where);
|
|
2639
2818
|
break;
|
|
2640
2819
|
case "position":
|
|
2641
|
-
this.
|
|
2820
|
+
this.writeVizPosition(attrs, index, where);
|
|
2642
2821
|
break;
|
|
2643
2822
|
case "size":
|
|
2644
2823
|
this.sizeColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
|
|
@@ -2647,7 +2826,7 @@ class GexfReader implements XmlHandler {
|
|
|
2647
2826
|
this.thicknessColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
|
|
2648
2827
|
break;
|
|
2649
2828
|
case "shape":
|
|
2650
|
-
this.
|
|
2829
|
+
this.writeVizShape(name, attrs, domain, index, where);
|
|
2651
2830
|
break;
|
|
2652
2831
|
default:
|
|
2653
2832
|
break;
|
|
@@ -2661,48 +2840,45 @@ class GexfReader implements XmlHandler {
|
|
|
2661
2840
|
}
|
|
2662
2841
|
|
|
2663
2842
|
/**
|
|
2664
|
-
*
|
|
2665
|
-
*
|
|
2666
|
-
*
|
|
2667
|
-
* @param
|
|
2668
|
-
*/
|
|
2669
|
-
private writePosition(attrs: ReadonlyMap<string, string>, index: number, where: IssueLocation): void {
|
|
2670
|
-
const x = vizNumber(attrs, "x");
|
|
2671
|
-
const y = vizNumber(attrs, "y");
|
|
2672
|
-
const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
|
|
2673
|
-
this.positionColumn ??= new LazyColumn("node", {
|
|
2674
|
-
...NODE_DECLS.position,
|
|
2675
|
-
extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
|
|
2676
|
-
});
|
|
2677
|
-
this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
|
|
2678
|
-
}
|
|
2679
|
-
|
|
2680
|
-
/**
|
|
2681
|
-
* Write a `<viz:shape>` and, on a node, its `uri`.
|
|
2843
|
+
* `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
|
|
2844
|
+
* `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; a channel outside 0..255 or an alpha outside 0..1 is clamped and
|
|
2845
|
+
* reported, as Gephi clamps it.
|
|
2846
|
+
* @param attrs - the element's attributes
|
|
2682
2847
|
* @param name - the element name as written
|
|
2683
|
-
* @param attrs - its attributes
|
|
2684
|
-
* @param domain - node or edge
|
|
2685
|
-
* @param index - the element's index
|
|
2686
2848
|
* @param where - the element's location
|
|
2849
|
+
* @returns [r, g, b, a]
|
|
2687
2850
|
*/
|
|
2688
|
-
private
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2851
|
+
private vizColor(attrs: ReadonlyMap<string, string>, name: string, where: IssueLocation): number[] {
|
|
2852
|
+
const hex = attrs.get("hex");
|
|
2853
|
+
let rgba: number[];
|
|
2854
|
+
if (hex !== undefined && !attrs.has("r")) {
|
|
2855
|
+
const c = canonVizColor(hex);
|
|
2856
|
+
if (c === null) {
|
|
2857
|
+
throw new GraphFormatError(
|
|
2858
|
+
"E_COLUMN_TYPE",
|
|
2859
|
+
`viz hex="${hex}" is not a #RRGGBB, #RGB or #RRGGBBAA color`,
|
|
2860
|
+
{ attribute: "hex" },
|
|
2861
|
+
);
|
|
2862
|
+
}
|
|
2863
|
+
rgba = [...c];
|
|
2864
|
+
if (attrs.has("a")) {
|
|
2865
|
+
rgba[3] = vizNumber(attrs, "a");
|
|
2866
|
+
}
|
|
2867
|
+
} else {
|
|
2868
|
+
rgba = [vizNumber(attrs, "r"), vizNumber(attrs, "g"), vizNumber(attrs, "b")];
|
|
2869
|
+
rgba.push(attrs.has("a") ? vizNumber(attrs, "a") : 1);
|
|
2700
2870
|
}
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2871
|
+
const max = [255, 255, 255, 1];
|
|
2872
|
+
if (rgba.some((v, i) => v < 0 || v > max[i])) {
|
|
2873
|
+
this.report.warning(
|
|
2874
|
+
"validation-error",
|
|
2875
|
+
VIZ_VALUE_CODE,
|
|
2876
|
+
`<${name}> has a channel outside 0..255 or an alpha outside 0..1; clamped`,
|
|
2877
|
+
where,
|
|
2878
|
+
);
|
|
2879
|
+
rgba = rgba.map((v, i) => Math.max(0, Math.min(max[i], v)));
|
|
2705
2880
|
}
|
|
2881
|
+
return [rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, rgba[3]];
|
|
2706
2882
|
}
|
|
2707
2883
|
|
|
2708
2884
|
// ---------------------------------------------------------------- helpers
|
|
@@ -2888,35 +3064,6 @@ function vizNumber(attrs: ReadonlyMap<string, string>, name: string): number {
|
|
|
2888
3064
|
return value;
|
|
2889
3065
|
}
|
|
2890
3066
|
|
|
2891
|
-
/**
|
|
2892
|
-
* Parse `<viz:color r g b a hex>` into rgba in 0..1 (design section 5.5: role color, f32 x4).
|
|
2893
|
-
* @param attrs - the element's attributes
|
|
2894
|
-
* @returns [r, g, b, a]
|
|
2895
|
-
*/
|
|
2896
|
-
function parseColor(attrs: ReadonlyMap<string, string>): number[] {
|
|
2897
|
-
let r: number;
|
|
2898
|
-
let g: number;
|
|
2899
|
-
let b: number;
|
|
2900
|
-
const hex = attrs.get("hex");
|
|
2901
|
-
if (hex !== undefined && !attrs.has("r")) {
|
|
2902
|
-
const digits = hex.startsWith("#") ? hex.slice(1) : hex;
|
|
2903
|
-
if (!/^[0-9a-fA-F]{6}$/.test(digits)) {
|
|
2904
|
-
throw new GraphFormatError("E_COLUMN_TYPE", `viz hex="${hex}" is not a #RRGGBB color`, {
|
|
2905
|
-
attribute: "hex",
|
|
2906
|
-
});
|
|
2907
|
-
}
|
|
2908
|
-
r = Number.parseInt(digits.slice(0, 2), 16);
|
|
2909
|
-
g = Number.parseInt(digits.slice(2, 4), 16);
|
|
2910
|
-
b = Number.parseInt(digits.slice(4, 6), 16);
|
|
2911
|
-
} else {
|
|
2912
|
-
r = vizNumber(attrs, "r");
|
|
2913
|
-
g = vizNumber(attrs, "g");
|
|
2914
|
-
b = vizNumber(attrs, "b");
|
|
2915
|
-
}
|
|
2916
|
-
const a = attrs.has("a") ? vizNumber(attrs, "a") : 1;
|
|
2917
|
-
return [r / 255, g / 255, b / 255, a];
|
|
2918
|
-
}
|
|
2919
|
-
|
|
2920
3067
|
/** A head that starts with markup, after an optional byte-order mark and whitespace. */
|
|
2921
3068
|
const XML_START = /^\uFEFF?\s*</;
|
|
2922
3069
|
|
|
@@ -2967,6 +3114,7 @@ export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
|
|
|
2967
3114
|
extensions: Object.freeze([".gexf"]),
|
|
2968
3115
|
mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
|
|
2969
3116
|
sniff: sniffGexf,
|
|
3117
|
+
styles: gexfStyles,
|
|
2970
3118
|
/**
|
|
2971
3119
|
* Read a GEXF document into the sink in one streaming pass.
|
|
2972
3120
|
* @param input - the document as text, bytes, a stream or chunks
|
|
@@ -3001,7 +3149,9 @@ export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
|
|
|
3001
3149
|
report.fail(EMPTY_INPUT_CODE, "the input is empty (no markup at all)", { line: err.line });
|
|
3002
3150
|
}
|
|
3003
3151
|
if (err instanceof XmlSyntaxError) {
|
|
3004
|
-
report.fail(XML_SYNTAX_CODE, err.message, {
|
|
3152
|
+
report.fail(err instanceof XmlNestingError ? XML_NESTING_CODE : XML_SYNTAX_CODE, err.message, {
|
|
3153
|
+
line: err.line,
|
|
3154
|
+
});
|
|
3005
3155
|
}
|
|
3006
3156
|
throw err;
|
|
3007
3157
|
}
|