@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
@@ -12,7 +12,7 @@ import { declareResolved, DictHeuristic, uniqueColumnName } from "../../common/a
12
12
  import { type ImportReportBuilder, type IssueLocation } from "../../common/report.js";
13
13
  import { inferTextDtype, parseTextCell } from "../../common/text.js";
14
14
  import { CYTOSCAPE_ORIGIN_NAMESPACE, FORMAT, XGMML_ISSUE } from "./constants.js";
15
- import { type AttRec, isListLike } from "./document.js";
15
+ import { type AttRec, attTree } from "./document.js";
16
16
  import { attType, elementKind, parseScalar, type ScalarKind, widenScalar } from "./values.js";
17
17
 
18
18
  /** A table of the snapshot. */
@@ -153,6 +153,14 @@ export class ColumnSet {
153
153
  if (cell !== null) {
154
154
  plan.declared.add("string");
155
155
  }
156
+ } else if ((type.kind === "list" || type.kind === "map") && deeperThan(att, MAX_JSON_ATT_DEPTH)) {
157
+ // a json value that deep cannot be written as JSON text (or read back) without overflowing the stack
158
+ this.badAtt(
159
+ `"${name}" is nested more than ${String(MAX_JSON_ATT_DEPTH)} atts deep; it is skipped`,
160
+ att,
161
+ "depth",
162
+ );
163
+ cell = null;
156
164
  } else if (type.kind === "list") {
157
165
  cell = this.listCell(att, name, plan, at);
158
166
  plan.declared.add("list");
@@ -698,19 +706,41 @@ function recordOf(att: AttRec): Record<string, unknown> {
698
706
  return out;
699
707
  }
700
708
 
709
+ /** The deepest list or map att kept, as a json value. */
710
+ const MAX_JSON_ATT_DEPTH = 64;
711
+
712
+ /**
713
+ * Whether an att tree is deeper than a limit, walked with an explicit stack.
714
+ * @param root - the att
715
+ * @param limit - the most levels allowed
716
+ * @returns true when deeper
717
+ */
718
+ function deeperThan(root: AttRec, limit: number): boolean {
719
+ const stack: [AttRec, number][] = [[root, 1]];
720
+ for (let top = stack.pop(); top !== undefined; top = stack.pop()) {
721
+ const [att, depth] = top;
722
+ if (depth > limit) {
723
+ return true;
724
+ }
725
+ for (const child of att.children) {
726
+ stack.push([child, depth + 1]);
727
+ }
728
+ }
729
+ return false;
730
+ }
731
+
701
732
  /**
702
- * An att as a json value: its value text, its children as an array or a record, or its XML.
733
+ * An att as a json value: its XML, its value text, or its children as an array or a record.
703
734
  * @param att - the att
704
735
  * @returns the value
705
736
  */
706
737
  function jsonOfAtt(att: AttRec): unknown {
707
- if (att.xml !== null) {
708
- return att.xml;
709
- }
710
- if (att.children.length === 0) {
711
- return att.value;
712
- }
713
- return isListLike(att) ? att.children.map(jsonOfAtt) : recordOf(att);
738
+ return attTree(att, (a) => {
739
+ if (a.xml !== null) {
740
+ return { value: a.xml };
741
+ }
742
+ return a.children.length === 0 ? { value: a.value } : null;
743
+ });
714
744
  }
715
745
 
716
746
  /**
@@ -50,6 +50,7 @@ import {
50
50
  WEIGHT_KEY_CLASH_CODE,
51
51
  WIDENED_CODE,
52
52
  XML_ILLEGAL_CHAR_CODE,
53
+ XML_NESTING_CODE,
53
54
  XML_SYNTAX_CODE,
54
55
  } from "../../common/codes.js";
55
56
 
@@ -190,6 +191,8 @@ export const XGMML_ISSUE = Object.freeze({
190
191
  ...ELEMENT_ISSUE,
191
192
  /** The input is not well-formed XML. The import stops. */
192
193
  XML_SYNTAX: XML_SYNTAX_CODE,
194
+ /** Elements are nested more than 100,000 deep. The import stops. */
195
+ XML_NESTING: XML_NESTING_CODE,
193
196
  /** The input is empty or whitespace only. The import stops. */
194
197
  EMPTY_INPUT: EMPTY_INPUT_CODE,
195
198
  /** The input is not valid UTF-8. The import stops. */
@@ -1046,7 +1046,19 @@ export class XgmmlParser implements XmlHandler {
1046
1046
  if (target.graphics !== null && att.name in target.graphics) {
1047
1047
  this.duplicateGraphics(att.name, att.line);
1048
1048
  }
1049
- target.graphics = { ...target.graphics, [att.name]: attJson(att) };
1049
+ // in place: beginGraphics() gave the target its own record, and a copy per att cost the square of a node's
1050
+ // att count. An att named __proto__ is defined, not assigned, so it stays an own property
1051
+ const graphics = (target.graphics ??= {});
1052
+ if (att.name === "__proto__") {
1053
+ Object.defineProperty(graphics, att.name, {
1054
+ value: attJson(att),
1055
+ writable: true,
1056
+ enumerable: true,
1057
+ configurable: true,
1058
+ });
1059
+ } else {
1060
+ graphics[att.name] = attJson(att);
1061
+ }
1050
1062
  }
1051
1063
 
1052
1064
  /**
@@ -1072,7 +1084,7 @@ export class XgmmlParser implements XmlHandler {
1072
1084
  * @returns true for a list
1073
1085
  * @category Plugin helpers
1074
1086
  */
1075
- export function isListLike(att: AttRec): boolean {
1087
+ function isListLike(att: AttRec): boolean {
1076
1088
  const names = new Set(att.children.map((c) => c.name));
1077
1089
  if (names.size !== 1) {
1078
1090
  return false;
@@ -1090,18 +1102,48 @@ export function isListLike(att: AttRec): boolean {
1090
1102
  * @category Plugin helpers
1091
1103
  */
1092
1104
  export function attJson(att: AttRec): unknown {
1093
- if (att.children.length === 0) {
1094
- if (att.value !== null) {
1095
- return att.value;
1105
+ return attTree(att, (a) => {
1106
+ if (a.children.length > 0) {
1107
+ return null;
1096
1108
  }
1097
- return Object.keys(att.extra).length > 0 ? { ...att.extra } : null;
1098
- }
1099
- if (isListLike(att)) {
1100
- return att.children.map(attJson);
1109
+ if (a.value !== null) {
1110
+ return { value: a.value };
1111
+ }
1112
+ return { value: Object.keys(a.extra).length > 0 ? { ...a.extra } : null };
1113
+ });
1114
+ }
1115
+
1116
+ /**
1117
+ * An att tree as plain data, walked with an explicit stack so an att nested any depth deep cannot overflow the
1118
+ * call stack: an att `leafOf` gives a value for is that value; any other is an array of its children when they are
1119
+ * list items (isListLike), else a record of them by name.
1120
+ * @param root - the att
1121
+ * @param leafOf - the value of an att that is a leaf, or null for one whose children make its value
1122
+ * @returns the value
1123
+ * @category Plugin helpers
1124
+ */
1125
+ export function attTree(root: AttRec, leafOf: (att: AttRec) => { readonly value: unknown } | null): unknown {
1126
+ const rootLeaf = leafOf(root);
1127
+ if (rootLeaf !== null) {
1128
+ return rootLeaf.value;
1101
1129
  }
1102
- const out: Record<string, unknown> = {};
1103
- for (const child of att.children) {
1104
- out[child.name ?? ""] = attJson(child);
1130
+ const container = (att: AttRec): unknown[] | Record<string, unknown> => (isListLike(att) ? [] : {});
1131
+ const out = container(root);
1132
+ const stack: [AttRec, unknown[] | Record<string, unknown>][] = [[root, out]];
1133
+ for (let top = stack.pop(); top !== undefined; top = stack.pop()) {
1134
+ const [att, into] = top;
1135
+ for (const child of att.children) {
1136
+ const leaf = leafOf(child);
1137
+ const value = leaf === null ? container(child) : leaf.value;
1138
+ if (Array.isArray(into)) {
1139
+ into.push(value);
1140
+ } else {
1141
+ into[child.name ?? ""] = value;
1142
+ }
1143
+ if (leaf === null) {
1144
+ stack.push([child, value as unknown[] | Record<string, unknown>]);
1145
+ }
1146
+ }
1105
1147
  }
1106
1148
  return out;
1107
1149
  }
@@ -15,6 +15,7 @@ import { type ResolvedImportOptions } from "../../common/options.js";
15
15
  import { agree, plural } from "../../common/plural.js";
16
16
  import { type ImportReportBuilder, type IssueLocation } from "../../common/report.js";
17
17
  import { parseWeightText } from "../../common/weights.js";
18
+ import { flipY } from "../../positions/convert.js";
18
19
  import { ColumnSet } from "./columns.js";
19
20
  import {
20
21
  CYTOSCAPE_ORIGIN_NAMESPACE,
@@ -1419,10 +1420,15 @@ class JsonColumn {
1419
1420
  return;
1420
1421
  }
1421
1422
  const sink = this.emitter.target;
1422
- if (this.domain === "node") {
1423
- sink.setNodeValue(this.handle, index, value);
1424
- } else {
1425
- sink.setEdgeValue(this.handle, index, value);
1423
+ try {
1424
+ if (this.domain === "node") {
1425
+ sink.setNodeValue(this.handle, index, value);
1426
+ } else {
1427
+ sink.setEdgeValue(this.handle, index, value);
1428
+ }
1429
+ } catch (err) {
1430
+ // a value the sink refuses (graphics nested deeper than a json cell holds) leaves the cell unset
1431
+ this.emitter.issues.recordError(err, { element: this.name });
1426
1432
  }
1427
1433
  }
1428
1434
  }
@@ -1468,8 +1474,7 @@ class Positions {
1468
1474
  }
1469
1475
  }
1470
1476
  if (x !== null && y !== null) {
1471
- const flipped = y === 0 ? 0 : -y;
1472
- this.values.set(row.index, [x, flipped, this.zAs === "position" ? (z ?? 0) : 0]);
1477
+ this.values.set(row.index, [x, flipY(y), this.zAs === "position" ? (z ?? 0) : 0]);
1473
1478
  }
1474
1479
  }
1475
1480
 
@@ -8,7 +8,9 @@
8
8
  * and nested atts, containment as each group node's nested graph of `xlink:href` member
9
9
  * references (every node is declared at the top level, so the node order survives), and newline
10
10
  * and tab as character references unless `cytoscapeEscapes` asks for Cytoscape's two-character
11
- * form. It writes the graph's structure and columns, never styles.
11
+ * form. It writes the graph's structure and columns; given styles (`exportGraph(..., { styles })`), every element's
12
+ * `<graphics>` holds what graphty draws as Cytoscape visual properties, and the `graphty.styles` block and the
13
+ * style values its rules read go into graph and element `<att>`s.
12
14
  */
13
15
 
14
16
  import { type Column, GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
@@ -24,6 +26,7 @@ import { agree, plural } from "../../common/plural.js";
24
26
  import { type ExplicitWeights, explicitWeights } from "../../common/weights.js";
25
27
  import { encodeChunks, joinText } from "../../common/writer.js";
26
28
  import { xmlIllegalTextNotes } from "../../common/xml.js";
29
+ import type { ExporterStyleInput, ExporterStyleOptions } from "../../styles/io/writer.js";
27
30
  import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
28
31
  import {
29
32
  CY_NAMESPACE,
@@ -48,6 +51,10 @@ import {
48
51
  Z_COLUMN,
49
52
  } from "./constants.js";
50
53
  import { aliasesOf } from "./emit.js";
54
+ import { styledGraphGraphics, styledGraphics, styledGraphicsNotes, XGMML_STYLE_CAPABILITIES } from "./styles.js";
55
+
56
+ /** What the writer takes: the format's options, the common ones and the styles. */
57
+ type XgmmlWriteOptions = XgmmlExportOptions & CommonExportOptions & ExporterStyleOptions;
51
58
 
52
59
  /** The two escapes Cytoscape reads back as a newline and a tab, as a message writes them. */
53
60
  const LITERAL_ESCAPES = String.raw`\n or \t`;
@@ -1089,6 +1096,7 @@ function* groupAttOf(
1089
1096
  * @param plan - the plan
1090
1097
  * @param node - the node
1091
1098
  * @param indent - the indentation
1099
+ * @param styles - the styles being written, or undefined
1092
1100
  * @yields the node element
1093
1101
  * @returns nothing
1094
1102
  */
@@ -1097,6 +1105,7 @@ function* nodeOf(
1097
1105
  plan: Plan,
1098
1106
  node: number,
1099
1107
  indent: string,
1108
+ styles: ExporterStyleInput | undefined,
1100
1109
  ): Generator<string, void, undefined> {
1101
1110
  const labelCol = slot(plan.nodes, "label");
1102
1111
  const label = cellOf(labelCol, node);
@@ -1115,7 +1124,8 @@ function* nodeOf(
1115
1124
  } else if (typeof pointer === "string") {
1116
1125
  yield `${inner}<att>\n${inner} <graph xlink:href="${escapeXmlAttribute(pointer)}"/>\n${inner}</att>\n`;
1117
1126
  }
1118
- const graphics = cellOf(slot(plan.nodes, "graphics"), node) as Record<string, unknown> | null;
1127
+ const kept = cellOf(slot(plan.nodes, "graphics"), node) as Record<string, unknown> | null;
1128
+ const graphics = styles === undefined ? kept : styledGraphics("node", styles, node, kept);
1119
1129
  yield* graphicsOf(graphics, coordsOf(plan, slot(plan.nodes, "z"), node), inner);
1120
1130
  yield `${indent}</node>\n`;
1121
1131
  }
@@ -1128,11 +1138,9 @@ function* nodeOf(
1128
1138
  * @yields the XML text
1129
1139
  * @returns nothing
1130
1140
  */
1131
- function* write(
1132
- snapshot: GraphSnapshot,
1133
- options: (XgmmlExportOptions & CommonExportOptions) | undefined,
1134
- ): Generator<string, void, undefined> {
1141
+ function* write(snapshot: GraphSnapshot, options: XgmmlWriteOptions | undefined): Generator<string, void, undefined> {
1135
1142
  const plan = planFor(snapshot, options);
1143
+ const styles = options?.styles;
1136
1144
  const meta = snapshot.meta.extra[META_KEY] as { graphId?: unknown; directed?: unknown } | undefined;
1137
1145
  const graphId = typeof meta?.graphId === "string" ? ` id="${escapeXmlAttribute(meta.graphId)}"` : "";
1138
1146
  // Every edge carries cy:directed, so when they all agree the root attribute does not decide
@@ -1150,12 +1158,13 @@ function* write(
1150
1158
  yield `<graph${graphId}${name} directed="${directed}" cy:documentVersion="3.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="${XLINK_NAMESPACE}" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cy="${CY_NAMESPACE}" xmlns="${XGMML_NAMESPACE}">\n`;
1151
1159
  yield* metadataOf(snapshot);
1152
1160
  yield* attsOf(plan.graph, 0, true, plan, " ");
1153
- yield* graphicsOf(cellOf(slot(plan.graph, "graphics"), 0) as Record<string, unknown> | null, [], " ");
1161
+ const graphGraphics = cellOf(slot(plan.graph, "graphics"), 0) as Record<string, unknown> | null;
1162
+ yield* graphicsOf(styles === undefined ? graphGraphics : styledGraphGraphics(styles, graphGraphics), [], " ");
1154
1163
  for (let u = 0; u < snapshot.nodeCount; u++) {
1155
- yield* nodeOf(snapshot, plan, u, " ");
1164
+ yield* nodeOf(snapshot, plan, u, " ", styles);
1156
1165
  }
1157
1166
  yield* networksOf(snapshot, plan);
1158
- yield* edgesOf(snapshot, plan);
1167
+ yield* edgesOf(snapshot, plan, styles);
1159
1168
  yield "</graph>\n";
1160
1169
  }
1161
1170
 
@@ -1216,10 +1225,15 @@ function* networksOf(snapshot: GraphSnapshot, plan: Plan): Generator<string, voi
1216
1225
  * The edges: one per logical edge, expanded pairs folded.
1217
1226
  * @param snapshot - the snapshot
1218
1227
  * @param plan - the plan
1228
+ * @param styles - the styles being written, or undefined
1219
1229
  * @yields the edge elements
1220
1230
  * @returns nothing
1221
1231
  */
1222
- function* edgesOf(snapshot: GraphSnapshot, plan: Plan): Generator<string, void, undefined> {
1232
+ function* edgesOf(
1233
+ snapshot: GraphSnapshot,
1234
+ plan: Plan,
1235
+ styles: ExporterStyleInput | undefined,
1236
+ ): Generator<string, void, undefined> {
1223
1237
  const { folding, weights } = plan;
1224
1238
  const labelCol = slot(plan.edges, "label");
1225
1239
  const graphicsCol = slot(plan.edges, "graphics");
@@ -1241,7 +1255,8 @@ function* edgesOf(snapshot: GraphSnapshot, plan: Plan): Generator<string, void,
1241
1255
  const target = escapeXmlAttribute(idText(snapshot.ids.idOf(v)));
1242
1256
  yield ` <edge${idAttr}${labelAttr} source="${source}" target="${target}" cy:directed="${directed ? "1" : "0"}"${optionalAttribute("weight", weight)}${xmlAttributesOf(plan.edges, e)}>\n`;
1243
1257
  yield* attsOf(plan.edges, e, first, plan, " ");
1244
- yield* graphicsOf(cellOf(graphicsCol, e) as Record<string, unknown> | null, [], " ");
1258
+ const kept = cellOf(graphicsCol, e) as Record<string, unknown> | null;
1259
+ yield* graphicsOf(styles === undefined ? kept : styledGraphics("edge", styles, e, kept), [], " ");
1245
1260
  yield " </edge>\n";
1246
1261
  first = false;
1247
1262
  }
@@ -1286,8 +1301,12 @@ export const xgmmlExporter: GraphExporter<XgmmlExportOptions> = Object.freeze({
1286
1301
  format: FORMAT,
1287
1302
  options: Object.freeze(["cytoscapeEscapes"]),
1288
1303
  capabilities: CAPABILITIES,
1289
- check: (snapshot: GraphSnapshot, options?: XgmmlExportOptions & CommonExportOptions): readonly LossNote[] =>
1290
- Object.freeze(planExport(snapshot, resolveExportOptions(options), resolveEscapes(options)).notes),
1304
+ styles: Object.freeze({ capabilities: XGMML_STYLE_CAPABILITIES }),
1305
+ check: (snapshot: GraphSnapshot, options?: XgmmlWriteOptions): readonly LossNote[] =>
1306
+ Object.freeze([
1307
+ ...planExport(snapshot, resolveExportOptions(options), resolveEscapes(options)).notes,
1308
+ ...(options?.styles === undefined ? [] : styledGraphicsNotes(options.styles, snapshot)),
1309
+ ]),
1291
1310
  export: (snapshot: GraphSnapshot, options?: XgmmlExportOptions & CommonExportOptions): AsyncIterable<Uint8Array> =>
1292
1311
  encodeChunks(write(snapshot, options)),
1293
1312
  exportToString: (snapshot: GraphSnapshot, options?: XgmmlExportOptions & CommonExportOptions): Promise<string> =>
@@ -9,7 +9,8 @@
9
9
  * `defaultDirected` option), then `cy:directed` per edge, overruling Cytoscape, which ignores the
10
10
  * root attribute. Ids are kept as written (`ids: "keep"`), so `"1"`, `"01"` and `" 1 "` stay three
11
11
  * nodes. Positions are stored y-up (Cytoscape writes screen coordinates). Graphics values are kept
12
- * as a json column, never interpreted (style import is issue #706).
12
+ * as a json column; asked for styles, the importer reads them as Cytoscape's resolved visual properties
13
+ * (styles.ts), with Cytoscape desktop's default style for what an element leaves unset.
13
14
  */
14
15
 
15
16
  import { GraphFormatError, type GraphSink } from "@graphty/graph-format";
@@ -26,7 +27,14 @@ import {
26
27
  } from "../../common/options.js";
27
28
  import { agree, elementCount } from "../../common/plural.js";
28
29
  import { ImportReportBuilder } from "../../common/report.js";
29
- import { isWhitespace, tokenizeXml, xmlDeclaredEncoding, type XmlRepairs, XmlSyntaxError } from "../../common/xml.js";
30
+ import {
31
+ isWhitespace,
32
+ tokenizeXml,
33
+ xmlDeclaredEncoding,
34
+ XmlNestingError,
35
+ type XmlRepairs,
36
+ XmlSyntaxError,
37
+ } from "../../common/xml.js";
30
38
  import {
31
39
  type CommonImportOptions,
32
40
  type GraphChoiceOptions,
@@ -35,7 +43,7 @@ import {
35
43
  type ImportInput,
36
44
  type ImportReport,
37
45
  } from "../../types.js";
38
- import { EXTENSIONS, FORMAT, MIME_TYPES, XGMML_ISSUE } from "./constants.js";
46
+ import { EXTENSIONS, FORMAT, MIME_TYPES, XGMML_ISSUE, XGMML_NAMESPACE } from "./constants.js";
39
47
  import { type GraphRec, type XgmmlDocument, XgmmlParser } from "./document.js";
40
48
  import {
41
49
  type Dialect,
@@ -46,6 +54,7 @@ import {
46
54
  XgmmlEmitter,
47
55
  type XgmmlSettings,
48
56
  } from "./emit.js";
57
+ import { readXgmmlFileStyles } from "./styles.js";
49
58
 
50
59
  /**
51
60
  * The format-specific options of the XGMML importer.
@@ -174,17 +183,18 @@ export async function parseXgmml(
174
183
  common: ResolvedImportOptions,
175
184
  options: XgmmlImportOptions | undefined,
176
185
  ): Promise<XgmmlDocument> {
177
- const repairs = repairsOf(options, report);
178
186
  const parser = new XgmmlParser(report);
179
187
  const seen = { content: false };
180
188
  try {
181
189
  await tokenizeXml(
182
190
  watch(textChunks(input, report, { ...common, declaredEncoding: xmlDeclaredEncoding, xml: true }), seen),
183
191
  parser,
184
- repairs,
192
+ xmlRepairs(report, options),
185
193
  );
186
194
  } catch (err) {
187
- failOnSyntax(err, seen.content, report);
195
+ if (err instanceof XmlSyntaxError) {
196
+ failSyntax(report, err, seen.content);
197
+ }
188
198
  throw err;
189
199
  }
190
200
  const doc = parser.document();
@@ -201,45 +211,46 @@ export async function parseXgmml(
201
211
 
202
212
  /**
203
213
  * The XML repairs the options switch on, each reporting where it repaired.
204
- * @param options - the XGMML options
205
214
  * @param report - the report
215
+ * @param options - the XGMML options
206
216
  * @returns the repairs
207
217
  */
208
- function repairsOf(options: XgmmlImportOptions | undefined, report: ImportReportBuilder): XmlRepairs {
218
+ function xmlRepairs(report: ImportReportBuilder, options: XgmmlImportOptions | undefined): XmlRepairs {
219
+ const ampersand = (line: number): void => {
220
+ report.warning("parse-error", XGMML_ISSUE.AMPERSAND_REPAIRED, "a bare & was read as &amp;", { line });
221
+ };
222
+ const surrogate = (line: number): void => {
223
+ report.warning(
224
+ "parse-error",
225
+ XGMML_ISSUE.SURROGATE_PAIRED,
226
+ "two surrogate character references were joined into one character",
227
+ { line },
228
+ );
229
+ };
209
230
  return {
210
231
  bareAmpersand: booleanOption("repairBareAmpersands", options?.repairBareAmpersands, false)
211
- ? (line): void => {
212
- report.warning("parse-error", XGMML_ISSUE.AMPERSAND_REPAIRED, "a bare & was read as &amp;", { line });
213
- }
232
+ ? ampersand
214
233
  : undefined,
215
234
  surrogatePair: booleanOption("pairSurrogateReferences", options?.pairSurrogateReferences, false)
216
- ? (line): void => {
217
- report.warning(
218
- "parse-error",
219
- XGMML_ISSUE.SURROGATE_PAIRED,
220
- "two surrogate character references were joined into one character",
221
- { line },
222
- );
223
- }
235
+ ? surrogate
224
236
  : undefined,
225
237
  };
226
238
  }
227
239
 
228
240
  /**
229
- * Fail the report on an XML syntax error: an input with no content is empty, any other is
230
- * malformed. Any other error is left to the caller.
231
- * @param err - the error the tokenizer threw
232
- * @param content - whether non-whitespace text was seen
241
+ * Fails the report for an XML syntax error: an empty input, nesting too deep, or broken XML.
233
242
  * @param report - the report
243
+ * @param err - the error
244
+ * @param content - whether the input held anything but white space
245
+ * @returns never: it throws the report's ImportError
234
246
  */
235
- function failOnSyntax(err: unknown, content: boolean, report: ImportReportBuilder): void {
236
- if (!(err instanceof XmlSyntaxError)) {
237
- return;
238
- }
247
+ function failSyntax(report: ImportReportBuilder, err: XmlSyntaxError, content: boolean): never {
239
248
  if (!content) {
240
249
  report.fail(XGMML_ISSUE.EMPTY_INPUT, "the input is empty");
241
250
  }
242
- report.fail(XGMML_ISSUE.XML_SYNTAX, err.message, { line: err.line });
251
+ return report.fail(err instanceof XmlNestingError ? XGMML_ISSUE.XML_NESTING : XGMML_ISSUE.XML_SYNTAX, err.message, {
252
+ line: err.line,
253
+ });
243
254
  }
244
255
 
245
256
  /**
@@ -466,7 +477,9 @@ function sniffXgmml(head: Uint8Array): number {
466
477
  }
467
478
  const tagEnd = text.indexOf(">", root.index);
468
479
  const tag = text.slice(root.index, tagEnd < 0 ? undefined : tagEnd);
469
- return tag.includes("http://www.cs.rpi.edu/XGMML") ? 0.95 : 0.5;
480
+ // the XGMML namespace declared on the root, as a whole attribute value
481
+ const namespaces = [...tag.matchAll(/\bxmlns(?::[\w.-]+)?\s*=\s*(["'])([^"']*)\1/g)].map((m) => m[2]);
482
+ return namespaces.includes(XGMML_NAMESPACE) ? 0.95 : 0.5;
470
483
  }
471
484
 
472
485
  /**
@@ -488,4 +501,5 @@ export const xgmmlImporter: GraphImporter<XgmmlImportOptions> = Object.freeze({
488
501
  import: importXgmml,
489
502
  importAll: importAllXgmml,
490
503
  listGraphs: listXgmmlGraphs,
504
+ styles: readXgmmlFileStyles,
491
505
  });