@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
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { GraphFormatError, INVALID_INDEX, MAX_COUNT, } from "@graphty/graph-format";
|
|
29
29
|
import { declareAttribute, declareCompanion, declareResolved, losesPrecision, parseDeclaredTemporal, parseDeclaredValue, PRECISION_CODE, } from "../../common/attributes.js";
|
|
30
|
-
import { BAD_VALUE_CODE, COUNT_HINT_CODE, COUNT_MISMATCH_CODE, DUPLICATE_ATTRIBUTE_CODE, DUPLICATE_EDGE_ID_CODE, DUPLICATE_NODE_CODE, EMPTY_INPUT_CODE, ID_MERGED_CODE, MISSING_ENDPOINT_CODE, MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE, PARENT_CYCLE_CODE, STRAY_TEXT_CODE, UNKNOWN_ELEMENT_CODE, UNKNOWN_PARENT_CODE, UNKNOWN_XML_ATTRIBUTE_CODE, XML_SYNTAX_CODE, } from "../../common/codes.js";
|
|
30
|
+
import { BAD_VALUE_CODE, COUNT_HINT_CODE, COUNT_MISMATCH_CODE, DUPLICATE_ATTRIBUTE_CODE, DUPLICATE_EDGE_ID_CODE, DUPLICATE_NODE_CODE, EMPTY_INPUT_CODE, ID_MERGED_CODE, MISSING_ENDPOINT_CODE, MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE, PARENT_CYCLE_CODE, STRAY_TEXT_CODE, UNKNOWN_ELEMENT_CODE, UNKNOWN_PARENT_CODE, UNKNOWN_XML_ATTRIBUTE_CODE, XML_NESTING_CODE, XML_SYNTAX_CODE, } from "../../common/codes.js";
|
|
31
31
|
import { overflowsToInfinity, parseDecimalText } from "../../common/declared-types.js";
|
|
32
32
|
import { DirectionResolver } from "../../common/direction.js";
|
|
33
33
|
import { IdCoercer } from "../../common/ids.js";
|
|
@@ -37,8 +37,10 @@ import { reportSinkOptions, reportUnusedOptions, resolveImportOptions, } from ".
|
|
|
37
37
|
import { ImportReportBuilder } from "../../common/report.js";
|
|
38
38
|
import { parseTimeText, timeTextCompanion } from "../../common/temporal.js";
|
|
39
39
|
import { isWeightField, parseWeightText } from "../../common/weights.js";
|
|
40
|
-
import { isWhitespace, localName, sniffXmlText, tokenizeXml, xmlDeclaredEncoding, XmlEmptyInputError, XmlSyntaxError, } from "../../common/xml.js";
|
|
40
|
+
import { isWhitespace, localName, sniffXmlText, tokenizeXml, xmlDeclaredEncoding, XmlEmptyInputError, XmlNestingError, XmlSyntaxError, } from "../../common/xml.js";
|
|
41
|
+
import { MAX_STYLE_BLOCK_LENGTH } from "../../styles/io/block.js";
|
|
41
42
|
import { EDGE_DECLS, GEXF_FORMAT, GRAPH_MODES, NODE_DECLS, OPEN_END, OPEN_START, RESERVED_EDGE_NAMES, RESERVED_NODE_NAMES, temporalTableDecls, temporalTableName, TIME_FORMATS, TIME_REPRESENTATIONS, } from "./schema.js";
|
|
43
|
+
import { canonVizColor, gexfStyles, GRAPHTY_XML_NAMESPACE } from "./styles.js";
|
|
42
44
|
/**
|
|
43
45
|
* The document is not a GEXF document (no `<gexf>` root).
|
|
44
46
|
* @category Issue and loss codes
|
|
@@ -99,6 +101,11 @@ export const WEIGHT_IGNORED_CODE = "W_GEXF_WEIGHT_IGNORED";
|
|
|
99
101
|
* @category Issue and loss codes
|
|
100
102
|
*/
|
|
101
103
|
export const VIZ_SKIPPED_CODE = "W_GEXF_VIZ_SKIPPED";
|
|
104
|
+
/**
|
|
105
|
+
* GEXF 1.0 only: a `pid` naming no node. Gephi 0.6 wrote `pid="0"` on top-level nodes; the node stays top-level.
|
|
106
|
+
* @category Built-in formats
|
|
107
|
+
*/
|
|
108
|
+
export const UNKNOWN_PID_CODE = "W_GEXF_UNKNOWN_PID";
|
|
102
109
|
/**
|
|
103
110
|
* A 1.2 dynamic viz element (its bounds are dropped, the value kept).
|
|
104
111
|
* @category Issue and loss codes
|
|
@@ -139,6 +146,10 @@ const VERSIONS = new Set(["1.0", "1.1", "1.2", "1.3"]);
|
|
|
139
146
|
* @returns the version, or null
|
|
140
147
|
*/
|
|
141
148
|
function namespaceVersion(ns) {
|
|
149
|
+
if (ns !== null && /gephi\.org\/gexf\/?$/.test(ns)) {
|
|
150
|
+
// GEXF 1.0, as Gephi 0.6 wrote it
|
|
151
|
+
return "1.0";
|
|
152
|
+
}
|
|
142
153
|
const match = ns === null ? null : /gexf\.net\/(1\.[0-3])/.exec(ns);
|
|
143
154
|
return match === null ? null : match[1];
|
|
144
155
|
}
|
|
@@ -208,8 +219,15 @@ const EDGE_TYPES = new Set(["directed", "undirected", "mutual"]);
|
|
|
208
219
|
* @returns the text trimmed and in lower case
|
|
209
220
|
*/
|
|
210
221
|
function edgeTypeKeyword(text) {
|
|
211
|
-
|
|
222
|
+
const keyword = text.trim().toLowerCase();
|
|
223
|
+
return EDGE_TYPE_ALIASES.get(keyword) ?? keyword;
|
|
212
224
|
}
|
|
225
|
+
/** GEXF 1.0's spellings of the edge types. */
|
|
226
|
+
const EDGE_TYPE_ALIASES = new Map([
|
|
227
|
+
["dir", "directed"],
|
|
228
|
+
["undir", "undirected"],
|
|
229
|
+
["double", "mutual"],
|
|
230
|
+
]);
|
|
213
231
|
const ABORT_CHECK_INTERVAL = 64;
|
|
214
232
|
/** The XML attributes the importer reads on `<node>`; any other one is reported once. */
|
|
215
233
|
const NODE_ATTRIBUTES = new Set([
|
|
@@ -355,6 +373,8 @@ var Ctx;
|
|
|
355
373
|
Ctx[Ctx["Edges"] = 12] = "Edges";
|
|
356
374
|
Ctx[Ctx["Edge"] = 13] = "Edge";
|
|
357
375
|
Ctx[Ctx["Skip"] = 14] = "Skip";
|
|
376
|
+
/** graphty's `graphty.styles` block inside `<meta>`. */
|
|
377
|
+
Ctx[Ctx["StyleBlock"] = 15] = "StyleBlock";
|
|
358
378
|
})(Ctx || (Ctx = {}));
|
|
359
379
|
/**
|
|
360
380
|
* The event handler that turns the tokenizer's events into sink calls: one import call.
|
|
@@ -374,6 +394,12 @@ class GexfReader {
|
|
|
374
394
|
this.meta = { sourceFormat: GEXF_FORMAT };
|
|
375
395
|
this.metaText = "";
|
|
376
396
|
this.metaField = null;
|
|
397
|
+
/** The text of graphty's `graphty.styles` block, read up to one character past the longest block read. */
|
|
398
|
+
this.styleBlock = "";
|
|
399
|
+
/** GEXF 1.0 only: nodes added for edges read before `<nodes>`, until their `<node>` declares them. */
|
|
400
|
+
this.implicitNodes = new Map();
|
|
401
|
+
/** GEXF 1.0 only: `<edges>` came before `<nodes>`, so an edge's ends are added until `<node>` declares them. */
|
|
402
|
+
this.edgesFirst = false;
|
|
377
403
|
this.nodeAttrs = new Map();
|
|
378
404
|
this.edgeAttrs = new Map();
|
|
379
405
|
this.declaredNodeNames = new Set();
|
|
@@ -462,6 +488,7 @@ class GexfReader {
|
|
|
462
488
|
parent !== Ctx.Skip &&
|
|
463
489
|
parent !== Ctx.MetaText &&
|
|
464
490
|
parent !== Ctx.AttributeText &&
|
|
491
|
+
parent !== Ctx.StyleBlock &&
|
|
465
492
|
!name.startsWith("viz:")) {
|
|
466
493
|
// an undeclared prefix or a name that is not namespace-well-formed (<:node>, <a:b:node>)
|
|
467
494
|
this.unknownElement(name, line);
|
|
@@ -480,7 +507,7 @@ class GexfReader {
|
|
|
480
507
|
this.startInGexf(name, local, attrs, line);
|
|
481
508
|
return;
|
|
482
509
|
case Ctx.Meta:
|
|
483
|
-
this.startInMeta(name, local, line);
|
|
510
|
+
this.startInMeta(name, local, line, ns);
|
|
484
511
|
return;
|
|
485
512
|
case Ctx.Graph:
|
|
486
513
|
this.startInGraph(name, local, attrs, line);
|
|
@@ -514,6 +541,7 @@ class GexfReader {
|
|
|
514
541
|
return;
|
|
515
542
|
case Ctx.MetaText:
|
|
516
543
|
case Ctx.AttributeText:
|
|
544
|
+
case Ctx.StyleBlock:
|
|
517
545
|
case Ctx.Skip:
|
|
518
546
|
this.ctx.push(Ctx.Skip);
|
|
519
547
|
return;
|
|
@@ -535,8 +563,18 @@ class GexfReader {
|
|
|
535
563
|
case Ctx.MetaText:
|
|
536
564
|
this.finishMetaText();
|
|
537
565
|
return;
|
|
566
|
+
case Ctx.StyleBlock:
|
|
567
|
+
this.report.keepForStyles(this.styleBlock);
|
|
568
|
+
this.styleBlock = "";
|
|
569
|
+
return;
|
|
538
570
|
case Ctx.Graph:
|
|
539
571
|
this.resolveParents();
|
|
572
|
+
if (!this.nodesSeen && this.implicitNodes.size > 0) {
|
|
573
|
+
this.report.error("validation-error", MISSING_NODES_CODE, "the graph declares <edges> but no <nodes>");
|
|
574
|
+
}
|
|
575
|
+
else if (!this.options.addMissingNodes) {
|
|
576
|
+
this.dropUndeclaredNodes();
|
|
577
|
+
}
|
|
540
578
|
return;
|
|
541
579
|
case Ctx.Attributes:
|
|
542
580
|
this.attributeGroup = null;
|
|
@@ -589,6 +627,12 @@ class GexfReader {
|
|
|
589
627
|
case Ctx.AttributeText:
|
|
590
628
|
this.attributeTextValue += text;
|
|
591
629
|
return;
|
|
630
|
+
case Ctx.StyleBlock:
|
|
631
|
+
// past the longest block read, one more character is enough to say it is too large
|
|
632
|
+
if (this.styleBlock.length <= MAX_STYLE_BLOCK_LENGTH) {
|
|
633
|
+
this.styleBlock += text.slice(0, MAX_STYLE_BLOCK_LENGTH + 1 - this.styleBlock.length);
|
|
634
|
+
}
|
|
635
|
+
return;
|
|
592
636
|
case Ctx.Skip:
|
|
593
637
|
return;
|
|
594
638
|
default:
|
|
@@ -672,8 +716,14 @@ class GexfReader {
|
|
|
672
716
|
* @param name - the element name
|
|
673
717
|
* @param local - its local name
|
|
674
718
|
* @param line - the line
|
|
719
|
+
* @param ns - its namespace
|
|
675
720
|
*/
|
|
676
|
-
startInMeta(name, local, line) {
|
|
721
|
+
startInMeta(name, local, line, ns) {
|
|
722
|
+
if (ns === GRAPHTY_XML_NAMESPACE && local === "styles") {
|
|
723
|
+
this.styleBlock = "";
|
|
724
|
+
this.ctx.push(Ctx.StyleBlock);
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
677
727
|
if (local === "creator" || local === "description" || local === "keywords") {
|
|
678
728
|
this.metaField = local;
|
|
679
729
|
this.metaText = "";
|
|
@@ -813,7 +863,11 @@ class GexfReader {
|
|
|
813
863
|
this.beginSection(attrs, "node", line);
|
|
814
864
|
return;
|
|
815
865
|
case "edges":
|
|
816
|
-
if (!this.nodesSeen) {
|
|
866
|
+
if (!this.nodesSeen && this.meta.sourceVersion === "1.0") {
|
|
867
|
+
// GEXF 1.0 files (Gephi 0.6) may list their edges before their nodes
|
|
868
|
+
this.edgesFirst = true;
|
|
869
|
+
}
|
|
870
|
+
else if (!this.nodesSeen) {
|
|
817
871
|
this.report.error("validation-error", MISSING_NODES_CODE, "the graph declares <edges> but no <nodes>", { line });
|
|
818
872
|
}
|
|
819
873
|
this.resolveParents();
|
|
@@ -1153,7 +1207,10 @@ class GexfReader {
|
|
|
1153
1207
|
try {
|
|
1154
1208
|
const id = this.coerceId(idText, where);
|
|
1155
1209
|
const existing = sink.indexOf(id);
|
|
1156
|
-
if (existing !== INVALID_INDEX) {
|
|
1210
|
+
if (existing !== INVALID_INDEX && this.implicitNodes.delete(existing)) {
|
|
1211
|
+
index = existing;
|
|
1212
|
+
}
|
|
1213
|
+
else if (existing !== INVALID_INDEX) {
|
|
1157
1214
|
report.warning("validation-error", DUPLICATE_NODE_CODE, `node "${idText}" is declared more than once; later attributes overwrite`, where);
|
|
1158
1215
|
index = existing;
|
|
1159
1216
|
}
|
|
@@ -1328,15 +1385,8 @@ class GexfReader {
|
|
|
1328
1385
|
return false;
|
|
1329
1386
|
};
|
|
1330
1387
|
for (const ref of refs) {
|
|
1331
|
-
|
|
1332
|
-
if (ref.
|
|
1333
|
-
parent = sink.indexOf(ref.parentId);
|
|
1334
|
-
if (parent === INVALID_INDEX) {
|
|
1335
|
-
report.error("missing-value", UNKNOWN_PARENT_CODE, `pid "${String(ref.parentId)}" names a node the document does not declare`, ref.where);
|
|
1336
|
-
continue;
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
if (parentOf.get(ref.child) === parent) {
|
|
1388
|
+
const parent = this.parentIndexOf(ref);
|
|
1389
|
+
if (parent === null || parentOf.get(ref.child) === parent) {
|
|
1340
1390
|
continue;
|
|
1341
1391
|
}
|
|
1342
1392
|
if (isAncestorOrSelf(ref.child, parent)) {
|
|
@@ -1358,23 +1408,51 @@ class GexfReader {
|
|
|
1358
1408
|
* @param lists - the queued `<parents>` lists
|
|
1359
1409
|
*/
|
|
1360
1410
|
resolveParentsLists(lists) {
|
|
1361
|
-
const { sink, report } = this;
|
|
1362
1411
|
for (const ref of lists) {
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1412
|
+
this.resolveParentsList(ref);
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
/**
|
|
1416
|
+
* The parent a `pid` or a nesting names.
|
|
1417
|
+
* @param ref - the reference
|
|
1418
|
+
* @returns its index, or null when the id names no node (reported)
|
|
1419
|
+
*/
|
|
1420
|
+
parentIndexOf(ref) {
|
|
1421
|
+
if (ref.parentId === null) {
|
|
1422
|
+
return ref.parentIndex;
|
|
1423
|
+
}
|
|
1424
|
+
const parent = this.sink.indexOf(ref.parentId);
|
|
1425
|
+
if (parent !== INVALID_INDEX) {
|
|
1426
|
+
return parent;
|
|
1427
|
+
}
|
|
1428
|
+
if (this.meta.sourceVersion === "1.0") {
|
|
1429
|
+
this.report.warnOnce("missing-value", UNKNOWN_PID_CODE, `pid "${String(ref.parentId)}" names no node; GEXF 1.0 files write it on top-level nodes, which stay top-level`, ref.where);
|
|
1430
|
+
}
|
|
1431
|
+
else {
|
|
1432
|
+
this.report.error("missing-value", UNKNOWN_PARENT_CODE, `pid "${String(ref.parentId)}" names a node the document does not declare`, ref.where);
|
|
1433
|
+
}
|
|
1434
|
+
return null;
|
|
1435
|
+
}
|
|
1436
|
+
/**
|
|
1437
|
+
* Resolve one `<parents>` list; an id that names no node is reported and left out.
|
|
1438
|
+
* @param ref - the list
|
|
1439
|
+
*/
|
|
1440
|
+
resolveParentsList(ref) {
|
|
1441
|
+
const { sink, report } = this;
|
|
1442
|
+
const indices = [];
|
|
1443
|
+
for (const id of ref.ids) {
|
|
1444
|
+
const parent = sink.indexOf(id);
|
|
1445
|
+
if (parent === INVALID_INDEX) {
|
|
1446
|
+
report.error("missing-value", UNKNOWN_PARENT_CODE, `<parent for="${String(id)}"> names a node the document does not declare`, ref.where);
|
|
1447
|
+
continue;
|
|
1377
1448
|
}
|
|
1449
|
+
indices.push(parent);
|
|
1450
|
+
}
|
|
1451
|
+
try {
|
|
1452
|
+
this.parentsColumn.set(sink, report, ref.child, indices, ref.where);
|
|
1453
|
+
}
|
|
1454
|
+
catch (err) {
|
|
1455
|
+
report.recordError(err, ref.where);
|
|
1378
1456
|
}
|
|
1379
1457
|
}
|
|
1380
1458
|
// ---------------------------------------------------------------- edges
|
|
@@ -1416,16 +1494,10 @@ class GexfReader {
|
|
|
1416
1494
|
report.counts.skippedEdges++;
|
|
1417
1495
|
return;
|
|
1418
1496
|
}
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
if (!EDGE_TYPES.has(type)) {
|
|
1424
|
-
report.error("validation-error", EDGE_TYPE_CODE, `edge type "${typeText}" is not directed, undirected or mutual`, where);
|
|
1425
|
-
report.counts.skippedEdges++;
|
|
1426
|
-
return;
|
|
1427
|
-
}
|
|
1428
|
-
kind = type;
|
|
1497
|
+
const kind = this.edgeKindOf(attrs, where);
|
|
1498
|
+
if (kind === null) {
|
|
1499
|
+
report.counts.skippedEdges++;
|
|
1500
|
+
return;
|
|
1429
1501
|
}
|
|
1430
1502
|
if (idText !== undefined && this.edgeIds.has(idText)) {
|
|
1431
1503
|
report.error("validation-error", DUPLICATE_EDGE_ID_CODE, `edge id "${idText}" is declared more than once; the edge is skipped`, where);
|
|
@@ -1434,9 +1506,7 @@ class GexfReader {
|
|
|
1434
1506
|
}
|
|
1435
1507
|
let index;
|
|
1436
1508
|
try {
|
|
1437
|
-
const source = this.
|
|
1438
|
-
const target = this.coerceId(targetText, where);
|
|
1439
|
-
this.requireDeclaredEndpoints(source, target, sourceText, targetText);
|
|
1509
|
+
const [source, target] = this.endpoints(sourceText, targetText, where);
|
|
1440
1510
|
const weight = this.xmlWeight(attrs, where);
|
|
1441
1511
|
const before = sink.edgeCount;
|
|
1442
1512
|
index = this.resolver.addEdge(source, target, kind, weight, where);
|
|
@@ -1456,40 +1526,63 @@ class GexfReader {
|
|
|
1456
1526
|
frame.mirror = this.resolver.lastMirror;
|
|
1457
1527
|
frame.xmlWeight = attrs.get("weight") ?? null;
|
|
1458
1528
|
this.edge = frame;
|
|
1459
|
-
this.
|
|
1529
|
+
this.writeEdgeAttributes(attrs, index, where);
|
|
1460
1530
|
}
|
|
1461
1531
|
/**
|
|
1462
|
-
*
|
|
1463
|
-
* @param
|
|
1464
|
-
* @param
|
|
1465
|
-
* @
|
|
1466
|
-
* @param targetText - the target as written
|
|
1532
|
+
* The kind of an `<edge>`: its `type`, else the graph's default.
|
|
1533
|
+
* @param attrs - its attributes
|
|
1534
|
+
* @param where - where it was read
|
|
1535
|
+
* @returns the kind, or null for a type GEXF does not have (reported)
|
|
1467
1536
|
*/
|
|
1468
|
-
|
|
1469
|
-
const
|
|
1470
|
-
if (
|
|
1471
|
-
return;
|
|
1537
|
+
edgeKindOf(attrs, where) {
|
|
1538
|
+
const typeText = attrs.get("type");
|
|
1539
|
+
if (typeText === undefined) {
|
|
1540
|
+
return this.defaultKind;
|
|
1472
1541
|
}
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1542
|
+
const type = edgeTypeKeyword(typeText);
|
|
1543
|
+
if (!EDGE_TYPES.has(type)) {
|
|
1544
|
+
this.report.error("validation-error", EDGE_TYPE_CODE, `edge type "${typeText}" is not directed, undirected or mutual`, where);
|
|
1545
|
+
return null;
|
|
1477
1546
|
}
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1547
|
+
return type;
|
|
1548
|
+
}
|
|
1549
|
+
/**
|
|
1550
|
+
* An edge's endpoints: in GEXF 1.0 with its edges first, a node no `<node>` declared yet is added for now; without
|
|
1551
|
+
* addMissingNodes, a node the document does not declare throws E_UNKNOWN_NODE.
|
|
1552
|
+
* @param sourceText - the source's id text
|
|
1553
|
+
* @param targetText - the target's id text
|
|
1554
|
+
* @param where - where it was read
|
|
1555
|
+
* @returns the ids
|
|
1556
|
+
*/
|
|
1557
|
+
endpoints(sourceText, targetText, where) {
|
|
1558
|
+
const { sink } = this;
|
|
1559
|
+
const ends = [this.coerceId(sourceText, where), this.coerceId(targetText, where)];
|
|
1560
|
+
if (this.edgesFirst && !this.nodesSeen) {
|
|
1561
|
+
for (const end of ends) {
|
|
1562
|
+
if (sink.indexOf(end) === INVALID_INDEX) {
|
|
1563
|
+
this.implicitNodes.set(sink.addNode(end), end);
|
|
1564
|
+
this.report.counts.nodes++;
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
const texts = [sourceText, targetText];
|
|
1569
|
+
const unknown = this.options.addMissingNodes ? -1 : ends.findIndex((id) => sink.indexOf(id) === INVALID_INDEX);
|
|
1570
|
+
if (unknown !== -1) {
|
|
1571
|
+
throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${texts[unknown]}"`, {
|
|
1572
|
+
id: ends[unknown],
|
|
1481
1573
|
});
|
|
1482
1574
|
}
|
|
1575
|
+
return ends;
|
|
1483
1576
|
}
|
|
1484
1577
|
/**
|
|
1485
|
-
* Write
|
|
1486
|
-
* @param attrs -
|
|
1487
|
-
* @param index -
|
|
1488
|
-
* @param
|
|
1489
|
-
* @param where - the edge's location
|
|
1578
|
+
* Write an added edge's id, label, kind and lifetime.
|
|
1579
|
+
* @param attrs - its attributes
|
|
1580
|
+
* @param index - its index
|
|
1581
|
+
* @param where - where it was read
|
|
1490
1582
|
*/
|
|
1491
|
-
|
|
1583
|
+
writeEdgeAttributes(attrs, index, where) {
|
|
1492
1584
|
const { report, sink } = this;
|
|
1585
|
+
const idText = attrs.get("id");
|
|
1493
1586
|
try {
|
|
1494
1587
|
if (idText !== undefined) {
|
|
1495
1588
|
this.edgeIdColumn.set(sink, report, index, idText, where);
|
|
@@ -1508,6 +1601,25 @@ class GexfReader {
|
|
|
1508
1601
|
report.recordError(err, where);
|
|
1509
1602
|
}
|
|
1510
1603
|
}
|
|
1604
|
+
/**
|
|
1605
|
+
* GEXF 1.0 with its edges first, addMissingNodes false: a node an edge named that no `<node>` declared is an
|
|
1606
|
+
* unknown node, as it is when the nodes come first. It is reported, and it and its edges are removed when the
|
|
1607
|
+
* sink can remove nodes.
|
|
1608
|
+
*/
|
|
1609
|
+
dropUndeclaredNodes() {
|
|
1610
|
+
const { sink, report } = this;
|
|
1611
|
+
const removable = sink;
|
|
1612
|
+
for (const [index, id] of this.implicitNodes) {
|
|
1613
|
+
report.error("validation-error", "E_UNKNOWN_NODE", `edge references undeclared node "${String(id)}"`);
|
|
1614
|
+
if (typeof removable.removeNodeByIndex === "function") {
|
|
1615
|
+
const edges = removable.removeNodeByIndex(index);
|
|
1616
|
+
report.counts.nodes--;
|
|
1617
|
+
report.counts.edges -= edges.length;
|
|
1618
|
+
report.counts.skippedEdges += edges.length;
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
this.implicitNodes.clear();
|
|
1622
|
+
}
|
|
1511
1623
|
/**
|
|
1512
1624
|
* The weight argument of one edge from its `weight` XML attribute; undefined when absent (the
|
|
1513
1625
|
* sink records a defaulted weight, design section 3.7).
|
|
@@ -1611,7 +1723,8 @@ class GexfReader {
|
|
|
1611
1723
|
if (index === INVALID_INDEX) {
|
|
1612
1724
|
return;
|
|
1613
1725
|
}
|
|
1614
|
-
|
|
1726
|
+
// GEXF 1.0 names the attribute with `id`
|
|
1727
|
+
const forId = attrs.get("for") ?? attrs.get("id");
|
|
1615
1728
|
const { valueWhere } = this;
|
|
1616
1729
|
valueWhere.line = line;
|
|
1617
1730
|
valueWhere.element = element;
|
|
@@ -2020,6 +2133,43 @@ class GexfReader {
|
|
|
2020
2133
|
}
|
|
2021
2134
|
}
|
|
2022
2135
|
// ---------------------------------------------------------------- viz
|
|
2136
|
+
/**
|
|
2137
|
+
* Write a `<viz:position>` into the node position column, declared on first use with the
|
|
2138
|
+
* dimensions the element writes.
|
|
2139
|
+
* @param attrs - its attributes
|
|
2140
|
+
* @param index - the node's index
|
|
2141
|
+
* @param where - the element's location
|
|
2142
|
+
*/
|
|
2143
|
+
writeVizPosition(attrs, index, where) {
|
|
2144
|
+
const x = vizNumber(attrs, "x");
|
|
2145
|
+
const y = vizNumber(attrs, "y");
|
|
2146
|
+
const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
|
|
2147
|
+
this.positionColumn ?? (this.positionColumn = new LazyColumn("node", {
|
|
2148
|
+
...NODE_DECLS.position,
|
|
2149
|
+
extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
|
|
2150
|
+
}));
|
|
2151
|
+
this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
|
|
2152
|
+
}
|
|
2153
|
+
/**
|
|
2154
|
+
* Write a `<viz:shape>` into the shape column, and a node's image `uri` beside it.
|
|
2155
|
+
* @param name - the element name as written
|
|
2156
|
+
* @param attrs - its attributes
|
|
2157
|
+
* @param domain - node or edge
|
|
2158
|
+
* @param index - the element's index
|
|
2159
|
+
* @param where - the element's location
|
|
2160
|
+
*/
|
|
2161
|
+
writeVizShape(name, attrs, domain, index, where) {
|
|
2162
|
+
const value = attrs.get("value");
|
|
2163
|
+
if (value === undefined) {
|
|
2164
|
+
throw new GraphFormatError("E_COLUMN_TYPE", "<viz:shape> without a value", { element: name });
|
|
2165
|
+
}
|
|
2166
|
+
const columns = domain === "node" ? this.nodeColumns : this.edgeColumns;
|
|
2167
|
+
columns.shape.set(this.sink, this.report, index, value, where);
|
|
2168
|
+
const uri = attrs.get("uri");
|
|
2169
|
+
if (domain === "node" && uri !== undefined) {
|
|
2170
|
+
this.shapeUriColumn.set(this.sink, this.report, index, uri, where);
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2023
2173
|
/**
|
|
2024
2174
|
* Write one viz element into its role column; a value that does not parse is a recorded
|
|
2025
2175
|
* warning and the element is skipped.
|
|
@@ -2043,10 +2193,10 @@ class GexfReader {
|
|
|
2043
2193
|
try {
|
|
2044
2194
|
switch (local) {
|
|
2045
2195
|
case "color":
|
|
2046
|
-
columns.color.set(sink, report, index,
|
|
2196
|
+
columns.color.set(sink, report, index, this.vizColor(attrs, name, where), where);
|
|
2047
2197
|
break;
|
|
2048
2198
|
case "position":
|
|
2049
|
-
this.
|
|
2199
|
+
this.writeVizPosition(attrs, index, where);
|
|
2050
2200
|
break;
|
|
2051
2201
|
case "size":
|
|
2052
2202
|
this.sizeColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
|
|
@@ -2055,7 +2205,7 @@ class GexfReader {
|
|
|
2055
2205
|
this.thicknessColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
|
|
2056
2206
|
break;
|
|
2057
2207
|
case "shape":
|
|
2058
|
-
this.
|
|
2208
|
+
this.writeVizShape(name, attrs, domain, index, where);
|
|
2059
2209
|
break;
|
|
2060
2210
|
default:
|
|
2061
2211
|
break;
|
|
@@ -2069,41 +2219,37 @@ class GexfReader {
|
|
|
2069
2219
|
}
|
|
2070
2220
|
}
|
|
2071
2221
|
/**
|
|
2072
|
-
*
|
|
2073
|
-
*
|
|
2074
|
-
*
|
|
2075
|
-
* @param
|
|
2076
|
-
*/
|
|
2077
|
-
writePosition(attrs, index, where) {
|
|
2078
|
-
const x = vizNumber(attrs, "x");
|
|
2079
|
-
const y = vizNumber(attrs, "y");
|
|
2080
|
-
const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
|
|
2081
|
-
this.positionColumn ?? (this.positionColumn = new LazyColumn("node", {
|
|
2082
|
-
...NODE_DECLS.position,
|
|
2083
|
-
extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
|
|
2084
|
-
}));
|
|
2085
|
-
this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
|
|
2086
|
-
}
|
|
2087
|
-
/**
|
|
2088
|
-
* Write a `<viz:shape>` and, on a node, its `uri`.
|
|
2222
|
+
* `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
|
|
2223
|
+
* `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; a channel outside 0..255 or an alpha outside 0..1 is clamped and
|
|
2224
|
+
* reported, as Gephi clamps it.
|
|
2225
|
+
* @param attrs - the element's attributes
|
|
2089
2226
|
* @param name - the element name as written
|
|
2090
|
-
* @param attrs - its attributes
|
|
2091
|
-
* @param domain - node or edge
|
|
2092
|
-
* @param index - the element's index
|
|
2093
2227
|
* @param where - the element's location
|
|
2228
|
+
* @returns [r, g, b, a]
|
|
2094
2229
|
*/
|
|
2095
|
-
|
|
2096
|
-
const
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2230
|
+
vizColor(attrs, name, where) {
|
|
2231
|
+
const hex = attrs.get("hex");
|
|
2232
|
+
let rgba;
|
|
2233
|
+
if (hex !== undefined && !attrs.has("r")) {
|
|
2234
|
+
const c = canonVizColor(hex);
|
|
2235
|
+
if (c === null) {
|
|
2236
|
+
throw new GraphFormatError("E_COLUMN_TYPE", `viz hex="${hex}" is not a #RRGGBB, #RGB or #RRGGBBAA color`, { attribute: "hex" });
|
|
2237
|
+
}
|
|
2238
|
+
rgba = [...c];
|
|
2239
|
+
if (attrs.has("a")) {
|
|
2240
|
+
rgba[3] = vizNumber(attrs, "a");
|
|
2241
|
+
}
|
|
2101
2242
|
}
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
this.shapeUriColumn.set(sink, report, index, uri, where);
|
|
2243
|
+
else {
|
|
2244
|
+
rgba = [vizNumber(attrs, "r"), vizNumber(attrs, "g"), vizNumber(attrs, "b")];
|
|
2245
|
+
rgba.push(attrs.has("a") ? vizNumber(attrs, "a") : 1);
|
|
2106
2246
|
}
|
|
2247
|
+
const max = [255, 255, 255, 1];
|
|
2248
|
+
if (rgba.some((v, i) => v < 0 || v > max[i])) {
|
|
2249
|
+
this.report.warning("validation-error", VIZ_VALUE_CODE, `<${name}> has a channel outside 0..255 or an alpha outside 0..1; clamped`, where);
|
|
2250
|
+
rgba = rgba.map((v, i) => Math.max(0, Math.min(max[i], v)));
|
|
2251
|
+
}
|
|
2252
|
+
return [rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, rgba[3]];
|
|
2107
2253
|
}
|
|
2108
2254
|
// ---------------------------------------------------------------- helpers
|
|
2109
2255
|
/**
|
|
@@ -2260,35 +2406,6 @@ function vizNumber(attrs, name) {
|
|
|
2260
2406
|
}
|
|
2261
2407
|
return value;
|
|
2262
2408
|
}
|
|
2263
|
-
/**
|
|
2264
|
-
* Parse `<viz:color r g b a hex>` into rgba in 0..1 (design section 5.5: role color, f32 x4).
|
|
2265
|
-
* @param attrs - the element's attributes
|
|
2266
|
-
* @returns [r, g, b, a]
|
|
2267
|
-
*/
|
|
2268
|
-
function parseColor(attrs) {
|
|
2269
|
-
let r;
|
|
2270
|
-
let g;
|
|
2271
|
-
let b;
|
|
2272
|
-
const hex = attrs.get("hex");
|
|
2273
|
-
if (hex !== undefined && !attrs.has("r")) {
|
|
2274
|
-
const digits = hex.startsWith("#") ? hex.slice(1) : hex;
|
|
2275
|
-
if (!/^[0-9a-fA-F]{6}$/.test(digits)) {
|
|
2276
|
-
throw new GraphFormatError("E_COLUMN_TYPE", `viz hex="${hex}" is not a #RRGGBB color`, {
|
|
2277
|
-
attribute: "hex",
|
|
2278
|
-
});
|
|
2279
|
-
}
|
|
2280
|
-
r = Number.parseInt(digits.slice(0, 2), 16);
|
|
2281
|
-
g = Number.parseInt(digits.slice(2, 4), 16);
|
|
2282
|
-
b = Number.parseInt(digits.slice(4, 6), 16);
|
|
2283
|
-
}
|
|
2284
|
-
else {
|
|
2285
|
-
r = vizNumber(attrs, "r");
|
|
2286
|
-
g = vizNumber(attrs, "g");
|
|
2287
|
-
b = vizNumber(attrs, "b");
|
|
2288
|
-
}
|
|
2289
|
-
const a = attrs.has("a") ? vizNumber(attrs, "a") : 1;
|
|
2290
|
-
return [r / 255, g / 255, b / 255, a];
|
|
2291
|
-
}
|
|
2292
2409
|
/** A head that starts with markup, after an optional byte-order mark and whitespace. */
|
|
2293
2410
|
const XML_START = /^\uFEFF?\s*</;
|
|
2294
2411
|
/**
|
|
@@ -2336,6 +2453,7 @@ export const gexfImporter = Object.freeze({
|
|
|
2336
2453
|
extensions: Object.freeze([".gexf"]),
|
|
2337
2454
|
mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
|
|
2338
2455
|
sniff: sniffGexf,
|
|
2456
|
+
styles: gexfStyles,
|
|
2339
2457
|
/**
|
|
2340
2458
|
* Read a GEXF document into the sink in one streaming pass.
|
|
2341
2459
|
* @param input - the document as text, bytes, a stream or chunks
|
|
@@ -2364,7 +2482,9 @@ export const gexfImporter = Object.freeze({
|
|
|
2364
2482
|
report.fail(EMPTY_INPUT_CODE, "the input is empty (no markup at all)", { line: err.line });
|
|
2365
2483
|
}
|
|
2366
2484
|
if (err instanceof XmlSyntaxError) {
|
|
2367
|
-
report.fail(XML_SYNTAX_CODE, err.message, {
|
|
2485
|
+
report.fail(err instanceof XmlNestingError ? XML_NESTING_CODE : XML_SYNTAX_CODE, err.message, {
|
|
2486
|
+
line: err.line,
|
|
2487
|
+
});
|
|
2368
2488
|
}
|
|
2369
2489
|
throw err;
|
|
2370
2490
|
}
|