@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,7 @@
1
1
  /**
2
- * The `@graphty/graph-io/pajek` subpath (design section 8.2): the Pajek NET importer and exporter
2
+ * The `@graphty/graph-io/pajek` subpath: the Pajek NET importer and exporter
3
3
  * with their option types and issue / loss codes.
4
+ * @module @graphty/graph-io/pajek
4
5
  */
5
6
 
6
7
  export { PAJEK_LOSS, pajekExporter, type PajekExportOptions } from "./exporter.js";
@@ -8,36 +8,64 @@
8
8
  * `&#dddd;` character references of labels, and the column names both sides agree on.
9
9
  */
10
10
 
11
- /** The node column holding the vertex label (role label). */
11
+ /**
12
+ * The node column holding the vertex label (role label).
13
+ * @category Plugin helpers
14
+ */
12
15
  export const LABEL_COLUMN = "label";
13
16
 
14
- /** The node column holding the vertex coordinates (role position, f32 x 3, units "file"). */
17
+ /**
18
+ * The node column holding the vertex coordinates (role position, f32 x 3, units "file").
19
+ * @category Plugin helpers
20
+ */
15
21
  export const POSITION_COLUMN = "position";
16
22
 
17
- /** The node column holding the vertex shape keyword (dict, no role: Pajek has its own keyword set). */
23
+ /**
24
+ * The node column holding the vertex shape keyword (dict, no role: Pajek has its own keyword set).
25
+ * @category Plugin helpers
26
+ */
18
27
  export const SHAPE_COLUMN = "shape";
19
28
 
20
- /** The edge column holding the relation name of a `*Arcs :k "name"` section (dict). */
29
+ /**
30
+ * The edge column holding the relation name of a `*Arcs :k "name"` section (dict).
31
+ * @category Plugin helpers
32
+ */
21
33
  export const RELATION_COLUMN = "relation";
22
34
 
23
- /** The node or edge column holding Pajek time intervals (list of f64 pairs, role spells). */
35
+ /**
36
+ * The node or edge column holding Pajek time intervals (list of f64 pairs, role spells).
37
+ * @category Plugin helpers
38
+ */
24
39
  export const SPELLS_COLUMN = "spells";
25
40
 
26
- /** The edge column holding the line value when `weightFrom` names another field or null. */
41
+ /**
42
+ * The edge column holding the line value when `weightFrom` names another field or null.
43
+ * @category Plugin helpers
44
+ */
27
45
  export const VALUE_COLUMN = "value";
28
46
 
29
- /** The `weightFrom` default: Pajek's third column is the line value (design section 8.4). */
47
+ /**
48
+ * The `weightFrom` default: Pajek's third column is the line value (design section 8.4).
49
+ * @category Plugin helpers
50
+ */
30
51
  export const VALUE_FIELD = "value";
31
52
 
32
- /** The node column holding the values of a `*Partition` object (i32). */
53
+ /**
54
+ * The node column holding the values of a `*Partition` object (i32).
55
+ * @category Plugin helpers
56
+ */
33
57
  export const PARTITION_COLUMN = "partition";
34
58
 
35
- /** The node column holding the values of a `*Vector` object (f64). */
59
+ /**
60
+ * The node column holding the values of a `*Vector` object (f64).
61
+ * @category Plugin helpers
62
+ */
36
63
  export const VECTOR_COLUMN = "vector";
37
64
 
38
65
  /**
39
66
  * The vertex shape keywords of the Pajek manual, lower-cased; a file may write them in any case
40
67
  * (use isShapeKeyword()).
68
+ * @category Plugin helpers
41
69
  */
