@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
@@ -0,0 +1,400 @@
1
+ /**
2
+ * The styles of XGMML files and Cytoscape 2.x session networks: Cytoscape writes every element's RESOLVED visual
3
+ * properties into its `<graphics>` (XML attributes in the old spelling, nested `<att>` elements named for the visual
4
+ * property, and the locked ones under `lockedVisualProperties`), and no style. The reader turns those values into
5
+ * the neutral vocabulary; the planner explains them. The writer does the reverse from what graphty draws.
6
+ */
7
+
8
+ import type { GraphSnapshot } from "@graphty/graph-format";
9
+
10
+ import { STYLE_ISSUE } from "../../styles/codes.js";
11
+ import {
12
+ type CytoscapeDialect,
13
+ cytoscapeElementProperties,
14
+ cytoscapeWritableProperties,
15
+ } from "../../styles/cytoscape/emit.js";
16
+ import { normalizeVisualProperties } from "../../styles/cytoscape/lexicon.js";
17
+ import { emptyCytoscapeStyle } from "../../styles/cytoscape/mappings.js";
18
+ import { cytoscapeBackground, type CytoscapeBypass, resolveCytoscapeBypasses } from "../../styles/cytoscape/resolve.js";
19
+ import { blockStyles, parseStyleBlock, STYLE_BLOCK_NAME } from "../../styles/io/block.js";
20
+ import type { ExporterStyleInput } from "../../styles/io/writer.js";
21
+ import { StyleNotes } from "../../styles/notes.js";
22
+ import { styleFingerprint } from "../../styles/plan/features.js";
23
+ import { plainCell, resolveStyles } from "../../styles/plan/resolve.js";
24
+ import type {
25
+ EdgeStyleProperty,
26
+ GraphStyle,
27
+ ImporterStyles,
28
+ NodeStyleProperty,
29
+ ReaderOutput,
30
+ StyleColumn,
31
+ StyleProperty,
32
+ StyleReadContext,
33
+ StyleTarget,
34
+ StyleTool,
35
+ StyleValue,
36
+ StyleWriteCapabilities,
37
+ } from "../../styles/types.js";
38
+ import type { LossNote } from "../../types.js";
39
+ import { lossOf } from "../cx/styles.js";
40
+ import { GRAPHICS_COLUMN, XGMML_ORIGIN_NAMESPACE } from "./constants.js";
41
+
42
+ type Table = GraphSnapshot["nodes"];
43
+
44
+ /**
45
+ * The name of a table's graphics column: the json column the XGMML reader keeps `<graphics>` in.
46
+ * @param table - the node, edge or graph table
47
+ * @returns the column's name, or null
48
+ */
49
+ function graphicsColumnOf(table: Table): string | null {
50
+ for (const col of table) {
51
+ const { origin } = col.meta;
52
+ if (col.dtype === "json" && origin?.type === "graphics" && origin.namespace === XGMML_ORIGIN_NAMESPACE) {
53
+ return col.meta.name;
54
+ }
55
+ }
56
+ return table.get(GRAPHICS_COLUMN)?.dtype === "json" ? GRAPHICS_COLUMN : null;
57
+ }
58
+
59
+ /**
60
+ * Each element's visual properties from its graphics: the graphics values normalized to visual property names, the
61
+ * locked ones (`lockedVisualProperties`, a session view's bypasses) on top.
62
+ * @param table - the node or edge table
63
+ * @param target - nodes or edges
64
+ * @param n - the element count
65
+ * @param notes - where too-deep nesting is noted
66
+ * @returns per element, its visual properties (null without graphics)
67
+ */
68
+ export function graphicsBypasses(table: Table, target: StyleTarget, n: number, notes: StyleNotes): CytoscapeBypass[] {
69
+ const out = new Array<CytoscapeBypass>(n).fill(null);
70
+ const name = graphicsColumnOf(table);
71
+ if (name === null) {
72
+ return out;
73
+ }
74
+ for (let i = 0; i < n; i++) {
75
+ const g = plainCell(table.value(name, i));
76
+ if (g === null || typeof g !== "object" || Array.isArray(g)) {
77
+ continue;
78
+ }
79
+ const map = normalizeVisualProperties(target, g, notes);
80
+ const locked = Object.hasOwn(g, "lockedVisualProperties")
81
+ ? (g as Record<string, unknown>).lockedVisualProperties
82
+ : undefined;
83
+ if (locked !== null && typeof locked === "object") {
84
+ for (const [k, v] of normalizeVisualProperties(target, locked, notes)) {
85
+ map.set(k, v);
86
+ }
87
+ }
88
+ out[i] = map.size > 0 ? map : null;
89
+ }
90
+ return out;
91
+ }
92
+
93
+ /** What the XGMML style reader is told by its caller. */
94
+ interface XgmmlStyleSettings {
95
+ /** Whose defaults fill what the file leaves unset. */
96
+ readonly tool: StyleTool;
97
+ /** A bool column marking hidden elements (a Cytoscape 2.x session's hidden state), or null. */
98
+ readonly hiddenColumn?: string | null;
99
+ }
100
+
101
+ /**
102
+ * The styles of a graph whose elements carry Cytoscape's resolved visual properties in their graphics.
103
+ * @param snapshot - the graph
104
+ * @param context - the budget and cancel signal
105
+ * @param settings - the tool and the hidden-state column
106
+ * @returns the styles (canonical values, no declared rules)
107
+ */
108
+ export function readXgmmlStyles(
109
+ snapshot: GraphSnapshot,
110
+ context: StyleReadContext,
111
+ settings: XgmmlStyleSettings,
112
+ ): ImporterStyles {
113
+ const notes = new StyleNotes();
114
+ const out: Record<StyleTarget, ReaderOutput> = { node: { values: {} }, edge: { values: {} } };
115
+ for (const target of ["node", "edge"] as const) {
116
+ context.signal?.throwIfAborted();
117
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
118
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
119
+ const maps = graphicsBypasses(table, target, n, notes);
120
+ const values = maps.some((m) => m !== null)
121
+ ? resolveCytoscapeBypasses(target, maps, { notes, budget: context.budget })
122
+ : {};
123
+ hiddenToVisible(table, settings.hiddenColumn ?? null, n, values);
124
+ exactFromBlock(snapshot, target, values);
125
+ out[target] = { values: nonEmpty(values) };
126
+ }
127
+ return {
128
+ canonical: true,
129
+ dialect: "cytoscape",
130
+ tool: settings.tool,
131
+ units: "px",
132
+ node: out.node,
133
+ edge: out.edge,
134
+ graph: graphStyleOf(snapshot, notes),
135
+ notes: notes.list(),
136
+ };
137
+ }
138
+
139
+ /**
140
+ * The styles of an XGMML file: its elements' resolved values, with Cytoscape desktop's default style beneath.
141
+ * @param snapshot - the graph
142
+ * @param context - the budget and cancel signal
143
+ * @returns the styles
144
+ */
145
+ export function readXgmmlFileStyles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {
146
+ return readXgmmlStyles(snapshot, context, { tool: "cytoscape" });
147
+ }
148
+
149
+ /**
150
+ * For a file graphty wrote: where an element's value is what the writer's nearest Cytoscape value of the
151
+ * `graphty.styles` block's value reads back as (a font family list written as its first family, a shape Cytoscape
152
+ * does not have), the block's exact value is the truth, so a re-import gives the same rules. A value that differs
153
+ * from what graphty wrote (another program edited it) stays the truth.
154
+ * @param snapshot - the graph
155
+ * @param target - nodes or edges
156
+ * @param values - the values per property, changed in place
157
+ * @param dialect - the Cytoscape dialect the file's values are written in
158
+ */
159
+ export function exactFromBlock(
160
+ snapshot: GraphSnapshot,
161
+ target: StyleTarget,
162
+ values: Partial<Record<string, StyleColumn>>,
163
+ dialect: CytoscapeDialect = "desktop",
164
+ ): void {
165
+ const text = snapshot.graph.has(STYLE_BLOCK_NAME) ? plainCell(snapshot.graph.value(STYLE_BLOCK_NAME, 0)) : null;
166
+ if (typeof text !== "string") {
167
+ return;
168
+ }
169
+ const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
170
+ const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "xgmml") : null;
171
+ if (ex === null) {
172
+ return;
173
+ }
174
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
175
+ const want = new Map<string, readonly (StyleValue | null)[]>();
176
+ const exact = (property: string): readonly (StyleValue | null)[] => {
177
+ let held = want.get(property);
178
+ if (held === undefined) {
179
+ held = resolveStyles(ex, target, property as StyleProperty, snapshot);
180
+ want.set(property, held);
181
+ }
182
+ return held;
183
+ };
184
+ // What each element's exact values are written as, read back the way the file is read.
185
+ const written = Array.from({ length: n }, (_v, i) =>
186
+ cytoscapeElementProperties(
187
+ target,
188
+ (property) => exact(property)[i] ?? null,
189
+ dialect,
190
+ () => undefined,
191
+ ),
192
+ );
193
+ const readBack = resolveCytoscapeBypasses(target, written, { notes: new StyleNotes() });
194
+ for (const [property, native] of Object.entries(values)) {
195
+ const back = readBack[property];
196
+ if (native !== undefined && back !== undefined) {
197
+ values[property] = withBlockValues(native, back, exact(property));
198
+ }
199
+ }
200
+ }
201
+
202
+ /**
203
+ * A property's values with the block's exact value wherever the file's value is what the writer wrote for it.
204
+ * @param native - the file's values
205
+ * @param back - what the writer wrote for the block's values, read back
206
+ * @param w - the block's values
207
+ * @returns the values, the file's own array when none changes
208
+ */
209
+ function withBlockValues(
210
+ native: StyleColumn,
211
+ back: readonly (StyleValue | null)[],
212
+ w: readonly (StyleValue | null)[],
213
+ ): StyleColumn {
214
+ let changed: (StyleValue | null)[] | null = null;
215
+ for (let i = 0; i < native.length; i++) {
216
+ if (w[i] !== null && native[i] !== w[i] && native[i] === back[i]) {
217
+ changed ??= [...native];
218
+ changed[i] = w[i];
219
+ }
220
+ }
221
+ return changed ?? native;
222
+ }
223
+
224
+ /**
225
+ * Marks the elements a hidden-state column holds true as not visible.
226
+ * @param table - the node or edge table
227
+ * @param column - the bool column, or null
228
+ * @param n - the element count
229
+ * @param values - the values per property, changed in place
230
+ */
231
+ export function hiddenToVisible(
232
+ table: Table,
233
+ column: string | null,
234
+ n: number,
235
+ values: Partial<Record<string, StyleColumn>>,
236
+ ): void {
237
+ if (column === null || !table.has(column)) {
238
+ return;
239
+ }
240
+ let visible: (StyleValue | null)[] | null = null;
241
+ for (let i = 0; i < n; i++) {
242
+ if (plainCell(table.value(column, i)) === true) {
243
+ visible ??= values.visible === undefined ? new Array<StyleValue | null>(n).fill(null) : [...values.visible];
244
+ visible[i] = false;
245
+ }
246
+ }
247
+ if (visible !== null) {
248
+ values.visible = visible;
249
+ }
250
+ }
251
+
252
+ /**
253
+ * The properties with at least one value.
254
+ * @param values - per property, each element's value
255
+ * @returns the same without all-null properties
256
+ */
257
+ export function nonEmpty(values: Partial<Record<string, StyleColumn>>): Partial<Record<StyleProperty, StyleColumn>> {
258
+ const out: Partial<Record<string, StyleColumn>> = {};
259
+ for (const [p, col] of Object.entries(values)) {
260
+ if (col?.some((v) => v !== null) === true) {
261
+ out[p] = col;
262
+ }
263
+ }
264
+ return out;
265
+ }
266
+
267
+ /**
268
+ * The graph's background from its own graphics (`NETWORK_BACKGROUND_PAINT`).
269
+ * @param snapshot - the graph
270
+ * @param notes - where a bad value is noted
271
+ * @returns the graph style
272
+ */
273
+ function graphStyleOf(snapshot: GraphSnapshot, notes: StyleNotes): GraphStyle {
274
+ const name = graphicsColumnOf(snapshot.graph);
275
+ const g = name === null ? null : plainCell(snapshot.graph.value(name, 0));
276
+ if (g === null || typeof g !== "object") {
277
+ return {};
278
+ }
279
+ const style = emptyCytoscapeStyle();
280
+ for (const [k, v] of normalizeVisualProperties("node", g, notes)) {
281
+ if (k.startsWith("NETWORK_")) {
282
+ style.network.defaults.set(k, v);
283
+ }
284
+ }
285
+ const background = cytoscapeBackground(style, notes);
286
+ return background === null ? {} : { background };
287
+ }
288
+
289
+ // ------------------------------------------------------------------ writing
290
+
291
+ /**
292
+ * What the XGMML writer holds natively: every visual property Cytoscape keeps per element, and the graph's
293
+ * background. The block and the tagged values go into graph and element `<att>`s.
294
+ */
295
+ export const XGMML_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({
296
+ node: Object.freeze(cytoscapeWritableProperties("node", "desktop") as NodeStyleProperty[]),
297
+ edge: Object.freeze(cytoscapeWritableProperties("edge", "desktop") as EdgeStyleProperty[]),
298
+ graph: Object.freeze(["background"] as const),
299
+ block: "attributes",
300
+ });
301
+
302
+ /** The visual properties Cytoscape also writes as `<graphics>` XML attributes, in its old spelling. */
303
+ const XML_ATTRIBUTES: Readonly<Record<StyleTarget, readonly (readonly [vp: string, attribute: string])[]>> = {
304
+ node: [
305
+ ["NODE_SHAPE", "type"],
306
+ ["NODE_HEIGHT", "h"],
307
+ ["NODE_WIDTH", "w"],
308
+ ["NODE_FILL_COLOR", "fill"],
309
+ ["NODE_BORDER_WIDTH", "width"],
310
+ ["NODE_BORDER_PAINT", "outline"],
311
+ ],
312
+ edge: [
313
+ ["EDGE_WIDTH", "width"],
314
+ ["EDGE_STROKE_UNSELECTED_PAINT", "fill"],
315
+ ],
316
+ };
317
+
318
+ /**
319
+ * One element's graphics record for a file written with styles: what graphty draws as Cytoscape visual properties,
320
+ * the six classic ones also as XML attributes (the importer reads both alike), over the kept graphics' visual
321
+ * properties no neutral property carries (custom graphics, label widths) and edge bends.
322
+ * @param target - nodes or edges
323
+ * @param styles - the exporter's style input
324
+ * @param i - the element index
325
+ * @param kept - the element's kept graphics record, or null
326
+ * @returns the record, or null when there is nothing to write
327
+ */
328
+ export function styledGraphics(
329
+ target: StyleTarget,
330
+ styles: ExporterStyleInput,
331
+ i: number,
332
+ kept: Record<string, unknown> | null,
333
+ ): Record<string, unknown> | null {
334
+ const vps = cytoscapeElementProperties(
335
+ target,
336
+ (p) => styles.picture(target, p as StyleProperty)[i] ?? null,
337
+ "desktop",
338
+ () => undefined,
339
+ );
340
+ const out: Record<string, unknown> = {};
341
+ for (const [vp, attribute] of XML_ATTRIBUTES[target]) {
342
+ if (vps.has(vp)) {
343
+ out[attribute] = String(vps.get(vp));
344
+ }
345
+ }
346
+ for (const [k, v] of Object.entries(kept ?? {})) {
347
+ // a kept visual property the picture does not write, or the edge's bends; old-spelling and nested keys
348
+ // would be read before the picture's values and contradict them
349
+ if (k === "Line" || (/^[A-Z][A-Z_0-9]+$/.test(k) && !vps.has(k))) {
350
+ out[k] = v;
351
+ }
352
+ }
353
+ for (const [vp, v] of vps) {
354
+ out[vp] = String(v);
355
+ }
356
+ return Object.keys(out).length === 0 ? null : out;
357
+ }
358
+
359
+ /**
360
+ * What writing every element's graphics with styles loses: each value written as the nearest one Cytoscape allows,
361
+ * counted per element.
362
+ * @param styles - the exporter's style input
363
+ * @param snapshot - the graph
364
+ * @returns the loss notes
365
+ */
366
+ export function styledGraphicsNotes(styles: ExporterStyleInput, snapshot: GraphSnapshot): LossNote[] {
367
+ const notes = new StyleNotes();
368
+ for (const target of ["node", "edge"] as const) {
369
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
370
+ for (let i = 0; i < n; i++) {
371
+ cytoscapeElementProperties(
372
+ target,
373
+ (p) => styles.picture(target, p as StyleProperty)[i] ?? null,
374
+ "desktop",
375
+ (p) => {
376
+ notes.add(STYLE_ISSUE.APPROXIMATED, target, p, { element: i });
377
+ },
378
+ );
379
+ }
380
+ }
381
+ return notes.list().map(lossOf);
382
+ }
383
+
384
+ /**
385
+ * The graph's graphics record for a file written with styles: the kept record with the background replaced.
386
+ * @param styles - the exporter's style input
387
+ * @param kept - the kept graph graphics, or null
388
+ * @returns the record, or null
389
+ */
390
+ export function styledGraphGraphics(
391
+ styles: ExporterStyleInput,
392
+ kept: Record<string, unknown> | null,
393
+ ): Record<string, unknown> | null {
394
+ const { background } = styles.rules.styles.graph;
395
+ const out: Record<string, unknown> = { ...kept };
396
+ if (background !== undefined) {
397
+ out.NETWORK_BACKGROUND_PAINT = background.toUpperCase();
398
+ }
399
+ return Object.keys(out).length === 0 ? null : out;
400
+ }
package/src/index.ts CHANGED
@@ -139,6 +139,8 @@ export {
139
139
  export {
140
140
  DOT_ISSUE,
141
141
  DOT_LOSS,
142
+ DOT_STYLE_BLOCK_ATTRIBUTE,
143
+ DOT_STYLE_CAPABILITIES,
142
144
  dotExporter,
143
145
  type DotExportOptions,
144
146
  dotImporter,
@@ -148,15 +150,19 @@ export {
148
150
  GEXF_1_2_CAPABILITIES,
149
151
  GEXF_ISSUE,
150
152
  GEXF_LOSS,
153
+ GEXF_STYLE_CAPABILITIES,
151
154
  gexfExporter,
152
155
  type GexfExportOptions,
153
156
  gexfImporter,
154
157
  type GexfImportOptions,
155
158
  type GexfVersion,
159
+ GRAPHTY_XML_NAMESPACE,
156
160
  } from "./formats/gexf/index.js";
157
161
  export {
158
162
  GML_ISSUE,
159
163
  GML_LOSS,
164
+ GML_STYLE_BLOCK_KEY,
165
+ GML_STYLE_CAPABILITIES,
160
166
  gmlExporter,
161
167
  type GmlExportOptions,
162
168
  gmlImporter,
@@ -165,6 +171,7 @@ export {
165
171
  export {
166
172
  GRAPHML_ISSUE,
167
173
  GRAPHML_LOSS,
174
+ GRAPHML_STYLE_CAPABILITIES,
168
175
  graphmlExporter,
169
176
  type GraphmlExportOptions,
170
177
  graphmlImporter,
@@ -212,6 +219,8 @@ export {
212
219
  export {
213
220
  PAJEK_ISSUE,
214
221
  PAJEK_LOSS,
222
+ PAJEK_STYLE_CAPABILITIES,
223
+ PAJEK_STYLE_COMMENT,
215
224
  pajekExporter,
216
225
  type PajekExportOptions,
217
226
  pajekImporter,
@@ -304,6 +313,7 @@ export {
304
313
  ImportReportBuilder,
305
314
  isAbortError,
306
315
  type IssueLocation,
316
+ keptForStyles,
307
317
  type MutableCounts,
308
318
  PARSE_ERROR_CODE,
309
319
  } from "./common/report.js";
@@ -333,10 +343,16 @@ export {
333
343
  } from "./common/writer.js";
334
344
  export {
335
345
  hasIllegalXmlChar,
346
+ MAX_XML_DEPTH,
336
347
  tokenizeXml,
337
348
  type XmlHandler,
338
349
  xmlIllegalTextNotes,
350
+ XmlNestingError,
339
351
  type XmlRepairs,
340
352
  XmlSyntaxError,
341
353
  XmlTokenizer,
342
354
  } from "./common/xml.js";
355
+
356
+ // ============================================================ styles through the importer and exporter contracts
357
+ export type { StyleImportOptions } from "./styles/io/generic.js";
358
+ export type { ExporterStyleInput, ExporterStyleOptions } from "./styles/io/writer.js";
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The note codes of `extractPositions()`. Singular `W_POSITION_*` codes are about some nodes,
3
+ * plural `W_POSITIONS_*` codes about the file as a whole. Keys drop the `W_` and `POSITION_` /
4
+ * `POSITIONS_` prefixes.
5
+ */
6
+
7
+ /**
8
+ * Every code a `PositionNote` carries.
9
+ * @category Positions
10
+ */
11
+ export const POSITION_ISSUE = Object.freeze({
12
+ /** Every placed node sits on one point; the coordinates are dropped and `usable` is false. */
13
+ STACKED: "W_POSITION_STACKED",
14
+ /** Some nodes have no position. */
15
+ PARTIAL: "W_POSITION_PARTIAL",
16
+ /** Some coordinates are not finite numbers; those nodes count as unplaced. */
17
+ NON_FINITE: "W_POSITION_NON_FINITE",
18
+ /** The file mixes 2- and 3-coordinate positions. */
19
+ DIMS_MIXED: "W_POSITION_DIMS_MIXED",
20
+ /** A top-left coordinate has no width or height, so it was not moved to the center. */
21
+ ANCHOR_NO_SIZE: "W_POSITION_ANCHOR_NO_SIZE",
22
+ /** The file holds more than one view (layout); only the first is used. */
23
+ OTHER_VIEWS: "W_POSITION_OTHER_VIEWS",
24
+ /** The file has position-like columns this format does not read (plain `x` / `y`). */
25
+ NOT_READ: "W_POSITIONS_NOT_READ",
26
+ } as const);
27
+
28
+ /**
29
+ * A code of `POSITION_ISSUE`.
30
+ * @category Positions
31
+ */
32
+ export type PositionNoteCode = (typeof POSITION_ISSUE)[keyof typeof POSITION_ISSUE];
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The coordinate conversions between a file's spelling and the neutral convention (center, y up):
3
+ * the y flip, the top-left anchor shift, and `toFilePositions()`, the inverse a writer uses. Format
4
+ * modules import from here, so they never pull in the reader.
5
+ */
6
+
7
+ import type { PositionColumnExtra } from "./types.js";
8
+
9
+ /**
10
+ * A y that grows downward as one that grows upward, and back: a negation that never yields -0.
11
+ * @param y - the coordinate
12
+ * @returns the flipped coordinate
13
+ * @category Positions
14
+ */
15
+ export function flipY(y: number): number {
16
+ return y === 0 ? 0 : -y;
17
+ }
18
+
19
+ /**
20
+ * One coordinate from a file's spelling into the neutral convention, in place.
21
+ * @param p - x, y, z as the file wrote them; becomes the node's center, y up
22
+ * @param extra - how the file spells it
23
+ * @param size - the node's width and height, for a top-left anchor; null when unknown
24
+ * @param realZ - whether the file has a z that differs between nodes
25
+ */
26
+ export function toNeutral(
27
+ p: [number, number, number],
28
+ extra: PositionColumnExtra,
29
+ size: readonly [number, number] | null,
30
+ realZ: boolean,
31
+ ): void {
32
+ if (extra.anchor === "top-left" && size !== null) {
33
+ p[0] += size[0] / 2;
34
+ p[1] += extra.yAxis === "down" ? size[1] / 2 : -size[1] / 2;
35
+ }
36
+ p[2] = realZ ? p[2] - (extra.zOrigin ?? 0) : 0;
37
+ if (extra.yAxis === "down") {
38
+ // with a real z this turns the drawing 180 degrees about x, so a 3D shape is never mirrored
39
+ p[1] = flipY(p[1]);
40
+ p[2] = flipY(p[2]);
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Neutral coordinates (center, y up, as `extractPositions()` returns them) back into a column
46
+ * spelled as `extra` declares, for a writer: the y flip, Pajek's z origin and yEd's top-left corner
47
+ * are undone. Rows that are NaN stay NaN.
48
+ * @param coords - x, y, z per node
49
+ * @param extra - the spelling of the column to write
50
+ * @param sizes - each node's width and height, needed for a top-left anchor
51
+ * @param sizes.width - widths by node index
52
+ * @param sizes.height - heights by node index
53
+ * @returns a new array, x, y, z per node in the file's spelling
54
+ * @category Positions
55
+ */
56
+ export function toFilePositions(
57
+ coords: Float64Array,
58
+ extra: PositionColumnExtra,
59
+ sizes?: { width: Float64Array; height: Float64Array },
60
+ ): Float64Array {
61
+ const out = new Float64Array(coords.length);
62
+ const down = extra.yAxis === "down";
63
+ for (let i = 0; i < coords.length; i += 3) {
64
+ let y = coords[i + 1];
65
+ let z = coords[i + 2];
66
+ if (down) {
67
+ y = flipY(y);
68
+ z = flipY(z);
69
+ }
70
+ out[i] = coords[i];
71
+ out[i + 1] = y;
72
+ out[i + 2] = z === 0 && extra.sourceDims !== 3 ? 0 : z + (extra.zOrigin ?? 0);
73
+ const row = i / 3;
74
+ if (extra.anchor === "top-left" && sizes !== undefined) {
75
+ out[i] -= sizes.width[row] / 2;
76
+ out[i + 1] -= down ? sizes.height[row] / 2 : -sizes.height[row] / 2;
77
+ }
78
+ }
79
+ return out;
80
+ }
81
+
82
+ /**
83
+ * The median of some numbers.
84
+ * @param values - the numbers, reordered in place
85
+ * @returns the median, or null for none
86
+ * @category Positions
87
+ */
88
+ export function median(values: number[]): number | null {
89
+ if (values.length === 0) {
90
+ return null;
91
+ }
92
+ values.sort((a, b) => a - b);
93
+ const mid = values.length >> 1;
94
+ return values.length % 2 === 1 ? values[mid] : (values[mid - 1] + values[mid]) / 2;
95
+ }
96
+
97
+ /**
98
+ * How each built-in writer that writes the position column as it stands spells a coordinate:
99
+ * GML (y down, as yEd draws it) and Pajek (y down, z centered on 0.5). Every other built-in writer
100
+ * either converts the neutral form itself (JSON, XGMML, CX, CX2, Cytoscape sessions, yEd graphics
101
+ * in a styled GraphML) or writes a y-up format (GEXF, DOT).
102
+ */
103
+ const WRITTEN_SPELLING: Readonly<Record<string, PositionColumnExtra>> = {
104
+ gml: { yAxis: "down" },
105
+ pajek: { yAxis: "down", zOrigin: 0.5 },
106
+ };
107
+
108
+ /**
109
+ * Neutral coordinates (center, y up) as a built-in format's writer expects its position column, so
110
+ * a graph whose positions are in the neutral form is written the way up its program draws it.
111
+ * @example
112
+ * ```ts
113
+ * const column = writtenPositions("gml", coords); // y flipped for GML
114
+ * ```
115
+ * @param format - the format being written
116
+ * @param coords - x, y, z per node; NaN for a node with no position
117
+ * @returns the coordinates to write (the same array when the format needs no conversion)
118
+ * @category Positions
119
+ */
120
+ export function writtenPositions(format: string, coords: Float64Array): Float64Array {
121
+ const spelling = WRITTEN_SPELLING[format];
122
+ return spelling === undefined ? coords : toFilePositions(coords, spelling);
123
+ }