@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,1086 @@
1
+ /**
2
+ * yEd styles (yFiles for Java 2.x GraphML): reading every realizer a yEd graphics tree holds (`y:ShapeNode`,
3
+ * `y:GenericNode`, `y:GroupNode`, `y:SVGNode`, `y:PolyLineEdge`, `y:BezierEdge`, ...) into the neutral style
4
+ * vocabulary, and writing a graph's styles back as `y:ShapeNode` and `y:PolyLineEdge` graphics. The trees are the
5
+ * json columns the GraphML importer keeps (tree.ts), never the typed `yfiles.*` columns read from them.
6
+ *
7
+ * The tree helpers here are shared with the yFiles 3 reader.
8
+ */
9
+ import { toFilePositions, toNeutral } from "../../positions/convert.js";
10
+ import { bendsToPoints, canonBends } from "../../styles/canon/bends.js";
11
+ import { canonColor, colorOpacity } from "../../styles/canon/color.js";
12
+ import { canonEnum } from "../../styles/canon/enums.js";
13
+ import { canonNumber } from "../../styles/canon/number.js";
14
+ import { MAX_STYLE_VALUE_LENGTH, noteAt } from "../../styles/canon/site.js";
15
+ import { canonText } from "../../styles/canon/text.js";
16
+ import { STYLE_ISSUE } from "../../styles/codes.js";
17
+ import { StyleApproximations } from "../../styles/io/approximations.js";
18
+ import { plainCell } from "../../styles/plan/resolve.js";
19
+ /**
20
+ * Whether a value is a tree object.
21
+ * @param value - the value
22
+ * @returns true for a non-array object
23
+ */
24
+ export function isTree(value) {
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26
+ }
27
+ /**
28
+ * The local part of an element name: `y:ShapeNode` is `ShapeNode`, whatever the prefix.
29
+ * @param name - the name as written
30
+ * @returns the local name
31
+ */
32
+ export function localOf(name) {
33
+ const colon = name.indexOf(":");
34
+ return colon < 0 ? name : name.slice(colon + 1);
35
+ }
36
+ /**
37
+ * The child elements of a tree node with a local name, in file order.
38
+ * @param node - the tree node
39
+ * @param local - the local name
40
+ * @returns the children
41
+ */
42
+ export function treeChildren(node, local) {
43
+ const out = [];
44
+ if (!isTree(node)) {
45
+ return out;
46
+ }
47
+ for (const key of Object.keys(node)) {
48
+ if (key.startsWith("@_") || key === "#text" || localOf(key) !== local) {
49
+ continue;
50
+ }
51
+ const value = node[key];
52
+ if (Array.isArray(value)) {
53
+ for (const item of value) {
54
+ out.push(item);
55
+ }
56
+ }
57
+ else {
58
+ out.push(value);
59
+ }
60
+ }
61
+ return out;
62
+ }
63
+ /**
64
+ * The first child element of a tree node with a local name.
65
+ * @param node - the tree node
66
+ * @param local - the local name
67
+ * @returns the child, or undefined
68
+ */
69
+ export function treeChild(node, local) {
70
+ if (!isTree(node)) {
71
+ return undefined;
72
+ }
73
+ for (const key of Object.keys(node)) {
74
+ if (!key.startsWith("@_") && key !== "#text" && localOf(key) === local) {
75
+ const value = node[key];
76
+ return Array.isArray(value) ? value[0] : value;
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ /**
82
+ * An attribute of a tree node.
83
+ * @param node - the tree node
84
+ * @param name - the attribute name as written
85
+ * @returns its text, or undefined
86
+ */
87
+ export function treeAttr(node, name) {
88
+ if (!isTree(node) || !Object.hasOwn(node, `@_${name}`)) {
89
+ return undefined;
90
+ }
91
+ const value = node[`@_${name}`];
92
+ return typeof value === "string" ? value : undefined;
93
+ }
94
+ /**
95
+ * The text of an element: the element itself when it has neither attributes nor children, else its `#text`.
96
+ * @param node - the tree node
97
+ * @returns the text, or null
98
+ */
99
+ export function treeText(node) {
100
+ if (typeof node === "string") {
101
+ return node;
102
+ }
103
+ if (isTree(node) && Object.hasOwn(node, "#text")) {
104
+ const text = node["#text"];
105
+ return typeof text === "string" ? text : null;
106
+ }
107
+ return null;
108
+ }
109
+ /**
110
+ * The json columns of a table holding yFiles trees.
111
+ * @param table - the node, edge or graph table
112
+ * @returns their names
113
+ */
114
+ function treeColumns(table) {
115
+ const out = [];
116
+ for (const col of table) {
117
+ if (col.dtype === "json" && col.meta.origin?.namespace === "yfiles") {
118
+ out.push(col.meta.name);
119
+ }
120
+ }
121
+ return out;
122
+ }
123
+ /**
124
+ * Every column of a table the GraphML importer made from yFiles keys: the trees and the typed `yfiles.*` columns
125
+ * read from them. They hold the styles themselves, so the planner never explains a style with them.
126
+ * @param table - the node or edge table
127
+ * @returns their names
128
+ */
129
+ export function yfilesColumns(table) {
130
+ const out = [];
131
+ for (const col of table) {
132
+ if (col.meta.origin?.namespace === "yfiles") {
133
+ out.push(col.meta.name);
134
+ }
135
+ }
136
+ return out;
137
+ }
138
+ /** The yEd node realizers, by local name. */
139
+ const NODE_REALIZERS = new Set([
140
+ "ShapeNode",
141
+ "GenericNode",
142
+ "GroupNode",
143
+ "GenericGroupNode",
144
+ "SVGNode",
145
+ "ImageNode",
146
+ "TableNode",
147
+ "UMLClassNode",
148
+ "UMLNoteNode",
149
+ "ProxyAutoBoundsNode",
150
+ ]);
151
+ /** The yEd edge realizers, by local name. */
152
+ const EDGE_REALIZERS = new Set([
153
+ "PolyLineEdge",
154
+ "ArcEdge",
155
+ "BezierEdge",
156
+ "QuadCurveEdge",
157
+ "SplineEdge",
158
+ "GenericEdge",
159
+ ]);
160
+ /**
161
+ * The realizer a graphics tree holds; a `y:ProxyAutoBoundsNode` (a folder or group) gives its active realizer.
162
+ * @param tree - the `<data>` content
163
+ * @param names - the realizer names of the target
164
+ * @returns the realizer, or null
165
+ */
166
+ function realizerOf(tree, names) {
167
+ if (!isTree(tree)) {
168
+ return null;
169
+ }
170
+ for (const key of Object.keys(tree)) {
171
+ const type = localOf(key);
172
+ if (key.startsWith("@_") || !names.has(type)) {
173
+ continue;
174
+ }
175
+ const value = tree[key];
176
+ const r = Array.isArray(value) ? value[0] : value;
177
+ return type === "ProxyAutoBoundsNode" ? activeRealizer(r) : { type, r };
178
+ }
179
+ return null;
180
+ }
181
+ /**
182
+ * The active realizer of a `y:ProxyAutoBoundsNode`, else its first.
183
+ * @param proxy - the proxy element
184
+ * @returns the realizer, or null when it has none
185
+ */
186
+ function activeRealizer(proxy) {
187
+ const realizers = treeChild(proxy, "Realizers");
188
+ const all = [];
189
+ if (isTree(realizers)) {
190
+ for (const k of Object.keys(realizers).filter((key) => !key.startsWith("@_") && key !== "#text")) {
191
+ for (const item of treeChildren(realizers, localOf(k))) {
192
+ all.push({ type: localOf(k), r: item });
193
+ }
194
+ }
195
+ }
196
+ const active = Number(treeAttr(realizers, "active") ?? "0");
197
+ return all[Number.isInteger(active) && active >= 0 && active < all.length ? active : 0] ?? null;
198
+ }
199
+ /**
200
+ * yEd's flowchart palette (`com.yworks.flowchart.<name>`), by name, to the shape each draws. Matched whole, before
201
+ * the words below: "data" is a parallelogram, but "storedData" and "directData" are not.
202
+ */
203
+ const FLOWCHART_SHAPES = new Map([
204
+ ["process", "rectangle"],
205
+ ["decision", "diamond"],
206
+ ["terminator", "round-rectangle"],
207
+ ["start1", "ellipse"],
208
+ ["start2", "ellipse"],
209
+ ["data", "parallelogram"],
210
+ ["preparation", "hexagon"],
211
+ ]);
212
+ const FLOWCHART_PREFIX = "com.yworks.flowchart.";
213
+ /**
214
+ * The shape a yEd flowchart configuration draws: a GraphML GenericNode's `configuration`, or a yEd GML node's
215
+ * `customconfiguration`.
216
+ * @param configuration - the configuration
217
+ * @returns the neutral shape, or null for a configuration that is not one of the flowchart shapes known here
218
+ */
219
+ export function flowchartShape(configuration) {
220
+ return configuration.startsWith(FLOWCHART_PREFIX)
221
+ ? (FLOWCHART_SHAPES.get(configuration.slice(FLOWCHART_PREFIX.length)) ?? null)
222
+ : null;
223
+ }
224
+ /** GenericNode configurations, by a word they contain, to the shape they draw; the first match wins. */
225
+ const GENERIC_SHAPES = [
226
+ ["ellipse", "ellipse"],
227
+ ["circle", "ellipse"],
228
+ ["oval", "ellipse"],
229
+ ["diamond", "diamond"],
230
+ ["decision", "diamond"],
231
+ ["hexagon", "hexagon"],
232
+ ["octagon", "octagon"],
233
+ ["triangle", "triangle"],
234
+ ["rect", "rectangle"],
235
+ ["process", "rectangle"],
236
+ ["box", "rectangle"],
237
+ ];
238
+ /** yEd's label positions (`modelPosition` of the internal, sides and eight-position models). */
239
+ const YED_POSITIONS = new Map([
240
+ ["c", "center"],
241
+ ["t", "top"],
242
+ ["b", "bottom"],
243
+ ["l", "left"],
244
+ ["r", "right"],
245
+ ["tl", "top-left"],
246
+ ["tr", "top-right"],
247
+ ["bl", "bottom-left"],
248
+ ["br", "bottom-right"],
249
+ ["n", "top"],
250
+ ["s", "bottom"],
251
+ ["e", "right"],
252
+ ["w", "left"],
253
+ ["nw", "top-left"],
254
+ ["ne", "top-right"],
255
+ ["sw", "bottom-left"],
256
+ ["se", "bottom-right"],
257
+ ]);
258
+ /** yEd's font styles, as label weight and italic. */
259
+ export const FONT_STYLES = new Map([
260
+ ["plain", ["normal", false]],
261
+ ["bold", ["bold", false]],
262
+ ["italic", ["normal", true]],
263
+ ["bolditalic", ["bold", true]],
264
+ ]);
265
+ /**
266
+ * Reads a color into a property and its alpha into the property's opacity (or notes the alpha dropped).
267
+ * @param raw - the attribute
268
+ * @param property - the color property
269
+ * @param opacity - its opacity property, or null when it has none
270
+ * @param put - receives the values
271
+ * @param at - the sites
272
+ */
273
+ function readColor(raw, property, opacity, put, at) {
274
+ const c = canonColor(raw, "yed", at(property));
275
+ if (c === null) {
276
+ return;
277
+ }
278
+ put(property, c.color);
279
+ const alpha = colorOpacity(c, null, at(property), opacity !== null);
280
+ if (opacity !== null) {
281
+ put(opacity, alpha);
282
+ }
283
+ }
284
+ /**
285
+ * Reads an element's label: the first visible label with text (yEd icon nodes put an empty, `hasText="false"`
286
+ * label first); further visible labels are noted for the element.
287
+ * @param labels - the label elements, in file order
288
+ * @param node - whether they are node labels (which have a position)
289
+ * @param put - receives the values
290
+ * @param at - the sites
291
+ */
292
+ function readLabels(labels, node, put, at) {
293
+ let label = undefined;
294
+ let text = "";
295
+ let extra = 0;
296
+ for (const l of labels) {
297
+ const t = treeText(l)?.trim() ?? "";
298
+ if (t.length === 0 || treeAttr(l, "visible") === "false" || treeAttr(l, "hasText") === "false") {
299
+ continue;
300
+ }
301
+ if (label === undefined) {
302
+ label = l;
303
+ text = t;
304
+ }
305
+ else {
306
+ extra++;
307
+ }
308
+ }
309
+ if (label === undefined) {
310
+ return;
311
+ }
312
+ if (extra > 0) {
313
+ noteAt(at("label"), STYLE_ISSUE.EXTRA_LABELS, `${String(extra + 1)} labels`);
314
+ }
315
+ put("label", canonText(text, at("label")));
316
+ readLabelLook(label, node, put, at);
317
+ }
318
+ /**
319
+ * Reads a label's look: its color, font and, for a node label, its position.
320
+ * @param label - the label element
321
+ * @param node - whether it is a node label
322
+ * @param put - receives the values
323
+ * @param at - the sites
324
+ */
325
+ function readLabelLook(label, node, put, at) {
326
+ readColor(treeAttr(label, "textColor"), "labelColor", null, put, at);
327
+ put("labelSize", canonNumber(treeAttr(label, "fontSize"), at("labelSize")));
328
+ put("labelFont", canonText(treeAttr(label, "fontFamily"), at("labelFont")));
329
+ const style = treeAttr(label, "fontStyle");
330
+ if (style !== undefined) {
331
+ const known = FONT_STYLES.get(style.trim().toLowerCase());
332
+ if (known === undefined) {
333
+ noteAt(at("labelWeight"), STYLE_ISSUE.UNKNOWN_VALUE, style.slice(0, MAX_STYLE_VALUE_LENGTH));
334
+ }
335
+ else {
336
+ put("labelWeight", known[0]);
337
+ put("labelItalic", known[1]);
338
+ }
339
+ }
340
+ const position = node ? treeAttr(label, "modelPosition") : undefined;
341
+ if (position !== undefined) {
342
+ const known = YED_POSITIONS.get(position.trim().toLowerCase());
343
+ if (known === undefined) {
344
+ noteAt(at("labelPosition"), STYLE_ISSUE.UNKNOWN_VALUE, position.slice(0, MAX_STYLE_VALUE_LENGTH));
345
+ }
346
+ put("labelPosition", known ?? null);
347
+ }
348
+ }
349
+ /**
350
+ * The shape of a node realizer: its `y:Shape` where it has one, a GenericNode's configuration, or the realizer
351
+ * type itself for one that draws an image (SVG, image, table, UML).
352
+ * @param real - the realizer
353
+ * @param at - the sites
354
+ * @returns the shape, or null
355
+ */
356
+ function realizerShape(real, at) {
357
+ const shape = treeChild(real.r, "Shape");
358
+ if (shape !== undefined) {
359
+ return canonEnum("shape", treeAttr(shape, "type"), "yed", at("shape"));
360
+ }
361
+ if (real.type === "ShapeNode" || real.type === "GroupNode" || real.type === "GenericGroupNode") {
362
+ return null;
363
+ }
364
+ if (real.type === "GenericNode") {
365
+ const conf = treeAttr(real.r, "configuration") ?? "";
366
+ const flowchart = flowchartShape(conf);
367
+ if (flowchart !== null) {
368
+ return flowchart;
369
+ }
370
+ const lower = conf.slice(0, MAX_STYLE_VALUE_LENGTH).toLowerCase();
371
+ for (const [word, value] of GENERIC_SHAPES) {
372
+ if (lower.includes(word)) {
373
+ return value;
374
+ }
375
+ }
376
+ if (lower.length === 0) {
377
+ return null;
378
+ }
379
+ noteAt(at("shape"), STYLE_ISSUE.UNKNOWN_VALUE, lower);
380
+ return `other:${lower}`;
381
+ }
382
+ noteAt(at("shape"), STYLE_ISSUE.UNKNOWN_VALUE, real.type);
383
+ return `other:${real.type}`;
384
+ }
385
+ /**
386
+ * Reads one node realizer.
387
+ * @param real - the realizer
388
+ * @param put - receives the values
389
+ * @param at - the sites
390
+ */
391
+ function readNode(real, put, at) {
392
+ const { r } = real;
393
+ const fill = treeChild(r, "Fill");
394
+ if (fill !== undefined) {
395
+ if (treeAttr(fill, "hasColor") === "false" || treeAttr(fill, "transparent") === "true") {
396
+ noteAt(at("fill"), STYLE_ISSUE.NO_FILL, "transparent");
397
+ put("fillOpacity", 0);
398
+ }
399
+ else {
400
+ readColor(treeAttr(fill, "color"), "fill", "fillOpacity", put, at);
401
+ const second = treeAttr(fill, "color2");
402
+ if (second !== undefined) {
403
+ noteAt(at("fill"), STYLE_ISSUE.GRADIENT, second);
404
+ }
405
+ }
406
+ }
407
+ const border = treeChild(r, "BorderStyle");
408
+ if (border !== undefined) {
409
+ if (treeAttr(border, "hasColor") === "false") {
410
+ put("borderWidth", 0);
411
+ }
412
+ else {
413
+ readColor(treeAttr(border, "color"), "borderColor", null, put, at);
414
+ put("borderWidth", canonNumber(treeAttr(border, "width"), at("borderWidth")));
415
+ }
416
+ put("borderStyle", canonEnum("borderStyle", treeAttr(border, "type"), "yed", at("borderStyle")));
417
+ }
418
+ const geometry = treeChild(r, "Geometry");
419
+ put("width", canonNumber(treeAttr(geometry, "width"), at("width")));
420
+ put("height", canonNumber(treeAttr(geometry, "height"), at("height")));
421
+ put("shape", realizerShape(real, at));
422
+ readLabels(treeChildren(r, "NodeLabel"), true, put, at);
423
+ }
424
+ /**
425
+ * Reads one edge realizer.
426
+ * @param real - the realizer
427
+ * @param put - receives the values
428
+ * @param at - the sites
429
+ */
430
+ function readEdge(real, put, at) {
431
+ const { r } = real;
432
+ const line = treeChild(r, "LineStyle");
433
+ if (line !== undefined) {
434
+ readColor(treeAttr(line, "color"), "color", "opacity", put, at);
435
+ put("width", canonNumber(treeAttr(line, "width"), at("width")));
436
+ put("lineStyle", canonEnum("lineStyle", treeAttr(line, "type"), "yed", at("lineStyle")));
437
+ }
438
+ const arrows = treeChild(r, "Arrows");
439
+ if (arrows !== undefined) {
440
+ put("sourceArrow", canonEnum("arrow", treeAttr(arrows, "source"), "yed", at("sourceArrow")));
441
+ put("targetArrow", canonEnum("arrow", treeAttr(arrows, "target"), "yed", at("targetArrow")));
442
+ }
443
+ put("curved", edgeCurved(real));
444
+ readLabels(treeChildren(r, "EdgeLabel"), false, put, at);
445
+ }
446
+ /**
447
+ * Whether yEd draws an edge curved: an arc always; a Bezier, quad curve, spline or generic edge only through its
448
+ * control points (with none it is a straight line); a polyline only when it smooths bends it has.
449
+ * @param real - the edge realizer
450
+ * @returns true when curved, null when a polyline does not say whether it smooths
451
+ */
452
+ function edgeCurved(real) {
453
+ if (real.type === "ArcEdge") {
454
+ return true;
455
+ }
456
+ const bent = treeChildren(treeChild(real.r, "Path"), "Point").length > 0;
457
+ if (real.type !== "PolyLineEdge") {
458
+ return bent;
459
+ }
460
+ const smoothed = treeAttr(treeChild(real.r, "BendStyle"), "smoothed");
461
+ return smoothed === undefined ? null : smoothed === "true" && bent;
462
+ }
463
+ /**
464
+ * An edge's bends: the points of its `y:Path`, relative to the centers of its two nodes. yEd draws a polyline through
465
+ * them; a curve type (Bezier, quad curve, spline) passes near them as its control points.
466
+ * @param real - the edge realizer
467
+ * @param centers - each node's center, x and y
468
+ * @param source - the source node's index
469
+ * @param target - the target node's index
470
+ * @returns the `bends` value, or null without bends
471
+ */
472
+ function edgeBends(real, centers, source, target) {
473
+ const points = treeChildren(treeChild(real.r, "Path"), "Point").map((p) => [
474
+ Number(treeAttr(p, "x")),
475
+ Number(treeAttr(p, "y")),
476
+ ]);
477
+ const at = (k) => [centers[2 * k], centers[2 * k + 1]];
478
+ return canonBends(at(source), at(target), points, true);
479
+ }
480
+ /**
481
+ * A collector of canonical values for one target.
482
+ * @param n - the element count
483
+ * @returns the values and a setter for element i
484
+ */
485
+ export function valueColumns(n) {
486
+ const values = Object.create(null);
487
+ return {
488
+ values,
489
+ put(i, property, value) {
490
+ if (value !== null) {
491
+ values[property] ?? (values[property] = new Array(n).fill(null));
492
+ values[property][i] = value;
493
+ }
494
+ },
495
+ };
496
+ }
497
+ /**
498
+ * The yEd styles of a graph: each element's realizer read into canonical values.
499
+ * @param snapshot - the graph
500
+ * @param notes - where problems are noted
501
+ * @param budget - the work budget
502
+ * @returns the values, or null when no element has a yEd realizer
503
+ */
504
+ export function readYedStyles(snapshot, notes, budget) {
505
+ let found = false;
506
+ // each node's center, read with the node, for its edges' bends; NaN for a node without yEd graphics
507
+ const centers = new Float64Array(2 * snapshot.nodeCount).fill(Number.NaN);
508
+ const read = (target) => {
509
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
510
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
511
+ const names = target === "node" ? NODE_REALIZERS : EDGE_REALIZERS;
512
+ const columns = treeColumns(table);
513
+ const out = valueColumns(n);
514
+ if (columns.length === 0) {
515
+ return out.values;
516
+ }
517
+ for (let i = 0; i < n; i++) {
518
+ budget.spend(target, columns.length);
519
+ let real = null;
520
+ for (let c = 0; c < columns.length && real === null; c++) {
521
+ real = realizerOf(plainCell(table.value(columns[c], i)), names);
522
+ }
523
+ if (real === null) {
524
+ continue;
525
+ }
526
+ found = true;
527
+ const at = (property) => ({ notes, target, property, element: i, budget });
528
+ const put = (property, value) => {
529
+ out.put(i, property, value);
530
+ };
531
+ if (target === "node") {
532
+ readNode(real, put, at);
533
+ const geometry = treeChild(real.r, "Geometry");
534
+ centers[2 * i] = Number(treeAttr(geometry, "x")) + Number(treeAttr(geometry, "width")) / 2;
535
+ centers[2 * i + 1] = Number(treeAttr(geometry, "y")) + Number(treeAttr(geometry, "height")) / 2;
536
+ }
537
+ else {
538
+ readEdge(real, put, at);
539
+ put("bends", edgeBends(real, centers, snapshot.edgeSource(i), snapshot.edgeTarget(i)));
540
+ }
541
+ }
542
+ return out.values;
543
+ };
544
+ const node = read("node");
545
+ const edge = read("edge");
546
+ return found ? { node, edge } : null;
547
+ }
548
+ // ============================================================ writing
549
+ /**
550
+ * What the GraphML writer holds natively: yEd `y:ShapeNode` and `y:PolyLineEdge` graphics. The `graphty.styles`
551
+ * block is a graph `<data>` under its own key, and the per-element values its rules read are keys of their own.
552
+ * @category Built-in formats
553
+ */
554
+ export const GRAPHML_STYLE_CAPABILITIES = Object.freeze({
555
+ node: Object.freeze([
556
+ "fill",
557
+ "fillOpacity",
558
+ "borderColor",
559
+ "borderWidth",
560
+ "borderStyle",
561
+ "shape",
562
+ "width",
563
+ "height",
564
+ "label",
565
+ "labelColor",
566
+ "labelSize",
567
+ "labelFont",
568
+ "labelWeight",
569
+ "labelItalic",
570
+ "labelPosition",
571
+ ]),
572
+ edge: Object.freeze([
573
+ "color",
574
+ "opacity",
575
+ "width",
576
+ "lineStyle",
577
+ "sourceArrow",
578
+ "targetArrow",
579
+ "curved",
580
+ "bends",
581
+ "label",
582
+ "labelColor",
583
+ "labelSize",
584
+ "labelFont",
585
+ "labelWeight",
586
+ "labelItalic",
587
+ ]),
588
+ block: "attributes",
589
+ });
590
+ /** yEd's ShapeNode types, by the neutral shape each draws exactly. */
591
+ export const YED_SHAPES = new Map([
592
+ ["ellipse", "ellipse"],
593
+ ["rectangle", "rectangle"],
594
+ ["round-rectangle", "roundrectangle"],
595
+ ["triangle", "triangle"],
596
+ ["diamond", "diamond"],
597
+ ["hexagon", "hexagon"],
598
+ ["octagon", "octagon"],
599
+ ["parallelogram", "parallelogram"],
600
+ ["trapezoid", "trapezoid"],
601
+ ["star", "star5"],
602
+ ]);
603
+ /** yEd's line types, by the neutral line style each draws exactly. */
604
+ export const YED_LINES = new Map([
605
+ ["solid", "line"],
606
+ ["dashed", "dashed"],
607
+ ["dotted", "dotted"],
608
+ ["dash-dot", "dashed_dotted"],
609
+ ]);
610
+ /** yEd's arrows, by the neutral arrow each draws exactly. */
611
+ export const YED_ARROWS = new Map([
612
+ ["none", "none"],
613
+ ["triangle", "standard"],
614
+ ["triangle-open", "white_delta"],
615
+ ["vee", "concave"],
616
+ ["tee", "t_shape"],
617
+ ["diamond", "diamond"],
618
+ ["diamond-open", "white_diamond"],
619
+ ["circle", "circle"],
620
+ ["circle-open", "white_circle"],
621
+ ["square", "skewed_dash"],
622
+ ["crow", "crows_foot_many"],
623
+ ]);
624
+ /** yEd's label positions in the internal model, by neutral position. */
625
+ const YED_MODEL_POSITIONS = new Map([
626
+ ["center", "c"],
627
+ ["top", "t"],
628
+ ["bottom", "b"],
629
+ ["left", "l"],
630
+ ["right", "r"],
631
+ ["top-left", "tl"],
632
+ ["top-right", "tr"],
633
+ ["bottom-left", "bl"],
634
+ ["bottom-right", "br"],
635
+ ]);
636
+ /**
637
+ * A value of a table, or the nearest value the table has.
638
+ * @param table - neutral value to yEd value
639
+ * @param value - the neutral value
640
+ * @param nearest - the yEd value written when the table has none
641
+ * @returns the written value
642
+ */
643
+ export function yedValue(table, value, nearest) {
644
+ const exact = table.get(value);
645
+ if (exact !== undefined) {
646
+ return { value: exact, exact: true };
647
+ }
648
+ // a value the reader kept as other:<raw> goes back as written
649
+ return value.startsWith("other:") ? { value: value.slice(6), exact: true } : { value: nearest, exact: false };
650
+ }
651
+ /**
652
+ * A color with an alpha from an opacity, as yEd writes it: `#RRGGBB`, or `#RRGGBBAA` with the alpha last.
653
+ * @param color - the canonical color
654
+ * @param opacity - the opacity, or null
655
+ * @returns the text
656
+ */
657
+ export function yedColor(color, opacity) {
658
+ const hex = color.toUpperCase();
659
+ if (typeof opacity !== "number" || opacity >= 1) {
660
+ return hex;
661
+ }
662
+ return (hex +
663
+ Math.round(Math.max(0, opacity) * 255)
664
+ .toString(16)
665
+ .toUpperCase()
666
+ .padStart(2, "0"));
667
+ }
668
+ /**
669
+ * A value in yEd's spelling, recorded as approximated when yEd has no exact one.
670
+ * @param table - yEd's spellings
671
+ * @param value - the neutral value
672
+ * @param nearest - the spelling written when there is no exact one
673
+ * @param property - the property, for the approximation note
674
+ * @param approximate - records approximations
675
+ * @returns the spelling
676
+ */
677
+ export function yedSpelled(table, value, nearest, property, approximate) {
678
+ const w = yedValue(table, value, nearest);
679
+ if (!w.exact) {
680
+ approximate(property, value);
681
+ }
682
+ return w.value;
683
+ }
684
+ /**
685
+ * The label attributes and text of one element.
686
+ * @param get - the element's values
687
+ * @param node - whether it is a node label (which has a position)
688
+ * @param approximate - records approximations
689
+ * @returns the label element, or null when the element has no label text
690
+ */
691
+ function labelTree(get, node, approximate) {
692
+ const text = get("label");
693
+ if (typeof text !== "string" || text.trim().length === 0) {
694
+ return null;
695
+ }
696
+ const label = {};
697
+ const font = get("labelFont");
698
+ if (typeof font === "string") {
699
+ label["@_fontFamily"] = font;
700
+ }
701
+ const size = get("labelSize");
702
+ if (typeof size === "number") {
703
+ label["@_fontSize"] = String(size);
704
+ }
705
+ const weight = get("labelWeight");
706
+ const italic = get("labelItalic");
707
+ if (weight !== null || italic !== null) {
708
+ const style = (weight === "bold" ? "bold" : "") + (italic === true ? "italic" : "");
709
+ label["@_fontStyle"] = style.length === 0 ? "plain" : style;
710
+ }
711
+ const color = get("labelColor");
712
+ if (typeof color === "string") {
713
+ label["@_textColor"] = color.toUpperCase();
714
+ }
715
+ const position = node ? get("labelPosition") : null;
716
+ if (typeof position === "string") {
717
+ const written = YED_MODEL_POSITIONS.get(position);
718
+ if (written === undefined) {
719
+ approximate("labelPosition", position);
720
+ }
721
+ label["@_modelName"] = "internal";
722
+ label["@_modelPosition"] = written ?? "c";
723
+ }
724
+ label["#text"] = text;
725
+ return label;
726
+ }
727
+ /**
728
+ * A node's `y:ShapeNode` from its values.
729
+ * @param get - the node's values
730
+ * @param at - the node's position from the graphics it had, or null
731
+ * @param approximate - records approximations
732
+ * @returns the graphics tree
733
+ */
734
+ function shapeNodeTree(get, at, approximate) {
735
+ const node = {};
736
+ node["y:Geometry"] = geometryTree(get, at);
737
+ const fill = get("fill");
738
+ const fillOpacity = get("fillOpacity");
739
+ if (typeof fill === "string") {
740
+ node["y:Fill"] = { "@_color": yedColor(fill, fillOpacity), "@_transparent": "false" };
741
+ }
742
+ else if (fillOpacity === 0) {
743
+ node["y:Fill"] = { "@_hasColor": "false", "@_transparent": "false" };
744
+ }
745
+ const border = lineTree(get, ["borderColor", "borderWidth", "borderStyle"], approximate);
746
+ if (border !== null) {
747
+ node["y:BorderStyle"] = border;
748
+ }
749
+ const label = labelTree(get, true, approximate);
750
+ if (label !== null) {
751
+ node["y:NodeLabel"] = label;
752
+ }
753
+ const shape = get("shape");
754
+ if (typeof shape === "string") {
755
+ node["y:Shape"] = {
756
+ "@_type": yedSpelled(YED_SHAPES, shape, shape === "vee" ? "triangle" : "rectangle", "shape", approximate),
757
+ };
758
+ }
759
+ return { "y:ShapeNode": node };
760
+ }
761
+ /**
762
+ * A node's `y:Geometry`: its size, and its position from the graphics it had.
763
+ * @param get - the node's values
764
+ * @param at - the node's position, or null
765
+ * @returns the geometry
766
+ */
767
+ function geometryTree(get, at) {
768
+ const geometry = {};
769
+ const height = get("height");
770
+ const width = get("width");
771
+ if (typeof height === "number") {
772
+ geometry["@_height"] = String(height);
773
+ }
774
+ if (typeof width === "number") {
775
+ geometry["@_width"] = String(width);
776
+ }
777
+ if (at !== null) {
778
+ geometry["@_x"] = at[0];
779
+ geometry["@_y"] = at[1];
780
+ }
781
+ return geometry;
782
+ }
783
+ /**
784
+ * A `y:BorderStyle` or `y:LineStyle`: a color, a width and a line type. A node's border color is written opaque; an
785
+ * edge's color carries its opacity.
786
+ * @param get - the element's values
787
+ * @param properties - the color, width and style properties
788
+ * @param approximate - records approximations
789
+ * @param opacity - the opacity of the color, for an edge's line
790
+ * @returns the element, or null when none of the three is set
791
+ */
792
+ function lineTree(get, properties, approximate, opacity) {
793
+ const [colorKey, widthKey, styleKey] = properties;
794
+ const color = get(colorKey);
795
+ const width = get(widthKey);
796
+ const style = get(styleKey);
797
+ if (color === null && width === null && style === null) {
798
+ return null;
799
+ }
800
+ const line = {};
801
+ if (typeof color === "string") {
802
+ line["@_color"] = opacity === undefined ? color.toUpperCase() : yedColor(color, opacity);
803
+ }
804
+ if (typeof style === "string") {
805
+ const nearest = styleKey === "lineStyle" && style === "long-dash" ? "dashed" : "line";
806
+ line["@_type"] = yedSpelled(YED_LINES, style, nearest, styleKey, approximate);
807
+ }
808
+ if (typeof width === "number") {
809
+ line["@_width"] = String(width);
810
+ }
811
+ return line;
812
+ }
813
+ /**
814
+ * An edge's `y:PolyLineEdge` from its values.
815
+ * @param get - the edge's values
816
+ * @param path - the `y:Path` of the graphics it had, or undefined
817
+ * @param approximate - records approximations
818
+ * @returns the graphics tree
819
+ */
820
+ function polyLineEdgeTree(get, path, approximate) {
821
+ const edge = {};
822
+ if (path !== undefined) {
823
+ edge["y:Path"] = path;
824
+ }
825
+ const line = lineTree(get, ["color", "width", "lineStyle"], approximate, get("opacity"));
826
+ if (line !== null) {
827
+ edge["y:LineStyle"] = line;
828
+ }
829
+ const source = get("sourceArrow");
830
+ const target = get("targetArrow");
831
+ if (source !== null || target !== null) {
832
+ const arrow = (property, value) => typeof value === "string" ? yedSpelled(YED_ARROWS, value, "standard", property, approximate) : "none";
833
+ edge["y:Arrows"] = { "@_source": arrow("sourceArrow", source), "@_target": arrow("targetArrow", target) };
834
+ }
835
+ const label = labelTree(get, false, approximate);
836
+ if (label !== null) {
837
+ edge["y:EdgeLabel"] = label;
838
+ }
839
+ const curved = get("curved");
840
+ if (typeof curved === "boolean") {
841
+ edge["y:BendStyle"] = { "@_smoothed": String(curved) };
842
+ }
843
+ return { "y:PolyLineEdge": edge };
844
+ }
845
+ /**
846
+ * Each element's values of the properties the writer writes, as a getter per element.
847
+ * @param picture - each element's value of a property
848
+ * @param target - nodes or edges
849
+ * @returns the getter
850
+ */
851
+ function getter(picture, target) {
852
+ const columns = new Map();
853
+ for (const p of GRAPHML_STYLE_CAPABILITIES[target]) {
854
+ columns.set(p, picture(target, p));
855
+ }
856
+ return (i) => (property) => columns.get(property)?.[i] ?? null;
857
+ }
858
+ /**
859
+ * For a file graphty wrote: where a value read from the yEd graphics is what the writer writes for the block's own
860
+ * value (a pentagon written as a hexagon, an opacity rounded to yEd's 255 steps), the block's exact value is the
861
+ * truth, so a re-import gives back the same rules; a value another program changed since stays the truth.
862
+ * @param read - the values the reader read, changed in place
863
+ * @param picture - each element's value of a property under the block's rules
864
+ * @param counts - the node and edge counts
865
+ * @param counts.node - the node count
866
+ * @param counts.edge - the edge count
867
+ * @param notes - a scratch note list for reading back what the writer writes
868
+ */
869
+ export function exactFromBlock(read, picture, counts, notes) {
870
+ for (const target of ["node", "edge"]) {
871
+ const values = read[target];
872
+ const get = getter(picture, target);
873
+ for (let i = 0; i < counts[target]; i++) {
874
+ const want = get(i);
875
+ const back = writtenAndReadBack(target, want, notes);
876
+ if (back === null) {
877
+ continue;
878
+ }
879
+ for (const property of GRAPHML_STYLE_CAPABILITIES[target]) {
880
+ const native = values[property]?.[i] ?? null;
881
+ const w = want(property);
882
+ if (native !== w && native === (back.get(property) ?? null)) {
883
+ values[property] ?? (values[property] = new Array(counts[target]).fill(null));
884
+ values[property][i] = w;
885
+ }
886
+ }
887
+ }
888
+ }
889
+ }
890
+ /**
891
+ * An element's values written as the writer writes them and read back as the reader reads them.
892
+ * @param target - nodes or edges
893
+ * @param want - its values
894
+ * @param notes - a scratch for the notes the round trip makes
895
+ * @returns the values read back, by property, or null when the written graphics hold no realizer
896
+ */
897
+ function writtenAndReadBack(target, want, notes) {
898
+ const ignore = () => undefined;
899
+ const tree = target === "node" ? shapeNodeTree(want, null, ignore) : polyLineEdgeTree(want, undefined, ignore);
900
+ const real = realizerOf(tree, target === "node" ? NODE_REALIZERS : EDGE_REALIZERS);
901
+ if (real === null) {
902
+ return null;
903
+ }
904
+ const back = new Map();
905
+ const at = (property) => ({ notes, target, property });
906
+ const put = (property, value) => {
907
+ if (value !== null) {
908
+ back.set(property, value);
909
+ }
910
+ };
911
+ if (target === "node") {
912
+ readNode(real, put, at);
913
+ }
914
+ else {
915
+ readEdge(real, put, at);
916
+ }
917
+ return back;
918
+ }
919
+ /** The yFiles key type of the written node and edge graphics. */
920
+ const GRAPHICS_TYPES = { node: "nodegraphics", edge: "edgegraphics" };
921
+ /**
922
+ * A node's position from the graphics it had: a yEd realizer's `y:Geometry` x and y, or a yFiles 3 `y:RectD`'s.
923
+ * @param table - the node table
924
+ * @param columns - its tree columns
925
+ * @param i - the node
926
+ * @returns the x and y as written, or null
927
+ */
928
+ function keptPosition(table, columns, i) {
929
+ for (const name of columns) {
930
+ const tree = plainCell(table.value(name, i));
931
+ const real = realizerOf(tree, NODE_REALIZERS);
932
+ const geometry = real === null ? treeChild(tree, "RectD") : treeChild(real.r, "Geometry");
933
+ const x = treeAttr(geometry, real === null ? "X" : "x");
934
+ const y = treeAttr(geometry, real === null ? "Y" : "y");
935
+ if (x !== undefined && y !== undefined) {
936
+ return [x, y];
937
+ }
938
+ }
939
+ return null;
940
+ }
941
+ /**
942
+ * A node's `y:Geometry` x and y from the graph's position column, for a node with no yEd graphics of its own: the
943
+ * column's coordinate read in its declared spelling (center, y up when it declares none), written as yEd places a
944
+ * box, by its top-left corner with y growing downward.
945
+ * @param snapshot - the graph
946
+ * @param i - the node
947
+ * @param get - the node's values (its drawn width and height)
948
+ * @returns the x and y to write, or null when the node has no finite position
949
+ */
950
+ function columnPosition(snapshot, i, get) {
951
+ const column = snapshot.nodes.byRole("position");
952
+ if (column === null || column.meta.components < 2 || !column.isSet(i)) {
953
+ return null;
954
+ }
955
+ const v = column.value(i);
956
+ const width = get("width");
957
+ const height = get("height");
958
+ const size = [typeof width === "number" ? width : 0, typeof height === "number" ? height : 0];
959
+ const p = [v[0], v[1], 0];
960
+ toNeutral(p, column.meta.extra ?? {}, size, false);
961
+ const [x, y] = toFilePositions(Float64Array.from(p), YED_SPELLING, {
962
+ width: Float64Array.of(size[0]),
963
+ height: Float64Array.of(size[1]),
964
+ });
965
+ return Number.isFinite(x) && Number.isFinite(y) ? [String(x), String(y)] : null;
966
+ }
967
+ /** How yEd spells a node's place: its box's top-left corner, y growing downward. */
968
+ const YED_SPELLING = { yAxis: "down", anchor: "top-left" };
969
+ /**
970
+ * An edge's `y:Path` (its bends) from the yEd graphics it had.
971
+ * @param table - the edge table
972
+ * @param columns - its tree columns
973
+ * @param e - the edge
974
+ * @returns the path, or undefined
975
+ */
976
+ function keptPath(table, columns, e) {
977
+ for (const name of columns) {
978
+ const real = realizerOf(plainCell(table.value(name, e)), EDGE_REALIZERS);
979
+ const path = real === null ? undefined : treeChild(real.r, "Path");
980
+ if (path !== undefined) {
981
+ return path;
982
+ }
983
+ }
984
+ return undefined;
985
+ }
986
+ /**
987
+ * An edge's `y:Path` with its points placed from its `bends` value between the written node centers, so the bends
988
+ * read back as written; the ports of the path it had are kept. Without a value, or without both centers, the path it
989
+ * had.
990
+ * @param kept - the path from the graphics the edge had, or undefined
991
+ * @param bends - the edge's `bends` value
992
+ * @param ends - the written centers of its source and target
993
+ * @returns the path, or undefined
994
+ */
995
+ function pathWithBends(kept, bends, ends) {
996
+ const points = typeof bends === "string" ? bendsToPoints(ends[0], ends[1], bends, true) : null;
997
+ if (points === null) {
998
+ return kept;
999
+ }
1000
+ const path = {};
1001
+ for (const port of ["sx", "sy", "tx", "ty"]) {
1002
+ path[`@_${port}`] = treeAttr(kept, port) ?? "0.0";
1003
+ }
1004
+ path["y:Point"] = points.map(([x, y]) => ({ "@_x": String(x), "@_y": String(y) }));
1005
+ return path;
1006
+ }
1007
+ /**
1008
+ * A column name not yet taken in a table.
1009
+ * @param table - the table
1010
+ * @param base - the preferred name
1011
+ * @returns the name
1012
+ */
1013
+ function freeName(table, base) {
1014
+ let name = base;
1015
+ let k = 2;
1016
+ while (table.has(name)) {
1017
+ name = `${base}#${String(k)}`;
1018
+ k++;
1019
+ }
1020
+ return name;
1021
+ }
1022
+ /**
1023
+ * Works out a GraphML export with styles: every node and edge column made from yFiles keys (the graphics trees,
1024
+ * the typed `yfiles.*` columns and yFiles 3's drawing state) is replaced by yEd graphics written from what graphty
1025
+ * draws, keeping each node's position and each edge's bends from the graphics it had; graph data from yFiles 3
1026
+ * keys goes too, since its `y:` elements are not yEd's.
1027
+ * @param snapshot - the graph handed to the exporter
1028
+ * @param input - the styles, or undefined when none are written
1029
+ * @returns the styled export, or null without styles
1030
+ */
1031
+ export function graphmlStyledExport(snapshot, input) {
1032
+ if (input === undefined) {
1033
+ return null;
1034
+ }
1035
+ const approximated = new StyleApproximations();
1036
+ const approximateFor = (target) => (property, value) => {
1037
+ approximated.add(target, property, value);
1038
+ };
1039
+ const picture = (target, property) => input.picture(target, property);
1040
+ const nodeColumns = treeColumns(snapshot.nodes);
1041
+ const edgeColumns = treeColumns(snapshot.edges);
1042
+ const getNode = getter(picture, "node");
1043
+ const getEdge = getter(picture, "edge");
1044
+ const nodeTrees = [];
1045
+ for (let i = 0; i < snapshot.nodeCount; i++) {
1046
+ const get = getNode(i);
1047
+ const at = keptPosition(snapshot.nodes, nodeColumns, i) ?? columnPosition(snapshot, i, get);
1048
+ nodeTrees.push(shapeNodeTree(get, at, approximateFor("node")));
1049
+ }
1050
+ const centers = nodeTrees.map((tree) => {
1051
+ const geometry = treeChild(treeChild(tree, "ShapeNode"), "Geometry");
1052
+ const at = (k) => Number(treeAttr(geometry, k) ?? Number.NaN);
1053
+ return [at("x") + at("width") / 2, at("y") + at("height") / 2];
1054
+ });
1055
+ const edgeTrees = [];
1056
+ for (let e = 0; e < snapshot.edgeCount; e++) {
1057
+ const get = getEdge(e);
1058
+ const ends = [
1059
+ centers[snapshot.edgeSource(e)],
1060
+ centers[snapshot.edgeTarget(e)],
1061
+ ];
1062
+ const path = pathWithBends(keptPath(snapshot.edges, edgeColumns, e), get("bends"), ends);
1063
+ edgeTrees.push(polyLineEdgeTree(get, path, approximateFor("edge")));
1064
+ }
1065
+ const out = snapshot.withColumns();
1066
+ for (const [table, trees, target] of [
1067
+ [out.nodes, nodeTrees, "node"],
1068
+ [out.edges, edgeTrees, "edge"],
1069
+ ]) {
1070
+ for (const name of yfilesColumns(table)) {
1071
+ table.remove(name);
1072
+ }
1073
+ const name = freeName(table, GRAPHICS_TYPES[target]);
1074
+ table.set(name, trees, {
1075
+ dtype: "json",
1076
+ nullable: true,
1077
+ origin: { format: "graphml", id: null, title: null, type: GRAPHICS_TYPES[target], namespace: "yfiles" },
1078
+ });
1079
+ }
1080
+ const yfiles3 = [...out.graph].filter((col) => col.meta.origin?.namespace === "yfiles" && (col.meta.origin.type ?? "").includes("://"));
1081
+ for (const col of yfiles3) {
1082
+ out.graph.remove(col.meta.name);
1083
+ }
1084
+ return { snapshot: out, notes: approximated.notes("yEd") };
1085
+ }
1086
+ //# sourceMappingURL=styles-yed.js.map