@graphty/graph-io 0.3.25 → 0.3.26
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-BbJI55dx.js +56 -0
- package/dist/chunks/choose-BbJI55dx.js.map +1 -0
- package/dist/chunks/constants-BCsFsMj4.js +231 -0
- package/dist/chunks/constants-BCsFsMj4.js.map +1 -0
- package/dist/chunks/{escape-B-tkk_Cl.js → escape-D0g6NNUy.js} +382 -92
- package/dist/chunks/escape-D0g6NNUy.js.map +1 -0
- package/dist/chunks/export-BTI4yQgy.js +4333 -0
- package/dist/chunks/export-BTI4yQgy.js.map +1 -0
- package/dist/chunks/exporter-BMqk5oxW.js +3465 -0
- package/dist/chunks/exporter-BMqk5oxW.js.map +1 -0
- package/dist/chunks/{importer-eUREhBGj.js → exporter-Cra2GYcN.js} +4969 -3201
- package/dist/chunks/exporter-Cra2GYcN.js.map +1 -0
- package/dist/chunks/{exporter-BGrsWamJ.js → exporter-Dxh231ZF.js} +38 -229
- package/dist/chunks/exporter-Dxh231ZF.js.map +1 -0
- package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-tne475KK.js} +22 -20
- package/dist/chunks/exporter-tne475KK.js.map +1 -0
- package/dist/chunks/importer-90YWhJoF.js +2811 -0
- package/dist/chunks/importer-90YWhJoF.js.map +1 -0
- package/dist/chunks/{importer-D_e7e7LX.js → importer-Bcl1d4xH.js} +398 -145
- package/dist/chunks/importer-Bcl1d4xH.js.map +1 -0
- package/dist/chunks/{importer-BWY2FFc5.js → importer-BfIsp1f9.js} +255 -77
- package/dist/chunks/importer-BfIsp1f9.js.map +1 -0
- package/dist/chunks/{importer-zGLo8Dg_.js → importer-C_TEA1zJ.js} +484 -157
- package/dist/chunks/importer-C_TEA1zJ.js.map +1 -0
- package/dist/chunks/{importer-DET1tg6s.js → importer-DCjOvO7U.js} +1687 -310
- package/dist/chunks/importer-DCjOvO7U.js.map +1 -0
- package/dist/chunks/{importer-vi3bSdtw.js → importer-DfVu6j59.js} +509 -76
- package/dist/chunks/importer-DfVu6j59.js.map +1 -0
- package/dist/chunks/{importer-DIrbbnAf.js → importer-Dku_VAIY.js} +585 -226
- package/dist/chunks/importer-Dku_VAIY.js.map +1 -0
- package/dist/chunks/json-elements-3tnyt5uZ.js +1225 -0
- package/dist/chunks/json-elements-3tnyt5uZ.js.map +1 -0
- package/dist/chunks/ontology-export-B9Tcf37D.js +357 -0
- package/dist/chunks/ontology-export-B9Tcf37D.js.map +1 -0
- package/dist/chunks/{records-dbRkxwaq.js → records-CQXT__mY.js} +298 -114
- package/dist/chunks/records-CQXT__mY.js.map +1 -0
- package/dist/chunks/{text-Dr0Ifpag.js → text-DmcUs5_Q.js} +29 -11
- package/dist/chunks/text-DmcUs5_Q.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 +951 -261
- 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 +342 -85
- 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 +564 -157
- 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 +19 -1
- 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 +33 -17
- 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 +868 -188
- 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 +2 -0
- 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 +400 -83
- 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 +145 -32
- 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 +680 -285
- 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 +226 -79
- 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 +98 -24
- 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 +108 -26
- 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 +238 -85
- 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 +66 -34
- 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 +183 -51
- 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 +20 -21
- 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 +7 -2
- 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 +38 -4
- package/src/common/direction.ts +78 -51
- package/src/common/escape.ts +33 -17
- 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 +1034 -198
- package/src/common/line-format.ts +249 -0
- package/src/common/lists.ts +6 -1
- 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 +477 -88
- package/src/common/zip.ts +169 -7
- package/src/formats/csv/exporter.ts +201 -46
- 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 +888 -300
- package/src/formats/cx/index.ts +4 -3
- package/src/formats/cx2/exporter.ts +61 -338
- package/src/formats/cx2/importer.ts +317 -86
- 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 +139 -31
- 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 +111 -26
- 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 +320 -101
- 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 +89 -41
- package/src/formats/pajek/importer.ts +407 -93
- package/src/formats/pajek/index.ts +2 -1
- package/src/formats/pajek/syntax.ts +213 -52
- 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 +35 -27
- package/src/formats/xgmml/importer.ts +64 -86
- package/src/formats/xgmml/index.ts +1 -0
- package/src/formats/xgmml/values.ts +11 -3
- 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
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* every node block first, then every edge block, so node indices follow the file's node order
|
|
9
9
|
* and forward edge references resolve.
|
|
10
10
|
*
|
|
11
|
-
* Conventions
|
|
11
|
+
* Conventions honored: NetworkX's `_networkx_list_start` marker and `"[]"` empty lists, `&#NN;`
|
|
12
12
|
* character references in strings, `Creator` / `Version` top-level metadata, `directed 0|1` and
|
|
13
13
|
* `multigraph 0|1` graph flags, comments, keys and values on one line or split across lines, and
|
|
14
14
|
* a `graphics [ x y z ]` node record mapped to the `position` role (note 07 section 9) with the
|
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
} from "@graphty/graph-format";
|
|
36
36
|
|
|
37
37
|
import { declareResolved, DictHeuristic, uniqueColumnName } from "../../common/attributes.js";
|
|
38
|
+
import { importChosenGraph } from "../../common/choose.js";
|
|
38
39
|
import {
|
|
39
40
|
COLUMN_RENAMED_CODE,
|
|
40
41
|
DUPLICATE_NODE_CODE as SHARED_DUPLICATE_NODE_CODE,
|
|
@@ -44,20 +45,29 @@ import {
|
|
|
44
45
|
NO_GRAPH_CODE as SHARED_NO_GRAPH_CODE,
|
|
45
46
|
PRECISION_CODE as SHARED_PRECISION_CODE,
|
|
46
47
|
ROLE_TAKEN_CODE as SHARED_ROLE_TAKEN_CODE,
|
|
48
|
+
WIDENED_CODE as SHARED_WIDENED_CODE,
|
|
47
49
|
} from "../../common/codes.js";
|
|
48
50
|
import { DirectionResolver } from "../../common/direction.js";
|
|
49
51
|
import { IdCoercer } from "../../common/ids.js";
|
|
50
52
|
import { readText, throwIfAborted } from "../../common/input.js";
|
|
51
53
|
import {
|
|
54
|
+
graphChosen,
|
|
52
55
|
type ImportFormatDefaults,
|
|
53
56
|
reportSinkOptions,
|
|
54
57
|
reportUnusedOptions,
|
|
55
58
|
type ResolvedImportOptions,
|
|
56
59
|
resolveImportOptions,
|
|
57
60
|
} from "../../common/options.js";
|
|
61
|
+
import { plural } from "../../common/plural.js";
|
|
58
62
|
import { ImportReportBuilder } from "../../common/report.js";
|
|
59
|
-
import { parseWeightText, weightFromValue } from "../../common/weights.js";
|
|
60
|
-
import {
|
|
63
|
+
import { parseWeightText, reportWeightPrecision, weightFromValue } from "../../common/weights.js";
|
|
64
|
+
import {
|
|
65
|
+
type CommonImportOptions,
|
|
66
|
+
type GraphChoiceOptions,
|
|
67
|
+
type GraphImporter,
|
|
68
|
+
type ImportInput,
|
|
69
|
+
type ImportReport,
|
|
70
|
+
} from "../../types.js";
|
|
61
71
|
import {
|
|
62
72
|
EMPTY_LIST_TEXT,
|
|
63
73
|
EMPTY_TUPLE_TEXT,
|
|
@@ -76,53 +86,141 @@ import {
|
|
|
76
86
|
tokenizeGml,
|
|
77
87
|
} from "./syntax.js";
|
|
78
88
|
|
|
79
|
-
/**
|
|
80
|
-
|
|
89
|
+
/**
|
|
90
|
+
* The format-specific options of the GML importer.
|
|
91
|
+
* @category Built-in formats
|
|
92
|
+
*/
|
|
93
|
+
export interface GmlImportOptions extends GraphChoiceOptions, CommonImportOptions {
|
|
81
94
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
95
|
+
* Read a node's `graphics [ x y z ]` record as its position; false keeps the whole record as a
|
|
96
|
+
* JSON attribute named `graphics`.
|
|
97
|
+
* @defaultValue true
|
|
84
98
|
*/
|
|
85
99
|
positions?: boolean | undefined;
|
|
86
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Store a text attribute whose values repeat a lot (fewer distinct values than half the rows)
|
|
102
|
+
* as a dictionary column, which uses less memory and reads the same. Such a column reports
|
|
103
|
+
* `meta.dtype` "dict" instead of "string". A column with a role, such as the `label` column,
|
|
104
|
+
* always stays "string".
|
|
105
|
+
* @defaultValue true
|
|
106
|
+
*/
|
|
87
107
|
dictionaries?: boolean | undefined;
|
|
88
108
|
}
|
|
89
109
|
|
|
90
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* The text holds no `graph [ ... ]` block.
|
|
112
|
+
* @category Issue and loss codes
|
|
113
|
+
*/
|
|
91
114
|
export const NO_GRAPH_CODE = SHARED_NO_GRAPH_CODE;
|
|
92
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* The text holds more than one `graph [ ... ]` block; import() reads the first, importAll() every one.
|
|
117
|
+
* @category Issue and loss codes
|
|
118
|
+
*/
|
|
93
119
|
export const SECOND_GRAPH_CODE = MULTIPLE_GRAPHS_CODE;
|
|
94
|
-
/**
|
|
120
|
+
/**
|
|
121
|
+
* A node block has no `id` key.
|
|
122
|
+
* @category Issue and loss codes
|
|
123
|
+
*/
|
|
95
124
|
export const MISSING_ID_CODE = SHARED_MISSING_ID_CODE;
|
|
96
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* A node block has no `label` key under `nodeIdFrom: "label"`.
|
|
127
|
+
* @category Issue and loss codes
|
|
128
|
+
*/
|
|
97
129
|
export const MISSING_LABEL_CODE = "E_GML_MISSING_LABEL";
|
|
98
|
-
/**
|
|
130
|
+
/**
|
|
131
|
+
* An edge block has no `source` or no `target` key.
|
|
132
|
+
* @category Issue and loss codes
|
|
133
|
+
*/
|
|
99
134
|
export const MISSING_ENDPOINT_CODE = SHARED_MISSING_ENDPOINT_CODE;
|
|
100
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* An `id`, `source` or `target` value is neither an integer nor a string.
|
|
137
|
+
* @category Issue and loss codes
|
|
138
|
+
*/
|
|
101
139
|
export const ID_TYPE_CODE = "E_GML_ID_TYPE";
|
|
102
|
-
/**
|
|
140
|
+
/**
|
|
141
|
+
* Node ids, sources or targets are text, where GML expects integers. They are read under the `ids` option. Reported
|
|
142
|
+
* once per file.
|
|
143
|
+
* @category Issue and loss codes
|
|
144
|
+
*/
|
|
103
145
|
export const STRING_ID_CODE = "W_GML_STRING_ID";
|
|
104
|
-
/**
|
|
146
|
+
/**
|
|
147
|
+
* A node id (or label under `nodeIdFrom: "label"`) is declared twice; later keys overwrite.
|
|
148
|
+
* @category Issue and loss codes
|
|
149
|
+
*/
|
|
105
150
|
export const DUPLICATE_NODE_CODE = SHARED_DUPLICATE_NODE_CODE;
|
|
106
|
-
/**
|
|
151
|
+
/**
|
|
152
|
+
* A structural key (`id`, `source`, `target`) appears twice in one block.
|
|
153
|
+
* @category Issue and loss codes
|
|
154
|
+
*/
|
|
107
155
|
export const REPEATED_KEY_CODE = "E_GML_REPEATED_KEY";
|
|
108
|
-
/**
|
|
156
|
+
/**
|
|
157
|
+
* A `node` or `edge` key whose value is not a `[ ... ]` block.
|
|
158
|
+
* @category Issue and loss codes
|
|
159
|
+
*/
|
|
109
160
|
export const ELEMENT_TYPE_CODE = "E_GML_ELEMENT_TYPE";
|
|
110
|
-
/**
|
|
161
|
+
/**
|
|
162
|
+
* A `directed` or `multigraph` flag that is not an integer.
|
|
163
|
+
* @category Issue and loss codes
|
|
164
|
+
*/
|
|
111
165
|
export const FLAG_TYPE_CODE = "E_GML_FLAG_TYPE";
|
|
112
|
-
/**
|
|
166
|
+
/**
|
|
167
|
+
* A `directed` / `multigraph` flag that is not 0 or 1 (read as its truth value), one written as a quoted integer, or
|
|
168
|
+
* one repeated.
|
|
169
|
+
* @category Issue and loss codes
|
|
170
|
+
*/
|
|
113
171
|
export const FLAG_VALUE_CODE = "W_GML_FLAG_VALUE";
|
|
114
172
|
|
|
115
173
|
/** A flag written as a quoted integer, surrounding spaces allowed. */
|
|
116
174
|
const QUOTED_INT = /^\s*[+-]?[0-9]+\s*$/;
|
|
117
|
-
/**
|
|
175
|
+
/**
|
|
176
|
+
* A named entity in a string that is neither an XML nor an ISO-8859-1 HTML entity, or a numeric reference beyond
|
|
177
|
+
* U+10FFFF; it is kept as written.
|
|
178
|
+
* @category Issue and loss codes
|
|
179
|
+
*/
|
|
118
180
|
export const UNKNOWN_ENTITY_CODE = "W_GML_UNKNOWN_ENTITY";
|
|
119
|
-
/**
|
|
181
|
+
/**
|
|
182
|
+
* A node's `graphics` value cannot give a position as written (not a record, repeated in the node, or with an x / y /
|
|
183
|
+
* z that is not one number); the value is kept in the graphics json column. Warned once per kind of problem, naming
|
|
184
|
+
* the first node.
|
|
185
|
+
* @category Issue and loss codes
|
|
186
|
+
*/
|
|
187
|
+
export const GRAPHICS_CODE = "W_GML_GRAPHICS";
|
|
188
|
+
/**
|
|
189
|
+
* A `graph`, `node` or `edge` record inside a node or edge; kept as a json column, not read as structure.
|
|
190
|
+
* @category Issue and loss codes
|
|
191
|
+
*/
|
|
192
|
+
export const NESTED_ELEMENT_CODE = "W_GML_NESTED_ELEMENT";
|
|
193
|
+
/**
|
|
194
|
+
* YEd's group keys (`isGroup`, `gid`); kept as plain node columns, the hierarchy is not read as containment.
|
|
195
|
+
* @category Issue and loss codes
|
|
196
|
+
*/
|
|
197
|
+
export const GROUPS_CODE = "W_GML_GROUPS";
|
|
198
|
+
/**
|
|
199
|
+
* A key whose values mix numbers and strings; the column is string, the numbers kept as written.
|
|
200
|
+
* @category Issue and loss codes
|
|
201
|
+
*/
|
|
202
|
+
export const WIDENED_CODE = SHARED_WIDENED_CODE;
|
|
203
|
+
/**
|
|
204
|
+
* An integer above 2^53 was stored as the nearest JavaScript number, so its last digits may differ. Pass `long:
|
|
205
|
+
* "string"` to keep every digit as text.
|
|
206
|
+
* @category Issue and loss codes
|
|
207
|
+
*/
|
|
120
208
|
export const PRECISION_CODE = SHARED_PRECISION_CODE;
|
|
121
|
-
/**
|
|
209
|
+
/**
|
|
210
|
+
* Two attributes would have had the same name, so this one was renamed `<name>#<key>`.
|
|
211
|
+
* @category Plugin helpers
|
|
212
|
+
*/
|
|
122
213
|
export const COLUMN_RENAMED_CODE_GML = COLUMN_RENAMED_CODE;
|
|
123
|
-
/**
|
|
214
|
+
/**
|
|
215
|
+
* You read into a graph builder that already has an attribute with this role, so this file's attribute is kept without
|
|
216
|
+
* the role.
|
|
217
|
+
* @category Issue and loss codes
|
|
218
|
+
*/
|
|
124
219
|
export const ROLE_TAKEN_CODE = SHARED_ROLE_TAKEN_CODE;
|
|
125
|
-
/**
|
|
220
|
+
/**
|
|
221
|
+
* Under `nodeIdFrom` "label" / "index" the integer `id` keys are not kept.
|
|
222
|
+
* @category Issue and loss codes
|
|
223
|
+
*/
|
|
126
224
|
export const ID_DROPPED_CODE = "W_GML_ID_DROPPED";
|
|
127
225
|
|
|
128
226
|
const FORMAT_DEFAULTS: ImportFormatDefaults = { ids: "canonical", defaultDirected: false, weightFrom: "value" };
|
|
@@ -150,6 +248,7 @@ const USED_OPTIONS: ReadonlySet<keyof CommonImportOptions> = new Set<keyof Commo
|
|
|
150
248
|
"weightFrom",
|
|
151
249
|
"weightDtype",
|
|
152
250
|
"restoreMangledIds",
|
|
251
|
+
"long",
|
|
153
252
|
"errorLimit",
|
|
154
253
|
"signal",
|
|
155
254
|
"onProgress",
|
|
@@ -220,6 +319,34 @@ interface ColumnPlan {
|
|
|
220
319
|
/** A table's plans by key. */
|
|
221
320
|
type PlanMap = Map<string, ColumnPlan>;
|
|
222
321
|
|
|
322
|
+
/** Where a node issue is recorded. */
|
|
323
|
+
interface IssueWhere {
|
|
324
|
+
readonly line: number;
|
|
325
|
+
readonly element: string;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** The table a GML key belongs to. */
|
|
329
|
+
type GmlDomain = "node" | "edge" | "graph";
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Whether a key is the label of a node or edge (text, never a NetworkX list marker).
|
|
333
|
+
* @param domain - the table
|
|
334
|
+
* @param key - the key
|
|
335
|
+
* @returns true for a node or edge label
|
|
336
|
+
*/
|
|
337
|
+
function isLabel(domain: GmlDomain, key: string): boolean {
|
|
338
|
+
return roleOf(domain, key) === "label";
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Whether a parsed value is a GML record.
|
|
343
|
+
* @param value - the value
|
|
344
|
+
* @returns true for a record object
|
|
345
|
+
*/
|
|
346
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
347
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
348
|
+
}
|
|
349
|
+
|
|
223
350
|
/**
|
|
224
351
|
* Whether a key gets a role in its table (design section 5.6 applied to GML keys).
|
|
225
352
|
* @param domain - the table
|
|
@@ -309,6 +436,9 @@ class GmlImport {
|
|
|
309
436
|
/** The sink id every file id maps to when they differ (label / index / restored ids), else null. */
|
|
310
437
|
private idMap: Map<NodeId, NodeId> | null = null;
|
|
311
438
|
|
|
439
|
+
/** The file ids of node blocks that were skipped: an edge naming one is skipped too, never given a new node. */
|
|
440
|
+
private readonly skippedIds = new Set<NodeId>();
|
|
441
|
+
|
|
312
442
|
/** Node indices declared by a node block of this import, for duplicate detection. */
|
|
313
443
|
private declared = new Uint32Array(64);
|
|
314
444
|
|
|
@@ -354,7 +484,7 @@ class GmlImport {
|
|
|
354
484
|
this.report.warnOnce(
|
|
355
485
|
"parse-error",
|
|
356
486
|
UNKNOWN_ENTITY_CODE,
|
|
357
|
-
`
|
|
487
|
+
`character entity ${entity} cannot be decoded; it is kept as written`,
|
|
358
488
|
{ line, element: entity },
|
|
359
489
|
`${UNKNOWN_ENTITY_CODE}:${entity}`,
|
|
360
490
|
);
|
|
@@ -371,10 +501,14 @@ class GmlImport {
|
|
|
371
501
|
*/
|
|
372
502
|
private scan(): void {
|
|
373
503
|
const t = this.requireTokens();
|
|
504
|
+
let scalarGraph = -1;
|
|
374
505
|
for (let p = 0; p < t.count; p = t.nextPair(p)) {
|
|
375
506
|
const key = t.textOf(p);
|
|
376
507
|
const v = p + 1;
|
|
377
508
|
const record = t.kind[v] === TOKEN_OPEN;
|
|
509
|
+
if (key === "graph" && !record && scalarGraph < 0) {
|
|
510
|
+
scalarGraph = v;
|
|
511
|
+
}
|
|
378
512
|
if (key === "graph" && record) {
|
|
379
513
|
if (this.graphCount++ === this.which) {
|
|
380
514
|
this.graphOpen = v;
|
|
@@ -389,6 +523,13 @@ class GmlImport {
|
|
|
389
523
|
}
|
|
390
524
|
}
|
|
391
525
|
if (this.graphOpen < 0) {
|
|
526
|
+
if (scalarGraph >= 0) {
|
|
527
|
+
this.report.fail(
|
|
528
|
+
NO_GRAPH_CODE,
|
|
529
|
+
`the graph key at line ${t.line[scalarGraph]} holds ${describeValue(t, scalarGraph)}, not a [ ... ] block; the input contains no graph block`,
|
|
530
|
+
{ line: t.line[scalarGraph] },
|
|
531
|
+
);
|
|
532
|
+
}
|
|
392
533
|
this.report.fail(NO_GRAPH_CODE, "the input contains no graph [ ... ] block", { line: null });
|
|
393
534
|
}
|
|
394
535
|
}
|
|
@@ -483,7 +624,9 @@ class GmlImport {
|
|
|
483
624
|
seq: number,
|
|
484
625
|
): void {
|
|
485
626
|
const t = this.requireTokens();
|
|
627
|
+
this.noteStructure(domain, key, v);
|
|
486
628
|
let entry = schema.get(key);
|
|
629
|
+
const graphics = domain === "node" && key === "graphics" && this.positions;
|
|
487
630
|
if (entry === undefined) {
|
|
488
631
|
entry = {
|
|
489
632
|
key,
|
|
@@ -499,13 +642,22 @@ class GmlImport {
|
|
|
499
642
|
schema.set(key, entry);
|
|
500
643
|
} else if (entry.lastSeq === seq) {
|
|
501
644
|
entry.list = true;
|
|
645
|
+
// a repeated graphics record: the extra records go to the json column
|
|
646
|
+
entry.rest ||= graphics;
|
|
502
647
|
} else {
|
|
503
648
|
entry.lastSeq = seq;
|
|
504
649
|
}
|
|
650
|
+
if (graphics && t.kind[v] !== TOKEN_OPEN) {
|
|
651
|
+
entry.rest = true;
|
|
652
|
+
}
|
|
505
653
|
switch (t.kind[v]) {
|
|
506
654
|
case TOKEN_STRING: {
|
|
507
655
|
const raw = t.textOf(v);
|
|
508
|
-
|
|
656
|
+
// a label is text: "[]" there is a label, never NetworkX's empty list
|
|
657
|
+
if (
|
|
658
|
+
raw === LIST_START_MARKER ||
|
|
659
|
+
(!isLabel(domain, key) && (raw === EMPTY_LIST_TEXT || raw === EMPTY_TUPLE_TEXT))
|
|
660
|
+
) {
|
|
509
661
|
entry.list = true;
|
|
510
662
|
return;
|
|
511
663
|
}
|
|
@@ -532,8 +684,49 @@ class GmlImport {
|
|
|
532
684
|
this.inspectGraphics(entry, v);
|
|
533
685
|
}
|
|
534
686
|
return;
|
|
535
|
-
default:
|
|
687
|
+
default: {
|
|
536
688
|
entry.kinds |= KIND_REAL;
|
|
689
|
+
const text = t.textOf(v);
|
|
690
|
+
if (/\d/.test(text) && !Number.isFinite(Number(text))) {
|
|
691
|
+
this.report.warnOnce(
|
|
692
|
+
"precision",
|
|
693
|
+
PRECISION_CODE,
|
|
694
|
+
`${domain} key "${key}" holds the real ${text}, beyond the f64 range; it is stored as ${numberOfText(text) > 0 ? "" : "-"}Infinity`,
|
|
695
|
+
{ line: t.line[v], element: key },
|
|
696
|
+
`${PRECISION_CODE}:overflow:${domain}:${key}`,
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* Warn about keys of a node or edge whose meaning GML readers give but this import does not:
|
|
705
|
+
* a nested graph / node / edge record, and yEd's group hierarchy.
|
|
706
|
+
* @param domain - the table
|
|
707
|
+
* @param key - the key
|
|
708
|
+
* @param v - the value token
|
|
709
|
+
*/
|
|
710
|
+
private noteStructure(domain: "node" | "edge" | "graph", key: string, v: number): void {
|
|
711
|
+
const t = this.requireTokens();
|
|
712
|
+
if (domain === "graph") {
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
if ((key === "graph" || key === "node" || key === "edge") && t.kind[v] === TOKEN_OPEN) {
|
|
716
|
+
this.report.warnOnce(
|
|
717
|
+
"unsupported",
|
|
718
|
+
NESTED_ELEMENT_CODE,
|
|
719
|
+
`a nested ${key} record inside a ${domain} is kept as the json column "${key}"; it is not read as structure`,
|
|
720
|
+
{ line: t.line[v], element: key },
|
|
721
|
+
`${NESTED_ELEMENT_CODE}:${domain}:${key}`,
|
|
722
|
+
);
|
|
723
|
+
} else if (domain === "node" && (key === "isGroup" || key === "gid")) {
|
|
724
|
+
this.report.warnOnce(
|
|
725
|
+
"unsupported",
|
|
726
|
+
GROUPS_CODE,
|
|
727
|
+
"yEd group keys (isGroup, gid) are kept as plain node columns; the group hierarchy is not read as containment",
|
|
728
|
+
{ line: t.line[v], element: key },
|
|
729
|
+
);
|
|
537
730
|
}
|
|
538
731
|
}
|
|
539
732
|
|
|
@@ -620,7 +813,9 @@ class GmlImport {
|
|
|
620
813
|
* @returns the plan
|
|
621
814
|
*/
|
|
622
815
|
private planOf(domain: "node" | "edge" | "graph", entry: KeySchema, top = false): ColumnPlan {
|
|
623
|
-
|
|
816
|
+
// long: "string" keeps every digit of an integer key that holds values beyond 2^53, as text
|
|
817
|
+
const asText = entry.unsafe && this.options.long === "string" && kindOf(entry) === "int";
|
|
818
|
+
const kind = asText ? "string" : kindOf(entry);
|
|
624
819
|
let scalar: ScalarDtype = dtypeOfKind(kind, entry);
|
|
625
820
|
if (
|
|
626
821
|
scalar === "string" &&
|
|
@@ -631,11 +826,24 @@ class GmlImport {
|
|
|
631
826
|
) {
|
|
632
827
|
scalar = "dict";
|
|
633
828
|
}
|
|
634
|
-
if (
|
|
829
|
+
if (
|
|
830
|
+
(entry.kinds & KIND_STRING) !== 0 &&
|
|
831
|
+
(entry.kinds & (KIND_INT | KIND_REAL)) !== 0 &&
|
|
832
|
+
(entry.kinds & KIND_RECORD) === 0
|
|
833
|
+
) {
|
|
834
|
+
this.report.warnOnce(
|
|
835
|
+
"coercion",
|
|
836
|
+
WIDENED_CODE,
|
|
837
|
+
`${domain} key "${entry.key}" mixes numbers and strings; the column is string and the numbers are kept as written`,
|
|
838
|
+
{ element: entry.key },
|
|
839
|
+
`${WIDENED_CODE}:${domain}:${entry.key}`,
|
|
840
|
+
);
|
|
841
|
+
}
|
|
842
|
+
if (entry.unsafe && !asText) {
|
|
635
843
|
this.report.warnOnce(
|
|
636
844
|
"precision",
|
|
637
845
|
PRECISION_CODE,
|
|
638
|
-
`${domain} key "${entry.key}" holds integers beyond 2^53; they are stored as the nearest f64`,
|
|
846
|
+
`${domain} key "${entry.key}" holds integers beyond 2^53; they are stored as the nearest f64 (pass long: "string" to keep every digit as text)`,
|
|
639
847
|
{ element: entry.key },
|
|
640
848
|
`${PRECISION_CODE}:${domain}:${entry.key}`,
|
|
641
849
|
);
|
|
@@ -661,13 +869,7 @@ class GmlImport {
|
|
|
661
869
|
items: null,
|
|
662
870
|
seq: Number.NEGATIVE_INFINITY,
|
|
663
871
|
};
|
|
664
|
-
if (
|
|
665
|
-
domain === "node" &&
|
|
666
|
-
entry.key === "graphics" &&
|
|
667
|
-
entry.position &&
|
|
668
|
-
entry.kinds === KIND_RECORD &&
|
|
669
|
-
!entry.list
|
|
670
|
-
) {
|
|
872
|
+
if (domain === "node" && entry.key === "graphics" && this.positions && (entry.kinds & KIND_RECORD) !== 0) {
|
|
671
873
|
const taken = (candidate: string): boolean =>
|
|
672
874
|
this.nodeSchema.has(candidate) || this.sink.nodeColumn(candidate) !== INVALID_INDEX;
|
|
673
875
|
const position: ColumnPlan = {
|
|
@@ -676,9 +878,12 @@ class GmlImport {
|
|
|
676
878
|
dtype: "f64",
|
|
677
879
|
itemDtype: null,
|
|
678
880
|
kind: "real",
|
|
881
|
+
list: false,
|
|
679
882
|
role: "position",
|
|
680
883
|
};
|
|
681
|
-
const rest: ColumnPlan | null = entry.rest
|
|
884
|
+
const rest: ColumnPlan | null = entry.rest
|
|
885
|
+
? { ...plan, dtype: "json", itemDtype: null, kind: "record", list: false }
|
|
886
|
+
: null;
|
|
682
887
|
return { ...plan, position, rest };
|
|
683
888
|
}
|
|
684
889
|
return plan;
|
|
@@ -692,6 +897,14 @@ class GmlImport {
|
|
|
692
897
|
private uniqueGraphName(key: string): string {
|
|
693
898
|
const name = uniqueColumnName(key, key, (candidate) => this.graphNames.has(candidate));
|
|
694
899
|
this.graphNames.add(name);
|
|
900
|
+
if (name !== key) {
|
|
901
|
+
this.report.warning(
|
|
902
|
+
"coercion",
|
|
903
|
+
COLUMN_RENAMED_CODE_GML,
|
|
904
|
+
`the top-level key "${key}" and a key of the graph block share the graph column name; the top-level value is stored as "${name}"`,
|
|
905
|
+
{ element: key },
|
|
906
|
+
);
|
|
907
|
+
}
|
|
695
908
|
return name;
|
|
696
909
|
}
|
|
697
910
|
|
|
@@ -867,6 +1080,7 @@ class GmlImport {
|
|
|
867
1080
|
this.checkAbort();
|
|
868
1081
|
let index: number;
|
|
869
1082
|
let sinkId: NodeId;
|
|
1083
|
+
let fileId: NodeId | undefined;
|
|
870
1084
|
try {
|
|
871
1085
|
let idTok = -1;
|
|
872
1086
|
let labelTok = -1;
|
|
@@ -886,7 +1100,7 @@ class GmlImport {
|
|
|
886
1100
|
}
|
|
887
1101
|
// the file id under the ids rule, so `id 1` and `source "1"` meet in idMap (except under
|
|
888
1102
|
// "keep", where the integer 1 and the string "1" are different ids by design)
|
|
889
|
-
|
|
1103
|
+
fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
|
|
890
1104
|
if (originalTok >= 0) {
|
|
891
1105
|
sinkId = this.restoredId(originalTok);
|
|
892
1106
|
} else {
|
|
@@ -906,13 +1120,25 @@ class GmlImport {
|
|
|
906
1120
|
sinkId = fileId;
|
|
907
1121
|
}
|
|
908
1122
|
}
|
|
1123
|
+
index = sink.addNode(sinkId);
|
|
909
1124
|
if (this.idMap !== null) {
|
|
1125
|
+
const before = this.idMap.get(fileId);
|
|
1126
|
+
if (before !== undefined && before !== sinkId) {
|
|
1127
|
+
report.warning(
|
|
1128
|
+
"merged",
|
|
1129
|
+
DUPLICATE_NODE_CODE,
|
|
1130
|
+
`file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`,
|
|
1131
|
+
{ line, element: String(fileId) },
|
|
1132
|
+
);
|
|
1133
|
+
}
|
|
910
1134
|
this.idMap.set(fileId, sinkId);
|
|
911
1135
|
}
|
|
912
|
-
index = sink.addNode(sinkId);
|
|
913
1136
|
} catch (err) {
|
|
914
1137
|
this.recordNodeError(err, line);
|
|
915
1138
|
report.counts.skippedNodes++;
|
|
1139
|
+
if (fileId !== undefined) {
|
|
1140
|
+
this.skippedIds.add(fileId);
|
|
1141
|
+
}
|
|
916
1142
|
return;
|
|
917
1143
|
}
|
|
918
1144
|
if (this.isDeclared(index)) {
|
|
@@ -928,16 +1154,27 @@ class GmlImport {
|
|
|
928
1154
|
}
|
|
929
1155
|
this.beginElement(this.seq++);
|
|
930
1156
|
try {
|
|
1157
|
+
const graphics: number[] = [];
|
|
1158
|
+
let graphicsPlan: ColumnPlan | null = null;
|
|
931
1159
|
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
932
1160
|
const key = t.textOf(p);
|
|
933
1161
|
if (key === "id" || (key === ORIGINAL_ID_KEY && options.restoreMangledIds)) {
|
|
934
1162
|
continue;
|
|
935
1163
|
}
|
|
936
1164
|
const plan = this.nodePlans.get(key);
|
|
937
|
-
if (plan !== undefined) {
|
|
1165
|
+
if (plan !== undefined && plan.position !== null) {
|
|
1166
|
+
graphicsPlan = plan;
|
|
1167
|
+
graphics.push(p + 1);
|
|
1168
|
+
} else if (plan !== undefined) {
|
|
938
1169
|
this.writeNode(plan, index, p + 1);
|
|
939
1170
|
}
|
|
940
1171
|
}
|
|
1172
|
+
if (graphicsPlan !== null) {
|
|
1173
|
+
this.writeGraphics(graphicsPlan, index, graphics, {
|
|
1174
|
+
line: t.line[graphics[0]],
|
|
1175
|
+
element: String(sinkId),
|
|
1176
|
+
});
|
|
1177
|
+
}
|
|
941
1178
|
this.flushLists("node", index);
|
|
942
1179
|
} catch (err) {
|
|
943
1180
|
this.touched.length = 0;
|
|
@@ -1144,7 +1381,20 @@ class GmlImport {
|
|
|
1144
1381
|
*/
|
|
1145
1382
|
private endpoint(v: number, key: string): NodeId {
|
|
1146
1383
|
const id = this.coerceFileId(v, this.fileIdOf(v, key));
|
|
1147
|
-
|
|
1384
|
+
const mapped = this.idMap?.get(id);
|
|
1385
|
+
if (mapped !== undefined) {
|
|
1386
|
+
return mapped;
|
|
1387
|
+
}
|
|
1388
|
+
if (this.skippedIds.has(id)) {
|
|
1389
|
+
// the node block was skipped: creating the endpoint would bring the node back under
|
|
1390
|
+
// its raw file id (beside label ids under nodeIdFrom "label")
|
|
1391
|
+
throw new GraphFormatError(
|
|
1392
|
+
"E_UNKNOWN_NODE",
|
|
1393
|
+
`${key} ${JSON.stringify(id)} names a node block that was skipped after an error`,
|
|
1394
|
+
{ reason: "skipped node", id },
|
|
1395
|
+
);
|
|
1396
|
+
}
|
|
1397
|
+
return id;
|
|
1148
1398
|
}
|
|
1149
1399
|
|
|
1150
1400
|
/**
|
|
@@ -1156,11 +1406,17 @@ class GmlImport {
|
|
|
1156
1406
|
const t = this.requireTokens();
|
|
1157
1407
|
switch (t.kind[v]) {
|
|
1158
1408
|
case TOKEN_STRING:
|
|
1159
|
-
return parseWeightText(t.stringOf(v));
|
|
1409
|
+
return parseWeightText(t.stringOf(v), this.report);
|
|
1160
1410
|
case TOKEN_OPEN:
|
|
1161
1411
|
throw new GraphFormatError("E_INVALID_WEIGHT", "edge weight is a record", { value: "[...]" });
|
|
1162
|
-
default:
|
|
1163
|
-
|
|
1412
|
+
default: {
|
|
1413
|
+
const text = t.textOf(v);
|
|
1414
|
+
const weight = weightFromValue(numberOfText(text));
|
|
1415
|
+
if (weight !== undefined) {
|
|
1416
|
+
reportWeightPrecision(text, weight, this.report);
|
|
1417
|
+
}
|
|
1418
|
+
return weight;
|
|
1419
|
+
}
|
|
1164
1420
|
}
|
|
1165
1421
|
}
|
|
1166
1422
|
|
|
@@ -1228,10 +1484,6 @@ class GmlImport {
|
|
|
1228
1484
|
* @param v - the value token
|
|
1229
1485
|
*/
|
|
1230
1486
|
private writeNode(plan: ColumnPlan, index: number, v: number): void {
|
|
1231
|
-
if (plan.position !== null) {
|
|
1232
|
-
this.writeGraphics(plan, index, v);
|
|
1233
|
-
return;
|
|
1234
|
-
}
|
|
1235
1487
|
if (plan.list) {
|
|
1236
1488
|
this.collectItem(plan, v, this.seqNow, this.touched);
|
|
1237
1489
|
return;
|
|
@@ -1264,37 +1516,98 @@ class GmlImport {
|
|
|
1264
1516
|
this.collectItem(plan, v, seq, this.graphTouched);
|
|
1265
1517
|
return;
|
|
1266
1518
|
}
|
|
1267
|
-
|
|
1519
|
+
const value = this.scalarOf(plan, v);
|
|
1520
|
+
this.sink.setGraphValue(plan.name, value, graphDecl(plan));
|
|
1521
|
+
if (seq === GRAPH_SEQ && plan.key === "name" && typeof value === "string") {
|
|
1522
|
+
// the graph block's `name` is the graph's name too (snapshot.meta.name, and what graphName matches)
|
|
1523
|
+
this.sink.setMeta({ name: value });
|
|
1524
|
+
}
|
|
1268
1525
|
}
|
|
1269
1526
|
|
|
1270
1527
|
/**
|
|
1271
|
-
* Write a node's graphics
|
|
1272
|
-
* the
|
|
1528
|
+
* Write a node's graphics values: the position column from the x / y / z of the first record,
|
|
1529
|
+
* everything else (the remaining keys, a value that is not a record, a repeated record) to the
|
|
1530
|
+
* json column, with a warning when the value cannot give a position as written.
|
|
1273
1531
|
* @param plan - the graphics plan
|
|
1274
1532
|
* @param index - the node index
|
|
1275
|
-
* @param
|
|
1533
|
+
* @param vs - the value tokens of the node's graphics keys, in order
|
|
1534
|
+
* @param where - the line and the node, for issues
|
|
1276
1535
|
*/
|
|
1277
|
-
private writeGraphics(plan: ColumnPlan, index: number,
|
|
1536
|
+
private writeGraphics(plan: ColumnPlan, index: number, vs: readonly number[], where: IssueWhere): void {
|
|
1278
1537
|
const t = this.requireTokens();
|
|
1279
1538
|
const { sink } = this;
|
|
1280
|
-
const
|
|
1281
|
-
const
|
|
1539
|
+
const values = vs.map((v) => (t.kind[v] === TOKEN_OPEN ? parseRecord(t, v) : this.scalarOf(plan, v)));
|
|
1540
|
+
const first = values[0];
|
|
1282
1541
|
const positionPlan = plan.position;
|
|
1283
|
-
|
|
1284
|
-
|
|
1542
|
+
let rest: unknown = first;
|
|
1543
|
+
if (isRecord(first) && positionPlan !== null) {
|
|
1544
|
+
rest = this.writePosition(positionPlan, index, first, where);
|
|
1545
|
+
} else if (!isRecord(first)) {
|
|
1546
|
+
this.graphicsWarning("scalar", `node ${where.element}'s graphics is not a record`, where);
|
|
1547
|
+
}
|
|
1548
|
+
if (values.length > 1) {
|
|
1549
|
+
this.graphicsWarning(
|
|
1550
|
+
"repeated",
|
|
1551
|
+
`node ${where.element} has ${values.length} graphics records; the position comes from the first`,
|
|
1552
|
+
where,
|
|
1553
|
+
);
|
|
1554
|
+
rest = values;
|
|
1555
|
+
}
|
|
1556
|
+
if (rest !== undefined && plan.rest !== null) {
|
|
1557
|
+
sink.setNodeValue(this.handleOf(plan.rest, "node"), index, rest);
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
/**
|
|
1562
|
+
* Write a node's position from the x / y / z of its graphics record, taking them out of it.
|
|
1563
|
+
* @param positionPlan - the position column's plan
|
|
1564
|
+
* @param index - the node index
|
|
1565
|
+
* @param record - the graphics record
|
|
1566
|
+
* @param where - the line and the node, for issues
|
|
1567
|
+
* @returns what is left of the record for the json column, or undefined when nothing is
|
|
1568
|
+
*/
|
|
1569
|
+
private writePosition(
|
|
1570
|
+
positionPlan: ColumnPlan,
|
|
1571
|
+
index: number,
|
|
1572
|
+
record: Record<string, unknown>,
|
|
1573
|
+
where: IssueWhere,
|
|
1574
|
+
): unknown {
|
|
1575
|
+
const { x, y, z } = record;
|
|
1576
|
+
let rest: unknown = record;
|
|
1577
|
+
if (typeof x === "number" && typeof y === "number") {
|
|
1578
|
+
const depth = typeof z === "number" ? z : 0;
|
|
1579
|
+
this.sink.setNodeValue(this.handleOf(positionPlan, "node"), index, [x, y, depth]);
|
|
1285
1580
|
delete record.x;
|
|
1286
1581
|
delete record.y;
|
|
1287
1582
|
if (typeof z === "number") {
|
|
1288
1583
|
delete record.z;
|
|
1289
1584
|
}
|
|
1290
|
-
|
|
1291
|
-
sink.setNodeValue(this.handleOf(plan.rest, "node"), index, record);
|
|
1292
|
-
}
|
|
1293
|
-
return;
|
|
1585
|
+
rest = Object.keys(record).length > 0 ? record : undefined;
|
|
1294
1586
|
}
|
|
1295
|
-
if (
|
|
1296
|
-
|
|
1587
|
+
if ("x" in record || "y" in record || "z" in record) {
|
|
1588
|
+
this.graphicsWarning(
|
|
1589
|
+
"coordinate",
|
|
1590
|
+
`node ${where.element}'s graphics x / y / z is not one number each`,
|
|
1591
|
+
where,
|
|
1592
|
+
);
|
|
1297
1593
|
}
|
|
1594
|
+
return rest;
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
/**
|
|
1598
|
+
* Warn once per kind of graphics problem.
|
|
1599
|
+
* @param kind - the problem
|
|
1600
|
+
* @param what - the message start, naming the node
|
|
1601
|
+
* @param where - the line and the node
|
|
1602
|
+
*/
|
|
1603
|
+
private graphicsWarning(kind: string, what: string, where: IssueWhere): void {
|
|
1604
|
+
this.report.warnOnce(
|
|
1605
|
+
"validation-error",
|
|
1606
|
+
GRAPHICS_CODE,
|
|
1607
|
+
`${what}; the value is kept in the graphics json column (warned once for every such node)`,
|
|
1608
|
+
where,
|
|
1609
|
+
`${GRAPHICS_CODE}:${kind}`,
|
|
1610
|
+
);
|
|
1298
1611
|
}
|
|
1299
1612
|
|
|
1300
1613
|
/**
|
|
@@ -1605,9 +1918,13 @@ function sniffGml(head: Uint8Array): number {
|
|
|
1605
1918
|
return 0;
|
|
1606
1919
|
}
|
|
1607
1920
|
|
|
1608
|
-
/**
|
|
1921
|
+
/**
|
|
1922
|
+
* The GML importer plugin.
|
|
1923
|
+
* @category Built-in formats
|
|
1924
|
+
*/
|
|
1609
1925
|
export const gmlImporter: GraphImporter<GmlImportOptions> = Object.freeze({
|
|
1610
1926
|
format: "gml",
|
|
1927
|
+
options: Object.freeze(["dictionaries", "positions"]),
|
|
1611
1928
|
extensions: Object.freeze([".gml"]),
|
|
1612
1929
|
mimeTypes: Object.freeze(["text/x-gml", "text/plain"]),
|
|
1613
1930
|
sniff: sniffGml,
|
|
@@ -1623,6 +1940,10 @@ export const gmlImporter: GraphImporter<GmlImportOptions> = Object.freeze({
|
|
|
1623
1940
|
sink: GraphSink,
|
|
1624
1941
|
options?: GmlImportOptions & CommonImportOptions,
|
|
1625
1942
|
): Promise<ImportReport> {
|
|
1943
|
+
if (graphChosen(options)) {
|
|
1944
|
+
// the choice is honored here too, not only by the registry
|
|
1945
|
+
return importChosenGraph(gmlImporter, input, sink, options);
|
|
1946
|
+
}
|
|
1626
1947
|
const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);
|
|
1627
1948
|
const report = new ImportReportBuilder("gml", resolved.errorLimit);
|
|
1628
1949
|
reportSinkOptions(sink, options, report);
|
|
@@ -1635,7 +1956,7 @@ export const gmlImporter: GraphImporter<GmlImportOptions> = Object.freeze({
|
|
|
1635
1956
|
report.warning(
|
|
1636
1957
|
"unsupported",
|
|
1637
1958
|
SECOND_GRAPH_CODE,
|
|
1638
|
-
`the input holds ${gml.graphCount - 1} more graph block(
|
|
1959
|
+
`the input holds ${gml.graphCount - 1} more graph block${plural(gml.graphCount - 1)} after the first; the first is read (graphIndex or graphName chooses another; importAllGraphs() reads every one)`,
|
|
1639
1960
|
);
|
|
1640
1961
|
}
|
|
1641
1962
|
// an abort raised during the last few elements (after the last periodic check) still rejects
|