@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
package/dist/gml.js CHANGED
@@ -1,19 +1,60 @@
1
- import { Q as SYNTAX_CODE, p as plural, a as agree, R as ROLE_TAKEN_CODE$1, a2 as WIDENED_CODE$1, P as PRECISION_CODE$1, k as DUPLICATE_NODE_CODE$1, n as MISSING_ENDPOINT_CODE$1, o as MISSING_ID_CODE$1, i as MULTIPLE_GRAPHS_CODE, N as NO_GRAPH_CODE$1, K as ImportReportBuilder, C as COLUMN_RENAMED_CODE, 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, I as ID_MERGED_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CgdsL9Hb.js";
1
+ import { Q as SYNTAX_CODE, p as plural, a as agree, R as ROLE_TAKEN_CODE$1, a2 as WIDENED_CODE$1, P as PRECISION_CODE$1, k as DUPLICATE_NODE_CODE$1, n as MISSING_ENDPOINT_CODE$1, o as MISSING_ID_CODE$1, i as MULTIPLE_GRAPHS_CODE, N as NO_GRAPH_CODE$1, K as ImportReportBuilder, C as COLUMN_RENAMED_CODE, 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, I as ID_MERGED_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CwMfYa9J.js";
2
2
  import { GraphFormatError, INVALID_INDEX } from "@graphty/graph-format";
3
- import { c as capabilities, a as checkCapabilities, L as LOSS, p as pairFolding, C as sanitizeIds, U as countMixedEdges, e as explicitWeights, r as resolveExportOptions, D as DictHeuristic, Q as DICT_SAMPLE_ROWS, d as resolveImportOptions, f as reportUnusedOptions, g as reportSinkOptions, h as graphChosen, I as IdCoercer, i as DirectionResolver, u as uniqueColumnName, w as weightFromValue, V as reportWeightPrecision, o as parseWeightText, j as declareResolved } from "./chunks/export-CZ7VRm4I.js";
4
- import { k as decodeGmlString, m as quoteGmlString } from "./chunks/escape-DH2Egt-l.js";
5
- import { c as formatInteger, e as formatGmlReal } from "./chunks/format-BMS-1Nxb.js";
3
+ import { c as capabilities, a as checkCapabilities, L as LOSS, z as sanitizeIds, G as countMixedEdges, e as explicitWeights, r as resolveExportOptions, D as DictHeuristic, O as DICT_SAMPLE_ROWS, b as resolveImportOptions, d as reportUnusedOptions, f as reportSinkOptions, h as graphChosen, I as IdCoercer, u as uniqueColumnName, w as weightFromValue, S as reportWeightPrecision, p as parseWeightText, i as declareResolved } from "./chunks/export-Cha4dRFz.js";
4
+ import { p as pairFolding, c as formatInteger, e as formatGmlReal, D as DirectionResolver } from "./chunks/format-BXiAb-1h.js";
5
+ import { k as decodeGmlString, m as quoteGmlString } from "./chunks/escape-CuCIzNMB.js";
6
6
  import { j as joinText, e as encodeChunks } from "./chunks/writer-DxjgHwSe.js";
7
- import { y as yedValue, a as yedColor, b as yedSpelled, c as bendsToPoints, Y as YED_SHAPES, d as YED_LINES, v as valueColumns, e as canonBends, f as flowchartShape, F as FONT_STYLES, g as YED_ARROWS } from "./chunks/styles-yed-Cs1nmrjn.js";
8
- import { w as writeStyleBlock, c as styleBlockLosses, u as StyleNotes, b as styleTag, p as plainCell, v as parseStyleBlock, s as styleFingerprint, x as blockStyles, o as canonText, r as resolveStyles, h as canonNumber, l as canonEnum, n as noteAt, M as MAX_STYLE_VALUE_LENGTH, a as STYLE_ISSUE, g as canonColor, y as colorOpacity, k as scalarText, S as STYLE_BLOCK_NAME } from "./chunks/block-Cu22ewuS.js";
9
- import { C as CYTOSCAPE_LEXICON } from "./chunks/lexicon-u2SI5xcx.js";
10
- import { S as StyleApproximations } from "./chunks/approximations-C2riR4NT.js";
11
- import { d as dataRead } from "./chunks/writer-DvHTl36J.js";
12
- import { r as gephiRules } from "./chunks/styles-P_gmFAOi.js";
13
- import { i as importChosenGraph } from "./chunks/choose-Cdx6Enl2.js";
14
- import { r as readText, b as throwIfAborted } from "./chunks/input-Ccg9I22A.js";
7
+ import { n as nodeOffsetsToPoints, b as bendsToPoints, c as canonNodeOffsets, d as canonBends } from "./chunks/bends-BGXjv_U4.js";
8
+ import { A as writeStyleBlock, B as styleBlockLosses, h as StyleNotes, z as styleTag, p as plainCell, m as parseStyleBlock, o as styleFingerprint, f as canonText, c as canonNumber, n as noteAt, b as STYLE_ISSUE, s as scalarText, M as MAX_STYLE_VALUE_LENGTH, i as num6, d as canonColor, a as canonEnum, g as canonSigned, e as colorOpacity, S as STYLE_BLOCK_NAME } from "./chunks/block-yl0f_qLO.js";
9
+ import { j as javaFamily, C as CYTOSCAPE_LEXICON } from "./chunks/lexicon-IVRq2Uoo.js";
10
+ import { S as StyleApproximations } from "./chunks/approximations-BRXsll0T.js";
11
+ import { e as elementValues, t as takeFromBlock } from "./chunks/round-trip-Cy3_SHRZ.js";
12
+ import { m as dataRead, n as graphvizRouteBends, o as graphvizHasNoOutline, p as PERIPHERY_GAP, q as SHAPE_PERIPHERIES, r as graphvizOutline, s as putGlyph, t as graphvizArrowValue } from "./chunks/styles-boK6Ln54.js";
13
+ import { G as GRAPHVIZ_GLYPH_SHAPES, i as importChosenGraph } from "./chunks/choose-CczZJaX_.js";
14
+ import { r as gephiRules } from "./chunks/styles-CPczw1Jz.js";
15
+ import { y as yedValue, a as yedColor, b as yedSpelled, c as yedFontName, Y as YED_SHAPES, d as YED_LINES, v as valueColumns, e as configurationOutline, F as FONT_STYLES, f as YED_ARROWS } from "./chunks/styles-yed-XeFBQ6VS.js";
15
16
  import { t as toolOf } from "./chunks/units-XMZFIFe1.js";
16
- import { m as median } from "./chunks/convert-BcQ8_jMo.js";
17
+ import { m as median } from "./chunks/convert-Ct2zelbQ.js";
18
+ import { r as readText, b as throwIfAborted } from "./chunks/input-CAxt_aV-.js";
19
+ const GRAPHICS_COLUMN = "graphics";
20
+ function gmlPositions(snapshot) {
21
+ if (snapshot.nodes.byRole("position") === null) {
22
+ return null;
23
+ }
24
+ const inGraph = snapshot.graph.has("Creator") ? snapshot.graph.value("Creator", 0) : null;
25
+ const gv2gml = writtenByGv2gml(snapshot);
26
+ const graphCreator = typeof inGraph === "string" ? inGraph : null;
27
+ const tool = gv2gml ? "graphviz" : toolOf(snapshot.meta.creator ?? graphCreator);
28
+ return {
29
+ units: "px",
30
+ // a z that is the same on every node collapses to 2D
31
+ sourceDims: 3,
32
+ // gv2gml writes Graphviz's own coordinates, y up
33
+ yAxis: tool === "gephi" || tool === "tulip" || gv2gml ? "up" : "down",
34
+ tool,
35
+ medianNodeSize: graphicsMedian(snapshot, tool === "gephi")
36
+ };
37
+ }
38
+ function writtenByGv2gml(snapshot) {
39
+ if ((snapshot.meta.creator ?? null) !== null || snapshot.graph.has("Creator") || !snapshot.graph.has("version")) {
40
+ return false;
41
+ }
42
+ return Number(snapshot.graph.value("version", 0)) === 2;
43
+ }
44
+ function graphicsMedian(snapshot, gephi) {
45
+ const graphics = snapshot.nodes.get(GRAPHICS_COLUMN);
46
+ const sizes = [];
47
+ for (let row = 0; graphics !== null && row < graphics.length; row++) {
48
+ const g = graphics.isSet(row) ? graphics.value(row) : void 0;
49
+ const { w, h, H } = typeof g === "object" && g !== null ? g : {};
50
+ if (gephi && typeof w === "number") {
51
+ sizes.push(2 * w);
52
+ } else if (typeof w === "number" && typeof (h ?? H) === "number") {
53
+ sizes.push((w + Number(h ?? H)) / 2);
54
+ }
55
+ }
56
+ return median(sizes);
57
+ }
17
58
  const TOKEN_WORD = 0;
18
59
  const TOKEN_INT = 1;
19
60
  const TOKEN_REAL = 2;
@@ -450,7 +491,8 @@ const WRITERS = [
450
491
  vocabulary: "graphlet",
451
492
  spelling: "css",
452
493
  units: "relative",
453
- labelKey: false
494
+ // Gephi's preview draws node labels as the GEXF reader reads them (formats/gexf/styles.ts)
495
+ labelKey: true
454
496
  }
455
497
  ],
456
498
  [
@@ -471,6 +513,14 @@ const UNKNOWN_WRITER = {
471
513
  units: "px",
472
514
  labelKey: true
473
515
  };
516
+ const GV2GML_WRITER = {
517
+ dialect: "graphviz",
518
+ tool: "graphviz",
519
+ vocabulary: "graphviz",
520
+ spelling: "graphviz",
521
+ units: "px",
522
+ labelKey: true
523
+ };
474
524
  const GRAPHTY_WRITER = { ...WRITERS[0][1], tool: null };
475
525
  const GML_STYLE_BLOCK_KEY = mangleGmlKey(STYLE_BLOCK_NAME);
476
526
  const TAG_PREFIX = mangleGmlKey("graphty.style.");
@@ -487,6 +537,18 @@ function graphText(snapshot, name) {
487
537
  }
488
538
  return typeof v === "number" ? String(v) : null;
489
539
  }
540
+ const GML_ANCHORS = new Map([
541
+ ...["c", "t", "b", "l", "r", "tl", "tr", "bl", "br"].map((a) => [a, "center"]),
542
+ ["n", "top"],
543
+ ["s", "bottom"],
544
+ ["e", "right"],
545
+ ["w", "left"],
546
+ ["nw", "top-left"],
547
+ ["ne", "top-right"],
548
+ ["sw", "bottom-left"],
549
+ ["se", "bottom-right"]
550
+ ]);
551
+ const YED_NODE_KEYS = ["isGroup", "gid"];
490
552
  function writerOf(snapshot) {
491
553
  if (snapshot.graph.has(GML_STYLE_BLOCK_KEY)) {
492
554
  return GRAPHTY_WRITER;
@@ -497,7 +559,10 @@ function writerOf(snapshot) {
497
559
  return writer;
498
560
  }
499
561
  }
500
- return UNKNOWN_WRITER;
562
+ if (creator.trim() === "" && (YED_NODE_KEYS.some((k) => snapshot.nodes.has(k)) || snapshot.graph.has("hierarchic"))) {
563
+ return WRITERS[0][1];
564
+ }
565
+ return creator.trim() === "" && writtenByGv2gml(snapshot) ? GV2GML_WRITER : UNKNOWN_WRITER;
501
566
  }
502
567
  const ARROW_ENDS = /* @__PURE__ */ new Map([
503
568
  ["none", ["none", "none"]],
@@ -505,15 +570,49 @@ const ARROW_ENDS = /* @__PURE__ */ new Map([
505
570
  ["first", ["triangle", "none"]],
506
571
  ["both", ["triangle", "triangle"]]
507
572
  ]);
573
+ const CYTOSCAPE_GML_SHAPES = /* @__PURE__ */ new Map([
574
+ ["ellipse", "ellipse"],
575
+ ["round_rectangle", "round-rectangle"],
576
+ ["round_rect", "round-rectangle"],
577
+ ["rectangle", "rectangle"],
578
+ ["rect", "rectangle"],
579
+ ["hexagon", "hexagon"],
580
+ ["octagon", "octagon"],
581
+ ["parallelogram", "parallelogram"],
582
+ ["triangle", "triangle"],
583
+ ["vee", "vee"],
584
+ ["diamond", "diamond"]
585
+ ]);
508
586
  const OGDF_STROKES = ["none", "solid", "dashed", "dotted", "dash-dot", "dash-dot"];
587
+ const OGDF_STROKE_NAMES = /* @__PURE__ */ new Map([
588
+ ["none", "none"],
589
+ ["solid", "solid"],
590
+ ["dash", "dashed"],
591
+ ["dot", "dotted"],
592
+ ["dashdot", "dash-dot"],
593
+ ["dashdotdot", "dash-dot"]
594
+ ]);
509
595
  const OGDF_SHAPES = /* @__PURE__ */ new Map([
510
596
  ["rect", "rectangle"],
597
+ ["roundedrect", "round-rectangle"],
511
598
  ["rhomb", "diamond"],
512
- ["trapeze", "trapezoid"],
513
- ["invtrapeze", "trapezoid"],
514
- ["invtriangle", "triangle"],
515
- ["invparallelogram", "parallelogram"]
599
+ ["image", "rectangle"]
600
+ ]);
601
+ const OGDF_POLYGONS = /* @__PURE__ */ new Map([
602
+ ["triangle", "0,1 0.866,-0.5 -0.866,-0.5"],
603
+ ["invtriangle", "0,-1 0.866,0.5 -0.866,0.5"],
604
+ ["pentagon", "0,1 0.951,0.309 0.588,-0.809 -0.588,-0.809 -0.951,0.309"],
605
+ ["hexagon", "1,0 0.5,0.866 -0.5,0.866 -1,0 -0.5,-0.866 0.5,-0.866"],
606
+ [
607
+ "octagon",
608
+ "0.924,0.383 0.383,0.924 -0.383,0.924 -0.924,0.383 -0.924,-0.383 -0.383,-0.924 0.383,-0.924 0.924,-0.383"
609
+ ],
610
+ ["trapeze", "-1,-1 1,-1 0.5,1 -0.5,1"],
611
+ ["invtrapeze", "-1,1 1,1 0.5,-1 -0.5,-1"],
612
+ ["parallelogram", "-1,-1 0.5,-1 1,1 -0.5,1"],
613
+ ["invparallelogram", "-1,1 0.5,1 1,-1 -0.5,-1"]
516
614
  ]);
615
+ const OGDF_REGULAR = /* @__PURE__ */ new Set(["triangle", "invtriangle", "pentagon", "hexagon", "octagon"]);
517
616
  const YED_LABEL_KEYS = [
518
617
  "outline",
519
618
  "autoSizePolicy",
@@ -557,30 +656,164 @@ function strokeStyle(raw, kind, writer, at) {
557
656
  return null;
558
657
  }
559
658
  if (writer.vocabulary === "ogdf") {
560
- const stroke = OGDF_STROKES[Number(raw)];
561
- if (stroke === void 0 || stroke === "none") {
659
+ const stroke = ogdfStroke(raw);
660
+ if (stroke === void 0) {
562
661
  noteAt(at, STYLE_ISSUE.UNKNOWN_VALUE, sampleOf(raw));
563
662
  return null;
564
663
  }
565
- return stroke;
664
+ return stroke === "none" ? null : stroke;
566
665
  }
567
666
  return canonEnum(kind, raw, writer.spelling, at);
568
667
  }
668
+ function ogdfStroke(raw) {
669
+ const text = typeof raw === "string" || typeof raw === "number" ? String(raw).trim() : "";
670
+ return /^\d+$/.test(text) ? OGDF_STROKES[Number(text)] : OGDF_STROKE_NAMES.get(text.toLowerCase());
671
+ }
672
+ function readOgdfShape(raw, writer, put, at) {
673
+ const name = raw.trim().toLowerCase();
674
+ const points = OGDF_POLYGONS.get(name);
675
+ if (points !== void 0) {
676
+ put("shape", "polygon");
677
+ put("shapePoints", points);
678
+ if (OGDF_REGULAR.has(name)) {
679
+ put("shapePointsStretch", false);
680
+ }
681
+ return;
682
+ }
683
+ put("shape", canonEnum("shape", OGDF_SHAPES.get(name) ?? raw, writer.spelling, at("shape")));
684
+ }
569
685
  function readNodeGraphics(g, writer, put, at) {
570
686
  const v = writer.vocabulary;
687
+ if (v === "graphviz") {
688
+ readGv2gmlNode(g, writer, put, at);
689
+ return;
690
+ }
571
691
  readNodeFill(g, writer, put, at);
572
692
  readNodeOutline(g, writer, put, at);
573
693
  put(
574
694
  "borderStyle",
575
695
  strokeStyle(v === "ogdf" ? g.stipple : g.outlineStyle, "borderStyle", writer, at("borderStyle"))
576
696
  );
577
- put("width", g.w === void 0 ? null : canonNumber(g.w, at("width")));
578
- put("height", g.h === void 0 ? null : canonNumber(g.h, at("height")));
579
- if (g.type !== void 0) {
580
- const raw = v === "ogdf" && typeof g.type === "string" ? OGDF_SHAPES.get(g.type.toLowerCase()) ?? g.type : g.type;
581
- put("shape", canonEnum("shape", raw, writer.spelling, at("shape")));
697
+ if (v === "ogdf" && g.stipple !== void 0 && ogdfStroke(g.stipple) === "none") {
698
+ put("borderWidth", 0);
699
+ }
700
+ readNodeSize(g, writer, put, at);
701
+ if (v === "ogdf") {
702
+ readOgdfLabelOffset(g.label, put, at);
703
+ }
704
+ readNodeShape(g, writer, put, at);
705
+ }
706
+ function readNodeSize(g, writer, put, at) {
707
+ if (writer.tool === "gephi") {
708
+ const size = g.w === void 0 ? null : canonNumber(g.w, at("width"));
709
+ put("width", size === null ? null : 2 * size);
710
+ put("height", size === null ? null : 2 * size);
711
+ } else {
712
+ put("width", g.w === void 0 ? null : canonNumber(g.w, at("width")));
713
+ put("height", g.h === void 0 ? null : canonNumber(g.h, at("height")));
714
+ }
715
+ }
716
+ function readNodeShape(g, writer, put, at) {
717
+ const v = writer.vocabulary;
718
+ if (v === "ogdf" && typeof g.type === "string") {
719
+ readOgdfShape(g.type, writer, put, at);
720
+ } else if (v === "cytoscape" && g.type !== void 0) {
721
+ const name = scalarText(g.type, at("shape"))?.trim().toLowerCase() ?? "";
722
+ const shape = CYTOSCAPE_GML_SHAPES.get(name);
723
+ if (shape === void 0) {
724
+ noteAt(at("shape"), STYLE_ISSUE.UNKNOWN_VALUE, name.slice(0, MAX_STYLE_VALUE_LENGTH));
725
+ }
726
+ put("shape", shape ?? null);
727
+ } else if (g.type !== void 0) {
728
+ put("shape", canonEnum("shape", g.type, writer.spelling, at("shape")));
582
729
  } else if (v === "yed" && typeof g.customconfiguration === "string") {
583
- put("shape", flowchartShape(g.customconfiguration));
730
+ const outline = configurationOutline(g.customconfiguration);
731
+ put("shape", outline?.shape ?? null);
732
+ if (outline?.points !== void 0) {
733
+ put("shapePoints", outline.points);
734
+ }
735
+ }
736
+ }
737
+ function readOgdfLabelOffset(label, put, at) {
738
+ if (typeof label !== "object" || label === null || Array.isArray(label)) {
739
+ return;
740
+ }
741
+ const { x, y } = label;
742
+ put("labelOffsetX", x === void 0 ? null : canonSigned(x, at("labelOffsetX")));
743
+ put("labelOffsetY", y === void 0 ? null : canonSigned(y, at("labelOffsetY")));
744
+ }
745
+ function readGv2gmlNode(g, writer, put, at) {
746
+ const shape = typeof g.type === "string" ? g.type.trim().toLowerCase() : "";
747
+ if (Number(g.hasFill) === 1 || shape === "point") {
748
+ const c = canonColor(g.fill ?? "black", writer.spelling, at("fill"), { use: "fill" });
749
+ put("fill", c?.color ?? null);
750
+ put("fillOpacity", c?.alpha ?? null);
751
+ } else if (g.fill !== void 0) {
752
+ noteAt(at("fill"), STYLE_ISSUE.UNFILLED, sampleOf(g.fill));
753
+ }
754
+ if (graphvizHasNoOutline(shape)) {
755
+ put("borderWidth", 0);
756
+ } else {
757
+ readColor(g.outline, "borderColor", null, writer, put, at);
758
+ put("borderWidth", g.width === void 0 ? null : canonNumber(g.width, at("borderWidth")));
759
+ }
760
+ const borderStyle = strokeStyle(g.outlineStyle, "borderStyle", writer, at("borderStyle"));
761
+ put("borderStyle", borderStyle);
762
+ readGv2gmlRings(g, shape, borderStyle, writer, put, at);
763
+ const rings = 2 * PERIPHERY_GAP * ((SHAPE_PERIPHERIES.get(shape) ?? 1) - 1);
764
+ const inner = (raw, property) => {
765
+ const n = raw === void 0 ? null : canonNumber(raw, at(property));
766
+ return n === null ? null : Math.max(0, n - rings);
767
+ };
768
+ put("width", inner(g.w, "width"));
769
+ put("height", inner(first(g, "H", "h"), "height"));
770
+ if (Number(g.visible) === 0 && g.visible !== void 0) {
771
+ put("visible", false);
772
+ }
773
+ const outline = graphvizOutline(shape);
774
+ if (shape === "polygon") {
775
+ put("shape", "rectangle");
776
+ } else if (outline !== void 0) {
777
+ put("shape", "polygon");
778
+ put("shapePoints", outline);
779
+ put("shapePointsStretch", false);
780
+ } else if (GRAPHVIZ_GLYPH_SHAPES.has(shape)) {
781
+ const size = (raw, property) => raw === void 0 ? null : canonNumber(raw, at(property));
782
+ putGlyph(
783
+ shape,
784
+ size(g.w, "width"),
785
+ size(first(g, "H", "h"), "height"),
786
+ put,
787
+ () => {
788
+ const pen = g.width === void 0 ? 1 : Number(g.width);
789
+ return Number.isFinite(pen) ? Math.max(0, pen) : 1;
790
+ },
791
+ () => canonColor(g.outline ?? "black", writer.spelling, at("outerBorderColor"), { use: "line" })?.color ?? null
792
+ );
793
+ } else if (g.type !== void 0) {
794
+ put("shape", canonEnum("shape", g.type, "graphviz", at("shape")));
795
+ }
796
+ }
797
+ function readGv2gmlRings(g, shape, style, writer, put, at) {
798
+ const count = SHAPE_PERIPHERIES.get(shape) ?? 1;
799
+ if (count < 2) {
800
+ return;
801
+ }
802
+ const c = canonColor(g.outline ?? "black", writer.spelling, at("outerBorderColor"), { use: "line" });
803
+ if (c !== null && c.alpha === 0) {
804
+ return;
805
+ }
806
+ const parsed = g.width === void 0 ? 1 : Number(g.width);
807
+ const pen = Number.isFinite(parsed) ? Math.max(0, parsed) : 1;
808
+ put("outerBorderColor", c?.color ?? "#000000");
809
+ put("outerBorderOpacity", c !== null && c.alpha < 1 ? c.alpha : null);
810
+ put("outerBorderWidth", pen);
811
+ put("outerBorderOffset", Math.max(0, PERIPHERY_GAP - pen));
812
+ if (style === "dashed" || style === "dotted") {
813
+ put("outerBorderStyle", style);
814
+ }
815
+ if (count > 2) {
816
+ noteAt(at("outerBorderWidth"), STYLE_ISSUE.NOT_CARRIED, `type ${shape}`);
584
817
  }
585
818
  }
586
819
  function readNodeFill(g, writer, put, at) {
@@ -600,7 +833,7 @@ function readNodeOutline(g, writer, put, at) {
600
833
  put("borderWidth", 0);
601
834
  return;
602
835
  }
603
- readColor(v === "ogdf" ? g.line : g.outline, "borderColor", null, writer, put, at);
836
+ readColor(v === "ogdf" ? first(g, "outline", "line") : g.outline, "borderColor", null, writer, put, at);
604
837
  const width = outlineWidthOf(g, v);
605
838
  put("borderWidth", width === void 0 ? null : canonNumber(width, at("borderWidth")));
606
839
  }
@@ -618,10 +851,23 @@ function outlineWidthOf(g, v) {
618
851
  }
619
852
  function readEdgeGraphics(g, writer, put, at) {
620
853
  const v = writer.vocabulary;
854
+ if (v === "graphviz") {
855
+ readGv2gmlEdge(g, writer, put, at);
856
+ return;
857
+ }
621
858
  readColor(g.fill, "color", "opacity", writer, put, at);
622
859
  const width = v === "ogdf" ? first(g, "lineWidth", "width") : g.width;
623
860
  put("width", width === void 0 ? null : canonNumber(width, at("width")));
624
861
  put("lineStyle", strokeStyle(v === "ogdf" ? g.stipple : g.style, "lineStyle", writer, at("lineStyle")));
862
+ if (v === "ogdf" && g.stipple !== void 0 && ogdfStroke(g.stipple) === "none") {
863
+ put("visible", false);
864
+ }
865
+ readEdgeArrows(g, writer, put, at);
866
+ if (v === "yed") {
867
+ readYedCurve(g, put);
868
+ }
869
+ }
870
+ function readEdgeArrows(g, writer, put, at) {
625
871
  if (typeof g.arrow === "string") {
626
872
  const ends = ARROW_ENDS.get(g.arrow.trim().toLowerCase());
627
873
  if (ends === void 0) {
@@ -641,20 +887,56 @@ function readEdgeGraphics(g, writer, put, at) {
641
887
  }
642
888
  put(
643
889
  property,
644
- v === "cytoscape" && cytoscapeArrow !== void 0 ? cytoscapeArrow(raw, at(property)) : canonEnum("arrow", raw, writer.spelling, at(property))
890
+ writer.vocabulary === "cytoscape" && cytoscapeArrow !== void 0 ? cytoscapeArrow(raw, at(property)) : canonEnum("arrow", raw, writer.spelling, at(property))
645
891
  );
646
892
  }
647
- if (v === "yed") {
648
- readYedCurve(g, put);
893
+ }
894
+ const GV2GML_DIRECTIONS = /* @__PURE__ */ new Map([
895
+ ["first", [false, true]],
896
+ ["last", [true, false]],
897
+ ["both", [true, true]],
898
+ ["none", [false, false]]
899
+ ]);
900
+ function readGv2gmlEdge(g, writer, put, at) {
901
+ readColor(g.fill, "color", "opacity", writer, put, at);
902
+ put("width", g.width === void 0 ? null : canonNumber(g.width, at("width")));
903
+ put("lineStyle", strokeStyle(g.style, "lineStyle", writer, at("lineStyle")));
904
+ if (Number(g.visible) === 0 && g.visible !== void 0) {
905
+ put("visible", false);
906
+ }
907
+ const ends = gv2gmlArrowEnds(g, writer.directed === true);
908
+ if (ends === null) {
909
+ return;
910
+ }
911
+ for (const [end, raw, on] of [
912
+ ["target", g.targetArrow, ends[1]],
913
+ ["source", g.sourceArrow, ends[0]]
914
+ ]) {
915
+ const name = typeof raw === "string" ? raw : "normal";
916
+ const arrow = on ? graphvizArrowValue(name, at(`${end}Arrow`)) : null;
917
+ put(`${end}Arrow`, arrow === null ? "none" : arrow.value);
918
+ if (arrow?.side !== null && arrow?.side !== void 0) {
919
+ put(`${end}ArrowSide`, arrow.side);
920
+ }
649
921
  }
650
922
  }
923
+ function gv2gmlArrowEnds(g, directed) {
924
+ if (g.arrow === void 0 && g.targetArrow === void 0 && g.sourceArrow === void 0) {
925
+ return directed ? [false, true] : null;
926
+ }
927
+ let dir = directed ? "first" : "none";
928
+ if (typeof g.arrow === "string") {
929
+ dir = g.arrow.trim().toLowerCase();
930
+ }
931
+ return GV2GML_DIRECTIONS.get(dir) ?? null;
932
+ }
651
933
  function readYedCurve(g, put) {
652
934
  if (g.smoothBends !== void 0) {
653
935
  const points = isRec(g.Line) ? g.Line.point : void 0;
654
936
  put("curved", Number(g.smoothBends) === 1 && Array.isArray(points) && points.length > 2);
655
937
  }
656
938
  }
657
- function readLabelGraphics(raw, writer, put, at) {
939
+ function readLabelGraphics(raw, writer, node, put, at) {
658
940
  const visible = (Array.isArray(raw) ? raw : [raw]).filter((l) => isRec(l) && Number(l.visible) !== 0);
659
941
  const lg = visible.at(0);
660
942
  if (lg === void 0) {
@@ -665,22 +947,38 @@ function readLabelGraphics(raw, writer, put, at) {
665
947
  noteAt(at("label"), STYLE_ISSUE.EXTRA_LABELS, `${String(extra + 1)} labels`);
666
948
  }
667
949
  if (lg.text !== void 0) {
668
- put("label", canonText(lg.text, at("label")));
950
+ put(
951
+ "label",
952
+ writer.vocabulary === "graphviz" ? graphvizText(lg.text, at("label")) : canonText(lg.text, at("label"))
953
+ );
669
954
  }
670
955
  const yedLabel = writer.vocabulary === "yed" || YED_LABEL_KEYS.some((k) => Object.hasOwn(lg, k));
671
- if (lg.color !== void 0) {
672
- readColor(lg.color, "labelColor", null, writer, put, at);
956
+ if (lg.color !== void 0 || lg.fontColor !== void 0) {
957
+ readColor(lg.color ?? lg.fontColor, "labelColor", "labelOpacity", writer, put, at);
673
958
  } else if (lg.fill !== void 0 && !yedLabel) {
674
959
  readColor(lg.fill, "labelColor", null, writer, put, at);
675
960
  }
676
961
  if (lg.fill !== void 0 && yedLabel) {
677
962
  noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, "label background");
678
963
  }
679
- readLabelFont(lg, put, at);
964
+ readLabelFont(lg, yedLabel || writer.vocabulary === "cytoscape", put, at);
965
+ if (node && lg.anchor !== void 0) {
966
+ const anchor = scalarText(lg.anchor, at("labelPosition"))?.trim().toLowerCase() ?? "";
967
+ const known = GML_ANCHORS.get(anchor);
968
+ if (known === void 0) {
969
+ noteAt(at("labelPosition"), STYLE_ISSUE.UNKNOWN_VALUE, anchor.slice(0, MAX_STYLE_VALUE_LENGTH));
970
+ }
971
+ put("labelPosition", known ?? null);
972
+ }
973
+ }
974
+ function graphvizText(raw, at) {
975
+ const text = canonText(raw, at);
976
+ return text === null ? null : text.replaceAll(/\\[nlr]/g, "\n").replace(/\n$/, "");
680
977
  }
681
- function readLabelFont(lg, put, at) {
978
+ function readLabelFont(lg, java, put, at) {
682
979
  put("labelSize", lg.fontSize === void 0 ? null : canonNumber(lg.fontSize, at("labelSize")));
683
- put("labelFont", lg.fontName === void 0 ? null : canonText(lg.fontName, at("labelFont")));
980
+ const font = lg.fontName === void 0 ? null : canonText(lg.fontName, at("labelFont"));
981
+ put("labelFont", java && typeof font === "string" ? javaFamily(font) : font);
684
982
  const style = scalarText(lg.fontStyle, at("labelWeight"))?.trim().toLowerCase();
685
983
  if (style !== void 0) {
686
984
  const known = FONT_STYLES.get(style);
@@ -702,13 +1000,63 @@ function readElement(target, g, lg, label, writer, put, at) {
702
1000
  (target === "node" ? readNodeGraphics : readEdgeGraphics)(g, writer, put, at);
703
1001
  }
704
1002
  if (lg !== null && lg !== void 0) {
705
- readLabelGraphics(lg, writer, putLabel, at);
1003
+ readLabelGraphics(lg, writer, target === "node", putLabel, at);
706
1004
  }
707
1005
  const drawn = writer.vocabulary === "cytoscape" ? target === "node" : writer.labelKey && (isRec(g) || lg !== void 0);
708
1006
  if (!text && drawn && label !== null && label !== void 0) {
709
- put("label", canonText(label, at("label")));
1007
+ put(
1008
+ "label",
1009
+ writer.vocabulary === "graphviz" ? graphvizText(label, at("label")) : canonText(label, at("label"))
1010
+ );
1011
+ if (target === "node" && writer.tool === null && writer.vocabulary === "graphlet") {
1012
+ put("labelPosition", "center");
1013
+ }
710
1014
  }
711
1015
  }
1016
+ const OGDF_SVG_FONT_SIZE = 10;
1017
+ function placeOgdfClusterLabels(snapshot, values) {
1018
+ const n = snapshot.nodeCount;
1019
+ const boxOf = (i) => {
1020
+ const [x, y] = centerOf(snapshot, i);
1021
+ const [w, h] = sizeOf(snapshot, i);
1022
+ return [x - w / 2, y - h / 2, x + w / 2, y + h / 2];
1023
+ };
1024
+ const all = [Infinity, Infinity, -Infinity, -Infinity];
1025
+ for (let i = 0; i < n; i++) {
1026
+ const b = boxOf(i);
1027
+ if (b.every(Number.isFinite)) {
1028
+ all[0] = Math.min(all[0], b[0]);
1029
+ all[1] = Math.min(all[1], b[1]);
1030
+ all[2] = Math.max(all[2], b[2]);
1031
+ all[3] = Math.max(all[3], b[3]);
1032
+ }
1033
+ }
1034
+ const put = (property, i, value) => {
1035
+ values[property] ??= new Array(n).fill(null);
1036
+ values[property][i] = value;
1037
+ };
1038
+ for (let i = 0; i < n; i++) {
1039
+ const id = snapshot.ids.idOf(i);
1040
+ const [x0, y0, x1, y1] = boxOf(i);
1041
+ if (typeof id !== "string" || !id.startsWith("cluster") || ![x0, y0, x1, y1].every(Number.isFinite)) {
1042
+ continue;
1043
+ }
1044
+ const below = all[3] - y1 > y0 - all[1];
1045
+ const start = x0 - all[0] > all[2] - x1;
1046
+ put("labelPosition", i, "center");
1047
+ put("labelOffsetX", i, (start ? -1 : 1) * (x1 - x0) / 2);
1048
+ put("labelShiftX", i, start ? 0.5 : -0.5);
1049
+ put("labelOffsetY", i, (below ? 1 : -1) * ((y1 - y0) / 2 + OGDF_SVG_FONT_SIZE));
1050
+ }
1051
+ }
1052
+ function labelOf(snapshot, writer, target, i) {
1053
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
1054
+ const label = cellOf(table, "label", i);
1055
+ if (writer.vocabulary === "cytoscape" && target === "node" && (label === void 0 || label === "")) {
1056
+ return String(snapshot.ids.idOf(i));
1057
+ }
1058
+ return label;
1059
+ }
712
1060
  function cellOf(table, name, i) {
713
1061
  if (!table.has(name)) {
714
1062
  return void 0;
@@ -721,18 +1069,117 @@ function centerOf(snapshot, i) {
721
1069
  const v = column?.isSet(i) === true ? column.value(i) : null;
722
1070
  return v === null ? [Number.NaN, Number.NaN] : [v[0], v[1]];
723
1071
  }
724
- function lineBends(snapshot, g, e) {
1072
+ function sizeOf(snapshot, i) {
1073
+ const g = cellOf(snapshot.nodes, "graphics", i);
1074
+ return isRec(g) ? [Number(g.w ?? Number.NaN), Number(g.h ?? Number.NaN)] : [Number.NaN, Number.NaN];
1075
+ }
1076
+ function readLineRoute(snapshot, g, e, bendsOnly, put) {
725
1077
  const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
726
- if (!Array.isArray(raw) || raw.length < 3) {
727
- return null;
1078
+ const list = isRec(raw) ? [raw] : raw;
1079
+ if (!Array.isArray(list) || list.length < (bendsOnly ? 1 : 2)) {
1080
+ return;
1081
+ }
1082
+ const all = list.map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]);
1083
+ const [s, t] = [snapshot.edgeSource(e), snapshot.edgeTarget(e)];
1084
+ const points = bendsOnly ? all : all.slice(1, -1);
1085
+ const bends = s === t ? canonNodeOffsets(centerOf(snapshot, s), sizeOf(snapshot, s), points, true) : canonBends(centerOf(snapshot, s), centerOf(snapshot, t), points, true);
1086
+ if (bends !== null) {
1087
+ put("bends", bends);
728
1088
  }
729
- const points = raw.slice(1, -1).map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]);
730
- return canonBends(
1089
+ if (bendsOnly) {
1090
+ return;
1091
+ }
1092
+ for (const [property, k, end] of [
1093
+ ["sourcePort", s, all[0]],
1094
+ ["targetPort", t, all.at(-1) ?? all[0]]
1095
+ ]) {
1096
+ const center = centerOf(snapshot, k);
1097
+ const port = end[0] === center[0] && end[1] === center[1] ? null : canonNodeOffsets(center, sizeOf(snapshot, k), [end], true);
1098
+ if (port !== null) {
1099
+ put(property, port);
1100
+ }
1101
+ }
1102
+ }
1103
+ function readGv2gmlRoute(snapshot, g, e, put) {
1104
+ const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
1105
+ const list = isRec(raw) ? [raw] : raw;
1106
+ if (!Array.isArray(list) || !isRec(g)) {
1107
+ return;
1108
+ }
1109
+ let points = list.map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]);
1110
+ const tips = (points.length - 1) % 3;
1111
+ const sourceTip = tips === 2 || tips === 1 && gv2gmlArrowEnds(g, snapshot.directed)?.[0] === true;
1112
+ points = points.slice(sourceTip ? 1 : 0, points.length - (tips === 2 || tips === 1 && !sourceTip ? 1 : 0));
1113
+ const bends = graphvizRouteBends(
731
1114
  centerOf(snapshot, snapshot.edgeSource(e)),
732
1115
  centerOf(snapshot, snapshot.edgeTarget(e)),
733
- points
1116
+ [points]
1117
+ );
1118
+ if (bends !== null) {
1119
+ put("bends", bends);
1120
+ }
1121
+ }
1122
+ function routeMiddle(points) {
1123
+ const m = points.length - 1;
1124
+ if (m % 2 === 0) {
1125
+ return points[m / 2];
1126
+ }
1127
+ const [a, b] = [points[(m - 1) / 2], points[(m + 1) / 2]];
1128
+ return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
1129
+ }
1130
+ function putEdgeLabelOffset(at, middle, yUp, put) {
1131
+ const dx = num6(at[0] - middle[0]);
1132
+ const dy = num6((yUp ? -1 : 1) * (at[1] - middle[1]));
1133
+ if (Number.isFinite(dx) && Number.isFinite(dy) && (dx !== 0 || dy !== 0)) {
1134
+ put("labelPosition", "center");
1135
+ put("labelOffsetX", dx);
1136
+ put("labelOffsetY", dy);
1137
+ }
1138
+ }
1139
+ function readGv2gmlLabelPlace(snapshot, e, bent, put) {
1140
+ const lp = cellOf(snapshot.edges, "lp", e);
1141
+ const m = typeof lp === "string" ? /^\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*$/.exec(lp) : null;
1142
+ if (m === null || bent) {
1143
+ return;
1144
+ }
1145
+ const [s, t] = [centerOf(snapshot, snapshot.edgeSource(e)), centerOf(snapshot, snapshot.edgeTarget(e))];
1146
+ putEdgeLabelOffset([Number(m[1]), Number(m[2])], routeMiddle([s, t]), true, put);
1147
+ }
1148
+ function readOgdfLabelPlace(snapshot, g, e, put) {
1149
+ const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
1150
+ const list = isRec(raw) ? [raw] : raw;
1151
+ const [s, t] = [centerOf(snapshot, snapshot.edgeSource(e)), centerOf(snapshot, snapshot.edgeTarget(e))];
1152
+ if (!Array.isArray(list) || snapshot.edgeSource(e) === snapshot.edgeTarget(e)) {
1153
+ return;
1154
+ }
1155
+ const same = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1]) < 1e-6;
1156
+ const bends = list.map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]).filter((p) => !same(p, s) && !same(p, t));
1157
+ if (bends.length === 0) {
1158
+ return;
1159
+ }
1160
+ const route = [s, ...bends, t];
1161
+ putEdgeLabelOffset(
1162
+ [(route[0][0] + route[1][0]) / 2, (route[0][1] + route[1][1]) / 2],
1163
+ routeMiddle(route),
1164
+ false,
1165
+ put
734
1166
  );
735
1167
  }
1168
+ function hideGephiDroppedEdges(snapshot, values) {
1169
+ const header = snapshot.meta.extra.gml?.directed;
1170
+ const directed = snapshot.edges.byRole("directed");
1171
+ if (directed === null || header === void 0) {
1172
+ return;
1173
+ }
1174
+ const graphDirected = Number(header) === 1;
1175
+ for (let e = 0; e < snapshot.edgeCount; e++) {
1176
+ const v = plainCell(directed.value(e));
1177
+ if (typeof v === "boolean" && v !== graphDirected) {
1178
+ values.visible ??= new Array(snapshot.edgeCount).fill(null);
1179
+ values.visible[e] = false;
1180
+ }
1181
+ }
1182
+ }
736
1183
  function readValues(snapshot, writer, notes, context) {
737
1184
  let found = false;
738
1185
  const read = (target) => {
@@ -749,7 +1196,7 @@ function readValues(snapshot, writer, notes, context) {
749
1196
  target,
750
1197
  cellOf(table, "graphics", i),
751
1198
  cellOf(table, "LabelGraphics", i),
752
- cellOf(table, "label", i),
1199
+ labelOf(snapshot, writer, target, i),
753
1200
  writer,
754
1201
  (property, value) => {
755
1202
  if (value !== null) {
@@ -759,12 +1206,32 @@ function readValues(snapshot, writer, notes, context) {
759
1206
  },
760
1207
  at
761
1208
  );
762
- if (target === "edge") {
763
- const bends = lineBends(snapshot, cellOf(table, "graphics", i), i);
764
- if (bends !== null) {
1209
+ if (target === "edge" && writer.vocabulary === "graphviz") {
1210
+ let bent = false;
1211
+ readGv2gmlRoute(snapshot, cellOf(table, "graphics", i), i, (property, value) => {
765
1212
  found = true;
766
- out.put(i, "bends", bends);
767
- }
1213
+ bent ||= property === "bends";
1214
+ out.put(i, property, value);
1215
+ });
1216
+ readGv2gmlLabelPlace(snapshot, i, bent, (property, value) => {
1217
+ out.put(i, property, value);
1218
+ });
1219
+ } else if (target === "edge" && writer.vocabulary === "ogdf") {
1220
+ readOgdfLabelPlace(snapshot, cellOf(table, "graphics", i), i, (property, value) => {
1221
+ out.put(i, property, value);
1222
+ });
1223
+ }
1224
+ if (target === "edge" && writer.vocabulary !== "graphviz") {
1225
+ readLineRoute(
1226
+ snapshot,
1227
+ cellOf(table, "graphics", i),
1228
+ i,
1229
+ writer.vocabulary === "ogdf",
1230
+ (property, value) => {
1231
+ found = true;
1232
+ out.put(i, property, value);
1233
+ }
1234
+ );
768
1235
  }
769
1236
  }
770
1237
  return out.values;
@@ -807,8 +1274,11 @@ function styleColumns(table) {
807
1274
  }
808
1275
  function gmlStyles(snapshot, context) {
809
1276
  const notes = new StyleNotes();
810
- const writer = writerOf(snapshot);
1277
+ const writer = { ...writerOf(snapshot), directed: snapshot.directed };
811
1278
  const values = readValues(snapshot, writer, notes, context);
1279
+ if (writer.vocabulary === "ogdf") {
1280
+ placeOgdfClusterLabels(snapshot, values.node);
1281
+ }
812
1282
  const blockText = graphText(snapshot, GML_STYLE_BLOCK_KEY);
813
1283
  const block = blockText === null ? null : blockWithValues(snapshot, blockText);
814
1284
  if (block !== null) {
@@ -817,7 +1287,26 @@ function gmlStyles(snapshot, context) {
817
1287
  if (writer.tool === null && !values.found && block === null) {
818
1288
  return null;
819
1289
  }
820
- const gephi = writer.tool === "gephi" ? gephiRules(snapshot, values.node, values.edge, context.budget) : { node: {}, edge: {} };
1290
+ if (writer.tool === "gephi" && block === null) {
1291
+ delete values.edge.color;
1292
+ if (snapshot.edges.byRole("weight") === null && snapshot.edges.has("value")) {
1293
+ values.edge.width = Array.from({ length: snapshot.edgeCount }, (_, e) => {
1294
+ const w = cellOf(snapshot.edges, "value", e);
1295
+ if (typeof w !== "number" || !Number.isFinite(w)) {
1296
+ return null;
1297
+ }
1298
+ return w > 0 ? w : 1;
1299
+ });
1300
+ }
1301
+ hideGephiDroppedEdges(snapshot, values.edge);
1302
+ }
1303
+ const none = { rules: [], columns: /* @__PURE__ */ new Map() };
1304
+ const gephi = writer.tool === "gephi" ? gephiRules(
1305
+ snapshot,
1306
+ { fill: values.node.fill, width: values.node.width },
1307
+ { color: values.edge.color, width: values.edge.width },
1308
+ context.budget
1309
+ ) : { node: none, edge: none };
821
1310
  return {
822
1311
  canonical: true,
823
1312
  dialect: writer.dialect,
@@ -859,6 +1348,8 @@ const GML_STYLE_CAPABILITIES = Object.freeze({
859
1348
  "targetArrow",
860
1349
  "curved",
861
1350
  "bends",
1351
+ "sourcePort",
1352
+ "targetPort",
862
1353
  "label",
863
1354
  "labelColor",
864
1355
  "labelSize",
@@ -969,7 +1460,7 @@ function edgeGraphics(get, approximate) {
969
1460
  for (const property of ["sourceArrow", "targetArrow"]) {
970
1461
  const arrow = get(property);
971
1462
  if (typeof arrow === "string") {
972
- g[property] = yedSpelled(YED_ARROWS, arrow, "standard", property, approximate);
1463
+ g[property] = yedSpelled(YED_ARROWS, arrow, "delta", property, approximate);
973
1464
  }
974
1465
  }
975
1466
  const curved = get("curved");
@@ -994,7 +1485,7 @@ function labelGraphics(get) {
994
1485
  }
995
1486
  const font = get("labelFont");
996
1487
  if (typeof font === "string") {
997
- lg.fontName = font;
1488
+ lg.fontName = yedFontName(font);
998
1489
  }
999
1490
  const weight = get("labelWeight");
1000
1491
  const italic = get("labelItalic");
@@ -1025,37 +1516,17 @@ function mergedLabels(old, written) {
1025
1516
  }
1026
1517
  return head === void 0 ? rest : [head, ...rest];
1027
1518
  }
1028
- function getter(picture, target) {
1029
- const columns = /* @__PURE__ */ new Map();
1030
- for (const p of GML_STYLE_CAPABILITIES[target]) {
1031
- columns.set(p, picture(target, p));
1032
- }
1033
- return (i) => (property) => columns.get(property)?.[i] ?? null;
1034
- }
1035
1519
  function exactFromBlock(snapshot, text, read) {
1036
- const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
1037
- const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "gml") : null;
1038
- if (ex === null) {
1039
- return;
1040
- }
1041
1520
  const notes = new StyleNotes();
1042
- for (const target of ["node", "edge"]) {
1043
- const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
1044
- const get = getter((t, p) => resolveStyles(ex, t, p, snapshot), target);
1045
- const values = read[target];
1046
- for (let i = 0; i < n; i++) {
1047
- const want = get(i);
1521
+ takeFromBlock(snapshot, text, "gml", (target) => ({
1522
+ values: read[target],
1523
+ properties: GML_STYLE_CAPABILITIES[target],
1524
+ writes: GML_STYLE_CAPABILITIES[target],
1525
+ readBack: (_i, want) => {
1048
1526
  const back = writtenAndReadBack(target, want, notes);
1049
- for (const property of GML_STYLE_CAPABILITIES[target]) {
1050
- const native = values[property]?.[i] ?? null;
1051
- const w = want(property);
1052
- if (native !== w && native === (back.get(property) ?? null)) {
1053
- values[property] ??= new Array(n).fill(null);
1054
- values[property][i] = w;
1055
- }
1056
- }
1527
+ return (property) => back.get(property) ?? null;
1057
1528
  }
1058
- }
1529
+ }));
1059
1530
  }
1060
1531
  function writtenAndReadBack(target, want, notes) {
1061
1532
  const ignore = () => void 0;
@@ -1116,13 +1587,18 @@ function writeGraphicsColumns(snapshot, input, target, table, approximated) {
1116
1587
  const approximate = (property, value) => {
1117
1588
  approximated.add(target, property, value);
1118
1589
  };
1119
- const get = getter((t, p) => input.picture(t, p), target);
1590
+ const get = elementValues((t, p) => input.picture(t, p), target, GML_STYLE_CAPABILITIES[target]);
1591
+ const getNode = elementValues((t, p) => input.picture(t, p), "node", GML_STYLE_CAPABILITIES.node);
1592
+ const size = (k) => {
1593
+ const [w, h] = [getNode(k)("width"), getNode(k)("height")];
1594
+ return typeof w === "number" && typeof h === "number" ? [w, h] : sizeOf(snapshot, k);
1595
+ };
1120
1596
  const graphics = [];
1121
1597
  const labels = [];
1122
1598
  for (let i = 0; i < n; i++) {
1123
1599
  const g = target === "node" ? nodeGraphics(get(i), approximate) : edgeGraphics(get(i), approximate);
1124
1600
  if (target === "edge") {
1125
- const line = bendsLine(snapshot, get(i)("bends"), i);
1601
+ const line = routeLine(snapshot, get(i), i, size);
1126
1602
  if (line !== null) {
1127
1603
  g.Line = line;
1128
1604
  }
@@ -1141,14 +1617,28 @@ function writeGraphicsColumns(snapshot, input, target, table, approximated) {
1141
1617
  }
1142
1618
  }
1143
1619
  }
1144
- function bendsLine(snapshot, bends, e) {
1145
- const source = centerOf(snapshot, snapshot.edgeSource(e));
1146
- const target = centerOf(snapshot, snapshot.edgeTarget(e));
1147
- const points = typeof bends === "string" ? bendsToPoints(source, target, bends) : null;
1148
- if (points === null || ![...source, ...target].every(Number.isFinite)) {
1620
+ function routeLine(snapshot, get, e, size) {
1621
+ const [s, t] = [snapshot.edgeSource(e), snapshot.edgeTarget(e)];
1622
+ const source = centerOf(snapshot, s);
1623
+ const target = centerOf(snapshot, t);
1624
+ if (![...source, ...target].every(Number.isFinite)) {
1625
+ return null;
1626
+ }
1627
+ const bends = get("bends");
1628
+ let points = null;
1629
+ if (typeof bends === "string") {
1630
+ points = s === t ? nodeOffsetsToPoints(source, size(s), bends) : bendsToPoints(source, target, bends);
1631
+ }
1632
+ const port = (property, k, center) => {
1633
+ const value = get(property);
1634
+ return typeof value === "string" ? nodeOffsetsToPoints(center, size(k), value)?.[0] ?? null : null;
1635
+ };
1636
+ const from = port("sourcePort", s, source);
1637
+ const to = port("targetPort", t, target);
1638
+ if (points === null && from === null && to === null) {
1149
1639
  return null;
1150
1640
  }
1151
- return { point: [source, ...points, target].map(([x, y]) => ({ x, y })) };
1641
+ return { point: [from ?? source, ...points ?? [], to ?? target].map(([x, y]) => ({ x, y })) };
1152
1642
  }
1153
1643
  function renameDataColumn(table, target, name, col) {
1154
1644
  let renamed = `data_${name}`;
@@ -2179,33 +2669,6 @@ const gmlExporter = Object.freeze({
2179
2669
  function* lazyParts(snapshot, options) {
2180
2670
  yield* gmlParts(contextOf(gmlStyledExport(snapshot, options?.styles)?.snapshot ?? snapshot, options));
2181
2671
  }
2182
- const GRAPHICS_COLUMN = "graphics";
2183
- function gmlPositions(snapshot) {
2184
- if (snapshot.nodes.byRole("position") === null) {
2185
- return null;
2186
- }
2187
- const tool = toolOf(snapshot.meta.creator);
2188
- return {
2189
- units: "px",
2190
- // a z that is the same on every node collapses to 2D
2191
- sourceDims: 3,
2192
- yAxis: tool === "gephi" || tool === "tulip" ? "up" : "down",
2193
- tool,
2194
- medianNodeSize: graphicsMedian(snapshot)
2195
- };
2196
- }
2197
- function graphicsMedian(snapshot) {
2198
- const graphics = snapshot.nodes.get(GRAPHICS_COLUMN);
2199
- const sizes = [];
2200
- for (let row = 0; graphics !== null && row < graphics.length; row++) {
2201
- const g = graphics.isSet(row) ? graphics.value(row) : void 0;
2202
- const { w, h } = typeof g === "object" && g !== null ? g : {};
2203
- if (typeof w === "number" && typeof h === "number") {
2204
- sizes.push((w + h) / 2);
2205
- }
2206
- }
2207
- return median(sizes);
2208
- }
2209
2672
  const NO_GRAPH_CODE = NO_GRAPH_CODE$1;
2210
2673
  const SECOND_GRAPH_CODE = MULTIPLE_GRAPHS_CODE;
2211
2674
  const MISSING_ID_CODE = MISSING_ID_CODE$1;
@@ -2223,6 +2686,7 @@ const UNKNOWN_ENTITY_CODE = "W_GML_UNKNOWN_ENTITY";
2223
2686
  const GRAPHICS_CODE = "W_GML_GRAPHICS";
2224
2687
  const NESTED_ELEMENT_CODE = "W_GML_NESTED_ELEMENT";
2225
2688
  const GROUPS_CODE = "W_GML_GROUPS";
2689
+ const GROUP_PARENT_COLUMN = "graphty.parent";
2226
2690
  const WIDENED_CODE = WIDENED_CODE$1;
2227
2691
  const PRECISION_CODE = PRECISION_CODE$1;
2228
2692
  const COLUMN_RENAMED_CODE_GML = COLUMN_RENAMED_CODE;
@@ -2312,6 +2776,10 @@ class GmlImport {
2312
2776
  this.elementsSinceCheck = 0;
2313
2777
  this.idMap = null;
2314
2778
  this.skippedIds = /* @__PURE__ */ new Set();
2779
+ this.groupRefs = [];
2780
+ this.rootCluster = -1;
2781
+ this.parentHandle = null;
2782
+ this.clusterCount = 0;
2315
2783
  this.declared = new Uint32Array(64);
2316
2784
  this.touched = [];
2317
2785
  this.graphTouched = [];
@@ -2379,6 +2847,8 @@ class GmlImport {
2379
2847
  this.creatorToken = v;
2380
2848
  } else if (key === "Version" && !record && this.versionToken < 0) {
2381
2849
  this.versionToken = v;
2850
+ } else if (key === "rootcluster" && record && this.rootCluster < 0) {
2851
+ this.rootCluster = v;
2382
2852
  } else {
2383
2853
  this.observe(this.topSchema, "graph", key, v, TOP_SEQ);
2384
2854
  }
@@ -2563,7 +3033,7 @@ class GmlImport {
2563
3033
  }
2564
3034
  /**
2565
3035
  * Warn about keys of a node or edge whose meaning GML readers give but this import does not:
2566
- * a nested graph / node / edge record, and yEd's group hierarchy.
3036
+ * a nested graph / node / edge record.
2567
3037
  * @param domain - the table
2568
3038
  * @param key - the key
2569
3039
  * @param v - the value token
@@ -2581,13 +3051,6 @@ class GmlImport {
2581
3051
  { line: t.line[v], element: key },
2582
3052
  `${NESTED_ELEMENT_CODE}:${domain}:${key}`
2583
3053
  );
2584
- } else if (domain === "node" && (key === "isGroup" || key === "gid")) {
2585
- this.report.warnOnce(
2586
- "unsupported",
2587
- GROUPS_CODE,
2588
- "yEd group keys (isGroup, gid) are kept as plain node columns; the group hierarchy is not read as containment",
2589
- { line: t.line[v], element: key }
2590
- );
2591
3054
  }
2592
3055
  }
2593
3056
  /**
@@ -2644,8 +3107,155 @@ class GmlImport {
2644
3107
  }
2645
3108
  this.pushTopLevel();
2646
3109
  this.pushNodes();
3110
+ this.pushGroups();
3111
+ this.pushClusters();
2647
3112
  this.pushEdges();
2648
3113
  }
3114
+ /**
3115
+ * Read yEd's group hierarchy into the parent column: a node's `gid` names the group node it sits in. A `gid` that
3116
+ * names no node (or the node itself) is warned once and left a plain column value.
3117
+ */
3118
+ pushGroups() {
3119
+ const t = this.requireTokens();
3120
+ for (const [node, v] of this.groupRefs) {
3121
+ let parent = INVALID_INDEX;
3122
+ try {
3123
+ const fileId = this.coerceFileId(v, this.fileIdOf(v, "gid"));
3124
+ parent = this.sink.indexOf(this.idMap?.get(fileId) ?? fileId);
3125
+ } catch {
3126
+ parent = INVALID_INDEX;
3127
+ }
3128
+ if (parent === INVALID_INDEX || parent === node) {
3129
+ this.report.warnOnce(
3130
+ "validation-error",
3131
+ GROUPS_CODE,
3132
+ `gid ${t.kind[v] === TOKEN_OPEN ? "[...]" : t.textOf(v)} names no other node; it is kept as a plain column value`,
3133
+ { line: t.line[v], element: "gid" }
3134
+ );
3135
+ continue;
3136
+ }
3137
+ this.setParent(node, parent, "gid");
3138
+ }
3139
+ }
3140
+ /**
3141
+ * Put a node in a group: the parent column, declared on first use.
3142
+ * @param node - the node's index
3143
+ * @param parent - the group node's index
3144
+ * @param type - the file key the hierarchy came from (`gid`, `rootcluster`)
3145
+ */
3146
+ setParent(node, parent, type) {
3147
+ this.parentHandle ??= this.sink.declareNodeColumn({
3148
+ name: uniqueColumnName(GROUP_PARENT_COLUMN, null, (c) => this.sink.nodeColumn(c) !== INVALID_INDEX),
3149
+ dtype: "u32",
3150
+ role: "parent",
3151
+ refersTo: "node",
3152
+ nullable: true,
3153
+ origin: { format: "gml", id: null, title: null, type, namespace: null }
3154
+ });
3155
+ this.sink.setNodeValue(this.parentHandle, node, parent);
3156
+ }
3157
+ /**
3158
+ * Read OGDF's cluster tree (`rootcluster`, GraphIO::writeGML): every cluster below the root becomes a group node
3159
+ * (id `cluster<id>`) holding its `vertex` nodes and its child clusters, with its label, its box as the node's
3160
+ * center and size, and its graphics as a node's (`color` is the outline, `style` the shape, `stipple` kept as
3161
+ * `clusterStipple`, since OGDF draws a cluster's outline solid). The root cluster is
3162
+ * the whole graph and draws nothing of its own. A `vertex` that names no node is warned once.
3163
+ */
3164
+ pushClusters() {
3165
+ if (this.rootCluster < 0) {
3166
+ return;
3167
+ }
3168
+ const t = this.requireTokens();
3169
+ const stack = [[this.rootCluster, INVALID_INDEX]];
3170
+ for (let frame = stack.pop(); frame !== void 0; frame = stack.pop()) {
3171
+ const [open, parent] = frame;
3172
+ for (let p = open + 1; p < t.match[open]; p = t.nextPair(p)) {
3173
+ const key = t.textOf(p);
3174
+ const v = p + 1;
3175
+ if (key === "cluster" && t.kind[v] === TOKEN_OPEN) {
3176
+ const cluster = this.addCluster(v, parent);
3177
+ if (cluster !== INVALID_INDEX) {
3178
+ stack.push([v, cluster]);
3179
+ }
3180
+ } else if (key === "vertex" && parent !== INVALID_INDEX) {
3181
+ this.addClusterVertex(v, parent);
3182
+ }
3183
+ }
3184
+ }
3185
+ }
3186
+ /**
3187
+ * Put a cluster's `vertex` in it.
3188
+ * @param v - the value token, the vertex's id as a string
3189
+ * @param cluster - the cluster's group node
3190
+ */
3191
+ addClusterVertex(v, cluster) {
3192
+ const t = this.requireTokens();
3193
+ const id = t.kind[v] === TOKEN_STRING ? this.coercer.text(t.stringOf(v)) : null;
3194
+ const node = id === null ? INVALID_INDEX : this.sink.indexOf(this.idMap?.get(id) ?? id);
3195
+ if (node === INVALID_INDEX || node === cluster) {
3196
+ this.report.warnOnce(
3197
+ "validation-error",
3198
+ GROUPS_CODE,
3199
+ `cluster vertex ${describeValue(t, v)} names no node; it is in no cluster`,
3200
+ { line: t.line[v], element: "vertex" }
3201
+ );
3202
+ return;
3203
+ }
3204
+ this.setParent(node, cluster, "rootcluster");
3205
+ }
3206
+ /**
3207
+ * Add one OGDF cluster as a group node: its label, and its graphics box (x, y its top-left corner, width and
3208
+ * height) as a node's center, w and h.
3209
+ * @param open - the cluster record's `[`
3210
+ * @param parent - the group node of the cluster it is in, or INVALID_INDEX under the root
3211
+ * @returns the group node's index, or INVALID_INDEX when its id is taken
3212
+ */
3213
+ addCluster(open, parent) {
3214
+ const t = this.requireTokens();
3215
+ const record = parseRecord(t, open);
3216
+ const ordinal = this.clusterCount++;
3217
+ const ownId = typeof record.id === "number" || typeof record.id === "string" ? String(record.id) : null;
3218
+ const fallback = `#${String(ordinal)}`;
3219
+ const id = `cluster${ownId ?? fallback}`;
3220
+ if (this.sink.indexOf(id) !== INVALID_INDEX) {
3221
+ this.report.warnOnce(
3222
+ "validation-error",
3223
+ GROUPS_CODE,
3224
+ `cluster ${id} has the id of a node; it is read as no group`,
3225
+ { line: t.line[open], element: id }
3226
+ );
3227
+ return INVALID_INDEX;
3228
+ }
3229
+ const index = this.sink.addNode(id);
3230
+ this.report.counts.nodes++;
3231
+ if (parent !== INVALID_INDEX) {
3232
+ this.setParent(index, parent, "rootcluster");
3233
+ }
3234
+ const label = this.nodePlans.get("label");
3235
+ if (typeof record.label === "string" && record.label !== "" && label?.kind === "string" && !label.list) {
3236
+ this.sink.setNodeValue(this.handleOf(label, "node"), index, record.label);
3237
+ }
3238
+ const graphics = this.nodePlans.get("graphics");
3239
+ const g = isRecord(record.graphics) ? record.graphics : null;
3240
+ if (g === null || graphics?.position === void 0 || graphics.position === null) {
3241
+ return index;
3242
+ }
3243
+ const { x, y, width, height, color, style, stipple, ...rest } = g;
3244
+ if (typeof x === "number" && typeof y === "number" && typeof width === "number" && typeof height === "number") {
3245
+ this.sink.setNodeValue(this.handleOf(graphics.position, "node"), index, [x + width / 2, y + height / 2, 0]);
3246
+ Object.assign(rest, { w: width, h: height });
3247
+ }
3248
+ Object.assign(
3249
+ rest,
3250
+ color === void 0 ? {} : { outline: color },
3251
+ style === void 0 ? {} : { type: style },
3252
+ stipple === void 0 ? {} : { clusterStipple: stipple }
3253
+ );
3254
+ if (graphics.rest !== null) {
3255
+ this.sink.setNodeValue(this.handleOf(graphics.rest, "node"), index, rest);
3256
+ }
3257
+ return index;
3258
+ }
2649
3259
  /** Turn every schema entry into a column plan. */
2650
3260
  buildPlans() {
2651
3261
  for (const [key, entry] of this.nodeSchema) {
@@ -2915,13 +3525,84 @@ class GmlImport {
2915
3525
  { line: t.line[p], element: what }
2916
3526
  );
2917
3527
  }
3528
+ /**
3529
+ * Find a node block's id, label and original-id values.
3530
+ * @param open - the block's `[`
3531
+ * @param close - the block's `]`
3532
+ * @returns each key's value token, or -1 when the block has none
3533
+ */
3534
+ nodeKeyTokens(open, close) {
3535
+ const t = this.requireTokens();
3536
+ let idTok = -1;
3537
+ let labelTok = -1;
3538
+ let originalTok = -1;
3539
+ for (let p = open + 1; p < close; p = t.nextPair(p)) {
3540
+ const key = t.textOf(p);
3541
+ if (key === "id") {
3542
+ idTok = this.structuralToken(idTok, p, "id");
3543
+ } else if (key === "label") {
3544
+ labelTok = labelTok < 0 ? p + 1 : labelTok;
3545
+ } else if (key === ORIGINAL_ID_KEY && this.options.restoreMangledIds) {
3546
+ originalTok = originalTok < 0 ? p + 1 : originalTok;
3547
+ }
3548
+ }
3549
+ return { idTok, labelTok, originalTok };
3550
+ }
3551
+ /**
3552
+ * The id a node is added to the sink under: its restored original id, else its label, its
3553
+ * ordinal or its file id, as `nodeIdFrom` says.
3554
+ * @param fileId - the node's file id
3555
+ * @param labelTok - its label's value token, or -1
3556
+ * @param originalTok - its original id's value token, or -1
3557
+ * @param ordinal - its position among the file's nodes
3558
+ * @returns the sink id
3559
+ */
3560
+ nodeSinkId(fileId, labelTok, originalTok, ordinal) {
3561
+ if (originalTok >= 0) {
3562
+ return this.restoredId(originalTok);
3563
+ }
3564
+ switch (this.options.nodeIdFrom) {
3565
+ case "label":
3566
+ if (labelTok < 0) {
3567
+ throw new GraphFormatError("E_INVALID_ID", "node has no label", {
3568
+ reason: "missing label"
3569
+ });
3570
+ }
3571
+ return this.coerceValueToken(labelTok);
3572
+ case "index":
3573
+ return ordinal;
3574
+ default:
3575
+ return fileId;
3576
+ }
3577
+ }
3578
+ /**
3579
+ * Note which sink id a file id resolves to, warning when a file id is declared twice.
3580
+ * @param fileId - the file id
3581
+ * @param sinkId - the sink id it now resolves to
3582
+ * @param line - the node block's line
3583
+ */
3584
+ mapFileId(fileId, sinkId, line) {
3585
+ if (this.idMap === null) {
3586
+ return;
3587
+ }
3588
+ const before = this.idMap.get(fileId);
3589
+ if (before !== void 0 && before !== sinkId) {
3590
+ this.report.warning(
3591
+ "merged",
3592
+ DUPLICATE_NODE_CODE,
3593
+ `file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`,
3594
+ { line, element: String(fileId) }
3595
+ );
3596
+ }
3597
+ this.idMap.set(fileId, sinkId);
3598
+ }
2918
3599
  /**
2919
3600
  * Push one node block.
2920
3601
  * @param open - the block's `[`
2921
3602
  */
2922
3603
  importNode(open) {
2923
3604
  const t = this.requireTokens();
2924
- const { sink, report, options } = this;
3605
+ const { sink, report } = this;
2925
3606
  const close = t.match[open];
2926
3607
  const line = t.line[open];
2927
3608
  const ordinal = this.nodeOrdinal++;
@@ -2930,55 +3611,14 @@ class GmlImport {
2930
3611
  let sinkId;
2931
3612
  let fileId;
2932
3613
  try {
2933
- let idTok = -1;
2934
- let labelTok = -1;
2935
- let originalTok = -1;
2936
- for (let p = open + 1; p < close; p = t.nextPair(p)) {
2937
- const key = t.textOf(p);
2938
- if (key === "id") {
2939
- idTok = this.structuralToken(idTok, p, "id");
2940
- } else if (key === "label") {
2941
- labelTok = labelTok < 0 ? p + 1 : labelTok;
2942
- } else if (key === ORIGINAL_ID_KEY && options.restoreMangledIds) {
2943
- originalTok = originalTok < 0 ? p + 1 : originalTok;
2944
- }
2945
- }
3614
+ const { idTok, labelTok, originalTok } = this.nodeKeyTokens(open, close);
2946
3615
  if (idTok < 0) {
2947
3616
  throw new GraphFormatError("E_INVALID_ID", "node has no id", { reason: "missing id" });
2948
3617
  }
2949
3618
  fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
2950
- if (originalTok >= 0) {
2951
- sinkId = this.restoredId(originalTok);
2952
- } else {
2953
- switch (options.nodeIdFrom) {
2954
- case "label":
2955
- if (labelTok < 0) {
2956
- throw new GraphFormatError("E_INVALID_ID", "node has no label", {
2957
- reason: "missing label"
2958
- });
2959
- }
2960
- sinkId = this.coerceValueToken(labelTok);
2961
- break;
2962
- case "index":
2963
- sinkId = ordinal;
2964
- break;
2965
- default:
2966
- sinkId = fileId;
2967
- }
2968
- }
3619
+ sinkId = this.nodeSinkId(fileId, labelTok, originalTok, ordinal);
2969
3620
  index = sink.addNode(sinkId);
2970
- if (this.idMap !== null) {
2971
- const before = this.idMap.get(fileId);
2972
- if (before !== void 0 && before !== sinkId) {
2973
- report.warning(
2974
- "merged",
2975
- DUPLICATE_NODE_CODE,
2976
- `file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`,
2977
- { line, element: String(fileId) }
2978
- );
2979
- }
2980
- this.idMap.set(fileId, sinkId);
2981
- }
3621
+ this.mapFileId(fileId, sinkId, line);
2982
3622
  } catch (err) {
2983
3623
  this.recordNodeError(err, line);
2984
3624
  report.counts.skippedNodes++;
@@ -3000,33 +3640,47 @@ class GmlImport {
3000
3640
  }
3001
3641
  this.beginElement(this.seq++);
3002
3642
  try {
3003
- const graphics = [];
3004
- let graphicsPlan = null;
3005
- for (let p = open + 1; p < close; p = t.nextPair(p)) {
3006
- const key = t.textOf(p);
3007
- if (key === "id" || key === ORIGINAL_ID_KEY && options.restoreMangledIds) {
3008
- continue;
3009
- }
3010
- const plan = this.nodePlans.get(key);
3011
- if (plan !== void 0 && plan.position !== null) {
3012
- graphicsPlan = plan;
3013
- graphics.push(p + 1);
3014
- } else if (plan !== void 0) {
3015
- this.writeNode(plan, index, p + 1);
3016
- }
3017
- }
3018
- if (graphicsPlan !== null) {
3019
- this.writeGraphics(graphicsPlan, index, graphics, {
3020
- line: t.line[graphics[0]],
3021
- element: String(sinkId)
3022
- });
3023
- }
3643
+ this.writeNodeKeys(open, index, sinkId);
3024
3644
  this.flushLists("node", index);
3025
3645
  } catch (err) {
3026
3646
  this.touched.length = 0;
3027
3647
  report.recordError(err, { line, element: String(sinkId) });
3028
3648
  }
3029
3649
  }
3650
+ /**
3651
+ * Write one node block's keys into its columns: its graphics record into the position plan, a yEd `gid` noted
3652
+ * for the group hierarchy, and every other planned key as it is.
3653
+ * @param open - the block's `[`
3654
+ * @param index - the node's index
3655
+ * @param sinkId - the node's id, for the report
3656
+ */
3657
+ writeNodeKeys(open, index, sinkId) {
3658
+ const t = this.requireTokens();
3659
+ const graphics = [];
3660
+ let graphicsPlan = null;
3661
+ for (let p = open + 1; p < t.match[open]; p = t.nextPair(p)) {
3662
+ const key = t.textOf(p);
3663
+ if (key === "id" || key === ORIGINAL_ID_KEY && this.options.restoreMangledIds) {
3664
+ continue;
3665
+ }
3666
+ if (key === "gid") {
3667
+ this.groupRefs.push([index, p + 1]);
3668
+ }
3669
+ const plan = this.nodePlans.get(key);
3670
+ if (plan !== void 0 && plan.position !== null) {
3671
+ graphicsPlan = plan;
3672
+ graphics.push(p + 1);
3673
+ } else if (plan !== void 0) {
3674
+ this.writeNode(plan, index, p + 1);
3675
+ }
3676
+ }
3677
+ if (graphicsPlan !== null) {
3678
+ this.writeGraphics(graphicsPlan, index, graphics, {
3679
+ line: t.line[graphics[0]],
3680
+ element: String(sinkId)
3681
+ });
3682
+ }
3683
+ }
3030
3684
  /**
3031
3685
  * Push one edge block.
3032
3686
  * @param open - the block's `[`
@@ -3807,7 +4461,7 @@ const GML_ISSUE = Object.freeze({
3807
4461
  GRAPHICS: GRAPHICS_CODE,
3808
4462
  /** A graph, node or edge record nested in a node or edge; kept as json, not read as structure. */
3809
4463
  NESTED_ELEMENT: NESTED_ELEMENT_CODE,
3810
- /** YEd's isGroup / gid keys, kept as plain columns; the hierarchy is not read as containment. */
4464
+ /** A yEd `gid` that names no other node; it stays a plain column value and puts the node in no group. */
3811
4465
  GROUPS: GROUPS_CODE,
3812
4466
  /**
3813
4467
  * An attribute's type was widened because a later value did not fit: an integer above 2^31 in an integer column,