@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
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { GraphFormatError, INVALID_INDEX } from "@graphty/graph-format";
|
|
2
2
|
import { c as childrenCsr } from "./children-CL3Cy0ez.js";
|
|
3
|
-
import {
|
|
4
|
-
import { c as quoteDotId, d as isWritableDotText } from "./escape-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { i as
|
|
8
|
-
import { j as joinText, e as encodeChunks } from "./writer-C7flM-Ih.js";
|
|
3
|
+
import { L as LOSS, r as resolveExportOptions, a as checkCapabilities, c as capabilities, bE as countMixedEdges, e as explicitWeights, p as pairFolding, b as plural, aE as sanitizeIds, aa as formatF32, ab as formatF64, a9 as idText, $ as agree, aF as formatDecimal, aG as formatInteger, aH as canonicalId, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, d as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, I as ID_MERGED_CODE, O as OPTION_IGNORED_CODE, C as COLUMN_RENAMED_CODE, R as ROLE_TAKEN_CODE, o as DUPLICATE_ATTRIBUTE_CODE, P as PRECISION_CODE, ae as AMBIGUOUS_GRAPH_NAME_CODE, af as GRAPH_NOT_FOUND_CODE, l as MULTIPLE_GRAPHS_CODE, v as ENCODING_CONFLICT_CODE, w as UNKNOWN_ENCODING_CODE, x as ENCODING_FALLBACK_CODE, y as INVALID_ENCODING_CODE, z as INVALID_UTF8_CODE, E as EMPTY_INPUT_CODE, ak as SYNTAX_CODE, F as ELEMENT_ISSUE, G as INPUT_ISSUE, al as resolveImportOptions, a8 as ImportReportBuilder, an as reportUnusedOptions, bC as readText, ao as reportSinkOptions, am as throwIfAborted, ap as graphChosen, ar as IdCoercer, aq as DirectionResolver, aL as parseWeightText, bF as canonicalEncoding, aJ as survivesF32, a1 as declareResolved } from "./export-BTI4yQgy.js";
|
|
4
|
+
import { c as quoteDotId, d as isWritableDotText } from "./escape-D0g6NNUy.js";
|
|
5
|
+
import { i as inferTextDtype, W as WIDENING_UNSUPPORTED_CODE, p as parseTextCell, T as TextCellWriter } from "./text-DmcUs5_Q.js";
|
|
6
|
+
import { j as joinText, e as encodeChunks, i as indentUnit } from "./writer-DxjgHwSe.js";
|
|
7
|
+
import { i as importChosenGraph } from "./choose-BbJI55dx.js";
|
|
9
8
|
const DOT_FORMAT = "dot";
|
|
10
9
|
const DOT_ORIGIN = Object.freeze({ format: DOT_FORMAT });
|
|
11
10
|
const CLUSTER_COLUMN = "graphty.cluster";
|
|
@@ -18,11 +17,17 @@ const KEY_ATTRIBUTE = "key";
|
|
|
18
17
|
const PIN_ATTRIBUTE = "pin";
|
|
19
18
|
const DOT_META_KEY = "dot";
|
|
20
19
|
const DOT_LOSS = Object.freeze({
|
|
21
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* An id, name or text with a backslash before a quote or a line break, or at its end, cannot be written as a DOT
|
|
22
|
+
* quoted string; the save fails.
|
|
23
|
+
*/
|
|
22
24
|
TRAILING_BACKSLASH: "E_DOT_TRAILING_BACKSLASH",
|
|
23
|
-
/**
|
|
25
|
+
/** NaN or an infinity has no DOT number spelling; it is written as text and reads back as text. */
|
|
24
26
|
NON_FINITE: "W_DOT_NON_FINITE",
|
|
25
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* A text value that reads back as a number or a boolean, because the format does not record that it was text (the
|
|
29
|
+
* text "42" reads back as the number 42).
|
|
30
|
+
*/
|
|
26
31
|
TEXT_INFERRED: LOSS.TEXT_INFERRED,
|
|
27
32
|
/** A plain column named like an attribute the exporter writes for a role (weight, key, pos) is not written. */
|
|
28
33
|
ATTRIBUTE_CLASH: "W_DOT_ATTRIBUTE_CLASH",
|
|
@@ -32,11 +37,14 @@ const DOT_LOSS = Object.freeze({
|
|
|
32
37
|
PARENTS_DROPPED: LOSS.PARENTS,
|
|
33
38
|
/** A position column that is not a node column of 2 or 3 components is not written. */
|
|
34
39
|
POSITION_SHAPE: "W_DOT_POSITION_SHAPE",
|
|
35
|
-
/** An id
|
|
40
|
+
/** An id that reads back as a different type, such as the decimal 1.5 as text or the text "1" as the number 1. */
|
|
36
41
|
ID_TEXT_TYPE: LOSS.ID_TEXT_TYPE,
|
|
37
42
|
/** A declared column whose every row is unset is not written (DOT writes cells, never declarations). */
|
|
38
43
|
EMPTY_COLUMN_DROPPED: LOSS.EMPTY_COLUMN,
|
|
39
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* An attribute without a role is written where the format keeps a role (for example, a `name` column as the label), and
|
|
46
|
+
* reads back with that role.
|
|
47
|
+
*/
|
|
40
48
|
ROLE_ASSUMED: LOSS.ROLE_ASSUMED,
|
|
41
49
|
/** A parent that is a plain node is written as a node and a cluster of one name; it reads back marked as a cluster. */
|
|
42
50
|
CLUSTER_MARKED: "W_DOT_CLUSTER_MARKED"
|
|
@@ -70,7 +78,7 @@ const CAPABILITIES = capabilities({
|
|
|
70
78
|
});
|
|
71
79
|
const DEFAULT_INDENT = " ";
|
|
72
80
|
const CLUSTER_PREFIX$1 = "cluster";
|
|
73
|
-
const COMPASS_POINTS = /* @__PURE__ */ new Set(["n", "ne", "e", "se", "s", "sw", "w", "nw", "c", "_"]);
|
|
81
|
+
const COMPASS_POINTS$1 = /* @__PURE__ */ new Set(["n", "ne", "e", "se", "s", "sw", "w", "nw", "c", "_"]);
|
|
74
82
|
const SKIPPED_NODE_ROLES = /* @__PURE__ */ new Set([
|
|
75
83
|
"parent",
|
|
76
84
|
"parents",
|
|
@@ -120,6 +128,7 @@ const SKIPPED_GRAPH_ROLES = /* @__PURE__ */ new Set(["position", "color", "size"
|
|
|
120
128
|
const TEXT_ROLES = /* @__PURE__ */ new Set(["label", "id", "sourcePort", "targetPort"]);
|
|
121
129
|
const dotExporter = Object.freeze({
|
|
122
130
|
format: DOT_FORMAT,
|
|
131
|
+
options: Object.freeze(["indent", "name", "strict"]),
|
|
123
132
|
capabilities: CAPABILITIES,
|
|
124
133
|
/**
|
|
125
134
|
* Pre-flight: every loss the DOT text would incur, without writing anything.
|
|
@@ -188,7 +197,7 @@ function writeId(text) {
|
|
|
188
197
|
}
|
|
189
198
|
function writePort(port) {
|
|
190
199
|
const colon = port.lastIndexOf(":");
|
|
191
|
-
if (colon > 0 && COMPASS_POINTS.has(port.slice(colon + 1))) {
|
|
200
|
+
if (colon > 0 && COMPASS_POINTS$1.has(port.slice(colon + 1))) {
|
|
192
201
|
return `:${quoteDotId(port.slice(0, colon))}:${port.slice(colon + 1)}`;
|
|
193
202
|
}
|
|
194
203
|
return `:${quoteDotId(port)}`;
|
|
@@ -196,6 +205,16 @@ function writePort(port) {
|
|
|
196
205
|
function isTextualDtype(column) {
|
|
197
206
|
return column.dtype !== "list" && column.dtype !== "json";
|
|
198
207
|
}
|
|
208
|
+
function badOption(option, found, expected) {
|
|
209
|
+
return new GraphFormatError(
|
|
210
|
+
"E_UNSUPPORTED",
|
|
211
|
+
`option ${option} of the DOT exporter: expected ${expected}, got ${JSON.stringify(found)}`,
|
|
212
|
+
{
|
|
213
|
+
option,
|
|
214
|
+
found
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
}
|
|
199
218
|
class ExportPlan {
|
|
200
219
|
/**
|
|
201
220
|
* Plan one export.
|
|
@@ -207,9 +226,16 @@ class ExportPlan {
|
|
|
207
226
|
this.extraNotes = [];
|
|
208
227
|
this.snapshot = snapshot;
|
|
209
228
|
this.resolved = resolved;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
229
|
+
const { indent, name, strict } = options ?? {};
|
|
230
|
+
if (name !== void 0 && name !== null && typeof name !== "string") {
|
|
231
|
+
throw badOption("name", name, "a string or null");
|
|
232
|
+
}
|
|
233
|
+
if (strict !== void 0 && typeof strict !== "boolean") {
|
|
234
|
+
throw badOption("strict", strict, "a boolean");
|
|
235
|
+
}
|
|
236
|
+
this.indent = indentUnit(indent, DEFAULT_INDENT);
|
|
237
|
+
this.name = name === void 0 ? snapshot.meta.name : name;
|
|
238
|
+
this.strict = strict ?? isStrictMeta(snapshot);
|
|
213
239
|
this.mixed = countMixedEdges(snapshot);
|
|
214
240
|
if (this.mixed > 0 && resolved.onMixedDirection !== "error") {
|
|
215
241
|
this.directed = resolved.onMixedDirection === "directed";
|
|
@@ -308,7 +334,7 @@ class ExportPlan {
|
|
|
308
334
|
if (unwritable > 0) {
|
|
309
335
|
note(
|
|
310
336
|
DOT_LOSS.TRAILING_BACKSLASH,
|
|
311
|
-
`${unwritable}
|
|
337
|
+
`${unwritable} ids, names or text values hold a backslash before a quote or a line break, or at the end, which a DOT quoted string cannot carry; the save fails`,
|
|
312
338
|
null,
|
|
313
339
|
unwritable
|
|
314
340
|
);
|
|
@@ -341,7 +367,7 @@ class ExportPlan {
|
|
|
341
367
|
if (bad > 0) {
|
|
342
368
|
note(
|
|
343
369
|
DOT_LOSS.NON_FINITE,
|
|
344
|
-
`${label} column "${column.meta.name}" holds ${bad} non-finite value(
|
|
370
|
+
`${label} column "${column.meta.name}" holds ${bad} non-finite value${plural(bad)} with no numeric DOT spelling; they read back as text`,
|
|
345
371
|
column.meta.name,
|
|
346
372
|
bad
|
|
347
373
|
);
|
|
@@ -352,7 +378,7 @@ class ExportPlan {
|
|
|
352
378
|
if (typed > 0) {
|
|
353
379
|
note(
|
|
354
380
|
DOT_LOSS.TEXT_INFERRED,
|
|
355
|
-
`${label} column "${column.meta.name}" holds ${typed} text value(
|
|
381
|
+
`${label} column "${column.meta.name}" holds ${typed} text value${plural(typed)} that look like numbers or booleans; DOT values are untyped and they read back as such`,
|
|
356
382
|
column.meta.name,
|
|
357
383
|
typed
|
|
358
384
|
);
|
|
@@ -370,7 +396,7 @@ class ExportPlan {
|
|
|
370
396
|
if (unmarked > 0) {
|
|
371
397
|
note(
|
|
372
398
|
DOT_LOSS.CLUSTER_MARKED,
|
|
373
|
-
`${unmarked} parent node(
|
|
399
|
+
`${unmarked} parent node${plural(unmarked)} ${agree(unmarked, "is", "are")} written as a node and a cluster of the same name and read back with "${CLUSTER_COLUMN}" true`,
|
|
374
400
|
CLUSTER_COLUMN,
|
|
375
401
|
unmarked
|
|
376
402
|
);
|
|
@@ -379,7 +405,7 @@ class ExportPlan {
|
|
|
379
405
|
if (mutual > 0) {
|
|
380
406
|
note(
|
|
381
407
|
DOT_LOSS.MUTUAL_EXPANDED,
|
|
382
|
-
`${mutual} mutual pair(
|
|
408
|
+
`${mutual} mutual pair${plural(mutual)} ${agree(mutual, "is", "are")} written as two directed edges each; the mutual mark is lost`,
|
|
383
409
|
null,
|
|
384
410
|
mutual
|
|
385
411
|
);
|
|
@@ -419,7 +445,7 @@ class ExportPlan {
|
|
|
419
445
|
if (textIds > 0) {
|
|
420
446
|
note(
|
|
421
447
|
DOT_LOSS.ID_TEXT_TYPE,
|
|
422
|
-
`${textIds} node id(
|
|
448
|
+
`${textIds} node id${plural(textIds)} ${agree(textIds, "reads", "read")} back as the other type under ids: "canonical" (a string "1" becomes 1, a number 1.5 becomes "1.5")`,
|
|
423
449
|
null,
|
|
424
450
|
textIds
|
|
425
451
|
);
|
|
@@ -434,7 +460,7 @@ class ExportPlan {
|
|
|
434
460
|
if (this.mixed > 0 && this.resolved.onMixedDirection === "error") {
|
|
435
461
|
throw new GraphFormatError(
|
|
436
462
|
"E_DIRECTED",
|
|
437
|
-
`${this.mixed} undirected edge(
|
|
463
|
+
`${this.mixed} undirected edge${plural(this.mixed)} in a directed graph, and DOT holds one direction per file, so the save fails unless onMixedDirection is "directed" or "undirected"`,
|
|
438
464
|
{ reason: LOSS.MIXED_DIRECTION_ERROR, count: this.mixed }
|
|
439
465
|
);
|
|
440
466
|
}
|
|
@@ -549,22 +575,22 @@ class ExportPlan {
|
|
|
549
575
|
}
|
|
550
576
|
emitted[i] = 1;
|
|
551
577
|
const pad = this.indent.repeat(depth);
|
|
552
|
-
const
|
|
578
|
+
const idText2 = this.idText(i);
|
|
553
579
|
const kids = this.children.childrenOf(i);
|
|
554
580
|
const marked = this.cluster !== null && this.cluster.isSet(i) && this.cluster.value(i) === true;
|
|
555
581
|
if (kids.length === 0 && !marked) {
|
|
556
|
-
yield `${pad}${this.nodeStatement(i,
|
|
582
|
+
yield `${pad}${this.nodeStatement(i, idText2)};
|
|
557
583
|
`;
|
|
558
584
|
return;
|
|
559
585
|
}
|
|
560
586
|
if (!marked) {
|
|
561
|
-
yield `${pad}${this.nodeStatement(i,
|
|
587
|
+
yield `${pad}${this.nodeStatement(i, idText2)};
|
|
562
588
|
`;
|
|
563
589
|
}
|
|
564
590
|
const inner = `${pad}${this.indent}`;
|
|
565
|
-
yield `${pad}subgraph ${writeId(
|
|
591
|
+
yield `${pad}subgraph ${writeId(idText2)} {
|
|
566
592
|
`;
|
|
567
|
-
if (!
|
|
593
|
+
if (!idText2.startsWith(CLUSTER_PREFIX$1)) {
|
|
568
594
|
yield `${inner}cluster=true;
|
|
569
595
|
`;
|
|
570
596
|
}
|
|
@@ -592,9 +618,9 @@ class ExportPlan {
|
|
|
592
618
|
* @param idText - the id text
|
|
593
619
|
* @returns `id` or `id [attrs]`
|
|
594
620
|
*/
|
|
595
|
-
nodeStatement(i,
|
|
621
|
+
nodeStatement(i, idText2) {
|
|
596
622
|
const attributes = this.nodeAttributes(i);
|
|
597
|
-
return attributes.length === 0 ? writeId(
|
|
623
|
+
return attributes.length === 0 ? writeId(idText2) : `${writeId(idText2)} [${attributes.join(", ")}]`;
|
|
598
624
|
}
|
|
599
625
|
/**
|
|
600
626
|
* The attributes of a node: its set cells plus `pos` from the position column.
|
|
@@ -717,12 +743,9 @@ class ExportPlan {
|
|
|
717
743
|
* @returns String(id)
|
|
718
744
|
*/
|
|
719
745
|
idText(i) {
|
|
720
|
-
return
|
|
746
|
+
return idText(this.snapshot.ids.idOf(i));
|
|
721
747
|
}
|
|
722
748
|
}
|
|
723
|
-
function idToText(id) {
|
|
724
|
-
return typeof id === "string" ? id : formatF64(id);
|
|
725
|
-
}
|
|
726
749
|
function isStrictMeta(snapshot) {
|
|
727
750
|
const dot = snapshot.meta.extra[DOT_META_KEY];
|
|
728
751
|
return typeof dot === "object" && dot !== null && dot.strict === true;
|
|
@@ -811,7 +834,7 @@ function countTextIds(snapshot) {
|
|
|
811
834
|
let count = 0;
|
|
812
835
|
for (let i = 0; i < ids.size; i++) {
|
|
813
836
|
const id = ids.idOf(i);
|
|
814
|
-
if (canonicalId(
|
|
837
|
+
if (canonicalId(idText(id)) !== id) {
|
|
815
838
|
count++;
|
|
816
839
|
}
|
|
817
840
|
}
|
|
@@ -831,10 +854,11 @@ class DotSyntaxError extends Error {
|
|
|
831
854
|
}
|
|
832
855
|
const EOF_TOKEN_TEXT = "";
|
|
833
856
|
function isIdentifierStart(c) {
|
|
834
|
-
return c >= 65 && c <= 90 || c >= 97 && c <= 122 || c === 95 || c >= 128;
|
|
857
|
+
return c >= 65 && c <= 90 || c >= 97 && c <= 122 || c === 95 || c >= 128 && c !== BOM_CODE;
|
|
835
858
|
}
|
|
859
|
+
const BOM_CODE = 65279;
|
|
836
860
|
function isIdentifierPart(c) {
|
|
837
|
-
return isIdentifierStart(c) || isDigit(c);
|
|
861
|
+
return isIdentifierStart(c) || isDigit(c) || c === BOM_CODE;
|
|
838
862
|
}
|
|
839
863
|
function isDigit(c) {
|
|
840
864
|
return c >= 48 && c <= 57;
|
|
@@ -957,7 +981,8 @@ class DotTokenizer {
|
|
|
957
981
|
}
|
|
958
982
|
this.pos = end;
|
|
959
983
|
const numeral = text.slice(start, end);
|
|
960
|
-
|
|
984
|
+
const after = text.charCodeAt(end);
|
|
985
|
+
if (end < text.length && (isIdentifierStart(after) || after === 46) && this.onAmbiguity !== null) {
|
|
961
986
|
this.onAmbiguity(numeral, line);
|
|
962
987
|
}
|
|
963
988
|
return { kind: "id", text: numeral, quoted: false, html: false, line };
|
|
@@ -1068,6 +1093,10 @@ class DotTokenizer {
|
|
|
1068
1093
|
this.pos++;
|
|
1069
1094
|
continue;
|
|
1070
1095
|
}
|
|
1096
|
+
if (c === BOM_CODE) {
|
|
1097
|
+
this.pos++;
|
|
1098
|
+
continue;
|
|
1099
|
+
}
|
|
1071
1100
|
if (c === 47) {
|
|
1072
1101
|
const d = text.charCodeAt(this.pos + 1);
|
|
1073
1102
|
if (d === 47) {
|
|
@@ -1128,24 +1157,41 @@ class DotTokenizer {
|
|
|
1128
1157
|
}
|
|
1129
1158
|
}
|
|
1130
1159
|
const DOT_ISSUE = Object.freeze({
|
|
1131
|
-
|
|
1160
|
+
...INPUT_ISSUE,
|
|
1161
|
+
...ELEMENT_ISSUE,
|
|
1162
|
+
/** The text breaks DOT's syntax; the message says where. The import stops. */
|
|
1132
1163
|
SYNTAX: SYNTAX_CODE,
|
|
1133
|
-
/** The input holds no graph
|
|
1164
|
+
/** The input holds no graph: it is empty or only comments. The import stops. */
|
|
1134
1165
|
EMPTY_INPUT: EMPTY_INPUT_CODE,
|
|
1135
|
-
/** The input
|
|
1166
|
+
/** The input is not valid UTF-8. The import stops. */
|
|
1136
1167
|
INVALID_UTF8: INVALID_UTF8_CODE,
|
|
1137
|
-
/**
|
|
1168
|
+
/**
|
|
1169
|
+
* Some bytes are not valid in the encoding that was chosen (by a byte order mark, the file's declaration or the
|
|
1170
|
+
* `encoding` option). The import stops.
|
|
1171
|
+
*/
|
|
1138
1172
|
INVALID_ENCODING: INVALID_ENCODING_CODE,
|
|
1139
1173
|
/** Bytes that are not UTF-8 and declare no encoding were read as windows-1252. */
|
|
1140
1174
|
ENCODING_FALLBACK: ENCODING_FALLBACK_CODE,
|
|
1141
1175
|
/** A declared encoding the platform cannot decode was ignored. */
|
|
1142
1176
|
UNKNOWN_ENCODING: UNKNOWN_ENCODING_CODE,
|
|
1143
|
-
/**
|
|
1177
|
+
/** A declared encoding the byte order mark contradicts (the mark wins). */
|
|
1178
|
+
ENCODING_CONFLICT: ENCODING_CONFLICT_CODE,
|
|
1179
|
+
/** Subgraphs or braces are nested deeper than graph-io reads. The import stops. */
|
|
1144
1180
|
NESTING: "E_DOT_NESTING",
|
|
1145
|
-
/**
|
|
1181
|
+
/**
|
|
1182
|
+
* An edge operator contradicting the graph keyword, read under mismatchedEdgeOperator "operator" or "header".
|
|
1183
|
+
* Under "error" the import stops with E_SYNTAX instead.
|
|
1184
|
+
*/
|
|
1146
1185
|
EDGE_OPERATOR: "W_DOT_EDGE_OPERATOR",
|
|
1147
|
-
/**
|
|
1186
|
+
/**
|
|
1187
|
+
* The file holds several graphs and only the first was read. It is not added when `graphIndex` or `graphName` chose the graph.
|
|
1188
|
+
* `importAllGraphs()` reads every one.
|
|
1189
|
+
*/
|
|
1148
1190
|
MULTIPLE_GRAPHS: MULTIPLE_GRAPHS_CODE,
|
|
1191
|
+
/** `graphIndex` or `graphName` names no graph of the file; the message lists the graphs it holds. The import stops. */
|
|
1192
|
+
GRAPH_NOT_FOUND: GRAPH_NOT_FOUND_CODE,
|
|
1193
|
+
/** `graphName` matches more than one graph; pass `graphIndex`. The import stops. */
|
|
1194
|
+
AMBIGUOUS_GRAPH_NAME: AMBIGUOUS_GRAPH_NAME_CODE,
|
|
1149
1195
|
/** A badly delimited numeral (`1e3`) split into two tokens, as Graphviz does with a warning. */
|
|
1150
1196
|
NUMERAL_AMBIGUITY: "W_DOT_NUMERAL_AMBIGUITY",
|
|
1151
1197
|
/** Attributes of a subgraph that is not a cluster (rank=same and the like) cannot be represented. */
|
|
@@ -1156,29 +1202,58 @@ const DOT_ISSUE = Object.freeze({
|
|
|
1156
1202
|
CLUSTER_NODE_MERGED: "W_DOT_CLUSTER_NODE_MERGED",
|
|
1157
1203
|
/** A node mentioned in two unrelated clusters keeps the first. */
|
|
1158
1204
|
CLUSTER_CONFLICT: "W_DOT_CLUSTER_CONFLICT",
|
|
1159
|
-
/** A node `pos`
|
|
1205
|
+
/** A node's `pos` is not a point, or is too large for a 32-bit float position; the value was dropped. */
|
|
1160
1206
|
BAD_POS: "W_DOT_BAD_POS",
|
|
1207
|
+
/** Node `pos` values mix two and three coordinates; the position column records the first's. */
|
|
1208
|
+
POS_DIMS: "W_DOT_POS_DIMS",
|
|
1209
|
+
/** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: "string"` to keep every digit. */
|
|
1210
|
+
PRECISION: PRECISION_CODE,
|
|
1211
|
+
/** The same attribute twice in one statement's attribute lists; the last value stands, as in Graphviz. */
|
|
1212
|
+
DUPLICATE_ATTRIBUTE: DUPLICATE_ATTRIBUTE_CODE,
|
|
1213
|
+
/** The second part of a port (`a:p:zz`) is not a compass point; kept as written, as Graphviz warns. */
|
|
1214
|
+
COMPASS_POINT: "W_DOT_COMPASS_POINT",
|
|
1215
|
+
/** A `charset` attribute beyond the head the decoder reads it from; the input was decoded without it. */
|
|
1216
|
+
LATE_CHARSET: "W_DOT_LATE_CHARSET",
|
|
1161
1217
|
/** A parallel edge merged into an earlier one under `strict`. */
|
|
1162
1218
|
STRICT_MERGED: "W_DOT_STRICT_MERGED",
|
|
1163
1219
|
/** An edge merged into an earlier one with the same endpoints and `key`. */
|
|
1164
1220
|
KEY_MERGED: "W_DOT_KEY_MERGED",
|
|
1165
|
-
/**
|
|
1221
|
+
/**
|
|
1222
|
+
* You read into a graph builder that already has an id, label or position attribute, so this file's one is kept as
|
|
1223
|
+
* a plain attribute.
|
|
1224
|
+
*/
|
|
1166
1225
|
ROLE_TAKEN: ROLE_TAKEN_CODE,
|
|
1167
|
-
/**
|
|
1226
|
+
/**
|
|
1227
|
+
* An attribute was renamed `<name>#<suffix>` because another attribute already has its name, for example
|
|
1228
|
+
* two attributes declared with the same name.
|
|
1229
|
+
*/
|
|
1168
1230
|
COLUMN_RENAMED: COLUMN_RENAMED_CODE,
|
|
1169
|
-
/**
|
|
1231
|
+
/** You set an option this format does not use; it had no effect. The message names the option. */
|
|
1170
1232
|
OPTION_IGNORED: OPTION_IGNORED_CODE,
|
|
1171
|
-
/** Two
|
|
1233
|
+
/** Two different id texts became the same number because `ids` is "number", so their nodes were merged. */
|
|
1172
1234
|
ID_MERGED: ID_MERGED_CODE,
|
|
1173
|
-
/**
|
|
1235
|
+
/**
|
|
1236
|
+
* You read into your own graph builder, which was created with a different `addMissingNodes`, `duplicateEdges`,
|
|
1237
|
+
* `selfLoops` or `weightDtype` than the option you passed; the builder's setting applies.
|
|
1238
|
+
*/
|
|
1174
1239
|
SINK_OPTION: SINK_OPTION_CODE,
|
|
1175
|
-
/**
|
|
1240
|
+
/**
|
|
1241
|
+
* You read into a graph builder whose direction is already set, or which already holds edges, so the file is read
|
|
1242
|
+
* with the builder's direction instead of its own.
|
|
1243
|
+
*/
|
|
1176
1244
|
DIRECTION_REFUSED: DIRECTION_REFUSED_CODE,
|
|
1177
|
-
/** Edges
|
|
1245
|
+
/** Edges of the other direction were read with the direction `onMixedDirection` chose. */
|
|
1178
1246
|
DIRECTION_FORCED: DIRECTION_FORCED_CODE,
|
|
1179
|
-
/**
|
|
1247
|
+
/**
|
|
1248
|
+
* The graph has both directed and undirected edges and `onMixedDirection` is "error". An import stops; a save to a
|
|
1249
|
+
* format that holds one direction per file fails with E_DIRECTED. Pass "directed" or "undirected" to read or write
|
|
1250
|
+
* it anyway.
|
|
1251
|
+
*/
|
|
1180
1252
|
MIXED_DIRECTION: MIXED_DIRECTION_CODE,
|
|
1181
|
-
/**
|
|
1253
|
+
/**
|
|
1254
|
+
* Your graph builder cannot change an attribute's type after its first value, so a text column keeps the type of
|
|
1255
|
+
* its first values.
|
|
1256
|
+
*/
|
|
1182
1257
|
WIDENING_UNSUPPORTED: WIDENING_UNSUPPORTED_CODE
|
|
1183
1258
|
});
|
|
1184
1259
|
const USED_OPTIONS = /* @__PURE__ */ new Set([
|
|
@@ -1202,9 +1277,14 @@ const STATEMENTS_PER_ABORT_CHECK = 64;
|
|
|
1202
1277
|
const MAX_ANCESTOR_WALK = 4096;
|
|
1203
1278
|
const DOT_HEADER = /^\s*(strict\s+)?(di)?graph(?=[\s{"/]|$)(?!\s*\[)/i;
|
|
1204
1279
|
const TRUE_TEXTS = /* @__PURE__ */ new Set(["true", "yes", "1"]);
|
|
1205
|
-
const
|
|
1280
|
+
const COMPASS_POINTS = /* @__PURE__ */ new Set(["n", "ne", "e", "se", "s", "sw", "w", "nw", "c", "_"]);
|
|
1281
|
+
const POINT_NUMBER = String.raw`[-+]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][-+]?\d+)?`;
|
|
1282
|
+
const POINT_TEXT = new RegExp(
|
|
1283
|
+
String.raw`^\s*(${POINT_NUMBER})\s*,\s*(${POINT_NUMBER})(?:\s*,\s*(${POINT_NUMBER}))?\s*(?:(!)\s*)?$`
|
|
1284
|
+
);
|
|
1206
1285
|
const dotImporter = Object.freeze({
|
|
1207
1286
|
format: DOT_FORMAT,
|
|
1287
|
+
options: Object.freeze(["mismatchedEdgeOperator", "positions"]),
|
|
1208
1288
|
extensions: EXTENSIONS,
|
|
1209
1289
|
mimeTypes: MIME_TYPES,
|
|
1210
1290
|
/**
|
|
@@ -1229,6 +1309,9 @@ const dotImporter = Object.freeze({
|
|
|
1229
1309
|
* @returns the import report; ImportError (E_IMPORT) on a syntax error or beyond the error limit
|
|
1230
1310
|
*/
|
|
1231
1311
|
async import(input, sink, options) {
|
|
1312
|
+
if (graphChosen(options)) {
|
|
1313
|
+
return importChosenGraph(dotImporter, input, sink, options);
|
|
1314
|
+
}
|
|
1232
1315
|
const resolved = resolveImportOptions(options, {
|
|
1233
1316
|
ids: "canonical",
|
|
1234
1317
|
defaultDirected: true,
|
|
@@ -1238,21 +1321,24 @@ const dotImporter = Object.freeze({
|
|
|
1238
1321
|
const report = new ImportReportBuilder(DOT_FORMAT, resolved.errorLimit);
|
|
1239
1322
|
reportUnusedOptions(options, report, USED_OPTIONS);
|
|
1240
1323
|
reportSinkOptions(sink, options, report);
|
|
1241
|
-
const
|
|
1324
|
+
const head = {};
|
|
1325
|
+
const text = await readText(input, report, {
|
|
1326
|
+
...resolved,
|
|
1327
|
+
declaredEncoding: (h) => head.charset = dotCharset(h),
|
|
1328
|
+
declarationBytes: CHARSET_HEAD_BYTES
|
|
1329
|
+
});
|
|
1242
1330
|
const reports = { current: report };
|
|
1243
1331
|
const lexer = dotLexer(text, reports);
|
|
1244
1332
|
const first = guard(report, () => lexer.next());
|
|
1245
|
-
const
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
first
|
|
1249
|
-
);
|
|
1333
|
+
const parser = new DotParser(lexer, sink, report, resolved, mismatch, options?.positions !== false);
|
|
1334
|
+
parser.headCharset = head.charset;
|
|
1335
|
+
const trailing = parseGraph(parser, report, first);
|
|
1250
1336
|
if (trailing.kind !== "eof") {
|
|
1251
1337
|
const skipped = guard(report, () => countGraphs(lexer, trailing));
|
|
1252
1338
|
report.warning(
|
|
1253
1339
|
"unsupported",
|
|
1254
1340
|
MULTIPLE_GRAPHS_CODE,
|
|
1255
|
-
`the input holds ${skipped} more graph(
|
|
1341
|
+
`the input holds ${skipped} more graph${plural(skipped)} after the first; the first is read (graphIndex or graphName chooses another; importAllGraphs() reads every one)`,
|
|
1256
1342
|
{ line: trailing.line }
|
|
1257
1343
|
);
|
|
1258
1344
|
}
|
|
@@ -1275,7 +1361,12 @@ const dotImporter = Object.freeze({
|
|
|
1275
1361
|
const mismatch = mismatchOption(options?.mismatchedEdgeOperator);
|
|
1276
1362
|
const first = new ImportReportBuilder(DOT_FORMAT, resolved.errorLimit);
|
|
1277
1363
|
reportUnusedOptions(options, first, USED_OPTIONS);
|
|
1278
|
-
const
|
|
1364
|
+
const head = {};
|
|
1365
|
+
const text = await readText(input, first, {
|
|
1366
|
+
...resolved,
|
|
1367
|
+
declaredEncoding: (h) => head.charset = dotCharset(h),
|
|
1368
|
+
declarationBytes: CHARSET_HEAD_BYTES
|
|
1369
|
+
});
|
|
1279
1370
|
const reports = { current: first };
|
|
1280
1371
|
const lexer = dotLexer(text, reports);
|
|
1281
1372
|
const done = [];
|
|
@@ -1285,11 +1376,9 @@ const dotImporter = Object.freeze({
|
|
|
1285
1376
|
reports.current = report;
|
|
1286
1377
|
const sink = sinkFor(done.length);
|
|
1287
1378
|
reportSinkOptions(sink, options, report);
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
token
|
|
1292
|
-
);
|
|
1379
|
+
const parser = new DotParser(lexer, sink, report, resolved, mismatch, options?.positions !== false);
|
|
1380
|
+
parser.headCharset = head.charset;
|
|
1381
|
+
token = parseGraph(parser, report, token);
|
|
1293
1382
|
throwIfAborted(resolved.signal);
|
|
1294
1383
|
done.push(report.finish());
|
|
1295
1384
|
} while (token.kind !== "eof");
|
|
@@ -1326,6 +1415,9 @@ function countGraphs(lexer, first) {
|
|
|
1326
1415
|
if (isKeyword(token, "strict")) {
|
|
1327
1416
|
token = lexer.next();
|
|
1328
1417
|
}
|
|
1418
|
+
if (isPunct(token, "}")) {
|
|
1419
|
+
throw new DotSyntaxError('unexpected "}" after the end of the graph: no "{" is open', token.line);
|
|
1420
|
+
}
|
|
1329
1421
|
if (!isKeyword(token, "graph") && !isKeyword(token, "digraph")) {
|
|
1330
1422
|
throw new DotSyntaxError(`expected "graph" or "digraph", found ${describeToken(token)}`, token.line);
|
|
1331
1423
|
}
|
|
@@ -1352,10 +1444,35 @@ function countGraphs(lexer, first) {
|
|
|
1352
1444
|
}
|
|
1353
1445
|
return count;
|
|
1354
1446
|
}
|
|
1355
|
-
const
|
|
1447
|
+
const CHARSET_HEAD_BYTES = 64 * 1024;
|
|
1356
1448
|
function dotCharset(head) {
|
|
1357
|
-
const
|
|
1358
|
-
|
|
1449
|
+
const lexer = new DotTokenizer(head);
|
|
1450
|
+
let list = null;
|
|
1451
|
+
let previous = null;
|
|
1452
|
+
try {
|
|
1453
|
+
let token = lexer.next();
|
|
1454
|
+
while (token.kind !== "eof") {
|
|
1455
|
+
if (isPunct(token, "[")) {
|
|
1456
|
+
list = previous !== null && isKeyword(previous, "graph") ? "graph" : "other";
|
|
1457
|
+
} else if (isPunct(token, "]")) {
|
|
1458
|
+
list = null;
|
|
1459
|
+
} else if (list !== "other" && isKeyword(token, "charset")) {
|
|
1460
|
+
const equals = lexer.next();
|
|
1461
|
+
const value = isPunct(equals, "=") ? lexer.next() : equals;
|
|
1462
|
+
if (value !== equals && value.kind === "id") {
|
|
1463
|
+
return value.text.replace(/^(latin|big)-/i, "$1");
|
|
1464
|
+
}
|
|
1465
|
+
token = value;
|
|
1466
|
+
}
|
|
1467
|
+
previous = token;
|
|
1468
|
+
token = lexer.next();
|
|
1469
|
+
}
|
|
1470
|
+
} catch (err) {
|
|
1471
|
+
if (!(err instanceof DotSyntaxError)) {
|
|
1472
|
+
throw err;
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
return null;
|
|
1359
1476
|
}
|
|
1360
1477
|
function mismatchOption(value) {
|
|
1361
1478
|
if (value === void 0) {
|
|
@@ -1440,6 +1557,8 @@ class DotParser {
|
|
|
1440
1557
|
this.sourcePortHandle = INVALID_INDEX;
|
|
1441
1558
|
this.targetPortHandle = INVALID_INDEX;
|
|
1442
1559
|
this.depth = 0;
|
|
1560
|
+
this.posDims = 0;
|
|
1561
|
+
this.headCharset = void 0;
|
|
1443
1562
|
this.nodeWriters = /* @__PURE__ */ new Map();
|
|
1444
1563
|
this.edgeWriters = /* @__PURE__ */ new Map();
|
|
1445
1564
|
this.lexer = lexer;
|
|
@@ -1632,7 +1751,16 @@ class DotParser {
|
|
|
1632
1751
|
let { text } = this.identifier();
|
|
1633
1752
|
if (isPunct(lexer.peek(), ":")) {
|
|
1634
1753
|
lexer.next();
|
|
1635
|
-
|
|
1754
|
+
const compass = this.identifier();
|
|
1755
|
+
text += `:${compass.text}`;
|
|
1756
|
+
if (!COMPASS_POINTS.has(compass.text)) {
|
|
1757
|
+
this.report.warning(
|
|
1758
|
+
"validation-error",
|
|
1759
|
+
DOT_ISSUE.COMPASS_POINT,
|
|
1760
|
+
`port ${JSON.stringify(text)}: ${JSON.stringify(compass.text)} is not a compass point (n, ne, e, se, s, sw, w, nw, c, _); the port is kept as written`,
|
|
1761
|
+
{ line: compass.line, element: text }
|
|
1762
|
+
);
|
|
1763
|
+
}
|
|
1636
1764
|
}
|
|
1637
1765
|
return text;
|
|
1638
1766
|
}
|
|
@@ -1872,6 +2000,7 @@ class DotParser {
|
|
|
1872
2000
|
attributeList() {
|
|
1873
2001
|
const { lexer } = this;
|
|
1874
2002
|
const out = [];
|
|
2003
|
+
const names = /* @__PURE__ */ new Set();
|
|
1875
2004
|
while (isPunct(lexer.peek(), "[")) {
|
|
1876
2005
|
lexer.next();
|
|
1877
2006
|
for (; ; ) {
|
|
@@ -1893,6 +2022,15 @@ class DotParser {
|
|
|
1893
2022
|
);
|
|
1894
2023
|
}
|
|
1895
2024
|
const value = this.identifier();
|
|
2025
|
+
if (names.has(name.text)) {
|
|
2026
|
+
this.report.warning(
|
|
2027
|
+
"merged",
|
|
2028
|
+
DOT_ISSUE.DUPLICATE_ATTRIBUTE,
|
|
2029
|
+
`attribute ${JSON.stringify(name.text)} is set twice in one statement; the last value ${JSON.stringify(value.text)} stands`,
|
|
2030
|
+
{ line: name.line, element: name.text }
|
|
2031
|
+
);
|
|
2032
|
+
}
|
|
2033
|
+
names.add(name.text);
|
|
1896
2034
|
out.push({ name: name.text, value: value.text, line: name.line });
|
|
1897
2035
|
}
|
|
1898
2036
|
}
|
|
@@ -1991,7 +2129,7 @@ class DotParser {
|
|
|
1991
2129
|
this.report.warnOnce(
|
|
1992
2130
|
"coercion",
|
|
1993
2131
|
DOT_ISSUE.EDGE_OPERATOR,
|
|
1994
|
-
`${message}; read with the operator's direction and
|
|
2132
|
+
`${message}; read with the operator's direction, and onMixedDirection decides how the mixed graph is stored`,
|
|
1995
2133
|
{ line: op.line }
|
|
1996
2134
|
);
|
|
1997
2135
|
return operatorDirected ? "directed" : "undirected";
|
|
@@ -2084,7 +2222,7 @@ class DotParser {
|
|
|
2084
2222
|
const weightText = weightFrom === null ? void 0 : effective.get(weightFrom);
|
|
2085
2223
|
if (weightText !== void 0) {
|
|
2086
2224
|
try {
|
|
2087
|
-
weight = parseWeightText(weightText);
|
|
2225
|
+
weight = parseWeightText(weightText, this.report);
|
|
2088
2226
|
} catch (err) {
|
|
2089
2227
|
this.report.recordError(err, where);
|
|
2090
2228
|
this.report.counts.skippedEdges++;
|
|
@@ -2232,6 +2370,17 @@ class DotParser {
|
|
|
2232
2370
|
* @param attribute - the attribute
|
|
2233
2371
|
*/
|
|
2234
2372
|
setGraphAttribute(attribute) {
|
|
2373
|
+
if (attribute.name.toLowerCase() === "charset" && this.headCharset === null) {
|
|
2374
|
+
const canonical = canonicalEncoding(attribute.value);
|
|
2375
|
+
if (canonical !== "utf-8") {
|
|
2376
|
+
this.report.warning(
|
|
2377
|
+
"unsupported",
|
|
2378
|
+
DOT_ISSUE.LATE_CHARSET,
|
|
2379
|
+
`charset ${JSON.stringify(attribute.value)} is declared beyond the first 1024 bytes, after the input was decoded without it; pass the encoding option to decode it as declared`,
|
|
2380
|
+
{ line: attribute.line, element: attribute.name }
|
|
2381
|
+
);
|
|
2382
|
+
}
|
|
2383
|
+
}
|
|
2235
2384
|
try {
|
|
2236
2385
|
if (attribute.name === LABEL_ATTRIBUTE) {
|
|
2237
2386
|
this.sink.setGraphValue(attribute.name, attribute.value, { dtype: "string", origin: DOT_ORIGIN });
|
|
@@ -2267,7 +2416,36 @@ class DotParser {
|
|
|
2267
2416
|
const y = Number(match[2]);
|
|
2268
2417
|
const z = match[3] === void 0 ? 0 : Number(match[3]);
|
|
2269
2418
|
const dims = match[3] === void 0 ? 2 : 3;
|
|
2270
|
-
|
|
2419
|
+
const point = [x, y, z];
|
|
2420
|
+
if (point.some((v) => !Number.isFinite(Math.fround(v)))) {
|
|
2421
|
+
this.report.warning(
|
|
2422
|
+
"validation-error",
|
|
2423
|
+
DOT_ISSUE.BAD_POS,
|
|
2424
|
+
`pos ${JSON.stringify(text)} is beyond the f32 range of the position column; dropped`,
|
|
2425
|
+
{ line, element }
|
|
2426
|
+
);
|
|
2427
|
+
return;
|
|
2428
|
+
}
|
|
2429
|
+
if (!point.every(survivesF32)) {
|
|
2430
|
+
this.report.warnOnce(
|
|
2431
|
+
"precision",
|
|
2432
|
+
DOT_ISSUE.PRECISION,
|
|
2433
|
+
`pos ${JSON.stringify(text)} has a coordinate the f32 position column rounds (warned once; positions=false keeps pos as written)`,
|
|
2434
|
+
{ line, element },
|
|
2435
|
+
`${DOT_ISSUE.PRECISION}:pos`
|
|
2436
|
+
);
|
|
2437
|
+
}
|
|
2438
|
+
if (this.posDims === 0) {
|
|
2439
|
+
this.posDims = dims;
|
|
2440
|
+
} else if (dims !== this.posDims) {
|
|
2441
|
+
this.report.warnOnce(
|
|
2442
|
+
"validation-error",
|
|
2443
|
+
DOT_ISSUE.POS_DIMS,
|
|
2444
|
+
`pos values mix ${this.posDims} and ${dims} coordinates; the position column records sourceDims ${this.posDims}`,
|
|
2445
|
+
{ line, element }
|
|
2446
|
+
);
|
|
2447
|
+
}
|
|
2448
|
+
this.sink.setNodeValue(this.positionColumn(dims), index, point);
|
|
2271
2449
|
if (match[4] === "!") {
|
|
2272
2450
|
this.sink.setNodeValue(PIN_ATTRIBUTE, index, true);
|
|
2273
2451
|
}
|
|
@@ -2464,4 +2642,4 @@ export {
|
|
|
2464
2642
|
dotImporter as b,
|
|
2465
2643
|
dotExporter as d
|
|
2466
2644
|
};
|
|
2467
|
-
//# sourceMappingURL=importer-
|
|
2645
|
+
//# sourceMappingURL=importer-BfIsp1f9.js.map
|