@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
|
|
@@ -23,49 +23,129 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { GraphFormatError, INVALID_INDEX, } from "@graphty/graph-format";
|
|
25
25
|
import { declareResolved, DictHeuristic, uniqueColumnName } from "../../common/attributes.js";
|
|
26
|
-
import {
|
|
26
|
+
import { importChosenGraph } from "../../common/choose.js";
|
|
27
|
+
import { COLUMN_RENAMED_CODE, DUPLICATE_NODE_CODE as SHARED_DUPLICATE_NODE_CODE, MISSING_ENDPOINT_CODE as SHARED_MISSING_ENDPOINT_CODE, MISSING_ID_CODE as SHARED_MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE as SHARED_NO_GRAPH_CODE, PRECISION_CODE as SHARED_PRECISION_CODE, ROLE_TAKEN_CODE as SHARED_ROLE_TAKEN_CODE, WIDENED_CODE as SHARED_WIDENED_CODE, } from "../../common/codes.js";
|
|
27
28
|
import { DirectionResolver } from "../../common/direction.js";
|
|
28
29
|
import { IdCoercer } from "../../common/ids.js";
|
|
29
30
|
import { readText, throwIfAborted } from "../../common/input.js";
|
|
30
|
-
import { reportSinkOptions, reportUnusedOptions, resolveImportOptions, } from "../../common/options.js";
|
|
31
|
+
import { graphChosen, reportSinkOptions, reportUnusedOptions, resolveImportOptions, } from "../../common/options.js";
|
|
32
|
+
import { plural } from "../../common/plural.js";
|
|
31
33
|
import { ImportReportBuilder } from "../../common/report.js";
|
|
32
|
-
import { parseWeightText, weightFromValue } from "../../common/weights.js";
|
|
34
|
+
import { parseWeightText, reportWeightPrecision, weightFromValue } from "../../common/weights.js";
|
|
33
35
|
import { EMPTY_LIST_TEXT, EMPTY_TUPLE_TEXT, GmlSyntaxError, LIST_START_MARKER, numberOfText, ORIGINAL_ID_KEY, parseRecord, scalarOrRecord, TOKEN_INT, TOKEN_OPEN, TOKEN_REAL, TOKEN_STRING, TOKEN_WORD, tokenizeGml, } from "./syntax.js";
|
|
34
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* The text holds no `graph [ ... ]` block.
|
|
38
|
+
* @category Issue and loss codes
|
|
39
|
+
*/
|
|
35
40
|
export const NO_GRAPH_CODE = SHARED_NO_GRAPH_CODE;
|
|
36
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* The text holds more than one `graph [ ... ]` block; import() reads the first, importAll() every one.
|
|
43
|
+
* @category Issue and loss codes
|
|
44
|
+
*/
|
|
37
45
|
export const SECOND_GRAPH_CODE = MULTIPLE_GRAPHS_CODE;
|
|
38
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* A node block has no `id` key.
|
|
48
|
+
* @category Issue and loss codes
|
|
49
|
+
*/
|
|
39
50
|
export const MISSING_ID_CODE = SHARED_MISSING_ID_CODE;
|
|
40
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* A node block has no `label` key under `nodeIdFrom: "label"`.
|
|
53
|
+
* @category Issue and loss codes
|
|
54
|
+
*/
|
|
41
55
|
export const MISSING_LABEL_CODE = "E_GML_MISSING_LABEL";
|
|
42
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* An edge block has no `source` or no `target` key.
|
|
58
|
+
* @category Issue and loss codes
|
|
59
|
+
*/
|
|
43
60
|
export const MISSING_ENDPOINT_CODE = SHARED_MISSING_ENDPOINT_CODE;
|
|
44
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* An `id`, `source` or `target` value is neither an integer nor a string.
|
|
63
|
+
* @category Issue and loss codes
|
|
64
|
+
*/
|
|
45
65
|
export const ID_TYPE_CODE = "E_GML_ID_TYPE";
|
|
46
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* Node ids, sources or targets are text, where GML expects integers. They are read under the `ids` option. Reported
|
|
68
|
+
* once per file.
|
|
69
|
+
* @category Issue and loss codes
|
|
70
|
+
*/
|
|
47
71
|
export const STRING_ID_CODE = "W_GML_STRING_ID";
|
|
48
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* A node id (or label under `nodeIdFrom: "label"`) is declared twice; later keys overwrite.
|
|
74
|
+
* @category Issue and loss codes
|
|
75
|
+
*/
|
|
49
76
|
export const DUPLICATE_NODE_CODE = SHARED_DUPLICATE_NODE_CODE;
|
|
50
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* A structural key (`id`, `source`, `target`) appears twice in one block.
|
|
79
|
+
* @category Issue and loss codes
|
|
80
|
+
*/
|
|
51
81
|
export const REPEATED_KEY_CODE = "E_GML_REPEATED_KEY";
|
|
52
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* A `node` or `edge` key whose value is not a `[ ... ]` block.
|
|
84
|
+
* @category Issue and loss codes
|
|
85
|
+
*/
|
|
53
86
|
export const ELEMENT_TYPE_CODE = "E_GML_ELEMENT_TYPE";
|
|
54
|
-
/**
|
|
87
|
+
/**
|
|
88
|
+
* A `directed` or `multigraph` flag that is not an integer.
|
|
89
|
+
* @category Issue and loss codes
|
|
90
|
+
*/
|
|
55
91
|
export const FLAG_TYPE_CODE = "E_GML_FLAG_TYPE";
|
|
56
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* A `directed` / `multigraph` flag that is not 0 or 1 (read as its truth value), one written as a quoted integer, or
|
|
94
|
+
* one repeated.
|
|
95
|
+
* @category Issue and loss codes
|
|
96
|
+
*/
|
|
57
97
|
export const FLAG_VALUE_CODE = "W_GML_FLAG_VALUE";
|
|
58
98
|
/** A flag written as a quoted integer, surrounding spaces allowed. */
|
|
59
99
|
const QUOTED_INT = /^\s*[+-]?[0-9]+\s*$/;
|
|
60
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* A named entity in a string that is neither an XML nor an ISO-8859-1 HTML entity, or a numeric reference beyond
|
|
102
|
+
* U+10FFFF; it is kept as written.
|
|
103
|
+
* @category Issue and loss codes
|
|
104
|
+
*/
|
|
61
105
|
export const UNKNOWN_ENTITY_CODE = "W_GML_UNKNOWN_ENTITY";
|
|
62
|
-
/**
|
|
106
|
+
/**
|
|
107
|
+
* A node's `graphics` value cannot give a position as written (not a record, repeated in the node, or with an x / y /
|
|
108
|
+
* z that is not one number); the value is kept in the graphics json column. Warned once per kind of problem, naming
|
|
109
|
+
* the first node.
|
|
110
|
+
* @category Issue and loss codes
|
|
111
|
+
*/
|
|
112
|
+
export const GRAPHICS_CODE = "W_GML_GRAPHICS";
|
|
113
|
+
/**
|
|
114
|
+
* A `graph`, `node` or `edge` record inside a node or edge; kept as a json column, not read as structure.
|
|
115
|
+
* @category Issue and loss codes
|
|
116
|
+
*/
|
|
117
|
+
export const NESTED_ELEMENT_CODE = "W_GML_NESTED_ELEMENT";
|
|
118
|
+
/**
|
|
119
|
+
* YEd's group keys (`isGroup`, `gid`); kept as plain node columns, the hierarchy is not read as containment.
|
|
120
|
+
* @category Issue and loss codes
|
|
121
|
+
*/
|
|
122
|
+
export const GROUPS_CODE = "W_GML_GROUPS";
|
|
123
|
+
/**
|
|
124
|
+
* A key whose values mix numbers and strings; the column is string, the numbers kept as written.
|
|
125
|
+
* @category Issue and loss codes
|
|
126
|
+
*/
|
|
127
|
+
export const WIDENED_CODE = SHARED_WIDENED_CODE;
|
|
128
|
+
/**
|
|
129
|
+
* An integer above 2^53 was stored as the nearest JavaScript number, so its last digits may differ. Pass `long:
|
|
130
|
+
* "string"` to keep every digit as text.
|
|
131
|
+
* @category Issue and loss codes
|
|
132
|
+
*/
|
|
63
133
|
export const PRECISION_CODE = SHARED_PRECISION_CODE;
|
|
64
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* Two attributes would have had the same name, so this one was renamed `<name>#<key>`.
|
|
136
|
+
* @category Plugin helpers
|
|
137
|
+
*/
|
|
65
138
|
export const COLUMN_RENAMED_CODE_GML = COLUMN_RENAMED_CODE;
|
|
66
|
-
/**
|
|
139
|
+
/**
|
|
140
|
+
* You read into a graph builder that already has an attribute with this role, so this file's attribute is kept without
|
|
141
|
+
* the role.
|
|
142
|
+
* @category Issue and loss codes
|
|
143
|
+
*/
|
|
67
144
|
export const ROLE_TAKEN_CODE = SHARED_ROLE_TAKEN_CODE;
|
|
68
|
-
/**
|
|
145
|
+
/**
|
|
146
|
+
* Under `nodeIdFrom` "label" / "index" the integer `id` keys are not kept.
|
|
147
|
+
* @category Issue and loss codes
|
|
148
|
+
*/
|
|
69
149
|
export const ID_DROPPED_CODE = "W_GML_ID_DROPPED";
|
|
70
150
|
const FORMAT_DEFAULTS = { ids: "canonical", defaultDirected: false, weightFrom: "value" };
|
|
71
151
|
const KIND_INT = 1;
|
|
@@ -88,6 +168,7 @@ const USED_OPTIONS = new Set([
|
|
|
88
168
|
"weightFrom",
|
|
89
169
|
"weightDtype",
|
|
90
170
|
"restoreMangledIds",
|
|
171
|
+
"long",
|
|
91
172
|
"errorLimit",
|
|
92
173
|
"signal",
|
|
93
174
|
"onProgress",
|
|
@@ -96,6 +177,23 @@ const USED_OPTIONS = new Set([
|
|
|
96
177
|
const GRAPH_SEQ = -1;
|
|
97
178
|
/** The element sequence number of the top-level keys. */
|
|
98
179
|
const TOP_SEQ = -2;
|
|
180
|
+
/**
|
|
181
|
+
* Whether a key is the label of a node or edge (text, never a NetworkX list marker).
|
|
182
|
+
* @param domain - the table
|
|
183
|
+
* @param key - the key
|
|
184
|
+
* @returns true for a node or edge label
|
|
185
|
+
*/
|
|
186
|
+
function isLabel(domain, key) {
|
|
187
|
+
return roleOf(domain, key) === "label";
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Whether a parsed value is a GML record.
|
|
191
|
+
* @param value - the value
|
|
192
|
+
* @returns true for a record object
|
|
193
|
+
*/
|
|
194
|
+
function isRecord(value) {
|
|
195
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
196
|
+
}
|
|
99
197
|
/**
|
|
100
198
|
* Whether a key gets a role in its table (design section 5.6 applied to GML keys).
|
|
101
199
|
* @param domain - the table
|
|
@@ -156,6 +254,8 @@ class GmlImport {
|
|
|
156
254
|
this.elementsSinceCheck = 0;
|
|
157
255
|
/** The sink id every file id maps to when they differ (label / index / restored ids), else null. */
|
|
158
256
|
this.idMap = null;
|
|
257
|
+
/** The file ids of node blocks that were skipped: an edge naming one is skipped too, never given a new node. */
|
|
258
|
+
this.skippedIds = new Set();
|
|
159
259
|
/** Node indices declared by a node block of this import, for duplicate detection. */
|
|
160
260
|
this.declared = new Uint32Array(64);
|
|
161
261
|
/** The list plans touched by the current node or edge. */
|
|
@@ -178,7 +278,7 @@ class GmlImport {
|
|
|
178
278
|
run(tokens) {
|
|
179
279
|
this.tokens = tokens;
|
|
180
280
|
tokens.onUnknownEntity = (entity, line) => {
|
|
181
|
-
this.report.warnOnce("parse-error", UNKNOWN_ENTITY_CODE, `
|
|
281
|
+
this.report.warnOnce("parse-error", UNKNOWN_ENTITY_CODE, `character entity ${entity} cannot be decoded; it is kept as written`, { line, element: entity }, `${UNKNOWN_ENTITY_CODE}:${entity}`);
|
|
182
282
|
};
|
|
183
283
|
this.scan();
|
|
184
284
|
this.push();
|
|
@@ -190,10 +290,14 @@ class GmlImport {
|
|
|
190
290
|
*/
|
|
191
291
|
scan() {
|
|
192
292
|
const t = this.requireTokens();
|
|
293
|
+
let scalarGraph = -1;
|
|
193
294
|
for (let p = 0; p < t.count; p = t.nextPair(p)) {
|
|
194
295
|
const key = t.textOf(p);
|
|
195
296
|
const v = p + 1;
|
|
196
297
|
const record = t.kind[v] === TOKEN_OPEN;
|
|
298
|
+
if (key === "graph" && !record && scalarGraph < 0) {
|
|
299
|
+
scalarGraph = v;
|
|
300
|
+
}
|
|
197
301
|
if (key === "graph" && record) {
|
|
198
302
|
if (this.graphCount++ === this.which) {
|
|
199
303
|
this.graphOpen = v;
|
|
@@ -211,6 +315,9 @@ class GmlImport {
|
|
|
211
315
|
}
|
|
212
316
|
}
|
|
213
317
|
if (this.graphOpen < 0) {
|
|
318
|
+
if (scalarGraph >= 0) {
|
|
319
|
+
this.report.fail(NO_GRAPH_CODE, `the graph key at line ${t.line[scalarGraph]} holds ${describeValue(t, scalarGraph)}, not a [ ... ] block; the input contains no graph block`, { line: t.line[scalarGraph] });
|
|
320
|
+
}
|
|
214
321
|
this.report.fail(NO_GRAPH_CODE, "the input contains no graph [ ... ] block", { line: null });
|
|
215
322
|
}
|
|
216
323
|
}
|
|
@@ -297,7 +404,9 @@ class GmlImport {
|
|
|
297
404
|
*/
|
|
298
405
|
observe(schema, domain, key, v, seq) {
|
|
299
406
|
const t = this.requireTokens();
|
|
407
|
+
this.noteStructure(domain, key, v);
|
|
300
408
|
let entry = schema.get(key);
|
|
409
|
+
const graphics = domain === "node" && key === "graphics" && this.positions;
|
|
301
410
|
if (entry === undefined) {
|
|
302
411
|
entry = {
|
|
303
412
|
key,
|
|
@@ -314,14 +423,21 @@ class GmlImport {
|
|
|
314
423
|
}
|
|
315
424
|
else if (entry.lastSeq === seq) {
|
|
316
425
|
entry.list = true;
|
|
426
|
+
// a repeated graphics record: the extra records go to the json column
|
|
427
|
+
entry.rest || (entry.rest = graphics);
|
|
317
428
|
}
|
|
318
429
|
else {
|
|
319
430
|
entry.lastSeq = seq;
|
|
320
431
|
}
|
|
432
|
+
if (graphics && t.kind[v] !== TOKEN_OPEN) {
|
|
433
|
+
entry.rest = true;
|
|
434
|
+
}
|
|
321
435
|
switch (t.kind[v]) {
|
|
322
436
|
case TOKEN_STRING: {
|
|
323
437
|
const raw = t.textOf(v);
|
|
324
|
-
|
|
438
|
+
// a label is text: "[]" there is a label, never NetworkX's empty list
|
|
439
|
+
if (raw === LIST_START_MARKER ||
|
|
440
|
+
(!isLabel(domain, key) && (raw === EMPTY_LIST_TEXT || raw === EMPTY_TUPLE_TEXT))) {
|
|
325
441
|
entry.list = true;
|
|
326
442
|
return;
|
|
327
443
|
}
|
|
@@ -348,8 +464,32 @@ class GmlImport {
|
|
|
348
464
|
this.inspectGraphics(entry, v);
|
|
349
465
|
}
|
|
350
466
|
return;
|
|
351
|
-
default:
|
|
467
|
+
default: {
|
|
352
468
|
entry.kinds |= KIND_REAL;
|
|
469
|
+
const text = t.textOf(v);
|
|
470
|
+
if (/\d/.test(text) && !Number.isFinite(Number(text))) {
|
|
471
|
+
this.report.warnOnce("precision", PRECISION_CODE, `${domain} key "${key}" holds the real ${text}, beyond the f64 range; it is stored as ${numberOfText(text) > 0 ? "" : "-"}Infinity`, { line: t.line[v], element: key }, `${PRECISION_CODE}:overflow:${domain}:${key}`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Warn about keys of a node or edge whose meaning GML readers give but this import does not:
|
|
478
|
+
* a nested graph / node / edge record, and yEd's group hierarchy.
|
|
479
|
+
* @param domain - the table
|
|
480
|
+
* @param key - the key
|
|
481
|
+
* @param v - the value token
|
|
482
|
+
*/
|
|
483
|
+
noteStructure(domain, key, v) {
|
|
484
|
+
const t = this.requireTokens();
|
|
485
|
+
if (domain === "graph") {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
if ((key === "graph" || key === "node" || key === "edge") && t.kind[v] === TOKEN_OPEN) {
|
|
489
|
+
this.report.warnOnce("unsupported", NESTED_ELEMENT_CODE, `a nested ${key} record inside a ${domain} is kept as the json column "${key}"; it is not read as structure`, { line: t.line[v], element: key }, `${NESTED_ELEMENT_CODE}:${domain}:${key}`);
|
|
490
|
+
}
|
|
491
|
+
else if (domain === "node" && (key === "isGroup" || key === "gid")) {
|
|
492
|
+
this.report.warnOnce("unsupported", GROUPS_CODE, "yEd group keys (isGroup, gid) are kept as plain node columns; the group hierarchy is not read as containment", { line: t.line[v], element: key });
|
|
353
493
|
}
|
|
354
494
|
}
|
|
355
495
|
/**
|
|
@@ -428,7 +568,9 @@ class GmlImport {
|
|
|
428
568
|
* @returns the plan
|
|
429
569
|
*/
|
|
430
570
|
planOf(domain, entry, top = false) {
|
|
431
|
-
|
|
571
|
+
// long: "string" keeps every digit of an integer key that holds values beyond 2^53, as text
|
|
572
|
+
const asText = entry.unsafe && this.options.long === "string" && kindOf(entry) === "int";
|
|
573
|
+
const kind = asText ? "string" : kindOf(entry);
|
|
432
574
|
let scalar = dtypeOfKind(kind, entry);
|
|
433
575
|
if (scalar === "string" &&
|
|
434
576
|
!entry.list &&
|
|
@@ -437,8 +579,13 @@ class GmlImport {
|
|
|
437
579
|
entry.dict.decide() === "dict") {
|
|
438
580
|
scalar = "dict";
|
|
439
581
|
}
|
|
440
|
-
if (entry.
|
|
441
|
-
|
|
582
|
+
if ((entry.kinds & KIND_STRING) !== 0 &&
|
|
583
|
+
(entry.kinds & (KIND_INT | KIND_REAL)) !== 0 &&
|
|
584
|
+
(entry.kinds & KIND_RECORD) === 0) {
|
|
585
|
+
this.report.warnOnce("coercion", WIDENED_CODE, `${domain} key "${entry.key}" mixes numbers and strings; the column is string and the numbers are kept as written`, { element: entry.key }, `${WIDENED_CODE}:${domain}:${entry.key}`);
|
|
586
|
+
}
|
|
587
|
+
if (entry.unsafe && !asText) {
|
|
588
|
+
this.report.warnOnce("precision", PRECISION_CODE, `${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)`, { element: entry.key }, `${PRECISION_CODE}:${domain}:${entry.key}`);
|
|
442
589
|
}
|
|
443
590
|
const name = domain === "graph" ? this.uniqueGraphName(entry.key) : entry.key;
|
|
444
591
|
let itemDtype = null;
|
|
@@ -461,11 +608,7 @@ class GmlImport {
|
|
|
461
608
|
items: null,
|
|
462
609
|
seq: Number.NEGATIVE_INFINITY,
|
|
463
610
|
};
|
|
464
|
-
if (domain === "node" &&
|
|
465
|
-
entry.key === "graphics" &&
|
|
466
|
-
entry.position &&
|
|
467
|
-
entry.kinds === KIND_RECORD &&
|
|
468
|
-
!entry.list) {
|
|
611
|
+
if (domain === "node" && entry.key === "graphics" && this.positions && (entry.kinds & KIND_RECORD) !== 0) {
|
|
469
612
|
const taken = (candidate) => this.nodeSchema.has(candidate) || this.sink.nodeColumn(candidate) !== INVALID_INDEX;
|
|
470
613
|
const position = {
|
|
471
614
|
...plan,
|
|
@@ -473,9 +616,12 @@ class GmlImport {
|
|
|
473
616
|
dtype: "f64",
|
|
474
617
|
itemDtype: null,
|
|
475
618
|
kind: "real",
|
|
619
|
+
list: false,
|
|
476
620
|
role: "position",
|
|
477
621
|
};
|
|
478
|
-
const rest = entry.rest
|
|
622
|
+
const rest = entry.rest
|
|
623
|
+
? { ...plan, dtype: "json", itemDtype: null, kind: "record", list: false }
|
|
624
|
+
: null;
|
|
479
625
|
return { ...plan, position, rest };
|
|
480
626
|
}
|
|
481
627
|
return plan;
|
|
@@ -488,6 +634,9 @@ class GmlImport {
|
|
|
488
634
|
uniqueGraphName(key) {
|
|
489
635
|
const name = uniqueColumnName(key, key, (candidate) => this.graphNames.has(candidate));
|
|
490
636
|
this.graphNames.add(name);
|
|
637
|
+
if (name !== key) {
|
|
638
|
+
this.report.warning("coercion", COLUMN_RENAMED_CODE_GML, `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}"`, { element: key });
|
|
639
|
+
}
|
|
491
640
|
return name;
|
|
492
641
|
}
|
|
493
642
|
/** Set the graph metadata: source format, creator, version, multigraph flag, weight origin. */
|
|
@@ -633,6 +782,7 @@ class GmlImport {
|
|
|
633
782
|
this.checkAbort();
|
|
634
783
|
let index;
|
|
635
784
|
let sinkId;
|
|
785
|
+
let fileId;
|
|
636
786
|
try {
|
|
637
787
|
let idTok = -1;
|
|
638
788
|
let labelTok = -1;
|
|
@@ -654,7 +804,7 @@ class GmlImport {
|
|
|
654
804
|
}
|
|
655
805
|
// the file id under the ids rule, so `id 1` and `source "1"` meet in idMap (except under
|
|
656
806
|
// "keep", where the integer 1 and the string "1" are different ids by design)
|
|
657
|
-
|
|
807
|
+
fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
|
|
658
808
|
if (originalTok >= 0) {
|
|
659
809
|
sinkId = this.restoredId(originalTok);
|
|
660
810
|
}
|
|
@@ -675,14 +825,21 @@ class GmlImport {
|
|
|
675
825
|
sinkId = fileId;
|
|
676
826
|
}
|
|
677
827
|
}
|
|
828
|
+
index = sink.addNode(sinkId);
|
|
678
829
|
if (this.idMap !== null) {
|
|
830
|
+
const before = this.idMap.get(fileId);
|
|
831
|
+
if (before !== undefined && before !== sinkId) {
|
|
832
|
+
report.warning("merged", DUPLICATE_NODE_CODE, `file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`, { line, element: String(fileId) });
|
|
833
|
+
}
|
|
679
834
|
this.idMap.set(fileId, sinkId);
|
|
680
835
|
}
|
|
681
|
-
index = sink.addNode(sinkId);
|
|
682
836
|
}
|
|
683
837
|
catch (err) {
|
|
684
838
|
this.recordNodeError(err, line);
|
|
685
839
|
report.counts.skippedNodes++;
|
|
840
|
+
if (fileId !== undefined) {
|
|
841
|
+
this.skippedIds.add(fileId);
|
|
842
|
+
}
|
|
686
843
|
return;
|
|
687
844
|
}
|
|
688
845
|
if (this.isDeclared(index)) {
|
|
@@ -694,16 +851,28 @@ class GmlImport {
|
|
|
694
851
|
}
|
|
695
852
|
this.beginElement(this.seq++);
|
|
696
853
|
try {
|
|
854
|
+
const graphics = [];
|
|
855
|
+
let graphicsPlan = null;
|
|
697
856
|
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
698
857
|
const key = t.textOf(p);
|
|
699
858
|
if (key === "id" || (key === ORIGINAL_ID_KEY && options.restoreMangledIds)) {
|
|
700
859
|
continue;
|
|
701
860
|
}
|
|
702
861
|
const plan = this.nodePlans.get(key);
|
|
703
|
-
if (plan !== undefined) {
|
|
862
|
+
if (plan !== undefined && plan.position !== null) {
|
|
863
|
+
graphicsPlan = plan;
|
|
864
|
+
graphics.push(p + 1);
|
|
865
|
+
}
|
|
866
|
+
else if (plan !== undefined) {
|
|
704
867
|
this.writeNode(plan, index, p + 1);
|
|
705
868
|
}
|
|
706
869
|
}
|
|
870
|
+
if (graphicsPlan !== null) {
|
|
871
|
+
this.writeGraphics(graphicsPlan, index, graphics, {
|
|
872
|
+
line: t.line[graphics[0]],
|
|
873
|
+
element: String(sinkId),
|
|
874
|
+
});
|
|
875
|
+
}
|
|
707
876
|
this.flushLists("node", index);
|
|
708
877
|
}
|
|
709
878
|
catch (err) {
|
|
@@ -898,7 +1067,16 @@ class GmlImport {
|
|
|
898
1067
|
*/
|
|
899
1068
|
endpoint(v, key) {
|
|
900
1069
|
const id = this.coerceFileId(v, this.fileIdOf(v, key));
|
|
901
|
-
|
|
1070
|
+
const mapped = this.idMap?.get(id);
|
|
1071
|
+
if (mapped !== undefined) {
|
|
1072
|
+
return mapped;
|
|
1073
|
+
}
|
|
1074
|
+
if (this.skippedIds.has(id)) {
|
|
1075
|
+
// the node block was skipped: creating the endpoint would bring the node back under
|
|
1076
|
+
// its raw file id (beside label ids under nodeIdFrom "label")
|
|
1077
|
+
throw new GraphFormatError("E_UNKNOWN_NODE", `${key} ${JSON.stringify(id)} names a node block that was skipped after an error`, { reason: "skipped node", id });
|
|
1078
|
+
}
|
|
1079
|
+
return id;
|
|
902
1080
|
}
|
|
903
1081
|
/**
|
|
904
1082
|
* The weight of an edge from its weight token.
|
|
@@ -909,11 +1087,17 @@ class GmlImport {
|
|
|
909
1087
|
const t = this.requireTokens();
|
|
910
1088
|
switch (t.kind[v]) {
|
|
911
1089
|
case TOKEN_STRING:
|
|
912
|
-
return parseWeightText(t.stringOf(v));
|
|
1090
|
+
return parseWeightText(t.stringOf(v), this.report);
|
|
913
1091
|
case TOKEN_OPEN:
|
|
914
1092
|
throw new GraphFormatError("E_INVALID_WEIGHT", "edge weight is a record", { value: "[...]" });
|
|
915
|
-
default:
|
|
916
|
-
|
|
1093
|
+
default: {
|
|
1094
|
+
const text = t.textOf(v);
|
|
1095
|
+
const weight = weightFromValue(numberOfText(text));
|
|
1096
|
+
if (weight !== undefined) {
|
|
1097
|
+
reportWeightPrecision(text, weight, this.report);
|
|
1098
|
+
}
|
|
1099
|
+
return weight;
|
|
1100
|
+
}
|
|
917
1101
|
}
|
|
918
1102
|
}
|
|
919
1103
|
/**
|
|
@@ -977,10 +1161,6 @@ class GmlImport {
|
|
|
977
1161
|
* @param v - the value token
|
|
978
1162
|
*/
|
|
979
1163
|
writeNode(plan, index, v) {
|
|
980
|
-
if (plan.position !== null) {
|
|
981
|
-
this.writeGraphics(plan, index, v);
|
|
982
|
-
return;
|
|
983
|
-
}
|
|
984
1164
|
if (plan.list) {
|
|
985
1165
|
this.collectItem(plan, v, this.seqNow, this.touched);
|
|
986
1166
|
return;
|
|
@@ -1011,36 +1191,77 @@ class GmlImport {
|
|
|
1011
1191
|
this.collectItem(plan, v, seq, this.graphTouched);
|
|
1012
1192
|
return;
|
|
1013
1193
|
}
|
|
1014
|
-
|
|
1194
|
+
const value = this.scalarOf(plan, v);
|
|
1195
|
+
this.sink.setGraphValue(plan.name, value, graphDecl(plan));
|
|
1196
|
+
if (seq === GRAPH_SEQ && plan.key === "name" && typeof value === "string") {
|
|
1197
|
+
// the graph block's `name` is the graph's name too (snapshot.meta.name, and what graphName matches)
|
|
1198
|
+
this.sink.setMeta({ name: value });
|
|
1199
|
+
}
|
|
1015
1200
|
}
|
|
1016
1201
|
/**
|
|
1017
|
-
* Write a node's graphics
|
|
1018
|
-
* the
|
|
1202
|
+
* Write a node's graphics values: the position column from the x / y / z of the first record,
|
|
1203
|
+
* everything else (the remaining keys, a value that is not a record, a repeated record) to the
|
|
1204
|
+
* json column, with a warning when the value cannot give a position as written.
|
|
1019
1205
|
* @param plan - the graphics plan
|
|
1020
1206
|
* @param index - the node index
|
|
1021
|
-
* @param
|
|
1207
|
+
* @param vs - the value tokens of the node's graphics keys, in order
|
|
1208
|
+
* @param where - the line and the node, for issues
|
|
1022
1209
|
*/
|
|
1023
|
-
writeGraphics(plan, index,
|
|
1210
|
+
writeGraphics(plan, index, vs, where) {
|
|
1024
1211
|
const t = this.requireTokens();
|
|
1025
1212
|
const { sink } = this;
|
|
1026
|
-
const
|
|
1027
|
-
const
|
|
1213
|
+
const values = vs.map((v) => (t.kind[v] === TOKEN_OPEN ? parseRecord(t, v) : this.scalarOf(plan, v)));
|
|
1214
|
+
const first = values[0];
|
|
1028
1215
|
const positionPlan = plan.position;
|
|
1029
|
-
|
|
1030
|
-
|
|
1216
|
+
let rest = first;
|
|
1217
|
+
if (isRecord(first) && positionPlan !== null) {
|
|
1218
|
+
rest = this.writePosition(positionPlan, index, first, where);
|
|
1219
|
+
}
|
|
1220
|
+
else if (!isRecord(first)) {
|
|
1221
|
+
this.graphicsWarning("scalar", `node ${where.element}'s graphics is not a record`, where);
|
|
1222
|
+
}
|
|
1223
|
+
if (values.length > 1) {
|
|
1224
|
+
this.graphicsWarning("repeated", `node ${where.element} has ${values.length} graphics records; the position comes from the first`, where);
|
|
1225
|
+
rest = values;
|
|
1226
|
+
}
|
|
1227
|
+
if (rest !== undefined && plan.rest !== null) {
|
|
1228
|
+
sink.setNodeValue(this.handleOf(plan.rest, "node"), index, rest);
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
/**
|
|
1232
|
+
* Write a node's position from the x / y / z of its graphics record, taking them out of it.
|
|
1233
|
+
* @param positionPlan - the position column's plan
|
|
1234
|
+
* @param index - the node index
|
|
1235
|
+
* @param record - the graphics record
|
|
1236
|
+
* @param where - the line and the node, for issues
|
|
1237
|
+
* @returns what is left of the record for the json column, or undefined when nothing is
|
|
1238
|
+
*/
|
|
1239
|
+
writePosition(positionPlan, index, record, where) {
|
|
1240
|
+
const { x, y, z } = record;
|
|
1241
|
+
let rest = record;
|
|
1242
|
+
if (typeof x === "number" && typeof y === "number") {
|
|
1243
|
+
const depth = typeof z === "number" ? z : 0;
|
|
1244
|
+
this.sink.setNodeValue(this.handleOf(positionPlan, "node"), index, [x, y, depth]);
|
|
1031
1245
|
delete record.x;
|
|
1032
1246
|
delete record.y;
|
|
1033
1247
|
if (typeof z === "number") {
|
|
1034
1248
|
delete record.z;
|
|
1035
1249
|
}
|
|
1036
|
-
|
|
1037
|
-
sink.setNodeValue(this.handleOf(plan.rest, "node"), index, record);
|
|
1038
|
-
}
|
|
1039
|
-
return;
|
|
1250
|
+
rest = Object.keys(record).length > 0 ? record : undefined;
|
|
1040
1251
|
}
|
|
1041
|
-
if (
|
|
1042
|
-
|
|
1252
|
+
if ("x" in record || "y" in record || "z" in record) {
|
|
1253
|
+
this.graphicsWarning("coordinate", `node ${where.element}'s graphics x / y / z is not one number each`, where);
|
|
1043
1254
|
}
|
|
1255
|
+
return rest;
|
|
1256
|
+
}
|
|
1257
|
+
/**
|
|
1258
|
+
* Warn once per kind of graphics problem.
|
|
1259
|
+
* @param kind - the problem
|
|
1260
|
+
* @param what - the message start, naming the node
|
|
1261
|
+
* @param where - the line and the node
|
|
1262
|
+
*/
|
|
1263
|
+
graphicsWarning(kind, what, where) {
|
|
1264
|
+
this.report.warnOnce("validation-error", GRAPHICS_CODE, `${what}; the value is kept in the graphics json column (warned once for every such node)`, where, `${GRAPHICS_CODE}:${kind}`);
|
|
1044
1265
|
}
|
|
1045
1266
|
/**
|
|
1046
1267
|
* Collect one list item.
|
|
@@ -1331,9 +1552,13 @@ function sniffGml(head) {
|
|
|
1331
1552
|
}
|
|
1332
1553
|
return 0;
|
|
1333
1554
|
}
|
|
1334
|
-
/**
|
|
1555
|
+
/**
|
|
1556
|
+
* The GML importer plugin.
|
|
1557
|
+
* @category Built-in formats
|
|
1558
|
+
*/
|
|
1335
1559
|
export const gmlImporter = Object.freeze({
|
|
1336
1560
|
format: "gml",
|
|
1561
|
+
options: Object.freeze(["dictionaries", "positions"]),
|
|
1337
1562
|
extensions: Object.freeze([".gml"]),
|
|
1338
1563
|
mimeTypes: Object.freeze(["text/x-gml", "text/plain"]),
|
|
1339
1564
|
sniff: sniffGml,
|
|
@@ -1345,6 +1570,10 @@ export const gmlImporter = Object.freeze({
|
|
|
1345
1570
|
* @returns the report
|
|
1346
1571
|
*/
|
|
1347
1572
|
async import(input, sink, options) {
|
|
1573
|
+
if (graphChosen(options)) {
|
|
1574
|
+
// the choice is honored here too, not only by the registry
|
|
1575
|
+
return importChosenGraph(gmlImporter, input, sink, options);
|
|
1576
|
+
}
|
|
1348
1577
|
const resolved = resolveImportOptions(options, FORMAT_DEFAULTS);
|
|
1349
1578
|
const report = new ImportReportBuilder("gml", resolved.errorLimit);
|
|
1350
1579
|
reportSinkOptions(sink, options, report);
|
|
@@ -1354,7 +1583,7 @@ export const gmlImporter = Object.freeze({
|
|
|
1354
1583
|
const gml = new GmlImport(sink, report, resolved, options);
|
|
1355
1584
|
gml.run(tokens);
|
|
1356
1585
|
if (gml.graphCount > 1) {
|
|
1357
|
-
report.warning("unsupported", SECOND_GRAPH_CODE, `the input holds ${gml.graphCount - 1} more graph block(
|
|
1586
|
+
report.warning("unsupported", SECOND_GRAPH_CODE, `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)`);
|
|
1358
1587
|
}
|
|
1359
1588
|
// an abort raised during the last few elements (after the last periodic check) still rejects
|
|
1360
1589
|
throwIfAborted(resolved.signal);
|