@graphty/graph-io 0.3.43 → 0.3.45

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-DJMHdDvv.js +40 -0
  2. package/dist/chunks/approximations-DJMHdDvv.js.map +1 -0
  3. package/dist/chunks/block-CPCHkX42.js +2777 -0
  4. package/dist/chunks/block-CPCHkX42.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose--jM0yYCo.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose--jM0yYCo.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BKwqelYD.js} +6 -2
  8. package/dist/chunks/constants-BKwqelYD.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-DZy6JgdA.js +3456 -0
  12. package/dist/chunks/emit-DZy6JgdA.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-CgzxiYPg.js} +44 -21
  14. package/dist/chunks/escape-CgzxiYPg.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-BvqAXCKh.js} +196 -792
  16. package/dist/chunks/export-BvqAXCKh.js.map +1 -0
  17. package/dist/chunks/{exporter-yLxKBvLE.js → exporter--Mk9gXCJ.js} +4 -3
  18. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter--Mk9gXCJ.js.map} +1 -1
  19. package/dist/chunks/{exporter-RVtXVetw.js → exporter-C-9cgZKa.js} +1805 -287
  20. package/dist/chunks/exporter-C-9cgZKa.js.map +1 -0
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-DFqJhBnj.js} +133 -74
  22. package/dist/chunks/exporter-DFqJhBnj.js.map +1 -0
  23. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-DteVeJki.js} +22 -12
  24. package/dist/chunks/exporter-DteVeJki.js.map +1 -0
  25. package/dist/chunks/format-BpQBx8MZ.js +676 -0
  26. package/dist/chunks/format-BpQBx8MZ.js.map +1 -0
  27. package/dist/chunks/generic-BGO71QBv.js +1347 -0
  28. package/dist/chunks/generic-BGO71QBv.js.map +1 -0
  29. package/dist/chunks/{importer-C98dpSH4.js → importer-B-9Rc1zO.js} +141 -82
  30. package/dist/chunks/importer-B-9Rc1zO.js.map +1 -0
  31. package/dist/chunks/{importer-D794XUTe.js → importer-BVVR740x.js} +31 -8
  32. package/dist/chunks/importer-BVVR740x.js.map +1 -0
  33. package/dist/chunks/{importer-WrGRZb0N.js → importer-C0AjA3Ax.js} +449 -102
  34. package/dist/chunks/importer-C0AjA3Ax.js.map +1 -0
  35. package/dist/chunks/{importer-BbNb7eNg.js → importer-C7pvJe1L.js} +1398 -129
  36. package/dist/chunks/importer-C7pvJe1L.js.map +1 -0
  37. package/dist/chunks/{importer-xZ-3suY1.js → importer-ClwoVx3O.js} +791 -135
  38. package/dist/chunks/importer-ClwoVx3O.js.map +1 -0
  39. package/dist/chunks/{importer-Ht7LNg8L.js → importer-D0sC_6bO.js} +116 -296
  40. package/dist/chunks/importer-D0sC_6bO.js.map +1 -0
  41. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-EHQk1jbM.js} +617 -115
  42. package/dist/chunks/importer-EHQk1jbM.js.map +1 -0
  43. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-DJZRZ6jd.js} +123 -32
  44. package/dist/chunks/json-elements-DJZRZ6jd.js.map +1 -0
  45. package/dist/chunks/lexicon-WMsNddyU.js +509 -0
  46. package/dist/chunks/lexicon-WMsNddyU.js.map +1 -0
  47. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-G4MqRdux.js} +3 -2
  48. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-G4MqRdux.js.map} +1 -1
  49. package/dist/chunks/{records-Cu4bxYOm.js → records-CiaWZrFH.js} +2 -2
  50. package/dist/chunks/{records-Cu4bxYOm.js.map → records-CiaWZrFH.js.map} +1 -1
  51. package/dist/chunks/styles-DvoFBKCK.js +690 -0
  52. package/dist/chunks/styles-DvoFBKCK.js.map +1 -0
  53. package/dist/chunks/styles-yed-Cz9rLBCP.js +842 -0
  54. package/dist/chunks/styles-yed-Cz9rLBCP.js.map +1 -0
  55. package/dist/chunks/styles-zNTmz5R7.js +2102 -0
  56. package/dist/chunks/styles-zNTmz5R7.js.map +1 -0
  57. package/dist/chunks/{text-DHOJXnED.js → text-CzJNFOS9.js} +2 -2
  58. package/dist/chunks/{text-DHOJXnED.js.map → text-CzJNFOS9.js.map} +1 -1
  59. package/dist/chunks/units-XMZFIFe1.js +19 -0
  60. package/dist/chunks/units-XMZFIFe1.js.map +1 -0
  61. package/dist/chunks/writer-gQ8kx99H.js +448 -0
  62. package/dist/chunks/writer-gQ8kx99H.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 +292 -412
  71. package/dist/gexf.js.map +1 -1
  72. package/dist/gml.js +927 -74
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +351 -236
  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 +1496 -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 +20 -5
  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 +439 -264
  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 +791 -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 +605 -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 +89 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +626 -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 +1755 -0
  571. package/src/formats/gexf/exporter.ts +27 -11
  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 +541 -322
  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 +952 -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 +658 -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 +780 -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-RVtXVetw.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
