@graphty/graph-io 0.3.42 → 0.3.44

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 (674) hide show
  1. package/dist/chunks/approximations-3Q4TsdTh.js +40 -0
  2. package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
  3. package/dist/chunks/block-JQiwViEt.js +2777 -0
  4. package/dist/chunks/block-JQiwViEt.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
  8. package/dist/chunks/constants-BFUR_CtU.js.map +1 -0
  9. package/dist/chunks/convert-BcQ8_jMo.js +59 -0
  10. package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
  11. package/dist/chunks/emit-DCwFLts5.js +3456 -0
  12. package/dist/chunks/emit-DCwFLts5.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
  14. package/dist/chunks/escape-B1rMftd9.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
  16. package/dist/chunks/export-D7IGzTG4.js.map +1 -0
  17. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
  18. package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
  19. package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
  20. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
  22. package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
  23. package/dist/chunks/{exporter-CpRyHZ3H.js → exporter-quPUCBiC.js} +1807 -288
  24. package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
  25. package/dist/chunks/format-GDmO6m6Q.js +676 -0
  26. package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
  27. package/dist/chunks/generic-BL06jrJf.js +1347 -0
  28. package/dist/chunks/generic-BL06jrJf.js.map +1 -0
  29. package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
  30. package/dist/chunks/importer-B7r2owVf.js.map +1 -0
  31. package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
  32. package/dist/chunks/importer-BFmOP96W.js.map +1 -0
  33. package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
  34. package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
  35. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
  36. package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
  37. package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
  38. package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
  39. package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
  40. package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
  41. package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
  42. package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
  43. package/dist/chunks/index-B9fdNpTA.js +4310 -0
  44. package/dist/chunks/index-B9fdNpTA.js.map +1 -0
  45. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
  46. package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
  47. package/dist/chunks/lexicon-B-knUi-l.js +508 -0
  48. package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
  49. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
  50. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
  51. package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
  52. package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
  53. package/dist/chunks/styles-Brt9JMfs.js +690 -0
  54. package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
  55. package/dist/chunks/styles-_N-C8S-U.js +2102 -0
  56. package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
  57. package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
  58. package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
  59. package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
  60. package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
  61. package/dist/chunks/units-XMZFIFe1.js +19 -0
  62. package/dist/chunks/units-XMZFIFe1.js.map +1 -0
  63. package/dist/csv.js +5 -4
  64. package/dist/csv.js.map +1 -1
  65. package/dist/cx.js +1 -1
  66. package/dist/cx2.js +2 -2
  67. package/dist/cys.js +1 -1
  68. package/dist/dot.js +5 -2
  69. package/dist/dot.js.map +1 -1
  70. package/dist/gexf.js +295 -414
  71. package/dist/gexf.js.map +1 -1
  72. package/dist/gml.js +8 -3031
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +354 -240
  75. package/dist/graph-io.js.map +1 -1
  76. package/dist/graphml.js +4 -2
  77. package/dist/graphml.js.map +1 -1
  78. package/dist/json.js +1 -1
  79. package/dist/neo4j.js +4 -3
  80. package/dist/neo4j.js.map +1 -1
  81. package/dist/obo.js +1 -1
  82. package/dist/pajek.js +4 -2
  83. package/dist/positions.d.ts +1 -0
  84. package/dist/positions.js +427 -0
  85. package/dist/positions.js.map +1 -0
  86. package/dist/src/common/codes.d.ts +6 -0
  87. package/dist/src/common/codes.d.ts.map +1 -1
  88. package/dist/src/common/codes.js +6 -0
  89. package/dist/src/common/codes.js.map +1 -1
  90. package/dist/src/common/escape.d.ts.map +1 -1
  91. package/dist/src/common/escape.js +4 -2
  92. package/dist/src/common/escape.js.map +1 -1
  93. package/dist/src/common/export.d.ts +10 -0
  94. package/dist/src/common/export.d.ts.map +1 -1
  95. package/dist/src/common/export.js +123 -100
  96. package/dist/src/common/export.js.map +1 -1
  97. package/dist/src/common/input.d.ts.map +1 -1
  98. package/dist/src/common/input.js +8 -1
  99. package/dist/src/common/input.js.map +1 -1
  100. package/dist/src/common/json-elements.d.ts +12 -9
  101. package/dist/src/common/json-elements.d.ts.map +1 -1
  102. package/dist/src/common/json-elements.js +160 -37
  103. package/dist/src/common/json-elements.js.map +1 -1
  104. package/dist/src/common/notes.d.ts +42 -0
  105. package/dist/src/common/notes.d.ts.map +1 -0
  106. package/dist/src/common/notes.js +72 -0
  107. package/dist/src/common/notes.js.map +1 -0
  108. package/dist/src/common/report.d.ts +18 -0
  109. package/dist/src/common/report.d.ts.map +1 -1
  110. package/dist/src/common/report.js +36 -1
  111. package/dist/src/common/report.js.map +1 -1
  112. package/dist/src/common/units.d.ts +24 -0
  113. package/dist/src/common/units.d.ts.map +1 -0
  114. package/dist/src/common/units.js +26 -0
  115. package/dist/src/common/units.js.map +1 -0
  116. package/dist/src/common/xml.d.ts +18 -0
  117. package/dist/src/common/xml.d.ts.map +1 -1
  118. package/dist/src/common/xml.js +42 -5
  119. package/dist/src/common/xml.js.map +1 -1
  120. package/dist/src/formats/cx/exporter.d.ts +6 -0
  121. package/dist/src/formats/cx/exporter.d.ts.map +1 -1
  122. package/dist/src/formats/cx/exporter.js +71 -8
  123. package/dist/src/formats/cx/exporter.js.map +1 -1
  124. package/dist/src/formats/cx/importer.d.ts +5 -2
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +102 -72
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +102 -0
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -0
  130. package/dist/src/formats/cx/styles.js +225 -0
  131. package/dist/src/formats/cx/styles.js.map +1 -0
  132. package/dist/src/formats/cx2/exporter.d.ts +5 -0
  133. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  134. package/dist/src/formats/cx2/exporter.js +181 -71
  135. package/dist/src/formats/cx2/exporter.js.map +1 -1
  136. package/dist/src/formats/cx2/importer.d.ts +4 -1
  137. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  138. package/dist/src/formats/cx2/importer.js +19 -1
  139. package/dist/src/formats/cx2/importer.js.map +1 -1
  140. package/dist/src/formats/cx2/styles.d.ts +18 -0
  141. package/dist/src/formats/cx2/styles.d.ts.map +1 -0
  142. package/dist/src/formats/cx2/styles.js +24 -0
  143. package/dist/src/formats/cx2/styles.js.map +1 -0
  144. package/dist/src/formats/cys/constants.d.ts +2 -0
  145. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  146. package/dist/src/formats/cys/constants.js +2 -0
  147. package/dist/src/formats/cys/constants.js.map +1 -1
  148. package/dist/src/formats/cys/exporter.d.ts +6 -2
  149. package/dist/src/formats/cys/exporter.d.ts.map +1 -1
  150. package/dist/src/formats/cys/exporter.js +215 -53
  151. package/dist/src/formats/cys/exporter.js.map +1 -1
  152. package/dist/src/formats/cys/importer.d.ts +2 -1
  153. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  154. package/dist/src/formats/cys/importer.js +119 -6
  155. package/dist/src/formats/cys/importer.js.map +1 -1
  156. package/dist/src/formats/cys/session.d.ts +2 -0
  157. package/dist/src/formats/cys/session.d.ts.map +1 -1
  158. package/dist/src/formats/cys/session.js +5 -0
  159. package/dist/src/formats/cys/session.js.map +1 -1
  160. package/dist/src/formats/cys/styles.d.ts +38 -0
  161. package/dist/src/formats/cys/styles.d.ts.map +1 -0
  162. package/dist/src/formats/cys/styles.js +213 -0
  163. package/dist/src/formats/cys/styles.js.map +1 -0
  164. package/dist/src/formats/cys/tables.d.ts +8 -3
  165. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  166. package/dist/src/formats/cys/tables.js +88 -34
  167. package/dist/src/formats/cys/tables.js.map +1 -1
  168. package/dist/src/formats/dot/exporter.d.ts +2 -0
  169. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  170. package/dist/src/formats/dot/exporter.js +195 -81
  171. package/dist/src/formats/dot/exporter.js.map +1 -1
  172. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  173. package/dist/src/formats/dot/importer.js +100 -20
  174. package/dist/src/formats/dot/importer.js.map +1 -1
  175. package/dist/src/formats/dot/index.d.ts +1 -0
  176. package/dist/src/formats/dot/index.d.ts.map +1 -1
  177. package/dist/src/formats/dot/index.js +1 -0
  178. package/dist/src/formats/dot/index.js.map +1 -1
  179. package/dist/src/formats/dot/positions.d.ts +14 -0
  180. package/dist/src/formats/dot/positions.d.ts.map +1 -0
  181. package/dist/src/formats/dot/positions.js +70 -0
  182. package/dist/src/formats/dot/positions.js.map +1 -0
  183. package/dist/src/formats/dot/styles.d.ts +82 -0
  184. package/dist/src/formats/dot/styles.d.ts.map +1 -0
  185. package/dist/src/formats/dot/styles.js +1484 -0
  186. package/dist/src/formats/dot/styles.js.map +1 -0
  187. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  188. package/dist/src/formats/gexf/exporter.js +23 -7
  189. package/dist/src/formats/gexf/exporter.js.map +1 -1
  190. package/dist/src/formats/gexf/importer.d.ts +8 -1
  191. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  192. package/dist/src/formats/gexf/importer.js +251 -131
  193. package/dist/src/formats/gexf/importer.js.map +1 -1
  194. package/dist/src/formats/gexf/index.d.ts +8 -0
  195. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  196. package/dist/src/formats/gexf/index.js +10 -2
  197. package/dist/src/formats/gexf/index.js.map +1 -1
  198. package/dist/src/formats/gexf/schema.d.ts +5 -0
  199. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  200. package/dist/src/formats/gexf/schema.js +5 -0
  201. package/dist/src/formats/gexf/schema.js.map +1 -1
  202. package/dist/src/formats/gexf/styles.d.ts +74 -0
  203. package/dist/src/formats/gexf/styles.d.ts.map +1 -0
  204. package/dist/src/formats/gexf/styles.js +604 -0
  205. package/dist/src/formats/gexf/styles.js.map +1 -0
  206. package/dist/src/formats/gml/exporter.d.ts +1 -5
  207. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  208. package/dist/src/formats/gml/exporter.js +19 -8
  209. package/dist/src/formats/gml/exporter.js.map +1 -1
  210. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  211. package/dist/src/formats/gml/importer.js +4 -0
  212. package/dist/src/formats/gml/importer.js.map +1 -1
  213. package/dist/src/formats/gml/index.d.ts +2 -1
  214. package/dist/src/formats/gml/index.d.ts.map +1 -1
  215. package/dist/src/formats/gml/index.js +2 -1
  216. package/dist/src/formats/gml/index.js.map +1 -1
  217. package/dist/src/formats/gml/positions.d.ts +14 -0
  218. package/dist/src/formats/gml/positions.d.ts.map +1 -0
  219. package/dist/src/formats/gml/positions.js +46 -0
  220. package/dist/src/formats/gml/positions.js.map +1 -0
  221. package/dist/src/formats/gml/styles.d.ts +59 -0
  222. package/dist/src/formats/gml/styles.d.ts.map +1 -0
  223. package/dist/src/formats/gml/styles.js +1056 -0
  224. package/dist/src/formats/gml/styles.js.map +1 -0
  225. package/dist/src/formats/gml/syntax.d.ts +11 -0
  226. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  227. package/dist/src/formats/gml/syntax.js +151 -62
  228. package/dist/src/formats/gml/syntax.js.map +1 -1
  229. package/dist/src/formats/graphml/constants.d.ts +4 -0
  230. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  231. package/dist/src/formats/graphml/constants.js +5 -1
  232. package/dist/src/formats/graphml/constants.js.map +1 -1
  233. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  234. package/dist/src/formats/graphml/exporter.js +133 -65
  235. package/dist/src/formats/graphml/exporter.js.map +1 -1
  236. package/dist/src/formats/graphml/importer.d.ts +4 -1
  237. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  238. package/dist/src/formats/graphml/importer.js +100 -44
  239. package/dist/src/formats/graphml/importer.js.map +1 -1
  240. package/dist/src/formats/graphml/index.d.ts +1 -0
  241. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  242. package/dist/src/formats/graphml/index.js +1 -0
  243. package/dist/src/formats/graphml/index.js.map +1 -1
  244. package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
  245. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
  246. package/dist/src/formats/graphml/styles-plain.js +187 -0
  247. package/dist/src/formats/graphml/styles-plain.js.map +1 -0
  248. package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
  249. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
  250. package/dist/src/formats/graphml/styles-yed.js +1086 -0
  251. package/dist/src/formats/graphml/styles-yed.js.map +1 -0
  252. package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
  253. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
  254. package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
  255. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
  256. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  257. package/dist/src/formats/graphml/tree.js +34 -19
  258. package/dist/src/formats/graphml/tree.js.map +1 -1
  259. package/dist/src/formats/graphml/yfiles.d.ts +16 -2
  260. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  261. package/dist/src/formats/graphml/yfiles.js +83 -12
  262. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  263. package/dist/src/formats/json/exporter.d.ts +5 -0
  264. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  265. package/dist/src/formats/json/exporter.js +68 -25
  266. package/dist/src/formats/json/exporter.js.map +1 -1
  267. package/dist/src/formats/json/importer.d.ts +22 -3
  268. package/dist/src/formats/json/importer.d.ts.map +1 -1
  269. package/dist/src/formats/json/importer.js +441 -265
  270. package/dist/src/formats/json/importer.js.map +1 -1
  271. package/dist/src/formats/json/positions.d.ts +16 -0
  272. package/dist/src/formats/json/positions.d.ts.map +1 -0
  273. package/dist/src/formats/json/positions.js +44 -0
  274. package/dist/src/formats/json/positions.js.map +1 -0
  275. package/dist/src/formats/json/styles.d.ts +102 -0
  276. package/dist/src/formats/json/styles.d.ts.map +1 -0
  277. package/dist/src/formats/json/styles.js +1753 -0
  278. package/dist/src/formats/json/styles.js.map +1 -0
  279. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  280. package/dist/src/formats/neo4j/exporter.js +2 -1
  281. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  282. package/dist/src/formats/pajek/exporter.d.ts +2 -0
  283. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/pajek/exporter.js +142 -76
  285. package/dist/src/formats/pajek/exporter.js.map +1 -1
  286. package/dist/src/formats/pajek/importer.d.ts +4 -0
  287. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  288. package/dist/src/formats/pajek/importer.js +60 -6
  289. package/dist/src/formats/pajek/importer.js.map +1 -1
  290. package/dist/src/formats/pajek/index.d.ts +2 -0
  291. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  292. package/dist/src/formats/pajek/index.js +2 -0
  293. package/dist/src/formats/pajek/index.js.map +1 -1
  294. package/dist/src/formats/pajek/styles.d.ts +50 -0
  295. package/dist/src/formats/pajek/styles.d.ts.map +1 -0
  296. package/dist/src/formats/pajek/styles.js +569 -0
  297. package/dist/src/formats/pajek/styles.js.map +1 -0
  298. package/dist/src/formats/pajek/syntax.d.ts +6 -0
  299. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  300. package/dist/src/formats/pajek/syntax.js +6 -0
  301. package/dist/src/formats/pajek/syntax.js.map +1 -1
  302. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  303. package/dist/src/formats/xgmml/columns.js +34 -9
  304. package/dist/src/formats/xgmml/columns.js.map +1 -1
  305. package/dist/src/formats/xgmml/constants.d.ts +2 -0
  306. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  307. package/dist/src/formats/xgmml/constants.js +3 -1
  308. package/dist/src/formats/xgmml/constants.js.map +1 -1
  309. package/dist/src/formats/xgmml/document.d.ts +12 -8
  310. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  311. package/dist/src/formats/xgmml/document.js +56 -13
  312. package/dist/src/formats/xgmml/document.js.map +1 -1
  313. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  314. package/dist/src/formats/xgmml/emit.js +12 -6
  315. package/dist/src/formats/xgmml/emit.js.map +1 -1
  316. package/dist/src/formats/xgmml/exporter.d.ts +3 -1
  317. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  318. package/dist/src/formats/xgmml/exporter.js +22 -9
  319. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  320. package/dist/src/formats/xgmml/importer.d.ts +2 -1
  321. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  322. package/dist/src/formats/xgmml/importer.js +31 -24
  323. package/dist/src/formats/xgmml/importer.js.map +1 -1
  324. package/dist/src/formats/xgmml/styles.d.ts +104 -0
  325. package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
  326. package/dist/src/formats/xgmml/styles.js +310 -0
  327. package/dist/src/formats/xgmml/styles.js.map +1 -0
  328. package/dist/src/index.d.ts +9 -7
  329. package/dist/src/index.d.ts.map +1 -1
  330. package/dist/src/index.js +7 -7
  331. package/dist/src/index.js.map +1 -1
  332. package/dist/src/positions/codes.d.ts +31 -0
  333. package/dist/src/positions/codes.d.ts.map +1 -0
  334. package/dist/src/positions/codes.js +26 -0
  335. package/dist/src/positions/codes.js.map +1 -0
  336. package/dist/src/positions/convert.d.ts +58 -0
  337. package/dist/src/positions/convert.d.ts.map +1 -0
  338. package/dist/src/positions/convert.js +107 -0
  339. package/dist/src/positions/convert.js.map +1 -0
  340. package/dist/src/positions/extract.d.ts +27 -0
  341. package/dist/src/positions/extract.d.ts.map +1 -0
  342. package/dist/src/positions/extract.js +526 -0
  343. package/dist/src/positions/extract.js.map +1 -0
  344. package/dist/src/positions/index.d.ts +10 -0
  345. package/dist/src/positions/index.d.ts.map +1 -0
  346. package/dist/src/positions/index.js +9 -0
  347. package/dist/src/positions/index.js.map +1 -0
  348. package/dist/src/positions/types.d.ts +208 -0
  349. package/dist/src/positions/types.d.ts.map +1 -0
  350. package/dist/src/positions/types.js +10 -0
  351. package/dist/src/positions/types.js.map +1 -0
  352. package/dist/src/registry.d.ts +30 -0
  353. package/dist/src/registry.d.ts.map +1 -1
  354. package/dist/src/registry.js +130 -9
  355. package/dist/src/registry.js.map +1 -1
  356. package/dist/src/styles/annotations.d.ts +132 -0
  357. package/dist/src/styles/annotations.d.ts.map +1 -0
  358. package/dist/src/styles/annotations.js +320 -0
  359. package/dist/src/styles/annotations.js.map +1 -0
  360. package/dist/src/styles/budget.d.ts +45 -0
  361. package/dist/src/styles/budget.d.ts.map +1 -0
  362. package/dist/src/styles/budget.js +58 -0
  363. package/dist/src/styles/budget.js.map +1 -0
  364. package/dist/src/styles/canon/bends.d.ts +32 -0
  365. package/dist/src/styles/canon/bends.d.ts.map +1 -0
  366. package/dist/src/styles/canon/bends.js +74 -0
  367. package/dist/src/styles/canon/bends.js.map +1 -0
  368. package/dist/src/styles/canon/color-tables.d.ts +22 -0
  369. package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
  370. package/dist/src/styles/canon/color-tables.js +369 -0
  371. package/dist/src/styles/canon/color-tables.js.map +1 -0
  372. package/dist/src/styles/canon/color.d.ts +66 -0
  373. package/dist/src/styles/canon/color.d.ts.map +1 -0
  374. package/dist/src/styles/canon/color.js +548 -0
  375. package/dist/src/styles/canon/color.js.map +1 -0
  376. package/dist/src/styles/canon/enums.d.ts +25 -0
  377. package/dist/src/styles/canon/enums.d.ts.map +1 -0
  378. package/dist/src/styles/canon/enums.js +187 -0
  379. package/dist/src/styles/canon/enums.js.map +1 -0
  380. package/dist/src/styles/canon/graphviz.d.ts +48 -0
  381. package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
  382. package/dist/src/styles/canon/graphviz.js +160 -0
  383. package/dist/src/styles/canon/graphviz.js.map +1 -0
  384. package/dist/src/styles/canon/index.d.ts +13 -0
  385. package/dist/src/styles/canon/index.d.ts.map +1 -0
  386. package/dist/src/styles/canon/index.js +13 -0
  387. package/dist/src/styles/canon/index.js.map +1 -0
  388. package/dist/src/styles/canon/number.d.ts +59 -0
  389. package/dist/src/styles/canon/number.d.ts.map +1 -0
  390. package/dist/src/styles/canon/number.js +142 -0
  391. package/dist/src/styles/canon/number.js.map +1 -0
  392. package/dist/src/styles/canon/site.d.ts +51 -0
  393. package/dist/src/styles/canon/site.d.ts.map +1 -0
  394. package/dist/src/styles/canon/site.js +63 -0
  395. package/dist/src/styles/canon/site.js.map +1 -0
  396. package/dist/src/styles/canon/text.d.ts +61 -0
  397. package/dist/src/styles/canon/text.d.ts.map +1 -0
  398. package/dist/src/styles/canon/text.js +199 -0
  399. package/dist/src/styles/canon/text.js.map +1 -0
  400. package/dist/src/styles/codes.d.ts +95 -0
  401. package/dist/src/styles/codes.d.ts.map +1 -0
  402. package/dist/src/styles/codes.js +97 -0
  403. package/dist/src/styles/codes.js.map +1 -0
  404. package/dist/src/styles/cyjs/cascade.d.ts +134 -0
  405. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
  406. package/dist/src/styles/cyjs/cascade.js +2252 -0
  407. package/dist/src/styles/cyjs/cascade.js.map +1 -0
  408. package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
  409. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
  410. package/dist/src/styles/cyjs/defaults-table.js +76 -0
  411. package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
  412. package/dist/src/styles/cyjs/emit.d.ts +82 -0
  413. package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
  414. package/dist/src/styles/cyjs/emit.js +790 -0
  415. package/dist/src/styles/cyjs/emit.js.map +1 -0
  416. package/dist/src/styles/cyjs/index.d.ts +13 -0
  417. package/dist/src/styles/cyjs/index.d.ts.map +1 -0
  418. package/dist/src/styles/cyjs/index.js +13 -0
  419. package/dist/src/styles/cyjs/index.js.map +1 -0
  420. package/dist/src/styles/cyjs/live.d.ts +46 -0
  421. package/dist/src/styles/cyjs/live.d.ts.map +1 -0
  422. package/dist/src/styles/cyjs/live.js +108 -0
  423. package/dist/src/styles/cyjs/live.js.map +1 -0
  424. package/dist/src/styles/cyjs/mappers.d.ts +147 -0
  425. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
  426. package/dist/src/styles/cyjs/mappers.js +744 -0
  427. package/dist/src/styles/cyjs/mappers.js.map +1 -0
  428. package/dist/src/styles/cyjs/selector.d.ts +113 -0
  429. package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
  430. package/dist/src/styles/cyjs/selector.js +611 -0
  431. package/dist/src/styles/cyjs/selector.js.map +1 -0
  432. package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
  433. package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
  434. package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
  435. package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
  436. package/dist/src/styles/cytoscape/emit.d.ts +125 -0
  437. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
  438. package/dist/src/styles/cytoscape/emit.js +1025 -0
  439. package/dist/src/styles/cytoscape/emit.js.map +1 -0
  440. package/dist/src/styles/cytoscape/index.d.ts +10 -0
  441. package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
  442. package/dist/src/styles/cytoscape/index.js +10 -0
  443. package/dist/src/styles/cytoscape/index.js.map +1 -0
  444. package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
  445. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
  446. package/dist/src/styles/cytoscape/lexicon.js +603 -0
  447. package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
  448. package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
  449. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
  450. package/dist/src/styles/cytoscape/mappings.js +460 -0
  451. package/dist/src/styles/cytoscape/mappings.js.map +1 -0
  452. package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
  453. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
  454. package/dist/src/styles/cytoscape/resolve.js +381 -0
  455. package/dist/src/styles/cytoscape/resolve.js.map +1 -0
  456. package/dist/src/styles/cytoscape/translate.d.ts +50 -0
  457. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
  458. package/dist/src/styles/cytoscape/translate.js +156 -0
  459. package/dist/src/styles/cytoscape/translate.js.map +1 -0
  460. package/dist/src/styles/defaults.d.ts +90 -0
  461. package/dist/src/styles/defaults.d.ts.map +1 -0
  462. package/dist/src/styles/defaults.js +414 -0
  463. package/dist/src/styles/defaults.js.map +1 -0
  464. package/dist/src/styles/index.d.ts +15 -0
  465. package/dist/src/styles/index.d.ts.map +1 -0
  466. package/dist/src/styles/index.js +14 -0
  467. package/dist/src/styles/index.js.map +1 -0
  468. package/dist/src/styles/internal.d.ts +17 -0
  469. package/dist/src/styles/internal.d.ts.map +1 -0
  470. package/dist/src/styles/internal.js +16 -0
  471. package/dist/src/styles/internal.js.map +1 -0
  472. package/dist/src/styles/io/approximations.d.ts +24 -0
  473. package/dist/src/styles/io/approximations.d.ts.map +1 -0
  474. package/dist/src/styles/io/approximations.js +51 -0
  475. package/dist/src/styles/io/approximations.js.map +1 -0
  476. package/dist/src/styles/io/block.d.ts +166 -0
  477. package/dist/src/styles/io/block.d.ts.map +1 -0
  478. package/dist/src/styles/io/block.js +930 -0
  479. package/dist/src/styles/io/block.js.map +1 -0
  480. package/dist/src/styles/io/generic.d.ts +88 -0
  481. package/dist/src/styles/io/generic.d.ts.map +1 -0
  482. package/dist/src/styles/io/generic.js +516 -0
  483. package/dist/src/styles/io/generic.js.map +1 -0
  484. package/dist/src/styles/io/index.d.ts +8 -0
  485. package/dist/src/styles/io/index.d.ts.map +1 -0
  486. package/dist/src/styles/io/index.js +7 -0
  487. package/dist/src/styles/io/index.js.map +1 -0
  488. package/dist/src/styles/io/writer.d.ts +80 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +596 -0
  491. package/dist/src/styles/io/writer.js.map +1 -0
  492. package/dist/src/styles/notes.d.ts +47 -0
  493. package/dist/src/styles/notes.d.ts.map +1 -0
  494. package/dist/src/styles/notes.js +140 -0
  495. package/dist/src/styles/notes.js.map +1 -0
  496. package/dist/src/styles/plan/classes.d.ts +31 -0
  497. package/dist/src/styles/plan/classes.d.ts.map +1 -0
  498. package/dist/src/styles/plan/classes.js +139 -0
  499. package/dist/src/styles/plan/classes.js.map +1 -0
  500. package/dist/src/styles/plan/continuous.d.ts +32 -0
  501. package/dist/src/styles/plan/continuous.d.ts.map +1 -0
  502. package/dist/src/styles/plan/continuous.js +165 -0
  503. package/dist/src/styles/plan/continuous.js.map +1 -0
  504. package/dist/src/styles/plan/discrete.d.ts +39 -0
  505. package/dist/src/styles/plan/discrete.d.ts.map +1 -0
  506. package/dist/src/styles/plan/discrete.js +127 -0
  507. package/dist/src/styles/plan/discrete.js.map +1 -0
  508. package/dist/src/styles/plan/families.d.ts +31 -0
  509. package/dist/src/styles/plan/families.d.ts.map +1 -0
  510. package/dist/src/styles/plan/families.js +95 -0
  511. package/dist/src/styles/plan/families.js.map +1 -0
  512. package/dist/src/styles/plan/features.d.ts +58 -0
  513. package/dist/src/styles/plan/features.d.ts.map +1 -0
  514. package/dist/src/styles/plan/features.js +185 -0
  515. package/dist/src/styles/plan/features.js.map +1 -0
  516. package/dist/src/styles/plan/index.d.ts +7 -0
  517. package/dist/src/styles/plan/index.d.ts.map +1 -0
  518. package/dist/src/styles/plan/index.js +7 -0
  519. package/dist/src/styles/plan/index.js.map +1 -0
  520. package/dist/src/styles/plan/plan.d.ts +71 -0
  521. package/dist/src/styles/plan/plan.d.ts.map +1 -0
  522. package/dist/src/styles/plan/plan.js +893 -0
  523. package/dist/src/styles/plan/plan.js.map +1 -0
  524. package/dist/src/styles/plan/resolve.d.ts +137 -0
  525. package/dist/src/styles/plan/resolve.d.ts.map +1 -0
  526. package/dist/src/styles/plan/resolve.js +587 -0
  527. package/dist/src/styles/plan/resolve.js.map +1 -0
  528. package/dist/src/styles/types.d.ts +702 -0
  529. package/dist/src/styles/types.d.ts.map +1 -0
  530. package/dist/src/styles/types.js +10 -0
  531. package/dist/src/styles/types.js.map +1 -0
  532. package/dist/src/styles/vocabulary.d.ts +41 -0
  533. package/dist/src/styles/vocabulary.d.ts.map +1 -0
  534. package/dist/src/styles/vocabulary.js +140 -0
  535. package/dist/src/styles/vocabulary.js.map +1 -0
  536. package/dist/src/types.d.ts +64 -1
  537. package/dist/src/types.d.ts.map +1 -1
  538. package/dist/src/types.js.map +1 -1
  539. package/dist/styles.d.ts +1 -0
  540. package/dist/styles.js +322 -0
  541. package/dist/styles.js.map +1 -0
  542. package/dist/xgmml.js +5 -4
  543. package/dist/xgmml.js.map +1 -1
  544. package/package.json +13 -2
  545. package/src/common/codes.ts +7 -0
  546. package/src/common/escape.ts +5 -2
  547. package/src/common/export.ts +179 -140
  548. package/src/common/input.ts +8 -4
  549. package/src/common/json-elements.ts +169 -38
  550. package/src/common/notes.ts +94 -0
  551. package/src/common/report.ts +41 -1
  552. package/src/common/units.ts +42 -0
  553. package/src/common/xml.ts +45 -5
  554. package/src/formats/cx/exporter.ts +95 -11
  555. package/src/formats/cx/importer.ts +126 -90
  556. package/src/formats/cx/styles.ts +304 -0
  557. package/src/formats/cx2/exporter.ts +234 -77
  558. package/src/formats/cx2/importer.ts +19 -1
  559. package/src/formats/cx2/styles.ts +29 -0
  560. package/src/formats/cys/constants.ts +3 -0
  561. package/src/formats/cys/exporter.ts +246 -60
  562. package/src/formats/cys/importer.ts +125 -9
  563. package/src/formats/cys/session.ts +6 -0
  564. package/src/formats/cys/styles.ts +254 -0
  565. package/src/formats/cys/tables.ts +117 -48
  566. package/src/formats/dot/exporter.ts +262 -126
  567. package/src/formats/dot/importer.ts +111 -20
  568. package/src/formats/dot/index.ts +1 -0
  569. package/src/formats/dot/positions.ts +77 -0
  570. package/src/formats/dot/styles.ts +1741 -0
  571. package/src/formats/gexf/exporter.ts +30 -13
  572. package/src/formats/gexf/importer.ts +308 -158
  573. package/src/formats/gexf/index.ts +10 -0
  574. package/src/formats/gexf/schema.ts +5 -0
  575. package/src/formats/gexf/styles.ts +719 -0
  576. package/src/formats/gml/exporter.ts +33 -14
  577. package/src/formats/gml/importer.ts +4 -0
  578. package/src/formats/gml/index.ts +2 -1
  579. package/src/formats/gml/positions.ts +52 -0
  580. package/src/formats/gml/styles.ts +1248 -0
  581. package/src/formats/gml/syntax.ts +173 -62
  582. package/src/formats/graphml/constants.ts +5 -0
  583. package/src/formats/graphml/exporter.ts +163 -71
  584. package/src/formats/graphml/importer.ts +119 -45
  585. package/src/formats/graphml/index.ts +1 -0
  586. package/src/formats/graphml/styles-plain.ts +236 -0
  587. package/src/formats/graphml/styles-yed.ts +1221 -0
  588. package/src/formats/graphml/styles-yfiles3.ts +573 -0
  589. package/src/formats/graphml/tree.ts +36 -20
  590. package/src/formats/graphml/yfiles.ts +89 -13
  591. package/src/formats/json/exporter.ts +76 -26
  592. package/src/formats/json/importer.ts +543 -323
  593. package/src/formats/json/positions.ts +50 -0
  594. package/src/formats/json/styles.ts +2082 -0
  595. package/src/formats/neo4j/exporter.ts +2 -1
  596. package/src/formats/pajek/exporter.ts +195 -106
  597. package/src/formats/pajek/importer.ts +78 -9
  598. package/src/formats/pajek/index.ts +2 -0
  599. package/src/formats/pajek/styles.ts +685 -0
  600. package/src/formats/pajek/syntax.ts +7 -0
  601. package/src/formats/xgmml/columns.ts +39 -9
  602. package/src/formats/xgmml/constants.ts +3 -0
  603. package/src/formats/xgmml/document.ts +54 -12
  604. package/src/formats/xgmml/emit.ts +11 -6
  605. package/src/formats/xgmml/exporter.ts +32 -13
  606. package/src/formats/xgmml/importer.ts +43 -29
  607. package/src/formats/xgmml/styles.ts +400 -0
  608. package/src/index.ts +16 -0
  609. package/src/positions/codes.ts +32 -0
  610. package/src/positions/convert.ts +123 -0
  611. package/src/positions/extract.ts +619 -0
  612. package/src/positions/index.ts +23 -0
  613. package/src/positions/types.ts +221 -0
  614. package/src/registry.ts +179 -8
  615. package/src/styles/annotations.ts +478 -0
  616. package/src/styles/budget.ts +60 -0
  617. package/src/styles/canon/bends.ts +84 -0
  618. package/src/styles/canon/color-tables.ts +386 -0
  619. package/src/styles/canon/color.ts +624 -0
  620. package/src/styles/canon/enums.ts +211 -0
  621. package/src/styles/canon/graphviz.ts +189 -0
  622. package/src/styles/canon/index.ts +13 -0
  623. package/src/styles/canon/number.ts +152 -0
  624. package/src/styles/canon/site.ts +87 -0
  625. package/src/styles/canon/text.ts +221 -0
  626. package/src/styles/codes.ts +104 -0
  627. package/src/styles/cyjs/cascade.ts +2670 -0
  628. package/src/styles/cyjs/defaults-table.ts +82 -0
  629. package/src/styles/cyjs/emit.ts +951 -0
  630. package/src/styles/cyjs/index.ts +37 -0
  631. package/src/styles/cyjs/live.ts +147 -0
  632. package/src/styles/cyjs/mappers.ts +879 -0
  633. package/src/styles/cyjs/selector.ts +778 -0
  634. package/src/styles/cyjs/stylesheet-text.ts +214 -0
  635. package/src/styles/cytoscape/emit.ts +1264 -0
  636. package/src/styles/cytoscape/index.ts +40 -0
  637. package/src/styles/cytoscape/lexicon.ts +656 -0
  638. package/src/styles/cytoscape/mappings.ts +603 -0
  639. package/src/styles/cytoscape/resolve.ts +521 -0
  640. package/src/styles/cytoscape/translate.ts +237 -0
  641. package/src/styles/defaults.ts +504 -0
  642. package/src/styles/index.ts +57 -0
  643. package/src/styles/internal.ts +17 -0
  644. package/src/styles/io/approximations.ts +47 -0
  645. package/src/styles/io/block.ts +1138 -0
  646. package/src/styles/io/generic.ts +687 -0
  647. package/src/styles/io/index.ts +18 -0
  648. package/src/styles/io/writer.ts +745 -0
  649. package/src/styles/notes.ts +165 -0
  650. package/src/styles/plan/classes.ts +166 -0
  651. package/src/styles/plan/continuous.ts +218 -0
  652. package/src/styles/plan/discrete.ts +165 -0
  653. package/src/styles/plan/families.ts +115 -0
  654. package/src/styles/plan/features.ts +234 -0
  655. package/src/styles/plan/index.ts +7 -0
  656. package/src/styles/plan/plan.ts +1129 -0
  657. package/src/styles/plan/resolve.ts +685 -0
  658. package/src/styles/types.ts +814 -0
  659. package/src/styles/vocabulary.ts +172 -0
  660. package/src/types.ts +76 -1
  661. package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
  662. package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
  663. package/dist/chunks/export-rKLeGQMo.js.map +0 -1
  664. package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
  665. package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
  666. package/dist/chunks/exporter-CpRyHZ3H.js.map +0 -1
  667. package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
  668. package/dist/chunks/importer-C98dpSH4.js.map +0 -1
  669. package/dist/chunks/importer-D794XUTe.js.map +0 -1
  670. package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
  671. package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
  672. package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
  673. package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
  674. package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
