@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.
Files changed (581) hide show
  1. package/README.md +49 -414
  2. package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
  3. package/dist/chunks/choose-DrXtu_96.js +56 -0
  4. package/dist/chunks/choose-DrXtu_96.js.map +1 -0
  5. package/dist/chunks/constants-ikG85dT8.js +231 -0
  6. package/dist/chunks/constants-ikG85dT8.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
  8. package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
  9. package/dist/chunks/export-CHd4tQE2.js +4333 -0
  10. package/dist/chunks/export-CHd4tQE2.js.map +1 -0
  11. package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
  12. package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
  13. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
  14. package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
  15. package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
  16. package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
  17. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
  18. package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
  19. package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
  20. package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
  22. package/dist/chunks/importer-B2W_58pz.js.map +1 -0
  23. package/dist/chunks/importer-BSALvkui.js +2811 -0
  24. package/dist/chunks/importer-BSALvkui.js.map +1 -0
  25. package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
  26. package/dist/chunks/importer-BVRE--Un.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
  28. package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
  29. package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
  30. package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
  31. package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
  32. package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
  33. package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
  34. package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
  35. package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
  36. package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
  38. package/dist/chunks/records-CdlvL4RO.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
  40. package/dist/chunks/text-DzXjAiTl.js.map +1 -0
  41. package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
  42. package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
  43. package/dist/csv.js +952 -262
  44. package/dist/csv.js.map +1 -1
  45. package/dist/cx.js +6 -3
  46. package/dist/cx2.js +2 -2
  47. package/dist/cys.js +6 -3
  48. package/dist/dot.js +1 -1
  49. package/dist/gexf.js +554 -122
  50. package/dist/gexf.js.map +1 -1
  51. package/dist/gml.js +344 -87
  52. package/dist/gml.js.map +1 -1
  53. package/dist/graph-io.js +1105 -213
  54. package/dist/graph-io.js.map +1 -1
  55. package/dist/graphml.js +3 -2
  56. package/dist/graphml.js.map +1 -1
  57. package/dist/json.js +3 -2
  58. package/dist/neo4j.js +565 -158
  59. package/dist/neo4j.js.map +1 -1
  60. package/dist/obo.js +6 -3
  61. package/dist/pajek.js +1 -1
  62. package/dist/src/children.d.ts +18 -6
  63. package/dist/src/children.d.ts.map +1 -1
  64. package/dist/src/children.js +6 -3
  65. package/dist/src/children.js.map +1 -1
  66. package/dist/src/common/attributes.d.ts +29 -11
  67. package/dist/src/common/attributes.d.ts.map +1 -1
  68. package/dist/src/common/attributes.js +25 -7
  69. package/dist/src/common/attributes.js.map +1 -1
  70. package/dist/src/common/cell-budget.d.ts +9 -2
  71. package/dist/src/common/cell-budget.d.ts.map +1 -1
  72. package/dist/src/common/cell-budget.js +11 -3
  73. package/dist/src/common/cell-budget.js.map +1 -1
  74. package/dist/src/common/choose.d.ts +19 -0
  75. package/dist/src/common/choose.d.ts.map +1 -0
  76. package/dist/src/common/choose.js +72 -0
  77. package/dist/src/common/choose.js.map +1 -0
  78. package/dist/src/common/codes.d.ts +456 -66
  79. package/dist/src/common/codes.d.ts.map +1 -1
  80. package/dist/src/common/codes.js +458 -66
  81. package/dist/src/common/codes.js.map +1 -1
  82. package/dist/src/common/compare.d.ts +81 -0
  83. package/dist/src/common/compare.d.ts.map +1 -0
  84. package/dist/src/common/compare.js +394 -0
  85. package/dist/src/common/compare.js.map +1 -0
  86. package/dist/src/common/cx-export.d.ts +123 -0
  87. package/dist/src/common/cx-export.d.ts.map +1 -0
  88. package/dist/src/common/cx-export.js +334 -0
  89. package/dist/src/common/cx-export.js.map +1 -0
  90. package/dist/src/common/declared-types.d.ts +22 -2
  91. package/dist/src/common/declared-types.d.ts.map +1 -1
  92. package/dist/src/common/declared-types.js +21 -3
  93. package/dist/src/common/declared-types.js.map +1 -1
  94. package/dist/src/common/direction.d.ts +74 -50
  95. package/dist/src/common/direction.d.ts.map +1 -1
  96. package/dist/src/common/direction.js +47 -27
  97. package/dist/src/common/direction.js.map +1 -1
  98. package/dist/src/common/escape.d.ts +21 -9
  99. package/dist/src/common/escape.d.ts.map +1 -1
  100. package/dist/src/common/escape.js +39 -22
  101. package/dist/src/common/escape.js.map +1 -1
  102. package/dist/src/common/export.d.ts +144 -32
  103. package/dist/src/common/export.d.ts.map +1 -1
  104. package/dist/src/common/export.js +216 -42
  105. package/dist/src/common/export.js.map +1 -1
  106. package/dist/src/common/format.d.ts +23 -1
  107. package/dist/src/common/format.d.ts.map +1 -1
  108. package/dist/src/common/format.js +26 -1
  109. package/dist/src/common/format.js.map +1 -1
  110. package/dist/src/common/ids.d.ts +9 -2
  111. package/dist/src/common/ids.d.ts.map +1 -1
  112. package/dist/src/common/ids.js +6 -2
  113. package/dist/src/common/ids.js.map +1 -1
  114. package/dist/src/common/input.d.ts +122 -28
  115. package/dist/src/common/input.d.ts.map +1 -1
  116. package/dist/src/common/input.js +890 -124
  117. package/dist/src/common/input.js.map +1 -1
  118. package/dist/src/common/json-elements.d.ts +144 -20
  119. package/dist/src/common/json-elements.d.ts.map +1 -1
  120. package/dist/src/common/json-elements.js +869 -189
  121. package/dist/src/common/json-elements.js.map +1 -1
  122. package/dist/src/common/line-format.d.ts +90 -0
  123. package/dist/src/common/line-format.d.ts.map +1 -0
  124. package/dist/src/common/line-format.js +185 -0
  125. package/dist/src/common/line-format.js.map +1 -0
  126. package/dist/src/common/lists.d.ts +6 -1
  127. package/dist/src/common/lists.d.ts.map +1 -1
  128. package/dist/src/common/lists.js +3 -1
  129. package/dist/src/common/lists.js.map +1 -1
  130. package/dist/src/common/ontology-export.d.ts +167 -0
  131. package/dist/src/common/ontology-export.d.ts.map +1 -0
  132. package/dist/src/common/ontology-export.js +359 -0
  133. package/dist/src/common/ontology-export.js.map +1 -0
  134. package/dist/src/common/ontology.d.ts +25 -3
  135. package/dist/src/common/ontology.d.ts.map +1 -1
  136. package/dist/src/common/ontology.js +30 -9
  137. package/dist/src/common/ontology.js.map +1 -1
  138. package/dist/src/common/options.d.ts +62 -12
  139. package/dist/src/common/options.d.ts.map +1 -1
  140. package/dist/src/common/options.js +89 -11
  141. package/dist/src/common/options.js.map +1 -1
  142. package/dist/src/common/plural.d.ts +31 -0
  143. package/dist/src/common/plural.d.ts.map +1 -0
  144. package/dist/src/common/plural.js +46 -0
  145. package/dist/src/common/plural.js.map +1 -0
  146. package/dist/src/common/report.d.ts +72 -14
  147. package/dist/src/common/report.d.ts.map +1 -1
  148. package/dist/src/common/report.js +146 -22
  149. package/dist/src/common/report.js.map +1 -1
  150. package/dist/src/common/temporal.d.ts +22 -5
  151. package/dist/src/common/temporal.d.ts.map +1 -1
  152. package/dist/src/common/temporal.js +13 -2
  153. package/dist/src/common/temporal.js.map +1 -1
  154. package/dist/src/common/text.d.ts +39 -23
  155. package/dist/src/common/text.d.ts.map +1 -1
  156. package/dist/src/common/text.js +51 -21
  157. package/dist/src/common/text.js.map +1 -1
  158. package/dist/src/common/weights.d.ts +37 -4
  159. package/dist/src/common/weights.d.ts.map +1 -1
  160. package/dist/src/common/weights.js +61 -2
  161. package/dist/src/common/weights.js.map +1 -1
  162. package/dist/src/common/writer.d.ts +19 -3
  163. package/dist/src/common/writer.d.ts.map +1 -1
  164. package/dist/src/common/writer.js +30 -2
  165. package/dist/src/common/writer.js.map +1 -1
  166. package/dist/src/common/xml.d.ts +125 -9
  167. package/dist/src/common/xml.d.ts.map +1 -1
  168. package/dist/src/common/xml.js +402 -85
  169. package/dist/src/common/xml.js.map +1 -1
  170. package/dist/src/common/zip.d.ts +44 -4
  171. package/dist/src/common/zip.d.ts.map +1 -1
  172. package/dist/src/common/zip.js +134 -5
  173. package/dist/src/common/zip.js.map +1 -1
  174. package/dist/src/formats/csv/exporter.d.ts +80 -24
  175. package/dist/src/formats/csv/exporter.d.ts.map +1 -1
  176. package/dist/src/formats/csv/exporter.js +146 -33
  177. package/dist/src/formats/csv/exporter.js.map +1 -1
  178. package/dist/src/formats/csv/header.d.ts +38 -9
  179. package/dist/src/formats/csv/header.d.ts.map +1 -1
  180. package/dist/src/formats/csv/header.js +46 -10
  181. package/dist/src/formats/csv/header.js.map +1 -1
  182. package/dist/src/formats/csv/importer.d.ts +187 -37
  183. package/dist/src/formats/csv/importer.d.ts.map +1 -1
  184. package/dist/src/formats/csv/importer.js +835 -204
  185. package/dist/src/formats/csv/importer.js.map +1 -1
  186. package/dist/src/formats/csv/index.d.ts +100 -19
  187. package/dist/src/formats/csv/index.d.ts.map +1 -1
  188. package/dist/src/formats/csv/index.js +94 -21
  189. package/dist/src/formats/csv/index.js.map +1 -1
  190. package/dist/src/formats/csv/records.d.ts +95 -10
  191. package/dist/src/formats/csv/records.d.ts.map +1 -1
  192. package/dist/src/formats/csv/records.js +333 -122
  193. package/dist/src/formats/csv/records.js.map +1 -1
  194. package/dist/src/formats/csv/values.d.ts +1 -0
  195. package/dist/src/formats/csv/values.d.ts.map +1 -1
  196. package/dist/src/formats/csv/values.js +1 -0
  197. package/dist/src/formats/csv/values.js.map +1 -1
  198. package/dist/src/formats/cx/exporter.d.ts +102 -0
  199. package/dist/src/formats/cx/exporter.d.ts.map +1 -0
  200. package/dist/src/formats/cx/exporter.js +1217 -0
  201. package/dist/src/formats/cx/exporter.js.map +1 -0
  202. package/dist/src/formats/cx/importer.d.ts +79 -32
  203. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  204. package/dist/src/formats/cx/importer.js +682 -287
  205. package/dist/src/formats/cx/importer.js.map +1 -1
  206. package/dist/src/formats/cx/index.d.ts +4 -3
  207. package/dist/src/formats/cx/index.d.ts.map +1 -1
  208. package/dist/src/formats/cx/index.js +4 -3
  209. package/dist/src/formats/cx/index.js.map +1 -1
  210. package/dist/src/formats/cx2/exporter.d.ts +29 -11
  211. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  212. package/dist/src/formats/cx2/exporter.js +39 -268
  213. package/dist/src/formats/cx2/exporter.js.map +1 -1
  214. package/dist/src/formats/cx2/importer.d.ts +78 -28
  215. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  216. package/dist/src/formats/cx2/importer.js +227 -80
  217. package/dist/src/formats/cx2/importer.js.map +1 -1
  218. package/dist/src/formats/cx2/index.d.ts +2 -1
  219. package/dist/src/formats/cx2/index.d.ts.map +1 -1
  220. package/dist/src/formats/cx2/index.js +2 -1
  221. package/dist/src/formats/cx2/index.js.map +1 -1
  222. package/dist/src/formats/cys/constants.d.ts +66 -17
  223. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  224. package/dist/src/formats/cys/constants.js +59 -18
  225. package/dist/src/formats/cys/constants.js.map +1 -1
  226. package/dist/src/formats/cys/exporter.d.ts +118 -0
  227. package/dist/src/formats/cys/exporter.d.ts.map +1 -0
  228. package/dist/src/formats/cys/exporter.js +1072 -0
  229. package/dist/src/formats/cys/exporter.js.map +1 -0
  230. package/dist/src/formats/cys/importer.d.ts +22 -8
  231. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  232. package/dist/src/formats/cys/importer.js +510 -149
  233. package/dist/src/formats/cys/importer.js.map +1 -1
  234. package/dist/src/formats/cys/index.d.ts +4 -2
  235. package/dist/src/formats/cys/index.d.ts.map +1 -1
  236. package/dist/src/formats/cys/index.js +4 -2
  237. package/dist/src/formats/cys/index.js.map +1 -1
  238. package/dist/src/formats/cys/session.d.ts +46 -7
  239. package/dist/src/formats/cys/session.d.ts.map +1 -1
  240. package/dist/src/formats/cys/session.js +101 -27
  241. package/dist/src/formats/cys/session.js.map +1 -1
  242. package/dist/src/formats/cys/tables.d.ts +9 -2
  243. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  244. package/dist/src/formats/cys/tables.js +29 -7
  245. package/dist/src/formats/cys/tables.js.map +1 -1
  246. package/dist/src/formats/dot/exporter.d.ts +42 -14
  247. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  248. package/dist/src/formats/dot/exporter.js +56 -29
  249. package/dist/src/formats/dot/exporter.js.map +1 -1
  250. package/dist/src/formats/dot/importer.d.ts +91 -29
  251. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  252. package/dist/src/formats/dot/importer.js +190 -39
  253. package/dist/src/formats/dot/importer.js.map +1 -1
  254. package/dist/src/formats/dot/index.d.ts +2 -1
  255. package/dist/src/formats/dot/index.d.ts.map +1 -1
  256. package/dist/src/formats/dot/index.js +2 -1
  257. package/dist/src/formats/dot/index.js.map +1 -1
  258. package/dist/src/formats/dot/names.d.ts +44 -11
  259. package/dist/src/formats/dot/names.d.ts.map +1 -1
  260. package/dist/src/formats/dot/names.js +44 -11
  261. package/dist/src/formats/dot/names.js.map +1 -1
  262. package/dist/src/formats/dot/tokenizer.d.ts +9 -2
  263. package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
  264. package/dist/src/formats/dot/tokenizer.js +20 -5
  265. package/dist/src/formats/dot/tokenizer.js.map +1 -1
  266. package/dist/src/formats/gexf/exporter.d.ts +46 -15
  267. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  268. package/dist/src/formats/gexf/exporter.js +45 -15
  269. package/dist/src/formats/gexf/exporter.js.map +1 -1
  270. package/dist/src/formats/gexf/importer.d.ts +87 -23
  271. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  272. package/dist/src/formats/gexf/importer.js +471 -90
  273. package/dist/src/formats/gexf/importer.js.map +1 -1
  274. package/dist/src/formats/gexf/index.d.ts +84 -21
  275. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  276. package/dist/src/formats/gexf/index.js +80 -23
  277. package/dist/src/formats/gexf/index.js.map +1 -1
  278. package/dist/src/formats/gexf/schema.d.ts +67 -15
  279. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  280. package/dist/src/formats/gexf/schema.js +59 -13
  281. package/dist/src/formats/gexf/schema.js.map +1 -1
  282. package/dist/src/formats/gml/exporter.d.ts +69 -21
  283. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/gml/exporter.js +74 -29
  285. package/dist/src/formats/gml/exporter.js.map +1 -1
  286. package/dist/src/formats/gml/importer.d.ts +116 -25
  287. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  288. package/dist/src/formats/gml/importer.js +290 -61
  289. package/dist/src/formats/gml/importer.js.map +1 -1
  290. package/dist/src/formats/gml/index.d.ts +87 -24
  291. package/dist/src/formats/gml/index.d.ts.map +1 -1
  292. package/dist/src/formats/gml/index.js +79 -26
  293. package/dist/src/formats/gml/index.js.map +1 -1
  294. package/dist/src/formats/gml/syntax.d.ts +67 -18
  295. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  296. package/dist/src/formats/gml/syntax.js +110 -28
  297. package/dist/src/formats/gml/syntax.js.map +1 -1
  298. package/dist/src/formats/graphml/constants.d.ts +174 -44
  299. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  300. package/dist/src/formats/graphml/constants.js +165 -44
  301. package/dist/src/formats/graphml/constants.js.map +1 -1
  302. package/dist/src/formats/graphml/exporter.d.ts +17 -9
  303. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  304. package/dist/src/formats/graphml/exporter.js +33 -12
  305. package/dist/src/formats/graphml/exporter.js.map +1 -1
  306. package/dist/src/formats/graphml/importer.d.ts +19 -7
  307. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  308. package/dist/src/formats/graphml/importer.js +466 -39
  309. package/dist/src/formats/graphml/importer.js.map +1 -1
  310. package/dist/src/formats/graphml/index.d.ts +2 -1
  311. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  312. package/dist/src/formats/graphml/index.js +2 -1
  313. package/dist/src/formats/graphml/index.js.map +1 -1
  314. package/dist/src/formats/graphml/tree.d.ts +6 -2
  315. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  316. package/dist/src/formats/graphml/tree.js +6 -2
  317. package/dist/src/formats/graphml/tree.js.map +1 -1
  318. package/dist/src/formats/graphml/yfiles.d.ts +8 -3
  319. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  320. package/dist/src/formats/graphml/yfiles.js +36 -15
  321. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  322. package/dist/src/formats/json/dialect.d.ts +88 -24
  323. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  324. package/dist/src/formats/json/dialect.js +109 -19
  325. package/dist/src/formats/json/dialect.js.map +1 -1
  326. package/dist/src/formats/json/exporter.d.ts +134 -22
  327. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  328. package/dist/src/formats/json/exporter.js +135 -54
  329. package/dist/src/formats/json/exporter.js.map +1 -1
  330. package/dist/src/formats/json/importer.d.ts +173 -52
  331. package/dist/src/formats/json/importer.d.ts.map +1 -1
  332. package/dist/src/formats/json/importer.js +899 -220
  333. package/dist/src/formats/json/importer.js.map +1 -1
  334. package/dist/src/formats/json/index.d.ts +3 -2
  335. package/dist/src/formats/json/index.d.ts.map +1 -1
  336. package/dist/src/formats/json/index.js +3 -2
  337. package/dist/src/formats/json/index.js.map +1 -1
  338. package/dist/src/formats/json/obographs-export.d.ts +68 -0
  339. package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
  340. package/dist/src/formats/json/obographs-export.js +941 -0
  341. package/dist/src/formats/json/obographs-export.js.map +1 -0
  342. package/dist/src/formats/json/obographs.d.ts +26 -0
  343. package/dist/src/formats/json/obographs.d.ts.map +1 -1
  344. package/dist/src/formats/json/obographs.js +297 -80
  345. package/dist/src/formats/json/obographs.js.map +1 -1
  346. package/dist/src/formats/neo4j/exporter.d.ts +109 -21
  347. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  348. package/dist/src/formats/neo4j/exporter.js +239 -86
  349. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  350. package/dist/src/formats/neo4j/header.d.ts +17 -4
  351. package/dist/src/formats/neo4j/header.d.ts.map +1 -1
  352. package/dist/src/formats/neo4j/header.js +36 -4
  353. package/dist/src/formats/neo4j/header.js.map +1 -1
  354. package/dist/src/formats/neo4j/importer.d.ts +107 -27
  355. package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
  356. package/dist/src/formats/neo4j/importer.js +415 -63
  357. package/dist/src/formats/neo4j/importer.js.map +1 -1
  358. package/dist/src/formats/neo4j/index.d.ts +73 -23
  359. package/dist/src/formats/neo4j/index.d.ts.map +1 -1
  360. package/dist/src/formats/neo4j/index.js +65 -25
  361. package/dist/src/formats/neo4j/index.js.map +1 -1
  362. package/dist/src/formats/obo/exporter.d.ts +150 -0
  363. package/dist/src/formats/obo/exporter.d.ts.map +1 -0
  364. package/dist/src/formats/obo/exporter.js +1736 -0
  365. package/dist/src/formats/obo/exporter.js.map +1 -0
  366. package/dist/src/formats/obo/importer.d.ts +95 -19
  367. package/dist/src/formats/obo/importer.d.ts.map +1 -1
  368. package/dist/src/formats/obo/importer.js +475 -104
  369. package/dist/src/formats/obo/importer.js.map +1 -1
  370. package/dist/src/formats/obo/index.d.ts +6 -3
  371. package/dist/src/formats/obo/index.d.ts.map +1 -1
  372. package/dist/src/formats/obo/index.js +6 -3
  373. package/dist/src/formats/obo/index.js.map +1 -1
  374. package/dist/src/formats/obo/syntax.d.ts +108 -4
  375. package/dist/src/formats/obo/syntax.d.ts.map +1 -1
  376. package/dist/src/formats/obo/syntax.js +211 -34
  377. package/dist/src/formats/obo/syntax.js.map +1 -1
  378. package/dist/src/formats/pajek/exporter.d.ts +54 -16
  379. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  380. package/dist/src/formats/pajek/exporter.js +67 -35
  381. package/dist/src/formats/pajek/exporter.js.map +1 -1
  382. package/dist/src/formats/pajek/importer.d.ts +84 -22
  383. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  384. package/dist/src/formats/pajek/importer.js +303 -83
  385. package/dist/src/formats/pajek/importer.js.map +1 -1
  386. package/dist/src/formats/pajek/index.d.ts +2 -1
  387. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  388. package/dist/src/formats/pajek/index.js +2 -1
  389. package/dist/src/formats/pajek/index.js.map +1 -1
  390. package/dist/src/formats/pajek/syntax.d.ts +77 -14
  391. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  392. package/dist/src/formats/pajek/syntax.js +186 -54
  393. package/dist/src/formats/pajek/syntax.js.map +1 -1
  394. package/dist/src/formats/xgmml/columns.d.ts +1 -0
  395. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  396. package/dist/src/formats/xgmml/columns.js +4 -0
  397. package/dist/src/formats/xgmml/columns.js.map +1 -1
  398. package/dist/src/formats/xgmml/constants.d.ts +186 -56
  399. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  400. package/dist/src/formats/xgmml/constants.js +181 -57
  401. package/dist/src/formats/xgmml/constants.js.map +1 -1
  402. package/dist/src/formats/xgmml/document.d.ts +65 -11
  403. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  404. package/dist/src/formats/xgmml/document.js +157 -28
  405. package/dist/src/formats/xgmml/document.js.map +1 -1
  406. package/dist/src/formats/xgmml/emit.d.ts +61 -3
  407. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  408. package/dist/src/formats/xgmml/emit.js +129 -26
  409. package/dist/src/formats/xgmml/emit.js.map +1 -1
  410. package/dist/src/formats/xgmml/exporter.d.ts +13 -6
  411. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  412. package/dist/src/formats/xgmml/exporter.js +21 -22
  413. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  414. package/dist/src/formats/xgmml/importer.d.ts +33 -12
  415. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  416. package/dist/src/formats/xgmml/importer.js +35 -72
  417. package/dist/src/formats/xgmml/importer.js.map +1 -1
  418. package/dist/src/formats/xgmml/index.d.ts +1 -0
  419. package/dist/src/formats/xgmml/index.d.ts.map +1 -1
  420. package/dist/src/formats/xgmml/index.js +1 -0
  421. package/dist/src/formats/xgmml/index.js.map +1 -1
  422. package/dist/src/formats/xgmml/values.d.ts +8 -1
  423. package/dist/src/formats/xgmml/values.d.ts.map +1 -1
  424. package/dist/src/formats/xgmml/values.js +8 -3
  425. package/dist/src/formats/xgmml/values.js.map +1 -1
  426. package/dist/src/index.d.ts +23 -18
  427. package/dist/src/index.d.ts.map +1 -1
  428. package/dist/src/index.js +28 -16
  429. package/dist/src/index.js.map +1 -1
  430. package/dist/src/registry.d.ts +478 -92
  431. package/dist/src/registry.d.ts.map +1 -1
  432. package/dist/src/registry.js +807 -88
  433. package/dist/src/registry.js.map +1 -1
  434. package/dist/src/sniff.d.ts +61 -19
  435. package/dist/src/sniff.d.ts.map +1 -1
  436. package/dist/src/sniff.js +121 -29
  437. package/dist/src/sniff.js.map +1 -1
  438. package/dist/src/types.d.ts +362 -112
  439. package/dist/src/types.d.ts.map +1 -1
  440. package/dist/src/types.js +28 -7
  441. package/dist/src/types.js.map +1 -1
  442. package/dist/xgmml.js +2 -2
  443. package/docs/samples/README.md +25 -0
  444. package/docs/samples/got-edges.csv +353 -0
  445. package/docs/samples/got-network.graphml +1384 -0
  446. package/docs/samples/got-nodes.csv +108 -0
  447. package/docs/samples/got.cx +930 -0
  448. package/docs/samples/got.cx2 +465 -0
  449. package/docs/samples/got.gexf +471 -0
  450. package/docs/samples/got.gml +2650 -0
  451. package/docs/samples/got.json +2546 -0
  452. package/docs/samples/got.net +461 -0
  453. package/docs/samples/movies-nodes.csv +9 -0
  454. package/docs/samples/movies-rels.csv +8 -0
  455. package/docs/samples/networks.cys +0 -0
  456. package/docs/samples/proteins.xgmml +9 -0
  457. package/docs/samples/teams.gv +24 -0
  458. package/docs/samples/vehicles.obo +25 -0
  459. package/package.json +9 -4
  460. package/src/children.ts +18 -6
  461. package/src/common/attributes.ts +29 -11
  462. package/src/common/cell-budget.ts +11 -3
  463. package/src/common/choose.ts +89 -0
  464. package/src/common/codes.ts +490 -66
  465. package/src/common/compare.ts +472 -0
  466. package/src/common/cx-export.ts +432 -0
  467. package/src/common/declared-types.ts +40 -6
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +39 -22
  470. package/src/common/export.ts +284 -47
  471. package/src/common/format.ts +30 -1
  472. package/src/common/ids.ts +14 -3
  473. package/src/common/input.ts +1057 -134
  474. package/src/common/json-elements.ts +1035 -199
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +7 -2
  477. package/src/common/ontology-export.ts +461 -0
  478. package/src/common/ontology.ts +31 -9
  479. package/src/common/options.ts +110 -15
  480. package/src/common/plural.ts +49 -0
  481. package/src/common/report.ts +168 -25
  482. package/src/common/temporal.ts +22 -5
  483. package/src/common/text.ts +62 -23
  484. package/src/common/weights.ts +74 -4
  485. package/src/common/writer.ts +37 -3
  486. package/src/common/xml.ts +479 -90
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +202 -47
  489. package/src/formats/csv/header.ts +50 -11
  490. package/src/formats/csv/importer.ts +1133 -245
  491. package/src/formats/csv/index.ts +106 -19
  492. package/src/formats/csv/records.ts +396 -122
  493. package/src/formats/csv/values.ts +1 -0
  494. package/src/formats/cx/exporter.ts +1483 -0
  495. package/src/formats/cx/importer.ts +890 -302
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +62 -339
  498. package/src/formats/cx2/importer.ts +318 -87
  499. package/src/formats/cx2/index.ts +2 -1
  500. package/src/formats/cys/constants.ts +62 -17
  501. package/src/formats/cys/exporter.ts +1368 -0
  502. package/src/formats/cys/importer.ts +659 -157
  503. package/src/formats/cys/index.ts +4 -2
  504. package/src/formats/cys/session.ts +142 -34
  505. package/src/formats/cys/tables.ts +47 -9
  506. package/src/formats/dot/exporter.ts +83 -37
  507. package/src/formats/dot/importer.ts +248 -54
  508. package/src/formats/dot/index.ts +2 -1
  509. package/src/formats/dot/names.ts +44 -11
  510. package/src/formats/dot/tokenizer.ts +25 -6
  511. package/src/formats/gexf/exporter.ts +57 -18
  512. package/src/formats/gexf/importer.ts +636 -105
  513. package/src/formats/gexf/index.ts +90 -21
  514. package/src/formats/gexf/schema.ts +67 -15
  515. package/src/formats/gml/exporter.ts +90 -36
  516. package/src/formats/gml/importer.ts +388 -67
  517. package/src/formats/gml/index.ts +85 -24
  518. package/src/formats/gml/syntax.ts +113 -28
  519. package/src/formats/graphml/constants.ts +178 -44
  520. package/src/formats/graphml/exporter.ts +52 -18
  521. package/src/formats/graphml/importer.ts +640 -60
  522. package/src/formats/graphml/index.ts +2 -1
  523. package/src/formats/graphml/tree.ts +6 -2
  524. package/src/formats/graphml/yfiles.ts +37 -15
  525. package/src/formats/json/dialect.ts +128 -29
  526. package/src/formats/json/exporter.ts +205 -68
  527. package/src/formats/json/importer.ts +1163 -253
  528. package/src/formats/json/index.ts +3 -1
  529. package/src/formats/json/obographs-export.ts +1197 -0
  530. package/src/formats/json/obographs.ts +353 -92
  531. package/src/formats/neo4j/exporter.ts +321 -102
  532. package/src/formats/neo4j/header.ts +44 -6
  533. package/src/formats/neo4j/importer.ts +512 -73
  534. package/src/formats/neo4j/index.ts +75 -23
  535. package/src/formats/obo/exporter.ts +2210 -0
  536. package/src/formats/obo/importer.ts +622 -109
  537. package/src/formats/obo/index.ts +6 -3
  538. package/src/formats/obo/syntax.ts +232 -37
  539. package/src/formats/pajek/exporter.ts +90 -42
  540. package/src/formats/pajek/importer.ts +407 -93
  541. package/src/formats/pajek/index.ts +2 -1
  542. package/src/formats/pajek/syntax.ts +216 -55
  543. package/src/formats/xgmml/columns.ts +10 -0
  544. package/src/formats/xgmml/constants.ts +183 -56
  545. package/src/formats/xgmml/document.ts +212 -34
  546. package/src/formats/xgmml/emit.ts +175 -34
  547. package/src/formats/xgmml/exporter.ts +36 -28
  548. package/src/formats/xgmml/importer.ts +64 -86
  549. package/src/formats/xgmml/index.ts +1 -0
  550. package/src/formats/xgmml/values.ts +12 -4
  551. package/src/index.ts +81 -11
  552. package/src/registry.ts +1121 -135
  553. package/src/sniff.ts +163 -32
  554. package/src/types.ts +385 -114
  555. package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
  556. package/dist/chunks/export-Bh60Dv-n.js +0 -582
  557. package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
  558. package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
  559. package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
  560. package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
  561. package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
  562. package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
  563. package/dist/chunks/importer-DET1tg6s.js.map +0 -1
  564. package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
  565. package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
  566. package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
  567. package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
  568. package/dist/chunks/importer-eUREhBGj.js.map +0 -1
  569. package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
  570. package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
  571. package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
  572. package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
  573. package/dist/chunks/ontology-BnrJ4I98.js +0 -113
  574. package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
  575. package/dist/chunks/records-dbRkxwaq.js.map +0 -1
  576. package/dist/chunks/report-B1z4WT9e.js +0 -2372
  577. package/dist/chunks/report-B1z4WT9e.js.map +0 -1
  578. package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
  579. package/dist/chunks/weights-Dzba96G3.js +0 -176
  580. package/dist/chunks/weights-Dzba96G3.js.map +0 -1
  581. package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