@@ -67,6 +67,7 @@ import {
67
67
  UNKNOWN_ELEMENT_CODE,
68
68
  UNKNOWN_PARENT_CODE,
69
69
  UNKNOWN_XML_ATTRIBUTE_CODE,
70
+ XML_NESTING_CODE,
70
71
  XML_SYNTAX_CODE,
71
72
  } from "../../common/codes.js";
72
73
  import { type DeclaredTypeSpec, overflowsToInfinity, parseDecimalText } from "../../common/declared-types.js";
@@ -91,8 +92,10 @@ import {
91
92
  xmlDeclaredEncoding,
92
93
  XmlEmptyInputError,
93
94
  type XmlHandler,
95
+ XmlNestingError,
94
96
  XmlSyntaxError,
95
97
  } from "../../common/xml.js";
98
+ import { MAX_STYLE_BLOCK_LENGTH } from "../../styles/io/block.js";
96
99
  import { type CommonImportOptions, type GraphImporter, type ImportInput, type ImportReport } from "../../types.js";
97
100
  import {
98
101
  EDGE_DECLS,
@@ -109,6 +112,7 @@ import {
109
112
  TIME_FORMATS,
110
113
  TIME_REPRESENTATIONS,
111
114
  } from "./schema.js";
115
+ import { canonVizColor, gexfStyles, GRAPHTY_XML_NAMESPACE } from "./styles.js";
112
116
 
113
117
  /**
114
118
  * The format-specific options of the GEXF importer.
@@ -118,7 +122,9 @@ export interface GexfImportOptions extends CommonImportOptions {
118
122
  /**
119
123
  * Whether to read the visual attributes of Gephi's viz namespace (color, position, size, shape,
120
124
  * thickness) into node and edge attributes; false skips them, with one W_GEXF_VIZ_SKIPPED
121
- * warning.
125
+ * warning. The color, size, shape and thickness columns are deprecated and leave the import
126
+ * result in the next major version: read a file's styles with `styles: true` instead. The
127
+ * position column stays.
122
128
  * @defaultValue true
123
129
  */
124
130
  viz?: boolean | undefined;
@@ -184,6 +190,11 @@ export const WEIGHT_IGNORED_CODE = "W_GEXF_WEIGHT_IGNORED";
184
190
  * @category Issue and loss codes
185
191
  */
186
192
  export const VIZ_SKIPPED_CODE = "W_GEXF_VIZ_SKIPPED";
193
+ /**
194
+ * GEXF 1.0 only: a `pid` naming no node. Gephi 0.6 wrote `pid="0"` on top-level nodes; the node stays top-level.
195
+ * @category Built-in formats
196
+ */
197
+ export const UNKNOWN_PID_CODE = "W_GEXF_UNKNOWN_PID";
187
198
  /**
188
199
  * A 1.2 dynamic viz element (its bounds are dropped, the value kept).
189
200
  * @category Issue and loss codes
@@ -234,6 +245,10 @@ const VERSIONS: ReadonlySet<string> = new Set(["1.0", "1.1", "1.2", "1.3"]);
234
245
  * @returns the version, or null
235
246
  */
236
247
  function namespaceVersion(ns: string | null): string | null {
248
+ if (ns !== null && /gephi\.org\/gexf\/?$/.test(ns)) {
249
+ // GEXF 1.0, as Gephi 0.6 wrote it
250
+ return "1.0";
251
+ }
237
252
  const match = ns === null ? null : /gexf\.net\/(1\.[0-3])/.exec(ns);
238
253
  return match === null ? null : match[1];
239
254
  }
@@ -313,8 +328,16 @@ const EDGE_TYPES: ReadonlySet<string> = new Set(["directed", "undirected", "mutu
313
328
  * @returns the text trimmed and in lower case
314
329
  */
315
330
  function edgeTypeKeyword(text: string): string {
316
- return text.trim().toLowerCase();
331
+ const keyword = text.trim().toLowerCase();
332
+ return EDGE_TYPE_ALIASES.get(keyword) ?? keyword;
317
333
  }
334
+
335
+ /** GEXF 1.0's spellings of the edge types. */
336
+ const EDGE_TYPE_ALIASES: ReadonlyMap<string, string> = new Map([
337
+ ["dir", "directed"],
338
+ ["undir", "undirected"],
339
+ ["double", "mutual"],
340
+ ]);
318
341
  const ABORT_CHECK_INTERVAL = 64;
319
342
 
320
343
  /** The XML attributes the importer reads on `<node>`; any other one is reported once. */
@@ -392,6 +415,16 @@ interface TrackedAttribute {
392
415
  table: ExtensionHandle;
393
416
  }
394
417
 
418
+ /** A `<parents>` list waiting for every node to be declared. */
419
+ interface ParentsRef {
420
+ /** The child's node index. */
421
+ readonly child: number;
422
+ /** The parents' ids. */
423
+ readonly ids: readonly NodeId[];
424
+ /** Where the list was read. */
425
+ readonly where: IssueLocation;
426
+ }
427
+
395
428
  /** A pending containment reference resolved after every node is declared. */
396
429
  interface ParentRef {
397
430
  /** The child's node index. */
@@ -537,6 +570,8 @@ const enum Ctx {
537
570
  Edges,
538
571
  Edge,
539
572
  Skip,
573
+ /** graphty's `graphty.styles` block inside `<meta>`. */
574
+ StyleBlock,
540
575
  }
541
576
 
542
577
  /** An open `<node>`: its index (INVALID_INDEX when the node was skipped) and location. */
@@ -603,6 +638,15 @@ class GexfReader implements XmlHandler {
603
638
 
604
639
  private metaField: "creator" | "description" | "keywords" | null = null;
605
640
 
641
+ /** The text of graphty's `graphty.styles` block, read up to one character past the longest block read. */
642
+ private styleBlock = "";
643
+
644
+ /** GEXF 1.0 only: nodes added for edges read before `<nodes>`, until their `<node>` declares them. */
645
+ private readonly implicitNodes = new Map<number, NodeId>();
646
+
647
+ /** GEXF 1.0 only: `<edges>` came before `<nodes>`, so an edge's ends are added until `<node>` declares them. */
648
+ private edgesFirst = false;
649
+
606
650
  private readonly nodeAttrs = new Map<string, TrackedAttribute>();
607
651
 
608
652
  private readonly edgeAttrs = new Map<string, TrackedAttribute>();
@@ -638,8 +682,7 @@ class GexfReader implements XmlHandler {
638
682
 
639
683
  private parentRefs: ParentRef[] = [];
640
684
 
641
- private parentsRefs: { readonly child: number; readonly ids: readonly NodeId[]; readonly where: IssueLocation }[] =
642
- [];
685
+ private parentsRefs: ParentsRef[] = [];
643
686
 
644
687
  private readonly unknownAttributes = new Set<string>();
645
688
 
@@ -748,6 +791,7 @@ class GexfReader implements XmlHandler {
748
791
  parent !== Ctx.Skip &&
749
792
  parent !== Ctx.MetaText &&
750
793
  parent !== Ctx.AttributeText &&
794
+ parent !== Ctx.StyleBlock &&
751
795
  !name.startsWith("viz:")
752
796
  ) {
753
797
  // an undeclared prefix or a name that is not namespace-well-formed (<:node>, <a:b:node>)
@@ -767,7 +811,7 @@ class GexfReader implements XmlHandler {
767
811
  this.startInGexf(name, local, attrs, line);
768
812
  return;
769
813
  case Ctx.Meta:
770
- this.startInMeta(name, local, line);
814
+ this.startInMeta(name, local, line, ns);
771
815
  return;
772
816
  case Ctx.Graph:
773
817
  this.startInGraph(name, local, attrs, line);
@@ -801,6 +845,7 @@ class GexfReader implements XmlHandler {
801
845
  return;
802
846
  case Ctx.MetaText:
803
847
  case Ctx.AttributeText:
848
+ case Ctx.StyleBlock:
804
849
  case Ctx.Skip:
805
850
  this.ctx.push(Ctx.Skip);
806
851
  return;
@@ -823,8 +868,21 @@ class GexfReader implements XmlHandler {
823
868
  case Ctx.MetaText:
824
869
  this.finishMetaText();
825
870
  return;
871
+ case Ctx.StyleBlock:
872
+ this.report.keepForStyles(this.styleBlock);
873
+ this.styleBlock = "";
874
+ return;
826
875
  case Ctx.Graph:
827
876
  this.resolveParents();
877
+ if (!this.nodesSeen && this.implicitNodes.size > 0) {
878
+ this.report.error(
879
+ "validation-error",
880
+ MISSING_NODES_CODE,
881
+ "the graph declares <edges> but no <nodes>",
882
+ );
883
+ } else if (!this.options.addMissingNodes) {
884
+ this.dropUndeclaredNodes();
885
+ }
828
886
  return;
829
887
  case Ctx.Attributes:
830
888
  this.attributeGroup = null;
@@ -878,6 +936,12 @@ class GexfReader implements XmlHandler {
878
936
  case Ctx.AttributeText:
879
937
  this.attributeTextValue += text;
880
938
  return;
939
+ case Ctx.StyleBlock:
940
+ // past the longest block read, one more character is enough to say it is too large
941
+ if (this.styleBlock.length <= MAX_STYLE_BLOCK_LENGTH) {
942
+ this.styleBlock += text.slice(0, MAX_STYLE_BLOCK_LENGTH + 1 - this.styleBlock.length);
943
+ }
944
+ return;
881
945
  case Ctx.Skip:
882
946
  return;
883
947
  default:
@@ -990,8 +1054,14 @@ class GexfReader implements XmlHandler {
990
1054
  * @param name - the element name
991
1055
  * @param local - its local name
992
1056
  * @param line - the line
1057
+ * @param ns - its namespace
993
1058
  */
994
- private startInMeta(name: string, local: string, line: number): void {
1059
+ private startInMeta(name: string, local: string, line: number, ns: string | null): void {
1060
+ if (ns === GRAPHTY_XML_NAMESPACE && local === "styles") {
1061
+ this.styleBlock = "";
1062
+ this.ctx.push(Ctx.StyleBlock);
1063
+ return;
1064
+ }
995
1065
  if (local === "creator" || local === "description" || local === "keywords") {
996
1066
  this.metaField = local;
997
1067
  this.metaText = "";
@@ -1134,7 +1204,10 @@ class GexfReader implements XmlHandler {
1134
1204
  this.beginSection(attrs, "node", line);
1135
1205
  return;
1136
1206
  case "edges":
1137
- if (!this.nodesSeen) {
1207
+ if (!this.nodesSeen && this.meta.sourceVersion === "1.0") {
1208
+ // GEXF 1.0 files (Gephi 0.6) may list their edges before their nodes
1209
+ this.edgesFirst = true;
1210
+ } else if (!this.nodesSeen) {
1138
1211
  this.report.error(
1139
1212
  "validation-error",
1140
1213
  MISSING_NODES_CODE,
@@ -1534,7 +1607,9 @@ class GexfReader implements XmlHandler {
1534
1607
  try {
1535
1608
  const id = this.coerceId(idText, where);
1536
1609
  const existing = sink.indexOf(id);
1537
- if (existing !== INVALID_INDEX) {
1610
+ if (existing !== INVALID_INDEX && this.implicitNodes.delete(existing)) {
1611
+ index = existing;
1612
+ } else if (existing !== INVALID_INDEX) {
1538
1613
  report.warning(
1539
1614
  "validation-error",
1540
1615
  DUPLICATE_NODE_CODE,
@@ -1728,20 +1803,8 @@ class GexfReader implements XmlHandler {
1728
1803
  return false;
1729
1804
  };
1730
1805
  for (const ref of refs) {
1731
- let parent = ref.parentIndex;
1732
- if (ref.parentId !== null) {
1733
- parent = sink.indexOf(ref.parentId);
1734
- if (parent === INVALID_INDEX) {
1735
- report.error(
1736
- "missing-value",
1737
- UNKNOWN_PARENT_CODE,
1738
- `pid "${String(ref.parentId)}" names a node the document does not declare`,
1739
- ref.where,
1740
- );
1741
- continue;
1742
- }
1743
- }
1744
- if (parentOf.get(ref.child) === parent) {
1806
+ const parent = this.parentIndexOf(ref);
1807
+ if (parent === null || parentOf.get(ref.child) === parent) {
1745
1808
  continue;
1746
1809
  }
1747
1810
  if (isAncestorOrSelf(ref.child, parent)) {
@@ -1768,27 +1831,66 @@ class GexfReader implements XmlHandler {
1768
1831
  * @param lists - the queued `<parents>` lists
1769
1832
  */
1770
1833
  private resolveParentsLists(lists: readonly (typeof this.parentsRefs)[number][]): void {
1771
- const { sink, report } = this;
1772
1834
  for (const ref of lists) {
1773
- const indices: number[] = [];
1774
- for (const id of ref.ids) {
1775
- const parent = sink.indexOf(id);
1776
- if (parent === INVALID_INDEX) {
1777
- report.error(
1778
- "missing-value",
1779
- UNKNOWN_PARENT_CODE,
1780
- `<parent for="${String(id)}"> names a node the document does not declare`,
1781
- ref.where,
1782
- );
1783
- continue;
1784
- }
1785
- indices.push(parent);
1786
- }
1787
- try {
1788
- this.parentsColumn.set(sink, report, ref.child, indices, ref.where);
1789
- } catch (err) {
1790
- report.recordError(err, ref.where);
1835
+ this.resolveParentsList(ref);
1836
+ }
1837
+ }
1838
+
1839
+ /**
1840
+ * The parent a `pid` or a nesting names.
1841
+ * @param ref - the reference
1842
+ * @returns its index, or null when the id names no node (reported)
1843
+ */
1844
+ private parentIndexOf(ref: ParentRef): number | null {
1845
+ if (ref.parentId === null) {
1846
+ return ref.parentIndex;
1847
+ }
1848
+ const parent = this.sink.indexOf(ref.parentId);
1849
+ if (parent !== INVALID_INDEX) {
1850
+ return parent;
1851
+ }
1852
+ if (this.meta.sourceVersion === "1.0") {
1853
+ this.report.warnOnce(
1854
+ "missing-value",
1855
+ UNKNOWN_PID_CODE,
1856
+ `pid "${String(ref.parentId)}" names no node; GEXF 1.0 files write it on top-level nodes, which stay top-level`,
1857
+ ref.where,
1858
+ );
1859
+ } else {
1860
+ this.report.error(
1861
+ "missing-value",
1862
+ UNKNOWN_PARENT_CODE,
1863
+ `pid "${String(ref.parentId)}" names a node the document does not declare`,
1864
+ ref.where,
1865
+ );
1866
+ }
1867
+ return null;
1868
+ }
1869
+
1870
+ /**
1871
+ * Resolve one `<parents>` list; an id that names no node is reported and left out.
1872
+ * @param ref - the list
1873
+ */
1874
+ private resolveParentsList(ref: ParentsRef): void {
1875
+ const { sink, report } = this;
1876
+ const indices: number[] = [];
1877
+ for (const id of ref.ids) {
1878
+ const parent = sink.indexOf(id);
1879
+ if (parent === INVALID_INDEX) {
1880
+ report.error(
1881
+ "missing-value",
1882
+ UNKNOWN_PARENT_CODE,
1883
+ `<parent for="${String(id)}"> names a node the document does not declare`,
1884
+ ref.where,
1885
+ );
1886
+ continue;
1791
1887
  }
1888
+ indices.push(parent);
1889
+ }
1890
+ try {
1891
+ this.parentsColumn.set(sink, report, ref.child, indices, ref.where);
1892
+ } catch (err) {
1893
+ report.recordError(err, ref.where);
1792
1894
  }
1793
1895
  }
1794
1896
 
@@ -1838,21 +1940,10 @@ class GexfReader implements XmlHandler {
1838
1940
  report.counts.skippedEdges++;
1839
1941
  return;
1840
1942
  }
1841
- let kind: EdgeKind = this.defaultKind;
1842
- const typeText = attrs.get("type");
1843
- if (typeText !== undefined) {
1844
- const type = edgeTypeKeyword(typeText);
1845
- if (!EDGE_TYPES.has(type)) {
1846
- report.error(
1847
- "validation-error",
1848
- EDGE_TYPE_CODE,
1849
- `edge type "${typeText}" is not directed, undirected or mutual`,
1850
- where,
1851
- );
1852
- report.counts.skippedEdges++;
1853
- return;
1854
- }
1855
- kind = type as EdgeKind;
1943
+ const kind = this.edgeKindOf(attrs, where);
1944
+ if (kind === null) {
1945
+ report.counts.skippedEdges++;
1946
+ return;
1856
1947
  }
1857
1948
  if (idText !== undefined && this.edgeIds.has(idText)) {
1858
1949
  report.error(
@@ -1866,9 +1957,7 @@ class GexfReader implements XmlHandler {
1866
1957
  }
1867
1958
  let index: number;
1868
1959
  try {
1869
- const source = this.coerceId(sourceText, where);
1870
- const target = this.coerceId(targetText, where);
1871
- this.requireDeclaredEndpoints(source, target, sourceText, targetText);
1960
+ const [source, target] = this.endpoints(sourceText, targetText, where);
1872
1961
  const weight = this.xmlWeight(attrs, where);
1873
1962
  const before = sink.edgeCount;
1874
1963
  index = this.resolver.addEdge(source, target, kind, weight, where);
@@ -1887,47 +1976,71 @@ class GexfReader implements XmlHandler {
1887
1976
  frame.mirror = this.resolver.lastMirror;
1888
1977
  frame.xmlWeight = attrs.get("weight") ?? null;
1889
1978
  this.edge = frame;
1890
- this.writeEdgeColumns(attrs, index, idText, where);
1979
+ this.writeEdgeAttributes(attrs, index, where);
1891
1980
  }
1892
1981
 
1893
1982
  /**
1894
- * Throw when addMissingNodes is off and an endpoint names an undeclared node.
1895
- * @param source - the coerced source id
1896
- * @param target - the coerced target id
1897
- * @param sourceText - the source as written
1898
- * @param targetText - the target as written
1983
+ * The kind of an `<edge>`: its `type`, else the graph's default.
1984
+ * @param attrs - its attributes
1985
+ * @param where - where it was read
1986
+ * @returns the kind, or null for a type GEXF does not have (reported)
1899
1987
  */
1900
- private requireDeclaredEndpoints(source: NodeId, target: NodeId, sourceText: string, targetText: string): void {
1901
- const { sink, options } = this;
1902
- if (options.addMissingNodes) {
1903
- return;
1988
+ private edgeKindOf(attrs: ReadonlyMap<string, string>, where: IssueLocation): EdgeKind | null {
1989
+ const typeText = attrs.get("type");
1990
+ if (typeText === undefined) {
1991
+ return this.defaultKind;
1904
1992
  }
1905
- if (sink.indexOf(source) === INVALID_INDEX) {
1906
- throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${sourceText}"`, {
1907
- id: source,
1908
- });
1993
+ const type = edgeTypeKeyword(typeText);
1994
+ if (!EDGE_TYPES.has(type)) {
1995
+ this.report.error(
1996
+ "validation-error",
1997
+ EDGE_TYPE_CODE,
1998
+ `edge type "${typeText}" is not directed, undirected or mutual`,
1999
+ where,
2000
+ );
2001
+ return null;
2002
+ }
2003
+ return type as EdgeKind;
2004
+ }
2005
+
2006
+ /**
2007
+ * An edge's endpoints: in GEXF 1.0 with its edges first, a node no `<node>` declared yet is added for now; without
2008
+ * addMissingNodes, a node the document does not declare throws E_UNKNOWN_NODE.
2009
+ * @param sourceText - the source's id text
2010
+ * @param targetText - the target's id text
2011
+ * @param where - where it was read
2012
+ * @returns the ids
2013
+ */
2014
+ private endpoints(sourceText: string, targetText: string, where: IssueLocation): [NodeId, NodeId] {
2015
+ const { sink } = this;
2016
+ const ends: [NodeId, NodeId] = [this.coerceId(sourceText, where), this.coerceId(targetText, where)];
2017
+ if (this.edgesFirst && !this.nodesSeen) {
2018
+ for (const end of ends) {
2019
+ if (sink.indexOf(end) === INVALID_INDEX) {
2020
+ this.implicitNodes.set(sink.addNode(end), end);
2021
+ this.report.counts.nodes++;
2022
+ }
2023
+ }
1909
2024
  }
1910
- if (sink.indexOf(target) === INVALID_INDEX) {
1911
- throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${targetText}"`, {
1912
- id: target,
2025
+ const texts = [sourceText, targetText];
2026
+ const unknown = this.options.addMissingNodes ? -1 : ends.findIndex((id) => sink.indexOf(id) === INVALID_INDEX);
2027
+ if (unknown !== -1) {
2028
+ throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${texts[unknown]}"`, {
2029
+ id: ends[unknown],
1913
2030
  });
1914
2031
  }
2032
+ return ends;
1915
2033
  }
1916
2034
 
1917
2035
  /**
1918
- * Write the id, label, kind and lifetime columns of an added edge; a failure is reported.
1919
- * @param attrs - the edge's attributes
1920
- * @param index - the edge's index
1921
- * @param idText - the edge's id, or undefined
1922
- * @param where - the edge's location
2036
+ * Write an added edge's id, label, kind and lifetime.
2037
+ * @param attrs - its attributes
2038
+ * @param index - its index
2039
+ * @param where - where it was read
1923
2040
  */
1924
- private writeEdgeColumns(
1925
- attrs: ReadonlyMap<string, string>,
1926
- index: number,
1927
- idText: string | undefined,
1928
- where: IssueLocation,
1929
- ): void {
2041
+ private writeEdgeAttributes(attrs: ReadonlyMap<string, string>, index: number, where: IssueLocation): void {
1930
2042
  const { report, sink } = this;
2043
+ const idText = attrs.get("id");
1931
2044
  try {
1932
2045
  if (idText !== undefined) {
1933
2046
  this.edgeIdColumn.set(sink, report, index, idText, where);
@@ -1946,6 +2059,26 @@ class GexfReader implements XmlHandler {
1946
2059
  }
1947
2060
  }
1948
2061
 
2062
+ /**
2063
+ * GEXF 1.0 with its edges first, addMissingNodes false: a node an edge named that no `<node>` declared is an
2064
+ * unknown node, as it is when the nodes come first. It is reported, and it and its edges are removed when the
2065
+ * sink can remove nodes.
2066
+ */
2067
+ private dropUndeclaredNodes(): void {
2068
+ const { sink, report } = this;
2069
+ const removable = sink as GraphSink & { removeNodeByIndex?: (index: number) => ArrayLike<number> };
2070
+ for (const [index, id] of this.implicitNodes) {
2071
+ report.error("validation-error", "E_UNKNOWN_NODE", `edge references undeclared node "${String(id)}"`);
2072
+ if (typeof removable.removeNodeByIndex === "function") {
2073
+ const edges = removable.removeNodeByIndex(index);
2074
+ report.counts.nodes--;
2075
+ report.counts.edges -= edges.length;
2076
+ report.counts.skippedEdges += edges.length;
2077
+ }
2078
+ }
2079
+ this.implicitNodes.clear();
2080
+ }
2081
+
1949
2082
  /**
1950
2083
  * The weight argument of one edge from its `weight` XML attribute; undefined when absent (the
1951
2084
  * sink records a defaulted weight, design section 3.7).
@@ -2069,7 +2202,8 @@ class GexfReader implements XmlHandler {
2069
2202
  if (index === INVALID_INDEX) {
2070
2203
  return;
2071
2204
  }
2072
- const forId = attrs.get("for");
2205
+ // GEXF 1.0 names the attribute with `id`
2206
+ const forId = attrs.get("for") ?? attrs.get("id");
2073
2207
  const { valueWhere } = this;
2074
2208
  valueWhere.line = line;
2075
2209
  valueWhere.element = element;
@@ -2600,6 +2734,51 @@ class GexfReader implements XmlHandler {
2600
2734
 
2601
2735
  // ---------------------------------------------------------------- viz
2602
2736
 
2737
+ /**
2738
+ * Write a `<viz:position>` into the node position column, declared on first use with the
2739
+ * dimensions the element writes.
2740
+ * @param attrs - its attributes
2741
+ * @param index - the node's index
2742
+ * @param where - the element's location
2743
+ */
2744
+ private writeVizPosition(attrs: ReadonlyMap<string, string>, index: number, where: IssueLocation): void {
2745
+ const x = vizNumber(attrs, "x");
2746
+ const y = vizNumber(attrs, "y");
2747
+ const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
2748
+ this.positionColumn ??= new LazyColumn("node", {
2749
+ ...NODE_DECLS.position,
2750
+ extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
2751
+ });
2752
+ this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
2753
+ }
2754
+
2755
+ /**
2756
+ * Write a `<viz:shape>` into the shape column, and a node's image `uri` beside it.
2757
+ * @param name - the element name as written
2758
+ * @param attrs - its attributes
2759
+ * @param domain - node or edge
2760
+ * @param index - the element's index
2761
+ * @param where - the element's location
2762
+ */
2763
+ private writeVizShape(
2764
+ name: string,
2765
+ attrs: ReadonlyMap<string, string>,
2766
+ domain: "node" | "edge",
2767
+ index: number,
2768
+ where: IssueLocation,
2769
+ ): void {
2770
+ const value = attrs.get("value");
2771
+ if (value === undefined) {
2772
+ throw new GraphFormatError("E_COLUMN_TYPE", "<viz:shape> without a value", { element: name });
2773
+ }
2774
+ const columns = domain === "node" ? this.nodeColumns : this.edgeColumns;
2775
+ columns.shape.set(this.sink, this.report, index, value, where);
2776
+ const uri = attrs.get("uri");
2777
+ if (domain === "node" && uri !== undefined) {
2778
+ this.shapeUriColumn.set(this.sink, this.report, index, uri, where);
2779
+ }
2780
+ }
2781
+
2603
2782
  /**
2604
2783
  * Write one viz element into its role column; a value that does not parse is a recorded
2605
2784
  * warning and the element is skipped.
@@ -2635,10 +2814,10 @@ class GexfReader implements XmlHandler {
2635
2814
  try {
2636
2815
  switch (local) {
2637
2816
  case "color":
2638
- columns.color.set(sink, report, index, parseColor(attrs), where);
2817
+ columns.color.set(sink, report, index, this.vizColor(attrs, name, where), where);
2639
2818
  break;
2640
2819
  case "position":
2641
- this.writePosition(attrs, index, where);
2820
+ this.writeVizPosition(attrs, index, where);
2642
2821
  break;
2643
2822
  case "size":
2644
2823
  this.sizeColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
@@ -2647,7 +2826,7 @@ class GexfReader implements XmlHandler {
2647
2826
  this.thicknessColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
2648
2827
  break;
2649
2828
  case "shape":
2650
- this.writeShape(name, attrs, domain, index, where);
2829
+ this.writeVizShape(name, attrs, domain, index, where);
2651
2830
  break;
2652
2831
  default:
2653
2832
  break;
@@ -2661,48 +2840,45 @@ class GexfReader implements XmlHandler {
2661
2840
  }
2662
2841
 
2663
2842
  /**
2664
- * Write a `<viz:position>`.
2665
- * @param attrs - its attributes
2666
- * @param index - the node's index
2667
- * @param where - the node's location
2668
- */
2669
- private writePosition(attrs: ReadonlyMap<string, string>, index: number, where: IssueLocation): void {
2670
- const x = vizNumber(attrs, "x");
2671
- const y = vizNumber(attrs, "y");
2672
- const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
2673
- this.positionColumn ??= new LazyColumn("node", {
2674
- ...NODE_DECLS.position,
2675
- extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
2676
- });
2677
- this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
2678
- }
2679
-
2680
- /**
2681
- * Write a `<viz:shape>` and, on a node, its `uri`.
2843
+ * `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
2844
+ * `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; a channel outside 0..255 or an alpha outside 0..1 is clamped and
2845
+ * reported, as Gephi clamps it.
2846
+ * @param attrs - the element's attributes
2682
2847
  * @param name - the element name as written
2683
- * @param attrs - its attributes
2684
- * @param domain - node or edge
2685
- * @param index - the element's index
2686
2848
  * @param where - the element's location
2849
+ * @returns [r, g, b, a]
2687
2850
  */
2688
- private writeShape(
2689
- name: string,
2690
- attrs: ReadonlyMap<string, string>,
2691
- domain: "node" | "edge",
2692
- index: number,
2693
- where: IssueLocation,
2694
- ): void {
2695
- const { sink, report } = this;
2696
- const columns = domain === "node" ? this.nodeColumns : this.edgeColumns;
2697
- const value = attrs.get("value");
2698
- if (value === undefined) {
2699
- throw new GraphFormatError("E_COLUMN_TYPE", "<viz:shape> without a value", { element: name });
2851
+ private vizColor(attrs: ReadonlyMap<string, string>, name: string, where: IssueLocation): number[] {
2852
+ const hex = attrs.get("hex");
2853
+ let rgba: number[];
2854
+ if (hex !== undefined && !attrs.has("r")) {
2855
+ const c = canonVizColor(hex);
2856
+ if (c === null) {
2857
+ throw new GraphFormatError(
2858
+ "E_COLUMN_TYPE",
2859
+ `viz hex="${hex}" is not a #RRGGBB, #RGB or #RRGGBBAA color`,
2860
+ { attribute: "hex" },
2861
+ );
2862
+ }
2863
+ rgba = [...c];
2864
+ if (attrs.has("a")) {
2865
+ rgba[3] = vizNumber(attrs, "a");
2866
+ }
2867
+ } else {
2868
+ rgba = [vizNumber(attrs, "r"), vizNumber(attrs, "g"), vizNumber(attrs, "b")];
2869
+ rgba.push(attrs.has("a") ? vizNumber(attrs, "a") : 1);
2700
2870
  }
2701
- columns.shape.set(sink, report, index, value, where);
2702
- const uri = attrs.get("uri");
2703
- if (domain === "node" && uri !== undefined) {
2704
- this.shapeUriColumn.set(sink, report, index, uri, where);
2871
+ const max = [255, 255, 255, 1];
2872
+ if (rgba.some((v, i) => v < 0 || v > max[i])) {
2873
+ this.report.warning(
2874
+ "validation-error",
2875
+ VIZ_VALUE_CODE,
2876
+ `<${name}> has a channel outside 0..255 or an alpha outside 0..1; clamped`,
2877
+ where,
2878
+ );
2879
+ rgba = rgba.map((v, i) => Math.max(0, Math.min(max[i], v)));
2705
2880
  }
2881
+ return [rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, rgba[3]];
2706
2882
  }
2707
2883
 
2708
2884
  // ---------------------------------------------------------------- helpers
@@ -2888,35 +3064,6 @@ function vizNumber(attrs: ReadonlyMap<string, string>, name: string): number {
2888
3064
  return value;
2889
3065
  }
2890
3066
 
2891
- /**
2892
- * Parse `<viz:color r g b a hex>` into rgba in 0..1 (design section 5.5: role color, f32 x4).
2893
- * @param attrs - the element's attributes
2894
- * @returns [r, g, b, a]
2895
- */
2896
- function parseColor(attrs: ReadonlyMap<string, string>): number[] {
2897
- let r: number;
2898
- let g: number;
2899
- let b: number;
2900
- const hex = attrs.get("hex");
2901
- if (hex !== undefined && !attrs.has("r")) {
2902
- const digits = hex.startsWith("#") ? hex.slice(1) : hex;
2903
- if (!/^[0-9a-fA-F]{6}$/.test(digits)) {
2904
- throw new GraphFormatError("E_COLUMN_TYPE", `viz hex="${hex}" is not a #RRGGBB color`, {
2905
- attribute: "hex",
2906
- });
2907
- }
2908
- r = Number.parseInt(digits.slice(0, 2), 16);
2909
- g = Number.parseInt(digits.slice(2, 4), 16);
2910
- b = Number.parseInt(digits.slice(4, 6), 16);
2911
- } else {
2912
- r = vizNumber(attrs, "r");
2913
- g = vizNumber(attrs, "g");
2914
- b = vizNumber(attrs, "b");
2915
- }
2916
- const a = attrs.has("a") ? vizNumber(attrs, "a") : 1;
2917
- return [r / 255, g / 255, b / 255, a];
2918
- }
2919
-
2920
3067
  /** A head that starts with markup, after an optional byte-order mark and whitespace. */
2921
3068
  const XML_START = /^\uFEFF?\s*</;
2922
3069
 
@@ -2967,6 +3114,7 @@ export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
2967
3114
  extensions: Object.freeze([".gexf"]),
2968
3115
  mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
2969
3116
  sniff: sniffGexf,
3117
+ styles: gexfStyles,
2970
3118
  /**
2971
3119
  * Read a GEXF document into the sink in one streaming pass.
2972
3120
  * @param input - the document as text, bytes, a stream or chunks
@@ -3001,7 +3149,9 @@ export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
3001
3149
  report.fail(EMPTY_INPUT_CODE, "the input is empty (no markup at all)", { line: err.line });
3002
3150
  }
3003
3151
  if (err instanceof XmlSyntaxError) {
3004
- report.fail(XML_SYNTAX_CODE, err.message, { line: err.line });
3152
+ report.fail(err instanceof XmlNestingError ? XML_NESTING_CODE : XML_SYNTAX_CODE, err.message, {
3153
+ line: err.line,
3154
+ });
3005
3155
  }
3006
3156
  throw err;
3007
3157
  }