@@ -106,6 +106,28 @@ interface RewrittenNumbers {
106
106
  readonly reviveExact: (key: string, value: unknown) => unknown;
107
107
  }
108
108
 
109
+ /**
110
+ * Every JSON string literal of a text, quotes included, in one left-to-right pass (a regex over
111
+ * untrusted text would scan again from every quote of an unterminated string). An unterminated
112
+ * literal at the end is left out.
113
+ * @param text - the document text
114
+ * @yields each literal
115
+ */
116
+ function* stringLiterals(text: string): Generator<string> {
117
+ let i = text.indexOf('"');
118
+ while (i >= 0) {
119
+ let j = i + 1;
120
+ while (j < text.length && text[j] !== '"') {
121
+ j += text[j] === "\\" ? 2 : 1;
122
+ }
123
+ if (j >= text.length) {
124
+ return;
125
+ }
126
+ yield text.slice(i, j + 1);
127
+ i = text.indexOf('"', j + 1);
128
+ }
129
+ }
130
+
109
131
  /**
110
132
  * The sentinel prefix of one rewrite: SENTINEL with a colon, or a numbered variant when the document
111
133
  * already holds that one. A string can only decode to a NUL by escaping it (`\u0000`), so when the
@@ -118,7 +140,7 @@ function sentinelFor(text: string): string {
118
140
  let haystack = text;
119
141
  if (/\\u0000/i.test(text)) {
120
142
  const decoded: string[] = [];
121
- for (const [literal] of text.matchAll(/"(?:[^"\\]|\\.)*"/g)) {
143
+ for (const literal of stringLiterals(text)) {
122
144
  if (literal.includes("\\")) {
123
145
  decoded.push(decodeString(literal));
124
146
  }
@@ -427,6 +449,126 @@ function closingQuote(text: string, from: number): number {
427
449
  return text.length;
428
450
  }
429
451
 
452
+ /**
453
+ * The keys of one object of a valid JSON text in the order the text writes them (a repeated key at its first place),
454
+ * found by a path of keys and array indices from the root. `JSON.parse` gives an object's integer-like keys first, in
455
+ * numeric order, whatever order the text has; this gives the text's.
456
+ * @param text - a text JSON.parse accepted (non-standard number tokens included)
457
+ * @param path - the keys and array indices leading to the object (a repeated key leads to its last value, as
458
+ * JSON.parse reads it)
459
+ * @returns the keys, or null when the path does not lead to an object
460
+ * @category Plugin helpers
461
+ */
462
+ export function keysInTextOrder(text: string, path: readonly (string | number)[]): string[] | null {
463
+ let at = skipJsonSpace(text, 0);
464
+ for (const step of path) {
465
+ let next = -1;
466
+ if (typeof step === "number" && text.codePointAt(at) === 91) {
467
+ let index = 0;
468
+ forEachJsonEntry(text, at, false, (_key, value) => {
469
+ if (index++ === step) {
470
+ next = value;
471
+ }
472
+ });
473
+ } else if (typeof step === "string" && text.codePointAt(at) === 123) {
474
+ forEachJsonEntry(text, at, true, (key, value) => {
475
+ if (key === step) {
476
+ next = value;
477
+ }
478
+ });
479
+ }
480
+ if (next < 0) {
481
+ return null;
482
+ }
483
+ at = next;
484
+ }
485
+ if (text.codePointAt(at) !== 123) {
486
+ return null;
487
+ }
488
+ const keys = new Set<string>();
489
+ forEachJsonEntry(text, at, true, (key) => keys.add(key as string));
490
+ return [...keys];
491
+ }
492
+
493
+ /**
494
+ * Call back with each member of an object (its key and the offset of its value) or each element of an array.
495
+ * @param text - the text
496
+ * @param open - the offset of the opening brace or bracket
497
+ * @param object - whether it is an object
498
+ * @param visit - called per member or element
499
+ */
500
+ function forEachJsonEntry(
501
+ text: string,
502
+ open: number,
503
+ object: boolean,
504
+ visit: (key: string | null, value: number) => void,
505
+ ): void {
506
+ let i = skipJsonSpace(text, open + 1);
507
+ const close = object ? 125 : 93;
508
+ while (i < text.length && text.codePointAt(i) !== close) {
509
+ let key: string | null = null;
510
+ if (object) {
511
+ const end = closingQuote(text, i + 1);
512
+ key = JSON.parse(text.slice(i, end + 1)) as string;
513
+ // past the colon
514
+ i = skipJsonSpace(text, skipJsonSpace(text, end + 1) + 1);
515
+ }
516
+ visit(key, i);
517
+ i = skipJsonSpace(text, skipJsonValue(text, i));
518
+ if (text.codePointAt(i) === 44) {
519
+ i = skipJsonSpace(text, i + 1);
520
+ }
521
+ }
522
+ }
523
+
524
+ /**
525
+ * The offset after the JSON value that starts at an offset.
526
+ * @param text - the text
527
+ * @param at - the value's first character
528
+ * @returns the offset after it
529
+ */
530
+ function skipJsonValue(text: string, at: number): number {
531
+ const c = text.codePointAt(at);
532
+ if (c === 34) {
533
+ return closingQuote(text, at + 1) + 1;
534
+ }
535
+ if (c !== 123 && c !== 91) {
536
+ let i = at;
537
+ while (i < text.length && !endsScalar(text.codePointAt(i) ?? 32)) {
538
+ i++;
539
+ }
540
+ return i;
541
+ }
542
+ let depth = 0;
543
+ let i = at;
544
+ while (i < text.length) {
545
+ const d = text.codePointAt(i);
546
+ if (d === 34) {
547
+ i = closingQuote(text, i + 1);
548
+ } else if (d === 123 || d === 91) {
549
+ depth++;
550
+ } else if ((d === 125 || d === 93) && --depth === 0) {
551
+ return i + 1;
552
+ }
553
+ i++;
554
+ }
555
+ return text.length;
556
+ }
557
+
558
+ /**
559
+ * The offset of the first character at or after an offset that is not JSON whitespace.
560
+ * @param text - the text
561
+ * @param from - the offset
562
+ * @returns the offset
563
+ */
564
+ function skipJsonSpace(text: string, from: number): number {
565
+ let i = from;
566
+ while (i < text.length && isSpace(text.codePointAt(i))) {
567
+ i++;
568
+ }
569
+ return i;
570
+ }
571
+
430
572
  /**
431
573
  * Whether the string that ends before an offset is an object key: a colon follows after whitespace.
432
574
  * @param text - the text
@@ -634,7 +776,7 @@ function duplicateKey(text: string): string | null {
634
776
  const start = i;
635
777
  i = stringEnd(text, i + 1);
636
778
  const keys = stack.at(-1) ?? null;
637
- if (keys !== null && text[skipSpace(text, i + 1)] === ":") {
779
+ if (keys !== null && text[skipJsonSpace(text, i + 1)] === ":") {
638
780
  const key = JSON.parse(text.slice(start, i + 1)) as string;
639
781
  if (keys.has(key)) {
640
782
  return key;
@@ -661,20 +803,6 @@ function stringEnd(text: string, from: number): number {
661
803
  return i;
662
804
  }
663
805
 
664
- /**
665
- * The index of the first character at or after `from` that is not JSON whitespace.
666
- * @param text - the text
667
- * @param from - the first index
668
- * @returns the index (text.length at the end)
669
- */
670
- function skipSpace(text: string, from: number): number {
671
- let i = from;
672
- while (i < text.length && isSpace(text.codePointAt(i))) {
673
- i++;
674
- }
675
- return i;
676
- }
677
-
678
806
  /** A key followed by its colon, for the cheap duplicate-key check. */