@@ -1,6 +1,5 @@
1
1
  import { GraphFormatError } from "@graphty/graph-format";
2
- import { a0 as XML_ILLEGAL_CHAR_CODE } from "./report-B1z4WT9e.js";
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-CHd4tQE2.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(s) hold a character XML 1.0 cannot carry; export() will throw`,
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(s) hold a character XML 1.0 cannot carry; export() will throw`,
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 ? /^[0-9a-fA-F]{1,6}$/.test(digits) : /^[0-9]{1,7}$/.test(digits);
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
- for await (const chunk of chunks) {
226
- tokenizer.push(chunk);
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;
@@ -269,18 +346,21 @@ class XmlTokenizer {
269
346
  text = text.slice(0, -1);
270
347
  }
271
348
  if (text.includes("\r")) {
272
- text = text.replace(/\r\n?/g, "\n");
349
+ text = text.replaceAll(/\r\n?/g, "\n");
273
350
  }
274
351
  this.feed(text);
275
352
  }
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("\n");
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 normalised text: continue a pending token's terminator scan over the new text alone,
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 normalised
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 && amp >= length - MAX_ENTITY_LENGTH && buffer.indexOf(";", amp) < 0) {
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
- if (buffer.length - pos < MIN_DECIDABLE_MARKUP && !this.final) {
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).trim();
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.line);
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.line);
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.line);
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.line);
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}>`, this.line);
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
- this.line
956
+ line
728
957
  );
729
958
  }
730
- attrs.set(attrName, decodeEntities(normalizeAttributeValue(raw), this.line, this.repairs));
959
+ if (raw.includes("<")) {
960
+ throw new XmlSyntaxError(`a "<" in the value of attribute ${attrName} of <${name}> (write &lt;)`, 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
- if (hasIllegalXmlChar(raw)) {
792
- throw new XmlSyntaxError("a character XML 1.0 forbids appears in character data", this.line);
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 ]]&gt;)',
1039
+ lineAt(raw, Math.max(0, close - this.textTail.length), this.line)
1040
+ );
1041
+ }
793
1042
  }
794
- this.text += decodeEntities(raw, this.line, this.repairs);
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
  }
@@ -865,7 +1151,7 @@ class XmlTokenizer {
865
1151
  }
866
1152
  }
867
1153
  function normalizeAttributeValue(raw) {
868
- return raw.includes("\n") || raw.includes(" ") ? raw.replace(/[\n\t]/g, " ") : raw;
1154
+ return raw.includes("\n") || raw.includes(" ") ? raw.replaceAll(/[\n\t]/g, " ") : raw;
869
1155
  }
870
1156
  const XML_TEXT_SPECIAL = /[&<>\r]/g;
871
1157
  const XML_ATTR_SPECIAL = /[&<>"\t\n\r]/g;
@@ -882,13 +1168,13 @@ function escapeXmlText(text) {
882
1168
  if (hasIllegalXmlChar(text)) {
883
1169
  throw illegalXml(text);
884
1170
  }
885
- return text.replace(XML_TEXT_SPECIAL, (c) => XML_REPLACEMENTS[c]);
1171
+ return text.replaceAll(XML_TEXT_SPECIAL, (c) => XML_REPLACEMENTS[c]);
886
1172
  }
887
1173
  function escapeXmlAttribute(text) {
888
1174
  if (hasIllegalXmlChar(text)) {
889
1175
  throw illegalXml(text);
890
1176
  }
891
- return text.replace(XML_ATTR_SPECIAL, (c) => XML_REPLACEMENTS[c]);
1177
+ return text.replaceAll(XML_ATTR_SPECIAL, (c) => XML_REPLACEMENTS[c]);
892
1178
  }
893
1179
  function illegalXml(text) {
894
1180
  return new GraphFormatError("E_COLUMN_TYPE", "the text holds a character XML 1.0 cannot carry", {
@@ -898,7 +1184,7 @@ function illegalXml(text) {
898
1184
  }
899
1185
  const GML_SPECIAL = /["&]|[^ -~]/gu;
900
1186
  function quoteGmlString(text) {
901
- const escaped = text.replace(GML_SPECIAL, (c) => {
1187
+ const escaped = text.replaceAll(GML_SPECIAL, (c) => {
902
1188
  const code = c.codePointAt(0);
903
1189
  if (code === void 0) {
904
1190
  return c;
@@ -928,12 +1214,14 @@ const GML_NAMED = (() => {
928
1214
  return table;
929
1215
  })();
930
1216
  function decodeGmlString(body, onUnknown) {
931
- return body.replace(GML_ENTITY, (whole, entity) => {
932
- if (entity.startsWith("#x")) {
933
- return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));
934
- }
1217
+ return body.replaceAll(GML_ENTITY, (whole, entity) => {
935
1218
  if (entity.startsWith("#")) {
936
- return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));
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) {
@@ -972,16 +1260,17 @@ function quoteDotId(text) {
972
1260
  if (isBareDotId(text)) {
973
1261
  return text;
974
1262
  }
975
- return `"${text.replace(/"/g, '\\"')}"`;
1263
+ const escaped = text.replaceAll('"', String.raw`\"`);
1264
+ return `"${escaped}"`;
976
1265
  }
