@graphty/graph-io 0.3.25 → 0.3.27
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-DrXtu_96.js +56 -0
- package/dist/chunks/choose-DrXtu_96.js.map +1 -0
- package/dist/chunks/constants-ikG85dT8.js +231 -0
- package/dist/chunks/constants-ikG85dT8.js.map +1 -0
- package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
- package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
- package/dist/chunks/export-CHd4tQE2.js +4333 -0
- package/dist/chunks/export-CHd4tQE2.js.map +1 -0
- package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
- package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
- package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
- package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
- package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
- package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
- package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
- package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
- package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
- package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
- package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
- package/dist/chunks/importer-B2W_58pz.js.map +1 -0
- package/dist/chunks/importer-BSALvkui.js +2811 -0
- package/dist/chunks/importer-BSALvkui.js.map +1 -0
- package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
- package/dist/chunks/importer-BVRE--Un.js.map +1 -0
- package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
- package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
- package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
- package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
- package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
- package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
- package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
- package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
- package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
- package/dist/chunks/records-CdlvL4RO.js.map +1 -0
- package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
- package/dist/chunks/text-DzXjAiTl.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 +952 -262
- 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 +344 -87
- 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 +565 -158
- 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 +21 -3
- 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 +39 -22
- 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 +869 -189
- 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 +3 -1
- 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 +402 -85
- 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 +146 -33
- 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 +682 -287
- 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 +227 -80
- 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 +101 -27
- 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 +110 -28
- 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 +239 -86
- 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 +67 -35
- 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 +186 -54
- 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 +21 -22
- 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 +8 -3
- 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 +40 -6
- package/src/common/direction.ts +78 -51
- package/src/common/escape.ts +39 -22
- 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 +1035 -199
- package/src/common/line-format.ts +249 -0
- package/src/common/lists.ts +7 -2
- 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 +479 -90
- package/src/common/zip.ts +169 -7
- package/src/formats/csv/exporter.ts +202 -47
- 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 +890 -302
- package/src/formats/cx/index.ts +4 -3
- package/src/formats/cx2/exporter.ts +62 -339
- package/src/formats/cx2/importer.ts +318 -87
- 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 +142 -34
- 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 +113 -28
- 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 +321 -102
- 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 +90 -42
- package/src/formats/pajek/importer.ts +407 -93
- package/src/formats/pajek/index.ts +2 -1
- package/src/formats/pajek/syntax.ts +216 -55
- 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 +36 -28
- package/src/formats/xgmml/importer.ts +64 -86
- package/src/formats/xgmml/index.ts +1 -0
- package/src/formats/xgmml/values.ts +12 -4
- 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/common/direction.ts
CHANGED
|
@@ -36,15 +36,15 @@ import { type ImportReportBuilder } from "./report.js";
|
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* The direction of one source edge.
|
|
39
|
-
* Consumed by the per-format importers and exporters under src/formats.
|
|
40
39
|
* @public
|
|
40
|
+
* @category Plugin helpers
|
|
41
41
|
*/
|
|
42
42
|
export type EdgeKind = "directed" | "undirected" | "mutual";
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Where an edge or header was read, for issues.
|
|
46
|
-
* Consumed by the per-format importers and exporters under src/formats.
|
|
47
46
|
* @public
|
|
47
|
+
* @category Plugin helpers
|
|
48
48
|
*/
|
|
49
49
|
export interface EdgeLocation {
|
|
50
50
|
/** The 1-based line, when known. */
|
|
@@ -53,13 +53,24 @@ export interface EdgeLocation {
|
|
|
53
53
|
readonly element?: string | null | undefined;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* The name of the bool edge column that, in a graph with both directed and undirected edges, says
|
|
58
|
+
* which edges were directed in the file (true) and which were undirected (false).
|
|
59
|
+
* @category Plugin helpers
|
|
60
|
+
*/
|
|
57
61
|
export const DIRECTED_COLUMN = "graphty.directed";
|
|
58
62
|
|
|
59
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* The name of the edge column that links the two edges an undirected edge is stored as, in a graph
|
|
65
|
+
* with both directed and undirected edges: each holds the index of the other.
|
|
66
|
+
* @category Plugin helpers
|
|
67
|
+
*/
|
|
60
68
|
export const PAIR_COLUMN = "graphty.pair";
|
|
61
69
|
|
|
62
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* The name of the bool edge column that marks a GEXF `mutual` edge.
|
|
72
|
+
* @category Plugin helpers
|
|
73
|
+
*/
|
|
63
74
|
export const MUTUAL_COLUMN = "graphty.mutual";
|
|
64
75
|
|
|
65
76
|
export { DIRECTION_FORCED_CODE, DIRECTION_REFUSED_CODE, MIXED_DIRECTION_CODE };
|
|
@@ -69,8 +80,11 @@ const PAIR_DECL: ColumnDecl = { name: PAIR_COLUMN, dtype: "u32", role: "pair", r
|
|
|
69
80
|
const MUTUAL_DECL: ColumnDecl = { name: MUTUAL_COLUMN, dtype: "bool", role: "mutual" };
|
|
70
81
|
|
|
71
82
|
/**
|
|
72
|
-
*
|
|
73
|
-
* import call
|
|
83
|
+
* Adds edges to the sink and handles files whose edges have different directions, the way
|
|
84
|
+
* `onMixedDirection` asks. Make one per import call, call `setHeader()` once with the direction the
|
|
85
|
+
* file declares, then `addEdge()` for each edge. In a directed graph an undirected edge is stored as
|
|
86
|
+
* two edges, one each way, linked so an exporter writes them back as one.
|
|
87
|
+
* @category Writing a format
|
|
74
88
|
*/
|
|
75
89
|
export class DirectionResolver {
|
|
76
90
|
private readonly sink: GraphSink;
|
|
@@ -118,20 +132,19 @@ export class DirectionResolver {
|
|
|
118
132
|
}
|
|
119
133
|
|
|
120
134
|
/**
|
|
121
|
-
* Whether the
|
|
122
|
-
* @returns true once
|
|
135
|
+
* Whether the graph holds undirected edges stored as two edges.
|
|
136
|
+
* @returns true once the first such edge was added
|
|
123
137
|
*/
|
|
124
138
|
get expanded(): boolean {
|
|
125
139
|
return this.pairHandle !== INVALID_INDEX;
|
|
126
140
|
}
|
|
127
141
|
|
|
128
142
|
/**
|
|
129
|
-
*
|
|
130
|
-
* `defaultDirected` option for a file that declares none
|
|
131
|
-
* "
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* undirected sink with a directed header is expanded in place.
|
|
143
|
+
* Set the graph's direction before the first edge: the direction the file declares, or the
|
|
144
|
+
* `defaultDirected` option for a file that declares none. Under `onMixedDirection` "directed" or
|
|
145
|
+
* "undirected" that direction is used instead, with a warning when it differs. When the sink
|
|
146
|
+
* cannot change direction (a caller's builder that already holds edges or was locked), the
|
|
147
|
+
* sink's direction stands and a warning is recorded.
|
|
135
148
|
* @param headerDirected - the direction the file declares (or the default)
|
|
136
149
|
* @param where - the line of the header, when known
|
|
137
150
|
*/
|
|
@@ -141,11 +154,13 @@ export class DirectionResolver {
|
|
|
141
154
|
if (this.policy === "directed" || this.policy === "undirected") {
|
|
142
155
|
wanted = this.policy === "directed";
|
|
143
156
|
if (wanted !== headerDirected) {
|
|
144
|
-
this
|
|
157
|
+
// once: this says it for every edge, so no edge repeats it
|
|
158
|
+
this.report.warnOnce(
|
|
145
159
|
"coercion",
|
|
146
160
|
DIRECTION_FORCED_CODE,
|
|
147
161
|
`the file declares ${direction(headerDirected)} edges; read as ${direction(wanted)} per onMixedDirection`,
|
|
148
162
|
{ line: where?.line ?? null },
|
|
163
|
+
`${DIRECTION_FORCED_CODE}:${direction(headerDirected)}`,
|
|
149
164
|
);
|
|
150
165
|
}
|
|
151
166
|
}
|
|
@@ -188,24 +203,27 @@ export class DirectionResolver {
|
|
|
188
203
|
}
|
|
189
204
|
|
|
190
205
|
/**
|
|
191
|
-
* The
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
206
|
+
* The second edge of the edge the last addEdge() call added, when that edge was stored as two;
|
|
207
|
+
* otherwise INVALID_INDEX (4294967295). An edge attribute or weight you set after addEdge()
|
|
208
|
+
* belongs on both: set it on the index addEdge() returned and, when this is not INVALID_INDEX,
|
|
209
|
+
* on this index too.
|
|
210
|
+
* @returns the second edge's index, or INVALID_INDEX
|
|
195
211
|
*/
|
|
196
212
|
get lastMirror(): number {
|
|
197
213
|
return this.mirrorOfLast;
|
|
198
214
|
}
|
|
199
215
|
|
|
200
216
|
/**
|
|
201
|
-
*
|
|
202
|
-
*
|
|
217
|
+
* Add one edge. An edge with the graph's direction is added as it is; one with the other
|
|
218
|
+
* direction is stored as two edges, given the graph's direction, or refused, as
|
|
219
|
+
* `onMixedDirection` says. When it is stored as two, the return value is the first and
|
|
220
|
+
* `lastMirror` the second.
|
|
203
221
|
* @param source - the source id
|
|
204
222
|
* @param target - the target id
|
|
205
223
|
* @param kind - the edge's direction in the file
|
|
206
224
|
* @param weight - the weight, or undefined when the file gives none
|
|
207
225
|
* @param where - the line and element, for issues
|
|
208
|
-
* @returns the
|
|
226
|
+
* @returns the index of the edge added (the first one, when it was stored as two)
|
|
209
227
|
*/
|
|
210
228
|
addEdge(source: NodeId, target: NodeId, kind: EdgeKind, weight?: number, where?: EdgeLocation): number {
|
|
211
229
|
if (!this.headerSet) {
|
|
@@ -234,6 +252,7 @@ export class DirectionResolver {
|
|
|
234
252
|
DIRECTION_FORCED_CODE,
|
|
235
253
|
`${kind} edges read as ${direction(sink.directed)} per onMixedDirection`,
|
|
236
254
|
where,
|
|
255
|
+
`${DIRECTION_FORCED_CODE}:${kind}`,
|
|
237
256
|
);
|
|
238
257
|
const e = sink.addEdge(source, target, weight);
|
|
239
258
|
this.track(e);
|
|
@@ -263,7 +282,8 @@ export class DirectionResolver {
|
|
|
263
282
|
}
|
|
264
283
|
|
|
265
284
|
/**
|
|
266
|
-
* How many edges were
|
|
285
|
+
* How many edges were given a direction other than their own, under `onMixedDirection`
|
|
286
|
+
* "directed" or "undirected".
|
|
267
287
|
* @returns the count
|
|
268
288
|
*/
|
|
269
289
|
get forced(): number {
|
|
@@ -407,61 +427,68 @@ function direction(directed: boolean): string {
|
|
|
407
427
|
// ============================================================ the exporter side
|
|
408
428
|
|
|
409
429
|
/**
|
|
410
|
-
*
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
* two directed edges (the default).
|
|
416
|
-
* Consumed by the per-format exporters under src/formats.
|
|
430
|
+
* What an exporter needs to know about edge direction, from `pairFolding(snapshot)`. In a graph
|
|
431
|
+
* with both directed and undirected edges, each undirected edge is stored as two edges, one each
|
|
432
|
+
* way. `folded(e)` tells you which of the two to skip, so the edge is written once, and
|
|
433
|
+
* `sourceDirected(e)` whether an edge was directed. A GEXF `mutual` edge is also stored as two
|
|
434
|
+
* edges; it is written as two directed edges unless you pass `foldMutual: true`.
|
|
417
435
|
* @public
|
|
436
|
+
* @category Plugin helpers
|
|
418
437
|
*/
|
|
419
438
|
export interface PairFolding {
|
|
420
|
-
/** Whether the
|
|
439
|
+
/** Whether the graph holds any edge stored as two edges. When false, every method answers as for a plain edge. */
|
|
421
440
|
readonly expanded: boolean;
|
|
422
|
-
/**
|
|
441
|
+
/** How many GEXF mutual edges the graph holds, each counted once. */
|
|
423
442
|
readonly mutualCount: number;
|
|
424
443
|
/**
|
|
425
|
-
* Whether an edge
|
|
426
|
-
*
|
|
444
|
+
* Whether to skip an edge: true for the second of the two edges an undirected edge (or, with
|
|
445
|
+
* `foldMutual`, a mutual edge) is stored as. Write the first and skip this one.
|
|
446
|
+
* @param e - the edge index
|
|
427
447
|
* @returns true when the edge must be skipped
|
|
428
448
|
*/
|
|
429
449
|
folded(e: number): boolean;
|
|
430
450
|
/**
|
|
431
|
-
* The other
|
|
432
|
-
* @param e - the
|
|
433
|
-
* @returns the
|
|
451
|
+
* The other of the two edges an undirected or mutual edge is stored as.
|
|
452
|
+
* @param e - the edge index
|
|
453
|
+
* @returns the other edge's index, or INVALID_INDEX (4294967295) for an edge stored once
|
|
434
454
|
*/
|
|
435
455
|
mateOf(e: number): number;
|
|
436
456
|
/**
|
|
437
|
-
* Whether an edge was directed in the
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
*
|
|
457
|
+
* Whether an edge was directed in the file it was read from: false for an undirected edge of a
|
|
458
|
+
* graph with both kinds. It is true for every edge of a graph without mixed direction, an
|
|
459
|
+
* undirected graph included, so the direction to write for edge `e` is
|
|
460
|
+
* `snapshot.directed && sourceDirected(e)`.
|
|
461
|
+
* @param e - the edge index
|
|
462
|
+
* @returns whether the edge is directed
|
|
441
463
|
*/
|
|
442
464
|
sourceDirected(e: number): boolean;
|
|
443
465
|
/**
|
|
444
|
-
* Whether an edge is
|
|
445
|
-
* @param e - the
|
|
466
|
+
* Whether an edge is either of the two edges a GEXF `mutual` edge is stored as.
|
|
467
|
+
* @param e - the edge index
|
|
446
468
|
* @returns true for a mutual edge
|
|
447
469
|
*/
|
|
448
470
|
isMutual(e: number): boolean;
|
|
449
471
|
}
|
|
450
472
|
|
|
451
|
-
/**
|
|
473
|
+
/**
|
|
474
|
+
* The per-format choice of pairFolding().
|
|
475
|
+
* @category Plugin helpers
|
|
476
|
+
*/
|
|
452
477
|
export interface PairFoldingOptions {
|
|
453
478
|
/**
|
|
454
|
-
*
|
|
455
|
-
*
|
|
479
|
+
* Write a GEXF mutual edge once, for a format that can say an edge goes both ways. When false
|
|
480
|
+
* (the default), `folded()` keeps both of its edges, so it is written as two directed edges.
|
|
456
481
|
*/
|
|
457
482
|
readonly foldMutual?: boolean | undefined;
|
|
458
483
|
}
|
|
459
484
|
|
|
460
485
|
/**
|
|
461
|
-
*
|
|
462
|
-
*
|
|
463
|
-
* @param
|
|
464
|
-
* @
|
|
486
|
+
* Read how a snapshot stores edge direction, for an exporter: which edges to skip so each
|
|
487
|
+
* undirected edge is written once, and which edges were directed.
|
|
488
|
+
* @param snapshot - the graph to write
|
|
489
|
+
* @param options - whether a GEXF mutual edge is written once
|
|
490
|
+
* @returns the answers, per edge
|
|
491
|
+
* @category Writing a format
|
|
465
492
|
*/
|
|
466
493
|
export function pairFolding(snapshot: GraphSnapshot, options: PairFoldingOptions = {}): PairFolding {
|
|
467
494
|
const foldMutual = options.foldMutual ?? false;
|
package/src/common/escape.ts
CHANGED
|
@@ -29,25 +29,27 @@ const XML_REPLACEMENTS: Readonly<Record<string, string>> = {
|
|
|
29
29
|
* surrogate) has no XML spelling at all and is E_COLUMN_TYPE; the exporters' check() counts them.
|
|
30
30
|
* @param text - the text
|
|
31
31
|
* @returns the escaped text
|
|
32
|
+
* @category Plugin helpers
|
|
32
33
|
*/
|
|
33
34
|
export function escapeXmlText(text: string): string {
|
|
34
35
|
if (hasIllegalXmlChar(text)) {
|
|
35
36
|
throw illegalXml(text);
|
|
36
37
|
}
|
|
37
|
-
return text.
|
|
38
|
+
return text.replaceAll(XML_TEXT_SPECIAL, (c) => XML_REPLACEMENTS[c]);
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
/**
|
|
41
42
|
* Escape text for a double-quoted XML attribute value: `&`, `<`, `>`, `"` and the whitespace
|
|
42
|
-
* characters attribute
|
|
43
|
+
* characters attribute normalization would fold; a character XML 1.0 forbids is E_COLUMN_TYPE.
|
|
43
44
|
* @param text - the text
|
|
44
45
|
* @returns the escaped text
|
|
46
|
+
* @category Plugin helpers
|
|
45
47
|
*/
|
|
46
48
|
export function escapeXmlAttribute(text: string): string {
|
|
47
49
|
if (hasIllegalXmlChar(text)) {
|
|
48
50
|
throw illegalXml(text);
|
|
49
51
|
}
|
|
50
|
-
return text.
|
|
52
|
+
return text.replaceAll(XML_ATTR_SPECIAL, (c) => XML_REPLACEMENTS[c]);
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
/**
|
|
@@ -71,9 +73,10 @@ const GML_SPECIAL = /["&]|[^ -~]/gu;
|
|
|
71
73
|
* A lone surrogate cannot be written and is E_COLUMN_TYPE.
|
|
72
74
|
* @param text - the text
|
|
73
75
|
* @returns the quoted GML string
|
|
76
|
+
* @category Plugin helpers
|
|
74
77
|
*/
|
|
75
78
|
export function quoteGmlString(text: string): string {
|
|
76
|
-
const escaped = text.
|
|
79
|
+
const escaped = text.replaceAll(GML_SPECIAL, (c) => {
|
|
77
80
|
const code = c.codePointAt(0);
|
|
78
81
|
if (code === undefined) {
|
|
79
82
|
return c;
|
|
@@ -116,18 +119,23 @@ const GML_NAMED: ReadonlyMap<string, string> = (() => {
|
|
|
116
119
|
/**
|
|
117
120
|
* Decode the character entities of a GML string body (the inverse of quoteGmlString on the text
|
|
118
121
|
* between the quotes): numeric references, the XML entities and the ISO-8859-1 HTML entities. An
|
|
119
|
-
* unknown named entity is left as written and handed to
|
|
122
|
+
* unknown named entity, or a numeric reference beyond U+10FFFF, is left as written and handed to
|
|
123
|
+
* `onUnknown`.
|
|
120
124
|
* @param body - the text between the quotes
|
|
121
|
-
* @param onUnknown - called with each
|
|
125
|
+
* @param onUnknown - called with each entity left as written (`&name;`, `�`), when given
|
|
122
126
|
* @returns the decoded text
|
|
127
|
+
* @category Plugin helpers
|
|
123
128
|
*/
|
|
124
129
|
export function decodeGmlString(body: string, onUnknown?: (entity: string) => void): string {
|
|
125
|
-
return body.
|
|
126
|
-
if (entity.startsWith("#x")) {
|
|
127
|
-
return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));
|
|
128
|
-
}
|
|
130
|
+
return body.replaceAll(GML_ENTITY, (whole, entity: string) => {
|
|
129
131
|
if (entity.startsWith("#")) {
|
|
130
|
-
|
|
132
|
+
const code = entity.startsWith("#x") ? Number.parseInt(entity.slice(2), 16) : Number(entity.slice(1));
|
|
133
|
+
if (code <= 0x10ffff) {
|
|
134
|
+
return String.fromCodePoint(code);
|
|
135
|
+
}
|
|
136
|
+
// beyond Unicode: no character to decode to, kept as written like an unknown name
|
|
137
|
+
onUnknown?.(whole);
|
|
138
|
+
return whole;
|
|
131
139
|
}
|
|
132
140
|
const known = GML_NAMED.get(entity);
|
|
133
141
|
if (known === undefined) {
|
|
@@ -146,6 +154,7 @@ const DOT_KEYWORDS: ReadonlySet<string> = new Set(["node", "edge", "graph", "dig
|
|
|
146
154
|
* a digit, or a numeral, and not a keyword (case-insensitive).
|
|
147
155
|
* @param text - the text
|
|
148
156
|
* @returns true when the text can be written bare
|
|
157
|
+
* @category Plugin helpers
|
|
149
158
|
*/
|
|
150
159
|
export function isBareDotId(text: string): boolean {
|
|
151
160
|
if (DOT_KEYWORDS.has(text.toLowerCase())) {
|
|
@@ -184,6 +193,7 @@ function isDotIdentifier(text: string): boolean {
|
|
|
184
193
|
* the closing quote. Every other text is writable; quoteDotId() writes it.
|
|
185
194
|
* @param text - the id, name or value text
|
|
186
195
|
* @returns true when quoteDotId(text) reads back as `text`
|
|
196
|
+
* @category Plugin helpers
|
|
187
197
|
*/
|
|
188
198
|
export function isWritableDotText(text: string): boolean {
|
|
189
199
|
return !text.endsWith("\\") && !text.includes('\\"') && !/\\[\r\n]/.test(text);
|
|
@@ -196,38 +206,42 @@ export function isWritableDotText(text: string): boolean {
|
|
|
196
206
|
* backslash has no DOT spelling (isWritableDotText); the caller refuses it before writing.
|
|
197
207
|
* @param text - the id or label text
|
|
198
208
|
* @returns the DOT ID
|
|
209
|
+
* @category Plugin helpers
|
|
199
210
|
*/
|
|
200
211
|
export function quoteDotId(text: string): string {
|
|
201
212
|
if (isBareDotId(text)) {
|
|
202
213
|
return text;
|
|
203
214
|
}
|
|
204
|
-
|
|
215
|
+
const escaped = text.replaceAll('"', String.raw`\"`);
|
|
216
|
+
return `"${escaped}"`;
|
|
205
217
|
}
|
|
206
218
|
|
|
207
219
|
/**
|
|
208
|
-
* Write a set CSV cell per RFC 4180: quoted with
|
|
209
|
-
* delimiter,
|
|
210
|
-
* string is written as
|
|
211
|
-
* (and an empty-string node id
|
|
212
|
-
*
|
|
220
|
+
* Write a set CSV cell per RFC 4180: quoted, with the quote character doubled, when the text
|
|
221
|
+
* contains the delimiter, the quote character, a CR or LF, or leading / trailing whitespace; bare
|
|
222
|
+
* otherwise. The empty string is written as an empty quoted cell (`""`), so the importers can tell a
|
|
223
|
+
* set empty string (and an empty-string node id) from an unset cell, which every exporter writes as
|
|
224
|
+
* nothing between the delimiters.
|
|
213
225
|
* @param text - the cell text of a set cell
|
|
214
226
|
* @param delimiter - the field delimiter (default ",")
|
|
227
|
+
* @param quote - the quote character (default `"`)
|
|
215
228
|
* @returns the cell as written
|
|
229
|
+
* @category Plugin helpers
|
|
216
230
|
*/
|
|
217
|
-
export function quoteCsvCell(text: string, delimiter = ","): string {
|
|
231
|
+
export function quoteCsvCell(text: string, delimiter = ",", quote = '"'): string {
|
|
218
232
|
if (text.length === 0) {
|
|
219
|
-
return
|
|
233
|
+
return quote + quote;
|
|
220
234
|
}
|
|
221
235
|
if (
|
|
222
236
|
!text.includes(delimiter) &&
|
|
223
|
-
!text.includes(
|
|
237
|
+
!text.includes(quote) &&
|
|
224
238
|
!text.includes("\n") &&
|
|
225
239
|
!text.includes("\r") &&
|
|
226
240
|
text === text.trim()
|
|
227
241
|
) {
|
|
228
242
|
return text;
|
|
229
243
|
}
|
|
230
|
-
return
|
|
244
|
+
return `${quote}${text.split(quote).join(quote + quote)}${quote}`;
|
|
231
245
|
}
|
|
232
246
|
|
|
233
247
|
/**
|
|
@@ -235,6 +249,7 @@ export function quoteCsvCell(text: string, delimiter = ","): string {
|
|
|
235
249
|
* labels, so a text containing a double quote, a CR or an LF cannot be written.
|
|
236
250
|
* @param text - the label text
|
|
237
251
|
* @returns true when quotePajekLabel() can write it
|
|
252
|
+
* @category Plugin helpers
|
|
238
253
|
*/
|
|
239
254
|
export function isPajekLabel(text: string): boolean {
|
|
240
255
|
return !text.includes('"') && !text.includes("\n") && !text.includes("\r");
|
|
@@ -247,6 +262,7 @@ export function isPajekLabel(text: string): boolean {
|
|
|
247
262
|
* the exporter's check() counts those.
|
|
248
263
|
* @param text - the label text
|
|
249
264
|
* @returns the label as written
|
|
265
|
+
* @category Plugin helpers
|
|
250
266
|
*/
|
|
251
267
|
export function quotePajekLabel(text: string): string {
|
|
252
268
|
if (!isPajekLabel(text)) {
|
|
@@ -255,7 +271,8 @@ export function quotePajekLabel(text: string): string {
|
|
|
255
271
|
value: text,
|
|
256
272
|
});
|
|
257
273
|
}
|
|
258
|
-
|
|
274
|
+
// a bare `%` token starts a comment for the importer, so such a text is quoted too
|
|
275
|
+
if (text.length > 0 && !/[\s"]/.test(text) && !text.startsWith("[") && !text.startsWith("%")) {
|
|
259
276
|
return text;
|
|
260
277
|
}
|
|
261
278
|
return `"${text}"`;
|