@graphty/graph-io 0.3.25 → 0.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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-BbJI55dx.js +56 -0
  4. package/dist/chunks/choose-BbJI55dx.js.map +1 -0
  5. package/dist/chunks/constants-BCsFsMj4.js +231 -0
  6. package/dist/chunks/constants-BCsFsMj4.js.map +1 -0
  7. package/dist/chunks/{escape-B-tkk_Cl.js → escape-D0g6NNUy.js} +382 -92
  8. package/dist/chunks/escape-D0g6NNUy.js.map +1 -0
  9. package/dist/chunks/export-BTI4yQgy.js +4333 -0
  10. package/dist/chunks/export-BTI4yQgy.js.map +1 -0
  11. package/dist/chunks/exporter-BMqk5oxW.js +3465 -0
  12. package/dist/chunks/exporter-BMqk5oxW.js.map +1 -0
  13. package/dist/chunks/{importer-eUREhBGj.js → exporter-Cra2GYcN.js} +4969 -3201
  14. package/dist/chunks/exporter-Cra2GYcN.js.map +1 -0
  15. package/dist/chunks/{exporter-BGrsWamJ.js → exporter-Dxh231ZF.js} +38 -229
  16. package/dist/chunks/exporter-Dxh231ZF.js.map +1 -0
  17. package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-tne475KK.js} +22 -20
  18. package/dist/chunks/exporter-tne475KK.js.map +1 -0
  19. package/dist/chunks/importer-90YWhJoF.js +2811 -0
  20. package/dist/chunks/importer-90YWhJoF.js.map +1 -0
  21. package/dist/chunks/{importer-D_e7e7LX.js → importer-Bcl1d4xH.js} +398 -145
  22. package/dist/chunks/importer-Bcl1d4xH.js.map +1 -0
  23. package/dist/chunks/{importer-BWY2FFc5.js → importer-BfIsp1f9.js} +255 -77
  24. package/dist/chunks/importer-BfIsp1f9.js.map +1 -0
  25. package/dist/chunks/{importer-zGLo8Dg_.js → importer-C_TEA1zJ.js} +484 -157
  26. package/dist/chunks/importer-C_TEA1zJ.js.map +1 -0
  27. package/dist/chunks/{importer-DET1tg6s.js → importer-DCjOvO7U.js} +1687 -310
  28. package/dist/chunks/importer-DCjOvO7U.js.map +1 -0
  29. package/dist/chunks/{importer-vi3bSdtw.js → importer-DfVu6j59.js} +509 -76
  30. package/dist/chunks/importer-DfVu6j59.js.map +1 -0
  31. package/dist/chunks/{importer-DIrbbnAf.js → importer-Dku_VAIY.js} +585 -226
  32. package/dist/chunks/importer-Dku_VAIY.js.map +1 -0
  33. package/dist/chunks/json-elements-3tnyt5uZ.js +1225 -0
  34. package/dist/chunks/json-elements-3tnyt5uZ.js.map +1 -0
  35. package/dist/chunks/ontology-export-B9Tcf37D.js +357 -0
  36. package/dist/chunks/ontology-export-B9Tcf37D.js.map +1 -0
  37. package/dist/chunks/{records-dbRkxwaq.js → records-CQXT__mY.js} +298 -114
  38. package/dist/chunks/records-CQXT__mY.js.map +1 -0
  39. package/dist/chunks/{text-Dr0Ifpag.js → text-DmcUs5_Q.js} +29 -11
  40. package/dist/chunks/text-DmcUs5_Q.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 +951 -261
  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 +342 -85
  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 +564 -157
  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 +19 -1
  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 +33 -17
  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 +868 -188
  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 +2 -0
  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 +400 -83
  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 +145 -32
  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 +680 -285
  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 +226 -79
  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 +98 -24
  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 +108 -26
  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 +238 -85
  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 +66 -34
  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 +183 -51
  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 +20 -21
  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 +7 -2
  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 +38 -4
  468. package/src/common/direction.ts +78 -51
  469. package/src/common/escape.ts +33 -17
  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 +1034 -198
  475. package/src/common/line-format.ts +249 -0
  476. package/src/common/lists.ts +6 -1
  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 +477 -88
  487. package/src/common/zip.ts +169 -7
  488. package/src/formats/csv/exporter.ts +201 -46
  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 +888 -300
  496. package/src/formats/cx/index.ts +4 -3
  497. package/src/formats/cx2/exporter.ts +61 -338
  498. package/src/formats/cx2/importer.ts +317 -86
  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 +139 -31
  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 +111 -26
  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 +320 -101
  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 +89 -41
  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 +213 -52
  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 +35 -27
  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 +11 -3
  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,14 +1,19 @@
