@graphty/graph-io 0.3.25 → 0.3.27
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/README.md +49 -414
- package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
- package/dist/chunks/choose-DrXtu_96.js +56 -0
- package/dist/chunks/choose-DrXtu_96.js.map +1 -0
- package/dist/chunks/constants-ikG85dT8.js +231 -0
- package/dist/chunks/constants-ikG85dT8.js.map +1 -0
- package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
- package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
- package/dist/chunks/export-CHd4tQE2.js +4333 -0
- package/dist/chunks/export-CHd4tQE2.js.map +1 -0
- package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
- package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
- package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
- package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
- package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
- package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
- package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
- package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
- package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
- package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
- package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
- package/dist/chunks/importer-B2W_58pz.js.map +1 -0
- package/dist/chunks/importer-BSALvkui.js +2811 -0
- package/dist/chunks/importer-BSALvkui.js.map +1 -0
- package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
- package/dist/chunks/importer-BVRE--Un.js.map +1 -0
- package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
- package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
- package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
- package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
- package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
- package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
- package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
- package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
- package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
- package/dist/chunks/records-CdlvL4RO.js.map +1 -0
- package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
- package/dist/chunks/text-DzXjAiTl.js.map +1 -0
- package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
- package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
- package/dist/csv.js +952 -262
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +6 -3
- package/dist/cx2.js +2 -2
- package/dist/cys.js +6 -3
- package/dist/dot.js +1 -1
- package/dist/gexf.js +554 -122
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +344 -87
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +1105 -213
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -2
- package/dist/graphml.js.map +1 -1
- package/dist/json.js +3 -2
- package/dist/neo4j.js +565 -158
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +6 -3
- package/dist/pajek.js +1 -1
- package/dist/src/children.d.ts +18 -6
- package/dist/src/children.d.ts.map +1 -1
- package/dist/src/children.js +6 -3
- package/dist/src/children.js.map +1 -1
- package/dist/src/common/attributes.d.ts +29 -11
- package/dist/src/common/attributes.d.ts.map +1 -1
- package/dist/src/common/attributes.js +25 -7
- package/dist/src/common/attributes.js.map +1 -1
- package/dist/src/common/cell-budget.d.ts +9 -2
- package/dist/src/common/cell-budget.d.ts.map +1 -1
- package/dist/src/common/cell-budget.js +11 -3
- package/dist/src/common/cell-budget.js.map +1 -1
- package/dist/src/common/choose.d.ts +19 -0
- package/dist/src/common/choose.d.ts.map +1 -0
- package/dist/src/common/choose.js +72 -0
- package/dist/src/common/choose.js.map +1 -0
- package/dist/src/common/codes.d.ts +456 -66
- package/dist/src/common/codes.d.ts.map +1 -1
- package/dist/src/common/codes.js +458 -66
- package/dist/src/common/codes.js.map +1 -1
- package/dist/src/common/compare.d.ts +81 -0
- package/dist/src/common/compare.d.ts.map +1 -0
- package/dist/src/common/compare.js +394 -0
- package/dist/src/common/compare.js.map +1 -0
- package/dist/src/common/cx-export.d.ts +123 -0
- package/dist/src/common/cx-export.d.ts.map +1 -0
- package/dist/src/common/cx-export.js +334 -0
- package/dist/src/common/cx-export.js.map +1 -0
- package/dist/src/common/declared-types.d.ts +22 -2
- package/dist/src/common/declared-types.d.ts.map +1 -1
- package/dist/src/common/declared-types.js +21 -3
- package/dist/src/common/declared-types.js.map +1 -1
- package/dist/src/common/direction.d.ts +74 -50
- package/dist/src/common/direction.d.ts.map +1 -1
- package/dist/src/common/direction.js +47 -27
- package/dist/src/common/direction.js.map +1 -1
- package/dist/src/common/escape.d.ts +21 -9
- package/dist/src/common/escape.d.ts.map +1 -1
- package/dist/src/common/escape.js +39 -22
- package/dist/src/common/escape.js.map +1 -1
- package/dist/src/common/export.d.ts +144 -32
- package/dist/src/common/export.d.ts.map +1 -1
- package/dist/src/common/export.js +216 -42
- package/dist/src/common/export.js.map +1 -1
- package/dist/src/common/format.d.ts +23 -1
- package/dist/src/common/format.d.ts.map +1 -1
- package/dist/src/common/format.js +26 -1
- package/dist/src/common/format.js.map +1 -1
- package/dist/src/common/ids.d.ts +9 -2
- package/dist/src/common/ids.d.ts.map +1 -1
- package/dist/src/common/ids.js +6 -2
- package/dist/src/common/ids.js.map +1 -1
- package/dist/src/common/input.d.ts +122 -28
- package/dist/src/common/input.d.ts.map +1 -1
- package/dist/src/common/input.js +890 -124
- package/dist/src/common/input.js.map +1 -1
- package/dist/src/common/json-elements.d.ts +144 -20
- package/dist/src/common/json-elements.d.ts.map +1 -1
- package/dist/src/common/json-elements.js +869 -189
- package/dist/src/common/json-elements.js.map +1 -1
- package/dist/src/common/line-format.d.ts +90 -0
- package/dist/src/common/line-format.d.ts.map +1 -0
- package/dist/src/common/line-format.js +185 -0
- package/dist/src/common/line-format.js.map +1 -0
- package/dist/src/common/lists.d.ts +6 -1
- package/dist/src/common/lists.d.ts.map +1 -1
- package/dist/src/common/lists.js +3 -1
- package/dist/src/common/lists.js.map +1 -1
- package/dist/src/common/ontology-export.d.ts +167 -0
- package/dist/src/common/ontology-export.d.ts.map +1 -0
- package/dist/src/common/ontology-export.js +359 -0
- package/dist/src/common/ontology-export.js.map +1 -0
- package/dist/src/common/ontology.d.ts +25 -3
- package/dist/src/common/ontology.d.ts.map +1 -1
- package/dist/src/common/ontology.js +30 -9
- package/dist/src/common/ontology.js.map +1 -1
- package/dist/src/common/options.d.ts +62 -12
- package/dist/src/common/options.d.ts.map +1 -1
- package/dist/src/common/options.js +89 -11
- package/dist/src/common/options.js.map +1 -1
- package/dist/src/common/plural.d.ts +31 -0
- package/dist/src/common/plural.d.ts.map +1 -0
- package/dist/src/common/plural.js +46 -0
- package/dist/src/common/plural.js.map +1 -0
- package/dist/src/common/report.d.ts +72 -14
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +146 -22
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/common/temporal.d.ts +22 -5
- package/dist/src/common/temporal.d.ts.map +1 -1
- package/dist/src/common/temporal.js +13 -2
- package/dist/src/common/temporal.js.map +1 -1
- package/dist/src/common/text.d.ts +39 -23
- package/dist/src/common/text.d.ts.map +1 -1
- package/dist/src/common/text.js +51 -21
- package/dist/src/common/text.js.map +1 -1
- package/dist/src/common/weights.d.ts +37 -4
- package/dist/src/common/weights.d.ts.map +1 -1
- package/dist/src/common/weights.js +61 -2
- package/dist/src/common/weights.js.map +1 -1
- package/dist/src/common/writer.d.ts +19 -3
- package/dist/src/common/writer.d.ts.map +1 -1
- package/dist/src/common/writer.js +30 -2
- package/dist/src/common/writer.js.map +1 -1
- package/dist/src/common/xml.d.ts +125 -9
- package/dist/src/common/xml.d.ts.map +1 -1
- package/dist/src/common/xml.js +402 -85
- package/dist/src/common/xml.js.map +1 -1
- package/dist/src/common/zip.d.ts +44 -4
- package/dist/src/common/zip.d.ts.map +1 -1
- package/dist/src/common/zip.js +134 -5
- package/dist/src/common/zip.js.map +1 -1
- package/dist/src/formats/csv/exporter.d.ts +80 -24
- package/dist/src/formats/csv/exporter.d.ts.map +1 -1
- package/dist/src/formats/csv/exporter.js +146 -33
- package/dist/src/formats/csv/exporter.js.map +1 -1
- package/dist/src/formats/csv/header.d.ts +38 -9
- package/dist/src/formats/csv/header.d.ts.map +1 -1
- package/dist/src/formats/csv/header.js +46 -10
- package/dist/src/formats/csv/header.js.map +1 -1
- package/dist/src/formats/csv/importer.d.ts +187 -37
- package/dist/src/formats/csv/importer.d.ts.map +1 -1
- package/dist/src/formats/csv/importer.js +835 -204
- package/dist/src/formats/csv/importer.js.map +1 -1
- package/dist/src/formats/csv/index.d.ts +100 -19
- package/dist/src/formats/csv/index.d.ts.map +1 -1
- package/dist/src/formats/csv/index.js +94 -21
- package/dist/src/formats/csv/index.js.map +1 -1
- package/dist/src/formats/csv/records.d.ts +95 -10
- package/dist/src/formats/csv/records.d.ts.map +1 -1
- package/dist/src/formats/csv/records.js +333 -122
- package/dist/src/formats/csv/records.js.map +1 -1
- package/dist/src/formats/csv/values.d.ts +1 -0
- package/dist/src/formats/csv/values.d.ts.map +1 -1
- package/dist/src/formats/csv/values.js +1 -0
- package/dist/src/formats/csv/values.js.map +1 -1
- package/dist/src/formats/cx/exporter.d.ts +102 -0
- package/dist/src/formats/cx/exporter.d.ts.map +1 -0
- package/dist/src/formats/cx/exporter.js +1217 -0
- package/dist/src/formats/cx/exporter.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts +79 -32
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +682 -287
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/index.d.ts +4 -3
- package/dist/src/formats/cx/index.d.ts.map +1 -1
- package/dist/src/formats/cx/index.js +4 -3
- package/dist/src/formats/cx/index.js.map +1 -1
- package/dist/src/formats/cx2/exporter.d.ts +29 -11
- package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx2/exporter.js +39 -268
- package/dist/src/formats/cx2/exporter.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts +78 -28
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +227 -80
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/index.d.ts +2 -1
- package/dist/src/formats/cx2/index.d.ts.map +1 -1
- package/dist/src/formats/cx2/index.js +2 -1
- package/dist/src/formats/cx2/index.js.map +1 -1
- package/dist/src/formats/cys/constants.d.ts +66 -17
- package/dist/src/formats/cys/constants.d.ts.map +1 -1
- package/dist/src/formats/cys/constants.js +59 -18
- package/dist/src/formats/cys/constants.js.map +1 -1
- package/dist/src/formats/cys/exporter.d.ts +118 -0
- package/dist/src/formats/cys/exporter.d.ts.map +1 -0
- package/dist/src/formats/cys/exporter.js +1072 -0
- package/dist/src/formats/cys/exporter.js.map +1 -0
- package/dist/src/formats/cys/importer.d.ts +22 -8
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +510 -149
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/index.d.ts +4 -2
- package/dist/src/formats/cys/index.d.ts.map +1 -1
- package/dist/src/formats/cys/index.js +4 -2
- package/dist/src/formats/cys/index.js.map +1 -1
- package/dist/src/formats/cys/session.d.ts +46 -7
- package/dist/src/formats/cys/session.d.ts.map +1 -1
- package/dist/src/formats/cys/session.js +101 -27
- package/dist/src/formats/cys/session.js.map +1 -1
- package/dist/src/formats/cys/tables.d.ts +9 -2
- package/dist/src/formats/cys/tables.d.ts.map +1 -1
- package/dist/src/formats/cys/tables.js +29 -7
- package/dist/src/formats/cys/tables.js.map +1 -1
- package/dist/src/formats/dot/exporter.d.ts +42 -14
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +56 -29
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +91 -29
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +190 -39
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +2 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/names.d.ts +44 -11
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +44 -11
- package/dist/src/formats/dot/names.js.map +1 -1
- package/dist/src/formats/dot/tokenizer.d.ts +9 -2
- package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
- package/dist/src/formats/dot/tokenizer.js +20 -5
- package/dist/src/formats/dot/tokenizer.js.map +1 -1
- package/dist/src/formats/gexf/exporter.d.ts +46 -15
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
- package/dist/src/formats/gexf/exporter.js +45 -15
- package/dist/src/formats/gexf/exporter.js.map +1 -1
- package/dist/src/formats/gexf/importer.d.ts +87 -23
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +471 -90
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/index.d.ts +84 -21
- package/dist/src/formats/gexf/index.d.ts.map +1 -1
- package/dist/src/formats/gexf/index.js +80 -23
- package/dist/src/formats/gexf/index.js.map +1 -1
- package/dist/src/formats/gexf/schema.d.ts +67 -15
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +59 -13
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gml/exporter.d.ts +69 -21
- package/dist/src/formats/gml/exporter.d.ts.map +1 -1
- package/dist/src/formats/gml/exporter.js +74 -29
- package/dist/src/formats/gml/exporter.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +116 -25
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +290 -61
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +87 -24
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +79 -26
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/syntax.d.ts +67 -18
- package/dist/src/formats/gml/syntax.d.ts.map +1 -1
- package/dist/src/formats/gml/syntax.js +110 -28
- package/dist/src/formats/gml/syntax.js.map +1 -1
- package/dist/src/formats/graphml/constants.d.ts +174 -44
- package/dist/src/formats/graphml/constants.d.ts.map +1 -1
- package/dist/src/formats/graphml/constants.js +165 -44
- package/dist/src/formats/graphml/constants.js.map +1 -1
- package/dist/src/formats/graphml/exporter.d.ts +17 -9
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
- package/dist/src/formats/graphml/exporter.js +33 -12
- package/dist/src/formats/graphml/exporter.js.map +1 -1
- package/dist/src/formats/graphml/importer.d.ts +19 -7
- package/dist/src/formats/graphml/importer.d.ts.map +1 -1
- package/dist/src/formats/graphml/importer.js +466 -39
- package/dist/src/formats/graphml/importer.js.map +1 -1
- package/dist/src/formats/graphml/index.d.ts +2 -1
- package/dist/src/formats/graphml/index.d.ts.map +1 -1
- package/dist/src/formats/graphml/index.js +2 -1
- package/dist/src/formats/graphml/index.js.map +1 -1
- package/dist/src/formats/graphml/tree.d.ts +6 -2
- package/dist/src/formats/graphml/tree.d.ts.map +1 -1
- package/dist/src/formats/graphml/tree.js +6 -2
- package/dist/src/formats/graphml/tree.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +8 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +36 -15
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +88 -24
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +109 -19
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/exporter.d.ts +134 -22
- package/dist/src/formats/json/exporter.d.ts.map +1 -1
- package/dist/src/formats/json/exporter.js +135 -54
- package/dist/src/formats/json/exporter.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +173 -52
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +899 -220
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +3 -2
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +3 -2
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/obographs-export.d.ts +68 -0
- package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
- package/dist/src/formats/json/obographs-export.js +941 -0
- package/dist/src/formats/json/obographs-export.js.map +1 -0
- package/dist/src/formats/json/obographs.d.ts +26 -0
- package/dist/src/formats/json/obographs.d.ts.map +1 -1
- package/dist/src/formats/json/obographs.js +297 -80
- package/dist/src/formats/json/obographs.js.map +1 -1
- package/dist/src/formats/neo4j/exporter.d.ts +109 -21
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
- package/dist/src/formats/neo4j/exporter.js +239 -86
- package/dist/src/formats/neo4j/exporter.js.map +1 -1
- package/dist/src/formats/neo4j/header.d.ts +17 -4
- package/dist/src/formats/neo4j/header.d.ts.map +1 -1
- package/dist/src/formats/neo4j/header.js +36 -4
- package/dist/src/formats/neo4j/header.js.map +1 -1
- package/dist/src/formats/neo4j/importer.d.ts +107 -27
- package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
- package/dist/src/formats/neo4j/importer.js +415 -63
- package/dist/src/formats/neo4j/importer.js.map +1 -1
- package/dist/src/formats/neo4j/index.d.ts +73 -23
- package/dist/src/formats/neo4j/index.d.ts.map +1 -1
- package/dist/src/formats/neo4j/index.js +65 -25
- package/dist/src/formats/neo4j/index.js.map +1 -1
- package/dist/src/formats/obo/exporter.d.ts +150 -0
- package/dist/src/formats/obo/exporter.d.ts.map +1 -0
- package/dist/src/formats/obo/exporter.js +1736 -0
- package/dist/src/formats/obo/exporter.js.map +1 -0
- package/dist/src/formats/obo/importer.d.ts +95 -19
- package/dist/src/formats/obo/importer.d.ts.map +1 -1
- package/dist/src/formats/obo/importer.js +475 -104
- package/dist/src/formats/obo/importer.js.map +1 -1
- package/dist/src/formats/obo/index.d.ts +6 -3
- package/dist/src/formats/obo/index.d.ts.map +1 -1
- package/dist/src/formats/obo/index.js +6 -3
- package/dist/src/formats/obo/index.js.map +1 -1
- package/dist/src/formats/obo/syntax.d.ts +108 -4
- package/dist/src/formats/obo/syntax.d.ts.map +1 -1
- package/dist/src/formats/obo/syntax.js +211 -34
- package/dist/src/formats/obo/syntax.js.map +1 -1
- package/dist/src/formats/pajek/exporter.d.ts +54 -16
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +67 -35
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +84 -22
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +303 -83
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +2 -1
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js +2 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +77 -14
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +186 -54
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/columns.d.ts +1 -0
- package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
- package/dist/src/formats/xgmml/columns.js +4 -0
- package/dist/src/formats/xgmml/columns.js.map +1 -1
- package/dist/src/formats/xgmml/constants.d.ts +186 -56
- package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
- package/dist/src/formats/xgmml/constants.js +181 -57
- package/dist/src/formats/xgmml/constants.js.map +1 -1
- package/dist/src/formats/xgmml/document.d.ts +65 -11
- package/dist/src/formats/xgmml/document.d.ts.map +1 -1
- package/dist/src/formats/xgmml/document.js +157 -28
- package/dist/src/formats/xgmml/document.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +61 -3
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +129 -26
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/exporter.d.ts +13 -6
- package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
- package/dist/src/formats/xgmml/exporter.js +21 -22
- package/dist/src/formats/xgmml/exporter.js.map +1 -1
- package/dist/src/formats/xgmml/importer.d.ts +33 -12
- package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
- package/dist/src/formats/xgmml/importer.js +35 -72
- package/dist/src/formats/xgmml/importer.js.map +1 -1
- package/dist/src/formats/xgmml/index.d.ts +1 -0
- package/dist/src/formats/xgmml/index.d.ts.map +1 -1
- package/dist/src/formats/xgmml/index.js +1 -0
- package/dist/src/formats/xgmml/index.js.map +1 -1
- package/dist/src/formats/xgmml/values.d.ts +8 -1
- package/dist/src/formats/xgmml/values.d.ts.map +1 -1
- package/dist/src/formats/xgmml/values.js +8 -3
- package/dist/src/formats/xgmml/values.js.map +1 -1
- package/dist/src/index.d.ts +23 -18
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +28 -16
- package/dist/src/index.js.map +1 -1
- package/dist/src/registry.d.ts +478 -92
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +807 -88
- package/dist/src/registry.js.map +1 -1
- package/dist/src/sniff.d.ts +61 -19
- package/dist/src/sniff.d.ts.map +1 -1
- package/dist/src/sniff.js +121 -29
- package/dist/src/sniff.js.map +1 -1
- package/dist/src/types.d.ts +362 -112
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +28 -7
- package/dist/src/types.js.map +1 -1
- package/dist/xgmml.js +2 -2
- package/docs/samples/README.md +25 -0
- package/docs/samples/got-edges.csv +353 -0
- package/docs/samples/got-network.graphml +1384 -0
- package/docs/samples/got-nodes.csv +108 -0
- package/docs/samples/got.cx +930 -0
- package/docs/samples/got.cx2 +465 -0
- package/docs/samples/got.gexf +471 -0
- package/docs/samples/got.gml +2650 -0
- package/docs/samples/got.json +2546 -0
- package/docs/samples/got.net +461 -0
- package/docs/samples/movies-nodes.csv +9 -0
- package/docs/samples/movies-rels.csv +8 -0
- package/docs/samples/networks.cys +0 -0
- package/docs/samples/proteins.xgmml +9 -0
- package/docs/samples/teams.gv +24 -0
- package/docs/samples/vehicles.obo +25 -0
- package/package.json +9 -4
- package/src/children.ts +18 -6
- package/src/common/attributes.ts +29 -11
- package/src/common/cell-budget.ts +11 -3
- package/src/common/choose.ts +89 -0
- package/src/common/codes.ts +490 -66
- package/src/common/compare.ts +472 -0
- package/src/common/cx-export.ts +432 -0
- package/src/common/declared-types.ts +40 -6
- package/src/common/direction.ts +78 -51
- package/src/common/escape.ts +39 -22
- package/src/common/export.ts +284 -47
- package/src/common/format.ts +30 -1
- package/src/common/ids.ts +14 -3
- package/src/common/input.ts +1057 -134
- package/src/common/json-elements.ts +1035 -199
- package/src/common/line-format.ts +249 -0
- package/src/common/lists.ts +7 -2
- package/src/common/ontology-export.ts +461 -0
- package/src/common/ontology.ts +31 -9
- package/src/common/options.ts +110 -15
- package/src/common/plural.ts +49 -0
- package/src/common/report.ts +168 -25
- package/src/common/temporal.ts +22 -5
- package/src/common/text.ts +62 -23
- package/src/common/weights.ts +74 -4
- package/src/common/writer.ts +37 -3
- package/src/common/xml.ts +479 -90
- package/src/common/zip.ts +169 -7
- package/src/formats/csv/exporter.ts +202 -47
- package/src/formats/csv/header.ts +50 -11
- package/src/formats/csv/importer.ts +1133 -245
- package/src/formats/csv/index.ts +106 -19
- package/src/formats/csv/records.ts +396 -122
- package/src/formats/csv/values.ts +1 -0
- package/src/formats/cx/exporter.ts +1483 -0
- package/src/formats/cx/importer.ts +890 -302
- package/src/formats/cx/index.ts +4 -3
- package/src/formats/cx2/exporter.ts +62 -339
- package/src/formats/cx2/importer.ts +318 -87
- package/src/formats/cx2/index.ts +2 -1
- package/src/formats/cys/constants.ts +62 -17
- package/src/formats/cys/exporter.ts +1368 -0
- package/src/formats/cys/importer.ts +659 -157
- package/src/formats/cys/index.ts +4 -2
- package/src/formats/cys/session.ts +142 -34
- package/src/formats/cys/tables.ts +47 -9
- package/src/formats/dot/exporter.ts +83 -37
- package/src/formats/dot/importer.ts +248 -54
- package/src/formats/dot/index.ts +2 -1
- package/src/formats/dot/names.ts +44 -11
- package/src/formats/dot/tokenizer.ts +25 -6
- package/src/formats/gexf/exporter.ts +57 -18
- package/src/formats/gexf/importer.ts +636 -105
- package/src/formats/gexf/index.ts +90 -21
- package/src/formats/gexf/schema.ts +67 -15
- package/src/formats/gml/exporter.ts +90 -36
- package/src/formats/gml/importer.ts +388 -67
- package/src/formats/gml/index.ts +85 -24
- package/src/formats/gml/syntax.ts +113 -28
- package/src/formats/graphml/constants.ts +178 -44
- package/src/formats/graphml/exporter.ts +52 -18
- package/src/formats/graphml/importer.ts +640 -60
- package/src/formats/graphml/index.ts +2 -1
- package/src/formats/graphml/tree.ts +6 -2
- package/src/formats/graphml/yfiles.ts +37 -15
- package/src/formats/json/dialect.ts +128 -29
- package/src/formats/json/exporter.ts +205 -68
- package/src/formats/json/importer.ts +1163 -253
- package/src/formats/json/index.ts +3 -1
- package/src/formats/json/obographs-export.ts +1197 -0
- package/src/formats/json/obographs.ts +353 -92
- package/src/formats/neo4j/exporter.ts +321 -102
- package/src/formats/neo4j/header.ts +44 -6
- package/src/formats/neo4j/importer.ts +512 -73
- package/src/formats/neo4j/index.ts +75 -23
- package/src/formats/obo/exporter.ts +2210 -0
- package/src/formats/obo/importer.ts +622 -109
- package/src/formats/obo/index.ts +6 -3
- package/src/formats/obo/syntax.ts +232 -37
- package/src/formats/pajek/exporter.ts +90 -42
- package/src/formats/pajek/importer.ts +407 -93
- package/src/formats/pajek/index.ts +2 -1
- package/src/formats/pajek/syntax.ts +216 -55
- package/src/formats/xgmml/columns.ts +10 -0
- package/src/formats/xgmml/constants.ts +183 -56
- package/src/formats/xgmml/document.ts +212 -34
- package/src/formats/xgmml/emit.ts +175 -34
- package/src/formats/xgmml/exporter.ts +36 -28
- package/src/formats/xgmml/importer.ts +64 -86
- package/src/formats/xgmml/index.ts +1 -0
- package/src/formats/xgmml/values.ts +12 -4
- package/src/index.ts +81 -11
- package/src/registry.ts +1121 -135
- package/src/sniff.ts +163 -32
- package/src/types.ts +385 -114
- package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
- package/dist/chunks/export-Bh60Dv-n.js +0 -582
- package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
- package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
- package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
- package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
- package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
- package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
- package/dist/chunks/importer-DET1tg6s.js.map +0 -1
- package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
- package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
- package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
- package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
- package/dist/chunks/importer-eUREhBGj.js.map +0 -1
- package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
- package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
- package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
- package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
- package/dist/chunks/ontology-BnrJ4I98.js +0 -113
- package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
- package/dist/chunks/records-dbRkxwaq.js.map +0 -1
- package/dist/chunks/report-B1z4WT9e.js +0 -2372
- package/dist/chunks/report-B1z4WT9e.js.map +0 -1
- package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
- package/dist/chunks/weights-Dzba96G3.js +0 -176
- package/dist/chunks/weights-Dzba96G3.js.map +0 -1
- package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `@graphty/graph-io/graphml` subpath: the GraphML importer and exporter
|
|
2
|
+
* The `@graphty/graph-io/graphml` subpath: the GraphML importer and exporter,
|
|
3
3
|
* their option types and their issue and loss-note code tables.
|
|
4
|
+
* @module @graphty/graph-io/graphml
|
|
4
5
|
*/
|
|
5
6
|
|
|
6
7
|
export { GRAPHML_ISSUE, GRAPHML_LOSS } from "./constants.js";
|
|
@@ -39,6 +39,7 @@ interface Frame {
|
|
|
39
39
|
* Builds the tree of one subtree from start / end / text events. The outermost frame is the
|
|
40
40
|
* `<data>` element itself; `finish()` returns its content: the object of its children, or its
|
|
41
41
|
* text when it has none.
|
|
42
|
+
* @category Plugin helpers
|
|
42
43
|
*/
|
|
43
44
|
export class XmlTreeBuilder {
|
|
44
45
|
private readonly frames: Frame[] = [];
|
|
@@ -151,20 +152,22 @@ function attachChild(parent: Frame, name: string, value: unknown): void {
|
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
/**
|
|
154
|
-
* Whether a value is a tree the writer can
|
|
155
|
+
* Whether a value is a tree the writer can serialize: a string, number, boolean or null (text),
|
|
155
156
|
* an array of such trees, or an object whose keys are `#text`, `@_<Name>` or `<Name>` with tree
|
|
156
157
|
* values.
|
|
157
158
|
* @param value - the value
|
|
158
159
|
* @returns true when writeXmlTree() accepts it
|
|
160
|
+
* @category Plugin helpers
|
|
159
161
|
*/
|
|
160
162
|
export function isXmlTree(value: unknown): boolean {
|
|
161
163
|
return treeProblem(value) === null;
|
|
162
164
|
}
|
|
163
165
|
|
|
164
166
|
/**
|
|
165
|
-
* Why a value is not a
|
|
167
|
+
* Why a value is not a serializable tree.
|
|
166
168
|
* @param value - the value
|
|
167
169
|
* @returns a message, or null when the value is a tree
|
|
170
|
+
* @category Plugin helpers
|
|
168
171
|
*/
|
|
169
172
|
export function treeProblem(value: unknown): string | null {
|
|
170
173
|
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
@@ -220,6 +223,7 @@ export function treeProblem(value: unknown): string | null {
|
|
|
220
223
|
* @param value - the tree (the content of a `<data>` element)
|
|
221
224
|
* @param indent - the indentation of the containing element's children
|
|
222
225
|
* @param out - receives the text parts
|
|
226
|
+
* @category Plugin helpers
|
|
223
227
|
*/
|
|
224
228
|
export function writeXmlTree(value: unknown, indent: string, out: string[]): void {
|
|
225
229
|
const problem = treeProblem(value);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* yFiles / yEd graphics read out of the JSON tree of a `yfiles.type` key (tree.ts) into typed
|
|
3
3
|
* columns, beside the tree itself: a `y:ShapeNode` gives the node's position, size, fill and
|
|
4
|
-
* border
|
|
4
|
+
* border colors, label and shape, and a `y:PolyLineEdge` gives the edge's line color and width,
|
|
5
5
|
* its arrows and the direction they draw. The values are the ones graphty-element's own GraphML
|
|
6
|
-
* parser produced, so a consumer rebuilds its records by dropping the `yfiles.` prefix:
|
|
6
|
+
* parser produced, so a consumer rebuilds its records by dropping the `yfiles.` prefix: colors
|
|
7
7
|
* are `#RRGGBB` in upper case (a `#RGB` is expanded, any other text is kept as written), numbers
|
|
8
8
|
* are parsed with parseFloat, the position is `[x, y, 0]` and the shape is the yFiles shape type
|
|
9
9
|
* as written. One difference: a label whose text is a number (`<y:NodeLabel>0</y:NodeLabel>`) is
|
|
@@ -52,6 +52,7 @@ const EDGE_FIELDS: Readonly<Record<string, Omit<ColumnDecl, "name">>> = {
|
|
|
52
52
|
* @param field - the field name (a key of the values graphicsValues() returns)
|
|
53
53
|
* @param keyId - the id of the GraphML key whose tree it is read from
|
|
54
54
|
* @returns the declaration
|
|
55
|
+
* @category Plugin helpers
|
|
55
56
|
*/
|
|
56
57
|
export function graphicsDecl(domain: "node" | "edge", field: string, keyId: string): ColumnDecl {
|
|
57
58
|
const fields = domain === "node" ? NODE_FIELDS : EDGE_FIELDS;
|
|
@@ -76,6 +77,7 @@ export function graphicsDecl(domain: "node" | "edge", field: string, keyId: stri
|
|
|
76
77
|
* @param meta.dtype - the column dtype
|
|
77
78
|
* @param meta.origin - the column origin
|
|
78
79
|
* @returns true for a mapped graphics column
|
|
80
|
+
* @category Plugin helpers
|
|
79
81
|
*/
|
|
80
82
|
export function isGraphicsColumn(meta: {
|
|
81
83
|
readonly name: string;
|
|
@@ -95,6 +97,7 @@ export function isGraphicsColumn(meta: {
|
|
|
95
97
|
* @param table - the table it is in
|
|
96
98
|
* @param domain - node or edge
|
|
97
99
|
* @returns the number of rows that differ from the trees
|
|
100
|
+
* @category Plugin helpers
|
|
98
101
|
*/
|
|
99
102
|
export function staleGraphicsRows(column: Column, table: Iterable<Column>, domain: "node" | "edge"): number {
|
|
100
103
|
const field = column.meta.name.slice(YFILES_COLUMN_PREFIX.length);
|
|
@@ -130,19 +133,21 @@ export function staleGraphicsRows(column: Column, table: Iterable<Column>, domai
|
|
|
130
133
|
* PolyLineEdge's for an edge; nothing for any other graphics (GenericNode, BezierEdge, ...).
|
|
131
134
|
* @param domain - node or edge
|
|
132
135
|
* @param tree - the `<data>` content as tree.ts builds it
|
|
136
|
+
* @param unmapped - receives the fields whose text is present but not a number (not mapped)
|
|
133
137
|
* @returns field name -> value, in declaration order
|
|
138
|
+
* @category Plugin helpers
|
|
134
139
|
*/
|
|
135
|
-
export function graphicsValues(domain: "node" | "edge", tree: unknown): [string, unknown][] {
|
|
140
|
+
export function graphicsValues(domain: "node" | "edge", tree: unknown, unmapped: string[] = []): [string, unknown][] {
|
|
136
141
|
const out: [string, unknown][] = [];
|
|
137
142
|
if (domain === "node") {
|
|
138
143
|
const shape = child(tree, "ShapeNode");
|
|
139
144
|
if (shape !== undefined) {
|
|
140
|
-
shapeNodeValues(shape, out);
|
|
145
|
+
shapeNodeValues(shape, out, unmapped);
|
|
141
146
|
}
|
|
142
147
|
} else {
|
|
143
148
|
const edge = child(tree, "PolyLineEdge");
|
|
144
149
|
if (edge !== undefined) {
|
|
145
|
-
polyLineEdgeValues(edge, out);
|
|
150
|
+
polyLineEdgeValues(edge, out, unmapped);
|
|
146
151
|
}
|
|
147
152
|
}
|
|
148
153
|
return out;
|
|
@@ -152,21 +157,22 @@ export function graphicsValues(domain: "node" | "edge", tree: unknown): [string,
|
|
|
152
157
|
* Read a ShapeNode.
|
|
153
158
|
* @param shape - the ShapeNode element
|
|
154
159
|
* @param out - receives the values
|
|
160
|
+
* @param unmapped - receives the fields whose text is not a number
|
|
155
161
|
*/
|
|
156
|
-
function shapeNodeValues(shape: unknown, out: [string, unknown][]): void {
|
|
162
|
+
function shapeNodeValues(shape: unknown, out: [string, unknown][], unmapped: string[]): void {
|
|
157
163
|
const geometry = child(shape, "Geometry");
|
|
158
164
|
// yFiles requires x, y, width and height on Geometry; a position needs both coordinates
|
|
159
|
-
const x =
|
|
160
|
-
const y =
|
|
165
|
+
const x = checked(attr(geometry, "x"), "x", unmapped);
|
|
166
|
+
const y = checked(attr(geometry, "y"), "y", unmapped);
|
|
161
167
|
if (x !== undefined && y !== undefined) {
|
|
162
168
|
out.push(["position", [x, y, 0]]);
|
|
163
169
|
}
|
|
164
|
-
push(out, "width",
|
|
165
|
-
push(out, "height",
|
|
170
|
+
push(out, "width", checked(attr(geometry, "width"), "width", unmapped));
|
|
171
|
+
push(out, "height", checked(attr(geometry, "height"), "height", unmapped));
|
|
166
172
|
push(out, "color", color(attr(child(shape, "Fill"), "color")));
|
|
167
173
|
const border = child(shape, "BorderStyle");
|
|
168
174
|
push(out, "borderColor", color(attr(border, "color")));
|
|
169
|
-
push(out, "borderWidth",
|
|
175
|
+
push(out, "borderWidth", checked(attr(border, "width"), "borderWidth", unmapped));
|
|
170
176
|
const label = child(shape, "NodeLabel");
|
|
171
177
|
// an element with no text and no attributes is "" (no label); one with attributes but no text is a blank label
|
|
172
178
|
if (typeof label === "string" ? label.length > 0 : label !== undefined) {
|
|
@@ -180,11 +186,12 @@ function shapeNodeValues(shape: unknown, out: [string, unknown][]): void {
|
|
|
180
186
|
* Read a PolyLineEdge.
|
|
181
187
|
* @param edge - the PolyLineEdge element
|
|
182
188
|
* @param out - receives the values
|
|
189
|
+
* @param unmapped - receives the fields whose text is not a number
|
|
183
190
|
*/
|
|
184
|
-
function polyLineEdgeValues(edge: unknown, out: [string, unknown][]): void {
|
|
191
|
+
function polyLineEdgeValues(edge: unknown, out: [string, unknown][], unmapped: string[]): void {
|
|
185
192
|
const line = child(edge, "LineStyle");
|
|
186
193
|
push(out, "color", color(attr(line, "color")));
|
|
187
|
-
push(out, "width",
|
|
194
|
+
push(out, "width", checked(attr(line, "width"), "width", unmapped));
|
|
188
195
|
const arrows = child(edge, "Arrows");
|
|
189
196
|
if (arrows !== undefined && typeof arrows === "object") {
|
|
190
197
|
const target = attr(arrows, "target");
|
|
@@ -273,9 +280,24 @@ function number(value: string | undefined): number | undefined {
|
|
|
273
280
|
}
|
|
274
281
|
|
|
275
282
|
/**
|
|
276
|
-
* A
|
|
283
|
+
* A number attribute, recording a present text that is not a number.
|
|
277
284
|
* @param value - the text
|
|
278
|
-
* @
|
|
285
|
+
* @param field - the field it maps to
|
|
286
|
+
* @param unmapped - receives the field when the text is not a number
|
|
287
|
+
* @returns the number, or undefined
|
|
288
|
+
*/
|
|
289
|
+
function checked(value: string | undefined, field: string, unmapped: string[]): number | undefined {
|
|
290
|
+
const n = number(value);
|
|
291
|
+
if (n === undefined && value !== undefined && value.length > 0) {
|
|
292
|
+
unmapped.push(field);
|
|
293
|
+
}
|
|
294
|
+
return n;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* A color attribute: `#RRGGBB` upper-cased, `#RGB` expanded, anything else as written.
|
|
299
|
+
* @param value - the text
|
|
300
|
+
* @returns the color, or undefined when absent or empty
|
|
279
301
|
*/
|
|
280
302
|
function color(value: string | undefined): string | undefined {
|
|
281
303
|
if (value === undefined || value.length === 0) {
|
|
@@ -8,20 +8,27 @@
|
|
|
8
8
|
* / `graph`), the d3 lineage of the same shape (`links`, `name` ids, integer index endpoints),
|
|
9
9
|
* JSON Graph Format v2 (`graph.nodes` keyed by id, per-edge `directed`, hyperedges), Cytoscape.js
|
|
10
10
|
* elements (`data.id` / `data.source` / `data.target`, `position`, `classes`, `data.parent`),
|
|
11
|
-
* graphology
|
|
11
|
+
* graphology serialization (`key` / `attributes`, `undirected` edges, `options.type` / `multi`) and
|
|
12
12
|
* vis.js (`from` / `to`); read only: NetworkX adjacency_data (`nodes` + `adjacency`) and tree_data
|
|
13
13
|
* (nested `id` / `children`).
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { type GraphMeta } from "@graphty/graph-format";
|
|
16
|
+
import { type GraphMeta, type GraphSnapshot } from "@graphty/graph-format";
|
|
17
17
|
|
|
18
18
|
import { capabilities } from "../../common/export.js";
|
|
19
|
+
import { trimTrailingZeros } from "../../common/text.js";
|
|
19
20
|
import { type ExportCapabilities } from "../../types.js";
|
|
20
21
|
|
|
21
|
-
/**
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* The JSON dialects the plugin reads and writes.
|
|
24
|
+
* @category Built-in formats
|
|
25
|
+
*/
|
|
26
|
+
export type JsonDialect = "node-link" | "d3" | "jgf" | "cytoscape" | "graphology" | "vis" | "obographs";
|
|
23
27
|
|
|
24
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Every dialect name, for option checking and messages.
|
|
30
|
+
* @category Built-in formats
|
|
31
|
+
*/
|
|
25
32
|
export const JSON_DIALECTS: readonly JsonDialect[] = Object.freeze([
|
|
26
33
|
"node-link",
|
|
27
34
|
"d3",
|
|
@@ -29,31 +36,38 @@ export const JSON_DIALECTS: readonly JsonDialect[] = Object.freeze([
|
|
|
29
36
|
"cytoscape",
|
|
30
37
|
"graphology",
|
|
31
38
|
"vis",
|
|
39
|
+
"obographs",
|
|
32
40
|
]);
|
|
33
41
|
|
|
34
42
|
/**
|
|
35
|
-
* The dialects the importer reads: every JsonDialect plus
|
|
36
|
-
* adjacency_data (`nodes` plus one
|
|
37
|
-
* nested `id` / `children` record)
|
|
38
|
-
*
|
|
43
|
+
* The dialects the importer reads: every JsonDialect plus two it only reads, NetworkX
|
|
44
|
+
* adjacency_data (`nodes` plus one neighbor list per node under `adjacency`) and tree_data (a
|
|
45
|
+
* nested `id` / `children` record). The exporter writes neither.
|
|
46
|
+
* @category Built-in formats
|
|
39
47
|
*/
|
|
40
|
-
export type JsonImportDialect = JsonDialect | "adjacency" | "tree"
|
|
48
|
+
export type JsonImportDialect = JsonDialect | "adjacency" | "tree";
|
|
41
49
|
|
|
42
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Every dialect the importer reads, for option checking and messages.
|
|
52
|
+
* @category Plugin helpers
|
|
53
|
+
*/
|
|
43
54
|
export const JSON_IMPORT_DIALECTS: readonly JsonImportDialect[] = Object.freeze([
|
|
44
55
|
...JSON_DIALECTS,
|
|
45
56
|
"adjacency",
|
|
46
57
|
"tree",
|
|
47
|
-
"obographs",
|
|
48
58
|
]);
|
|
49
59
|
|
|
50
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* The key under `meta.extra` that holds the shape record (design section 8.5).
|
|
62
|
+
* @category Plugin helpers
|
|
63
|
+
*/
|
|
51
64
|
export const META_KEY = "json";
|
|
52
65
|
|
|
53
66
|
/**
|
|
54
67
|
* The shape information the importer records under `meta.extra.json` so the exporter can write the
|
|
55
|
-
* same file back (
|
|
56
|
-
*
|
|
68
|
+
* same file back; `jsonShapeOf(snapshot)` reads it. Every field is optional because a graph may
|
|
69
|
+
* come from another format.
|
|
70
|
+
* @category Built-in formats
|
|
57
71
|
*/
|
|
58
72
|
export interface JsonShapeMeta {
|
|
59
73
|
/** The dialect the file was read as. */
|
|
@@ -78,10 +92,24 @@ export interface JsonShapeMeta {
|
|
|
78
92
|
readonly cytoscape?: Readonly<Record<string, unknown>> | undefined;
|
|
79
93
|
}
|
|
80
94
|
|
|
95
|
+
/**
|
|
96
|
+
* What a JSON import recorded about the document's shape: the dialect it was read as
|
|
97
|
+
* (`jsonShapeOf(snapshot)?.dialect`), the keys it used, and so on. A JSON export with default
|
|
98
|
+
* options writes the same shape back.
|
|
99
|
+
* @param snapshot - a graph read from a JSON document
|
|
100
|
+
* @returns the shape, or null for a graph that was not read from JSON
|
|
101
|
+
* @category Built-in formats
|
|
102
|
+
*/
|
|
103
|
+
export function jsonShapeOf(snapshot: GraphSnapshot): JsonShapeMeta | null {
|
|
104
|
+
const shape = snapshot.meta.extra[META_KEY];
|
|
105
|
+
return isJsonObject(shape) ? shape : null;
|
|
106
|
+
}
|
|
107
|
+
|
|
81
108
|
/**
|
|
82
109
|
* Whether a value is a plain JSON object (not null, not an array).
|
|
83
110
|
* @param value - any value
|
|
84
111
|
* @returns true for an object that is not an array
|
|
112
|
+
* @category Plugin helpers
|
|
85
113
|
*/
|
|
86
114
|
export function isJsonObject(value: unknown): value is Record<string, unknown> {
|
|
87
115
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -93,6 +121,7 @@ export function isJsonObject(value: unknown): value is Record<string, unknown> {
|
|
|
93
121
|
* @param record - the record
|
|
94
122
|
* @param key - the key
|
|
95
123
|
* @returns true when the key is an own property
|
|
124
|
+
* @category Plugin helpers
|
|
96
125
|
*/
|
|
97
126
|
export function hasKey(record: Readonly<Record<string, unknown>>, key: string): boolean {
|
|
98
127
|
return Object.prototype.hasOwnProperty.call(record, key);
|
|
@@ -102,6 +131,7 @@ export function hasKey(record: Readonly<Record<string, unknown>>, key: string):
|
|
|
102
131
|
* Whether a text names a dialect.
|
|
103
132
|
* @param value - any value
|
|
104
133
|
* @returns true for one of JSON_DIALECTS
|
|
134
|
+
* @category Plugin helpers
|
|
105
135
|
*/
|
|
106
136
|
export function isJsonDialect(value: unknown): value is JsonDialect {
|
|
107
137
|
return typeof value === "string" && (JSON_DIALECTS as readonly string[]).includes(value);
|
|
@@ -111,6 +141,7 @@ export function isJsonDialect(value: unknown): value is JsonDialect {
|
|
|
111
141
|
* Whether a text names a dialect the importer reads.
|
|
112
142
|
* @param value - any value
|
|
113
143
|
* @returns true for one of JSON_IMPORT_DIALECTS
|
|
144
|
+
* @category Plugin helpers
|
|
114
145
|
*/
|
|
115
146
|
export function isJsonImportDialect(value: unknown): value is JsonImportDialect {
|
|
116
147
|
return typeof value === "string" && (JSON_IMPORT_DIALECTS as readonly string[]).includes(value);
|
|
@@ -121,13 +152,15 @@ export function isJsonImportDialect(value: unknown): value is JsonImportDialect
|
|
|
121
152
|
* `elements` or a top-level array of `{ data }` elements; OBO Graphs: `graphs[]` whose first graph
|
|
122
153
|
* has an edge with `sub` (or `subj`) and `obj` or a `pred`, or a node with `lbl`, `meta` or an OWL
|
|
123
154
|
* `type`; JGF: `graph.nodes` / `graph.edges` or any other `graphs[]`; graphology: `options.type` / `options.multi`, `key` nodes without `id`, edges with
|
|
124
|
-
* `undirected` or an `attributes` record
|
|
155
|
+
* `undirected` or an `attributes` record, and vis: edges with `from` / `to`, both only without
|
|
156
|
+
* NetworkX's `links` / `directed` / `multigraph` / `graph` keys; d3: `links` without
|
|
125
157
|
* `directed` / `multigraph` / `graph`; NetworkX adjacency_data: `nodes` and `adjacency` without
|
|
126
158
|
* `links` / `edges`; NetworkX tree_data: `children` without `nodes` / `links` / `edges`; else
|
|
127
159
|
* node-link). Pure: the importer wraps it with its issue
|
|
128
160
|
* codes, the registry's sniff() uses it on a head that parses as a whole document.
|
|
129
161
|
* @param root - the parsed document
|
|
130
162
|
* @returns the dialect, or null when the document is not a graph document in any dialect
|
|
163
|
+
* @category Plugin helpers
|
|
131
164
|
*/
|
|
132
165
|
export function sniffJsonDialect(root: unknown): JsonImportDialect | null {
|
|
133
166
|
if (Array.isArray(root)) {
|
|
@@ -144,7 +177,8 @@ export function sniffJsonDialect(root: unknown): JsonImportDialect | null {
|
|
|
144
177
|
return "jgf";
|
|
145
178
|
}
|
|
146
179
|
if (Array.isArray(root.graphs)) {
|
|
147
|
-
|
|
180
|
+
// any graph decides: an ontology's first graph may be an empty stub before its imports
|
|
181
|
+
return root.graphs.some((g: unknown) => isJsonObject(g) && isOboGraph(g)) ? "obographs" : "jgf";
|
|
148
182
|
}
|
|
149
183
|
if (!hasKey(root, "edges") && !hasKey(root, "links")) {
|
|
150
184
|
if (hasKey(root, "nodes") && hasKey(root, "adjacency")) {
|
|
@@ -159,15 +193,25 @@ export function sniffJsonDialect(root: unknown): JsonImportDialect | null {
|
|
|
159
193
|
if (isJsonObject(root.options) && (hasKey(root.options, "type") || hasKey(root.options, "multi"))) {
|
|
160
194
|
return "graphology";
|
|
161
195
|
}
|
|
162
|
-
|
|
196
|
+
// NetworkX's own keys (links, directed, multigraph, graph) settle node-link: one attribute named
|
|
197
|
+
// like a graphology or vis field (`attributes`, `undirected`, `key`, `from`) must not re-route it
|
|
198
|
+
const networkx =
|
|
199
|
+
hasKey(root, "links") || hasKey(root, "directed") || hasKey(root, "multigraph") || hasKey(root, "graph");
|
|
200
|
+
if (!networkx && firstNode !== null && hasKey(firstNode, "key") && !hasKey(firstNode, "id")) {
|
|
163
201
|
return "graphology";
|
|
164
202
|
}
|
|
165
|
-
if (firstEdge !== null && !hasKey(firstEdge, "from")) {
|
|
203
|
+
if (!networkx && firstEdge !== null && !hasKey(firstEdge, "from")) {
|
|
166
204
|
if (hasKey(firstEdge, "undirected") || isJsonObject(firstEdge.attributes)) {
|
|
167
205
|
return "graphology";
|
|
168
206
|
}
|
|
169
207
|
}
|
|
170
|
-
if (
|
|
208
|
+
if (
|
|
209
|
+
!networkx &&
|
|
210
|
+
firstEdge !== null &&
|
|
211
|
+
hasKey(firstEdge, "from") &&
|
|
212
|
+
hasKey(firstEdge, "to") &&
|
|
213
|
+
!hasKey(firstEdge, "source")
|
|
214
|
+
) {
|
|
171
215
|
return "vis";
|
|
172
216
|
}
|
|
173
217
|
const bare = !hasKey(root, "directed") && !hasKey(root, "multigraph") && !hasKey(root, "graph");
|
|
@@ -217,6 +261,7 @@ function firstJsonObject(value: unknown): Record<string, unknown> | null {
|
|
|
217
261
|
* from the JSON importer.
|
|
218
262
|
* @param meta - the snapshot's metadata
|
|
219
263
|
* @returns the fields found under `meta.extra.json`, each only when it has the expected type
|
|
264
|
+
* @category Plugin helpers
|
|
220
265
|
*/
|
|
221
266
|
export function shapeMetaOf(meta: GraphMeta): JsonShapeMeta {
|
|
222
267
|
const raw: unknown = meta.extra[META_KEY];
|
|
@@ -240,7 +285,10 @@ export function shapeMetaOf(meta: GraphMeta): JsonShapeMeta {
|
|
|
240
285
|
};
|
|
241
286
|
}
|
|
242
287
|
|
|
243
|
-
/**
|
|
288
|
+
/**
|
|
289
|
+
* The direction a dialect assumes when the file declares none (design section 8.4, `defaultDirected`).
|
|
290
|
+
* @category Plugin helpers
|
|
291
|
+
*/
|
|
244
292
|
export const DIALECT_DEFAULT_DIRECTED: Readonly<Record<JsonImportDialect, boolean>> = Object.freeze({
|
|
245
293
|
"node-link": false,
|
|
246
294
|
d3: false,
|
|
@@ -322,10 +370,19 @@ const TABLES: Readonly<Record<JsonDialect, ExportCapabilities>> = Object.freeze(
|
|
|
322
370
|
hierarchy: false,
|
|
323
371
|
graphAttributes: false,
|
|
324
372
|
}),
|
|
373
|
+
// the OBO flat file's table: no column of the snapshot's own reads back as a column (the
|
|
374
|
+
// vocabulary columns have their places; every other one becomes property values or edge meta)
|
|
375
|
+
obographs: capabilities({
|
|
376
|
+
mixedDirection: false,
|
|
377
|
+
multiEdges: true,
|
|
378
|
+
selfLoops: true,
|
|
379
|
+
edgeIds: "none",
|
|
380
|
+
idCharset: "any",
|
|
381
|
+
}),
|
|
325
382
|
});
|
|
326
383
|
|
|
327
384
|
/**
|
|
328
|
-
* What one dialect can express
|
|
385
|
+
* What one dialect can express: positions and visual columns are written as
|
|
329
386
|
* plain attributes (an array for a multi-component column) and read back without their role,
|
|
330
387
|
* except Cytoscape's `position` object; containment only as the Cytoscape `data.parent`; mixed
|
|
331
388
|
* direction only where the dialect carries a per-edge flag (JGF `directed`, graphology
|
|
@@ -333,12 +390,16 @@ const TABLES: Readonly<Record<JsonDialect, ExportCapabilities>> = Object.freeze(
|
|
|
333
390
|
* graph attributes everywhere but d3 (the bare shape) and vis.
|
|
334
391
|
* @param dialect - the dialect
|
|
335
392
|
* @returns its frozen capability table
|
|
393
|
+
* @category Built-in formats
|
|
336
394
|
*/
|
|
337
395
|
export function dialectCapabilities(dialect: JsonDialect): ExportCapabilities {
|
|
338
396
|
return TABLES[dialect];
|
|
339
397
|
}
|
|
340
398
|
|
|
341
|
-
/**
|
|
399
|
+
/**
|
|
400
|
+
* The Cytoscape element-level keys (everything else on an element lives under `data`).
|
|
401
|
+
* @category Plugin helpers
|
|
402
|
+
*/
|
|
342
403
|
export const CYTOSCAPE_ELEMENT_KEYS: ReadonlySet<string> = new Set([
|
|
343
404
|
"selected",
|
|
344
405
|
"selectable",
|
|
@@ -350,13 +411,17 @@ export const CYTOSCAPE_ELEMENT_KEYS: ReadonlySet<string> = new Set([
|
|
|
350
411
|
"renderedPosition",
|
|
351
412
|
]);
|
|
352
413
|
|
|
353
|
-
/**
|
|
414
|
+
/**
|
|
415
|
+
* The Cytoscape element keys the importer maps structurally rather than to columns.
|
|
416
|
+
* @category Plugin helpers
|
|
417
|
+
*/
|
|
354
418
|
export const CYTOSCAPE_STRUCTURAL_KEYS: ReadonlySet<string> = new Set(["data", "group", "position", "classes"]);
|
|
355
419
|
|
|
356
420
|
/**
|
|
357
421
|
* The suffix the importer appends to a column name that collides with a structural column or a
|
|
358
422
|
* reserved key of its dialect (design section 5.6 names collisions deterministically); the exporter
|
|
359
423
|
* strips it when the value goes back to the level the suffix names.
|
|
424
|
+
* @category Plugin helpers
|
|
360
425
|
*/
|
|
361
426
|
export const SUFFIX = Object.freeze({
|
|
362
427
|
/** A Cytoscape `data` key or a JGF / graphology attribute that collides with a structural column. */
|
|
@@ -365,17 +430,51 @@ export const SUFFIX = Object.freeze({
|
|
|
365
430
|
element: "#element",
|
|
366
431
|
});
|
|
367
432
|
|
|
368
|
-
/**
|
|
433
|
+
/**
|
|
434
|
+
* The default source keys of a node-link edge record, tried in order (as fromRecords does).
|
|
435
|
+
* @category Plugin helpers
|
|
436
|
+
*/
|
|
369
437
|
export const NODE_LINK_SOURCE_KEYS: readonly string[] = Object.freeze(["source", "src", "from"]);
|
|
370
438
|
|
|
371
|
-
/**
|
|
439
|
+
/**
|
|
440
|
+
* The default target keys of a node-link edge record, tried in order.
|
|
441
|
+
* @category Plugin helpers
|
|
442
|
+
*/
|
|
372
443
|
export const NODE_LINK_TARGET_KEYS: readonly string[] = Object.freeze(["target", "dst", "to"]);
|
|
373
444
|
|
|
374
|
-
/**
|
|
445
|
+
/**
|
|
446
|
+
* The name of the position column every JSON dialect writes / reads (design section 5.2).
|
|
447
|
+
* @category Plugin helpers
|
|
448
|
+
*/
|
|
375
449
|
export const POSITION_COLUMN = "position";
|
|
376
450
|
|
|
377
|
-
/**
|
|
451
|
+
/**
|
|
452
|
+
* The name of the Cytoscape classes column (a list of strings with role "classes").
|
|
453
|
+
* @category Plugin helpers
|
|
454
|
+
*/
|
|
378
455
|
export const CLASSES_COLUMN = "classes";
|
|
379
456
|
|
|
380
|
-
/**
|
|
457
|
+
/**
|
|
458
|
+
* The name of the Cytoscape parent column (u32 refersTo node, role "parent").
|
|
459
|
+
* @category Plugin helpers
|
|
460
|
+
*/
|
|
381
461
|
export const PARENT_COLUMN = "parent";
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* An integer text beyond 2^53 in exponent form (`100000000000000000000` -> `1e+20`, the same
|
|
465
|
+
* digits): the importer reads an integer literal that large as its exact digits (a string), so
|
|
466
|
+
* a number must not be written as one.
|
|
467
|
+
* @param text - the shortest decimal text of a finite number
|
|
468
|
+
* @returns the text, or its exponent form for an integer literal of 16 or more digits
|
|
469
|
+
* @category Plugin helpers
|
|
470
|
+
*/
|
|
471
|
+
export function exponentIfUnsafe(text: string): string {
|
|
472
|
+
const match = /^(-?)(\d{16,})$/.exec(text);
|
|
473
|
+
if (match === null || Number.isSafeInteger(Number(text))) {
|
|
474
|
+
return text;
|
|
475
|
+
}
|
|
476
|
+
const [, sign, digits] = match;
|
|
477
|
+
const mantissa = trimTrailingZeros(digits);
|
|
478
|
+
const fraction = mantissa.length > 1 ? `.${mantissa.slice(1)}` : "";
|
|
479
|
+
return `${sign}${mantissa[0]}${fraction}e+${digits.length - 1}`;
|
|
480
|
+
}
|