@graphty/graph-io 0.3.43 → 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-RVtXVetw.js → exporter-quPUCBiC.js} +1805 -287
  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 +292 -412
  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 +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 +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 +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 +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-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
@@ -27,7 +27,7 @@
27
27
  */
28
28
  import { GraphFormatError, INVALID_INDEX, MAX_COUNT, } from "@graphty/graph-format";
29
29
  import { declareAttribute, declareCompanion, declareResolved, losesPrecision, parseDeclaredTemporal, parseDeclaredValue, PRECISION_CODE, } from "../../common/attributes.js";
30
- import { BAD_VALUE_CODE, COUNT_HINT_CODE, COUNT_MISMATCH_CODE, DUPLICATE_ATTRIBUTE_CODE, DUPLICATE_EDGE_ID_CODE, DUPLICATE_NODE_CODE, EMPTY_INPUT_CODE, ID_MERGED_CODE, MISSING_ENDPOINT_CODE, MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE, PARENT_CYCLE_CODE, STRAY_TEXT_CODE, UNKNOWN_ELEMENT_CODE, UNKNOWN_PARENT_CODE, UNKNOWN_XML_ATTRIBUTE_CODE, XML_SYNTAX_CODE, } from "../../common/codes.js";
30
+ import { BAD_VALUE_CODE, COUNT_HINT_CODE, COUNT_MISMATCH_CODE, DUPLICATE_ATTRIBUTE_CODE, DUPLICATE_EDGE_ID_CODE, DUPLICATE_NODE_CODE, EMPTY_INPUT_CODE, ID_MERGED_CODE, MISSING_ENDPOINT_CODE, MISSING_ID_CODE, MULTIPLE_GRAPHS_CODE, NO_GRAPH_CODE, PARENT_CYCLE_CODE, STRAY_TEXT_CODE, UNKNOWN_ELEMENT_CODE, UNKNOWN_PARENT_CODE, UNKNOWN_XML_ATTRIBUTE_CODE, XML_NESTING_CODE, XML_SYNTAX_CODE, } from "../../common/codes.js";
31
31
  import { overflowsToInfinity, parseDecimalText } from "../../common/declared-types.js";
32
32
  import { DirectionResolver } from "../../common/direction.js";
33
33
  import { IdCoercer } from "../../common/ids.js";
@@ -37,8 +37,10 @@ import { reportSinkOptions, reportUnusedOptions, resolveImportOptions, } from ".
37
37
  import { ImportReportBuilder } from "../../common/report.js";
38
38
  import { parseTimeText, timeTextCompanion } from "../../common/temporal.js";
39
39
  import { isWeightField, parseWeightText } from "../../common/weights.js";
40
- import { isWhitespace, localName, sniffXmlText, tokenizeXml, xmlDeclaredEncoding, XmlEmptyInputError, XmlSyntaxError, } from "../../common/xml.js";
40
+ import { isWhitespace, localName, sniffXmlText, tokenizeXml, xmlDeclaredEncoding, XmlEmptyInputError, XmlNestingError, XmlSyntaxError, } from "../../common/xml.js";
41
+ import { MAX_STYLE_BLOCK_LENGTH } from "../../styles/io/block.js";
41
42
  import { EDGE_DECLS, GEXF_FORMAT, GRAPH_MODES, NODE_DECLS, OPEN_END, OPEN_START, RESERVED_EDGE_NAMES, RESERVED_NODE_NAMES, temporalTableDecls, temporalTableName, TIME_FORMATS, TIME_REPRESENTATIONS, } from "./schema.js";
43
+ import { canonVizColor, gexfStyles, GRAPHTY_XML_NAMESPACE } from "./styles.js";
42
44
  /**
43
45
  * The document is not a GEXF document (no `<gexf>` root).
44
46
  * @category Issue and loss codes
@@ -99,6 +101,11 @@ export const WEIGHT_IGNORED_CODE = "W_GEXF_WEIGHT_IGNORED";
99
101
  * @category Issue and loss codes
100
102
  */
101
103
  export const VIZ_SKIPPED_CODE = "W_GEXF_VIZ_SKIPPED";