977
- function quoteCsvCell(text, delimiter = ",") {
1266
+ function quoteCsvCell(text, delimiter = ",", quote = '"') {
978
1267
  if (text.length === 0) {
979
- return '""';
1268
+ return quote + quote;
980
1269
  }
981
- if (!text.includes(delimiter) && !text.includes('"') && !text.includes("\n") && !text.includes("\r") && text === text.trim()) {
1270
+ if (!text.includes(delimiter) && !text.includes(quote) && !text.includes("\n") && !text.includes("\r") && text === text.trim()) {
982
1271
  return text;
983
1272
  }
984
- return `"${text.replace(/"/g, '""')}"`;
1273
+ return `${quote}${text.split(quote).join(quote + quote)}${quote}`;
985
1274
  }
986
1275
  function isPajekLabel(text) {
987
1276
  return !text.includes('"') && !text.includes("\n") && !text.includes("\r");
@@ -993,7 +1282,7 @@ function quotePajekLabel(text) {
993
1282
  value: text
994
1283
  });
995
1284
  }
996
- if (text.length > 0 && !/[\s"]/.test(text) && !text.startsWith("[")) {
1285
+ if (text.length > 0 && !/[\s"]/.test(text) && !text.startsWith("[") && !text.startsWith("%")) {
997
1286
  return text;
998
1287
  }
999
1288
  return `"${text}"`;
@@ -1006,16 +1295,18 @@ export {
1006
1295
  isWritableDotText as d,
1007
1296
  escapeXmlAttribute as e,
1008
1297
  xmlDeclaredEncoding as f,
1009
- isWhitespace as g,
1298
+ XmlEmptyInputError as g,
1010
1299
  hasIllegalXmlChar as h,
1011
1300
  isPajekLabel as i,
1012
- decodeGmlString as j,
1013
- quoteGmlString as k,
1301
+ isWhitespace as j,
1302
+ decodeGmlString as k,
1014
1303
  localName as l,
1015
- quoteCsvCell as m,
1304
+ quoteGmlString as m,
1016
1305
  isXmlName as n,
1306
+ quoteCsvCell as o,
1017
1307
  quotePajekLabel as q,
1308
+ sniffXmlText as s,
1018
1309
  tokenizeXml as t,
1019
1310
  xmlIllegalTextNotes as x
1020
1311
  };
1021
- //# sourceMappingURL=escape-B-tkk_Cl.js.map
1312
+ //# sourceMappingURL=escape-D1HPTUrP.js.map