@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
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { GraphFormatError } from "@graphty/graph-format";
|
|
2
|
-
import {
|
|
3
|
-
import { b as isNameChar } from "./export-Bh60Dv-n.js";
|
|
2
|
+
import { aw as isNameChar, ax as XML_ILLEGAL_CHAR_CODE, b as plural, $ as agree } from "./export-BTI4yQgy.js";
|
|
4
3
|
class XmlSyntaxError extends Error {
|
|
5
4
|
/**
|
|
6
5
|
* Create the error.
|
|
@@ -13,6 +12,16 @@ class XmlSyntaxError extends Error {
|
|
|
13
12
|
this.line = line;
|
|
14
13
|
}
|
|
15
14
|
}
|
|
15
|
+
class XmlEmptyInputError extends XmlSyntaxError {
|
|
16
|
+
/**
|
|
17
|
+
* Create the error.
|
|
18
|
+
* @param line - the 1-based line where the input ended
|
|
19
|
+
*/
|
|
20
|
+
constructor(line) {
|
|
21
|
+
super("the input is empty: no root element", line);
|
|
22
|
+
this.name = "XmlEmptyInputError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
16
25
|
const BARE_AMPERSAND_LOOKAHEAD = 7;
|
|
17
26
|
const CHAR_REFERENCE = /^&#(?:[xX]([0-9a-fA-F]{1,6})|([0-9]{1,7}));/;
|
|
18
27
|
const TRAILING_CHAR_REFERENCE = /&#(?:[xX]([0-9a-fA-F]{1,6})|([0-9]{1,7}));$/;
|
|
@@ -33,6 +42,7 @@ const OPEN_BRACKET = 91;
|
|
|
33
42
|
const CLOSE_BRACKET = 93;
|
|
34
43
|
const BANG = 33;
|
|
35
44
|
const DASH = 45;
|
|
45
|
+
const QUESTION = 63;
|
|
36
46
|
const MAX_ENTITY_LENGTH = 16;
|
|
37
47
|
const MIN_DECIDABLE_MARKUP = 9;
|
|
38
48
|
function isSpace(c) {
|
|
@@ -60,6 +70,10 @@ const ILLEGAL_CHAR = new RegExp(
|
|
|
60
70
|
function hasIllegalXmlChar(text) {
|
|
61
71
|
return ILLEGAL_CHAR.test(text);
|
|
62
72
|
}
|
|
73
|
+
function illegalCharIndex(text) {
|
|
74
|
+
const match = ILLEGAL_CHAR.exec(text);
|
|
75
|
+
return match === null ? -1 : match.index;
|
|
76
|
+
}
|
|
63
77
|
function xmlIllegalTextNotes(snapshot) {
|
|
64
78
|
const notes = [];
|
|
65
79
|
let ids = 0;
|
|
@@ -73,7 +87,7 @@ function xmlIllegalTextNotes(snapshot) {
|
|
|
73
87
|
notes.push(
|
|
74
88
|
Object.freeze({
|
|
75
89
|
code: XML_ILLEGAL_CHAR_CODE,
|
|
76
|
-
message: `${ids} node id(
|
|
90
|
+
message: `${ids} node id${plural(ids)} ${agree(ids, "holds", "hold")} a character XML 1.0 cannot carry; the save fails`,
|
|
77
91
|
column: null,
|
|
78
92
|
count: ids
|
|
79
93
|
})
|
|
@@ -90,7 +104,7 @@ function xmlIllegalTextNotes(snapshot) {
|
|
|
90
104
|
notes.push(
|
|
91
105
|
Object.freeze({
|
|
92
106
|
code: XML_ILLEGAL_CHAR_CODE,
|
|
93
|
-
message: `${domain} column "${column.meta.name}": ${bad} value(
|
|
107
|
+
message: `${domain} column "${column.meta.name}": ${bad} value${plural(bad)} ${agree(bad, "holds", "hold")} a character XML 1.0 cannot carry; the save fails`,
|
|
94
108
|
column: column.meta.name,
|
|
95
109
|
count: bad
|
|
96
110
|
})
|
|
@@ -122,6 +136,15 @@ function xmlDeclaredEncoding(head) {
|
|
|
122
136
|
const match = XML_DECLARED_ENCODING.exec(head);
|
|
123
137
|
return match === null ? null : match[1];
|
|
124
138
|
}
|
|
139
|
+
function sniffXmlText(head) {
|
|
140
|
+
let label = "utf-8";
|
|
141
|
+
if (head[0] === 255 && head[1] === 254 || head[0] === 60 && head[1] === 0 && head[2] === 63) {
|
|
142
|
+
label = "utf-16le";
|
|
143
|
+
} else if (head[0] === 254 && head[1] === 255 || head[0] === 0 && head[1] === 60 && head[3] === 63) {
|
|
144
|
+
label = "utf-16be";
|
|
145
|
+
}
|
|
146
|
+
return new TextDecoder(label, { fatal: false }).decode(head);
|
|
147
|
+
}
|
|
125
148
|
function isXmlName(text) {
|
|
126
149
|
if (text.length === 0) {
|
|
127
150
|
return false;
|
|
@@ -158,13 +181,13 @@ function decodeEntities(raw, line, repairs) {
|
|
|
158
181
|
continue;
|
|
159
182
|
}
|
|
160
183
|
if (semi < 0) {
|
|
161
|
-
throw new XmlSyntaxError("unterminated entity reference", line);
|
|
184
|
+
throw new XmlSyntaxError("unterminated entity reference", lineAt(raw, amp, line));
|
|
162
185
|
}
|
|
163
186
|
const name = raw.slice(amp + 1, semi);
|
|
164
187
|
if (name.startsWith("#")) {
|
|
165
188
|
const hex = name.startsWith("#x") || name.startsWith("#X");
|
|
166
189
|
const digits = name.slice(hex ? 2 : 1);
|
|
167
|
-
const ok = hex ? /^[
|
|
190
|
+
const ok = hex ? /^0*[\da-fA-F]{1,6}$/.test(digits) : /^0*\d{1,7}$/.test(digits);
|
|
168
191
|
const cp = ok ? Number.parseInt(digits, hex ? 16 : 10) : -1;
|
|
169
192
|
const low = cp >= 55296 && cp <= 56319 ? lowSurrogateAfter(raw, semi + 1, repairs) : null;
|
|
170
193
|
if (low !== null) {
|
|
@@ -175,13 +198,13 @@ function decodeEntities(raw, line, repairs) {
|
|
|
175
198
|
continue;
|
|
176
199
|
}
|
|
177
200
|
if (cp < 0 || !isXmlChar(cp)) {
|
|
178
|
-
throw new XmlSyntaxError(`invalid character reference &${name};`, line);
|
|
201
|
+
throw new XmlSyntaxError(`invalid character reference &${name};`, lineAt(raw, amp, line));
|
|
179
202
|
}
|
|
180
203
|
out += String.fromCodePoint(cp);
|
|
181
204
|
} else {
|
|
182
205
|
const value = NAMED_ENTITIES[name];
|
|
183
206
|
if (value === void 0) {
|
|
184
|
-
throw new XmlSyntaxError(`unknown entity &${name};`, line);
|
|
207
|
+
throw new XmlSyntaxError(`unknown entity &${name};`, lineAt(raw, amp, line));
|
|
185
208
|
}
|
|
186
209
|
out += value;
|
|
187
210
|
}
|
|
@@ -222,10 +245,38 @@ function localName(name) {
|
|
|
222
245
|
}
|
|
223
246
|
async function tokenizeXml(chunks, handler, repairs) {
|
|
224
247
|
const tokenizer = new XmlTokenizer(handler, repairs);
|
|
225
|
-
|
|
226
|
-
|
|
248
|
+
let skipped = 0;
|
|
249
|
+
let lines = 1;
|
|
250
|
+
let leading = true;
|
|
251
|
+
try {
|
|
252
|
+
for await (const chunk of chunks) {
|
|
253
|
+
if (leading) {
|
|
254
|
+
const start = chunk.search(/\S/);
|
|
255
|
+
const blank = start < 0 ? chunk : chunk.slice(0, start);
|
|
256
|
+
skipped += blank.length;
|
|
257
|
+
lines += blank.split("\n").length - 1;
|
|
258
|
+
if (start >= 0) {
|
|
259
|
+
leading = false;
|
|
260
|
+
if (skipped > 0 && /^<\?xml\s/.test(chunk.slice(start, start + 6))) {
|
|
261
|
+
throw new XmlSyntaxError(
|
|
262
|
+
"the XML declaration must be at the very start of the document; whitespace precedes it",
|
|
263
|
+
lines
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
tokenizer.push(chunk);
|
|
269
|
+
}
|
|
270
|
+
tokenizer.finish();
|
|
271
|
+
} catch (err) {
|
|
272
|
+
if (err instanceof XmlSyntaxError && tokenizer.declaresXml11 && !err.message.includes("XML 1.1")) {
|
|
273
|
+
throw new XmlSyntaxError(
|
|
274
|
+
`${err.message}; the document declares XML 1.1, which graph-io does not read (it reads XML 1.0)`,
|
|
275
|
+
err.line
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
throw err;
|
|
227
279
|
}
|
|
228
|
-
tokenizer.finish();
|
|
229
280
|
}
|
|
230
281
|
const TERMINATORS = {
|
|
231
282
|
comment: "-->",
|
|
@@ -233,6 +284,8 @@ const TERMINATORS = {
|
|
|
233
284
|
pi: "?>",
|
|
234
285
|
endtag: ">"
|
|
235
286
|
};
|
|
287
|
+
const XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
|
|
288
|
+
const DECLARATION_OPENERS = ["<!--", "<![CDATA[", "<!DOCTYPE"];
|
|
236
289
|
class XmlTokenizer {
|
|
237
290
|
/**
|
|
238
291
|
* Create a tokenizer.
|
|
@@ -251,15 +304,39 @@ class XmlTokenizer {
|
|
|
251
304
|
this.stack = [];
|
|
252
305
|
this.rootSeen = false;
|
|
253
306
|
this.rootClosed = false;
|
|
307
|
+
this.markupSeen = false;
|
|
308
|
+
this.atStart = true;
|
|
309
|
+
this.doctypeSeen = false;
|
|
310
|
+
this.version = null;
|
|
311
|
+
this.textTail = "";
|
|
312
|
+
this.pendingHigh = "";
|
|
313
|
+
this.bindings = [];
|
|
254
314
|
this.handler = handler;
|
|
255
315
|
this.repairs = repairs;
|
|
256
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Whether the document's XML declaration says version 1.1 (read by the XML 1.0 rules all the
|
|
319
|
+
* same; the syntax error of a 1.1-only construct then says why).
|
|
320
|
+
* @returns true after a `<?xml version="1.1"?>` declaration
|
|
321
|
+
*/
|
|
322
|
+
get declaresXml11() {
|
|
323
|
+
return this.version === "1.1";
|
|
324
|
+
}
|
|
257
325
|
/**
|
|
258
326
|
* Feed one chunk and emit every complete token in it.
|
|
259
327
|
* @param chunk - the text
|
|
260
328
|
*/
|
|
261
329
|
push(chunk) {
|
|
262
330
|
let text = chunk;
|
|
331
|
+
if (this.pendingHigh.length > 0) {
|
|
332
|
+
text = this.pendingHigh + text;
|
|
333
|
+
this.pendingHigh = "";
|
|
334
|
+
}
|
|
335
|
+
const last = text.charCodeAt(text.length - 1);
|
|
336
|
+
if (last >= 55296 && last <= 56319) {
|
|
337
|
+
this.pendingHigh = text.slice(-1);
|
|
338
|
+
text = text.slice(0, -1);
|
|
339
|
+
}
|
|
263
340
|
if (this.pendingCr) {
|
|
264
341
|
text = `\r${text}`;
|
|
265
342
|
this.pendingCr = false;
|
|
@@ -276,11 +353,14 @@ class XmlTokenizer {
|
|
|
276
353
|
/** Signal the end of the input: flush the last text run and check well-formedness. */
|
|
277
354
|
finish() {
|
|
278
355
|
this.final = true;
|
|
356
|
+
const held = this.pendingHigh;
|
|
357
|
+
this.pendingHigh = "";
|
|
279
358
|
if (this.pendingCr) {
|
|
280
359
|
this.pendingCr = false;
|
|
281
|
-
this.feed(
|
|
360
|
+
this.feed(`
|
|
361
|
+
${held}`);
|
|
282
362
|
} else {
|
|
283
|
-
this.feed(
|
|
363
|
+
this.feed(held);
|
|
284
364
|
}
|
|
285
365
|
if (this.pending !== null || this.buffer.length > 0) {
|
|
286
366
|
throw new XmlSyntaxError("unexpected end of input inside markup", this.line);
|
|
@@ -290,13 +370,16 @@ class XmlTokenizer {
|
|
|
290
370
|
throw new XmlSyntaxError(`unclosed element <${this.stack[this.stack.length - 1]}>`, this.line);
|
|
291
371
|
}
|
|
292
372
|
if (!this.rootSeen) {
|
|
373
|
+
if (!this.markupSeen) {
|
|
374
|
+
throw new XmlEmptyInputError(this.line);
|
|
375
|
+
}
|
|
293
376
|
throw new XmlSyntaxError("no root element", this.line);
|
|
294
377
|
}
|
|
295
378
|
}
|
|
296
379
|
/**
|
|
297
|
-
* Append
|
|
380
|
+
* Append normalized text: continue a pending token's terminator scan over the new text alone,
|
|
298
381
|
* and once the token is complete (or when none is pending) scan the buffer for tokens.
|
|
299
|
-
* @param text - the text, line breaks
|
|
382
|
+
* @param text - the text, line breaks normalized
|
|
300
383
|
*/
|
|
301
384
|
feed(text) {
|
|
302
385
|
const { pending } = this;
|
|
@@ -400,9 +483,18 @@ class XmlTokenizer {
|
|
|
400
483
|
* @returns the index one past the `>`, or -1
|
|
401
484
|
*/
|
|
402
485
|
scanDoctype(pending, text, from) {
|
|
403
|
-
let { quote, depth, comment, run } = pending;
|
|
486
|
+
let { quote, depth, comment, pi, run } = pending;
|
|
404
487
|
for (let i = from; i < text.length; i++) {
|
|
405
488
|
const c = text.charCodeAt(i);
|
|
489
|
+
if (pi) {
|
|
490
|
+
if (c === GT && run === 1) {
|
|
491
|
+
pi = false;
|
|
492
|
+
run = 0;
|
|
493
|
+
} else {
|
|
494
|
+
run = c === QUESTION ? 1 : 0;
|
|
495
|
+
}
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
406
498
|
if (comment) {
|
|
407
499
|
if (c === DASH) {
|
|
408
500
|
run++;
|
|
@@ -434,6 +526,11 @@ class XmlTokenizer {
|
|
|
434
526
|
run = 0;
|
|
435
527
|
continue;
|
|
436
528
|
}
|
|
529
|
+
if (run === 1 && c === QUESTION) {
|
|
530
|
+
pi = true;
|
|
531
|
+
run = 0;
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
437
534
|
run = 0;
|
|
438
535
|
if (c === LT) {
|
|
439
536
|
run = 1;
|
|
@@ -450,6 +547,7 @@ class XmlTokenizer {
|
|
|
450
547
|
pending.quote = 0;
|
|
451
548
|
pending.depth = 0;
|
|
452
549
|
pending.comment = false;
|
|
550
|
+
pending.pi = false;
|
|
453
551
|
pending.run = 0;
|
|
454
552
|
return i + 1;
|
|
455
553
|
}
|
|
@@ -457,6 +555,7 @@ class XmlTokenizer {
|
|
|
457
555
|
pending.quote = quote;
|
|
458
556
|
pending.depth = depth;
|
|
459
557
|
pending.comment = comment;
|
|
558
|
+
pending.pi = pi;
|
|
460
559
|
pending.run = run;
|
|
461
560
|
return -1;
|
|
462
561
|
}
|
|
@@ -476,7 +575,9 @@ class XmlTokenizer {
|
|
|
476
575
|
let end = length;
|
|
477
576
|
if (!this.final) {
|
|
478
577
|
const amp = buffer.lastIndexOf("&");
|
|
479
|
-
if (amp >= pos &&
|
|
578
|
+
if (amp >= pos && !buffer.includes(";", amp) && // ponytail: a zero-padded reference longer than MAX_ENTITY_LENGTH is held back
|
|
579
|
+
// whole, so an absurdly long run of zeros is re-scanned once per chunk
|
|
580
|
+
(amp >= length - MAX_ENTITY_LENGTH || /^&#[xX]?0[\da-fA-F]*$/.test(buffer.slice(amp)))) {
|
|
480
581
|
end = amp;
|
|
481
582
|
}
|
|
482
583
|
if (this.repairs?.surrogatePair !== void 0) {
|
|
@@ -522,6 +623,7 @@ class XmlTokenizer {
|
|
|
522
623
|
quote: 0,
|
|
523
624
|
depth: 0,
|
|
524
625
|
comment: false,
|
|
626
|
+
pi: false,
|
|
525
627
|
run: 0
|
|
526
628
|
};
|
|
527
629
|
if (piece.length < MIN_DECIDABLE_MARKUP) {
|
|
@@ -563,59 +665,30 @@ class XmlTokenizer {
|
|
|
563
665
|
* @returns the index after the markup, or -1 when the buffer ends before the markup does
|
|
564
666
|
*/
|
|
565
667
|
consumeMarkup(pos) {
|
|
668
|
+
const end = this.markupEnd(pos);
|
|
669
|
+
if (end >= 0) {
|
|
670
|
+
this.markupSeen = true;
|
|
671
|
+
this.atStart = false;
|
|
672
|
+
this.textTail = "";
|
|
673
|
+
}
|
|
674
|
+
return end;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Read the markup starting at `pos` (a `<`) and deliver what it means.
|
|
678
|
+
* @param pos - the index of the `<`
|
|
679
|
+
* @returns the index after the markup, or -1 when the buffer ends before the markup does
|
|
680
|
+
*/
|
|
681
|
+
markupEnd(pos) {
|
|
566
682
|
const { buffer } = this;
|
|
567
683
|
if (buffer.startsWith("<!", pos)) {
|
|
568
|
-
|
|
569
|
-
return -1;
|
|
570
|
-
}
|
|
571
|
-
if (buffer.startsWith("<!--", pos)) {
|
|
572
|
-
const end2 = buffer.indexOf("-->", pos + 4);
|
|
573
|
-
if (end2 < 0) {
|
|
574
|
-
return -1;
|
|
575
|
-
}
|
|
576
|
-
this.advanceLine(pos, end2 + 3);
|
|
577
|
-
return end2 + 3;
|
|
578
|
-
}
|
|
579
|
-
if (buffer.startsWith("<![CDATA[", pos)) {
|
|
580
|
-
const end2 = buffer.indexOf("]]>", pos + 9);
|
|
581
|
-
if (end2 < 0) {
|
|
582
|
-
return -1;
|
|
583
|
-
}
|
|
584
|
-
if (this.text.length === 0) {
|
|
585
|
-
this.textLine = this.line;
|
|
586
|
-
}
|
|
587
|
-
const cdata = buffer.slice(pos + 9, end2);
|
|
588
|
-
if (hasIllegalXmlChar(cdata)) {
|
|
589
|
-
throw new XmlSyntaxError("a character XML 1.0 forbids appears in a CDATA section", this.line);
|
|
590
|
-
}
|
|
591
|
-
this.text += cdata;
|
|
592
|
-
this.advanceLine(pos, end2 + 3);
|
|
593
|
-
return end2 + 3;
|
|
594
|
-
}
|
|
595
|
-
if (!buffer.startsWith("<!DOCTYPE", pos)) {
|
|
596
|
-
throw new XmlSyntaxError("unexpected markup declaration", this.line);
|
|
597
|
-
}
|
|
598
|
-
const state = {
|
|
599
|
-
kind: "doctype",
|
|
600
|
-
pieces: [],
|
|
601
|
-
tail: "",
|
|
602
|
-
quote: 0,
|
|
603
|
-
depth: 0,
|
|
604
|
-
comment: false,
|
|
605
|
-
run: 0
|
|
606
|
-
};
|
|
607
|
-
const end = this.scanDoctype(state, buffer, pos + 9);
|
|
608
|
-
if (end < 0) {
|
|
609
|
-
return -1;
|
|
610
|
-
}
|
|
611
|
-
this.advanceLine(pos, end);
|
|
612
|
-
return end;
|
|
684
|
+
return this.declarationEnd(pos);
|
|
613
685
|
}
|
|
614
686
|
if (buffer.startsWith("<?", pos)) {
|
|
615
687
|
const end = buffer.indexOf("?>", pos + 2);
|
|
616
688
|
if (end < 0) {
|
|
617
689
|
return -1;
|
|
618
690
|
}
|
|
691
|
+
this.processingInstruction(pos, end);
|
|
619
692
|
this.advanceLine(pos, end + 2);
|
|
620
693
|
return end + 2;
|
|
621
694
|
}
|
|
@@ -624,7 +697,7 @@ class XmlTokenizer {
|
|
|
624
697
|
if (end < 0) {
|
|
625
698
|
return -1;
|
|
626
699
|
}
|
|
627
|
-
const name = buffer.slice(pos + 2, end).
|
|
700
|
+
const name = buffer.slice(pos + 2, end).trimEnd();
|
|
628
701
|
if (!isXmlName(name)) {
|
|
629
702
|
throw new XmlSyntaxError(`malformed end tag </${name}>`, this.line);
|
|
630
703
|
}
|
|
@@ -638,13 +711,160 @@ class XmlTokenizer {
|
|
|
638
711
|
return -1;
|
|
639
712
|
}
|
|
640
713
|
this.flushText();
|
|
641
|
-
this.startElement(tag.name, tag.attrs);
|
|
714
|
+
this.startElement(tag.name, tag.attrs, tag.declaresNamespace);
|
|
642
715
|
if (tag.selfClosing) {
|
|
643
716
|
this.endElement(tag.name);
|
|
644
717
|
}
|
|
645
718
|
this.advanceLine(pos, tag.end);
|
|
646
719
|
return tag.end;
|
|
647
720
|
}
|
|
721
|
+
/**
|
|
722
|
+
* Read the CDATA section at `pos` into the text.
|
|
723
|
+
* @param pos - the index of the `<`
|
|
724
|
+
* @returns the index after the section, or -1 when the buffer ends before the section does
|
|
725
|
+
*/
|
|
726
|
+
cdataEnd(pos) {
|
|
727
|
+
const end = this.buffer.indexOf("]]>", pos + 9);
|
|
728
|
+
if (end < 0) {
|
|
729
|
+
return -1;
|
|
730
|
+
}
|
|
731
|
+
if (this.text.length === 0) {
|
|
732
|
+
this.textLine = this.line;
|
|
733
|
+
}
|
|
734
|
+
const cdata = this.buffer.slice(pos + 9, end);
|
|
735
|
+
const bad = illegalCharIndex(cdata);
|
|
736
|
+
if (bad >= 0) {
|
|
737
|
+
throw new XmlSyntaxError(
|
|
738
|
+
"a character XML 1.0 forbids appears in a CDATA section",
|
|
739
|
+
this.lineIn(pos, pos + 9 + bad)
|
|
740
|
+
);
|
|
741
|
+
}
|
|
742
|
+
this.text += cdata;
|
|
743
|
+
this.advanceLine(pos, end + 3);
|
|
744
|
+
return end + 3;
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Read the `<!...>` markup at `pos`: a comment, a CDATA section or the DOCTYPE.
|
|
748
|
+
* @param pos - the index of the `<`
|
|
749
|
+
* @returns the index after the markup, or -1 when the buffer ends before the markup does
|
|
750
|
+
*/
|
|
751
|
+
declarationEnd(pos) {
|
|
752
|
+
const { buffer } = this;
|
|
753
|
+
if (buffer.length - pos < MIN_DECIDABLE_MARKUP) {
|
|
754
|
+
const head = buffer.slice(pos);
|
|
755
|
+
if (!this.final || DECLARATION_OPENERS.some((opener) => opener.startsWith(head))) {
|
|
756
|
+
return -1;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
if (buffer.startsWith("<!--", pos)) {
|
|
760
|
+
const end2 = buffer.indexOf("-->", pos + 4);
|
|
761
|
+
if (end2 < 0) {
|
|
762
|
+
return -1;
|
|
763
|
+
}
|
|
764
|
+
this.advanceLine(pos, end2 + 3);
|
|
765
|
+
return end2 + 3;
|
|
766
|
+
}
|
|
767
|
+
if (buffer.startsWith("<![CDATA[", pos)) {
|
|
768
|
+
return this.cdataEnd(pos);
|
|
769
|
+
}
|
|
770
|
+
if (!buffer.startsWith("<!DOCTYPE", pos)) {
|
|
771
|
+
if (buffer.slice(pos + 2, pos + 9).toUpperCase() === "DOCTYPE") {
|
|
772
|
+
throw new XmlSyntaxError(
|
|
773
|
+
`<!${buffer.slice(pos + 2, pos + 9)}> is not XML (it must be written <!DOCTYPE>); the input looks like an HTML document`,
|
|
774
|
+
this.line
|
|
775
|
+
);
|
|
776
|
+
}
|
|
777
|
+
throw new XmlSyntaxError("unexpected markup declaration", this.line);
|
|
778
|
+
}
|
|
779
|
+
if (this.rootSeen || this.doctypeSeen) {
|
|
780
|
+
throw new XmlSyntaxError("a DOCTYPE declaration is allowed once, before the root element", this.line);
|
|
781
|
+
}
|
|
782
|
+
const state = {
|
|
783
|
+
kind: "doctype",
|
|
784
|
+
pieces: [],
|
|
785
|
+
tail: "",
|
|
786
|
+
quote: 0,
|
|
787
|
+
depth: 0,
|
|
788
|
+
comment: false,
|
|
789
|
+
pi: false,
|
|
790
|
+
run: 0
|
|
791
|
+
};
|
|
792
|
+
const end = this.scanDoctype(state, buffer, pos + 9);
|
|
793
|
+
if (end < 0) {
|
|
794
|
+
return -1;
|
|
795
|
+
}
|
|
796
|
+
this.doctypeSeen = true;
|
|
797
|
+
this.handler.doctype?.(buffer.slice(pos, end), this.line);
|
|
798
|
+
this.advanceLine(pos, end);
|
|
799
|
+
return end;
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Check a processing instruction `<?target ...?>` (skipped otherwise): its target must be a
|
|
803
|
+
* name, and the reserved target `xml` is the XML declaration, allowed only at the very start
|
|
804
|
+
* of the document with a 1.x version.
|
|
805
|
+
* @param pos - the index of the `<`
|
|
806
|
+
* @param end - the index of the `?>`
|
|
807
|
+
*/
|
|
808
|
+
processingInstruction(pos, end) {
|
|
809
|
+
const body = this.buffer.slice(pos + 2, end);
|
|
810
|
+
const target = /^[^\s]*/.exec(body)?.[0] ?? "";
|
|
811
|
+
if (!isXmlName(target)) {
|
|
812
|
+
throw new XmlSyntaxError(`a processing instruction needs a target name, not "${target}"`, this.line);
|
|
813
|
+
}
|
|
814
|
+
if (target.toLowerCase() !== "xml") {
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
if (target !== "xml") {
|
|
818
|
+
throw new XmlSyntaxError(
|
|
819
|
+
`<?${target} is not an XML declaration (which is written <?xml in lower case); the target is reserved`,
|
|
820
|
+
this.line
|
|
821
|
+
);
|
|
822
|
+
}
|
|
823
|
+
if (!this.atStart || pos !== 0) {
|
|
824
|
+
throw new XmlSyntaxError(
|
|
825
|
+
"an XML declaration (<?xml ...?>) may appear only at the very start of the document; the target xml is reserved",
|
|
826
|
+
this.line
|
|
827
|
+
);
|
|
828
|
+
}
|
|
829
|
+
const version = /\bversion\s*=\s*(["'])([^"']*)\1/.exec(body)?.[2];
|
|
830
|
+
if (version === void 0) {
|
|
831
|
+
throw new XmlSyntaxError("the XML declaration has no version", this.line);
|
|
832
|
+
}
|
|
833
|
+
if (!/^1\.\d+$/.test(version)) {
|
|
834
|
+
throw new XmlSyntaxError(`XML version ${version} is not supported (only 1.x)`, this.line);
|
|
835
|
+
}
|
|
836
|
+
this.version = version;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* The line of a buffer position after `start`, the position the current line count refers to.
|
|
840
|
+
* Used on the error path only.
|
|
841
|
+
* @param start - a position on line `this.line`
|
|
842
|
+
* @param at - the position
|
|
843
|
+
* @returns its line
|
|
844
|
+
*/
|
|
845
|
+
lineIn(start, at) {
|
|
846
|
+
return lineAt(this.buffer.slice(start, at), at - start, this.line);
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* Decode the entities of a text, naming XML 1.1 when a character reference XML 1.0 forbids
|
|
850
|
+
* appears in a document that declares version 1.1.
|
|
851
|
+
* @param raw - the text as written
|
|
852
|
+
* @param line - the line the text starts on
|
|
853
|
+
* @returns the decoded text
|
|
854
|
+
*/
|
|
855
|
+
decode(raw, line) {
|
|
856
|
+
try {
|
|
857
|
+
return decodeEntities(raw, line, this.repairs);
|
|
858
|
+
} catch (err) {
|
|
859
|
+
if (err instanceof XmlSyntaxError && this.version !== null && this.version !== "1.0") {
|
|
860
|
+
throw new XmlSyntaxError(
|
|
861
|
+
`${err.message} (the document declares XML ${this.version}, whose character rules are not supported; it is read as XML 1.0)`,
|
|
862
|
+
err.line
|
|
863
|
+
);
|
|
864
|
+
}
|
|
865
|
+
throw err;
|
|
866
|
+
}
|
|
867
|
+
}
|
|
648
868
|
/**
|
|
649
869
|
* Parse a start tag at `pos`.
|
|
650
870
|
* @param pos - the index of the `<`
|
|
@@ -664,7 +884,9 @@ class XmlTokenizer {
|
|
|
664
884
|
const name = buffer.slice(i, nameEnd);
|
|
665
885
|
i = nameEnd;
|
|
666
886
|
const attrs = /* @__PURE__ */ new Map();
|
|
887
|
+
let declaresNamespace = false;
|
|
667
888
|
for (; ; ) {
|
|
889
|
+
const before = i;
|
|
668
890
|
while (i < length && isSpace(buffer.charCodeAt(i))) {
|
|
669
891
|
i++;
|
|
670
892
|
}
|
|
@@ -673,23 +895,29 @@ class XmlTokenizer {
|
|
|
673
895
|
}
|
|
674
896
|
const c = buffer.charCodeAt(i);
|
|
675
897
|
if (c === GT) {
|
|
676
|
-
return { name, attrs, selfClosing: false, end: i + 1 };
|
|
898
|
+
return { name, attrs, selfClosing: false, declaresNamespace, end: i + 1 };
|
|
677
899
|
}
|
|
678
900
|
if (c === SLASH) {
|
|
679
901
|
if (i + 1 >= length) {
|
|
680
902
|
return null;
|
|
681
903
|
}
|
|
682
904
|
if (buffer.charCodeAt(i + 1) !== GT) {
|
|
683
|
-
throw new XmlSyntaxError(`unexpected "/" in <${name}>`, this.
|
|
905
|
+
throw new XmlSyntaxError(`unexpected "/" in <${name}>`, this.lineIn(pos, i));
|
|
684
906
|
}
|
|
685
|
-
return { name, attrs, selfClosing: true, end: i + 2 };
|
|
907
|
+
return { name, attrs, selfClosing: true, declaresNamespace, end: i + 2 };
|
|
908
|
+
}
|
|
909
|
+
if (i === before) {
|
|
910
|
+
throw new XmlSyntaxError(
|
|
911
|
+
`the attributes of <${name}> must be separated by whitespace`,
|
|
912
|
+
this.lineIn(pos, i)
|
|
913
|
+
);
|
|
686
914
|
}
|
|
687
915
|
const attrEnd = this.readName(i);
|
|
688
916
|
if (attrEnd < 0) {
|
|
689
917
|
return null;
|
|
690
918
|
}
|
|
691
919
|
if (attrEnd === i) {
|
|
692
|
-
throw new XmlSyntaxError(`malformed attribute in <${name}>`, this.
|
|
920
|
+
throw new XmlSyntaxError(`malformed attribute in <${name}>`, this.lineIn(pos, i));
|
|
693
921
|
}
|
|
694
922
|
const attrName = buffer.slice(i, attrEnd);
|
|
695
923
|
i = attrEnd;
|
|
@@ -700,7 +928,7 @@ class XmlTokenizer {
|
|
|
700
928
|
return null;
|
|
701
929
|
}
|
|
702
930
|
if (buffer.charCodeAt(i) !== EQUALS) {
|
|
703
|
-
throw new XmlSyntaxError(`attribute ${attrName} of <${name}> has no value`, this.
|
|
931
|
+
throw new XmlSyntaxError(`attribute ${attrName} of <${name}> has no value`, this.lineIn(pos, i));
|
|
704
932
|
}
|
|
705
933
|
i++;
|
|
706
934
|
while (i < length && isSpace(buffer.charCodeAt(i))) {
|
|
@@ -711,23 +939,30 @@ class XmlTokenizer {
|
|
|
711
939
|
}
|
|
712
940
|
const quote = buffer.charCodeAt(i);
|
|
713
941
|
if (quote !== QUOTE && quote !== APOS) {
|
|
714
|
-
throw new XmlSyntaxError(`attribute ${attrName} of <${name}> is not quoted`, this.
|
|
942
|
+
throw new XmlSyntaxError(`attribute ${attrName} of <${name}> is not quoted`, this.lineIn(pos, i));
|
|
715
943
|
}
|
|
716
944
|
const close = buffer.indexOf(quote === QUOTE ? '"' : "'", i + 1);
|
|
717
945
|
if (close < 0) {
|
|
718
946
|
return null;
|
|
719
947
|
}
|
|
948
|
+
const line = this.lineIn(pos, i);
|
|
720
949
|
if (attrs.has(attrName)) {
|
|
721
|
-
throw new XmlSyntaxError(`duplicate attribute ${attrName} in <${name}>`,
|
|
950
|
+
throw new XmlSyntaxError(`duplicate attribute ${attrName} in <${name}>`, line);
|
|
722
951
|
}
|
|
723
952
|
const raw = buffer.slice(i + 1, close);
|
|
724
953
|
if (hasIllegalXmlChar(raw)) {
|
|
725
954
|
throw new XmlSyntaxError(
|
|
726
955
|
`a character XML 1.0 forbids appears in attribute ${attrName} of <${name}>`,
|
|
727
|
-
|
|
956
|
+
line
|
|
728
957
|
);
|
|
729
958
|
}
|
|
730
|
-
|
|
959
|
+
if (raw.includes("<")) {
|
|
960
|
+
throw new XmlSyntaxError(`a "<" in the value of attribute ${attrName} of <${name}> (write <)`, line);
|
|
961
|
+
}
|
|
962
|
+
if (attrName.startsWith("xmlns")) {
|
|
963
|
+
declaresNamespace = true;
|
|
964
|
+
}
|
|
965
|
+
attrs.set(attrName, this.decode(normalizeAttributeValue(raw), line));
|
|
731
966
|
i = close + 1;
|
|
732
967
|
}
|
|
733
968
|
}
|
|
@@ -788,10 +1023,26 @@ class XmlTokenizer {
|
|
|
788
1023
|
this.textLine = this.line;
|
|
789
1024
|
}
|
|
790
1025
|
const raw = this.buffer.slice(start, end);
|
|
791
|
-
|
|
792
|
-
|
|
1026
|
+
const bad = illegalCharIndex(raw);
|
|
1027
|
+
if (bad >= 0) {
|
|
1028
|
+
throw new XmlSyntaxError(
|
|
1029
|
+
"a character XML 1.0 forbids appears in character data",
|
|
1030
|
+
lineAt(raw, bad, this.line)
|
|
1031
|
+
);
|
|
1032
|
+
}
|
|
1033
|
+
if (raw.includes(">")) {
|
|
1034
|
+
const probe = this.textTail + raw;
|
|
1035
|
+
const close = probe.indexOf("]]>");
|
|
1036
|
+
if (close >= 0) {
|
|
1037
|
+
throw new XmlSyntaxError(
|
|
1038
|
+
'"]]>" is not allowed in character data (write ]]>)',
|
|
1039
|
+
lineAt(raw, Math.max(0, close - this.textTail.length), this.line)
|
|
1040
|
+
);
|
|
1041
|
+
}
|
|
793
1042
|
}
|
|
794
|
-
this.
|
|
1043
|
+
this.textTail = raw.length >= 2 ? raw.slice(-2) : (this.textTail + raw).slice(-2);
|
|
1044
|
+
this.atStart = false;
|
|
1045
|
+
this.text += this.decode(raw, this.line);
|
|
795
1046
|
this.advanceLine(start, end);
|
|
796
1047
|
}
|
|
797
1048
|
/**
|
|
@@ -834,16 +1085,48 @@ class XmlTokenizer {
|
|
|
834
1085
|
* Open an element.
|
|
835
1086
|
* @param name - the element name
|
|
836
1087
|
* @param attrs - its attributes
|
|
1088
|
+
* @param declaresNamespace - whether an attribute name starts with `xmlns`
|
|
837
1089
|
*/
|
|
838
|
-
startElement(name, attrs) {
|
|
1090
|
+
startElement(name, attrs, declaresNamespace) {
|
|
839
1091
|
if (this.stack.length === 0) {
|
|
840
1092
|
if (this.rootClosed) {
|
|
841
1093
|
throw new XmlSyntaxError(`a second root element <${name}> follows the document element`, this.line);
|
|
842
1094
|
}
|
|
843
1095
|
this.rootSeen = true;
|
|
844
1096
|
}
|
|
1097
|
+
if (declaresNamespace) {
|
|
1098
|
+
for (const [key, uri] of attrs) {
|
|
1099
|
+
if (key === "xmlns") {
|
|
1100
|
+
this.bindings.push({ prefix: "", uri, depth: this.stack.length });
|
|
1101
|
+
} else if (key.startsWith("xmlns:")) {
|
|
1102
|
+
this.bindings.push({ prefix: key.slice(6), uri, depth: this.stack.length });
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
845
1106
|
this.stack.push(name);
|
|
846
|
-
this.handler.start(name, attrs, this.line);
|
|
1107
|
+
this.handler.start(name, attrs, this.line, this.namespaceOf(name));
|
|
1108
|
+
}
|
|
1109
|
+
/**
|
|
1110
|
+
* The namespace an element name is in (Namespaces in XML 1.0 section 6).
|
|
1111
|
+
* @param name - the element name as written
|
|
1112
|
+
* @returns the URI; "" for no namespace; null for an undeclared prefix or a name that is not
|
|
1113
|
+
* namespace-well-formed
|
|
1114
|
+
*/
|
|
1115
|
+
namespaceOf(name) {
|
|
1116
|
+
const colon = name.indexOf(":");
|
|
1117
|
+
if (colon >= 0 && (colon === 0 || colon === name.length - 1 || name.includes(":", colon + 1))) {
|
|
1118
|
+
return null;
|
|
1119
|
+
}
|
|
1120
|
+
const prefix = colon < 0 ? "" : name.slice(0, colon);
|
|
1121
|
+
for (let i = this.bindings.length - 1; i >= 0; i--) {
|
|
1122
|
+
if (this.bindings[i].prefix === prefix) {
|
|
1123
|
+
return this.bindings[i].uri;
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
if (prefix === "xml") {
|
|
1127
|
+
return XML_NAMESPACE;
|
|
1128
|
+
}
|
|
1129
|
+
return prefix === "" ? "" : null;
|
|
847
1130
|
}
|
|
848
1131
|
/**
|
|
849
1132
|
* Close an element, checking that it matches the innermost open one.
|
|
@@ -858,6 +1141,9 @@ class XmlTokenizer {
|
|
|
858
1141
|
throw new XmlSyntaxError(`end tag </${name}> does not match <${open}>`, this.line);
|
|
859
1142
|
}
|
|
860
1143
|
this.stack.pop();
|
|
1144
|
+
while ((this.bindings.at(-1)?.depth ?? -1) >= this.stack.length) {
|
|
1145
|
+
this.bindings.pop();
|
|
1146
|
+
}
|
|
861
1147
|
if (this.stack.length === 0) {
|
|
862
1148
|
this.rootClosed = true;
|
|
863
1149
|
}
|
|
@@ -929,11 +1215,13 @@ const GML_NAMED = (() => {
|
|
|
929
1215
|
})();
|
|
930
1216
|
function decodeGmlString(body, onUnknown) {
|
|
931
1217
|
return body.replace(GML_ENTITY, (whole, entity) => {
|
|
932
|
-
if (entity.startsWith("#x")) {
|
|
933
|
-
return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));
|
|
934
|
-
}
|
|
935
1218
|
if (entity.startsWith("#")) {
|
|
936
|
-
|
|
1219
|
+
const code = entity.startsWith("#x") ? Number.parseInt(entity.slice(2), 16) : Number(entity.slice(1));
|
|
1220
|
+
if (code <= 1114111) {
|
|
1221
|
+
return String.fromCodePoint(code);
|
|
1222
|
+
}
|
|
1223
|
+
onUnknown?.(whole);
|
|
1224
|
+
return whole;
|
|
937
1225
|
}
|
|
938
1226
|
const known = GML_NAMED.get(entity);
|
|
939
1227
|
if (known === void 0) {
|
|
@@ -974,14 +1262,14 @@ function quoteDotId(text) {
|
|
|
974
1262
|
}
|
|
975
1263
|
return `"${text.replace(/"/g, '\\"')}"`;
|
|
976
1264
|
}
|
|
977
|
-
function quoteCsvCell(text, delimiter = ",") {
|
|
1265
|
+
function quoteCsvCell(text, delimiter = ",", quote = '"') {
|
|
978
1266
|
if (text.length === 0) {
|
|
979
|
-
return
|
|
1267
|
+
return quote + quote;
|
|
980
1268
|
}
|
|
981
|
-
if (!text.includes(delimiter) && !text.includes(
|
|
1269
|
+
if (!text.includes(delimiter) && !text.includes(quote) && !text.includes("\n") && !text.includes("\r") && text === text.trim()) {
|
|
982
1270
|
return text;
|
|
983
1271
|
}
|
|
984
|
-
return
|
|
1272
|
+
return `${quote}${text.split(quote).join(quote + quote)}${quote}`;
|
|
985
1273
|
}
|
|
986
1274
|
function isPajekLabel(text) {
|
|
987
1275
|
return !text.includes('"') && !text.includes("\n") && !text.includes("\r");
|
|
@@ -993,7 +1281,7 @@ function quotePajekLabel(text) {
|
|
|
993
1281
|
value: text
|
|
994
1282
|
});
|
|
995
1283
|
}
|
|
996
|
-
if (text.length > 0 && !/[\s"]/.test(text) && !text.startsWith("[")) {
|
|
1284
|
+
if (text.length > 0 && !/[\s"]/.test(text) && !text.startsWith("[") && !text.startsWith("%")) {
|
|
997
1285
|
return text;
|
|
998
1286
|
}
|
|
999
1287
|
return `"${text}"`;
|
|
@@ -1006,16 +1294,18 @@ export {
|
|
|
1006
1294
|
isWritableDotText as d,
|
|
1007
1295
|
escapeXmlAttribute as e,
|
|
1008
1296
|
xmlDeclaredEncoding as f,
|
|
1009
|
-
|
|
1297
|
+
XmlEmptyInputError as g,
|
|
1010
1298
|
hasIllegalXmlChar as h,
|
|
1011
1299
|
isPajekLabel as i,
|
|
1012
|
-
|
|
1013
|
-
|
|
1300
|
+
isWhitespace as j,
|
|
1301
|
+
decodeGmlString as k,
|
|
1014
1302
|
localName as l,
|
|
1015
|
-
|
|
1303
|
+
quoteGmlString as m,
|
|
1016
1304
|
isXmlName as n,
|
|
1305
|
+
quoteCsvCell as o,
|
|
1017
1306
|
quotePajekLabel as q,
|
|
1307
|
+
sniffXmlText as s,
|
|
1018
1308
|
tokenizeXml as t,
|
|
1019
1309
|
xmlIllegalTextNotes as x
|
|
1020
1310
|
};
|
|
1021
|
-
//# sourceMappingURL=escape-
|
|
1311
|
+
//# sourceMappingURL=escape-D0g6NNUy.js.map
|