104
+ /**
105
+ * GEXF 1.0 only: a `pid` naming no node. Gephi 0.6 wrote `pid="0"` on top-level nodes; the node stays top-level.
106
+ * @category Built-in formats
107
+ */
108
+ export const UNKNOWN_PID_CODE = "W_GEXF_UNKNOWN_PID";
102
109
  /**
103
110
  * A 1.2 dynamic viz element (its bounds are dropped, the value kept).
104
111
  * @category Issue and loss codes
@@ -139,6 +146,10 @@ const VERSIONS = new Set(["1.0", "1.1", "1.2", "1.3"]);
139
146
  * @returns the version, or null
140
147
  */
141
148
  function namespaceVersion(ns) {
149
+ if (ns !== null && /gephi\.org\/gexf\/?$/.test(ns)) {
150
+ // GEXF 1.0, as Gephi 0.6 wrote it
151
+ return "1.0";
152
+ }
142
153
  const match = ns === null ? null : /gexf\.net\/(1\.[0-3])/.exec(ns);
143
154
  return match === null ? null : match[1];
144
155
  }
@@ -208,8 +219,15 @@ const EDGE_TYPES = new Set(["directed", "undirected", "mutual"]);
208
219
  * @returns the text trimmed and in lower case
209
220
  */
210
221
  function edgeTypeKeyword(text) {
211
- return text.trim().toLowerCase();
222
+ const keyword = text.trim().toLowerCase();
223
+ return EDGE_TYPE_ALIASES.get(keyword) ?? keyword;
212
224
  }
225
+ /** GEXF 1.0's spellings of the edge types. */
226
+ const EDGE_TYPE_ALIASES = new Map([
227
+ ["dir", "directed"],
228
+ ["undir", "undirected"],
229
+ ["double", "mutual"],
230
+ ]);
213
231
  const ABORT_CHECK_INTERVAL = 64;
214
232
  /** The XML attributes the importer reads on `<node>`; any other one is reported once. */
215
233
  const NODE_ATTRIBUTES = new Set([
@@ -355,6 +373,8 @@ var Ctx;
355
373
  Ctx[Ctx["Edges"] = 12] = "Edges";
356
374
  Ctx[Ctx["Edge"] = 13] = "Edge";
357
375
  Ctx[Ctx["Skip"] = 14] = "Skip";
376
+ /** graphty's `graphty.styles` block inside `<meta>`. */
377
+ Ctx[Ctx["StyleBlock"] = 15] = "StyleBlock";
358
378
  })(Ctx || (Ctx = {}));
359
379
  /**
360
380
  * The event handler that turns the tokenizer's events into sink calls: one import call.
@@ -374,6 +394,12 @@ class GexfReader {
374
394
  this.meta = { sourceFormat: GEXF_FORMAT };
375
395
  this.metaText = "";
376
396
  this.metaField = null;
397
+ /** The text of graphty's `graphty.styles` block, read up to one character past the longest block read. */
398
+ this.styleBlock = "";
399
+ /** GEXF 1.0 only: nodes added for edges read before `<nodes>`, until their `<node>` declares them. */
400
+ this.implicitNodes = new Map();
401
+ /** GEXF 1.0 only: `<edges>` came before `<nodes>`, so an edge's ends are added until `<node>` declares them. */
402
+ this.edgesFirst = false;
377
403
  this.nodeAttrs = new Map();
378
404
  this.edgeAttrs = new Map();
379
405
  this.declaredNodeNames = new Set();