679
807
  const KEY_COLON = /"\s*:/g;
680
808
 
@@ -857,6 +985,11 @@ class ChunkCursor {
857
985
  /** The line number of buf's first character. */
858
986
  private linesBefore = 1;
859
987
 
988
+ /** The last position line() counted to in buf, and the line breaks before it: line() counts on from there. */
989
+ private countedTo = 0;
990
+
991
+ private countedLines = 0;
992
+
860
993
  private parts: string[] | null = null;
861
994
 
862
995
  private captureStart = 0;
@@ -882,6 +1015,8 @@ class ChunkCursor {
882
1015
  this.captureStart = 0;
883
1016
  }
884
1017
  this.linesBefore += countNewlines(this.buf, 0, this.buf.length);
1018
+ this.countedTo = 0;
1019
+ this.countedLines = 0;
885
1020
  const endsWithCr = this.buf.endsWith("\r");
886
1021
  for (;;) {
887
1022
  const next = await this.iterator.next();
@@ -907,7 +1042,15 @@ class ChunkCursor {
907
1042
  * @returns the line
908
1043
  */
909
1044
  line(): number {
910
- return this.linesBefore + countNewlines(this.buf, 0, Math.min(this.pos, this.buf.length));
1045
+ // counted on from the last call, so reading every element of a one-chunk document stays linear
1046
+ const to = Math.min(this.pos, this.buf.length);
1047
+ if (to < this.countedTo) {
1048
+ this.countedTo = 0;
1049
+ this.countedLines = 0;
1050
+ }
1051
+ this.countedLines += countNewlines(this.buf, this.countedTo, to);
1052
+ this.countedTo = to;
1053
+ return this.linesBefore + this.countedLines;
911
1054
  }
912
1055
 
913
1056
  /**
@@ -1062,18 +1205,13 @@ class ChunkCursor {
1062
1205
  * @returns the count
1063
1206
  */
1064
1207
  function countNewlines(text: string, from: number, to: number): number {
1208
+ // one pass over the slice only: an indexOf() past `to` made each call cost the whole rest of the text
1065
1209
  let count = 0;
1066
- let i = text.indexOf("\n", from);
1067
- while (i >= 0 && i < to) {
1068
- count++;
1069
- i = text.indexOf("\n", i + 1);
1070
- }
1071
- i = text.indexOf("\r", from);
1072
- while (i >= 0 && i < to) {
1073
- if (text[i + 1] !== "\n") {
1210
+ for (let i = from; i < to; i++) {
1211
+ const c = text.codePointAt(i);
1212
+ if (c === 10 || (c === 13 && text.codePointAt(i + 1) !== 10)) {
1074
1213
  count++;
1075
1214
  }
1076
- i = text.indexOf("\r", i + 1);
1077
1215
  }
1078
1216
  return count;
1079
1217
  }
@@ -1622,9 +1760,9 @@ export function inexactLiteral(text: string, key: string, keyDepth = 1): boolean
1622
1760
  const start = i;
1623
1761
  i = stringEnd(text, i + 1);
1624
1762
  // the key itself (a string at depth 1 followed by a colon), not a value spelled like it
1625
- const colon = skipSpace(text, i + 1);
1763
+ const colon = skipJsonSpace(text, i + 1);
1626
1764
  if (depth === keyDepth && text.startsWith(quoted, start) && text[colon] === ":") {
1627
- return inexactNumberAt(text, skipSpace(text, colon + 1));
1765
+ return inexactNumberAt(text, skipJsonSpace(text, colon + 1));
1628
1766
  }
1629
1767
  }
1630
1768
  i++;
@@ -1708,16 +1846,9 @@ export function headText(head: Uint8Array): string {
1708
1846
  return new TextDecoder(encoding).decode(head).replace(/^\uFEFF/, "");
1709
1847
  }
1710
1848
 
1711
- /**
1712
- * Cytoscape's screen y (growing downward) as graph-io's y (growing upward), and back: a negation
1713
- * that never yields -0.
1714
- * @param y - the coordinate
1715
- * @returns the flipped coordinate
1716
- * @category Plugin helpers
1717
- */
1718
- export function flipY(y: number): number {
1719
- return y === 0 ? 0 : -y;
1720
- }
1849
+ // Cytoscape's screen y (growing downward) as graph-io's y (growing upward), and back: the one
1850
+ // shared flip lives with the other position conversions.
1851
+ export { flipY } from "../positions/convert.js";
1721
1852
 
1722
1853
  // ============================================================ stream structure shared by CX1 and CX2
1723
1854
 
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The note collector file positions use (and file styles, after their rebase): one note per code
3
+ * (and optional property), never one per element, with at most 8 distinct samples of 80
4
+ * characters, a total count and the element indexes the note covers.
5
+ */
6
+
7
+ /** At most this many samples per note. */
8
+ const MAX_SAMPLES = 8;
9
+ /** A sample is cut to this many characters. */
10
+ const MAX_SAMPLE_LENGTH = 80;
11
+
12
+ /** One occurrence (or `count` occurrences) of a condition. */
13
+ interface NoteReport {
14
+ /** An example of the offending value. */
15
+ readonly sample?: unknown;
16
+ /** The element the report is about, by index. */
17
+ readonly element?: number;
18
+ /** How many occurrences the report stands for; defaults to 1. */
19
+ readonly count?: number;
20
+ }
21
+
22
+ /** A collected note, before a module shapes it into its own note type. */
23
+ interface CollectedNote<C extends string> {
24
+ readonly code: C;
25
+ readonly property: string | null;
26
+ readonly count: number;
27
+ readonly samples: readonly string[];
28
+ readonly elements: readonly number[] | { readonly count: number };
29
+ }
30
+
31
+ interface Collecting<C extends string> {
32
+ readonly code: C;
33
+ readonly property: string | null;
34
+ count: number;
35
+ readonly samples: string[];
36
+ readonly elements: Set<number>;
37
+ unindexed: boolean;
38
+ }
39
+
40
+ /** Collects notes, aggregated per (code, property), in the order their conditions first occur. */
41
+ export class NoteCollector<C extends string> {
42
+ readonly #notes = new Map<string, Collecting<C>>();
43
+
44
+ /**
45
+ * Record a condition.
46
+ * @param code - the condition
47
+ * @param report - a sample, the element index and a count
48
+ * @param property - what the note is about, or null
49
+ */
50
+ add(code: C, report: NoteReport = {}, property: string | null = null): void {
51
+ const key = `${code}\u0000${property ?? ""}`;
52
+ let note = this.#notes.get(key);
53
+ if (note === undefined) {
54
+ note = { code, property, count: 0, samples: [], elements: new Set(), unindexed: false };
55
+ this.#notes.set(key, note);
56
+ }
57
+ note.count += report.count ?? 1;
58
+ if (report.element === undefined) {
59
+ note.unindexed = true;
60
+ } else {
61
+ note.elements.add(report.element);
62
+ }
63
+ if (report.sample !== undefined && note.samples.length < MAX_SAMPLES) {
64
+ const sample = sampleText(report.sample);
65
+ if (!note.samples.includes(sample)) {
66
+ note.samples.push(sample);
67
+ }
68
+ }
69
+ }
70
+
71
+ /**
72
+ * The collected notes.
73
+ * @returns one note per (code, property)
74
+ */
75
+ list(): CollectedNote<C>[] {
76
+ return Array.from(this.#notes.values(), (n) => ({
77
+ code: n.code,
78
+ property: n.property,
79
+ count: n.count,
80
+ samples: [...n.samples],
81
+ elements: n.unindexed ? { count: n.count } : Array.from(n.elements).sort((a, b) => a - b),
82
+ }));
83
+ }
84
+ }
85
+
86
+ /**
87
+ * A sample as at most 80 characters of text.
88
+ * @param value - the sample
89
+ * @returns the text
90
+ */
91
+ function sampleText(value: unknown): string {
92
+ const text = typeof value === "string" ? value : (JSON.stringify(value) ?? String(value));
93
+ return text.length > MAX_SAMPLE_LENGTH ? `${text.slice(0, MAX_SAMPLE_LENGTH - 3)}...` : text;
94
+ }
@@ -23,6 +23,23 @@ import { agree, plural } from "./plural.js";
23
23
  */
24
24
  export const MAX_WARNINGS_PER_CODE = 1000;
25
25
 
26
+ /** What each finished report's import kept for its styles: per report object, so imports running at once never mix. */
27
+ const KEPT_FOR_STYLES = new WeakMap<ImportReport, unknown>();
28
+
29
+ /** The value of a builder that kept nothing. */
30
+ const NOTHING_KEPT: unique symbol = Symbol("nothing kept");
31
+
32
+ /**
33
+ * What the import that produced a report passed to `ImportReportBuilder.keepForStyles()`, or undefined when it kept
34
+ * nothing. graph-io passes it to the same importer's `styles()` as `context.kept`.
35
+ * @param report - a report an importer's `import()` returned
36
+ * @returns the kept value
37
+ * @category Writing a format
38
+ */
39
+ export function keptForStyles(report: ImportReport): unknown {
40
+ return KEPT_FOR_STYLES.get(report);
41
+ }
42
+
26
43
  /**
27
44
  * Where an issue was found: the 1-based line and the element (id or attribute name) when known.
28
45
  * @public
@@ -119,6 +136,8 @@ export class ImportReportBuilder {
119
136
 
120
137
  private truncatedFlag = false;
121
138
 
139
+ private kept: unknown = NOTHING_KEPT;
140
+
122
141
  private readonly startedAt: number;
123
142
 
124
143
  /**
@@ -277,6 +296,19 @@ export class ImportReportBuilder {
277
296
  throw err;
278
297
  }
279
298
 
299
+ /**
300
+ * Keep style data that is not per element (a stylesheet, a groups object, a legend, the file's default styles)
301
+ * for this import's `styles()`: graph-io passes it back as `context.kept` when styles are requested. Kept per
302
+ * report, never on the importer object, so imports running at once each get their own. A later call replaces
303
+ * the value.
304
+ * @param value - anything the importer's `styles()` needs
305
+ * @returns this builder
306
+ */
307
+ keepForStyles(value: unknown): this {
308
+ this.kept = value;
309
+ return this;
310
+ }
311
+
280
312
  /**
281
313
  * A builder that starts from everything this one recorded so far: issues, counts, loss notes,
282
314
  * the warnOnce keys, the error and warning counts and the truncation flag. For an importer that
@@ -297,6 +329,7 @@ export class ImportReportBuilder {
297
329
  copy.errors = this.errors;
298
330
  copy.warnings = this.warnings;
299
331
  copy.truncatedFlag = this.truncatedFlag;
332
+ copy.kept = this.kept;
300
333
  return copy;
301
334
  }
302
335
 
@@ -378,6 +411,9 @@ export class ImportReportBuilder {
378
411
  this.counts.expandedMixed += counts.expandedMixed;
379
412
  this.lossList.push(...report.lossy);
380
413
  this.truncatedFlag ||= report.truncated;
414
+ if (this.kept === NOTHING_KEPT && KEPT_FOR_STYLES.has(report)) {
415
+ this.kept = KEPT_FOR_STYLES.get(report);
416
+ }
381
417
  return this;
382
418
  }
383
419
 
@@ -403,7 +439,7 @@ export class ImportReportBuilder {
403
439
  );
404
440
  }
405
441
  }
406
- return Object.freeze({
442
+ const report: ImportReport = Object.freeze({
407
443
  format: this.format,
408
444
  counts: Object.freeze({ nodes, edges, skippedNodes, skippedEdges, expandedMixed }),
409
445
  issues: Object.freeze([...this.issueList, ...suppressed]),
@@ -413,6 +449,10 @@ export class ImportReportBuilder {
413
449
  lossy: Object.freeze([...this.lossList]),
414
450
  durationMs: now() - this.startedAt,
415
451
  });
452
+ if (this.kept !== NOTHING_KEPT) {
453
+ KEPT_FOR_STYLES.set(report, this.kept);
454
+ }
455
+ return report;
416
456
  }
417
457
  }
418
458
 
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The length units and tool names that file positions (and, after their rebase, file styles)
3
+ * share. Loads in Node and imports nothing.
4
+ */
5
+
6
+ /**
7
+ * The unit a file's lengths are in. "px": screen pixels or typographic points (1 pt counts as
8
+ * 1 px). "file": the file's own unit, with no known screen size (Pajek's unit square, NetworkX
9
+ * coordinates, Graphviz input inches).
10
+ * @category Positions
11
+ */
12
+ export type LengthUnit = "px" | "file";
13
+
14
+ /**
15
+ * The tool that wrote a file, when the file says. An open union: a tool graph-io does not know is
16
+ * kept as its lowercase name.
17
+ * @category Positions
18
+ */
19
+ export type GraphTool = "yed" | "cytoscape" | "gephi" | "graphviz" | "pajek" | "networkx" | "tulip" | (string & {}); // NOSONAR(S4335): the open union keeps the known names in editor completion
20
+
21
+ /** Creator texts that name a known tool, first match wins. */
22
+ const TOOLS: readonly (readonly [RegExp, GraphTool])[] = [
23
+ [/yfiles|yed/i, "yed"],
24
+ [/cytoscape/i, "cytoscape"],
25
+ [/gephi/i, "gephi"],
26
+ [/graphviz/i, "graphviz"],
27
+ [/pajek/i, "pajek"],
28
+ [/networkx/i, "networkx"],
29
+ [/tulip/i, "tulip"],
30
+ ];
31
+
32
+ /**
33
+ * The tool a file's creator text names ("yFiles", "Gephi 0.7", "NetworkX 3.1"), or null.
34
+ * @param creator - the creator text (`snapshot.meta.creator`)
35
+ * @returns the tool, or null when the text names none graph-io knows
36
+ */
37
+ export function toolOf(creator: string | null | undefined): GraphTool | null {
38
+ if (creator === null || creator === undefined) {
39
+ return null;
40
+ }
41
+ return TOOLS.find(([pattern]) => pattern.test(creator))?.[1] ?? null;
42
+ }
package/src/common/xml.ts CHANGED
@@ -90,6 +90,29 @@ export class XmlSyntaxError extends Error {
90
90
  }
91
91
  }
92
92
 
93
+ /**
94
+ * The most elements open at once that the XML tokenizer reads; a deeper document stops with an `XmlNestingError`.
95
+ * @category Plugin helpers
96
+ */
97
+ export const MAX_XML_DEPTH = 100_000;
98
+
99
+ /**
100
+ * Elements are nested deeper than `MAX_XML_DEPTH`: an importer reports it as E_XML_NESTING rather than as a syntax
101
+ * error.
102
+ * @category Plugin helpers
103
+ */
104
+ export class XmlNestingError extends XmlSyntaxError {
105
+ /**
106
+ * Create the error.
107
+ * @param name - the element that opened one level too many
108
+ * @param line - the 1-based line
109
+ */
110
+ constructor(name: string, line: number) {
111
+ super(`<${name}> is nested more than ${String(MAX_XML_DEPTH)} elements deep`, line);
112
+ this.name = "XmlNestingError";
113
+ }
114
+ }
115
+
93
116
  /**
94
117
  * The input holds no markup at all (empty, whitespace only, a byte order mark only): an importer
95
118
  * reports it as E_EMPTY_INPUT rather than as a syntax error.
@@ -350,17 +373,31 @@ export function isXmlName(text: string): boolean {
350
373
  if (text.length === 0) {
351
374
  return false;
352
375
  }
353
- let first = true;
354
- for (const ch of text) {
355
- const cp = ch.codePointAt(0);
356
- if (cp === undefined || (first ? !isNameStart(cp) : !isNameChar(cp))) {
376
+ // by index, with the ASCII tables for the common case as readName() does: a string iterator and the code point
377
+ // classes per character cost a second in a 5,000-node GraphML file, which checks every end tag
378
+ for (let i = 0; i < text.length;) {
379
+ const cp = text.codePointAt(i) ?? 0;
380
+ if (!isNameCodePoint(cp, i === 0)) {
357
381
  return false;
358
382
  }
359
- first = false;
383
+ i += cp > 0xffff ? 2 : 1;
360
384
  }
361
385
  return true;
362
386
  }
363
387
 
388
+ /**
389
+ * Whether a code point may stand in an XML Name, at its start or after it.
390
+ * @param cp - the code point
391
+ * @param first - whether it starts the name
392
+ * @returns true for a NameStartChar (first) or a NameChar
393
+ */
394
+ function isNameCodePoint(cp: number, first: boolean): boolean {
395
+ if (cp < 0x80) {
396
+ return (first ? ASCII_NAME_START[cp] : ASCII_NAME_CHAR[cp]) === 1;
397
+ }
398
+ return first ? isNameStart(cp) : isNameChar(cp);
399
+ }
400
+
364
401
  /**
365
402
  * Whether a code point is a legal XML 1.0 character.
366
403
  * @param cp - the code point
@@ -1517,6 +1554,9 @@ export class XmlTokenizer {
1517
1554
  }
1518
1555
  }
1519
1556
  }
1557
+ if (this.stack.length >= MAX_XML_DEPTH) {
1558
+ throw new XmlNestingError(name, this.line);
1559
+ }
1520
1560
  this.stack.push(name);
1521
1561
  this.handler.start(name, attrs, this.line, this.namespaceOf(name));
1522
1562
  }