1
1
  /**
2
- * The `@graphty/graph-io/gml` subpath (design section 8.2): the GML importer and exporter, their
2
+ * The `@graphty/graph-io/gml` subpath: the GML importer and exporter, their
3
3
  * option types, and their issue and loss-note codes grouped in two tables.
4
+ * @module @graphty/graph-io/gml
4
5
  */
5
6
 
6
7
  import {
8
+ AMBIGUOUS_GRAPH_NAME_CODE,
7
9
  COLUMN_RENAMED_CODE,
8
10
  DIRECTION_FORCED_CODE,
9
11
  DIRECTION_REFUSED_CODE,
12
+ ELEMENT_ISSUE,
10
13
  ENCODING_FALLBACK_CODE,
14
+ GRAPH_NOT_FOUND_CODE,
11
15
  ID_MERGED_CODE,
16
+ INPUT_ISSUE,
12
17
  INVALID_ENCODING_CODE,
13
18
  INVALID_UTF8_CODE,
14
19
  MIXED_DIRECTION_CODE,
@@ -35,11 +40,14 @@ import {
35
40
  ELEMENT_TYPE_CODE,
36
41
  FLAG_TYPE_CODE,
37
42
  FLAG_VALUE_CODE,
43
+ GRAPHICS_CODE,
44
+ GROUPS_CODE,
38
45
  ID_DROPPED_CODE,
39
46
  ID_TYPE_CODE,
40
47
  MISSING_ENDPOINT_CODE,
41
48
  MISSING_ID_CODE,
42
49
  MISSING_LABEL_CODE,
50
+ NESTED_ELEMENT_CODE,
43
51
  NO_GRAPH_CODE,
44
52
  PRECISION_CODE,
45
53
  REPEATED_KEY_CODE,
@@ -47,31 +55,45 @@ import {
47
55
  SECOND_GRAPH_CODE,
48
56
  STRING_ID_CODE,
49
57
  UNKNOWN_ENTITY_CODE,
58
+ WIDENED_CODE,
50
59
  } from "./importer.js";
51
60
 
52
61
  export { gmlExporter, type GmlExportOptions } from "./exporter.js";
53
62
  export { gmlImporter, type GmlImportOptions } from "./importer.js";
54
63
 
55
64
  /**
56
- * The issue codes the GML importer records (design section 8.6), by name: the codes shared with
57
- * the other importers (src/common/codes.ts) and the GML-specific ones. A key is the code without
65
+ * The issue codes the GML importer records, by name: the codes shared with
66
+ * the other importers and the GML-specific ones. A key is the code without
58
67
  * its severity and format prefixes.
68
+ * @category Built-in formats
59
69
  */
60
70
  export const GML_ISSUE = Object.freeze({
61
- /** A grammar violation: an untokenisable bare token, an unclosed string or `[`, a stray `]`, a key without a value (fatal). */
71
+ ...INPUT_ISSUE,
72
+ ...ELEMENT_ISSUE,
73
+ /**
74
+ * The text breaks GML's syntax: a word that is not a key or a value, an unclosed string or `[`, a stray `]`, or a
75
+ * key without a value. The import stops.
76
+ */
62
77
  SYNTAX: SYNTAX_CODE,
63
- /** The input holds invalid UTF-8 (fatal). */
78
+ /** The input is not valid UTF-8. The import stops. */
64
79
  INVALID_UTF8: INVALID_UTF8_CODE,
65
- /** Invalid bytes in the encoding a BOM, a declaration or the encoding option chose (fatal). */
80
+ /**
81
+ * Some bytes are not valid in the encoding that was chosen (by a byte order mark, the file's declaration or the
82
+ * `encoding` option). The import stops.
83
+ */
66
84
  INVALID_ENCODING: INVALID_ENCODING_CODE,
67
85
  /** Bytes that are not UTF-8 and declare no encoding were read as windows-1252. */
68
86
  ENCODING_FALLBACK: ENCODING_FALLBACK_CODE,
69
87
  /** A declared encoding the platform cannot decode was ignored. */
70
88
  UNKNOWN_ENCODING: UNKNOWN_ENCODING_CODE,
71
- /** No `graph [` block (fatal). */
89
+ /** There is no `graph [` block. The import stops. */
72
90
  NO_GRAPH: NO_GRAPH_CODE,
73
- /** More than one `graph` block (fatal). */
91
+ /** The file holds more than one `graph` block and only the first was read. It is not added when `graphIndex` or `graphName` chose the graph. */
74
92
  MULTIPLE_GRAPHS: SECOND_GRAPH_CODE,
93
+ /** `graphIndex` or `graphName` names no graph of the file; the message lists the graphs it holds. The import stops. */
94
+ GRAPH_NOT_FOUND: GRAPH_NOT_FOUND_CODE,
95
+ /** `graphName` matches more than one graph; pass `graphIndex`. The import stops. */
96
+ AMBIGUOUS_GRAPH_NAME: AMBIGUOUS_GRAPH_NAME_CODE,
75
97
  /** A node without an `id`. */
76
98
  MISSING_ID: MISSING_ID_CODE,
77
99
  /** A node without a `label` under nodeIdFrom "label". */
@@ -80,7 +102,10 @@ export const GML_ISSUE = Object.freeze({
80
102
  MISSING_ENDPOINT: MISSING_ENDPOINT_CODE,
81
103
  /** A node id, source or target that is neither an integer nor a string. */
82
104
  ID_TYPE: ID_TYPE_CODE,
83
- /** String node ids, sources or targets (outside the spec's integers), kept under the ids rule; warned once. */
105
+ /**
106
+ * Node ids, sources or targets are text, where GML expects integers. They are read under the `ids` option.
107
+ * Reported once per file.
108
+ */
84
109
  STRING_ID: STRING_ID_CODE,
85
110
  /** A node id declared twice (later keys overwrite). */
86
111
  DUPLICATE_NODE: DUPLICATE_NODE_CODE,
@@ -92,43 +117,79 @@ export const GML_ISSUE = Object.freeze({
92
117
  FLAG_TYPE: FLAG_TYPE_CODE,
93
118
  /** A `directed` / `multigraph` flag outside 0 / 1, or repeated. */
94
119
  FLAG_VALUE: FLAG_VALUE_CODE,
95
- /** A named entity in a string that no table decodes; kept as written. */
120
+ /** A named entity no table decodes, or a numeric reference beyond U+10FFFF; kept as written. */
96
121
  UNKNOWN_ENTITY: UNKNOWN_ENTITY_CODE,
97
- /** An integer beyond 2^53 rounded to f64. */
122
+ /** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: "string"` to keep every digit. */
98
123
  PRECISION: PRECISION_CODE,
99
- /** A column renamed `<name>#<key>` because the sink held the name with another shape. */
124
+ /** A node's graphics value that cannot give a position as written; kept in the graphics json column. */
125
+ GRAPHICS: GRAPHICS_CODE,
126
+ /** A graph, node or edge record nested in a node or edge; kept as json, not read as structure. */
127
+ NESTED_ELEMENT: NESTED_ELEMENT_CODE,
128
+ /** YEd's isGroup / gid keys, kept as plain columns; the hierarchy is not read as containment. */
129
+ GROUPS: GROUPS_CODE,
130
+ /**
131
+ * An attribute's type was widened because a later value did not fit: an integer above 2^31 in an integer column,
132
+ * or two declared types for one attribute.
133
+ */
134
+ WIDENED: WIDENED_CODE,
135
+ /**
136
+ * An attribute was renamed `<name>#<suffix>` because another attribute already has its name, for example
137
+ * two attributes declared with the same name.
138
+ */
100
139
  COLUMN_RENAMED: COLUMN_RENAMED_CODE,
101
- /** A column declared without its role because the sink already holds it. */
140
+ /**
141
+ * You read into a graph builder that already has an id, label or position attribute, so this file's one is kept as
142
+ * a plain attribute.
143
+ */
102
144
  ROLE_TAKEN: ROLE_TAKEN_CODE,
103
- /** Two id texts merged into one number under ids "number". */
145
+ /** Two different id texts became the same number because `ids` is "number", so their nodes were merged. */
104
146
  ID_MERGED: ID_MERGED_CODE,
105
- /** A common option the importer has no use for was given. */
147
+ /** You set an option this format does not use; it had no effect. The message names the option. */
106
148
  OPTION_IGNORED: OPTION_IGNORED_CODE,
107
- /** A builder-policy option the sink does not honour. */
149
+ /**
150
+ * You read into your own graph builder, which was created with a different `addMissingNodes`, `duplicateEdges`,
151
+ * `selfLoops` or `weightDtype` than the option you passed; the builder's setting applies.
152
+ */
108
153
  SINK_OPTION: SINK_OPTION_CODE,
109
- /** The sink refused the file's direction. */
154
+ /**
155
+ * You read into a graph builder whose direction is already set, or which already holds edges, so the file is read
156
+ * with the builder's direction instead of its own.
157
+ */
110
158
  DIRECTION_REFUSED: DIRECTION_REFUSED_CODE,
111
- /** Edges forced to the policy's direction. */
159
+ /** Edges of the other direction were read with the direction `onMixedDirection` chose. */
112
160
  DIRECTION_FORCED: DIRECTION_FORCED_CODE,
113
- /** A mixed file under onMixedDirection "error" (fatal). */
161
+ /**
162
+ * The graph has both directed and undirected edges and `onMixedDirection` is "error". An import stops; a save to a
163
+ * format that holds one direction per file fails with E_DIRECTED. Pass "directed" or "undirected" to read or write
164
+ * it anyway.
165
+ */
114
166
  MIXED_DIRECTION: MIXED_DIRECTION_CODE,
115
- /** Under nodeIdFrom "label" / "index" the integer ids are not kept (a loss note). */
167
+ /**
168
+ * Under `nodeIdFrom: "label"` or `"index"` the file's integer ids are not kept. It is listed in `report.lossy`, not
169
+ * in `report.issues`.
170
+ */
116
171
  ID_DROPPED: ID_DROPPED_CODE,
117
172
  });
118
173
 
119
- /** The loss-note codes the GML exporter's check() reports beyond the shared LOSS table, by name. */
174
+ /**
175
+ * The loss-note codes the GML exporter's check() reports beyond the shared LOSS table, by name.
176
+ * @category Built-in formats
177
+ */
120
178
  export const GML_LOSS = Object.freeze({
121
- /** A json column holds numbers; GML records cannot keep int versus real (design section 8.5). */
179
+ /** A json column holds numbers; GML records cannot keep int versus real. */
122
180
  RECORD_NUMBER_TYPE: RECORD_NUMBER_TYPE_CODE,
123
181
  /** A json column holds booleans, written 1 / 0. */
124
182
  RECORD_BOOLEAN: RECORD_BOOLEAN_CODE,
125
183
  /** A json column holds nulls, omitted. */
126
184
  RECORD_NULL: RECORD_NULL_CODE,
127
- /** An array inside an array; export() throws. */
185
+ /** An attribute holds an array inside an array, which GML cannot write; the save fails. */
128
186
  NESTED_ARRAY: NESTED_ARRAY_CODE,
129
187
  /** A json row that is an array, written as repeated keys. */
130
188
  JSON_ARRAY: JSON_ARRAY_CODE,
131
- /** A column name or record key outside the GML key grammar. */
189
+ /**
190
+ * An attribute name GML cannot use as a key (keys are letters and digits, starting with a letter). The save fails
191
+ * unless `sanitizeKeys` is "mangle".
192
+ */
132
193
  INVALID_KEY: INVALID_KEY_CODE,
133
194
  /** A column named like a structural key. */
134
195
  RESERVED_KEY: RESERVED_KEY_CODE,
@@ -12,46 +12,86 @@
12
12
 
13
13
  import { SYNTAX_CODE } from "../../common/codes.js";
14
14
  import { decodeGmlString } from "../../common/escape.js";
15
+ import { plural } from "../../common/plural.js";
15
16
 
16
- /** A bare word: a key, or `INF` / `NAN` at a value position. */
17
+ /**
18
+ * A bare word: a key, or `INF` / `NAN` at a value position.
19
+ * @category Plugin helpers
20
+ */
17
21
  export const TOKEN_WORD = 0;
18
- /** An integer literal. */
22
+ /**
23
+ * An integer literal.
24
+ * @category Plugin helpers
25
+ */
19
26
  export const TOKEN_INT = 1;
20
- /** A real literal, including the non-finite spellings. */
27
+ /**
28
+ * A real literal, including the non-finite spellings.
29
+ * @category Plugin helpers
30
+ */
21
31
  export const TOKEN_REAL = 2;
22
- /** A double-quoted string; start / end delimit the body between the quotes. */
32
+ /**
33
+ * A double-quoted string; start / end delimit the body between the quotes.
34
+ * @category Plugin helpers
35
+ */
23
36
  export const TOKEN_STRING = 3;
24
- /** `[`. */
37
+ /**
38
+ * `[`.
39
+ * @category Plugin helpers
40
+ */
25
41
  export const TOKEN_OPEN = 4;
26
- /** `]`. */
42
+ /**
43
+ * `]`.
44
+ * @category Plugin helpers
45
+ */
27
46
  export const TOKEN_CLOSE = 5;
28
47
 
29
48
  /** The kind of one token. */
30
49
  type TokenKind = 0 | 1 | 2 | 3 | 4 | 5;
31
50
 
32
- /** The NetworkX marker that starts a one-element list written as repeated keys. */
51
+ /**
52
+ * The NetworkX marker that starts a one-element list written as repeated keys.
53
+ * @category Plugin helpers
54
+ */
33
55
  export const LIST_START_MARKER = "_networkx_list_start";
34
56
 
35
- /** The string NetworkX writes for an empty list. */
57
+ /**
58
+ * The string NetworkX writes for an empty list.
59
+ * @category Plugin helpers
60
+ */
36
61
  export const EMPTY_LIST_TEXT = "[]";
37
62
 
38
- /** The string NetworkX writes for an empty tuple, read as an empty list too. */
63
+ /**
64
+ * The string NetworkX writes for an empty tuple, read as an empty list too.
65
+ * @category Plugin helpers
66
+ */
39
67
  export const EMPTY_TUPLE_TEXT = "()";
40
68
 
41
- /** The node key the exporter writes a mangled node's original id into (design section 8.5). */
69
+ /**
70
+ * The node key the exporter writes a mangled node's original id into (design section 8.5).
71
+ * @category Plugin helpers
72
+ */
42
73
  export const ORIGINAL_ID_KEY = "graphty_originalId";
43
74
 
44
75
  /**
45
- * Issue code of every grammar violation (shared with the other text formats; the message carries
46
- * the detail): a bare token that is neither a key nor a number, an unclosed string, an unclosed
47
- * `[`, a `]` with no open `[`, a value without a key or a key without a value.
76
+ * The text breaks the format's syntax: a word that is not a key or a number, an unclosed string or `[`, a `]` with no
77
+ * open `[`, or a key without a value. The message says where. The import stops.
78
+ * @category Issue and loss codes
48
79
  */
49
80
  export const SYNTAX_STRUCTURE_CODE = SYNTAX_CODE;
50
- /** The code of an untokenisable bare token (E_SYNTAX). */
81
+ /**
82
+ * The code of an untokenizable bare token (E_SYNTAX).
83
+ * @category Issue and loss codes
84
+ */
51
85
  export const SYNTAX_TOKEN_CODE = SYNTAX_CODE;
52
- /** The code of an unclosed string (E_SYNTAX). */
86
+ /**
87
+ * The code of an unclosed string (E_SYNTAX).
88
+ * @category Issue and loss codes
89
+ */
53
90
  export const SYNTAX_STRING_CODE = SYNTAX_CODE;
54
- /** The code of an unclosed `[` (E_SYNTAX). */
91
+ /**
92
+ * The code of an unclosed `[` (E_SYNTAX).
93
+ * @category Issue and loss codes
94
+ */
55
95
  export const SYNTAX_BRACKET_CODE = SYNTAX_CODE;
56
96
 
57
97
  const KEY_TEXT = /^[A-Za-z_][0-9A-Za-z_]*$/;
@@ -64,6 +104,7 @@ const NON_FINITE_WORD = /^(?:inf|infinity|nan)$/i;
64
104
  /**
65
105
  * A lexical or structural error of a GML text, with the 1-based line it was found on. The importer
66
106
  * turns it into a fatal parse-error issue.
107
+ * @category Plugin helpers
67
108
  */
68
109
  export class GmlSyntaxError extends Error {
69
110
  /** The issue code. */
@@ -89,6 +130,7 @@ export class GmlSyntaxError extends Error {
89
130
  /**
90
131
  * The tokens of one GML text, structurally validated: every `[` has its matching `]` recorded and
91
132
  * every key is followed by a value, so walkers need no error paths.
133
+ * @category Plugin helpers
92
134
  */
93
135
  export class GmlTokens {
94
136
  /** The source text the offsets index into. */
@@ -162,12 +204,23 @@ export class GmlTokens {
162
204
  * @returns the body with character references decoded
163
205
  */
164
206
  stringOf(i: number): string {
165
- const text = this.textOf(i);
207
+ let text = this.textOf(i);
208
+ if (text.includes("\r")) {
209
+ // a line break inside a string is part of it, as LF whatever the file's line ends
210
+ text = text.replaceAll(/\r\n?/g, "\n");
211
+ }
166
212
  if (text.indexOf("&") < 0) {
167
213
  return text;
168
214
  }
169
215
  const report = this.onUnknownEntity;
170
- return decodeGmlString(text, report === null ? undefined : (entity) => { report(entity, this.line[i]); });
216
+ return decodeGmlString(
217
+ text,
218
+ report === null
219
+ ? undefined
220
+ : (entity) => {
221
+ report(entity, this.line[i]);
222
+ },
223
+ );
171
224
  }
172
225
 
173
226
  /**
@@ -211,8 +264,9 @@ export class GmlTokens {
211
264
  * Lex and structurally validate a whole GML text.
212
265
  *
213
266
  * Lexical rules (NetworkX): whitespace separates tokens; `#` outside a string starts a comment
214
- * that runs to the end of the line; a string is delimited by double quotes and must close on its
215
- * line (there is no escape mechanism; `&#NN;` references are decoded later); `[` and `]` are
267
+ * that runs to the end of the line; a string is delimited by double quotes and may span lines (a
268
+ * line break inside is part of it, GML draft 3.2.5; there is no escape mechanism; `&#NN;`
269
+ * references are decoded later); a U+FEFF between tokens is whitespace; `[` and `]` are
216
270
  * single-character tokens; every other run of characters is a key (`[A-Za-z_][0-9A-Za-z_]*`),
217
271
  * an integer (`[+-]?[0-9]+`), a real (with a decimal point or an exponent, or `INF` / `NAN` in
218
272
  * any case with an optional sign) or an error.
@@ -221,12 +275,15 @@ export class GmlTokens {
221
275
  * string, `INF` / `NAN`, or a bracketed sequence of pairs; every `[` has a `]`.
222
276
  * @param text - the GML text
223
277
  * @returns the validated tokens; GmlSyntaxError with the line of the first problem
278
+ * @category Plugin helpers
224
279
  */
225
280
  export function tokenizeGml(text: string): GmlTokens {
226
281
  const tokens = new GmlTokens(text, Math.max(1024, text.length >>> 3));
227
282
  const n = text.length;
228
283
  let i = 0;
229
284
  let line = 1;
285
+ // the opening line of the first string that spans lines: where a missing quote most likely is
286
+ let spanningLine = 0;
230
287
  while (i < n) {
231
288
  const c = text.charCodeAt(i);
232
289
  if (c === 10) {
@@ -240,6 +297,9 @@ export function tokenizeGml(text: string): GmlTokens {
240
297
  }
241
298
  } else if (c === 32 || c === 9 || c === 11 || c === 12) {
242
299
  i++;
300
+ } else if (c === 0xfeff) {
301
+ // a BOM left inside by concatenated files is whitespace; the shared text check reports it
302
+ i++;
243
303
  } else if (c === 35) {
244
304
  i = endOfLine(text, i);
245
305
  } else if (c === 91) {
@@ -250,11 +310,24 @@ export function tokenizeGml(text: string): GmlTokens {
250
310
  i++;
251
311
  } else if (c === 34) {
252
312
  const close = text.indexOf('"', i + 1);
253
- const eol = endOfLine(text, i + 1);
254
- if (close < 0 || close > eol) {
255
- throw new GmlSyntaxError(SYNTAX_STRING_CODE, `unclosed string at line ${line}`, line);
313
+ if (close < 0) {
314
+ const hint =
315
+ spanningLine === 0
316
+ ? ""
317
+ : `; the string opened at line ${spanningLine} spans lines, so a quote may be missing there`;
318
+ throw new GmlSyntaxError(SYNTAX_STRING_CODE, `unclosed string opened at line ${line}${hint}`, line);
256
319
  }
257
320
  tokens.push(TOKEN_STRING, i + 1, close, line);
321
+ const opened = line;
322
+ for (let k = i + 1; k < close; k++) {
323
+ const d = text.codePointAt(k);
324
+ if (d === 10 || (d === 13 && text.codePointAt(k + 1) !== 10)) {
325
+ line++;
326
+ }
327
+ }
328
+ if (line !== opened && spanningLine === 0) {
329
+ spanningLine = opened;
330
+ }
258
331
  i = close + 1;
259
332
  } else {
260
333
  let j = i + 1;
@@ -325,8 +398,14 @@ function classifyBare(text: string, start: number, end: number, line: number): T
325
398
  if (REAL_TEXT.test(token) || NON_FINITE_TEXT.test(token)) {
326
399
  return TOKEN_REAL;
327
400
  }
328
- const shown = token.length > 20 ? `${token.slice(0, 20)}...` : token;
329
- throw new GmlSyntaxError(SYNTAX_TOKEN_CODE, `cannot tokenize "${shown}" at line ${line}`, line);
401
+ // the message is ASCII: a character outside it is shown as \uXXXX and named, since it may look
402
+ // like something else (a no-break space pasted from a web page looks like a space)
403
+ const hex = (c: string): string => (c.codePointAt(0) ?? 0).toString(16).toUpperCase().padStart(4, "0");
404
+ const head = token.length > 20 ? `${token.slice(0, 20)}...` : token;
405
+ const shown = head.replaceAll(/[^\x20-\x7e]/gu, (c) => String.raw`\u` + hex(c));
406
+ const odd = /[^\x21-\x7e]/u.exec(token);
407
+ const note = odd === null ? "" : ` (it holds U+${hex(odd[0])}, which GML allows only inside a string)`;
408
+ throw new GmlSyntaxError(SYNTAX_TOKEN_CODE, `cannot tokenize "${shown}" at line ${line}${note}`, line);
330
409
  }
331
410
 
332
411
  /**
@@ -384,7 +463,7 @@ function validateStructure(tokens: GmlTokens): void {
384
463
  const open = stack[stack.length - 1];
385
464
  throw new GmlSyntaxError(
386
465
  SYNTAX_BRACKET_CODE,
387
- `unexpected end of input: ${stack.length} bracket(s) still open, the last opened at line ${tokens.line[open]}`,
466
+ `unexpected end of input: ${stack.length} bracket${plural(stack.length)} still open, the last opened at line ${tokens.line[open]}`,
388
467
  tokens.line[open],
389
468
  );
390
469
  }
@@ -414,6 +493,7 @@ function describeToken(tokens: GmlTokens, i: number): string {
414
493
  * The numeric value of an INT or REAL token (or a WORD that is `INF` / `NAN` at a value position).
415
494
  * @param text - the token text
416
495
  * @returns the number; Infinity / -Infinity / NaN for the non-finite spellings
496
+ * @category Plugin helpers
417
497
  */
418
498
  export function numberOfText(text: string): number {
419
499
  if (NON_FINITE_TEXT.test(text)) {
@@ -431,6 +511,7 @@ export function numberOfText(text: string): number {
431
511
  * @param tokens - the tokens
432
512
  * @param i - the value token index
433
513
  * @returns true when the word is a real
514
+ * @category Plugin helpers
434
515
  */
435
516
  export function isNonFiniteWord(tokens: GmlTokens, i: number): boolean {
436
517
  return tokens.kind[i] === TOKEN_WORD && NON_FINITE_WORD.test(tokens.textOf(i));
@@ -441,6 +522,7 @@ export function isNonFiniteWord(tokens: GmlTokens, i: number): boolean {
441
522
  * writes and reads).
442
523
  * @param text - the candidate key
443
524
  * @returns true when it can be written as a key
525
+ * @category Plugin helpers
444
526
  */
445
527
  export function isGmlKey(text: string): boolean {
446
528
  return STRICT_KEY_TEXT.test(text);
@@ -451,6 +533,7 @@ export function isGmlKey(text: string): boolean {
451
533
  * non-letter is prefixed with `x` (the exporter's `sanitizeKeys: "mangle"`).
452
534
  * @param text - the text
453
535
  * @returns a valid key
536
+ * @category Plugin helpers
454
537
  */
455
538
  export function mangleGmlKey(text: string): string {
456
539
  const body = text.replace(/[^0-9A-Za-z_]/g, "_");
@@ -479,6 +562,7 @@ interface RecordFrame {
479
562
  * @param tokens - the validated tokens
480
563
  * @param open - the index of the record's `[`
481
564
  * @returns a null-prototype object
565
+ * @category Plugin helpers
482
566
  */
483
567
  export function parseRecord(tokens: GmlTokens, open: number): Record<string, unknown> {
484
568
  const root = Object.create(null) as Record<string, unknown>;
@@ -547,6 +631,7 @@ function storeValue(frame: RecordFrame, key: string, value: unknown): void {
547
631
  * @param tokens - the tokens
548
632
  * @param v - the value token index (INT, REAL, non-finite WORD or OPEN)
549
633
  * @returns the value
634
+ * @category Plugin helpers
550
635
  */
551
636
  export function scalarOrRecord(tokens: GmlTokens, v: number): unknown {
552
637
  return tokens.kind[v] === TOKEN_OPEN ? parseRecord(tokens, v) : numberOfText(tokens.textOf(v));