@graphty/graph-io 0.3.24 → 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/formats/obo/index.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The OBO subpath entry (`@graphty/graph-io/obo
|
|
3
|
-
*
|
|
4
|
-
* codes. OBO is
|
|
2
|
+
* The OBO subpath entry (`@graphty/graph-io/obo`): the importer and exporter of the OBO flat file
|
|
3
|
+
* format (the Gene Ontology and the OBO Foundry ontologies), their options and their issue and
|
|
4
|
+
* loss codes. The JSON form of the same ontologies, OBO Graphs, is the `obographs` dialect of
|
|
5
|
+
* `@graphty/graph-io/json`.
|
|
6
|
+
* @module @graphty/graph-io/obo
|
|
5
7
|
*/
|
|
6
8
|
|
|
9
|
+
export { OBO_CAPABILITIES, OBO_LOSS, oboExporter, type OboExportOptions } from "./exporter.js";
|
|
7
10
|
export { OBO_ISSUE, oboImporter, type OboImportOptions } from "./importer.js";
|
|
@@ -21,6 +21,7 @@ const ESCAPES: Readonly<Record<string, string>> = Object.freeze({
|
|
|
21
21
|
* backslash at the very end is dropped.
|
|
22
22
|
* @param text - raw text
|
|
23
23
|
* @returns the unescaped text
|
|
24
|
+
* @category Plugin helpers
|
|
24
25
|
*/
|
|
25
26
|
export function unescapeObo(text: string): string {
|
|
26
27
|
if (!text.includes("\\")) {
|
|
@@ -56,10 +57,38 @@ function isEscaped(text: string, index: number): boolean {
|
|
|
56
57
|
return run % 2 === 1;
|
|
57
58
|
}
|
|
58
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Split a line at the form feeds outside quotes (the 1.4 grammar counts a form feed as a line end;
|
|
62
|
+
* one inside a quoted value is text).
|
|
63
|
+
* @param line - the raw line
|
|
64
|
+
* @returns the pieces, the line itself when it holds no such form feed
|
|
65
|
+
* @category Plugin helpers
|
|
66
|
+
*/
|
|
67
|
+
export function splitFormFeeds(line: string): string[] {
|
|
68
|
+
if (!line.includes("\f")) {
|
|
69
|
+
return [line];
|
|
70
|
+
}
|
|
71
|
+
const pieces: string[] = [];
|
|
72
|
+
let quoted = false;
|
|
73
|
+
let start = 0;
|
|
74
|
+
for (let i = 0; i < line.length; i += line[i] === "\\" ? 2 : 1) {
|
|
75
|
+
const ch = line[i];
|
|
76
|
+
if (ch === '"') {
|
|
77
|
+
quoted = !quoted;
|
|
78
|
+
} else if (ch === "\f" && !quoted) {
|
|
79
|
+
pieces.push(line.slice(start, i));
|
|
80
|
+
start = i + 1;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
pieces.push(line.slice(start));
|
|
84
|
+
return pieces;
|
|
85
|
+
}
|
|
86
|
+
|
|
59
87
|
/**
|
|
60
88
|
* Whether a raw line ends with an unescaped backslash (the 1.0 / 1.2 line continuation).
|
|
61
89
|
* @param line - the raw line, trailing whitespace included
|
|
62
90
|
* @returns true when the line continues on the next one
|
|
91
|
+
* @category Plugin helpers
|
|
63
92
|
*/
|
|
64
93
|
export function endsWithContinuation(line: string): boolean {
|
|
65
94
|
return line.endsWith("\\") && !isEscaped(line, line.length - 1);
|
|
@@ -77,6 +106,7 @@ interface TagValue {
|
|
|
77
106
|
* Split a line at its first unescaped colon (values contain colons freely: `is_a: GO:0000001`).
|
|
78
107
|
* @param line - the raw line, trimmed
|
|
79
108
|
* @returns the tag and the rest, or null when the line has no colon
|
|
109
|
+
* @category Plugin helpers
|
|
80
110
|
*/
|
|
81
111
|
export function splitTagValue(line: string): TagValue | null {
|
|
82
112
|
for (let i = 0; i < line.length; i++) {
|
|
@@ -99,6 +129,7 @@ export function splitTagValue(line: string): TagValue | null {
|
|
|
99
129
|
* hide the comment after it.
|
|
100
130
|
* @param rest - the raw value
|
|
101
131
|
* @returns the value before the comment, trailing whitespace removed
|
|
132
|
+
* @category Plugin helpers
|
|
102
133
|
*/
|
|
103
134
|
export function stripComment(rest: string): string {
|
|
104
135
|
let quoted = false;
|
|
@@ -118,7 +149,10 @@ export function stripComment(rest: string): string {
|
|
|
118
149
|
return rest.trimEnd();
|
|
119
150
|
}
|
|
120
151
|
|
|
121
|
-
/**
|
|
152
|
+
/**
|
|
153
|
+
* The qualifiers of a clause: name to value (a list when a name repeats).
|
|
154
|
+
* @category Plugin helpers
|
|
155
|
+
*/
|
|
122
156
|
export type Qualifiers = Record<string, string | string[]>;
|
|
123
157
|
|
|
124
158
|
/** A value with its trailing qualifier blocks split off. */
|
|
@@ -134,37 +168,55 @@ interface QualifiedValue {
|
|
|
134
168
|
/**
|
|
135
169
|
* Split the trailing qualifier blocks off a value: a `{...}` is a block only when it closes the
|
|
136
170
|
* value (after the comment was stripped); several blocks (`{a="1"}{b="2"}`, 1.2 examples) are
|
|
137
|
-
* merged. A closing brace whose block does not parse is left in the value and reported.
|
|
171
|
+
* merged. A closing brace whose block does not parse is left in the value and reported. The value
|
|
172
|
+
* is scanned once, so a value of many blocks costs its length, not its length times its blocks.
|
|
138
173
|
* @param value - the raw value without its comment
|
|
139
174
|
* @returns the value and its qualifiers
|
|
175
|
+
* @category Plugin helpers
|
|
140
176
|
*/
|
|
141
177
|
export function splitQualifiers(value: string): QualifiedValue {
|
|
142
|
-
|
|
178
|
+
if (!value.endsWith("}")) {
|
|
179
|
+
return { value, qualifiers: null, badBlock: null };
|
|
180
|
+
}
|
|
181
|
+
const blocks = braceBlocks(value);
|
|
182
|
+
// the blocks read right to left, merged left to right below
|
|
183
|
+
const parsed: Qualifiers[] = [];
|
|
184
|
+
let end = value.length;
|
|
185
|
+
let badBlock: string | null = null;
|
|
186
|
+
while (end > 0 && value[end - 1] === "}" && !isEscaped(value, end - 1)) {
|
|
187
|
+
const open = blocks.get(end - 1) ?? -1;
|
|
188
|
+
const block = open < 0 ? null : parseQualifiers(value.slice(open + 1, end - 1));
|
|
189
|
+
if (block === null) {
|
|
190
|
+
badBlock = value.slice(Math.max(open, 0), end);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
parsed.push(block);
|
|
194
|
+
end = open;
|
|
195
|
+
while (end > 0 && /\s/.test(value[end - 1])) {
|
|
196
|
+
end--;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
143
199
|
let qualifiers: Qualifiers | null = null;
|
|
144
|
-
for (
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const parsed = open < 0 ? null : parseQualifiers(rest.slice(open + 1, -1));
|
|
150
|
-
if (parsed === null) {
|
|
151
|
-
return { value: rest, qualifiers, badBlock: open < 0 ? rest : rest.slice(open) };
|
|
152
|
-
}
|
|
153
|
-
// a block read right to left: an earlier block's names come first
|
|
154
|
-
qualifiers = qualifiers === null ? parsed : mergeQualifiers(parsed, qualifiers);
|
|
155
|
-
rest = rest.slice(0, open).trimEnd();
|
|
200
|
+
for (let i = parsed.length - 1; i >= 0; i--) {
|
|
201
|
+
qualifiers ??= Object.create(null) as Qualifiers;
|
|
202
|
+
for (const [name, v] of Object.entries(parsed[i])) {
|
|
203
|
+
addQualifier(qualifiers, name, v);
|
|
204
|
+
}
|
|
156
205
|
}
|
|
206
|
+
return { value: value.slice(0, end), qualifiers, badBlock };
|
|
157
207
|
}
|
|
158
208
|
|
|
159
209
|
/**
|
|
160
|
-
* The
|
|
161
|
-
*
|
|
162
|
-
* @
|
|
210
|
+
* The qualifier blocks of a value in one scan: for every unescaped `}` outside quotes, the index of
|
|
211
|
+
* the unescaped `{` outside quotes that opens it (-1 when a `}` came after that `{`, or none did).
|
|
212
|
+
* @param value - a raw value
|
|
213
|
+
* @returns the opening index by closing index
|
|
163
214
|
*/
|
|
164
|
-
function
|
|
215
|
+
function braceBlocks(value: string): Map<number, number> {
|
|
216
|
+
const blocks = new Map<number, number>();
|
|
165
217
|
let quoted = false;
|
|
166
218
|
let open = -1;
|
|
167
|
-
for (let i = 0; i < value.length
|
|
219
|
+
for (let i = 0; i < value.length; i++) {
|
|
168
220
|
const ch = value[i];
|
|
169
221
|
if (ch === "\\") {
|
|
170
222
|
i++;
|
|
@@ -175,39 +227,60 @@ function openingBrace(value: string): number {
|
|
|
175
227
|
} else if (!quoted && ch === "{") {
|
|
176
228
|
open = i;
|
|
177
229
|
} else if (!quoted && ch === "}") {
|
|
230
|
+
blocks.set(i, open);
|
|
178
231
|
open = -1;
|
|
179
232
|
}
|
|
180
233
|
}
|
|
181
|
-
return
|
|
234
|
+
return blocks;
|
|
182
235
|
}
|
|
183
236
|
|
|
184
237
|
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
* @param
|
|
188
|
-
* @returns the
|
|
238
|
+
* The index of an unescaped `{` outside quotes that no `}` closes: a qualifier block cut short (a
|
|
239
|
+
* file truncated inside it).
|
|
240
|
+
* @param value - a raw value, closing blocks already split off
|
|
241
|
+
* @returns the index, or -1 when every brace is closed
|
|
242
|
+
* @category Plugin helpers
|
|
189
243
|
*/
|
|
190
|
-
function
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
244
|
+
export function unclosedBlock(value: string): number {
|
|
245
|
+
let quoted = false;
|
|
246
|
+
let open = -1;
|
|
247
|
+
for (let i = 0; i < value.length; i += value[i] === "\\" ? 2 : 1) {
|
|
248
|
+
const ch = value[i];
|
|
249
|
+
if (ch === "\\") {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (ch === '"' && open < 0) {
|
|
253
|
+
quoted = !quoted;
|
|
254
|
+
} else if (!quoted && ch === "{") {
|
|
255
|
+
open = i;
|
|
256
|
+
} else if (!quoted && ch === "}") {
|
|
257
|
+
open = -1;
|
|
258
|
+
}
|
|
194
259
|
}
|
|
195
|
-
return
|
|
260
|
+
return open;
|
|
196
261
|
}
|
|
197
262
|
|
|
198
263
|
/**
|
|
199
|
-
* Add one qualifier, turning a repeated name into a list
|
|
264
|
+
* Add one qualifier, turning a repeated name into a list (a list the record owns, appended to in
|
|
265
|
+
* place). The record must have a null prototype, so a name such as `__proto__` is an own key.
|
|
200
266
|
* @param record - the record
|
|
201
267
|
* @param name - the name
|
|
202
268
|
* @param value - the value (or values)
|
|
203
269
|
*/
|
|
204
270
|
function addQualifier(record: Qualifiers, name: string, value: string | string[]): void {
|
|
271
|
+
const values = Array.isArray(value) ? value : [value];
|
|
205
272
|
if (!Object.prototype.hasOwnProperty.call(record, name)) {
|
|
206
|
-
record[name] = value;
|
|
273
|
+
record[name] = Array.isArray(value) ? [...value] : value;
|
|
207
274
|
return;
|
|
208
275
|
}
|
|
209
276
|
const before = record[name];
|
|
210
|
-
|
|
277
|
+
if (Array.isArray(before)) {
|
|
278
|
+
for (const v of values) {
|
|
279
|
+
before.push(v);
|
|
280
|
+
}
|
|
281
|
+
} else {
|
|
282
|
+
record[name] = [before, ...values];
|
|
283
|
+
}
|
|
211
284
|
}
|
|
212
285
|
|
|
213
286
|
/**
|
|
@@ -216,6 +289,7 @@ function addQualifier(record: Qualifiers, name: string, value: string | string[]
|
|
|
216
289
|
* (qualifier names may be IRIs with colons).
|
|
217
290
|
* @param inner - the text between the braces
|
|
218
291
|
* @returns the qualifiers, or null when the block does not parse (a pair without `=`, an unclosed quote)
|
|
292
|
+
* @category Plugin helpers
|
|
219
293
|
*/
|
|
220
294
|
export function parseQualifiers(inner: string): Qualifiers | null {
|
|
221
295
|
const out: Qualifiers = Object.create(null) as Qualifiers;
|
|
@@ -260,7 +334,7 @@ export function parseQualifiers(inner: string): Qualifiers | null {
|
|
|
260
334
|
addQualifier(out, name, value);
|
|
261
335
|
any = true;
|
|
262
336
|
}
|
|
263
|
-
return any ?
|
|
337
|
+
return any ? out : null;
|
|
264
338
|
}
|
|
265
339
|
|
|
266
340
|
/**
|
|
@@ -280,7 +354,10 @@ function closingQuote(text: string, from: number): number {
|
|
|
280
354
|
return -1;
|
|
281
355
|
}
|
|
282
356
|
|
|
283
|
-
/**
|
|
357
|
+
/**
|
|
358
|
+
* One token of a value.
|
|
359
|
+
* @category Plugin helpers
|
|
360
|
+
*/
|
|
284
361
|
export interface Token {
|
|
285
362
|
/** A bare word, a quoted string or a bracketed list. */
|
|
286
363
|
readonly kind: "word" | "quoted" | "list";
|
|
@@ -295,6 +372,7 @@ export interface Token {
|
|
|
295
372
|
* Whitespace separates tokens; an escaped space belongs to its word.
|
|
296
373
|
* @param value - the raw value
|
|
297
374
|
* @returns the tokens
|
|
375
|
+
* @category Plugin helpers
|
|
298
376
|
*/
|
|
299
377
|
export function tokenize(value: string): Token[] {
|
|
300
378
|
const tokens: Token[] = [];
|
|
@@ -364,7 +442,10 @@ function closingBracket(text: string, from: number): number {
|
|
|
364
442
|
return -1;
|
|
365
443
|
}
|
|
366
444
|
|
|
367
|
-
/**
|
|
445
|
+
/**
|
|
446
|
+
* One cross-reference: `ID "description" {qualifiers}`.
|
|
447
|
+
* @category Plugin helpers
|
|
448
|
+
*/
|
|
368
449
|
export interface Xref {
|
|
369
450
|
/** The id (may hold spaces: `NIST Chemistry WebBook:110-63-4`, which owlapi reads). */
|
|
370
451
|
readonly id: string;
|
|
@@ -372,6 +453,8 @@ export interface Xref {
|
|
|
372
453
|
readonly description: string | null;
|
|
373
454
|
/** Per-xref qualifiers (OBO 1.2 inside a list), or null. */
|
|
374
455
|
readonly qualifiers: Qualifiers | null;
|
|
456
|
+
/** Whether the description's quote was never closed (it runs to the end). */
|
|
457
|
+
readonly unterminated: boolean;
|
|
375
458
|
}
|
|
376
459
|
|
|
377
460
|
/**
|
|
@@ -379,6 +462,7 @@ export interface Xref {
|
|
|
379
462
|
* string its description, a closing block its qualifiers.
|
|
380
463
|
* @param raw - the raw text of one xref
|
|
381
464
|
* @returns the xref, or null when it has no id
|
|
465
|
+
* @category Plugin helpers
|
|
382
466
|
*/
|
|
383
467
|
export function parseXref(raw: string): Xref | null {
|
|
384
468
|
const { value, qualifiers } = splitQualifiers(raw.trim());
|
|
@@ -396,11 +480,13 @@ export function parseXref(raw: string): Xref | null {
|
|
|
396
480
|
return null;
|
|
397
481
|
}
|
|
398
482
|
let description: string | null = null;
|
|
483
|
+
let unterminated = false;
|
|
399
484
|
if (quote >= 0) {
|
|
400
485
|
const end = closingQuote(value, quote + 1);
|
|
486
|
+
unterminated = end < 0;
|
|
401
487
|
description = unescapeObo(value.slice(quote + 1, end < 0 ? value.length : end));
|
|
402
488
|
}
|
|
403
|
-
return { id, description, qualifiers };
|
|
489
|
+
return { id, description, qualifiers, unterminated };
|
|
404
490
|
}
|
|
405
491
|
|
|
406
492
|
/**
|
|
@@ -408,6 +494,7 @@ export function parseXref(raw: string): Xref | null {
|
|
|
408
494
|
* braces (a solitary xref needs no escaping of its commas only outside a list).
|
|
409
495
|
* @param inner - the raw text between the brackets
|
|
410
496
|
* @returns the xrefs, in order
|
|
497
|
+
* @category Plugin helpers
|
|
411
498
|
*/
|
|
412
499
|
export function parseXrefList(inner: string): Xref[] {
|
|
413
500
|
const out: Xref[] = [];
|
|
@@ -445,6 +532,7 @@ export function parseXrefList(inner: string): Xref[] {
|
|
|
445
532
|
* have escaped).
|
|
446
533
|
* @param value - the raw value, qualifiers already split off
|
|
447
534
|
* @returns true when a stray brace is present
|
|
535
|
+
* @category Plugin helpers
|
|
448
536
|
*/
|
|
449
537
|
export function hasStrayBrace(value: string): boolean {
|
|
450
538
|
let quoted = false;
|
|
@@ -464,3 +552,110 @@ export function hasStrayBrace(value: string): boolean {
|
|
|
464
552
|
}
|
|
465
553
|
return false;
|
|
466
554
|
}
|
|
555
|
+
|
|
556
|
+
// ============================================================ the writer side
|
|
557
|
+
|
|
558
|
+
/** A carriage return, a CRLF pair or a form feed: line ends OBO text cannot carry. */
|
|
559
|
+
const LINE_ENDS = /\r\n|\r|\f/g;
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Whether a text holds a carriage return or a form feed, which the OBO line grammar reads as a line
|
|
563
|
+
* end wherever it stands and no escape can spell; the writers turn them into `\n`.
|
|
564
|
+
* @param text - the text
|
|
565
|
+
* @returns true when the text loses a character on the way through an OBO file
|
|
566
|
+
* @category Plugin helpers
|
|
567
|
+
*/
|
|
568
|
+
export function hasLineEnd(text: string): boolean {
|
|
569
|
+
return text.includes("\r") || text.includes("\f");
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Escape text for a quoted OBO string (`def: "..."`, a synonym, a qualifier value): backslash,
|
|
574
|
+
* quote, newline and tab. A carriage return or form feed becomes a newline (see hasLineEnd()).
|
|
575
|
+
* `\W` is never written: graph-io reads it as a space, fastobo and the 1.4 BNF as the letter W.
|
|
576
|
+
* @param text - the text
|
|
577
|
+
* @returns the escaped text, without the quotes
|
|
578
|
+
* @category Plugin helpers
|
|
579
|
+
*/
|
|
580
|
+
export function escapeOboQuoted(text: string): string {
|
|
581
|
+
return text.replaceAll(LINE_ENDS, "\n").replaceAll(/[\\"\n\t]/g, (ch) => {
|
|
582
|
+
switch (ch) {
|
|
583
|
+
case "\n":
|
|
584
|
+
return String.raw`\n`;
|
|
585
|
+
case "\t":
|
|
586
|
+
return String.raw`\t`;
|
|
587
|
+
default:
|
|
588
|
+
return `\\${ch}`;
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Escape text for an unquoted OBO value (`name:`, `comment:`, an xref id, an unknown tag): what
|
|
595
|
+
* escapeOboQuoted() escapes plus `!` (a comment), `{` and `}` (a qualifier block), `[`, `]` and `,`
|
|
596
|
+
* (an xref list) and `"` (a quoted string). The reader trims an unquoted value, so its leading
|
|
597
|
+
* and trailing spaces cannot be kept.
|
|
598
|
+
* @param text - the text
|
|
599
|
+
* @returns the escaped text
|
|
600
|
+
* @category Plugin helpers
|
|
601
|
+
*/
|
|
602
|
+
export function escapeOboValue(text: string): string {
|
|
603
|
+
return escapeOboQuoted(text).replaceAll(/[!{}[\],]/g, (ch) => `\\${ch}`);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Whether a text can stand as one OBO word (an id, a relation, a subset or synonym type name): not
|
|
608
|
+
* empty, no whitespace, no control character (the importer refuses an id holding one), no `!`, `{`
|
|
609
|
+
* or `}`. escapeOboWord() escapes what else would end it or turn
|
|
610
|
+
* it into another token (a backslash, a quote, a leading `[`).
|
|
611
|
+
* @param text - the text
|
|
612
|
+
* @returns true when the text is a word
|
|
613
|
+
* @category Plugin helpers
|
|
614
|
+
*/
|
|
615
|
+
export function isOboWord(text: string): boolean {
|
|
616
|
+
return text.length > 0 && !NOT_IN_WORD.test(text);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/**
|
|
620
|
+
* A character an OBO word cannot hold: whitespace, a control character, `!`, `{` or `}`.
|
|
621
|
+
* @category Plugin helpers
|
|
622
|
+
*/
|
|
623
|
+
export const NOT_IN_WORD = /[\s!{}\p{Cc}]/u;
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Write a word (see isOboWord()): a backslash and a quote escaped, and a leading `[` (which would
|
|
627
|
+
* open an xref list).
|
|
628
|
+
* @param word - a text isOboWord() accepts
|
|
629
|
+
* @returns the text to write
|
|
630
|
+
* @category Plugin helpers
|
|
631
|
+
*/
|
|
632
|
+
export function escapeOboWord(word: string): string {
|
|
633
|
+
const out = word.replaceAll(/[\\"]/g, (ch) => `\\${ch}`);
|
|
634
|
+
return out.startsWith("[") ? `\\${out}` : out;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Whether a text can be a qualifier name: not empty, no surrounding space, none of `=`, `"`, `,`,
|
|
639
|
+
* `{`, `}`, `[`, `]`, `!`, a backslash or a line end (the reader takes a name as everything up to
|
|
640
|
+
* the first `=`, unescaped only after the split).
|
|
641
|
+
* @param name - the name
|
|
642
|
+
* @returns true when the name is written as it is
|
|
643
|
+
* @category Plugin helpers
|
|
644
|
+
*/
|
|
645
|
+
export function isQualifierName(name: string): boolean {
|
|
646
|
+
return name.length > 0 && name === name.trim() && !/[=",{}[\]!\\\n\r\t\f]/.test(name);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* A qualifier block: `{name="value", ...}`, a list value as one pair per item.
|
|
651
|
+
* @param pairs - the name / value pairs, in order (names isQualifierName() accepts)
|
|
652
|
+
* @returns the block with a leading space, or "" when there are no pairs
|
|
653
|
+
* @category Plugin helpers
|
|
654
|
+
*/
|
|
655
|
+
export function qualifierBlock(pairs: readonly (readonly [string, string])[]): string {
|
|
656
|
+
if (pairs.length === 0) {
|
|
657
|
+
return "";
|
|
658
|
+
}
|
|
659
|
+
const items = pairs.map(([name, value]) => `${name}="${escapeOboQuoted(value)}"`);
|
|
660
|
+
return ` {${items.join(", ")}}`;
|
|
661
|
+
}
|