@@ -462,6 +488,7 @@ class GexfReader {
462
488
  parent !== Ctx.Skip &&
463
489
  parent !== Ctx.MetaText &&
464
490
  parent !== Ctx.AttributeText &&
491
+ parent !== Ctx.StyleBlock &&
465
492
  !name.startsWith("viz:")) {
466
493
  // an undeclared prefix or a name that is not namespace-well-formed (<:node>, <a:b:node>)
467
494
  this.unknownElement(name, line);
@@ -480,7 +507,7 @@ class GexfReader {
480
507
  this.startInGexf(name, local, attrs, line);
481
508
  return;
482
509
  case Ctx.Meta:
483
- this.startInMeta(name, local, line);
510
+ this.startInMeta(name, local, line, ns);
484
511
  return;
485
512
  case Ctx.Graph:
486
513
  this.startInGraph(name, local, attrs, line);
@@ -514,6 +541,7 @@ class GexfReader {
514
541
  return;
515
542
  case Ctx.MetaText:
516
543
  case Ctx.AttributeText:
544
+ case Ctx.StyleBlock:
517
545
  case Ctx.Skip:
518
546
  this.ctx.push(Ctx.Skip);
519
547
  return;
@@ -535,8 +563,18 @@ class GexfReader {
535
563
  case Ctx.MetaText:
536
564
  this.finishMetaText();
537
565
  return;
566
+ case Ctx.StyleBlock:
567
+ this.report.keepForStyles(this.styleBlock);
568
+ this.styleBlock = "";
569
+ return;
538
570
  case Ctx.Graph:
539
571
  this.resolveParents();
572
+ if (!this.nodesSeen && this.implicitNodes.size > 0) {
573
+ this.report.error("validation-error", MISSING_NODES_CODE, "the graph declares <edges> but no <nodes>");
574
+ }
575
+ else if (!this.options.addMissingNodes) {
576
+ this.dropUndeclaredNodes();
577
+ }
540
578
  return;
541
579
  case Ctx.Attributes:
542
580
  this.attributeGroup = null;
@@ -589,6 +627,12 @@ class GexfReader {
589
627
  case Ctx.AttributeText:
590
628
  this.attributeTextValue += text;
591
629
  return;
630
+ case Ctx.StyleBlock:
631
+ // past the longest block read, one more character is enough to say it is too large
632
+ if (this.styleBlock.length <= MAX_STYLE_BLOCK_LENGTH) {
633
+ this.styleBlock += text.slice(0, MAX_STYLE_BLOCK_LENGTH + 1 - this.styleBlock.length);
634
+ }
635
+ return;
592
636
  case Ctx.Skip:
593
637
  return;
594
638
  default:
@@ -672,8 +716,14 @@ class GexfReader {
672
716
  * @param name - the element name
673
717
  * @param local - its local name
674
718
  * @param line - the line
719
+ * @param ns - its namespace
675
720
  */
676
- startInMeta(name, local, line) {
721
+ startInMeta(name, local, line, ns) {
722
+ if (ns === GRAPHTY_XML_NAMESPACE && local === "styles") {
723
+ this.styleBlock = "";
724
+ this.ctx.push(Ctx.StyleBlock);
725
+ return;
726
+ }
677
727
  if (local === "creator" || local === "description" || local === "keywords") {
678
728
  this.metaField = local;
679
729
  this.metaText = "";
@@ -813,7 +863,11 @@ class GexfReader {
813
863
  this.beginSection(attrs, "node", line);
814
864
  return;
815
865
  case "edges":
816
- if (!this.nodesSeen) {
866
+ if (!this.nodesSeen && this.meta.sourceVersion === "1.0") {
867
+ // GEXF 1.0 files (Gephi 0.6) may list their edges before their nodes
868
+ this.edgesFirst = true;
869
+ }
870
+ else if (!this.nodesSeen) {
817
871
  this.report.error("validation-error", MISSING_NODES_CODE, "the graph declares <edges> but no <nodes>", { line });
818
872
  }
819
873
  this.resolveParents();
@@ -1153,7 +1207,10 @@ class GexfReader {
1153
1207
  try {
1154
1208
  const id = this.coerceId(idText, where);
1155
1209
  const existing = sink.indexOf(id);
1156
- if (existing !== INVALID_INDEX) {
1210
+ if (existing !== INVALID_INDEX && this.implicitNodes.delete(existing)) {
1211
+ index = existing;
1212
+ }
1213
+ else if (existing !== INVALID_INDEX) {
1157
1214
  report.warning("validation-error", DUPLICATE_NODE_CODE, `node "${idText}" is declared more than once; later attributes overwrite`, where);
1158
1215
  index = existing;
1159
1216
  }
@@ -1328,15 +1385,8 @@ class GexfReader {
1328
1385
  return false;
1329
1386
  };
1330
1387
  for (const ref of refs) {
1331
- let parent = ref.parentIndex;
1332
- if (ref.parentId !== null) {
1333
- parent = sink.indexOf(ref.parentId);
1334
- if (parent === INVALID_INDEX) {
1335
- report.error("missing-value", UNKNOWN_PARENT_CODE, `pid "${String(ref.parentId)}" names a node the document does not declare`, ref.where);
1336
- continue;
1337
- }
1338
- }
1339
- if (parentOf.get(ref.child) === parent) {
1388
+ const parent = this.parentIndexOf(ref);
1389
+ if (parent === null || parentOf.get(ref.child) === parent) {
1340
1390
  continue;
1341
1391
  }
1342
1392
  if (isAncestorOrSelf(ref.child, parent)) {
@@ -1358,23 +1408,51 @@ class GexfReader {
1358
1408
  * @param lists - the queued `<parents>` lists
1359
1409
  */
1360
1410
  resolveParentsLists(lists) {
1361
- const { sink, report } = this;
1362
1411
  for (const ref of lists) {
1363
- const indices = [];
1364
- for (const id of ref.ids) {
1365
- const parent = sink.indexOf(id);
1366
- if (parent === INVALID_INDEX) {
1367
- report.error("missing-value", UNKNOWN_PARENT_CODE, `<parent for="${String(id)}"> names a node the document does not declare`, ref.where);
1368
- continue;
1369
- }
1370
- indices.push(parent);
1371
- }
1372
- try {
1373
- this.parentsColumn.set(sink, report, ref.child, indices, ref.where);
1374
- }
1375
- catch (err) {
1376
- report.recordError(err, ref.where);
1412
+ this.resolveParentsList(ref);
1413
+ }
1414
+ }
1415
+ /**
1416
+ * The parent a `pid` or a nesting names.
1417
+ * @param ref - the reference
1418
+ * @returns its index, or null when the id names no node (reported)
1419
+ */
1420
+ parentIndexOf(ref) {
1421
+ if (ref.parentId === null) {
1422
+ return ref.parentIndex;
1423
+ }
1424
+ const parent = this.sink.indexOf(ref.parentId);
1425
+ if (parent !== INVALID_INDEX) {
1426
+ return parent;
1427
+ }
1428
+ if (this.meta.sourceVersion === "1.0") {
1429
+ this.report.warnOnce("missing-value", UNKNOWN_PID_CODE, `pid "${String(ref.parentId)}" names no node; GEXF 1.0 files write it on top-level nodes, which stay top-level`, ref.where);
1430
+ }
1431
+ else {
1432
+ this.report.error("missing-value", UNKNOWN_PARENT_CODE, `pid "${String(ref.parentId)}" names a node the document does not declare`, ref.where);
1433
+ }
1434
+ return null;
1435
+ }
1436
+ /**
1437
+ * Resolve one `<parents>` list; an id that names no node is reported and left out.
1438
+ * @param ref - the list
1439
+ */
1440
+ resolveParentsList(ref) {
1441
+ const { sink, report } = this;
1442
+ const indices = [];
1443
+ for (const id of ref.ids) {
1444
+ const parent = sink.indexOf(id);
1445
+ if (parent === INVALID_INDEX) {
1446
+ report.error("missing-value", UNKNOWN_PARENT_CODE, `<parent for="${String(id)}"> names a node the document does not declare`, ref.where);
1447
+ continue;
1377
1448
  }
1449
+ indices.push(parent);
1450
+ }
1451
+ try {
1452
+ this.parentsColumn.set(sink, report, ref.child, indices, ref.where);
1453
+ }
1454
+ catch (err) {
1455
+ report.recordError(err, ref.where);
1378
1456
  }
1379
1457
  }
1380
1458
  // ---------------------------------------------------------------- edges
@@ -1416,16 +1494,10 @@ class GexfReader {
1416
1494
  report.counts.skippedEdges++;
1417
1495
  return;
1418
1496
  }
1419
- let kind = this.defaultKind;
1420
- const typeText = attrs.get("type");
1421
- if (typeText !== undefined) {
1422
- const type = edgeTypeKeyword(typeText);
1423
- if (!EDGE_TYPES.has(type)) {
1424
- report.error("validation-error", EDGE_TYPE_CODE, `edge type "${typeText}" is not directed, undirected or mutual`, where);
1425
- report.counts.skippedEdges++;
1426
- return;
1427
- }
1428
- kind = type;
1497
+ const kind = this.edgeKindOf(attrs, where);
1498
+ if (kind === null) {
1499
+ report.counts.skippedEdges++;
1500
+ return;
1429
1501
  }
1430
1502
  if (idText !== undefined && this.edgeIds.has(idText)) {
1431
1503
  report.error("validation-error", DUPLICATE_EDGE_ID_CODE, `edge id "${idText}" is declared more than once; the edge is skipped`, where);
@@ -1434,9 +1506,7 @@ class GexfReader {
1434
1506
  }
1435
1507
  let index;
1436
1508
  try {
1437
- const source = this.coerceId(sourceText, where);
1438
- const target = this.coerceId(targetText, where);
1439
- this.requireDeclaredEndpoints(source, target, sourceText, targetText);
1509
+ const [source, target] = this.endpoints(sourceText, targetText, where);
1440
1510
  const weight = this.xmlWeight(attrs, where);
1441
1511
  const before = sink.edgeCount;
1442
1512
  index = this.resolver.addEdge(source, target, kind, weight, where);
@@ -1456,40 +1526,63 @@ class GexfReader {
1456
1526
  frame.mirror = this.resolver.lastMirror;
1457
1527
  frame.xmlWeight = attrs.get("weight") ?? null;
1458
1528
  this.edge = frame;
1459
- this.writeEdgeColumns(attrs, index, idText, where);
1529
+ this.writeEdgeAttributes(attrs, index, where);
1460
1530
  }
1461
1531
  /**
1462
- * Throw when addMissingNodes is off and an endpoint names an undeclared node.
1463
- * @param source - the coerced source id
1464
- * @param target - the coerced target id
1465
- * @param sourceText - the source as written
1466
- * @param targetText - the target as written
1532
+ * The kind of an `<edge>`: its `type`, else the graph's default.
1533
+ * @param attrs - its attributes
1534
+ * @param where - where it was read
1535
+ * @returns the kind, or null for a type GEXF does not have (reported)
1467
1536
  */
1468
- requireDeclaredEndpoints(source, target, sourceText, targetText) {
1469
- const { sink, options } = this;
1470
- if (options.addMissingNodes) {
1471
- return;
1537
+ edgeKindOf(attrs, where) {
1538
+ const typeText = attrs.get("type");
1539
+ if (typeText === undefined) {
1540
+ return this.defaultKind;
1472
1541
  }
1473
- if (sink.indexOf(source) === INVALID_INDEX) {
1474
- throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${sourceText}"`, {
1475
- id: source,
1476
- });
1542
+ const type = edgeTypeKeyword(typeText);
1543
+ if (!EDGE_TYPES.has(type)) {
1544
+ this.report.error("validation-error", EDGE_TYPE_CODE, `edge type "${typeText}" is not directed, undirected or mutual`, where);
1545
+ return null;
1477
1546
  }
1478
- if (sink.indexOf(target) === INVALID_INDEX) {
1479
- throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${targetText}"`, {
1480
- id: target,
1547
+ return type;
1548
+ }
1549
+ /**
1550
+ * An edge's endpoints: in GEXF 1.0 with its edges first, a node no `<node>` declared yet is added for now; without
1551
+ * addMissingNodes, a node the document does not declare throws E_UNKNOWN_NODE.
1552
+ * @param sourceText - the source's id text
1553
+ * @param targetText - the target's id text
1554
+ * @param where - where it was read
1555
+ * @returns the ids
1556
+ */
1557
+ endpoints(sourceText, targetText, where) {
1558
+ const { sink } = this;
1559
+ const ends = [this.coerceId(sourceText, where), this.coerceId(targetText, where)];
1560
+ if (this.edgesFirst && !this.nodesSeen) {
1561
+ for (const end of ends) {
1562
+ if (sink.indexOf(end) === INVALID_INDEX) {
1563
+ this.implicitNodes.set(sink.addNode(end), end);
1564
+ this.report.counts.nodes++;
1565
+ }
1566
+ }
1567
+ }
1568
+ const texts = [sourceText, targetText];
1569
+ const unknown = this.options.addMissingNodes ? -1 : ends.findIndex((id) => sink.indexOf(id) === INVALID_INDEX);
1570
+ if (unknown !== -1) {
1571
+ throw new GraphFormatError("E_UNKNOWN_NODE", `edge references undeclared node "${texts[unknown]}"`, {
1572
+ id: ends[unknown],
1481
1573
  });
1482
1574
  }
1575
+ return ends;
1483
1576
  }
1484
1577
  /**
1485
- * Write the id, label, kind and lifetime columns of an added edge; a failure is reported.
1486
- * @param attrs - the edge's attributes
1487
- * @param index - the edge's index
1488
- * @param idText - the edge's id, or undefined
1489
- * @param where - the edge's location
1578
+ * Write an added edge's id, label, kind and lifetime.
1579
+ * @param attrs - its attributes
1580
+ * @param index - its index
1581
+ * @param where - where it was read
1490
1582
  */
1491
- writeEdgeColumns(attrs, index, idText, where) {
1583
+ writeEdgeAttributes(attrs, index, where) {
1492
1584
  const { report, sink } = this;
1585
+ const idText = attrs.get("id");
1493
1586
  try {
1494
1587
  if (idText !== undefined) {
1495
1588
  this.edgeIdColumn.set(sink, report, index, idText, where);
@@ -1508,6 +1601,25 @@ class GexfReader {
1508
1601
  report.recordError(err, where);
1509
1602
  }
1510
1603
  }
1604
+ /**
1605
+ * GEXF 1.0 with its edges first, addMissingNodes false: a node an edge named that no `<node>` declared is an
1606
+ * unknown node, as it is when the nodes come first. It is reported, and it and its edges are removed when the
1607
+ * sink can remove nodes.
1608
+ */
1609
+ dropUndeclaredNodes() {
1610
+ const { sink, report } = this;
1611
+ const removable = sink;
1612
+ for (const [index, id] of this.implicitNodes) {
1613
+ report.error("validation-error", "E_UNKNOWN_NODE", `edge references undeclared node "${String(id)}"`);
1614
+ if (typeof removable.removeNodeByIndex === "function") {
1615
+ const edges = removable.removeNodeByIndex(index);
1616
+ report.counts.nodes--;
1617
+ report.counts.edges -= edges.length;
1618
+ report.counts.skippedEdges += edges.length;
1619
+ }
1620
+ }
1621
+ this.implicitNodes.clear();
1622
+ }
1511
1623
  /**
1512
1624
  * The weight argument of one edge from its `weight` XML attribute; undefined when absent (the
1513
1625
  * sink records a defaulted weight, design section 3.7).
@@ -1611,7 +1723,8 @@ class GexfReader {
1611
1723
  if (index === INVALID_INDEX) {
1612
1724
  return;
1613
1725
  }
1614
- const forId = attrs.get("for");
1726
+ // GEXF 1.0 names the attribute with `id`
1727
+ const forId = attrs.get("for") ?? attrs.get("id");
1615
1728
  const { valueWhere } = this;
1616
1729
  valueWhere.line = line;
1617
1730
  valueWhere.element = element;
@@ -2020,6 +2133,43 @@ class GexfReader {
2020
2133
  }
2021
2134
  }
2022
2135
  // ---------------------------------------------------------------- viz
2136
+ /**
2137
+ * Write a `<viz:position>` into the node position column, declared on first use with the
2138
+ * dimensions the element writes.
2139
+ * @param attrs - its attributes
2140
+ * @param index - the node's index
2141
+ * @param where - the element's location
2142
+ */
2143
+ writeVizPosition(attrs, index, where) {
2144
+ const x = vizNumber(attrs, "x");
2145
+ const y = vizNumber(attrs, "y");
2146
+ const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
2147
+ this.positionColumn ?? (this.positionColumn = new LazyColumn("node", {
2148
+ ...NODE_DECLS.position,
2149
+ extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
2150
+ }));
2151
+ this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
2152
+ }
2153
+ /**
2154
+ * Write a `<viz:shape>` into the shape column, and a node's image `uri` beside it.
2155
+ * @param name - the element name as written
2156
+ * @param attrs - its attributes
2157
+ * @param domain - node or edge
2158
+ * @param index - the element's index
2159
+ * @param where - the element's location
2160
+ */
2161
+ writeVizShape(name, attrs, domain, index, where) {
2162
+ const value = attrs.get("value");
2163
+ if (value === undefined) {
2164
+ throw new GraphFormatError("E_COLUMN_TYPE", "<viz:shape> without a value", { element: name });
2165
+ }
2166
+ const columns = domain === "node" ? this.nodeColumns : this.edgeColumns;
2167
+ columns.shape.set(this.sink, this.report, index, value, where);
2168
+ const uri = attrs.get("uri");
2169
+ if (domain === "node" && uri !== undefined) {
2170
+ this.shapeUriColumn.set(this.sink, this.report, index, uri, where);
2171
+ }
2172
+ }
2023
2173
  /**
2024
2174
  * Write one viz element into its role column; a value that does not parse is a recorded
2025
2175
  * warning and the element is skipped.
@@ -2043,10 +2193,10 @@ class GexfReader {
2043
2193
  try {
2044
2194
  switch (local) {
2045
2195
  case "color":
2046
- columns.color.set(sink, report, index, parseColor(attrs), where);
2196
+ columns.color.set(sink, report, index, this.vizColor(attrs, name, where), where);
2047
2197
  break;
2048
2198
  case "position":
2049
- this.writePosition(attrs, index, where);
2199
+ this.writeVizPosition(attrs, index, where);
2050
2200
  break;
2051
2201
  case "size":
2052
2202
  this.sizeColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
@@ -2055,7 +2205,7 @@ class GexfReader {
2055
2205
  this.thicknessColumn.set(sink, report, index, vizNumber(attrs, "value"), where);
2056
2206
  break;
2057
2207
  case "shape":
2058
- this.writeShape(name, attrs, domain, index, where);
2208
+ this.writeVizShape(name, attrs, domain, index, where);
2059
2209
  break;
2060
2210
  default:
2061
2211
  break;
@@ -2069,41 +2219,37 @@ class GexfReader {
2069
2219
  }
2070
2220
  }
2071
2221
  /**
2072
- * Write a `<viz:position>`.
2073
- * @param attrs - its attributes
2074
- * @param index - the node's index
2075
- * @param where - the node's location
2076
- */
2077
- writePosition(attrs, index, where) {
2078
- const x = vizNumber(attrs, "x");
2079
- const y = vizNumber(attrs, "y");
2080
- const z = attrs.has("z") ? vizNumber(attrs, "z") : 0;
2081
- this.positionColumn ?? (this.positionColumn = new LazyColumn("node", {
2082
- ...NODE_DECLS.position,
2083
- extra: { ...NODE_DECLS.position.extra, sourceDims: attrs.has("z") ? 3 : 2 },
2084
- }));
2085
- this.positionColumn.set(this.sink, this.report, index, [x, y, z], where);
2086
- }
2087
- /**
2088
- * Write a `<viz:shape>` and, on a node, its `uri`.
2222
+ * `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
2223
+ * `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; a channel outside 0..255 or an alpha outside 0..1 is clamped and
2224
+ * reported, as Gephi clamps it.
2225
+ * @param attrs - the element's attributes
2089
2226
  * @param name - the element name as written
2090
- * @param attrs - its attributes
2091
- * @param domain - node or edge
2092
- * @param index - the element's index
2093
2227
  * @param where - the element's location
2228
+ * @returns [r, g, b, a]
2094
2229
  */
2095
- writeShape(name, attrs, domain, index, where) {
2096
- const { sink, report } = this;
2097
- const columns = domain === "node" ? this.nodeColumns : this.edgeColumns;
2098
- const value = attrs.get("value");
2099
- if (value === undefined) {
2100
- throw new GraphFormatError("E_COLUMN_TYPE", "<viz:shape> without a value", { element: name });
2230
+ vizColor(attrs, name, where) {
2231
+ const hex = attrs.get("hex");
2232
+ let rgba;
2233
+ if (hex !== undefined && !attrs.has("r")) {
2234
+ const c = canonVizColor(hex);
2235
+ if (c === null) {
2236
+ throw new GraphFormatError("E_COLUMN_TYPE", `viz hex="${hex}" is not a #RRGGBB, #RGB or #RRGGBBAA color`, { attribute: "hex" });
2237
+ }
2238
+ rgba = [...c];
2239
+ if (attrs.has("a")) {
2240
+ rgba[3] = vizNumber(attrs, "a");
2241
+ }
2101
2242
  }
2102
- columns.shape.set(sink, report, index, value, where);
2103
- const uri = attrs.get("uri");
2104
- if (domain === "node" && uri !== undefined) {
2105
- this.shapeUriColumn.set(sink, report, index, uri, where);
2243
+ else {
2244
+ rgba = [vizNumber(attrs, "r"), vizNumber(attrs, "g"), vizNumber(attrs, "b")];
2245
+ rgba.push(attrs.has("a") ? vizNumber(attrs, "a") : 1);
2106
2246
  }
2247
+ const max = [255, 255, 255, 1];
2248
+ if (rgba.some((v, i) => v < 0 || v > max[i])) {
2249
+ this.report.warning("validation-error", VIZ_VALUE_CODE, `<${name}> has a channel outside 0..255 or an alpha outside 0..1; clamped`, where);
2250
+ rgba = rgba.map((v, i) => Math.max(0, Math.min(max[i], v)));
2251
+ }
2252
+ return [rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, rgba[3]];
2107
2253
  }
2108
2254
  // ---------------------------------------------------------------- helpers
2109
2255
  /**
@@ -2260,35 +2406,6 @@ function vizNumber(attrs, name) {
2260
2406
  }
2261
2407
  return value;
2262
2408
  }
2263
- /**
2264
- * Parse `<viz:color r g b a hex>` into rgba in 0..1 (design section 5.5: role color, f32 x4).
2265
- * @param attrs - the element's attributes
2266
- * @returns [r, g, b, a]
2267
- */
2268
- function parseColor(attrs) {
2269
- let r;
2270
- let g;
2271
- let b;
2272
- const hex = attrs.get("hex");
2273
- if (hex !== undefined && !attrs.has("r")) {
2274
- const digits = hex.startsWith("#") ? hex.slice(1) : hex;
2275
- if (!/^[0-9a-fA-F]{6}$/.test(digits)) {
2276
- throw new GraphFormatError("E_COLUMN_TYPE", `viz hex="${hex}" is not a #RRGGBB color`, {
2277
- attribute: "hex",
2278
- });
2279
- }
2280
- r = Number.parseInt(digits.slice(0, 2), 16);
2281
- g = Number.parseInt(digits.slice(2, 4), 16);
2282
- b = Number.parseInt(digits.slice(4, 6), 16);
2283
- }
2284
- else {
2285
- r = vizNumber(attrs, "r");
2286
- g = vizNumber(attrs, "g");
2287
- b = vizNumber(attrs, "b");
2288
- }
2289
- const a = attrs.has("a") ? vizNumber(attrs, "a") : 1;
2290
- return [r / 255, g / 255, b / 255, a];
2291
- }
2292
2409
  /** A head that starts with markup, after an optional byte-order mark and whitespace. */
2293
2410
  const XML_START = /^\uFEFF?\s*</;
2294
2411
  /**
@@ -2336,6 +2453,7 @@ export const gexfImporter = Object.freeze({
2336
2453
  extensions: Object.freeze([".gexf"]),
2337
2454
  mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
2338
2455
  sniff: sniffGexf,
2456
+ styles: gexfStyles,
2339
2457
  /**
2340
2458
  * Read a GEXF document into the sink in one streaming pass.
2341
2459
  * @param input - the document as text, bytes, a stream or chunks
@@ -2364,7 +2482,9 @@ export const gexfImporter = Object.freeze({
2364
2482
  report.fail(EMPTY_INPUT_CODE, "the input is empty (no markup at all)", { line: err.line });
2365
2483
  }
2366
2484
  if (err instanceof XmlSyntaxError) {
2367
- report.fail(XML_SYNTAX_CODE, err.message, { line: err.line });
2485
+ report.fail(err instanceof XmlNestingError ? XML_NESTING_CODE : XML_SYNTAX_CODE, err.message, {
2486
+ line: err.line,
2487
+ });
2368
2488
  }
2369
2489
  throw err;
2370
2490
  }