42
70
  export const SHAPES: ReadonlySet<string> = new Set([
43
71
  "ellipse",
@@ -55,6 +83,7 @@ export const SHAPES: ReadonlySet<string> = new Set([
55
83
  * Whether a token is a vertex shape keyword, in any case (`Ellipse`, `BOX`).
56
84
  * @param token - the token
57
85
  * @returns true for a shape keyword
86
+ * @category Plugin helpers
58
87
  */
59
88
  export function isShapeKeyword(token: string): boolean {
60
89
  return SHAPES.has(token.toLowerCase());
@@ -77,10 +106,14 @@ type SectionKind =
77
106
  * The parameter key the exporter writes a node's original id under when `sanitizeIds: "mangle"`
78
107
  * renumbers it (design section 8.5: the exporter names the attribute, `restoreMangledIds` reads
79
108
  * it back); a user column of that name is reserved under "mangle".
109
+ * @category Plugin helpers
80
110
  */
81
111
  export const ORIGINAL_ID_KEY = "graphty_originalId";
82
112
 
83
- /** A parsed section header line. */
113
+ /**
114
+ * A parsed section header line.
115
+ * @category Plugin helpers
116
+ */
84
117
  export interface SectionHeader {
85
118
  /** The section kind. */
86
119
  readonly kind: SectionKind;
@@ -114,60 +147,156 @@ const INTEGER_TEXT = /^[+-]?[0-9]+$/;
114
147
  const TIME_POINT =
115
148
  /^(\*|[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)(?:-(\*|[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?))?$/;
116
149
 
150
+ /**
151
+ * What tokenize() noticed in a line beyond its tokens, for the importer to report.
152
+ * @category Plugin helpers
153
+ */
154
+ export interface TokenNotes {
155
+ /** A double quote in the middle of a token (`ab"c d"e`, a CSV-style doubled `""`): removed, the parts joined. */
156
+ oddQuote: boolean;
157
+ }
158
+
117
159
  /**
118
160
  * Split one line into tokens: runs of non-whitespace, with double quotes grouping whitespace
119
161
  * into one token and removed from it (the shlex rule NetworkX applies; Pajek has no escapes, so a
120
162
  * quote never appears inside a token). An empty quoted string `""` is one empty token. A token
121
163
  * that starts with `[` runs to the next `]` whatever whitespace it holds (when no other `[` comes
122
- * first), so a time set written `[ 1, 3 ]` is one token.
164
+ * first), so a time set written `[ 1, 3 ]` is one token. A `%` mid-line is data (`2 %b` is a
165
+ * label): Pajek's comments are whole lines, which the caller skips before tokenizing.
123
166
  * @param line - the line without its terminator
167
+ * @param notes - when given, set to what the line held beyond its tokens
124
168
  * @returns the tokens, or null when a quote is not closed before the end of the line
169
+ * @category Plugin helpers
125
170
  */
126
- export function tokenize(line: string): string[] | null {
127
- const tokens: string[] = [];
128
- let current = "";
129
- let started = false;
130
- let quoted = false;
131
- for (let i = 0; i < line.length; i++) {
132
- const c = line.charCodeAt(i);
171
+ export function tokenize(line: string, notes?: TokenNotes): string[] | null {
172
+ const tokens = new LineTokens(line, notes);
173
+ let i = 0;
174
+ while (i < line.length) {
175
+ i = tokens.step(i);
176
+ }
177
+ return tokens.finish();
178
+ }
179
+
180
+ /** The state of tokenize() along one line. */
181
+ class LineTokens {
182
+ private readonly tokens: string[] = [];
183
+
184
+ private current = "";
185
+
186
+ private started = false;
187
+
188
+ private quoted = false;
189
+
190
+ /**
191
+ * Start a line.
192
+ * @param line - the line
193
+ * @param notes - set to what the line holds beyond its tokens, when given
194
+ */
195
+ constructor(
196
+ private readonly line: string,
197
+ private readonly notes: TokenNotes | undefined,
198
+ ) {}
199
+
200
+ /**
201
+ * Read the character at `i`.
202
+ * @param i - its index
203
+ * @returns the index of the next character to read
204
+ */
205
+ step(i: number): number {
206
+ const c = this.line.codePointAt(i);
133
207
  if (c === 34) {
134
- quoted = !quoted;
135
- started = true;
136
- continue;
208
+ this.quote(i);
209
+ return i + 1;
137
210
  }
138
- if (!quoted && !started && c === 91) {
139
- const close = line.indexOf("]", i);
140
- if (close > i && line.lastIndexOf("[", close) === i) {
141
- current += line.slice(i, close + 1);
142
- started = true;
143
- i = close;
144
- continue;
145
- }
211
+ const close = !this.quoted && !this.started && c === 91 ? this.intervalEnd(i) : -1;
212
+ if (close > 0) {
213
+ this.current += this.line.slice(i, close + 1);
214
+ this.started = true;
215
+ return close + 1;
146
216
  }
147
- if (!quoted && (c === 32 || c === 9 || c === 13 || c === 12 || c === 11)) {
148
- if (started) {
149
- tokens.push(current);
150
- current = "";
151
- started = false;
152
- }
153
- continue;
217
+ if (!this.quoted && isBlank(c)) {
218
+ this.endToken();
219
+ return i + 1;
154
220
  }
155
- current += line[i];
156
- started = true;
221
+ this.current += this.line[i];
222
+ this.started = true;
223
+ return i + 1;
157
224
  }
158
- if (quoted) {
159
- return null;
225
+
226
+ /**
227
+ * The tokens of the line.
228
+ * @returns them, or null when a quote is not closed
229
+ */
230
+ finish(): string[] | null {
231
+ if (this.quoted) {
232
+ return null;
233
+ }
234
+ this.endToken();
235
+ return this.tokens;
236
+ }
237
+
238
+ /**
239
+ * Open or close a quote. One that opens inside a token, or closes with more of the token after
240
+ * it, is noted.
241
+ * @param i - the quote's index
242
+ */
243
+ private quote(i: number): void {
244
+ const next = this.line.codePointAt(i + 1);
245
+ const joined = this.quoted ? i + 1 < this.line.length && !isBlank(next) : this.started;
246
+ if (joined && this.notes !== undefined) {
247
+ this.notes.oddQuote = true;
248
+ }
249
+ this.quoted = !this.quoted;
250
+ this.started = true;
251
+ }
252
+
253
+ /**
254
+ * Where a `[` that starts a token is closed, when no other `[` comes first.
255
+ * @param i - the index of the `[`
256
+ * @returns the index of its `]`, or -1
257
+ */
258
+ private intervalEnd(i: number): number {
259
+ const close = this.line.indexOf("]", i);
260
+ return close > i && this.line.lastIndexOf("[", close) === i ? close : -1;
160
261
  }
161
- if (started) {
162
- tokens.push(current);
262
+
263
+ /** End the token being read, if any. */
264
+ private endToken(): void {
265
+ if (this.started) {
266
+ this.tokens.push(this.current);
267
+ this.current = "";
268
+ this.started = false;
269
+ }
163
270
  }
164
- return tokens;
165
271
  }
166
272
 
273
+ /**
274
+ * Whether a character code is the whitespace that separates tokens.
275
+ * @param c - the char code
276
+ * @returns true for space, tab, CR, form feed or vertical tab
277
+ */
278
+ function isBlank(c: number | undefined): boolean {
279
+ return c === 32 || c === 9 || c === 13 || c === 12 || c === 11;
280
+ }
281
+
282
+ /**
283
+ * Whether an unsupported section keyword is a project-file object (`*Permutation`, `*Cluster`,
284
+ * `*Hierarchy`), whose next line is its own `*Vertices N`, never the network's.
285
+ * @param keyword - the keyword as written
286
+ * @returns true for a project object
287
+ * @category Plugin helpers
288
+ */
289
+ export function isProjectObject(keyword: string): boolean {
290
+ return PROJECT_OBJECTS.has(keyword.toLowerCase());
291
+ }
292
+
293
+ const PROJECT_OBJECTS: ReadonlySet<string> = new Set(["permutation", "cluster", "hierarchy"]);
294
+
167
295
  /**
168
296
  * Whether a line is a Pajek comment (`%` first) or blank.
169
297
  * @param line - the line
170
298
  * @returns true when the importer skips it
299
+ * @category Plugin helpers
171
300
  */
172
301
  export function isCommentOrBlank(line: string): boolean {
173
302
  for (let i = 0; i < line.length; i++) {
@@ -184,6 +313,7 @@ export function isCommentOrBlank(line: string): boolean {
184
313
  * Whether a line starts a section (`*` first, after optional whitespace).
185
314
  * @param line - the line
186
315
  * @returns true for a header line
316
+ * @category Plugin helpers
187
317
  */
188
318
  export function isSectionLine(line: string): boolean {
189
319
  for (let i = 0; i < line.length; i++) {
@@ -202,6 +332,7 @@ export function isSectionLine(line: string): boolean {
202
332
  * lands in `extra` so the importer can report it instead of dropping it.
203
333
  * @param line - a line isSectionLine() accepted
204
334
  * @returns the header, or null when the line has no keyword or a quote is unbalanced
335
+ * @category Plugin helpers
205
336
  */
206
337
  export function parseSectionHeader(line: string): SectionHeader | null {
207
338
  const tokens = tokenize(line.trimStart().slice(1));
@@ -267,6 +398,7 @@ export function parseSectionHeader(line: string): SectionHeader | null {
267
398
  * Whether a token is a Pajek integer (a vertex number, a count), without sign.
268
399
  * @param token - the token
269
400
  * @returns true for one or more ASCII digits
401
+ * @category Plugin helpers
270
402
  */
271
403
  export function isVertexNumber(token: string): boolean {
272
404
  if (token.length === 0) {
@@ -285,6 +417,7 @@ export function isVertexNumber(token: string): boolean {
285
417
  * Whether a token is a time interval list `[...]`.
286
418
  * @param token - the token
287
419
  * @returns true when it starts with `[` and ends with `]`
420
+ * @category Plugin helpers
288
421
  */
289
422
  export function isIntervalToken(token: string): boolean {
290
423
  return token.length >= 2 && token.startsWith("[") && token.endsWith("]");
@@ -296,6 +429,7 @@ export function isIntervalToken(token: string): boolean {
296
429
  * around the parts are ignored and an empty `[]` is no spell at all.
297
430
  * @param token - a token isIntervalToken() accepted
298
431
  * @returns the spells as [start, end] pairs (empty for `[]`)
432
+ * @category Plugin helpers
299
433
  */
300
434
  export function parseIntervals(token: string): [number, number][] {
301
435
  const body = token.slice(1, -1);
@@ -304,12 +438,15 @@ export function parseIntervals(token: string): [number, number][] {
304
438
  }
305
439
  const spells: [number, number][] = [];
306
440
  for (const part of body.split(",")) {
307
- const match = TIME_POINT.exec(part.replace(/\s+/g, ""));
441
+ const match = TIME_POINT.exec(part.replaceAll(/\s+/g, ""));
308
442
  if (match === null) {
309
443
  throw new Error(`malformed time interval ${token}: "${part}" is not a-b, a-* or a`);
310
444
  }
311
- const start = match[1] === "*" ? -Infinity : Number(match[1]);
312
- const endText = match[2];
445
+ const [, startText, endText] = match;
446
+ if (startText === "*" && endText === undefined) {
447
+ throw new Error(`malformed time interval ${token}: "*" alone is not a time point`);
448
+ }
449
+ const start = startText === "*" ? -Infinity : Number(startText);
313
450
  let end: number;
314
451
  if (endText === undefined) {
315
452
  end = start;
@@ -318,29 +455,43 @@ export function parseIntervals(token: string): [number, number][] {
318
455
  } else {
319
456
  end = Number(endText);
320
457
  }
458
+ // only `*` means an open end: a numeral beyond the f64 range is not a time
459
+ if (
460
+ (startText !== "*" && !Number.isFinite(start)) ||
461
+ (endText !== undefined && endText !== "*" && !Number.isFinite(end))
462
+ ) {
463
+ throw new Error(`malformed time interval ${token}: "${part}" is beyond the number range`);
464
+ }
321
465
  if (start > end) {
322
- throw new Error(`malformed time interval ${token}: ${match[1]} is after ${endText ?? ""}`);
466
+ throw new Error(`malformed time interval ${token}: ${startText} is after ${endText ?? ""}`);
323
467
  }
324
468
  spells.push([start, end]);
325
469
  }
326
470
  return spells;
327
471
  }
328
472
 
329
- const CHARACTER_REFERENCE = /&#(?:[xX]([0-9a-fA-F]{1,6})|([0-9]{1,7}));/g;
473
+ // any length, so a reference beyond U+10FFFF is seen (and kept as written with a warning)
474
+ const CHARACTER_REFERENCE = /&#(?:[xX]([\da-fA-F]+)|(\d+));/g;
330
475
 
331
476
  /**
332
477
  * Decode the `&#dddd;` and `&#xhhhh;` character references of a label, as Pajek does; a reference
333
- * outside the Unicode range is left as written.
478
+ * outside the Unicode range is left as written and handed to `onUnknown`.
334
479
  * @param text - the label as written
480
+ * @param onUnknown - called with each reference left as written, when given
335
481
  * @returns the decoded label
482
+ * @category Plugin helpers
336
483
  */
337
- export function decodeCharacterReferences(text: string): string {
484
+ export function decodeCharacterReferences(text: string, onUnknown?: (reference: string) => void): string {
338
485
  if (!text.includes("&#")) {
339
486
  return text;
340
487
  }
341
- return text.replace(CHARACTER_REFERENCE, (whole, hex: string | undefined, dec: string | undefined) => {
488
+ return text.replaceAll(CHARACTER_REFERENCE, (whole, hex: string | undefined, dec: string | undefined) => {
342
489
  const code = hex === undefined ? Number(dec) : Number.parseInt(hex, 16);
343
- return code <= 0x10ffff ? String.fromCodePoint(code) : whole;
490
+ if (code <= 0x10ffff) {
491
+ return String.fromCodePoint(code);
492
+ }
493
+ onUnknown?.(whole);
494
+ return whole;
344
495
  });
345
496
  }
346
497
 
@@ -349,18 +500,20 @@ export function decodeCharacterReferences(text: string): string {
349
500
  * `&#...;` run is written as `&#38;`, the inverse of decodeCharacterReferences().
350
501
  * @param text - the label text
351
502
  * @returns the text to write
503
+ * @category Plugin helpers
352
504
  */
353
505
  export function encodeCharacterReferences(text: string): string {
354
506
  if (!text.includes("&#")) {
355
507
  return text;
356
508
  }
357
- return text.replace(CHARACTER_REFERENCE, (whole) => `&#38;${whole.slice(1)}`);
509
+ return text.replaceAll(CHARACTER_REFERENCE, (whole) => `&#38;${whole.slice(1)}`);
358
510
  }
359
511
 
360
512
  /**
361
513
  * Write spells as a Pajek time interval token, the inverse of parseIntervals().
362
514
  * @param spells - [start, end] pairs
363
515
  * @returns the token, e.g. `[1-5,7-*]`
516
+ * @category Plugin helpers
364
517
  */
365
518
  export function formatIntervals(spells: readonly (readonly [number, number])[]): string {
366
519
  const parts: string[] = [];
@@ -381,13 +534,21 @@ export function formatIntervals(spells: readonly (readonly [number, number])[]):
381
534
  * coordinate, at the third position of a line row the value) and not a shape keyword.
382
535
  * @param text - the candidate key (a column name)
383
536
  * @returns true when the importer reads it back as a key
537
+ * @category Plugin helpers
384
538
  */
385
539
  export function isParameterKey(text: string): boolean {
386
- if (text.length === 0 || /[\s"]/.test(text) || text.startsWith("[") || text.startsWith("*")) {
540
+ if (
541
+ text.length === 0 ||
542
+ /[\s"]/.test(text) ||
543
+ text.startsWith("[") ||
544
+ text.startsWith("*") ||
545
+ text.startsWith("%")
546
+ ) {
387
547
  return false;
388
548
  }
389
549
  if (isShapeKeyword(text)) {
390
550
  return false;
391
551
  }
392
- return !/^[+-]?(\.[0-9]|[0-9])/.test(text);
552
+ // a number, or a non-finite spelling, at that place reads as a coordinate or the line value
553
+ return !/^[+-]?(\.\d|\d)/.test(text) && !/^[+-]?(?:nan|inf|infinity)$/i.test(text);
393
554
  }
@@ -76,6 +76,7 @@ const DTYPES: Readonly<Record<ScalarKind, ScalarDtype>> = {
76
76
 
77
77
  /**
78
78
  * Collects the attribute values of one table, then declares and writes the columns.
79
+ * @category Plugin helpers
79
80
  */
80
81
  export class ColumnSet {
81
82
  private readonly domain: Domain;
@@ -326,6 +327,15 @@ export class ColumnSet {
326
327
  return jsonCell(names.size > 1 ? recordOf(att) : children.map(jsonOfAtt));
327
328
  }
328
329
  let itemKind = elementKind(att.elementType);
330
+ if (itemKind === null && att.elementType !== null && att.elementType.trim().length > 0) {
331
+ this.report.warnOnce(
332
+ "unsupported",
333
+ XGMML_ISSUE.UNKNOWN_ATTR_TYPE,
334
+ `list element type "${att.elementType}" of "${name}" is not a Cytoscape type; the items are read by their own types`,
335
+ at,
336
+ `${XGMML_ISSUE.UNKNOWN_ATTR_TYPE}:${this.domain}:${name}:items`,
337
+ );
338
+ }
329
339
  if (itemKind === null) {
330
340
  const kinds = new Set<ScalarKind>();
331
341
  for (const child of children) {