@graphty/graph-io 0.3.48 → 0.3.50

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 (600) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
  3. package/dist/chunks/bends-BGXjv_U4.js +129 -0
  4. package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
  5. package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
  6. package/dist/chunks/block-yl0f_qLO.js.map +1 -0
  7. package/dist/chunks/choose-CczZJaX_.js +717 -0
  8. package/dist/chunks/choose-CczZJaX_.js.map +1 -0
  9. package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
  18. package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
  24. package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
  26. package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
  32. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
  33. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
  34. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
  35. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  36. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
  39. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
  40. package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
  44. package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
  45. package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
  46. package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
  47. package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
  48. package/dist/chunks/importer-CKFe4q54.js.map +1 -0
  49. package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
  50. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
  51. package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
  52. package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
  53. package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
  54. package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
  55. package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
  56. package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
  57. package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
  58. package/dist/chunks/importer-asFUrIsj.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
  64. package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
  72. package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
  74. package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
  76. package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
  77. package/dist/chunks/styles-CPczw1Jz.js +1928 -0
  78. package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
  79. package/dist/chunks/styles-boK6Ln54.js +2847 -0
  80. package/dist/chunks/styles-boK6Ln54.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
  82. package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +8 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +848 -194
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +230 -193
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +141 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +32 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +439 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  137. package/dist/src/formats/dot/exporter.js +34 -2
  138. package/dist/src/formats/dot/exporter.js.map +1 -1
  139. package/dist/src/formats/dot/importer.d.ts +6 -1
  140. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  141. package/dist/src/formats/dot/importer.js +170 -33
  142. package/dist/src/formats/dot/importer.js.map +1 -1
  143. package/dist/src/formats/dot/index.d.ts +3 -1
  144. package/dist/src/formats/dot/index.d.ts.map +1 -1
  145. package/dist/src/formats/dot/index.js +2 -1
  146. package/dist/src/formats/dot/index.js.map +1 -1
  147. package/dist/src/formats/dot/label-places.d.ts +41 -0
  148. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  149. package/dist/src/formats/dot/label-places.js +185 -0
  150. package/dist/src/formats/dot/label-places.js.map +1 -0
  151. package/dist/src/formats/dot/names.d.ts +13 -0
  152. package/dist/src/formats/dot/names.d.ts.map +1 -1
  153. package/dist/src/formats/dot/names.js +13 -0
  154. package/dist/src/formats/dot/names.js.map +1 -1
  155. package/dist/src/formats/dot/record.d.ts +50 -0
  156. package/dist/src/formats/dot/record.d.ts.map +1 -0
  157. package/dist/src/formats/dot/record.js +275 -0
  158. package/dist/src/formats/dot/record.js.map +1 -0
  159. package/dist/src/formats/dot/styles.d.ts +72 -2
  160. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  161. package/dist/src/formats/dot/styles.js +1500 -119
  162. package/dist/src/formats/dot/styles.js.map +1 -1
  163. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  165. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  167. package/dist/src/formats/gexf/importer.d.ts +7 -0
  168. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  169. package/dist/src/formats/gexf/importer.js +41 -5
  170. package/dist/src/formats/gexf/importer.js.map +1 -1
  171. package/dist/src/formats/gexf/preview.d.ts +77 -0
  172. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  173. package/dist/src/formats/gexf/preview.js +191 -0
  174. package/dist/src/formats/gexf/preview.js.map +1 -0
  175. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  176. package/dist/src/formats/gexf/schema.js +2 -1
  177. package/dist/src/formats/gexf/schema.js.map +1 -1
  178. package/dist/src/formats/gexf/styles.d.ts +58 -31
  179. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  180. package/dist/src/formats/gexf/styles.js +848 -225
  181. package/dist/src/formats/gexf/styles.js.map +1 -1
  182. package/dist/src/formats/gml/importer.d.ts +5 -2
  183. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  184. package/dist/src/formats/gml/importer.js +258 -71
  185. package/dist/src/formats/gml/importer.js.map +1 -1
  186. package/dist/src/formats/gml/index.d.ts +1 -1
  187. package/dist/src/formats/gml/index.d.ts.map +1 -1
  188. package/dist/src/formats/gml/index.js +1 -1
  189. package/dist/src/formats/gml/index.js.map +1 -1
  190. package/dist/src/formats/gml/positions.d.ts +7 -0
  191. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  192. package/dist/src/formats/gml/positions.js +29 -7
  193. package/dist/src/formats/gml/positions.js.map +1 -1
  194. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  195. package/dist/src/formats/gml/styles.js +754 -102
  196. package/dist/src/formats/gml/styles.js.map +1 -1
  197. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.js +6 -10
  199. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  200. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  201. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  202. package/dist/src/formats/graphml/styles-yed.js +695 -164
  203. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  204. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
  207. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  208. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  209. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  210. package/dist/src/formats/graphml/yfiles.js +16 -6
  211. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  212. package/dist/src/formats/json/dialect.d.ts +3 -2
  213. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  214. package/dist/src/formats/json/dialect.js +39 -5
  215. package/dist/src/formats/json/dialect.js.map +1 -1
  216. package/dist/src/formats/json/importer.d.ts +13 -2
  217. package/dist/src/formats/json/importer.d.ts.map +1 -1
  218. package/dist/src/formats/json/importer.js +42 -6
  219. package/dist/src/formats/json/importer.js.map +1 -1
  220. package/dist/src/formats/json/index.d.ts +1 -1
  221. package/dist/src/formats/json/index.d.ts.map +1 -1
  222. package/dist/src/formats/json/index.js +1 -1
  223. package/dist/src/formats/json/index.js.map +1 -1
  224. package/dist/src/formats/json/positions.d.ts +5 -2
  225. package/dist/src/formats/json/positions.d.ts.map +1 -1
  226. package/dist/src/formats/json/positions.js +20 -4
  227. package/dist/src/formats/json/positions.js.map +1 -1
  228. package/dist/src/formats/json/styles.d.ts +12 -1
  229. package/dist/src/formats/json/styles.d.ts.map +1 -1
  230. package/dist/src/formats/json/styles.js +1843 -136
  231. package/dist/src/formats/json/styles.js.map +1 -1
  232. package/dist/src/formats/pajek/draw.d.ts +104 -0
  233. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  234. package/dist/src/formats/pajek/draw.js +382 -0
  235. package/dist/src/formats/pajek/draw.js.map +1 -0
  236. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  237. package/dist/src/formats/pajek/exporter.js +70 -51
  238. package/dist/src/formats/pajek/exporter.js.map +1 -1
  239. package/dist/src/formats/pajek/importer.d.ts +9 -0
  240. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  241. package/dist/src/formats/pajek/importer.js +233 -102
  242. package/dist/src/formats/pajek/importer.js.map +1 -1
  243. package/dist/src/formats/pajek/index.d.ts +1 -0
  244. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  245. package/dist/src/formats/pajek/index.js.map +1 -1
  246. package/dist/src/formats/pajek/styles.d.ts +15 -7
  247. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  248. package/dist/src/formats/pajek/styles.js +1395 -114
  249. package/dist/src/formats/pajek/styles.js.map +1 -1
  250. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  251. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  252. package/dist/src/formats/pajek/syntax.js +26 -2
  253. package/dist/src/formats/pajek/syntax.js.map +1 -1
  254. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  255. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  256. package/dist/src/formats/xgmml/emit.js +65 -5
  257. package/dist/src/formats/xgmml/emit.js.map +1 -1
  258. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  259. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  260. package/dist/src/formats/xgmml/styles.js +277 -60
  261. package/dist/src/formats/xgmml/styles.js.map +1 -1
  262. package/dist/src/index.d.ts +6 -5
  263. package/dist/src/index.d.ts.map +1 -1
  264. package/dist/src/index.js +6 -5
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/positions/convert.d.ts.map +1 -1
  267. package/dist/src/positions/convert.js +11 -1
  268. package/dist/src/positions/convert.js.map +1 -1
  269. package/dist/src/positions/extract.d.ts.map +1 -1
  270. package/dist/src/positions/extract.js +53 -1
  271. package/dist/src/positions/extract.js.map +1 -1
  272. package/dist/src/positions/index.d.ts +1 -1
  273. package/dist/src/positions/index.d.ts.map +1 -1
  274. package/dist/src/positions/types.d.ts +59 -0
  275. package/dist/src/positions/types.d.ts.map +1 -1
  276. package/dist/src/sources/builtins.d.ts +1 -1
  277. package/dist/src/sources/builtins.d.ts.map +1 -1
  278. package/dist/src/sources/builtins.js +8 -2
  279. package/dist/src/sources/builtins.js.map +1 -1
  280. package/dist/src/sources/context.d.ts.map +1 -1
  281. package/dist/src/sources/context.js +1 -0
  282. package/dist/src/sources/context.js.map +1 -1
  283. package/dist/src/sources/credentials.d.ts +50 -1
  284. package/dist/src/sources/credentials.d.ts.map +1 -1
  285. package/dist/src/sources/credentials.js +69 -0
  286. package/dist/src/sources/credentials.js.map +1 -1
  287. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  288. package/dist/src/sources/cypher/descriptor.js +5 -0
  289. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  290. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  291. package/dist/src/sources/cypher/index.js +125 -18
  292. package/dist/src/sources/cypher/index.js.map +1 -1
  293. package/dist/src/sources/cypher/params.d.ts +1 -1
  294. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  295. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  296. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  297. package/dist/src/sources/cypher/query-builder.js +31 -0
  298. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  299. package/dist/src/sources/ids.d.ts +5 -0
  300. package/dist/src/sources/ids.d.ts.map +1 -1
  301. package/dist/src/sources/ids.js +5 -0
  302. package/dist/src/sources/ids.js.map +1 -1
  303. package/dist/src/sources/params.d.ts +3 -0
  304. package/dist/src/sources/params.d.ts.map +1 -1
  305. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  306. package/dist/src/sources/rest/descriptor.js +9 -0
  307. package/dist/src/sources/rest/descriptor.js.map +1 -1
  308. package/dist/src/sources/rest/openalex.d.ts +4 -2
  309. package/dist/src/sources/rest/openalex.d.ts.map +1 -1
  310. package/dist/src/sources/rest/openalex.js +4 -2
  311. package/dist/src/sources/rest/openalex.js.map +1 -1
  312. package/dist/src/sources/rest/source.d.ts.map +1 -1
  313. package/dist/src/sources/rest/source.js +38 -0
  314. package/dist/src/sources/rest/source.js.map +1 -1
  315. package/dist/src/sources/run.d.ts +2 -0
  316. package/dist/src/sources/run.d.ts.map +1 -1
  317. package/dist/src/sources/run.js +30 -3
  318. package/dist/src/sources/run.js.map +1 -1
  319. package/dist/src/sources/sigv4.d.ts +5 -3
  320. package/dist/src/sources/sigv4.d.ts.map +1 -1
  321. package/dist/src/sources/sigv4.js +6 -4
  322. package/dist/src/sources/sigv4.js.map +1 -1
  323. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  324. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  325. package/dist/src/sources/sparql/descriptor.js +64 -0
  326. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  327. package/dist/src/sources/sparql/index.d.ts +28 -0
  328. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  329. package/dist/src/sources/sparql/index.js +327 -0
  330. package/dist/src/sources/sparql/index.js.map +1 -0
  331. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  332. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  333. package/dist/src/sources/sparql/ntriples.js +180 -0
  334. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  335. package/dist/src/sources/sparql/params.d.ts +27 -0
  336. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  337. package/dist/src/sources/sparql/params.js +5 -0
  338. package/dist/src/sources/sparql/params.js.map +1 -0
  339. package/dist/src/sources/sparql/query.d.ts +73 -0
  340. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  341. package/dist/src/sources/sparql/query.js +164 -0
  342. package/dist/src/sources/sparql/query.js.map +1 -0
  343. package/dist/src/sources/types.d.ts +60 -0
  344. package/dist/src/sources/types.d.ts.map +1 -1
  345. package/dist/src/styles/annotations.d.ts +61 -5
  346. package/dist/src/styles/annotations.d.ts.map +1 -1
  347. package/dist/src/styles/annotations.js +130 -22
  348. package/dist/src/styles/annotations.js.map +1 -1
  349. package/dist/src/styles/canon/bends.d.ts +46 -0
  350. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  351. package/dist/src/styles/canon/bends.js +123 -0
  352. package/dist/src/styles/canon/bends.js.map +1 -1
  353. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  354. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  355. package/dist/src/styles/canon/color-tables.js +10 -4
  356. package/dist/src/styles/canon/color-tables.js.map +1 -1
  357. package/dist/src/styles/canon/color.d.ts +3 -1
  358. package/dist/src/styles/canon/color.d.ts.map +1 -1
  359. package/dist/src/styles/canon/color.js +103 -3
  360. package/dist/src/styles/canon/color.js.map +1 -1
  361. package/dist/src/styles/canon/enums.d.ts +2 -2
  362. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  363. package/dist/src/styles/canon/enums.js +89 -7
  364. package/dist/src/styles/canon/enums.js.map +1 -1
  365. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  366. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  367. package/dist/src/styles/canon/graphviz.js +57 -9
  368. package/dist/src/styles/canon/graphviz.js.map +1 -1
  369. package/dist/src/styles/canon/number.d.ts +8 -0
  370. package/dist/src/styles/canon/number.d.ts.map +1 -1
  371. package/dist/src/styles/canon/number.js +18 -0
  372. package/dist/src/styles/canon/number.js.map +1 -1
  373. package/dist/src/styles/canon/text.d.ts +29 -2
  374. package/dist/src/styles/canon/text.d.ts.map +1 -1
  375. package/dist/src/styles/canon/text.js +156 -16
  376. package/dist/src/styles/canon/text.js.map +1 -1
  377. package/dist/src/styles/codes.d.ts +2 -0
  378. package/dist/src/styles/codes.d.ts.map +1 -1
  379. package/dist/src/styles/codes.js +2 -0
  380. package/dist/src/styles/codes.js.map +1 -1
  381. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  382. package/dist/src/styles/cyjs/cascade.js +1139 -79
  383. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  384. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  385. package/dist/src/styles/cyjs/defaults-table.js +4 -0
  386. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  387. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  388. package/dist/src/styles/cyjs/emit.js +232 -10
  389. package/dist/src/styles/cyjs/emit.js.map +1 -1
  390. package/dist/src/styles/cyjs/face.d.ts +20 -0
  391. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  392. package/dist/src/styles/cyjs/face.js +332 -0
  393. package/dist/src/styles/cyjs/face.js.map +1 -0
  394. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  395. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  396. package/dist/src/styles/cyjs/mappers.js +475 -26
  397. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  398. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  399. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  400. package/dist/src/styles/cyjs/routes.js +360 -0
  401. package/dist/src/styles/cyjs/routes.js.map +1 -0
  402. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  403. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  404. package/dist/src/styles/cytoscape/charts.js +560 -0
  405. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  406. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  407. package/dist/src/styles/cytoscape/emit.js +156 -48
  408. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  409. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  410. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  411. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  412. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  413. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  414. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  415. package/dist/src/styles/cytoscape/mappings.js +92 -0
  416. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  417. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  418. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  419. package/dist/src/styles/cytoscape/resolve.js +623 -17
  420. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  421. package/dist/src/styles/defaults.d.ts +46 -26
  422. package/dist/src/styles/defaults.d.ts.map +1 -1
  423. package/dist/src/styles/defaults.js +308 -71
  424. package/dist/src/styles/defaults.js.map +1 -1
  425. package/dist/src/styles/index.d.ts +4 -3
  426. package/dist/src/styles/index.d.ts.map +1 -1
  427. package/dist/src/styles/index.js +3 -2
  428. package/dist/src/styles/index.js.map +1 -1
  429. package/dist/src/styles/internal.d.ts +1 -0
  430. package/dist/src/styles/internal.d.ts.map +1 -1
  431. package/dist/src/styles/internal.js +1 -0
  432. package/dist/src/styles/internal.js.map +1 -1
  433. package/dist/src/styles/io/generic.d.ts.map +1 -1
  434. package/dist/src/styles/io/generic.js +56 -16
  435. package/dist/src/styles/io/generic.js.map +1 -1
  436. package/dist/src/styles/io/round-trip.d.ts +56 -0
  437. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  438. package/dist/src/styles/io/round-trip.js +138 -0
  439. package/dist/src/styles/io/round-trip.js.map +1 -0
  440. package/dist/src/styles/io/writer.d.ts.map +1 -1
  441. package/dist/src/styles/io/writer.js +6 -1
  442. package/dist/src/styles/io/writer.js.map +1 -1
  443. package/dist/src/styles/notes.d.ts.map +1 -1
  444. package/dist/src/styles/notes.js +1 -0
  445. package/dist/src/styles/notes.js.map +1 -1
  446. package/dist/src/styles/plan/features.d.ts +1 -1
  447. package/dist/src/styles/plan/features.d.ts.map +1 -1
  448. package/dist/src/styles/plan/features.js +22 -2
  449. package/dist/src/styles/plan/features.js.map +1 -1
  450. package/dist/src/styles/plan/index.d.ts +1 -1
  451. package/dist/src/styles/plan/index.d.ts.map +1 -1
  452. package/dist/src/styles/plan/index.js +1 -1
  453. package/dist/src/styles/plan/index.js.map +1 -1
  454. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  455. package/dist/src/styles/plan/plan.js +61 -4
  456. package/dist/src/styles/plan/plan.js.map +1 -1
  457. package/dist/src/styles/plan/resolve.d.ts +11 -0
  458. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  459. package/dist/src/styles/plan/resolve.js +40 -4
  460. package/dist/src/styles/plan/resolve.js.map +1 -1
  461. package/dist/src/styles/slots.d.ts +14 -0
  462. package/dist/src/styles/slots.d.ts.map +1 -0
  463. package/dist/src/styles/slots.js +20 -0
  464. package/dist/src/styles/slots.js.map +1 -0
  465. package/dist/src/styles/types.d.ts +687 -6
  466. package/dist/src/styles/types.d.ts.map +1 -1
  467. package/dist/src/styles/vocabulary.d.ts +3 -2
  468. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  469. package/dist/src/styles/vocabulary.js +224 -0
  470. package/dist/src/styles/vocabulary.js.map +1 -1
  471. package/dist/styles.js +30 -239
  472. package/dist/styles.js.map +1 -1
  473. package/dist/xgmml.js +3 -3
  474. package/package.json +27 -7
  475. package/src/formats/cx/importer.ts +6 -1
  476. package/src/formats/cx/styles.ts +143 -9
  477. package/src/formats/cx2/importer.ts +1 -0
  478. package/src/formats/cx2/styles.ts +3 -1
  479. package/src/formats/cys/importer.ts +1 -0
  480. package/src/formats/cys/styles.ts +27 -5
  481. package/src/formats/dot/drawing.ts +799 -0
  482. package/src/formats/dot/exporter.ts +37 -1
  483. package/src/formats/dot/importer.ts +192 -36
  484. package/src/formats/dot/index.ts +3 -1
  485. package/src/formats/dot/label-places.ts +241 -0
  486. package/src/formats/dot/names.ts +15 -0
  487. package/src/formats/dot/record.ts +336 -0
  488. package/src/formats/dot/styles.ts +1702 -149
  489. package/src/formats/gexf/dialog-metrics.ts +61 -0
  490. package/src/formats/gexf/importer.ts +50 -5
  491. package/src/formats/gexf/preview.ts +217 -0
  492. package/src/formats/gexf/schema.ts +2 -1
  493. package/src/formats/gexf/styles.ts +1099 -245
  494. package/src/formats/gml/importer.ts +291 -76
  495. package/src/formats/gml/index.ts +1 -1
  496. package/src/formats/gml/positions.ts +29 -7
  497. package/src/formats/gml/styles.ts +852 -110
  498. package/src/formats/graphml/styles-plain.ts +6 -15
  499. package/src/formats/graphml/styles-yed.ts +765 -176
  500. package/src/formats/graphml/styles-yfiles3.ts +487 -63
  501. package/src/formats/graphml/yfiles.ts +19 -6
  502. package/src/formats/json/dialect.ts +41 -5
  503. package/src/formats/json/importer.ts +59 -7
  504. package/src/formats/json/index.ts +1 -0
  505. package/src/formats/json/positions.ts +22 -5
  506. package/src/formats/json/styles.ts +2123 -171
  507. package/src/formats/pajek/draw.ts +469 -0
  508. package/src/formats/pajek/exporter.ts +81 -49
  509. package/src/formats/pajek/importer.ts +278 -103
  510. package/src/formats/pajek/index.ts +1 -0
  511. package/src/formats/pajek/styles.ts +1506 -133
  512. package/src/formats/pajek/syntax.ts +27 -2
  513. package/src/formats/xgmml/emit.ts +73 -5
  514. package/src/formats/xgmml/styles.ts +330 -71
  515. package/src/index.ts +12 -1
  516. package/src/positions/convert.ts +12 -1
  517. package/src/positions/extract.ts +55 -1
  518. package/src/positions/index.ts +1 -0
  519. package/src/positions/types.ts +60 -0
  520. package/src/sources/builtins.ts +8 -1
  521. package/src/sources/context.ts +1 -0
  522. package/src/sources/credentials.ts +90 -1
  523. package/src/sources/cypher/descriptor.ts +7 -1
  524. package/src/sources/cypher/index.ts +149 -18
  525. package/src/sources/cypher/params.ts +1 -1
  526. package/src/sources/cypher/query-builder.ts +33 -0
  527. package/src/sources/ids.ts +6 -0
  528. package/src/sources/params.ts +3 -0
  529. package/src/sources/rest/descriptor.ts +9 -0
  530. package/src/sources/rest/openalex.ts +4 -2
  531. package/src/sources/rest/source.ts +41 -0
  532. package/src/sources/run.ts +35 -3
  533. package/src/sources/sigv4.ts +6 -4
  534. package/src/sources/sparql/descriptor.ts +67 -0
  535. package/src/sources/sparql/index.ts +371 -0
  536. package/src/sources/sparql/ntriples.ts +219 -0
  537. package/src/sources/sparql/params.ts +28 -0
  538. package/src/sources/sparql/query.ts +216 -0
  539. package/src/sources/types.ts +68 -0
  540. package/src/styles/annotations.ts +201 -27
  541. package/src/styles/canon/bends.ts +137 -0
  542. package/src/styles/canon/color-tables.ts +10 -4
  543. package/src/styles/canon/color.ts +105 -3
  544. package/src/styles/canon/enums.ts +107 -8
  545. package/src/styles/canon/graphviz.ts +71 -10
  546. package/src/styles/canon/number.ts +19 -0
  547. package/src/styles/canon/text.ts +187 -16
  548. package/src/styles/codes.ts +2 -0
  549. package/src/styles/cyjs/cascade.ts +1303 -84
  550. package/src/styles/cyjs/defaults-table.ts +4 -0
  551. package/src/styles/cyjs/emit.ts +268 -14
  552. package/src/styles/cyjs/face.ts +372 -0
  553. package/src/styles/cyjs/mappers.ts +506 -27
  554. package/src/styles/cyjs/routes.ts +432 -0
  555. package/src/styles/cytoscape/charts.ts +684 -0
  556. package/src/styles/cytoscape/emit.ts +170 -48
  557. package/src/styles/cytoscape/lexicon.ts +431 -78
  558. package/src/styles/cytoscape/mappings.ts +108 -0
  559. package/src/styles/cytoscape/resolve.ts +741 -17
  560. package/src/styles/defaults.ts +417 -108
  561. package/src/styles/index.ts +5 -0
  562. package/src/styles/internal.ts +1 -0
  563. package/src/styles/io/generic.ts +79 -23
  564. package/src/styles/io/round-trip.ts +202 -0
  565. package/src/styles/io/writer.ts +6 -1
  566. package/src/styles/notes.ts +1 -0
  567. package/src/styles/plan/features.ts +23 -2
  568. package/src/styles/plan/index.ts +1 -1
  569. package/src/styles/plan/plan.ts +69 -5
  570. package/src/styles/plan/resolve.ts +47 -4
  571. package/src/styles/slots.ts +25 -0
  572. package/src/styles/types.ts +698 -5
  573. package/src/styles/vocabulary.ts +232 -2
  574. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  575. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  576. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  577. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  578. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  579. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  580. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  581. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  582. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  583. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  584. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  585. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  586. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  587. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  588. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  589. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  590. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  591. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  592. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  593. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  594. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  595. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  596. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  597. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  598. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  599. package/dist/chunks/writer-DvHTl36J.js +0 -449
  600. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-yed-XeFBQ6VS.js","sources":["../../src/formats/graphml/styles-yed.ts"],"sourcesContent":["/**\n * yEd styles (yFiles for Java 2.x GraphML): reading every realizer a yEd graphics tree holds (`y:ShapeNode`,\n * `y:GenericNode`, `y:GroupNode`, `y:SVGNode`, `y:PolyLineEdge`, `y:BezierEdge`, ...) into the neutral style\n * vocabulary, and writing a graph's styles back as `y:ShapeNode` and `y:PolyLineEdge` graphics. The trees are the\n * json columns the GraphML importer keeps (tree.ts), never the typed `yfiles.*` columns read from them.\n *\n * The tree helpers here are shared with the yFiles 3 reader.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { toFilePositions, toNeutral } from \"../../positions/convert.js\";\nimport type { PositionColumnExtra } from \"../../positions/types.js\";\nimport {\n type BendPoint,\n bendsToPoints,\n canonBends,\n canonNodeOffsets,\n flattenCubic,\n flattenQuadSpline,\n nodeOffsetsToPoints,\n} from \"../../styles/canon/bends.js\";\nimport { canonColor, colorOpacity } from \"../../styles/canon/color.js\";\nimport { canonEnum } from \"../../styles/canon/enums.js\";\nimport { canonNumber, canonSigned } from \"../../styles/canon/number.js\";\nimport { type CanonSite, MAX_STYLE_VALUE_LENGTH, noteAt } from \"../../styles/canon/site.js\";\nimport { canonText } from \"../../styles/canon/text.js\";\nimport { STYLE_ISSUE } from \"../../styles/codes.js\";\nimport { JAVA_MONO, JAVA_SANS, JAVA_SERIF, javaFamily } from \"../../styles/cytoscape/lexicon.js\";\nimport { StyleApproximations } from \"../../styles/io/approximations.js\";\nimport { elementValues, takeFromBlock } from \"../../styles/io/round-trip.js\";\nimport type { ExporterStyleInput } from \"../../styles/io/writer.js\";\nimport { StyleNotes } from \"../../styles/notes.js\";\nimport { plainCell } from \"../../styles/plan/resolve.js\";\nimport type { StyleTarget, StyleValue, StyleWorkBudget, StyleWriteCapabilities } from \"../../styles/types.js\";\nimport type { LossNote } from \"../../types.js\";\n\n// ============================================================ the kept trees\n\n/** A tree object as tree.ts builds it: `@_<name>` attributes, `#text`, and child elements by name. */\ntype Tree = Record<string, unknown>;\n\n/**\n * Whether a value is a tree object.\n * @param value - the value\n * @returns true for a non-array object\n */\nexport function isTree(value: unknown): value is Tree {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The local part of an element name: `y:ShapeNode` is `ShapeNode`, whatever the prefix.\n * @param name - the name as written\n * @returns the local name\n */\nexport function localOf(name: string): string {\n const colon = name.indexOf(\":\");\n return colon < 0 ? name : name.slice(colon + 1);\n}\n\n/**\n * The child elements of a tree node with a local name, in file order.\n * @param node - the tree node\n * @param local - the local name\n * @returns the children\n */\nexport function treeChildren(node: unknown, local: string): unknown[] {\n const out: unknown[] = [];\n if (!isTree(node)) {\n return out;\n }\n for (const key of Object.keys(node)) {\n if (key.startsWith(\"@_\") || key === \"#text\" || localOf(key) !== local) {\n continue;\n }\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n out.push(item);\n }\n } else {\n out.push(value);\n }\n }\n return out;\n}\n\n/**\n * The first child element of a tree node with a local name.\n * @param node - the tree node\n * @param local - the local name\n * @returns the child, or undefined\n */\nexport function treeChild(node: unknown, local: string): unknown {\n if (!isTree(node)) {\n return undefined;\n }\n for (const key of Object.keys(node)) {\n if (!key.startsWith(\"@_\") && key !== \"#text\" && localOf(key) === local) {\n const value = node[key];\n return Array.isArray(value) ? value[0] : value;\n }\n }\n return undefined;\n}\n\n/**\n * An attribute of a tree node.\n * @param node - the tree node\n * @param name - the attribute name as written\n * @returns its text, or undefined\n */\nexport function treeAttr(node: unknown, name: string): string | undefined {\n if (!isTree(node) || !Object.hasOwn(node, `@_${name}`)) {\n return undefined;\n }\n const value = node[`@_${name}`];\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * The text of an element: the element itself when it has neither attributes nor children, else its `#text`.\n * @param node - the tree node\n * @returns the text, or null\n */\nexport function treeText(node: unknown): string | null {\n if (typeof node === \"string\") {\n return node;\n }\n if (isTree(node) && Object.hasOwn(node, \"#text\")) {\n const text = node[\"#text\"];\n return typeof text === \"string\" ? text : null;\n }\n return null;\n}\n\n/**\n * The json columns of a table holding yFiles trees.\n * @param table - the node, edge or graph table\n * @returns their names\n */\nfunction treeColumns(table: GraphSnapshot[\"nodes\"]): string[] {\n const out: string[] = [];\n for (const col of table) {\n if (col.dtype === \"json\" && col.meta.origin?.namespace === \"yfiles\") {\n out.push(col.meta.name);\n }\n }\n return out;\n}\n\n/**\n * Every column of a table the GraphML importer made from yFiles keys: the trees and the typed `yfiles.*` columns\n * read from them. They hold the styles themselves, so the planner never explains a style with them.\n * @param table - the node or edge table\n * @returns their names\n */\nexport function yfilesColumns(table: GraphSnapshot[\"nodes\"]): string[] {\n const out: string[] = [];\n for (const col of table) {\n if (col.meta.origin?.namespace === \"yfiles\") {\n out.push(col.meta.name);\n }\n }\n return out;\n}\n\n// ============================================================ reading\n\n/** One element's canonical value of a property; null leaves it unset. */\nexport type PutValue = (property: string, value: StyleValue | null) => void;\n\n/** Where a value of an element was read, by property. */\nexport type SiteOf = (property: string) => CanonSite;\n\n/** The yEd node realizers, by local name. */\nconst NODE_REALIZERS: ReadonlySet<string> = new Set([\n \"ShapeNode\",\n \"GenericNode\",\n \"GroupNode\",\n \"GenericGroupNode\",\n \"SVGNode\",\n \"ImageNode\",\n \"TableNode\",\n \"UMLClassNode\",\n \"UMLNoteNode\",\n \"ProxyAutoBoundsNode\",\n]);\n\n/** The yEd edge realizers, by local name. */\nconst EDGE_REALIZERS: ReadonlySet<string> = new Set([\n \"PolyLineEdge\",\n \"ArcEdge\",\n \"BezierEdge\",\n \"QuadCurveEdge\",\n \"SplineEdge\",\n \"GenericEdge\",\n]);\n\n/** A realizer: its local name and its element. */\ninterface Realizer {\n readonly type: string;\n readonly r: unknown;\n}\n\n/**\n * The realizer a graphics tree holds; a `y:ProxyAutoBoundsNode` (a folder or group) gives its active realizer.\n * @param tree - the `<data>` content\n * @param names - the realizer names of the target\n * @returns the realizer, or null\n */\nfunction realizerOf(tree: unknown, names: ReadonlySet<string>): Realizer | null {\n if (!isTree(tree)) {\n return null;\n }\n for (const key of Object.keys(tree)) {\n const type = localOf(key);\n if (key.startsWith(\"@_\") || !names.has(type)) {\n continue;\n }\n const value = tree[key];\n const r = Array.isArray(value) ? value[0] : value;\n return type === \"ProxyAutoBoundsNode\" ? activeRealizer(r) : { type, r };\n }\n return null;\n}\n\n/**\n * The active realizer of a `y:ProxyAutoBoundsNode`, else its first.\n * @param proxy - the proxy element\n * @returns the realizer, or null when it has none\n */\nfunction activeRealizer(proxy: unknown): Realizer | null {\n const realizers = treeChild(proxy, \"Realizers\");\n const all: Realizer[] = [];\n if (isTree(realizers)) {\n for (const k of Object.keys(realizers).filter((key) => !key.startsWith(\"@_\") && key !== \"#text\")) {\n for (const item of treeChildren(realizers, localOf(k))) {\n all.push({ type: localOf(k), r: item });\n }\n }\n }\n const active = Number(treeAttr(realizers, \"active\") ?? \"0\");\n return all[Number.isInteger(active) && active >= 0 && active < all.length ? active : 0] ?? null;\n}\n\n/** A shape a yEd configuration draws: a neutral shape, with its corners where it is a `polygon`. */\nexport interface YedOutline {\n readonly shape: string;\n /** The polygon's corners as neutral `shapePoints` (`x,y` fractions of the half sizes, y up). */\n readonly points?: string;\n}\n\n/**\n * Points along an elliptical arc, as `x,y` text: center (cx, cy), radii (rx, ry), from angle `from` to `to` (radians,\n * counter-clockwise, y up), both ends included.\n * @param cx - center x\n * @param cy - center y\n * @param rx - x radius\n * @param ry - y radius\n * @param from - first angle\n * @param to - last angle\n * @param steps - segments\n * @returns the points\n */\nfunction arcPoints(cx: number, cy: number, rx: number, ry: number, from: number, to: number, steps = 12): string[] {\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = from + ((to - from) * i) / steps;\n return pointText(cx + rx * Math.cos(t), cy + ry * Math.sin(t));\n });\n}\n\n/**\n * Points along a wave y = y0 + amp * sin(pi * x), x from `x0` to `x1`.\n * @param y0 - the wave's middle\n * @param amp - its height\n * @param x0 - first x\n * @param x1 - last x\n * @returns the points\n */\nfunction wavePoints(y0: number, amp: number, x0: number, x1: number): string[] {\n const steps = 16;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const x = x0 + ((x1 - x0) * i) / steps;\n return pointText(x, y0 + amp * Math.sin(Math.PI * x));\n });\n}\n\n/**\n * One corner as `x,y`, rounded to three decimals.\n * @param x - x\n * @param y - y\n * @returns the text\n */\nfunction pointText(x: number, y: number): string {\n const r = (v: number): string => String(Math.round(v * 1000) / 1000 + 0);\n return `${r(x)},${r(y)}`;\n}\n\nconst HALF_PI = Math.PI / 2;\n\n/** A cloud: a circle of bumps, stretched to the box. */\nconst CLOUD = Array.from({ length: 72 }, (_, i) => {\n const t = (2 * Math.PI * i) / 72;\n const r = 0.86 + 0.14 * Math.abs(Math.cos(4 * t));\n return pointText(r * Math.cos(t), r * Math.sin(t));\n}).join(\" \");\n\n/** A stadium: a box whose ends are half circles (a pill). */\nconst STADIUM = [\n ...arcPoints(0.5, 0, 0.5, 1, -HALF_PI, HALF_PI),\n ...arcPoints(-0.5, 0, 0.5, 1, HALF_PI, 3 * HALF_PI),\n].join(\" \");\n\n/**\n * The shape each configuration of yEd's GenericNode palettes draws (flowchart, entity relationship, BPMN, SBGN), by\n * its name after `com.yworks.` without a `.withShadow` suffix, lowercase. Matched whole, before the words below:\n * \"data\" is a parallelogram, but \"storedData\" and \"directData\" are not. A shape no neutral one names is the polygon\n * yEd draws it as (curves as short segments); the lines some draw inside (predefined process, internal storage) are\n * not drawn. Left out until a drawing by yEd itself shows them (ISSUES.md): the BPMN artifact, whose `type` property\n * picks among a data object, a data store, a message and others, and the SBGN nucleic acid feature and perturbing\n * agent, which draw.io, the stand-in, draws as plain boxes.\n */\nconst YED_CONFIGURATIONS: ReadonlyMap<string, YedOutline> = new Map<string, YedOutline>([\n [\"flowchart.process\", { shape: \"rectangle\" }],\n [\"flowchart.predefinedprocess\", { shape: \"rectangle\" }],\n [\"flowchart.internalstorage\", { shape: \"rectangle\" }],\n [\"flowchart.decision\", { shape: \"diamond\" }],\n [\"flowchart.terminator\", { shape: \"round-rectangle\" }],\n [\"flowchart.start1\", { shape: \"ellipse\" }],\n [\"flowchart.start2\", { shape: \"ellipse\" }],\n [\"flowchart.onpagereference\", { shape: \"ellipse\" }],\n [\"flowchart.sequentialdata\", { shape: \"ellipse\" }],\n [\"flowchart.data\", { shape: \"parallelogram\" }],\n [\"flowchart.preparation\", { shape: \"hexagon\" }],\n [\"flowchart.database\", { shape: \"other:database\" }],\n [\"flowchart.looplimit\", { shape: \"polygon\", points: \"-1,-1 1,-1 1,0.5 0.8,1 -0.8,1 -1,0.5\" }],\n [\"flowchart.looplimitend\", { shape: \"polygon\", points: \"-1,1 -1,-0.5 -0.8,-1 0.8,-1 1,-0.5 1,1\" }],\n [\"flowchart.manualinput\", { shape: \"polygon\", points: \"-1,-1 1,-1 1,1 -1,0.4\" }],\n [\"flowchart.card\", { shape: \"polygon\", points: \"-1,-1 1,-1 1,1 -0.6,1 -1,0.6\" }],\n [\"flowchart.manualoperation\", { shape: \"polygon\", points: \"-1,1 -0.7,-1 0.7,-1 1,1\" }],\n [\"flowchart.offpagereference\", { shape: \"polygon\", points: \"-1,1 -1,0 0,-1 1,0 1,1\" }],\n [\"flowchart.usermessage\", { shape: \"polygon\", points: \"-1,1 -1,-1 0.6,-1 1,0 0.6,1\" }],\n [\"flowchart.networkmessage\", { shape: \"polygon\", points: \"-1,1 -0.6,0 -1,-1 1,-1 1,1\" }],\n [\"flowchart.document\", { shape: \"polygon\", points: [\"-1,1\", ...wavePoints(-0.75, 0.2, -1, 1), \"1,1\"].join(\" \") }],\n [\n \"flowchart.papertype\",\n {\n shape: \"polygon\",\n points: [...wavePoints(-0.8, 0.2, -1, 1), ...wavePoints(0.8, 0.2, 1, -1)].join(\" \"),\n },\n ],\n [\n \"flowchart.delay\",\n { shape: \"polygon\", points: [\"-1,-1\", ...arcPoints(0, 0, 1, 1, -HALF_PI, HALF_PI), \"-1,1\"].join(\" \") },\n ],\n [\n \"flowchart.display\",\n {\n shape: \"polygon\",\n points: [\"-1,0\", \"-0.6,-1\", ...arcPoints(0.6, 0, 0.4, 1, -HALF_PI, HALF_PI), \"-0.6,1\"].join(\" \"),\n },\n ],\n [\n \"flowchart.storeddata\",\n {\n shape: \"polygon\",\n points: [\n ...arcPoints(1, 0, -0.2, 1, -HALF_PI, HALF_PI),\n ...arcPoints(-0.8, 0, 0.2, 1, HALF_PI, 3 * HALF_PI),\n ].join(\" \"),\n },\n ],\n [\n \"flowchart.directdata\",\n {\n shape: \"polygon\",\n points: [\n ...arcPoints(0.8, 0, 0.2, 1, -HALF_PI, HALF_PI),\n ...arcPoints(-0.8, 0, 0.2, 1, HALF_PI, 3 * HALF_PI),\n ].join(\" \"),\n },\n ],\n [\"flowchart.cloud\", { shape: \"polygon\", points: CLOUD }],\n [\"entityrelationship.relationship\", { shape: \"diamond\" }],\n [\"entityrelationship.attribute\", { shape: \"ellipse\" }],\n [\"bpmn.conversation\", { shape: \"hexagon\" }],\n [\"sbgn.unspecifiedentity\", { shape: \"ellipse\" }],\n [\"sbgn.simplechemical\", { shape: \"ellipse\" }],\n [\"sbgn.emptyset\", { shape: \"ellipse\" }],\n [\"sbgn.operator\", { shape: \"ellipse\" }],\n [\"sbgn.macromolecule\", { shape: \"round-rectangle\" }],\n [\"sbgn.phenotype\", { shape: \"hexagon\" }],\n [\"sbgn.process\", { shape: \"rectangle\" }],\n [\"sbgn.submap\", { shape: \"rectangle\" }],\n [\"sbgn.unitofinformation\", { shape: \"rectangle\" }],\n [\"sbgn.statevariable\", { shape: \"polygon\", points: STADIUM }],\n [\"sbgn.tag\", { shape: \"polygon\", points: \"-1,1 -1,-1 0.6,-1 1,0 0.6,1\" }],\n]);\n\n/**\n * The shape a yEd GenericNode configuration draws: a GraphML GenericNode's `configuration`, or a yEd GML node's\n * `customconfiguration`.\n * @param configuration - the configuration\n * @returns the shape, with its corners where it is a polygon, or null for a configuration not known here\n */\nexport function configurationOutline(configuration: string): YedOutline | null {\n const key = configuration\n .slice(0, MAX_STYLE_VALUE_LENGTH)\n .toLowerCase()\n .replace(/^com\\.yworks\\./, \"\")\n .replace(/\\.withshadow$/, \"\");\n return YED_CONFIGURATIONS.get(key) ?? null;\n}\n\n/** GenericNode configurations, by a word they contain, to the shape they draw; the first match wins. */\nconst GENERIC_SHAPES: readonly (readonly [string, string])[] = [\n // yEd's BPMN and entity-relationship palettes: a task is a rounded box, an event a circle, a\n // gateway a diamond, an attribute an ellipse\n [\"bpmn.activity\", \"round-rectangle\"],\n [\"bpmn.event\", \"ellipse\"],\n [\"bpmn.gateway\", \"diamond\"],\n [\"entityrelationship.attribute\", \"ellipse\"],\n [\"ellipse\", \"ellipse\"],\n [\"circle\", \"ellipse\"],\n [\"oval\", \"ellipse\"],\n [\"diamond\", \"diamond\"],\n [\"decision\", \"diamond\"],\n [\"hexagon\", \"hexagon\"],\n [\"octagon\", \"octagon\"],\n [\"triangle\", \"triangle\"],\n [\"rect\", \"rectangle\"],\n [\"process\", \"rectangle\"],\n [\"box\", \"rectangle\"],\n];\n\n/**\n * yEd's label positions (`modelPosition` of the internal, sides, sandwich, corners and eight-position models). The\n * internal model's `t` (inside the top of the box: a group's title) is `inside-top`; its other inside positions have\n * no neutral value and read as the nearest side or corner.\n */\nconst YED_POSITIONS: ReadonlyMap<string, string> = new Map([\n [\"c\", \"center\"],\n [\"t\", \"top\"],\n [\"b\", \"bottom\"],\n [\"l\", \"left\"],\n [\"r\", \"right\"],\n [\"tl\", \"top-left\"],\n [\"tr\", \"top-right\"],\n [\"bl\", \"bottom-left\"],\n [\"br\", \"bottom-right\"],\n [\"n\", \"top\"],\n [\"s\", \"bottom\"],\n [\"e\", \"right\"],\n [\"w\", \"left\"],\n [\"nw\", \"top-left\"],\n [\"ne\", \"top-right\"],\n [\"sw\", \"bottom-left\"],\n [\"se\", \"bottom-right\"],\n]);\n\n/** yEd's font styles, as label weight and italic. */\nexport const FONT_STYLES: ReadonlyMap<string, readonly [string, boolean]> = new Map([\n [\"plain\", [\"normal\", false]],\n [\"bold\", [\"bold\", false]],\n [\"italic\", [\"normal\", true]],\n [\"bolditalic\", [\"bold\", true]],\n]);\n\n/**\n * Reads a color into a property and its alpha into the property's opacity (or notes the alpha dropped).\n * @param raw - the attribute\n * @param property - the color property\n * @param opacity - its opacity property, or null when it has none\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readColor(raw: unknown, property: string, opacity: string | null, put: PutValue, at: SiteOf): void {\n const c = canonColor(raw, \"yed\", at(property));\n if (c === null) {\n return;\n }\n put(property, c.color);\n const alpha = colorOpacity(c, null, at(property), opacity !== null);\n if (opacity !== null) {\n put(opacity, alpha);\n }\n}\n\n/**\n * Reads an element's label: the first visible label with text (yEd icon nodes put an empty, `hasText=\"false\"`\n * label first); further visible labels are noted for the element.\n * @param labels - the label elements, in file order\n * @param node - whether they are node labels (which have a position)\n * @param put - receives the values\n * @param at - the sites\n * @param geometry - a node label's node `y:Geometry`, which places the label inside or outside the node\n */\nfunction readLabels(labels: readonly unknown[], node: boolean, put: PutValue, at: SiteOf, geometry?: unknown): void {\n let label: unknown = undefined;\n let text = \"\";\n let extra = 0;\n for (const l of labels) {\n const t = treeText(l)?.trim() ?? \"\";\n if (t.length === 0 || treeAttr(l, \"visible\") === \"false\" || treeAttr(l, \"hasText\") === \"false\") {\n continue;\n }\n if (label === undefined) {\n label = l;\n text = t;\n } else {\n extra++;\n }\n }\n if (label === undefined) {\n return;\n }\n if (extra > 0) {\n noteAt(at(\"label\"), STYLE_ISSUE.EXTRA_LABELS, `${String(extra + 1)} labels`);\n }\n put(\"label\", canonText(text, at(\"label\")));\n readLabelLook(label, node, put, at, geometry);\n}\n\n/**\n * Reads a label's look: its color, background box and its border, font and, for a node label, its position.\n * @param label - the label element\n * @param node - whether it is a node label\n * @param put - receives the values\n * @param at - the sites\n * @param geometry - a node label's node `y:Geometry`\n */\nfunction readLabelLook(label: unknown, node: boolean, put: PutValue, at: SiteOf, geometry?: unknown): void {\n readColor(treeAttr(label, \"textColor\"), \"labelColor\", null, put, at);\n // yEd draws a box behind the words in `backgroundColor` unless `hasBackgroundColor` is false\n if (treeAttr(label, \"hasBackgroundColor\") !== \"false\") {\n readColor(treeAttr(label, \"backgroundColor\"), \"labelBackground\", null, put, at);\n }\n // and a one-pixel line round that box in `lineColor` unless `hasLineColor` is false\n if (treeAttr(label, \"hasLineColor\") !== \"false\" && treeAttr(label, \"lineColor\") !== undefined) {\n readColor(treeAttr(label, \"lineColor\"), \"labelBorderColor\", null, put, at);\n put(\"labelBorderWidth\", 1);\n }\n put(\"labelSize\", canonNumber(treeAttr(label, \"fontSize\"), at(\"labelSize\")));\n // yEd is a Java program: its logical fonts (Dialog, SansSerif, Monospaced, ...) are drawn in the faces Java gives\n // them, and a font it does not have in Dialog's\n const font = canonText(treeAttr(label, \"fontFamily\"), at(\"labelFont\"));\n put(\"labelFont\", font === null ? null : javaFamily(font));\n const style = treeAttr(label, \"fontStyle\");\n if (style !== undefined) {\n const known = FONT_STYLES.get(style.trim().toLowerCase());\n if (known === undefined) {\n noteAt(at(\"labelWeight\"), STYLE_ISSUE.UNKNOWN_VALUE, style.slice(0, MAX_STYLE_VALUE_LENGTH));\n } else {\n put(\"labelWeight\", known[0]);\n put(\"labelItalic\", known[1]);\n }\n }\n readRotation(label, put, at);\n if (node) {\n const position = nodeLabelPosition(label, geometry, at);\n put(\"labelPosition\", position);\n readInsideInset(label, geometry, position, put);\n readOutsideOffset(label, geometry, position, put);\n }\n}\n\n/**\n * Reads a label's `rotationAngle`: yEd is a Java2D program, whose angles turn clockwise on screen (y down), as the\n * neutral `labelRotation` does.\n * @param label - the label element\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readRotation(label: unknown, put: PutValue, at: SiteOf): void {\n const angle = canonSigned(treeAttr(label, \"rotationAngle\"), at(\"labelRotation\"));\n if (angle === null) {\n return;\n }\n const turn = ((angle % 360) + 360) % 360;\n put(\"labelRotation\", turn === 0 ? null : turn);\n}\n\n/**\n * How far from where its position puts it a label outside its node, or placed freely, is drawn: yEd writes every\n * label's box as it draws it, so an outside label keeps its model's distance from the node (4 by default) and a\n * free label its offset. Across the side it is beside, the label is moved by the gap between the node and its box;\n * along that side (and on both axes for a free label over the node), by how far its box's middle is from the node's.\n * A turned label's box is not its words' box, so it is left where its position puts it.\n * @param label - the label element\n * @param geometry - the node's `y:Geometry`\n * @param position - where the label is placed\n * @param put - receives the values\n */\nfunction readOutsideOffset(label: unknown, geometry: unknown, position: string | null, put: PutValue): void {\n const model = treeAttr(label, \"modelName\");\n const free = position === \"center\" && model !== undefined && model !== \"internal\";\n if (position === null || position.startsWith(\"inside-\") || (position === \"center\" && !free)) {\n return;\n }\n if (Number(treeAttr(label, \"rotationAngle\") ?? 0) % 360 !== 0) {\n return;\n }\n const num = (o: unknown, k: string): number => Number(treeAttr(o, k) ?? Number.NaN);\n const [x, y, w, h] = [\"x\", \"y\", \"width\", \"height\"].map((k) => num(label, k));\n const [nw, nh] = [num(geometry, \"width\"), num(geometry, \"height\")];\n if (![x, y, w, h, nw, nh].every(Number.isFinite)) {\n return;\n }\n const signed = (value: number): number | null => {\n const r = Math.round(value * 1000) / 1000;\n return r === 0 ? null : r;\n };\n // across a side: the gap between the node and the box; along it: the box's middle against the node's\n const offset = (lo: number, size: number, extent: number, before: boolean, after: boolean): number | null => {\n if (before) {\n return signed(lo + size);\n }\n return after ? signed(lo - extent) : signed(lo + size / 2 - extent / 2);\n };\n put(\"labelOffsetX\", offset(x, w, nw, position.includes(\"left\"), position.includes(\"right\")));\n put(\"labelOffsetY\", offset(y, h, nh, position.includes(\"top\"), position.includes(\"bottom\")));\n}\n\n/**\n * How far in from the sides it is drawn against yEd puts a label inside its node (its internal model's insets, 4 by\n * default), from the label's stored box, for a label sized to its words: the label is moved that far right of a left side, left of a right side, down\n * from the top and up from the bottom.\n * @param label - the label element\n * @param geometry - the node's `y:Geometry`\n * @param position - where the label is placed\n * @param put - receives the values\n */\nfunction readInsideInset(label: unknown, geometry: unknown, position: string | null, put: PutValue): void {\n // a label sized to its node (a group's header band) has a box that is not its words'\n const sized = treeAttr(label, \"autoSizePolicy\")?.startsWith(\"node_\") === true;\n if (position?.startsWith(\"inside-\") !== true || sized) {\n return;\n }\n const num = (o: unknown, k: string): number => Number(treeAttr(o, k) ?? Number.NaN);\n const [x, y, w, h] = [\"x\", \"y\", \"width\", \"height\"].map((k) => num(label, k));\n const [nw, nh] = [num(geometry, \"width\"), num(geometry, \"height\")];\n const inset = (value: number): number | null =>\n Number.isFinite(value) && value > 0 ? Math.round(value * 1000) / 1000 : null;\n if (position.includes(\"left\")) {\n put(\"labelOffsetX\", inset(x));\n } else if (position.includes(\"right\")) {\n const gap = inset(nw - x - w);\n put(\"labelOffsetX\", gap === null ? null : -gap);\n }\n if (position.includes(\"top\")) {\n put(\"labelOffsetY\", inset(y));\n } else if (position.includes(\"bottom\")) {\n const gap = inset(nh - y - h);\n put(\"labelOffsetY\", gap === null ? null : -gap);\n }\n}\n\n/**\n * Where yEd draws a node label: from the label's box, which every model yEd writes stores relative to the node's\n * top-left corner (a label entirely beside the node is outside it on that side), else from its model. A label inside\n * the node is placed by its model: yEd's `internal` model puts it against a side or in a corner (`t`, `bl`, ...), or\n * in the middle (`c`); any other model's label inside the node is in its middle.\n * @param label - the label element\n * @param geometry - the node's `y:Geometry`\n * @param at - the sites\n * @returns the position, or null\n */\nfunction nodeLabelPosition(label: unknown, geometry: unknown, at: SiteOf): string | null {\n const outside = boxPosition(label, geometry);\n if (outside !== null && outside !== \"center\") {\n return outside;\n }\n const position = treeAttr(label, \"modelPosition\");\n const model = treeAttr(label, \"modelName\");\n if (model === \"internal\") {\n return insidePosition(label, position);\n }\n if (model === \"custom\") {\n return customPosition(label, outside, at);\n }\n if (outside !== null || position === undefined) {\n return outside;\n }\n const known = YED_POSITIONS.get(position.trim().toLowerCase());\n if (known === undefined) {\n noteAt(at(\"labelPosition\"), STYLE_ISSUE.UNKNOWN_VALUE, position.slice(0, MAX_STYLE_VALUE_LENGTH));\n }\n return known ?? null;\n}\n\n/**\n * Where a SmartNodeLabelModel (`custom`) label is drawn: where its stored box puts it, as for any other model, and\n * where its ratios put it when the file stores no box (a label hung from the node's top edge into it is a header\n * along its top). A box beside the node is handled before this.\n * @param label - the label element\n * @param outside - the box's position against the node, `center` or null\n * @param at - the sites\n * @returns the position, or null\n */\nfunction customPosition(label: unknown, outside: string | null, at: SiteOf): string | null {\n const smart = treeChild(treeChild(label, \"ModelParameter\"), \"SmartNodeLabelModelParameter\");\n if (smart === undefined) {\n noteAt(at(\"labelPosition\"), STYLE_ISSUE.UNKNOWN_VALUE, \"custom\");\n return outside;\n }\n // the stored box is where yEd drew the label; the ratios place it only when the file stores no box\n return outside ?? smartPosition(smart);\n}\n\n/**\n * The nearest neutral position of a SmartNodeLabelModel placement. yEd puts the point `labelRatio` of the label\n * (-0.5..0.5 of its size from its center) on the point `nodeRatio` of the node; the offsets are ignored. On each axis\n * a node ratio below or above zero is that side, zero is the middle. A label on the node's top edge that hangs down\n * into it (labelRatioY at or below zero) is `inside-top`; every other edge or corner placement is the outside side\n * or corner, the nearest neutral value (an inside bottom or side has none).\n * @param smart - the `y:SmartNodeLabelModelParameter` element\n * @returns the position\n */\nfunction smartPosition(smart: unknown): string {\n const ratio = (name: string): number => {\n const n = Number(treeAttr(smart, name));\n return Number.isFinite(n) ? n : 0;\n };\n const h = sideOf(ratio(\"nodeRatioX\"), \"left\", \"right\");\n const v = sideOf(ratio(\"nodeRatioY\"), \"top\", \"bottom\");\n if (v === \"top\" && h === \"\" && ratio(\"labelRatioY\") <= 0) {\n return \"inside-top\";\n }\n if (v === \"\" || h === \"\") {\n return v + h || \"center\";\n }\n return `${v}-${h}`;\n}\n\n/**\n * One axis of a SmartNodeLabelModel node ratio.\n * @param ratio - the ratio, -0.5..0.5\n * @param low - the side below zero\n * @param high - the side above zero\n * @returns the side, or \"\" for the middle\n */\nfunction sideOf(ratio: number, low: string, high: string): string {\n if (ratio < 0) {\n return low;\n }\n return ratio > 0 ? high : \"\";\n}\n\n/**\n * Where a label's box lies against its node: beside a side or a corner, or `center` when it overlaps the node.\n * @param label - the label element\n * @param geometry - the node's `y:Geometry`\n * @returns the position, or null when the label or the node has no box\n */\nfunction boxPosition(label: unknown, geometry: unknown): string | null {\n const num = (o: unknown, k: string): number => Number(treeAttr(o, k) ?? Number.NaN);\n const [x, y, w, h] = [\"x\", \"y\", \"width\", \"height\"].map((k) => num(label, k));\n const [nw, nh] = [num(geometry, \"width\"), num(geometry, \"height\")];\n if (![x, y, w, h, nw, nh].every(Number.isFinite)) {\n return null;\n }\n const side = (lo: number, size: number, extent: number): -1 | 0 | 1 => {\n if (lo + size <= 0) {\n return -1;\n }\n return lo >= extent ? 1 : 0;\n };\n return BOX_POSITIONS[side(y, h, nh) + 1][side(x, w, nw) + 1];\n}\n\n/**\n * Where yEd's internal model draws a label: in the middle, or inside the node against the side or in the corner its\n * `modelPosition` names. A label as wide as its node (a group's header) is drawn against the side its `alignment`\n * names, so a right-aligned header along the top is in the top-right corner.\n * @param label - the label element\n * @param position - its `modelPosition`\n * @returns the position\n */\nfunction insidePosition(label: unknown, position: string | undefined): string {\n const inside = INTERNAL_POSITIONS.get((position ?? \"c\").trim().toLowerCase()) ?? \"center\";\n const align = treeAttr(label, \"alignment\");\n const across = treeAttr(label, \"autoSizePolicy\") === \"node_width\" && (align === \"left\" || align === \"right\");\n return across && (inside === \"inside-top\" || inside === \"inside-bottom\") ? `${inside}-${align}` : inside;\n}\n\n/** yEd's internal label model positions, as the neutral position inside the node. */\nconst INTERNAL_POSITIONS: ReadonlyMap<string, string> = new Map([\n [\"c\", \"center\"],\n [\"t\", \"inside-top\"],\n [\"b\", \"inside-bottom\"],\n [\"l\", \"inside-left\"],\n [\"r\", \"inside-right\"],\n [\"tl\", \"inside-top-left\"],\n [\"tr\", \"inside-top-right\"],\n [\"bl\", \"inside-bottom-left\"],\n [\"br\", \"inside-bottom-right\"],\n]);\n\n/** A label's position by the side of the node it lies on: rows above, level, below; columns left, level, right. */\nconst BOX_POSITIONS: readonly (readonly string[])[] = [\n [\"top-left\", \"top\", \"top-right\"],\n [\"left\", \"center\", \"right\"],\n [\"bottom-left\", \"bottom\", \"bottom-right\"],\n];\n\n/**\n * The shape of a node realizer: its `y:Shape` where it has one, a GenericNode's configuration, or the realizer\n * type itself for one that draws an image (SVG, image, table, UML).\n * @param real - the realizer\n * @param at - the sites\n * @returns the shape, or null\n */\nfunction realizerShape(real: Realizer, at: SiteOf): string | null {\n const shape = treeChild(real.r, \"Shape\");\n if (shape !== undefined) {\n return canonEnum(\"shape\", treeAttr(shape, \"type\"), \"yed\", at(\"shape\"));\n }\n if (real.type === \"ShapeNode\" || real.type === \"GroupNode\" || real.type === \"GenericGroupNode\") {\n return null;\n }\n if (real.type === \"TableNode\") {\n // a yEd table or pool is a rectangle of bands\n return canonEnum(\"shape\", \"rectangle\", \"yed\", at(\"shape\"));\n }\n if (real.type === \"GenericNode\") {\n const conf = treeAttr(real.r, \"configuration\") ?? \"\";\n const known = configurationOutline(conf);\n if (known !== null) {\n return known.shape;\n }\n const lower = conf.slice(0, MAX_STYLE_VALUE_LENGTH).toLowerCase();\n for (const [word, value] of GENERIC_SHAPES) {\n if (lower.includes(word)) {\n return value;\n }\n }\n if (lower.length === 0) {\n return null;\n }\n noteAt(at(\"shape\"), STYLE_ISSUE.UNKNOWN_VALUE, lower);\n return `other:${lower}`;\n }\n noteAt(at(\"shape\"), STYLE_ISSUE.UNKNOWN_VALUE, real.type);\n return `other:${real.type}`;\n}\n\n/** yEd's gradient: from the fill color at a node's top-left corner to `color2` at its bottom-right one. */\nconst YED_GRADIENT_ANGLE = 45;\n\n/**\n * Reads a node realizer's fill: its color, and a gradient into `color2`. yEd paints no fill where the fill has no\n * color or is transparent.\n * @param real - the realizer\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readFill(real: Realizer, put: PutValue, at: SiteOf): void {\n const fill = treeChild(real.r, \"Fill\");\n if (fill === undefined) {\n return;\n }\n if (treeAttr(fill, \"hasColor\") === \"false\" || treeAttr(fill, \"transparent\") === \"true\") {\n noteAt(at(\"fill\"), STYLE_ISSUE.NO_FILL, \"transparent\");\n put(\"fillOpacity\", 0);\n return;\n }\n readColor(treeAttr(fill, \"color\"), \"fill\", \"fillOpacity\", put, at);\n const second = canonColor(treeAttr(fill, \"color2\"), \"yed\", at(\"fillGradient\"));\n if (second !== null) {\n put(\"fillGradient\", second.color);\n put(\"fillGradientAngle\", YED_GRADIENT_ANGLE);\n }\n}\n\n/**\n * A `y:TableNode`'s `yed.table.*` style property, as a color.\n * @param real - the table realizer\n * @param name - the property's name\n * @param at - the sites\n * @returns the `#rrggbb` color, or null when the table does not set it\n */\nfunction tableColor(real: Realizer, name: string, at: SiteOf): string | null {\n const props = treeChildren(treeChild(real.r, \"StyleProperties\"), \"Property\");\n const prop = props.find((p) => treeAttr(p, \"name\") === name);\n return prop === undefined ? null : (canonColor(treeAttr(prop, \"value\"), \"yed\", at(\"stripeColors\"))?.color ?? null);\n}\n\n/**\n * Reads a `y:TableNode` (a yEd table or BPMN pool) as bands over the node: its header (the table's top inset, or\n * its left one for columns side by side) in `yed.table.header.color.main`, then its rows top to bottom (or its\n * columns left to right) in `yed.table.lane.color.main` and `.alternating` by turns, then the opposite inset. A\n * color the table does not set is the node's fill. The lines between the lanes and the row and column headers\n * (`yed.table.header.color.alternating`) are not drawn.\n * @param real - the realizer\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readTable(real: Realizer, put: PutValue, at: SiteOf): void {\n const table = treeChild(real.r, \"Table\");\n const rows = treeChildren(treeChild(table, \"Rows\"), \"Row\");\n const columns = treeChildren(treeChild(table, \"Columns\"), \"Column\");\n const across = columns.length > 1 && rows.length <= 1;\n const lanes = (across ? columns : rows).map((l) => Number(treeAttr(l, across ? \"width\" : \"height\")));\n const insets = treeChild(table, \"Insets\");\n const inset = (side: string): number => Math.max(0, Number(treeAttr(insets, side) ?? 0) || 0);\n const [head, tail] = across ? [inset(\"left\"), inset(\"right\")] : [inset(\"top\"), inset(\"bottom\")];\n const sizes = [head, ...lanes, tail];\n const total = sizes.reduce((a, b) => a + b, 0);\n if (lanes.length === 0 || !sizes.every(Number.isFinite) || total <= 0) {\n return;\n }\n const fill =\n canonColor(treeAttr(treeChild(real.r, \"Fill\"), \"color\"), \"yed\", at(\"stripeColors\"))?.color ?? \"#ffffff\";\n const main = tableColor(real, \"yed.table.lane.color.main\", at) ?? fill;\n const alternating = tableColor(real, \"yed.table.lane.color.alternating\", at) ?? main;\n const header = tableColor(real, \"yed.table.header.color.main\", at) ?? fill;\n const bands = (\n [[head, header], ...lanes.map((size, i) => [size, i % 2 === 0 ? main : alternating]), [tail, fill]] as [\n number,\n string,\n ][]\n ).filter(([size]) => size > 0);\n put(\"stripeColors\", bands.map(([, color]) => color).join(\" \"));\n put(\"stripeSizes\", bands.map(([size]) => String(Number((size / total).toFixed(6)))).join(\" \"));\n if (across) {\n put(\"stripeDirection\", \"right\");\n }\n}\n\n/**\n * yEd's shared pictures (`<y:Resources>` on the graph): each resource's id to the picture as a URL, an SVG's text as\n * a `data:image/svg+xml` URL and a `java.awt.image.BufferedImage` (base64 PNG) as a `data:image/png` one.\n * @param snapshot - the graph\n * @returns the pictures by id\n */\nfunction yedResources(snapshot: GraphSnapshot): ReadonlyMap<string, string> {\n const out = new Map<string, string>();\n for (const col of snapshot.graph) {\n if (col.dtype !== \"json\" || col.meta.origin?.namespace !== \"yfiles\") {\n continue;\n }\n addYedResources(plainCell(snapshot.graph.value(col.meta.name, 0)), out);\n }\n return out;\n}\n\n/**\n * Adds the pictures of one yFiles graph value's `<y:Resources>`; an id already there keeps its picture.\n * @param root - the graph's yFiles value\n * @param out - the pictures by id, added to\n */\nfunction addYedResources(root: unknown, out: Map<string, string>): void {\n for (const resources of treeChildren(root, \"Resources\")) {\n for (const r of treeChildren(resources, \"Resource\")) {\n const id = treeAttr(r, \"id\");\n const url = id === undefined || out.has(id) ? null : yedResourceUrl(r);\n if (id !== undefined && url !== null) {\n out.set(id, url);\n }\n }\n }\n}\n\n/**\n * One `<y:Resource>` as a picture URL: a `java.awt.image.BufferedImage` (base64 PNG) as a `data:image/png` URL and\n * an SVG's text as a `data:image/svg+xml` one.\n * @param r - the resource element\n * @returns the URL, or null for an empty resource or one that is no picture\n */\nfunction yedResourceUrl(r: unknown): string | null {\n const text = treeText(r)?.trim() ?? \"\";\n if (text === \"\") {\n return null;\n }\n const type = treeAttr(r, \"type\") ?? \"\";\n if (type.endsWith(\"BufferedImage\")) {\n return `data:image/png;base64,${text.replaceAll(/\\s+/g, \"\")}`;\n }\n if (text.includes(\"<svg\")) {\n return `data:image/svg+xml;utf8,${encodeURIComponent(text)}`;\n }\n return null;\n}\n\n/**\n * The picture an image or SVG node realizer draws (`y:Image refid`, `y:SVGModel/y:SVGContent refid`), stretched over\n * the node's box, as yEd draws `y:ImageNode` and `y:SVGNode`. The realizer's own fill and border are kept beneath it:\n * whether yEd paints them under the picture waits for a drawing by yEd itself (ISSUES.md).\n * @param real - the realizer\n * @param resources - the graph's shared pictures\n * @param put - receives the values\n */\nfunction readPicture(real: Realizer, resources: ReadonlyMap<string, string>, put: PutValue): void {\n const ref =\n real.type === \"ImageNode\"\n ? treeAttr(treeChild(real.r, \"Image\"), \"refid\")\n : treeAttr(treeChild(treeChild(real.r, \"SVGModel\"), \"SVGContent\"), \"refid\");\n const src = ref === undefined ? undefined : resources.get(ref);\n if (src === undefined) {\n return;\n }\n put(\"image\", src);\n put(\"imageFit\", \"fill\");\n put(\"imageClip\", \"none\");\n}\n\n/**\n * Reads one node realizer.\n * @param real - the realizer\n * @param put - receives the values\n * @param at - the sites\n * @param resources - the graph's shared pictures, for image and SVG nodes\n */\nfunction readNode(real: Realizer, put: PutValue, at: SiteOf, resources?: ReadonlyMap<string, string>): void {\n const { r } = real;\n readFill(real, put, at);\n const border = treeChild(r, \"BorderStyle\");\n if (border !== undefined) {\n if (treeAttr(border, \"hasColor\") === \"false\") {\n put(\"borderWidth\", 0);\n } else {\n readColor(treeAttr(border, \"color\"), \"borderColor\", null, put, at);\n put(\"borderWidth\", canonNumber(treeAttr(border, \"width\"), at(\"borderWidth\")));\n }\n put(\"borderStyle\", canonEnum(\"borderStyle\", treeAttr(border, \"type\"), \"yed\", at(\"borderStyle\")));\n }\n const geometry = treeChild(r, \"Geometry\");\n put(\"width\", canonNumber(treeAttr(geometry, \"width\"), at(\"width\")));\n put(\"height\", canonNumber(treeAttr(geometry, \"height\"), at(\"height\")));\n put(\"shape\", realizerShape(real, at));\n const points =\n real.type === \"GenericNode\" ? configurationOutline(treeAttr(r, \"configuration\") ?? \"\")?.points : undefined;\n if (points !== undefined) {\n put(\"shapePoints\", points);\n }\n if (real.type === \"TableNode\") {\n readTable(real, put, at);\n }\n if (resources !== undefined && (real.type === \"ImageNode\" || real.type === \"SVGNode\")) {\n readPicture(real, resources, put);\n }\n readLabels(treeChildren(r, \"NodeLabel\"), true, put, at, geometry);\n}\n\n/**\n * Reads one edge realizer.\n * @param real - the realizer\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readEdge(real: Realizer, put: PutValue, at: SiteOf): void {\n const { r } = real;\n const line = treeChild(r, \"LineStyle\");\n if (line !== undefined) {\n readColor(treeAttr(line, \"color\"), \"color\", \"opacity\", put, at);\n put(\"width\", canonNumber(treeAttr(line, \"width\"), at(\"width\")));\n put(\"lineStyle\", canonEnum(\"lineStyle\", treeAttr(line, \"type\"), \"yed\", at(\"lineStyle\")));\n }\n const arrows = treeChild(r, \"Arrows\");\n if (arrows !== undefined) {\n put(\"sourceArrow\", canonEnum(\"arrow\", treeAttr(arrows, \"source\"), \"yed\", at(\"sourceArrow\")));\n put(\"targetArrow\", canonEnum(\"arrow\", treeAttr(arrows, \"target\"), \"yed\", at(\"targetArrow\")));\n }\n put(\"curved\", edgeCurved(real));\n if (real.type === \"ArcEdge\") {\n // the bend yEd saves is the arc's apex, `y:Arc height` from the line between the ends (every yEd-saved arc\n // in the corpus: scala-collection-mutable, Animatron__player__flow), so the arc is the circle through it\n put(\"bendCurve\", \"arc\");\n }\n readLabels(treeChildren(r, \"EdgeLabel\"), false, put, at);\n}\n\n/**\n * Whether an edge is drawn curved through its bends: an arc always; a spline only through its control points (with\n * none it is a straight line); a polyline, and a generic edge (a framed or styled polyline), only when it smooths\n * bends it has. A quad curve edge never, nor a Bezier edge of whole cubic pieces (two control points, five, ...): its\n * curve is flattened into points on it (`readEdgeRoute`), drawn straight from one to the next, as a Graphviz spline\n * is; rounding their corners cut inside the curve (a quad curve of straightness 1, whose points are its control\n * polygon, was drawn bowed).\n * @param real - the edge realizer\n * @returns true when curved, null when a polyline does not say whether it smooths\n */\nfunction edgeCurved(real: Realizer): boolean | null {\n if (real.type === \"ArcEdge\") {\n return true;\n }\n const points = treeChildren(treeChild(real.r, \"Path\"), \"Point\").length;\n if (real.type === \"QuadCurveEdge\") {\n return false;\n }\n if (real.type === \"BezierEdge\") {\n // a count of control points no run of cubic pieces takes is not flattened: its corners are rounded\n return points > 0 && (points + 1) % 3 !== 0;\n }\n const bent = points > 0;\n if (real.type !== \"PolyLineEdge\" && real.type !== \"GenericEdge\") {\n return bent;\n }\n const smoothed = treeAttr(treeChild(real.r, \"BendStyle\"), \"smoothed\");\n return smoothed === undefined ? null : smoothed === \"true\" && bent;\n}\n\n/**\n * An edge's route from its `y:Path`: the ports its ends attach at (`sx sy`, `tx ty`: offsets from the node centers),\n * relative to each node's size, and its bends, relative to the centers of its two nodes (a self-loop's to its node's\n * size). yEd draws a polyline, an arc or a spline through the points; a Bezier or quad curve edge takes them as\n * control points its curve does not pass through, so its curve is flattened into the points it does pass through.\n * @param real - the edge realizer\n * @param nodes - each node's center x and y, width and height\n * @param source - the source node's index\n * @param target - the target node's index\n * @param put - receives the values\n */\nfunction readEdgeRoute(real: Realizer, nodes: Float64Array, source: number, target: number, put: PutValue): void {\n const path = treeChild(real.r, \"Path\");\n const at = (k: number): BendPoint => [nodes[4 * k], nodes[4 * k + 1]];\n const size = (k: number): BendPoint => [nodes[4 * k + 2], nodes[4 * k + 3]];\n const offset = (key: string): number => Number(treeAttr(path, key) ?? 0) || 0;\n const ends: readonly [BendPoint, BendPoint] = [\n [at(source)[0] + offset(\"sx\"), at(source)[1] + offset(\"sy\")],\n [at(target)[0] + offset(\"tx\"), at(target)[1] + offset(\"ty\")],\n ];\n const port = (k: number, end: BendPoint): string | null =>\n end[0] === at(k)[0] && end[1] === at(k)[1] ? null : canonNodeOffsets(at(k), size(k), [end], true);\n put(\"sourcePort\", port(source, ends[0]));\n put(\"targetPort\", port(target, ends[1]));\n let points = treeChildren(path, \"Point\").map((p): BendPoint => [\n Number(treeAttr(p, \"x\")),\n Number(treeAttr(p, \"y\")),\n ]);\n if (points.length > 0 && (real.type === \"BezierEdge\" || real.type === \"QuadCurveEdge\")) {\n const controls = [ends[0], ...points, ends[1]];\n const curve =\n real.type === \"BezierEdge\"\n ? flattenCubic(controls)\n : flattenQuadSpline(controls, Number(treeAttr(real.r, \"straightness\") ?? YED_STRAIGHTNESS));\n points = (curve ?? controls).slice(1, -1);\n }\n put(\n \"bends\",\n source === target\n ? canonNodeOffsets(at(source), size(source), points, true)\n : canonBends(at(source), at(target), points, true),\n );\n}\n\n/** yEd's quad curve straightness when a file gives none. */\nconst YED_STRAIGHTNESS = 0.1;\n\n/** Canonical values per property, by element index. */\nexport type ValueColumns = Record<string, (StyleValue | null)[]>;\n\n/**\n * A collector of canonical values for one target.\n * @param n - the element count\n * @returns the values and a setter for element i\n */\nexport function valueColumns(n: number): {\n readonly values: ValueColumns;\n put(i: number, property: string, value: StyleValue | null): void;\n} {\n const values: ValueColumns = Object.create(null) as ValueColumns;\n return {\n values,\n put(i, property, value) {\n if (value !== null) {\n values[property] ??= new Array<StyleValue | null>(n).fill(null);\n values[property][i] = value;\n }\n },\n };\n}\n\n/** What the yEd reader read. */\nexport interface YedRead {\n /** Node values. */\n readonly node: ValueColumns;\n /** Edge values. */\n readonly edge: ValueColumns;\n}\n\n/**\n * The yEd styles of a graph: each element's realizer read into canonical values.\n * @param snapshot - the graph\n * @param notes - where problems are noted\n * @param budget - the work budget\n * @returns the values, or null when no element has a yEd realizer\n */\nexport function readYedStyles(snapshot: GraphSnapshot, notes: StyleNotes, budget: StyleWorkBudget): YedRead | null {\n let found = false;\n const resources = yedResources(snapshot);\n // each node's center, width and height, read with the node, for its edges' routes; NaN without yEd graphics\n const boxes = new Float64Array(4 * snapshot.nodeCount).fill(Number.NaN);\n const read = (target: StyleTarget): ValueColumns => {\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n const names = target === \"node\" ? NODE_REALIZERS : EDGE_REALIZERS;\n const columns = treeColumns(table);\n const out = valueColumns(n);\n if (columns.length === 0) {\n return out.values;\n }\n for (let i = 0; i < n; i++) {\n budget.spend(target, columns.length);\n let real: Realizer | null = null;\n for (let c = 0; c < columns.length && real === null; c++) {\n real = realizerOf(plainCell(table.value(columns[c], i)), names);\n }\n if (real === null) {\n continue;\n }\n found = true;\n const at: SiteOf = (property) => ({ notes, target, property, element: i, budget });\n const put: PutValue = (property, value) => {\n out.put(i, property, value);\n };\n if (target === \"node\") {\n readNode(real, put, at, resources);\n const geometry = treeChild(real.r, \"Geometry\");\n const [w, h] = [Number(treeAttr(geometry, \"width\")), Number(treeAttr(geometry, \"height\"))];\n boxes.set(\n [Number(treeAttr(geometry, \"x\")) + w / 2, Number(treeAttr(geometry, \"y\")) + h / 2, w, h],\n 4 * i,\n );\n } else {\n readEdge(real, put, at);\n readEdgeRoute(real, boxes, snapshot.edgeSource(i), snapshot.edgeTarget(i), put);\n }\n }\n return out.values;\n };\n const node = read(\"node\");\n const edge = read(\"edge\");\n return found ? { node, edge } : null;\n}\n\n// ============================================================ writing\n\n/**\n * What the GraphML writer holds natively: yEd `y:ShapeNode` and `y:PolyLineEdge` graphics. The `graphty.styles`\n * block is a graph `<data>` under its own key, and the per-element values its rules read are keys of their own.\n * @category Built-in formats\n */\nexport const GRAPHML_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({\n tool: \"yed\",\n node: Object.freeze([\n \"fill\",\n \"fillOpacity\",\n \"fillGradient\",\n \"fillGradientAngle\",\n \"borderColor\",\n \"borderWidth\",\n \"borderStyle\",\n \"shape\",\n \"width\",\n \"height\",\n \"label\",\n \"labelColor\",\n \"labelSize\",\n \"labelFont\",\n \"labelWeight\",\n \"labelItalic\",\n \"labelPosition\",\n ] as const),\n edge: Object.freeze([\n \"color\",\n \"opacity\",\n \"width\",\n \"lineStyle\",\n \"sourceArrow\",\n \"targetArrow\",\n \"curved\",\n \"bends\",\n \"sourcePort\",\n \"targetPort\",\n \"label\",\n \"labelColor\",\n \"labelSize\",\n \"labelFont\",\n \"labelWeight\",\n \"labelItalic\",\n ] as const),\n block: \"attributes\",\n});\n\n/** A written value and whether it is the exact value. */\ninterface Written {\n readonly value: string;\n readonly exact: boolean;\n}\n\n/** yEd's ShapeNode types, by the neutral shape each draws exactly. */\nexport const YED_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"ellipse\", \"ellipse\"],\n [\"rectangle\", \"rectangle\"],\n [\"round-rectangle\", \"roundrectangle\"],\n [\"triangle\", \"triangle\"],\n [\"diamond\", \"diamond\"],\n [\"hexagon\", \"hexagon\"],\n [\"octagon\", \"octagon\"],\n [\"parallelogram\", \"parallelogram\"],\n [\"trapezoid\", \"trapezoid\"],\n [\"star\", \"star5\"],\n]);\n\n/** yEd's line types, by the neutral line style each draws exactly. */\nexport const YED_LINES: ReadonlyMap<string, string> = new Map([\n [\"solid\", \"line\"],\n [\"dashed\", \"dashed\"],\n [\"dotted\", \"dotted\"],\n [\"dash-dot\", \"dashed_dotted\"],\n]);\n\n/** yEd's arrows, by the neutral arrow each draws exactly. */\nexport const YED_ARROWS: ReadonlyMap<string, string> = new Map([\n [\"none\", \"none\"],\n [\"triangle\", \"delta\"],\n [\"triangle-open\", \"white_delta\"],\n [\"vee\", \"standard\"],\n [\"tee\", \"t_shape\"],\n [\"diamond\", \"diamond\"],\n [\"diamond-open\", \"white_diamond\"],\n [\"circle\", \"circle\"],\n [\"circle-open\", \"white_circle\"],\n [\"square\", \"skewed_dash\"],\n [\"crow\", \"crows_foot_many\"],\n]);\n\n/** yEd's internal label model positions by neutral position: the center, and against a side or in a corner inside. */\nconst INTERNAL_MODEL_POSITIONS: ReadonlyMap<string, string> = new Map(\n [...INTERNAL_POSITIONS].map(([model, position]) => [position, model]),\n);\n\n/** yEd's eight-position label model positions by neutral position, all outside the node. */\nconst YED_MODEL_POSITIONS: ReadonlyMap<string, string> = new Map([\n [\"top\", \"n\"],\n [\"bottom\", \"s\"],\n [\"left\", \"w\"],\n [\"right\", \"e\"],\n [\"top-left\", \"nw\"],\n [\"top-right\", \"ne\"],\n [\"bottom-left\", \"sw\"],\n [\"bottom-right\", \"se\"],\n]);\n\n/**\n * A value of a table, or the nearest value the table has.\n * @param table - neutral value to yEd value\n * @param value - the neutral value\n * @param nearest - the yEd value written when the table has none\n * @returns the written value\n */\nexport function yedValue(table: ReadonlyMap<string, string>, value: string, nearest: string): Written {\n const exact = table.get(value);\n if (exact !== undefined) {\n return { value: exact, exact: true };\n }\n // a value the reader kept as other:<raw> goes back as written\n return value.startsWith(\"other:\") ? { value: value.slice(6), exact: true } : { value: nearest, exact: false };\n}\n\n/**\n * A color with an alpha from an opacity, as yEd writes it: `#RRGGBB`, or `#RRGGBBAA` with the alpha last.\n * @param color - the canonical color\n * @param opacity - the opacity, or null\n * @returns the text\n */\nexport function yedColor(color: string, opacity: StyleValue | null): string {\n const hex = color.toUpperCase();\n if (typeof opacity !== \"number\" || opacity >= 1) {\n return hex;\n }\n return (\n hex +\n Math.round(Math.max(0, opacity) * 255)\n .toString(16)\n .toUpperCase()\n .padStart(2, \"0\")\n );\n}\n\n/** Records a value written as the nearest one yEd has. */\ntype Approximate = (property: string, value: StyleValue) => void;\n\n/**\n * A value in yEd's spelling, recorded as approximated when yEd has no exact one.\n * @param table - yEd's spellings\n * @param value - the neutral value\n * @param nearest - the spelling written when there is no exact one\n * @param property - the property, for the approximation note\n * @param approximate - records approximations\n * @returns the spelling\n */\nexport function yedSpelled(\n table: ReadonlyMap<string, string>,\n value: string,\n nearest: string,\n property: string,\n approximate: Approximate,\n): string {\n const w = yedValue(table, value, nearest);\n if (!w.exact) {\n approximate(property, value);\n }\n return w.value;\n}\n\n/** One element's value of a property. */\ntype GetValue = (property: string) => StyleValue | null;\n\n/** The Java logical font each family the reader gives one is written back as. */\nconst JAVA_LOGICAL: Readonly<Record<string, string>> = {\n [JAVA_SANS]: \"Dialog\",\n [JAVA_SERIF]: \"Serif\",\n [JAVA_MONO]: \"Monospaced\",\n};\n\n/**\n * A CSS family as the one font name yEd reads: a Java logical font's family as that font, else the list's first name.\n * @param family - the CSS family or family list\n * @returns the font name\n */\nexport function yedFontName(family: string): string {\n return Object.hasOwn(JAVA_LOGICAL, family) ? JAVA_LOGICAL[family] : family.split(\",\")[0].trim();\n}\n\n/**\n * A label's font attributes: family, size and style.\n * @param get - the element's values\n * @returns the label element holding them\n */\nfunction labelFontTree(get: GetValue): Tree {\n const label: Tree = {};\n const font = get(\"labelFont\");\n if (typeof font === \"string\") {\n label[\"@_fontFamily\"] = yedFontName(font);\n }\n const size = get(\"labelSize\");\n if (typeof size === \"number\") {\n label[\"@_fontSize\"] = String(size);\n }\n const weight = get(\"labelWeight\");\n const italic = get(\"labelItalic\");\n if (weight !== null || italic !== null) {\n const style = (weight === \"bold\" ? \"bold\" : \"\") + (italic === true ? \"italic\" : \"\");\n label[\"@_fontStyle\"] = style.length === 0 ? \"plain\" : style;\n }\n return label;\n}\n\n/**\n * The label attributes and text of one element.\n * @param get - the element's values\n * @param node - whether it is a node label (which has a position)\n * @param approximate - records approximations\n * @returns the label element, or null when the element has no label text\n */\nfunction labelTree(get: GetValue, node: boolean, approximate: Approximate): Tree | null {\n const text = get(\"label\");\n if (typeof text !== \"string\" || text.trim().length === 0) {\n return null;\n }\n const label = labelFontTree(get);\n const color = get(\"labelColor\");\n if (typeof color === \"string\") {\n label[\"@_textColor\"] = color.toUpperCase();\n }\n const position = node ? get(\"labelPosition\") : null;\n if (typeof position === \"string\") {\n const inside = INTERNAL_MODEL_POSITIONS.get(position);\n const outside = YED_MODEL_POSITIONS.get(position);\n if (inside === undefined && outside === undefined) {\n approximate(\"labelPosition\", position);\n }\n // the center and the inside positions in yEd's internal model, the outside ones in its eight-position one\n label[\"@_modelName\"] = outside === undefined ? \"internal\" : \"eight_pos\";\n label[\"@_modelPosition\"] = outside ?? inside ?? \"c\";\n }\n label[\"#text\"] = text;\n return label;\n}\n\n/**\n * A node's `y:ShapeNode` from its values.\n * @param get - the node's values\n * @param at - the node's position from the graphics it had, or null\n * @param approximate - records approximations\n * @returns the graphics tree\n */\nfunction shapeNodeTree(get: GetValue, at: readonly [string, string] | null, approximate: Approximate): Tree {\n const node: Tree = {};\n node[\"y:Geometry\"] = geometryTree(get, at);\n const fill = get(\"fill\");\n const fillOpacity = get(\"fillOpacity\");\n if (typeof fill === \"string\") {\n node[\"y:Fill\"] = { \"@_color\": yedColor(fill, fillOpacity), \"@_transparent\": \"false\" };\n const second = get(\"fillGradient\");\n if (typeof second === \"string\") {\n (node[\"y:Fill\"] as Tree)[\"@_color2\"] = second.toUpperCase();\n const angle = get(\"fillGradientAngle\");\n if (angle !== YED_GRADIENT_ANGLE) {\n approximate(\"fillGradientAngle\", angle ?? 0);\n }\n }\n } else if (fillOpacity === 0) {\n node[\"y:Fill\"] = { \"@_hasColor\": \"false\", \"@_transparent\": \"false\" };\n }\n const border = lineTree(get, [\"borderColor\", \"borderWidth\", \"borderStyle\"], approximate);\n if (border !== null) {\n node[\"y:BorderStyle\"] = border;\n }\n const label = labelTree(get, true, approximate);\n if (label !== null) {\n node[\"y:NodeLabel\"] = label;\n }\n const shape = get(\"shape\");\n if (typeof shape === \"string\") {\n node[\"y:Shape\"] = {\n \"@_type\": yedSpelled(YED_SHAPES, shape, shape === \"vee\" ? \"triangle\" : \"rectangle\", \"shape\", approximate),\n };\n }\n return { \"y:ShapeNode\": node };\n}\n\n/**\n * A node's `y:Geometry`: its size, and its position from the graphics it had.\n * @param get - the node's values\n * @param at - the node's position, or null\n * @returns the geometry\n */\nfunction geometryTree(get: GetValue, at: readonly [string, string] | null): Tree {\n const geometry: Tree = {};\n const height = get(\"height\");\n const width = get(\"width\");\n if (typeof height === \"number\") {\n geometry[\"@_height\"] = String(height);\n }\n if (typeof width === \"number\") {\n geometry[\"@_width\"] = String(width);\n }\n if (at !== null) {\n geometry[\"@_x\"] = at[0];\n geometry[\"@_y\"] = at[1];\n }\n return geometry;\n}\n\n/**\n * A `y:BorderStyle` or `y:LineStyle`: a color, a width and a line type. A node's border color is written opaque; an\n * edge's color carries its opacity.\n * @param get - the element's values\n * @param properties - the color, width and style properties\n * @param approximate - records approximations\n * @param opacity - the opacity of the color, for an edge's line\n * @returns the element, or null when none of the three is set\n */\nfunction lineTree(\n get: GetValue,\n properties: readonly [string, string, string],\n approximate: Approximate,\n opacity?: StyleValue | null,\n): Tree | null {\n const [colorKey, widthKey, styleKey] = properties;\n const color = get(colorKey);\n const width = get(widthKey);\n const style = get(styleKey);\n if (color === null && width === null && style === null) {\n return null;\n }\n const line: Tree = {};\n if (typeof color === \"string\") {\n line[\"@_color\"] = opacity === undefined ? color.toUpperCase() : yedColor(color, opacity);\n }\n if (typeof style === \"string\") {\n const nearest = styleKey === \"lineStyle\" && style === \"long-dash\" ? \"dashed\" : \"line\";\n line[\"@_type\"] = yedSpelled(YED_LINES, style, nearest, styleKey, approximate);\n }\n if (typeof width === \"number\") {\n line[\"@_width\"] = String(width);\n }\n return line;\n}\n\n/**\n * An edge's `y:PolyLineEdge` from its values.\n * @param get - the edge's values\n * @param path - the `y:Path` of the graphics it had, or undefined\n * @param approximate - records approximations\n * @returns the graphics tree\n */\nfunction polyLineEdgeTree(get: GetValue, path: unknown, approximate: Approximate): Tree {\n const edge: Tree = {};\n if (path !== undefined) {\n edge[\"y:Path\"] = path;\n }\n const line = lineTree(get, [\"color\", \"width\", \"lineStyle\"], approximate, get(\"opacity\"));\n if (line !== null) {\n edge[\"y:LineStyle\"] = line;\n }\n const source = get(\"sourceArrow\");\n const target = get(\"targetArrow\");\n if (source !== null || target !== null) {\n const arrow = (property: string, value: StyleValue | null): string =>\n typeof value === \"string\" ? yedSpelled(YED_ARROWS, value, \"delta\", property, approximate) : \"none\";\n edge[\"y:Arrows\"] = { \"@_source\": arrow(\"sourceArrow\", source), \"@_target\": arrow(\"targetArrow\", target) };\n }\n const label = labelTree(get, false, approximate);\n if (label !== null) {\n edge[\"y:EdgeLabel\"] = label;\n }\n const curved = get(\"curved\");\n if (typeof curved === \"boolean\") {\n edge[\"y:BendStyle\"] = { \"@_smoothed\": String(curved) };\n }\n return { \"y:PolyLineEdge\": edge };\n}\n\n/**\n * For a file graphty wrote: where a value read from the yEd graphics is what the writer writes for the block's own\n * value (a pentagon written as a hexagon, an opacity rounded to yEd's 255 steps), the block's exact value is the\n * truth, so a re-import gives back the same rules; a value another program changed since stays the truth.\n * @param snapshot - the graph\n * @param text - the block's text\n * @param read - the values the reader read, changed in place\n */\nexport function exactFromBlock(snapshot: GraphSnapshot, text: string, read: YedRead): void {\n const notes = new StyleNotes();\n takeFromBlock(snapshot, text, \"graphml\", (target) => ({\n values: read[target],\n properties: GRAPHML_STYLE_CAPABILITIES[target],\n writes: GRAPHML_STYLE_CAPABILITIES[target],\n readBack: (_i, want) => {\n const back = writtenAndReadBack(target, want, notes);\n return back === null ? null : (property) => back.get(property) ?? null;\n },\n }));\n}\n\n/**\n * An element's values written as the writer writes them and read back as the reader reads them.\n * @param target - nodes or edges\n * @param want - its values\n * @param notes - a scratch for the notes the round trip makes\n * @returns the values read back, by property, or null when the written graphics hold no realizer\n */\nfunction writtenAndReadBack(target: StyleTarget, want: GetValue, notes: StyleNotes): Map<string, StyleValue> | null {\n const ignore: Approximate = () => undefined;\n const tree = target === \"node\" ? shapeNodeTree(want, null, ignore) : polyLineEdgeTree(want, undefined, ignore);\n const real = realizerOf(tree, target === \"node\" ? NODE_REALIZERS : EDGE_REALIZERS);\n if (real === null) {\n return null;\n }\n const back = new Map<string, StyleValue>();\n const at: SiteOf = (property) => ({ notes, target, property });\n const put: PutValue = (property, value) => {\n if (value !== null) {\n back.set(property, value);\n }\n };\n if (target === \"node\") {\n readNode(real, put, at);\n } else {\n readEdge(real, put, at);\n }\n return back;\n}\n\n/** A GraphML export with styles worked out. */\ninterface GraphmlStyledExport {\n /** The graph to write: the yFiles drawing columns replaced by yEd graphics written from the styles. */\n readonly snapshot: GraphSnapshot;\n /** W_STYLE_APPROXIMATED for every value written as the nearest one yEd has. */\n readonly notes: readonly LossNote[];\n}\n\n/** The yFiles key type of the written node and edge graphics. */\nconst GRAPHICS_TYPES: Readonly<Record<StyleTarget, string>> = { node: \"nodegraphics\", edge: \"edgegraphics\" };\n\n/**\n * 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.\n * @param table - the node table\n * @param columns - its tree columns\n * @param i - the node\n * @returns the x and y as written, or null\n */\nfunction keptPosition(table: GraphSnapshot[\"nodes\"], columns: readonly string[], i: number): [string, string] | null {\n for (const name of columns) {\n const tree = plainCell(table.value(name, i));\n const real = realizerOf(tree, NODE_REALIZERS);\n const geometry = real === null ? treeChild(tree, \"RectD\") : treeChild(real.r, \"Geometry\");\n const x = treeAttr(geometry, real === null ? \"X\" : \"x\");\n const y = treeAttr(geometry, real === null ? \"Y\" : \"y\");\n if (x !== undefined && y !== undefined) {\n return [x, y];\n }\n }\n return null;\n}\n\n/**\n * 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\n * column's coordinate read in its declared spelling (center, y up when it declares none), written as yEd places a\n * box, by its top-left corner with y growing downward.\n * @param snapshot - the graph\n * @param i - the node\n * @param get - the node's values (its drawn width and height)\n * @returns the x and y to write, or null when the node has no finite position\n */\nfunction columnPosition(snapshot: GraphSnapshot, i: number, get: GetValue): [string, string] | null {\n const column = snapshot.nodes.byRole(\"position\");\n if (column === null || column.meta.components < 2 || !column.isSet(i)) {\n return null;\n }\n const v = column.value(i) as ArrayLike<number>;\n const width = get(\"width\");\n const height = get(\"height\");\n const size: [number, number] = [typeof width === \"number\" ? width : 0, typeof height === \"number\" ? height : 0];\n const p: [number, number, number] = [v[0], v[1], 0];\n toNeutral(p, column.meta.extra ?? {}, size, false);\n const [x, y] = toFilePositions(Float64Array.from(p), YED_SPELLING, {\n width: Float64Array.of(size[0]),\n height: Float64Array.of(size[1]),\n });\n return Number.isFinite(x) && Number.isFinite(y) ? [String(x), String(y)] : null;\n}\n\n/** How yEd spells a node's place: its box's top-left corner, y growing downward. */\nconst YED_SPELLING: PositionColumnExtra = { yAxis: \"down\", anchor: \"top-left\" };\n\n/**\n * An edge's `y:Path` (its bends) from the yEd graphics it had.\n * @param table - the edge table\n * @param columns - its tree columns\n * @param e - the edge\n * @returns the path, or undefined\n */\nfunction keptPath(table: GraphSnapshot[\"edges\"], columns: readonly string[], e: number): unknown {\n for (const name of columns) {\n const real = realizerOf(plainCell(table.value(name, e)), EDGE_REALIZERS);\n const path = real === null ? undefined : treeChild(real.r, \"Path\");\n if (path !== undefined) {\n return path;\n }\n }\n return undefined;\n}\n\n/** A written node's center and its width and height. */\ntype WrittenBox = readonly [center: BendPoint, size: BendPoint];\n\n/**\n * An edge's `y:Path` with its points placed from its `bends` value between the written node centers (a self-loop's\n * around its node) and its ports from its `sourcePort` and `targetPort`, so they read back as written; a port with no\n * value keeps the one of the path it had. Without a bend or port value, or without both centers, the path it had.\n * @param kept - the path from the graphics the edge had, or undefined\n * @param get - the edge's values\n * @param ends - the written boxes of its source and target\n * @param loop - whether the edge is a self-loop\n * @returns the path, or undefined\n */\nfunction pathWithRoute(kept: unknown, get: GetValue, ends: readonly [WrittenBox, WrittenBox], loop: boolean): unknown {\n const bends = get(\"bends\");\n const [[c0, size0], [c1]] = ends;\n let points: BendPoint[] | null = null;\n if (typeof bends === \"string\") {\n points = loop ? nodeOffsetsToPoints(c0, size0, bends, true) : bendsToPoints(c0, c1, bends, true);\n }\n const ports = ([\"sourcePort\", \"targetPort\"] as const).map((property, k) => {\n const value = get(property);\n const [center, size] = ends[k];\n const at = typeof value === \"string\" ? nodeOffsetsToPoints(center, size, value, true) : null;\n return at === null ? null : [at[0][0] - center[0], at[0][1] - center[1]];\n });\n if (points === null && ports.every((p) => p === null)) {\n return kept;\n }\n const path: Tree = {};\n [\"sx\", \"sy\", \"tx\", \"ty\"].forEach((key, k) => {\n const port = ports[k >> 1];\n path[`@_${key}`] = port === null ? (treeAttr(kept, key) ?? \"0.0\") : String(port[k & 1]);\n });\n const written =\n points ??\n treeChildren(kept, \"Point\").map((q): BendPoint => [Number(treeAttr(q, \"x\")), Number(treeAttr(q, \"y\"))]);\n path[\"y:Point\"] = written.map(([x, y]) => ({ \"@_x\": String(x), \"@_y\": String(y) }));\n return path;\n}\n\n/**\n * A column name not yet taken in a table.\n * @param table - the table\n * @param base - the preferred name\n * @returns the name\n */\nfunction freeName(table: GraphSnapshot[\"nodes\"], base: string): string {\n let name = base;\n let k = 2;\n while (table.has(name)) {\n name = `${base}#${String(k)}`;\n k++;\n }\n return name;\n}\n\n/**\n * Works out a GraphML export with styles: every node and edge column made from yFiles keys (the graphics trees,\n * the typed `yfiles.*` columns and yFiles 3's drawing state) is replaced by yEd graphics written from what graphty\n * draws, keeping each node's position and each edge's bends from the graphics it had; graph data from yFiles 3\n * keys goes too, since its `y:` elements are not yEd's.\n * @param snapshot - the graph handed to the exporter\n * @param input - the styles, or undefined when none are written\n * @returns the styled export, or null without styles\n */\nexport function graphmlStyledExport(\n snapshot: GraphSnapshot,\n input: ExporterStyleInput | undefined,\n): GraphmlStyledExport | null {\n if (input === undefined) {\n return null;\n }\n const approximated = new StyleApproximations();\n const approximateFor =\n (target: StyleTarget): Approximate =>\n (property, value) => {\n approximated.add(target, property, value);\n };\n const picture = (target: StyleTarget, property: string): readonly (StyleValue | null)[] =>\n input.picture(target, property as never);\n const nodeColumns = treeColumns(snapshot.nodes);\n const edgeColumns = treeColumns(snapshot.edges);\n const getNode = elementValues(picture, \"node\", GRAPHML_STYLE_CAPABILITIES.node);\n const getEdge = elementValues(picture, \"edge\", GRAPHML_STYLE_CAPABILITIES.edge);\n const nodeTrees: (Tree | null)[] = [];\n for (let i = 0; i < snapshot.nodeCount; i++) {\n const get = getNode(i);\n const at = keptPosition(snapshot.nodes, nodeColumns, i) ?? columnPosition(snapshot, i, get);\n nodeTrees.push(shapeNodeTree(get, at, approximateFor(\"node\")));\n }\n const boxes = nodeTrees.map((tree): WrittenBox => {\n const geometry = treeChild(treeChild(tree, \"ShapeNode\"), \"Geometry\");\n const at = (k: string): number => Number(treeAttr(geometry, k) ?? Number.NaN);\n return [\n [at(\"x\") + at(\"width\") / 2, at(\"y\") + at(\"height\") / 2],\n [at(\"width\"), at(\"height\")],\n ];\n });\n const edgeTrees: (Tree | null)[] = [];\n for (let e = 0; e < snapshot.edgeCount; e++) {\n const get = getEdge(e);\n const [source, target] = [snapshot.edgeSource(e), snapshot.edgeTarget(e)];\n const path = pathWithRoute(\n keptPath(snapshot.edges, edgeColumns, e),\n get,\n [boxes[source], boxes[target]],\n source === target,\n );\n edgeTrees.push(polyLineEdgeTree(get, path, approximateFor(\"edge\")));\n }\n const out = snapshot.withColumns();\n for (const [table, trees, target] of [\n [out.nodes, nodeTrees, \"node\"],\n [out.edges, edgeTrees, \"edge\"],\n ] as const) {\n for (const name of yfilesColumns(table)) {\n table.remove(name);\n }\n const name = freeName(table, GRAPHICS_TYPES[target]);\n table.set(name, trees, {\n dtype: \"json\",\n nullable: true,\n origin: { format: \"graphml\", id: null, title: null, type: GRAPHICS_TYPES[target], namespace: \"yfiles\" },\n });\n }\n const yfiles3 = [...out.graph].filter(\n (col) => col.meta.origin?.namespace === \"yfiles\" && (col.meta.origin.type ?? \"\").includes(\"://\"),\n );\n for (const col of yfiles3) {\n out.graph.remove(col.meta.name);\n }\n return { snapshot: out, notes: approximated.notes(\"yEd\") };\n}\n"],"names":["name"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { INVALID_INDEX, GraphFormatError } from "@graphty/graph-format";
2
- import { P as PRECISION_CODE } from "./report-CgdsL9Hb.js";
2
+ import { P as PRECISION_CODE } from "./report-CwMfYa9J.js";
3
3
  const I32_TEXT = /^-?(0|[1-9]\d*)$/;
4
4
  const F64_TEXT = /^[+-]?((0|[1-9]\d*)(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/;
5
5
  const I32_MIN = -2147483648;
@@ -213,4 +213,4 @@ export {
213
213
  parseTextCell as p,
214
214
  trimTrailingZeros as t
215
215
  };
216
- //# sourceMappingURL=text-BuKQVMz2.js.map
216
+ //# sourceMappingURL=text-ystE2bYi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-BuKQVMz2.js","sources":["../../src/common/text.ts"],"sourcesContent":["/**\n * The fixed lexical grammar of design section 5.1 for untyped text sources (CSV cells, GML\n * values, DOT strings, Pajek tokens), reproduced from the core's reference implementation so the\n * two agree (invariant I15). Text importers parse each cell with parseTextCell() and push the JS\n * value; the sink's per-column inference then widens `bool -> i32 -> f64 -> string` and never per\n * cell, so a column that saw `1` and then `\"01\"` becomes string for all rows.\n *\n * - `bool` is exactly `true` / `false` (case-sensitive);\n * - `i32` is `/^-?(0|[1-9][0-9]*)$/` within `[-2^31, 2^31)`; `0` / `1` are i32, never bool;\n * - `f64` is a decimal or exponent literal accepted by `Number()` that is not empty, not\n * whitespace, not `Infinity` / `NaN`, not a hex / octal / binary form, has no leading zeros in\n * its integer part, and whose value is finite (an integer literal outside i32 range is f64);\n * - everything else is `string`.\n */\n\nimport { type ColumnHandle, GraphFormatError, type GraphSink, INVALID_INDEX } from \"@graphty/graph-format\";\n\nimport { PRECISION_CODE } from \"./codes.js\";\nimport { type ImportReportBuilder } from \"./report.js\";\n\nconst I32_TEXT = /^-?(0|[1-9]\\d*)$/;\nconst F64_TEXT = /^[+-]?((0|[1-9]\\d*)(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\nconst I32_MIN = -2147483648;\nconst I32_MAX = 2147483647;\n\n/**\n * The dtype a text cell parses as under the fixed text grammar.\n * @public\n * @category Plugin helpers\n */\nexport type TextDtype = \"bool\" | \"i32\" | \"f64\" | \"string\";\n\n/**\n * A digit string without its trailing zeros (`\"1200\"` becomes `\"12\"`).\n * @param digits - the digits\n * @returns the digits up to the last one that is not 0\n */\nexport function trimTrailingZeros(digits: string): string {\n let end = digits.length;\n while (end > 0 && digits[end - 1] === \"0\") {\n end--;\n }\n return digits.slice(0, end);\n}\n\n/**\n * Classify one text cell by the fixed grammar.\n * @param text - the cell text, exactly as read (no trimming)\n * @returns bool, i32, f64 or string\n * @category Plugin helpers\n */\nexport function inferTextDtype(text: string): TextDtype {\n if (text === \"true\" || text === \"false\") {\n return \"bool\";\n }\n if (I32_TEXT.test(text)) {\n const n = Number(text);\n if (n >= I32_MIN && n <= I32_MAX) {\n return \"i32\";\n }\n return Number.isFinite(n) ? \"f64\" : \"string\";\n }\n if (F64_TEXT.test(text) && Number.isFinite(Number(text))) {\n return \"f64\";\n }\n return \"string\";\n}\n\n/**\n * Parse one text cell into the JS value its grammar class implies: a boolean for bool, a number for\n * i32 / f64, the text itself for string. The sink infers the column dtype from the value.\n * @param text - the cell text, exactly as read\n * @returns the value\n * @category Plugin helpers\n */\nexport function parseTextCell(text: string): boolean | number | string {\n switch (inferTextDtype(text)) {\n case \"bool\":\n return text === \"true\";\n case \"i32\":\n case \"f64\":\n return Number(text);\n case \"string\":\n return text;\n default:\n return text;\n }\n}\n\n/**\n * Whether a text cell is a number under the f64 grammar (an i32 or f64 literal).\n * @param text - the cell text\n * @returns true when parseTextCell(text) returns a number\n * @category Plugin helpers\n */\nexport function isNumericText(text: string): boolean {\n const dtype = inferTextDtype(text);\n return dtype === \"i32\" || dtype === \"f64\";\n}\n\n/**\n * Whether a numeric cell text is the canonical spelling of its value (`String(value) === text`),\n * so that the sink's own re-formatting of the value would reproduce it.\n * @param text - the cell text\n * @param value - the parsed value\n * @returns true when the lexical form survives a widening to string\n */\nfunction isCanonicalNumberText(text: string, value: number): boolean {\n return String(value) === text;\n}\n\n/**\n * The widening rank of a text dtype in the design section 5.1 order.\n * @param dtype - the text dtype\n * @returns 0 for bool, 1 for i32, 2 for f64, 3 for string\n */\nfunction textDtypeRank(dtype: TextDtype): number {\n switch (dtype) {\n case \"bool\":\n return 0;\n case \"i32\":\n return 1;\n case \"f64\":\n return 2;\n case \"string\":\n return 3;\n default: {\n const name: string = dtype;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown text dtype ${name}`, { dtype: name });\n }\n }\n}\n\n/**\n * Writes the cells of one attribute of a text format whose values carry no type (CSV, DOT, Pajek):\n * you hand it each cell's text and it stores a number, a boolean or text, choosing one type for the\n * whole attribute. A column of `2.0`, `3.5` stays a number column with decimals even though `2.0`\n * alone looks like an integer, and once one cell turns out to be text, earlier cells such as `1e5`\n * are kept as written instead of as `100000`. Create one writer per attribute name and per kind\n * (\"node\" or \"edge\"), and call `write(index, text)` with the node or edge index the sink gave you:\n *\n * ```ts\n * const color = new TextCellWriter(\"color\", \"node\", sink, report);\n * color.write(sink.addNode(\"a\"), \"red\");\n * ```\n *\n * A sink that cannot change a column's type after the fact (one of your own without\n * `widenNodeColumn` / `widenEdgeColumn`) keeps the type the first values implied, with one W_WIDENING_UNSUPPORTED warning\n * per attribute.\n * @public\n * @category Writing a format\n */\nexport class TextCellWriter {\n /** The column name in the sink. */\n readonly name: string;\n\n private readonly domain: \"node\" | \"edge\";\n\n private readonly sink: GraphSink;\n\n private readonly report: ImportReportBuilder;\n\n private handle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n /** The widest text dtype seen (the column's dtype under the 5.1 grammar). */\n private textDtype: TextDtype | null = null;\n\n /** The widest dtype the pushed values imply (what the sink inferred on its own). */\n private valueDtype: TextDtype | null = null;\n\n private readonly keptRows: number[] = [];\n\n private readonly keptTexts: string[] = [];\n\n /**\n * Create a writer. The attribute is added to the sink on the first write.\n * @param name - the attribute name\n * @param domain - \"node\" for a node attribute, \"edge\" for an edge attribute\n * @param sink - the sink the importer fills\n * @param report - the import report, for warnings about the values\n */\n constructor(name: string, domain: \"node\" | \"edge\", sink: GraphSink, report: ImportReportBuilder) {\n this.name = name;\n this.domain = domain;\n this.sink = sink;\n this.report = report;\n }\n\n /**\n * The sink's handle of the attribute's column, for reading it back.\n * @returns the handle, or INVALID_INDEX before the first write\n */\n get column(): ColumnHandle {\n return this.handle;\n }\n\n /**\n * Write one cell.\n * @param row - the node or edge index, as the sink's addNode() or addEdge() returned it\n * @param text - the cell text, exactly as read from the file\n */\n write(row: number, text: string): void {\n const kind = inferTextDtype(text);\n const value = parseTextCell(text);\n this.warnIfImprecise(text, value);\n const wasString = this.textDtype === \"string\";\n const textDtype =\n this.textDtype === null || textDtypeRank(kind) > textDtypeRank(this.textDtype) ? kind : this.textDtype;\n // a string column keeps every cell's lexical form; a numeric text is never re-spelled. The\n // sink may refuse the value (a declared column of another dtype): the state advances only\n // once the cell is written, so a refused cell leaves the writer as it was.\n this.set(row, textDtype === \"string\" ? text : value);\n this.textDtype = textDtype;\n const valueKind = kindOfValue(value);\n if (this.valueDtype === null || textDtypeRank(valueKind) > textDtypeRank(this.valueDtype)) {\n this.valueDtype = valueKind;\n }\n if (this.textDtype === \"string\") {\n if (!wasString && this.keptRows.length > 0) {\n // the sink just widened the column to string from the values; restore the texts\n // whose lexical form the values did not carry\n for (let i = 0; i < this.keptRows.length; i++) {\n this.set(this.keptRows[i], this.keptTexts[i]);\n }\n this.keptRows.length = 0;\n this.keptTexts.length = 0;\n }\n return;\n }\n if (typeof value === \"number\" && !isCanonicalNumberText(text, value)) {\n this.keptRows.push(row);\n this.keptTexts.push(text);\n }\n if (this.textDtype === \"f64\" && this.valueDtype !== \"f64\") {\n this.widen(\"f64\");\n }\n }\n\n /**\n * Warn, once per column, when the cell is an integer beyond 2^53 that is stored as the nearest\n * double.\n * @param text - the cell text\n * @param value - the parsed value\n */\n private warnIfImprecise(text: string, value: unknown): void {\n if (\n typeof value === \"number\" &&\n !Number.isSafeInteger(value) &&\n I32_TEXT.test(text) &&\n BigInt(text) !== BigInt(value)\n ) {\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${this.domain} column \"${this.name}\": integers beyond 2^53 are stored as the nearest double (first: ${text})`,\n { element: this.name },\n `${PRECISION_CODE}:${this.domain}:${this.name}`,\n );\n }\n }\n\n /**\n * Write a value (the parsed scalar, or a text into a widened column).\n * @param row - the row\n * @param value - the value\n */\n private set(row: number, value: unknown): void {\n if (this.handle === INVALID_INDEX) {\n if (this.domain === \"node\") {\n this.sink.setNodeValue(this.name, row, value);\n this.handle = this.sink.nodeColumn(this.name);\n } else {\n this.sink.setEdgeValue(this.name, row, value);\n this.handle = this.sink.edgeColumn(this.name);\n }\n return;\n }\n if (this.domain === \"node\") {\n this.sink.setNodeValue(this.handle, row, value);\n } else {\n this.sink.setEdgeValue(this.handle, row, value);\n }\n }\n\n /**\n * Widen the column to the dtype the text grammar implies, through the sink's optional call.\n * @param dtype - the dtype\n */\n private widen(dtype: \"f64\"): void {\n const { sink } = this;\n const supported =\n this.domain === \"node\" ? sink.widenNodeColumn !== undefined : sink.widenEdgeColumn !== undefined;\n if (!supported) {\n this.report.warnOnce(\n \"coercion\",\n WIDENING_UNSUPPORTED_CODE,\n `column \"${this.name}\" holds ${dtype} text but the sink cannot widen an inferred column; it keeps the value-inferred dtype`,\n { element: this.name },\n );\n this.valueDtype = dtype;\n return;\n }\n try {\n if (this.domain === \"node\") {\n sink.widenNodeColumn?.(this.handle, dtype);\n } else {\n sink.widenEdgeColumn?.(this.handle, dtype);\n }\n this.valueDtype = dtype;\n } catch (err) {\n if (!(err instanceof GraphFormatError) || err.code !== \"E_COLUMN_TYPE\") {\n throw err;\n }\n // a caller's declared column of the name: its dtype stands\n this.valueDtype = dtype;\n }\n }\n}\n\n/**\n * Your graph builder cannot change an attribute's type after its first value, so a text column keeps the type of its\n * first values.\n * @category Issue and loss codes\n */\nexport const WIDENING_UNSUPPORTED_CODE = \"W_WIDENING_UNSUPPORTED\";\n\n/**\n * The text dtype a parsed cell value implies on its own (what the sink's inference sees). It must\n * be graph-format's inference rule exactly: -0 is an integer there, so a column holding only\n * `-0.0` is inferred i32 and must be widened to f64, or the sign is lost.\n * @param value - the parsed value\n * @returns the dtype\n */\nfunction kindOfValue(value: boolean | number | string): TextDtype {\n if (typeof value === \"boolean\") {\n return \"bool\";\n }\n if (typeof value === \"string\") {\n return \"string\";\n }\n return Number.isInteger(value) && value >= -2147483648 && value <= 2147483647 ? \"i32\" : \"f64\";\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"text-ystE2bYi.js","sources":["../../src/common/text.ts"],"sourcesContent":["/**\n * The fixed lexical grammar of design section 5.1 for untyped text sources (CSV cells, GML\n * values, DOT strings, Pajek tokens), reproduced from the core's reference implementation so the\n * two agree (invariant I15). Text importers parse each cell with parseTextCell() and push the JS\n * value; the sink's per-column inference then widens `bool -> i32 -> f64 -> string` and never per\n * cell, so a column that saw `1` and then `\"01\"` becomes string for all rows.\n *\n * - `bool` is exactly `true` / `false` (case-sensitive);\n * - `i32` is `/^-?(0|[1-9][0-9]*)$/` within `[-2^31, 2^31)`; `0` / `1` are i32, never bool;\n * - `f64` is a decimal or exponent literal accepted by `Number()` that is not empty, not\n * whitespace, not `Infinity` / `NaN`, not a hex / octal / binary form, has no leading zeros in\n * its integer part, and whose value is finite (an integer literal outside i32 range is f64);\n * - everything else is `string`.\n */\n\nimport { type ColumnHandle, GraphFormatError, type GraphSink, INVALID_INDEX } from \"@graphty/graph-format\";\n\nimport { PRECISION_CODE } from \"./codes.js\";\nimport { type ImportReportBuilder } from \"./report.js\";\n\nconst I32_TEXT = /^-?(0|[1-9]\\d*)$/;\nconst F64_TEXT = /^[+-]?((0|[1-9]\\d*)(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\nconst I32_MIN = -2147483648;\nconst I32_MAX = 2147483647;\n\n/**\n * The dtype a text cell parses as under the fixed text grammar.\n * @public\n * @category Plugin helpers\n */\nexport type TextDtype = \"bool\" | \"i32\" | \"f64\" | \"string\";\n\n/**\n * A digit string without its trailing zeros (`\"1200\"` becomes `\"12\"`).\n * @param digits - the digits\n * @returns the digits up to the last one that is not 0\n */\nexport function trimTrailingZeros(digits: string): string {\n let end = digits.length;\n while (end > 0 && digits[end - 1] === \"0\") {\n end--;\n }\n return digits.slice(0, end);\n}\n\n/**\n * Classify one text cell by the fixed grammar.\n * @param text - the cell text, exactly as read (no trimming)\n * @returns bool, i32, f64 or string\n * @category Plugin helpers\n */\nexport function inferTextDtype(text: string): TextDtype {\n if (text === \"true\" || text === \"false\") {\n return \"bool\";\n }\n if (I32_TEXT.test(text)) {\n const n = Number(text);\n if (n >= I32_MIN && n <= I32_MAX) {\n return \"i32\";\n }\n return Number.isFinite(n) ? \"f64\" : \"string\";\n }\n if (F64_TEXT.test(text) && Number.isFinite(Number(text))) {\n return \"f64\";\n }\n return \"string\";\n}\n\n/**\n * Parse one text cell into the JS value its grammar class implies: a boolean for bool, a number for\n * i32 / f64, the text itself for string. The sink infers the column dtype from the value.\n * @param text - the cell text, exactly as read\n * @returns the value\n * @category Plugin helpers\n */\nexport function parseTextCell(text: string): boolean | number | string {\n switch (inferTextDtype(text)) {\n case \"bool\":\n return text === \"true\";\n case \"i32\":\n case \"f64\":\n return Number(text);\n case \"string\":\n return text;\n default:\n return text;\n }\n}\n\n/**\n * Whether a text cell is a number under the f64 grammar (an i32 or f64 literal).\n * @param text - the cell text\n * @returns true when parseTextCell(text) returns a number\n * @category Plugin helpers\n */\nexport function isNumericText(text: string): boolean {\n const dtype = inferTextDtype(text);\n return dtype === \"i32\" || dtype === \"f64\";\n}\n\n/**\n * Whether a numeric cell text is the canonical spelling of its value (`String(value) === text`),\n * so that the sink's own re-formatting of the value would reproduce it.\n * @param text - the cell text\n * @param value - the parsed value\n * @returns true when the lexical form survives a widening to string\n */\nfunction isCanonicalNumberText(text: string, value: number): boolean {\n return String(value) === text;\n}\n\n/**\n * The widening rank of a text dtype in the design section 5.1 order.\n * @param dtype - the text dtype\n * @returns 0 for bool, 1 for i32, 2 for f64, 3 for string\n */\nfunction textDtypeRank(dtype: TextDtype): number {\n switch (dtype) {\n case \"bool\":\n return 0;\n case \"i32\":\n return 1;\n case \"f64\":\n return 2;\n case \"string\":\n return 3;\n default: {\n const name: string = dtype;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown text dtype ${name}`, { dtype: name });\n }\n }\n}\n\n/**\n * Writes the cells of one attribute of a text format whose values carry no type (CSV, DOT, Pajek):\n * you hand it each cell's text and it stores a number, a boolean or text, choosing one type for the\n * whole attribute. A column of `2.0`, `3.5` stays a number column with decimals even though `2.0`\n * alone looks like an integer, and once one cell turns out to be text, earlier cells such as `1e5`\n * are kept as written instead of as `100000`. Create one writer per attribute name and per kind\n * (\"node\" or \"edge\"), and call `write(index, text)` with the node or edge index the sink gave you:\n *\n * ```ts\n * const color = new TextCellWriter(\"color\", \"node\", sink, report);\n * color.write(sink.addNode(\"a\"), \"red\");\n * ```\n *\n * A sink that cannot change a column's type after the fact (one of your own without\n * `widenNodeColumn` / `widenEdgeColumn`) keeps the type the first values implied, with one W_WIDENING_UNSUPPORTED warning\n * per attribute.\n * @public\n * @category Writing a format\n */\nexport class TextCellWriter {\n /** The column name in the sink. */\n readonly name: string;\n\n private readonly domain: \"node\" | \"edge\";\n\n private readonly sink: GraphSink;\n\n private readonly report: ImportReportBuilder;\n\n private handle: ColumnHandle = INVALID_INDEX as ColumnHandle;\n\n /** The widest text dtype seen (the column's dtype under the 5.1 grammar). */\n private textDtype: TextDtype | null = null;\n\n /** The widest dtype the pushed values imply (what the sink inferred on its own). */\n private valueDtype: TextDtype | null = null;\n\n private readonly keptRows: number[] = [];\n\n private readonly keptTexts: string[] = [];\n\n /**\n * Create a writer. The attribute is added to the sink on the first write.\n * @param name - the attribute name\n * @param domain - \"node\" for a node attribute, \"edge\" for an edge attribute\n * @param sink - the sink the importer fills\n * @param report - the import report, for warnings about the values\n */\n constructor(name: string, domain: \"node\" | \"edge\", sink: GraphSink, report: ImportReportBuilder) {\n this.name = name;\n this.domain = domain;\n this.sink = sink;\n this.report = report;\n }\n\n /**\n * The sink's handle of the attribute's column, for reading it back.\n * @returns the handle, or INVALID_INDEX before the first write\n */\n get column(): ColumnHandle {\n return this.handle;\n }\n\n /**\n * Write one cell.\n * @param row - the node or edge index, as the sink's addNode() or addEdge() returned it\n * @param text - the cell text, exactly as read from the file\n */\n write(row: number, text: string): void {\n const kind = inferTextDtype(text);\n const value = parseTextCell(text);\n this.warnIfImprecise(text, value);\n const wasString = this.textDtype === \"string\";\n const textDtype =\n this.textDtype === null || textDtypeRank(kind) > textDtypeRank(this.textDtype) ? kind : this.textDtype;\n // a string column keeps every cell's lexical form; a numeric text is never re-spelled. The\n // sink may refuse the value (a declared column of another dtype): the state advances only\n // once the cell is written, so a refused cell leaves the writer as it was.\n this.set(row, textDtype === \"string\" ? text : value);\n this.textDtype = textDtype;\n const valueKind = kindOfValue(value);\n if (this.valueDtype === null || textDtypeRank(valueKind) > textDtypeRank(this.valueDtype)) {\n this.valueDtype = valueKind;\n }\n if (this.textDtype === \"string\") {\n if (!wasString && this.keptRows.length > 0) {\n // the sink just widened the column to string from the values; restore the texts\n // whose lexical form the values did not carry\n for (let i = 0; i < this.keptRows.length; i++) {\n this.set(this.keptRows[i], this.keptTexts[i]);\n }\n this.keptRows.length = 0;\n this.keptTexts.length = 0;\n }\n return;\n }\n if (typeof value === \"number\" && !isCanonicalNumberText(text, value)) {\n this.keptRows.push(row);\n this.keptTexts.push(text);\n }\n if (this.textDtype === \"f64\" && this.valueDtype !== \"f64\") {\n this.widen(\"f64\");\n }\n }\n\n /**\n * Warn, once per column, when the cell is an integer beyond 2^53 that is stored as the nearest\n * double.\n * @param text - the cell text\n * @param value - the parsed value\n */\n private warnIfImprecise(text: string, value: unknown): void {\n if (\n typeof value === \"number\" &&\n !Number.isSafeInteger(value) &&\n I32_TEXT.test(text) &&\n BigInt(text) !== BigInt(value)\n ) {\n this.report.warnOnce(\n \"precision\",\n PRECISION_CODE,\n `${this.domain} column \"${this.name}\": integers beyond 2^53 are stored as the nearest double (first: ${text})`,\n { element: this.name },\n `${PRECISION_CODE}:${this.domain}:${this.name}`,\n );\n }\n }\n\n /**\n * Write a value (the parsed scalar, or a text into a widened column).\n * @param row - the row\n * @param value - the value\n */\n private set(row: number, value: unknown): void {\n if (this.handle === INVALID_INDEX) {\n if (this.domain === \"node\") {\n this.sink.setNodeValue(this.name, row, value);\n this.handle = this.sink.nodeColumn(this.name);\n } else {\n this.sink.setEdgeValue(this.name, row, value);\n this.handle = this.sink.edgeColumn(this.name);\n }\n return;\n }\n if (this.domain === \"node\") {\n this.sink.setNodeValue(this.handle, row, value);\n } else {\n this.sink.setEdgeValue(this.handle, row, value);\n }\n }\n\n /**\n * Widen the column to the dtype the text grammar implies, through the sink's optional call.\n * @param dtype - the dtype\n */\n private widen(dtype: \"f64\"): void {\n const { sink } = this;\n const supported =\n this.domain === \"node\" ? sink.widenNodeColumn !== undefined : sink.widenEdgeColumn !== undefined;\n if (!supported) {\n this.report.warnOnce(\n \"coercion\",\n WIDENING_UNSUPPORTED_CODE,\n `column \"${this.name}\" holds ${dtype} text but the sink cannot widen an inferred column; it keeps the value-inferred dtype`,\n { element: this.name },\n );\n this.valueDtype = dtype;\n return;\n }\n try {\n if (this.domain === \"node\") {\n sink.widenNodeColumn?.(this.handle, dtype);\n } else {\n sink.widenEdgeColumn?.(this.handle, dtype);\n }\n this.valueDtype = dtype;\n } catch (err) {\n if (!(err instanceof GraphFormatError) || err.code !== \"E_COLUMN_TYPE\") {\n throw err;\n }\n // a caller's declared column of the name: its dtype stands\n this.valueDtype = dtype;\n }\n }\n}\n\n/**\n * Your graph builder cannot change an attribute's type after its first value, so a text column keeps the type of its\n * first values.\n * @category Issue and loss codes\n */\nexport const WIDENING_UNSUPPORTED_CODE = \"W_WIDENING_UNSUPPORTED\";\n\n/**\n * The text dtype a parsed cell value implies on its own (what the sink's inference sees). It must\n * be graph-format's inference rule exactly: -0 is an integer there, so a column holding only\n * `-0.0` is inferred i32 and must be widened to f64, or the sign is lost.\n * @param value - the parsed value\n * @returns the dtype\n */\nfunction kindOfValue(value: boolean | number | string): TextDtype {\n if (typeof value === \"boolean\") {\n return \"bool\";\n }\n if (typeof value === \"string\") {\n return \"string\";\n }\n return Number.isInteger(value) && value >= -2147483648 && value <= 2147483647 ? \"i32\" : \"f64\";\n}\n"],"names":[],"mappings":";;AAoBA,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,UAAU;AAcT,SAAS,kBAAkB,QAAwB;AACtD,MAAI,MAAM,OAAO;AACjB,SAAO,MAAM,KAAK,OAAO,MAAM,CAAC,MAAM,KAAK;AACvC;AAAA,EACJ;AACA,SAAO,OAAO,MAAM,GAAG,GAAG;AAC9B;AAQO,SAAS,eAAe,MAAyB;AACpD,MAAI,SAAS,UAAU,SAAS,SAAS;AACrC,WAAO;AAAA,EACX;AACA,MAAI,SAAS,KAAK,IAAI,GAAG;AACrB,UAAM,IAAI,OAAO,IAAI;AACrB,QAAI,KAAK,WAAW,KAAK,SAAS;AAC9B,aAAO;AAAA,IACX;AACA,WAAO,OAAO,SAAS,CAAC,IAAI,QAAQ;AAAA,EACxC;AACA,MAAI,SAAS,KAAK,IAAI,KAAK,OAAO,SAAS,OAAO,IAAI,CAAC,GAAG;AACtD,WAAO;AAAA,EACX;AACA,SAAO;AACX;AASO,SAAS,cAAc,MAAyC;AACnE,UAAQ,eAAe,IAAI,GAAA;AAAA,IACvB,KAAK;AACD,aAAO,SAAS;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACD,aAAO,OAAO,IAAI;AAAA,IACtB,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EAAA;AAEnB;AAQO,SAAS,cAAc,MAAuB;AACjD,QAAM,QAAQ,eAAe,IAAI;AACjC,SAAO,UAAU,SAAS,UAAU;AACxC;AASA,SAAS,sBAAsB,MAAc,OAAwB;AACjE,SAAO,OAAO,KAAK,MAAM;AAC7B;AAOA,SAAS,cAAc,OAA0B;AAC7C,UAAQ,OAAA;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,SAAS;AACL,YAAM,OAAe;AACrB,YAAM,IAAI,iBAAiB,iBAAiB,sBAAsB,IAAI,IAAI,EAAE,OAAO,MAAM;AAAA,IAC7F;AAAA,EAAA;AAER;AAqBO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BxB,YAAY,MAAc,QAAyB,MAAiB,QAA6B;AAnBjG,SAAQ,SAAuB;AAG/B,SAAQ,YAA8B;AAGtC,SAAQ,aAA+B;AAEvC,SAAiB,WAAqB,CAAA;AAEtC,SAAiB,YAAsB,CAAA;AAUnC,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAuB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAa,MAAoB;AACnC,UAAM,OAAO,eAAe,IAAI;AAChC,UAAM,QAAQ,cAAc,IAAI;AAChC,SAAK,gBAAgB,MAAM,KAAK;AAChC,UAAM,YAAY,KAAK,cAAc;AACrC,UAAM,YACF,KAAK,cAAc,QAAQ,cAAc,IAAI,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,KAAK;AAIjG,SAAK,IAAI,KAAK,cAAc,WAAW,OAAO,KAAK;AACnD,SAAK,YAAY;AACjB,UAAM,YAAY,YAAY,KAAK;AACnC,QAAI,KAAK,eAAe,QAAQ,cAAc,SAAS,IAAI,cAAc,KAAK,UAAU,GAAG;AACvF,WAAK,aAAa;AAAA,IACtB;AACA,QAAI,KAAK,cAAc,UAAU;AAC7B,UAAI,CAAC,aAAa,KAAK,SAAS,SAAS,GAAG;AAGxC,iBAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,eAAK,IAAI,KAAK,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC;AAAA,QAChD;AACA,aAAK,SAAS,SAAS;AACvB,aAAK,UAAU,SAAS;AAAA,MAC5B;AACA;AAAA,IACJ;AACA,QAAI,OAAO,UAAU,YAAY,CAAC,sBAAsB,MAAM,KAAK,GAAG;AAClE,WAAK,SAAS,KAAK,GAAG;AACtB,WAAK,UAAU,KAAK,IAAI;AAAA,IAC5B;AACA,QAAI,KAAK,cAAc,SAAS,KAAK,eAAe,OAAO;AACvD,WAAK,MAAM,KAAK;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAgB,MAAc,OAAsB;AACxD,QACI,OAAO,UAAU,YACjB,CAAC,OAAO,cAAc,KAAK,KAC3B,SAAS,KAAK,IAAI,KAClB,OAAO,IAAI,MAAM,OAAO,KAAK,GAC/B;AACE,WAAK,OAAO;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,KAAK,MAAM,YAAY,KAAK,IAAI,oEAAoE,IAAI;AAAA,QAC3G,EAAE,SAAS,KAAK,KAAA;AAAA,QAChB,GAAG,cAAc,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI;AAAA,MAAA;AAAA,IAErD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,IAAI,KAAa,OAAsB;AAC3C,QAAI,KAAK,WAAW,eAAe;AAC/B,UAAI,KAAK,WAAW,QAAQ;AACxB,aAAK,KAAK,aAAa,KAAK,MAAM,KAAK,KAAK;AAC5C,aAAK,SAAS,KAAK,KAAK,WAAW,KAAK,IAAI;AAAA,MAChD,OAAO;AACH,aAAK,KAAK,aAAa,KAAK,MAAM,KAAK,KAAK;AAC5C,aAAK,SAAS,KAAK,KAAK,WAAW,KAAK,IAAI;AAAA,MAChD;AACA;AAAA,IACJ;AACA,QAAI,KAAK,WAAW,QAAQ;AACxB,WAAK,KAAK,aAAa,KAAK,QAAQ,KAAK,KAAK;AAAA,IAClD,OAAO;AACH,WAAK,KAAK,aAAa,KAAK,QAAQ,KAAK,KAAK;AAAA,IAClD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,MAAM,OAAoB;AAC9B,UAAM,EAAE,SAAS;AACjB,UAAM,YACF,KAAK,WAAW,SAAS,KAAK,oBAAoB,SAAY,KAAK,oBAAoB;AAC3F,QAAI,CAAC,WAAW;AACZ,WAAK,OAAO;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI,WAAW,KAAK;AAAA,QACpC,EAAE,SAAS,KAAK,KAAA;AAAA,MAAK;AAEzB,WAAK,aAAa;AAClB;AAAA,IACJ;AACA,QAAI;AACA,UAAI,KAAK,WAAW,QAAQ;AACxB,aAAK,kBAAkB,KAAK,QAAQ,KAAK;AAAA,MAC7C,OAAO;AACH,aAAK,kBAAkB,KAAK,QAAQ,KAAK;AAAA,MAC7C;AACA,WAAK,aAAa;AAAA,IACtB,SAAS,KAAK;AACV,UAAI,EAAE,eAAe,qBAAqB,IAAI,SAAS,iBAAiB;AACpE,cAAM;AAAA,MACV;AAEA,WAAK,aAAa;AAAA,IACtB;AAAA,EACJ;AACJ;AAOO,MAAM,4BAA4B;AASzC,SAAS,YAAY,OAA6C;AAC9D,MAAI,OAAO,UAAU,WAAW;AAC5B,WAAO;AAAA,EACX;AACA,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO;AAAA,EACX;AACA,SAAO,OAAO,UAAU,KAAK,KAAK,SAAS,eAAe,SAAS,aAAa,QAAQ;AAC5F;"}
package/dist/csv.js CHANGED
@@ -1,11 +1,11 @@
1
- import { p as plural, R as ROLE_TAKEN_CODE$1, I as ID_MERGED_CODE$1, j as DUPLICATE_EDGE_ID_CODE$1, k as DUPLICATE_NODE_CODE$1, o as MISSING_ID_CODE$1, n as MISSING_ENDPOINT_CODE$1, E as EMPTY_INPUT_CODE$1, K as ImportReportBuilder, O as OPTION_IGNORED_CODE, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, C as COLUMN_RENAMED_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, P as PRECISION_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CgdsL9Hb.js";
2
- import { i as inferTextDtype, T as TextCellWriter, p as parseTextCell, W as WIDENING_UNSUPPORTED_CODE } from "./chunks/text-BuKQVMz2.js";
1
+ import { p as plural, R as ROLE_TAKEN_CODE$1, I as ID_MERGED_CODE$1, j as DUPLICATE_EDGE_ID_CODE$1, k as DUPLICATE_NODE_CODE$1, o as MISSING_ID_CODE$1, n as MISSING_ENDPOINT_CODE$1, E as EMPTY_INPUT_CODE$1, K as ImportReportBuilder, O as OPTION_IGNORED_CODE, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, C as COLUMN_RENAMED_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, P as PRECISION_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CwMfYa9J.js";
2
+ import { i as inferTextDtype, T as TextCellWriter, p as parseTextCell, W as WIDENING_UNSUPPORTED_CODE } from "./chunks/text-ystE2bYi.js";
3
3
  import { GraphFormatError, INVALID_INDEX } from "@graphty/graph-format";
4
- import { Q as DICT_SAMPLE_ROWS, D as DictHeuristic, d as resolveImportOptions, g as reportSinkOptions, f as reportUnusedOptions, i as DirectionResolver, I as IdCoercer, o as parseWeightText, u as uniqueColumnName, R as RENAMED_CODE, j as declareResolved, c as capabilities, L as LOSS, a as checkCapabilities, r as resolveExportOptions, p as pairFolding, e as explicitWeights, S as otherFormatDialect, U as countMixedEdges, G as joinListText, O as canonicalId } from "./chunks/export-CZ7VRm4I.js";
5
- import { b as throwIfAborted } from "./chunks/input-Ccg9I22A.js";
6
- import { s as stripLeadingComments, a as sniffNewline, b as sniffDelimiter, D as DELIMITER_CANDIDATES, C as CsvRecordReader, d as splitRecords, c as checkRecordSyntax, B as BAD_QUOTE_CODE, U as UNCLOSED_QUOTE_CODE } from "./chunks/records-Cgvxz-Vx.js";
7
- import { q as quoteCsvCell } from "./chunks/escape-DH2Egt-l.js";
8
- import { c as formatInteger, d as formatDecimal } from "./chunks/format-BMS-1Nxb.js";
4
+ import { O as DICT_SAMPLE_ROWS, D as DictHeuristic, b as resolveImportOptions, f as reportSinkOptions, d as reportUnusedOptions, I as IdCoercer, p as parseWeightText, u as uniqueColumnName, R as RENAMED_CODE, i as declareResolved, c as capabilities, L as LOSS, a as checkCapabilities, r as resolveExportOptions, e as explicitWeights, P as otherFormatDialect, G as countMixedEdges, C as joinListText, H as canonicalId } from "./chunks/export-Cha4dRFz.js";
5
+ import { D as DirectionResolver, p as pairFolding, c as formatInteger, d as formatDecimal } from "./chunks/format-BXiAb-1h.js";
6
+ import { b as throwIfAborted } from "./chunks/input-CAxt_aV-.js";
7
+ import { s as stripLeadingComments, a as sniffNewline, b as sniffDelimiter, D as DELIMITER_CANDIDATES, C as CsvRecordReader, d as splitRecords, c as checkRecordSyntax, B as BAD_QUOTE_CODE, U as UNCLOSED_QUOTE_CODE } from "./chunks/records-NJiYvekn.js";
8
+ import { g as quoteCsvCell } from "./chunks/escape-CuCIzNMB.js";
9
9
  import { j as joinText, e as encodeChunks } from "./chunks/writer-DxjgHwSe.js";
10
10
  const SOURCE_NAMES = Object.freeze([
11
11
  "source",
package/dist/cx.js CHANGED
@@ -1,5 +1,5 @@
1
- import { C, a, c } from "./chunks/exporter-DtVU80Fa.js";
2
- import { C as C2, c as c2 } from "./chunks/importer-Bji2MeWr.js";
1
+ import { C, a, c } from "./chunks/exporter-CA5q8ROP.js";
2
+ import { C as C2, c as c2 } from "./chunks/importer-CKbUbsJA.js";
3
3
  export {
4
4
  C as CX_CAPABILITIES,
5
5
  C2 as CX_ISSUE,
package/dist/cx2.js CHANGED
@@ -1,5 +1,5 @@
1
- import { C, a, c } from "./chunks/exporter-ChjL5fmP.js";
2
- import { C as C2, c as c2 } from "./chunks/importer-e3huMZbm.js";
1
+ import { C, a, c } from "./chunks/exporter-1Ajud15J.js";
2
+ import { C as C2, c as c2 } from "./chunks/importer-CyVZTrf0.js";
3
3
  export {
4
4
  C as CX2_CAPABILITIES,
5
5
  C2 as CX2_ISSUE,
package/dist/cys.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C, a, b, c, d } from "./chunks/importer-DPZDN40-.js";
1
+ import { C, a, b, c, d } from "./chunks/importer-CKFe4q54.js";
2
2
  export {
3
3
  C as CYS_CAPABILITIES,
4
4
  a as CYS_ISSUE,
package/dist/dot.js CHANGED
@@ -1,11 +1,15 @@
1
- import { D, a, b, d, c } from "./chunks/importer-CB_zV5_L.js";
2
- import { S } from "./chunks/block-Cu22ewuS.js";
1
+ import { D, a, d, b } from "./chunks/importer-ClCsdgTJ.js";
2
+ import { D as D2, R, a as a2, g } from "./chunks/styles-boK6Ln54.js";
3
+ import { S } from "./chunks/block-yl0f_qLO.js";
3
4
  export {
4
5
  D as DOT_ISSUE,
5
6
  a as DOT_LOSS,
6
7
  S as DOT_STYLE_BLOCK_ATTRIBUTE,
7
- b as DOT_STYLE_CAPABILITIES,
8
+ D2 as DOT_STYLE_CAPABILITIES,
9
+ R as RANK_COLUMN,
10
+ a2 as RANK_SET_COLUMN,
8
11
  d as dotExporter,
9
- c as dotImporter
12
+ b as dotImporter,
13
+ g as graphvizPosBends
10
14
  };
11
15
  //# sourceMappingURL=dot.js.map
package/dist/dot.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dot.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"dot.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
package/dist/gexf.js CHANGED
@@ -1,11 +1,11 @@
1
- import { K as ImportReportBuilder, E as EMPTY_INPUT_CODE, X as XML_NESTING_CODE, w as XML_SYNTAX_CODE, c as STRAY_TEXT_CODE, N as NO_GRAPH_CODE, e as UNKNOWN_XML_ATTRIBUTE_CODE, i as MULTIPLE_GRAPHS_CODE, g as COUNT_MISMATCH_CODE, h as COUNT_HINT_CODE, l as DUPLICATE_ATTRIBUTE_CODE, o as MISSING_ID_CODE, k as DUPLICATE_NODE_CODE, m as UNKNOWN_PARENT_CODE, a1 as PARENT_CYCLE_CODE, n as MISSING_ENDPOINT_CODE, j as DUPLICATE_EDGE_ID_CODE, P as PRECISION_CODE, T as BAD_VALUE_CODE, d as UNKNOWN_ELEMENT_CODE, I as ID_MERGED_CODE, p as plural, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, O as OPTION_IGNORED_CODE, R as ROLE_TAKEN_CODE, C as COLUMN_RENAMED_CODE, ac as BAD_OPTIONS_CODE, B as BAD_DEFAULT_CODE, U as UNKNOWN_ATTR_TYPE_CODE, r as ENCODING_CONFLICT_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, x as COLUMN_TYPE_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CgdsL9Hb.js";
1
+ import { K as ImportReportBuilder, E as EMPTY_INPUT_CODE, X as XML_NESTING_CODE, w as XML_SYNTAX_CODE, c as STRAY_TEXT_CODE, N as NO_GRAPH_CODE, e as UNKNOWN_XML_ATTRIBUTE_CODE, i as MULTIPLE_GRAPHS_CODE, g as COUNT_MISMATCH_CODE, h as COUNT_HINT_CODE, l as DUPLICATE_ATTRIBUTE_CODE, o as MISSING_ID_CODE, k as DUPLICATE_NODE_CODE, m as UNKNOWN_PARENT_CODE, a1 as PARENT_CYCLE_CODE, n as MISSING_ENDPOINT_CODE, j as DUPLICATE_EDGE_ID_CODE, P as PRECISION_CODE, T as BAD_VALUE_CODE, d as UNKNOWN_ELEMENT_CODE, I as ID_MERGED_CODE, p as plural, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, O as OPTION_IGNORED_CODE, R as ROLE_TAKEN_CODE, C as COLUMN_RENAMED_CODE, ac as BAD_OPTIONS_CODE, B as BAD_DEFAULT_CODE, U as UNKNOWN_ATTR_TYPE_CODE, r as ENCODING_CONFLICT_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, x as COLUMN_TYPE_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CwMfYa9J.js";
2
2
  import { GraphFormatError, INVALID_INDEX, MAX_COUNT } from "@graphty/graph-format";
3
- import { d as resolveImportOptions, g as reportSinkOptions, f as reportUnusedOptions, I as IdCoercer, i as DirectionResolver, m as isWeightField, n as declareAttribute, j as declareResolved, o as parseWeightText, q as overflowsToInfinity, s as parseDeclaredTemporal, t as declareCompanion, v as parseDeclaredValue, x as losesPrecision, y as parseTimeText, z as splitListText, A as timeTextCompanion, B as parseDecimalText, c as capabilities, L as LOSS, C as sanitizeIds, p as pairFolding, e as explicitWeights, r as resolveExportOptions, a as checkCapabilities, E as formatTimeValue, F as mapDeclaredType, G as joinListText, H as formatTemporal, J as isCanonicalIntegerText } from "./chunks/export-CZ7VRm4I.js";
4
- import { t as textChunks, b as throwIfAborted } from "./chunks/input-Ccg9I22A.js";
5
- import { t as tokenizeXml, b as xmlDeclaredEncoding, X as XmlEmptyInputError, c as XmlSyntaxError, d as XmlNestingError, s as sniffXmlText, l as localName, i as isWhitespace, x as xmlIllegalTextNotes, a as escapeXmlText, e as escapeXmlAttribute } from "./chunks/escape-DH2Egt-l.js";
6
- import { A as MAX_STYLE_BLOCK_LENGTH } from "./chunks/block-Cu22ewuS.js";
7
- import { g as gexfStyles, G as GEXF_FORMAT, N as NODE_DECLS, E as EDGE_DECLS, a as GRAPHTY_XML_NAMESPACE, b as GRAPH_MODES, T as TIME_FORMATS, c as TIME_REPRESENTATIONS, t as temporalTableName, d as temporalTableDecls, e as canonVizColor, O as OPEN_START, f as OPEN_END, R as RESERVED_NODE_NAMES, h as RESERVED_EDGE_NAMES, i as gexfStyledExport, j as GEXF_STYLE_CAPABILITIES, k as GEXF_NAMESPACES, p as parseTemporalTableName, l as TEMPORAL_COLUMNS, m as NODE_COLUMNS, V as VIZ_NAMESPACE, n as isListType, o as canonicalScalarType, q as isScalarType } from "./chunks/styles-P_gmFAOi.js";
8
- import { f as formatF32, a as formatF64, c as formatInteger } from "./chunks/format-BMS-1Nxb.js";
3
+ import { b as resolveImportOptions, f as reportSinkOptions, d as reportUnusedOptions, I as IdCoercer, k as isWeightField, l as declareAttribute, i as declareResolved, p as parseWeightText, o as overflowsToInfinity, m as parseDeclaredTemporal, n as declareCompanion, q as parseDeclaredValue, s as losesPrecision, t as parseTimeText, v as splitListText, x as timeTextCompanion, y as parseDecimalText, c as capabilities, L as LOSS, z as sanitizeIds, e as explicitWeights, r as resolveExportOptions, a as checkCapabilities, A as formatTimeValue, B as mapDeclaredType, C as joinListText, E as formatTemporal, F as isCanonicalIntegerText } from "./chunks/export-Cha4dRFz.js";
4
+ import { D as DirectionResolver, p as pairFolding, f as formatF32, a as formatF64, c as formatInteger } from "./chunks/format-BXiAb-1h.js";
5
+ import { t as textChunks, b as throwIfAborted } from "./chunks/input-CAxt_aV-.js";
6
+ import { t as tokenizeXml, b as xmlDeclaredEncoding, X as XmlEmptyInputError, c as XmlSyntaxError, d as XmlNestingError, s as sniffXmlText, l as localName, i as isWhitespace, x as xmlIllegalTextNotes, a as escapeXmlText, e as escapeXmlAttribute } from "./chunks/escape-CuCIzNMB.js";
7
+ import { u as MAX_STYLE_BLOCK_LENGTH } from "./chunks/block-yl0f_qLO.js";
8
+ import { g as gexfStyles, G as GEXF_FORMAT, N as NODE_DECLS, E as EDGE_DECLS, a as GRAPHTY_XML_NAMESPACE, b as GRAPH_MODES, T as TIME_FORMATS, c as TIME_REPRESENTATIONS, t as temporalTableName, d as temporalTableDecls, e as canonVizColor, O as OPEN_START, f as OPEN_END, R as RESERVED_NODE_NAMES, h as RESERVED_EDGE_NAMES, i as gexfStyledExport, j as GEXF_STYLE_CAPABILITIES, k as GEXF_NAMESPACES, p as parseTemporalTableName, l as TEMPORAL_COLUMNS, m as NODE_COLUMNS, V as VIZ_NAMESPACE, n as isListType, o as canonicalScalarType, q as isScalarType } from "./chunks/styles-CPczw1Jz.js";
9
9
  import { j as joinText, e as encodeChunks } from "./chunks/writer-DxjgHwSe.js";
10
10
  const NOT_GEXF_CODE = "E_NOT_GEXF";
11
11
  const MISSING_NODES_CODE = "E_GEXF_MISSING_NODES";
@@ -221,6 +221,7 @@ class GexfReader {
221
221
  this.metaText = "";
222
222
  this.metaField = null;
223
223
  this.styleBlock = "";
224
+ this.keptBlock = null;
224
225
  this.implicitNodes = /* @__PURE__ */ new Map();
225
226
  this.edgesFirst = false;
226
227
  this.nodeAttrs = /* @__PURE__ */ new Map();
@@ -380,6 +381,7 @@ class GexfReader {
380
381
  return;
381
382
  case 15:
382
383
  this.report.keepForStyles(this.styleBlock);
384
+ this.keptBlock = this.styleBlock;
383
385
  this.styleBlock = "";
384
386
  return;
385
387
  case 3:
@@ -2265,8 +2267,9 @@ class GexfReader {
2265
2267
  }
2266
2268
  /**
2267
2269
  * `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
2268
- * `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; a channel outside 0..255 or an alpha outside 0..1 is clamped and
2269
- * reported, as Gephi clamps it.
2270
+ * Gephi reads it (Java's `Color.decode`: `canonVizColor`), and wins over `r` / `g` / `b` when both are written, as Gephi
2271
+ * reads it (`gexf-specimen-node-fills-borders`, `color-hex-and-rgb`); a channel outside 0..255 or an alpha
2272
+ * outside 0..1 is clamped and reported, as Gephi clamps it.
2270
2273
  * @param attrs - the element's attributes
2271
2274
  * @param name - the element name as written
2272
2275
  * @param where - the element's location
@@ -2275,12 +2278,12 @@ class GexfReader {
2275
2278
  vizColor(attrs, name, where) {
2276
2279
  const hex = attrs.get("hex");
2277
2280
  let rgba;
2278
- if (hex !== void 0 && !attrs.has("r")) {
2281
+ if (hex !== void 0) {
2279
2282
  const c = canonVizColor(hex);
2280
2283
  if (c === null) {
2281
2284
  throw new GraphFormatError(
2282
2285
  "E_COLUMN_TYPE",
2283
- `viz hex="${hex}" is not a #RRGGBB, #RGB or #RRGGBBAA color`,
2286
+ `viz hex="${hex}" is not a color Gephi reads (a #-prefixed hexadecimal, 0x, octal or decimal integer)`,
2284
2287
  { attribute: "hex" }
2285
2288
  );
2286
2289
  }
@@ -2462,9 +2465,32 @@ function resolveGexfOptions(options) {
2462
2465
  }
2463
2466
  return viz;
2464
2467
  }
2468
+ function resolveGephiPreview(options) {
2469
+ const preview = options?.gephiPreview;
2470
+ if (preview === void 0) {
2471
+ return null;
2472
+ }
2473
+ const bad = (found) => {
2474
+ throw new GraphFormatError("E_UNSUPPORTED", "option gephiPreview: not an object of Preview property values", {
2475
+ option: "gephiPreview",
2476
+ found
2477
+ });
2478
+ };
2479
+ if (typeof preview !== "object" || preview === null || Array.isArray(preview)) {
2480
+ return bad(preview);
2481
+ }
2482
+ const out = {};
2483
+ for (const [name, value] of Object.entries(preview)) {
2484
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
2485
+ return bad(value);
2486
+ }
2487
+ out[name] = String(value);
2488
+ }
2489
+ return out;
2490
+ }
2465
2491
  const gexfImporter = Object.freeze({
2466
2492
  format: GEXF_FORMAT,
2467
- options: Object.freeze(["viz"]),
2493
+ options: Object.freeze(["viz", "gephiPreview"]),
2468
2494
  extensions: Object.freeze([".gexf"]),
2469
2495
  mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
2470
2496
  sniff: sniffGexf,
@@ -2505,6 +2531,10 @@ const gexfImporter = Object.freeze({
2505
2531
  throw err;
2506
2532
  }
2507
2533
  reader.finish();
2534
+ const preview = resolveGephiPreview(options);
2535
+ if (preview !== null) {
2536
+ report.keepForStyles({ block: reader.keptBlock, gephiPreview: preview });
2537
+ }
2508
2538
  throwIfAborted(resolved.signal);
2509
2539
  return report.finish();
2510
2540
  }