@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
package/src/sniff.ts
CHANGED
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
* any combination of a filename (its extension), a MIME type and the first bytes of the content.
|
|
5
5
|
*
|
|
6
6
|
* Every importer declares `extensions`, `mimeTypes` and a `sniff(head)` content confidence in
|
|
7
|
-
* 0..1
|
|
7
|
+
* 0..1; this module combines them into one ranked answer so that content
|
|
8
8
|
* always beats a hint: a `.csv` whose first line is a neo4j-admin header is Neo4j, a `.xml` is
|
|
9
9
|
* GEXF or GraphML by its root element, a `.txt` holding `graph [` is GML. The confidence of a
|
|
10
10
|
* candidate is
|
|
11
11
|
*
|
|
12
12
|
* - `0.5 + 0.35 * content + 0.1 * [extension matches] + 0.05 * [MIME type matches]` when the
|
|
13
|
-
* importer
|
|
13
|
+
* importer recognizes the content (`content > 0`), so a content match always scores at least
|
|
14
14
|
* 0.5 and at most 1;
|
|
15
|
+
* - `0.25 * content + 0.05 * [MIME type matches]` for a weak content match (content below 0.5,
|
|
16
|
+
* such as plain delimited text read as CSV) when the file name's extension belongs to another
|
|
17
|
+
* format, so that format wins;
|
|
15
18
|
* - `0.3 * [extension matches] + 0.1 * [MIME type matches]` when the content is absent or the
|
|
16
19
|
* importer rejects it, so a hint alone never reaches 0.5;
|
|
17
20
|
* - nothing (the format is not a candidate) otherwise.
|
|
@@ -24,7 +27,10 @@
|
|
|
24
27
|
import { type JsonImportDialect, sniffJsonDialect } from "./formats/json/dialect.js";
|
|
25
28
|
import { type GraphImporter } from "./types.js";
|
|
26
29
|
|
|
27
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* The names of the built-in formats.
|
|
32
|
+
* @category Formats and detection
|
|
33
|
+
*/
|
|
28
34
|
export type GraphFormatName =
|
|
29
35
|
| "gexf"
|
|
30
36
|
| "graphml"
|
|
@@ -40,10 +46,22 @@ export type GraphFormatName =
|
|
|
40
46
|
| "obo"
|
|
41
47
|
| "cys";
|
|
42
48
|
|
|
49
|
+
/**
|
|
50
|
+
* A format name: one of the built-in names (with editor autocomplete) or the name of a format you
|
|
51
|
+
* registered yourself.
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* const format: FormatName = "pajek"; // or "my-format" after registry.registerImporter(myImporter)
|
|
55
|
+
* ```
|
|
56
|
+
* @category Formats and detection
|
|
57
|
+
*/
|
|
58
|
+
export type FormatName = GraphFormatName | (string & {}); // NOSONAR(S4335): keeps editor completion of the built-in names
|
|
59
|
+
|
|
43
60
|
/**
|
|
44
61
|
* The built-in format names in the default registry's order, which is also the tie-break order of
|
|
45
62
|
* sniffing: the more common format wins an extension two formats claim (`.xml` GraphML before GEXF,
|
|
46
63
|
* `.csv` CSV before Neo4j) when the content does not decide.
|
|
64
|
+
* @category Formats and detection
|
|
47
65
|
*/
|
|
48
66
|
export const GRAPH_FORMATS: readonly GraphFormatName[] = Object.freeze([
|
|
49
67
|
"json",
|
|
@@ -61,24 +79,36 @@ export const GRAPH_FORMATS: readonly GraphFormatName[] = Object.freeze([
|
|
|
61
79
|
"cys",
|
|
62
80
|
]);
|
|
63
81
|
|
|
64
|
-
/**
|
|
82
|
+
/** Content confidence below this is a weak guess, which loses to a file extension another format claims. */
|
|
83
|
+
const WEAK_CONTENT = 0.5;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* How many bytes of the input the sniffers look at; the registry reads no more than this before deciding.
|
|
87
|
+
* @category Formats and detection
|
|
88
|
+
*/
|
|
65
89
|
export const SNIFF_HEAD_BYTES = 8192;
|
|
66
90
|
|
|
67
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* What is known about an input before it is read.
|
|
93
|
+
* @category Formats and detection
|
|
94
|
+
*/
|
|
68
95
|
export interface SniffHints {
|
|
69
96
|
/** A file name or path; only its extension is used. */
|
|
70
97
|
readonly filename?: string | null | undefined;
|
|
71
98
|
/** A MIME type, with or without parameters (`text/csv; charset=utf-8`). */
|
|
72
99
|
readonly mimeType?: string | null | undefined;
|
|
73
|
-
/** The first bytes (or characters) of the content. */
|
|
100
|
+
/** The first bytes (or characters) of the content; detection reads at most SNIFF_HEAD_BYTES of it. */
|
|
74
101
|
readonly head?: Uint8Array | string | null | undefined;
|
|
75
102
|
}
|
|
76
103
|
|
|
77
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* One ranked candidate of a sniff.
|
|
106
|
+
* @category Formats and detection
|
|
107
|
+
*/
|
|
78
108
|
export interface SniffResult {
|
|
79
109
|
/** The importer's format name. */
|
|
80
110
|
readonly format: string;
|
|
81
|
-
/** The combined confidence in 0..1
|
|
111
|
+
/** The combined confidence in 0..1: at least 0.5 when the content was clearly recognized, at most 0.4 from a name or MIME type alone. */
|
|
82
112
|
readonly confidence: number;
|
|
83
113
|
/** The importer's own content confidence, 0 when no head was given or it rejected the head. */
|
|
84
114
|
readonly content: number;
|
|
@@ -91,12 +121,35 @@ export interface SniffResult {
|
|
|
91
121
|
}
|
|
92
122
|
|
|
93
123
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
124
|
+
* Where the query or fragment of a name starts: at the first `?` or `#` of a URL; in a plain name, at
|
|
125
|
+
* the first `?` or `#` that no dot follows.
|
|
126
|
+
* @param filename - the name, path or URL
|
|
127
|
+
* @param url - whether the name is a URL
|
|
128
|
+
* @returns the offset, or the name's length when it has neither
|
|
129
|
+
*/
|
|
130
|
+
function queryStart(filename: string, url: boolean): number {
|
|
131
|
+
const from = url ? 0 : filename.lastIndexOf(".") + 1;
|
|
132
|
+
for (let i = from; i < filename.length; i++) {
|
|
133
|
+
if (filename[i] === "?" || filename[i] === "#") {
|
|
134
|
+
return i;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return filename.length;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The lower-cased extension of a file name, path or URL, with its dot. A URL's `?query` and
|
|
142
|
+
* `#fragment` are not part of it; in a plain name, `?` and `#` are ordinary characters (`net#2.gexf`)
|
|
143
|
+
* unless no dot follows them (`g.graphml#v2`).
|
|
144
|
+
* @param filename - the name, path or URL
|
|
96
145
|
* @returns the extension (`.gexf`), or null when the name has none
|
|
146
|
+
* @category Formats and detection
|
|
97
147
|
*/
|
|
98
148
|
export function extensionOf(filename: string): string | null {
|
|
99
|
-
|
|
149
|
+
// a scheme of two or more letters, so a Windows drive (`C:`) is not one
|
|
150
|
+
const url = /^[a-z][a-z\d+.-]+:/i.test(filename);
|
|
151
|
+
const path = filename.slice(0, queryStart(filename, url));
|
|
152
|
+
const base = path.slice(Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\")) + 1);
|
|
100
153
|
const dot = base.lastIndexOf(".");
|
|
101
154
|
if (dot <= 0 || dot === base.length - 1) {
|
|
102
155
|
return null;
|
|
@@ -108,6 +161,7 @@ export function extensionOf(filename: string): string | null {
|
|
|
108
161
|
* A MIME type without parameters, lower-cased, for comparison with an importer's list.
|
|
109
162
|
* @param mimeType - the type as received (`Text/CSV; charset=utf-8`)
|
|
110
163
|
* @returns the bare type (`text/csv`)
|
|
164
|
+
* @category Plugin helpers
|
|
111
165
|
*/
|
|
112
166
|
export function normalizeMimeType(mimeType: string): string {
|
|
113
167
|
const semicolon = mimeType.indexOf(";");
|
|
@@ -119,6 +173,7 @@ export function normalizeMimeType(mimeType: string): string {
|
|
|
119
173
|
* encoded as UTF-8, a UTF-16 head with a byte order mark transcoded to UTF-8.
|
|
120
174
|
* @param head - the head as given
|
|
121
175
|
* @returns the bytes
|
|
176
|
+
* @category Plugin helpers
|
|
122
177
|
*/
|
|
123
178
|
export function headBytes(head: Uint8Array | string): Uint8Array {
|
|
124
179
|
if (typeof head === "string") {
|
|
@@ -133,32 +188,39 @@ export function headBytes(head: Uint8Array | string): Uint8Array {
|
|
|
133
188
|
}
|
|
134
189
|
|
|
135
190
|
/**
|
|
136
|
-
* Rank
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
191
|
+
* Rank a list of importers for an input. Most callers want `registry.sniffAll(hints)`, which passes
|
|
192
|
+
* the registered importers for you. An importer is a candidate when it recognizes the content or
|
|
193
|
+
* its extension or MIME type matches. A content match scores 0.5 to 1 (more with a matching
|
|
194
|
+
* extension or MIME type); a name or MIME type alone scores at most 0.4; a weak content guess (a
|
|
195
|
+
* confidence below 0.5 from the importer, such as plain delimited text for CSV) scores below 0.25
|
|
196
|
+
* when the file's extension belongs to another format. Ties go to the importer listed first.
|
|
197
|
+
* @param hints - `{ filename, mimeType, head }`, any of them
|
|
198
|
+
* @param importers - the importers to rank, in tie-break order (`registry.importers()`)
|
|
199
|
+
* @param onSniffError - called with the format and the error when an importer's sniff() throws
|
|
200
|
+
* (that importer is then treated as not recognizing the head)
|
|
141
201
|
* @returns the candidates, best first; empty when nothing matches
|
|
202
|
+
* @category Formats and detection
|
|
142
203
|
*/
|
|
143
|
-
export function rankFormats(
|
|
204
|
+
export function rankFormats(
|
|
205
|
+
hints: SniffHints,
|
|
206
|
+
importers: Iterable<GraphImporter>,
|
|
207
|
+
onSniffError?: (format: string, error: unknown) => void,
|
|
208
|
+
): readonly SniffResult[] {
|
|
144
209
|
const extension = typeof hints.filename === "string" ? extensionOf(hints.filename) : null;
|
|
145
210
|
const mime = typeof hints.mimeType === "string" ? normalizeMimeType(hints.mimeType) : null;
|
|
146
211
|
const head = hints.head === undefined || hints.head === null ? null : headBytes(hints.head);
|
|
212
|
+
const all = [...importers];
|
|
213
|
+
const extensionClaimed =
|
|
214
|
+
extension !== null && all.some((i) => i.extensions.some((e) => e.toLowerCase() === extension));
|
|
147
215
|
const candidates: { readonly result: SniffResult; readonly rank: number }[] = [];
|
|
148
216
|
let rank = 0;
|
|
149
|
-
for (const importer of
|
|
217
|
+
for (const importer of all) {
|
|
150
218
|
const extensionMatch = extension !== null && importer.extensions.some((e) => e.toLowerCase() === extension);
|
|
151
219
|
const mimeMatch = mime !== null && importer.mimeTypes.some((m) => m.toLowerCase() === mime);
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let confidence: number;
|
|
157
|
-
if (content > 0) {
|
|
158
|
-
confidence = 0.5 + 0.35 * content + (extensionMatch ? 0.1 : 0) + (mimeMatch ? 0.05 : 0);
|
|
159
|
-
} else if (extensionMatch || mimeMatch) {
|
|
160
|
-
confidence = (extensionMatch ? 0.3 : 0) + (mimeMatch ? 0.1 : 0);
|
|
161
|
-
} else {
|
|
220
|
+
const sniffed = head !== null && head.byteLength > 0 && typeof importer.sniff === "function";
|
|
221
|
+
const content = sniffed ? contentConfidence(importer, head, onSniffError) : 0;
|
|
222
|
+
const confidence = combinedConfidence(content, { extensionMatch, mimeMatch, extensionClaimed, sniffed });
|
|
223
|
+
if (confidence === null) {
|
|
162
224
|
continue;
|
|
163
225
|
}
|
|
164
226
|
const dialect = importer.format === "json" && head !== null ? sniffJsonDialectHead(head) : null;
|
|
@@ -177,10 +239,66 @@ export function rankFormats(hints: SniffHints, importers: Iterable<GraphImporter
|
|
|
177
239
|
}
|
|
178
240
|
|
|
179
241
|
/**
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* @param
|
|
242
|
+
* An importer's confidence that it recognizes a head, 0 when its sniffer throws (one buggy
|
|
243
|
+
* importer must not break the detection of every other format, but the error is handed on).
|
|
244
|
+
* @param importer - the importer, which has a sniffer
|
|
245
|
+
* @param head - the head
|
|
246
|
+
* @param onSniffError - called with the format and the error when the sniffer throws
|
|
247
|
+
* @returns the confidence in 0..1
|
|
248
|
+
*/
|
|
249
|
+
function contentConfidence(
|
|
250
|
+
importer: GraphImporter,
|
|
251
|
+
head: Uint8Array,
|
|
252
|
+
onSniffError: ((format: string, error: unknown) => void) | undefined,
|
|
253
|
+
): number {
|
|
254
|
+
try {
|
|
255
|
+
return clamp(importer.sniff?.(head) ?? 0);
|
|
256
|
+
} catch (err) {
|
|
257
|
+
onSniffError?.(importer.format, err);
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* The ranking score of one importer from what matched, or null when it is not a candidate.
|
|
264
|
+
* @param content - the importer's content confidence
|
|
265
|
+
* @param match - what else matched
|
|
266
|
+
* @param match.extensionMatch - the file's extension is one the importer claims
|
|
267
|
+
* @param match.mimeMatch - the MIME type is one the importer claims
|
|
268
|
+
* @param match.extensionClaimed - some importer claims the file's extension
|
|
269
|
+
* @param match.sniffed - the importer looked at the content
|
|
270
|
+
* @returns the score, or null
|
|
271
|
+
*/
|
|
272
|
+
function combinedConfidence(
|
|
273
|
+
content: number,
|
|
274
|
+
match: { extensionMatch: boolean; mimeMatch: boolean; extensionClaimed: boolean; sniffed: boolean },
|
|
275
|
+
): number | null {
|
|
276
|
+
const { extensionMatch, mimeMatch } = match;
|
|
277
|
+
const mimeBonus = mimeMatch ? 0.05 : 0;
|
|
278
|
+
if (content > 0 && content < WEAK_CONTENT && match.extensionClaimed && !extensionMatch) {
|
|
279
|
+
// a weak guess (plain delimited text read as CSV) never overrides another format's extension
|
|
280
|
+
return 0.25 * content + mimeBonus;
|
|
281
|
+
}
|
|
282
|
+
if (content > 0) {
|
|
283
|
+
return 0.5 + 0.35 * content + (extensionMatch ? 0.1 : 0) + mimeBonus;
|
|
284
|
+
}
|
|
285
|
+
if (extensionMatch || (mimeMatch && !match.sniffed)) {
|
|
286
|
+
// a MIME type alone does not override an importer that looked at the content and said no:
|
|
287
|
+
// servers send text/plain for any text file, and a sentence is not a CSV edge list
|
|
288
|
+
return (extensionMatch ? 0.3 : 0) + (mimeMatch ? 0.1 : 0);
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Format detection over a list of importers you pass in, for code that keeps importers outside any
|
|
295
|
+
* registry. To detect a file's format, call `sniff(hints)` instead: it takes the same hints and
|
|
296
|
+
* knows every built-in and registered format. Returns the best candidate of rankFormats(), or null
|
|
297
|
+
* when no importer matches.
|
|
298
|
+
* @param hints - `{ filename, mimeType, head }`, any of them
|
|
299
|
+
* @param importers - the importers to rank, in tie-break order (`registry.importers()`)
|
|
183
300
|
* @returns the best candidate, or null
|
|
301
|
+
* @category Plugin helpers
|
|
184
302
|
*/
|
|
185
303
|
export function sniffFormat(hints: SniffHints, importers: Iterable<GraphImporter>): SniffResult | null {
|
|
186
304
|
const ranked = rankFormats(hints, importers);
|
|
@@ -195,6 +313,7 @@ export function sniffFormat(hints: SniffHints, importers: Iterable<GraphImporter
|
|
|
195
313
|
* document.
|
|
196
314
|
* @param head - the first bytes or characters of the document
|
|
197
315
|
* @returns the dialect, or null when the head is not a JSON graph document
|
|
316
|
+
* @category Plugin helpers
|
|
198
317
|
*/
|
|
199
318
|
export function sniffJsonDialectHead(head: Uint8Array | string): JsonImportDialect | null {
|
|
200
319
|
const text = typeof head === "string" ? head : new TextDecoder("utf-8", { fatal: false }).decode(head);
|
|
@@ -207,7 +326,19 @@ export function sniffJsonDialectHead(head: Uint8Array | string): JsonImportDiale
|
|
|
207
326
|
try {
|
|
208
327
|
root = JSON.parse(trimmed);
|
|
209
328
|
} catch {
|
|
210
|
-
|
|
329
|
+
const skeleton = skeletonOf(trimmed);
|
|
330
|
+
root = skeleton;
|
|
331
|
+
// a head cut inside a long `nodes` array has not reached the keys that tell node-link from d3
|
|
332
|
+
// (`links`, `directed`, `graph`, ...): no guess rather than a wrong one
|
|
333
|
+
if (
|
|
334
|
+
typeof skeleton === "object" &&
|
|
335
|
+
skeleton !== null &&
|
|
336
|
+
!Array.isArray(skeleton) &&
|
|
337
|
+
!["edges", "links", "directed", "multigraph", "graph"].some((key) => key in skeleton)
|
|
338
|
+
) {
|
|
339
|
+
const guess = sniffJsonDialect(skeleton);
|
|
340
|
+
return guess === "node-link" ? null : guess;
|
|
341
|
+
}
|
|
211
342
|
}
|
|
212
343
|
return sniffJsonDialect(root);
|
|
213
344
|
}
|