@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
@@ -1,1070 +1,16 @@
1
1
  import { GraphFormatError, INVALID_INDEX } from "@graphty/graph-format";
2
2
  import { c as childrenCsr } from "./children-CA4coBi0.js";
3
- import { L as LOSS, c as capabilities, r as resolveExportOptions, a as checkCapabilities, U as countMixedEdges, e as explicitWeights, p as pairFolding, C as sanitizeIds, O as canonicalId, d as resolveImportOptions, f as reportUnusedOptions, g as reportSinkOptions, h as graphChosen, I as IdCoercer, i as DirectionResolver, o as parseWeightText, j as declareResolved } from "./export-CZ7VRm4I.js";
4
- import { h as isWritableDotText, j as quoteDotId } from "./escape-DH2Egt-l.js";
5
- import { f as formatF32, a as formatF64, i as idText, d as formatDecimal, c as formatInteger } from "./format-BMS-1Nxb.js";
6
- import { p as plural, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, I as ID_MERGED_CODE, O as OPTION_IGNORED_CODE, C as COLUMN_RENAMED_CODE, R as ROLE_TAKEN_CODE, l as DUPLICATE_ATTRIBUTE_CODE, P as PRECISION_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, i as MULTIPLE_GRAPHS_CODE, r as ENCODING_CONFLICT_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, E as EMPTY_INPUT_CODE, Q as SYNTAX_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE, K as ImportReportBuilder } from "./report-CgdsL9Hb.js";
7
- import { i as inferTextDtype, W as WIDENING_UNSUPPORTED_CODE, p as parseTextCell, T as TextCellWriter } from "./text-BuKQVMz2.js";
3
+ import { p as pairFolding, f as formatF32, a as formatF64, i as idText, d as formatDecimal, c as formatInteger, D as DirectionResolver } from "./format-BXiAb-1h.js";
4
+ import { q as quoteDotId, f as isWritableDotText } from "./escape-CuCIzNMB.js";
5
+ import { L as LOSS, c as capabilities, r as resolveExportOptions, a as checkCapabilities, G as countMixedEdges, e as explicitWeights, z as sanitizeIds, H as canonicalId, b as resolveImportOptions, d as reportUnusedOptions, f as reportSinkOptions, h as graphChosen, I as IdCoercer, p as parseWeightText, i as declareResolved } from "./export-Cha4dRFz.js";
6
+ import { p as plural, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, I as ID_MERGED_CODE, O as OPTION_IGNORED_CODE, C as COLUMN_RENAMED_CODE, R as ROLE_TAKEN_CODE, l as DUPLICATE_ATTRIBUTE_CODE, P as PRECISION_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, i as MULTIPLE_GRAPHS_CODE, r as ENCODING_CONFLICT_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, E as EMPTY_INPUT_CODE, Q as SYNTAX_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE, K as ImportReportBuilder } from "./report-CwMfYa9J.js";
7
+ import { i as inferTextDtype, W as WIDENING_UNSUPPORTED_CODE, p as parseTextCell, T as TextCellWriter } from "./text-ystE2bYi.js";
8
8
  import { j as joinText, e as encodeChunks, i as indentUnit } from "./writer-DxjgHwSe.js";
9
- import { i as importChosenGraph } from "./choose-Cdx6Enl2.js";
10
- import { r as readText, b as throwIfAborted, d as canonicalEncoding } from "./input-Ccg9I22A.js";
11
- import { m as median } from "./convert-BcQ8_jMo.js";
12
- import { u as StyleNotes, n as noteAt, a as STYLE_ISSUE, E as htmlLabelText, F as dotLabelText, p as plainCell, g as canonColor, y as colorOpacity, S as STYLE_BLOCK_NAME, v as parseStyleBlock, s as styleFingerprint, x as blockStyles, M as MAX_STYLE_VALUE_LENGTH, h as canonNumber, l as canonEnum, G as recordLabelText, i as num6, H as DOT_POINTS_PER_INCH, r as resolveStyles, t as toolDefaults, w as writeStyleBlock, c as styleBlockLosses } from "./block-Cu22ewuS.js";
13
- import { S as StyleApproximations } from "./approximations-C2riR4NT.js";
14
- import { s as sharedInExportCall } from "./writer-DvHTl36J.js";
15
- import { v as valueColumns } from "./styles-yed-Cs1nmrjn.js";
16
- const DOT_FORMAT = "dot";
17
- const DOT_ORIGIN = Object.freeze({ format: DOT_FORMAT });
18
- const CLUSTER_COLUMN = "graphty.cluster";
19
- const PARENT_COLUMN = "graphty.parent";
20
- const SOURCE_PORT_COLUMN = "graphty.sourcePort";
21
- const TARGET_PORT_COLUMN = "graphty.targetPort";
22
- const LABEL_ATTRIBUTE = "label";
23
- const POS_ATTRIBUTE = "pos";
24
- const POSITION_COLUMN = "graphty.position";
25
- const KEY_ATTRIBUTE = "key";
26
- const PIN_ATTRIBUTE = "pin";
27
- const DOT_META_KEY = "dot";
28
- const DOT_STYLE_CAPABILITIES = Object.freeze({
29
- tool: "graphviz",
30
- node: Object.freeze([
31
- "fill",
32
- "fillOpacity",
33
- "borderColor",
34
- "borderWidth",
35
- "borderStyle",
36
- "shape",
37
- "width",
38
- "height",
39
- "label",
40
- "labelColor",
41
- "labelSize",
42
- "labelFont",
43
- "tooltip",
44
- "visible"
45
- ]),
46
- edge: Object.freeze([
47
- "color",
48
- "opacity",
49
- "width",
50
- "lineStyle",
51
- "sourceArrow",
52
- "targetArrow",
53
- "arrowSize",
54
- "label",
55
- "sourceLabel",
56
- "targetLabel",
57
- "labelColor",
58
- "labelSize",
59
- "labelFont",
60
- "tooltip",
61
- "visible"
62
- ]),
63
- graph: Object.freeze(["background"]),
64
- block: "native"
65
- });
66
- const NAME_KEY = "name";
67
- const DIRECTED_KEY = "directed";
68
- const CLUSTER_KEY = "cluster";
69
- const NODE_ATTRIBUTES = [
70
- "colorscheme",
71
- "color",
72
- "fillcolor",
73
- "bgcolor",
74
- "pencolor",
75
- "style",
76
- "shape",
77
- "width",
78
- "height",
79
- "fixedsize",
80
- "regular",
81
- "penwidth",
82
- "fontname",
83
- "fontsize",
84
- "fontcolor",
85
- "tooltip"
86
- ];
87
- const EDGE_ATTRIBUTES = [
88
- "colorscheme",
89
- "color",
90
- "style",
91
- "penwidth",
92
- "fontname",
93
- "fontsize",
94
- "fontcolor",
95
- "tooltip",
96
- "edgetooltip",
97
- "arrowhead",
98
- "arrowtail",
99
- "dir",
100
- "arrowsize",
101
- "headlabel",
102
- "taillabel"
103
- ];
104
- const NOTED_ATTRIBUTES = ["peripheries", "xlabel"];
105
- const CIRCLE_LIKE = /* @__PURE__ */ new Set(["circle", "doublecircle", "mcircle", "square", "msquare"]);
106
- const BOX_LIKE = /* @__PURE__ */ new Set(["box", "rect", "rectangle", "square"]);
107
- const ELLIPSE_LIKE = /* @__PURE__ */ new Set(["", "ellipse", "oval", "circle"]);
108
- const NO_OUTLINE = /* @__PURE__ */ new Set(["plain", "plaintext", "none"]);
109
- const RECORD = /* @__PURE__ */ new Set(["record", "mrecord"]);
110
- const TRUE_TEXTS$1 = /* @__PURE__ */ new Set(["true", "yes", "shape"]);
111
- const POINT_SIZE = 0.05;
112
- const REGULAR_SIZE = 0.5;
113
- function isHtmlString(text) {
114
- if (text.length < 2 || !text.startsWith("<") || !text.endsWith(">")) {
115
- return false;
116
- }
117
- let depth = 0;
118
- for (let i = 0; i < text.length; i++) {
119
- const c = text.codePointAt(i);
120
- if (c === 60) {
121
- depth++;
122
- } else if (c === 62) {
123
- depth--;
124
- if (depth === 0 && i !== text.length - 1) {
125
- return false;
126
- }
127
- }
128
- }
129
- return depth === 0;
130
- }
131
- function cellText$1(table, name, i) {
132
- if (!table.has(name)) {
133
- return null;
134
- }
135
- const v = plainCell(table.value(name, i));
136
- if (typeof v === "string") {
137
- return v;
138
- }
139
- return typeof v === "number" || typeof v === "boolean" ? String(v) : null;
140
- }
141
- function nonEmpty(v) {
142
- return v === null || v === "" ? null : v;
143
- }
144
- function styleTokens(raw, at) {
145
- if (raw === null) {
146
- return [];
147
- }
148
- if (raw.length > MAX_STYLE_VALUE_LENGTH) {
149
- noteAt(at, STYLE_ISSUE.VALUE_TOO_LONG, `${String(raw.length)} characters`);
150
- return [];
151
- }
152
- return raw.toLowerCase().split(",").map((t) => t.replace(/^[ \t\r\n]+/, "")).filter((t) => t !== "");
153
- }
154
- function setLineWidth(tokens) {
155
- for (const t of tokens) {
156
- if (t.startsWith("setlinewidth(") && t.endsWith(")")) {
157
- return t.slice("setlinewidth(".length, -1).trim();
158
- }
159
- }
160
- return null;
161
- }
162
- function isTrue(raw) {
163
- if (raw === null) {
164
- return false;
165
- }
166
- const t = raw.trim().toLowerCase();
167
- return TRUE_TEXTS$1.has(t) || /^-?\d+$/.test(t) && Number(t) !== 0;
168
- }
169
- function labelText(raw, names, html, record, at) {
170
- if (isHtmlString(raw)) {
171
- return htmlLabelText(raw, at);
172
- }
173
- if (html.has(`<${raw}>`)) {
174
- return htmlLabelText(`<${raw}>`, at);
175
- }
176
- return dotLabelText(record ? recordLabelText(raw, at) : raw, names, at);
177
- }
178
- function readColor(raw, scheme, use, property, opacity, put, at) {
179
- if (raw === null) {
180
- return null;
181
- }
182
- const c = canonColor(raw, "graphviz", at(property), { scheme, use });
183
- if (c === null) {
184
- return null;
185
- }
186
- put(property, c.color);
187
- if (opacity !== null) {
188
- put(opacity, c.alpha);
189
- } else if (c.alpha > 0 || property !== "borderColor") {
190
- colorOpacity(c, null, at(property), false);
191
- }
192
- return c.alpha;
193
- }
194
- function inchesOf(points) {
195
- const want = num6(points);
196
- for (let digits = 6; digits < 17; digits++) {
197
- const inches2 = Number((points / DOT_POINTS_PER_INCH).toPrecision(digits));
198
- if (num6(inches2 * DOT_POINTS_PER_INCH) === want) {
199
- return inches2 + 0;
200
- }
201
- }
202
- return points / DOT_POINTS_PER_INCH;
203
- }
204
- function inches(raw, at) {
205
- if (raw === null) {
206
- return null;
207
- }
208
- const v = raw.trim() === "" ? Number.NaN : Number(raw);
209
- if (!Number.isFinite(v) || v < 0) {
210
- noteAt(at, STYLE_ISSUE.BAD_VALUE, raw.slice(0, MAX_STYLE_VALUE_LENGTH));
211
- return null;
212
- }
213
- return v;
214
- }
215
- function readCommon(get, tokens, scheme, names, put, at) {
216
- if (tokens.includes("invis")) {
217
- put("visible", false);
218
- }
219
- readColor(nonEmpty(get("fontcolor")), scheme, "line", "labelColor", null, put, at);
220
- const size = get("fontsize");
221
- put("labelSize", size === null ? null : canonNumber(size, at("labelSize")));
222
- const font = get("fontname");
223
- if (font !== null && font.length <= MAX_STYLE_VALUE_LENGTH) {
224
- put("labelFont", font);
225
- }
226
- const tip = get("tooltip") ?? get("edgetooltip");
227
- if (tip !== null) {
228
- put("tooltip", dotLabelText(tip, names, at("tooltip")));
229
- }
230
- }
231
- function readNode(get, cx, put, at) {
232
- const tokens = styleTokens(get("style"), at("visible"));
233
- const shapeRaw = nonEmpty(get("shape"));
234
- const shape = (shapeRaw ?? "").toLowerCase();
235
- const n = {
236
- get,
237
- cx,
238
- put,
239
- at,
240
- tokens,
241
- shapeRaw,
242
- shape,
243
- point: !cx.cluster && shape === "point",
244
- scheme: get("colorscheme"),
245
- color: nonEmpty(get("color"))
246
- };
247
- const names = cx.cluster ? { graph: cx.name } : { node: cx.name, graph: cx.graph, edge: "" };
248
- readCommon(get, tokens, n.scheme, names, put, at);
249
- if (cx.cluster) {
250
- readClusterFill(n);
251
- } else {
252
- readNodeFill(n);
253
- }
254
- readNodeOutline(n);
255
- readNodeShape(n);
256
- const label = n.point ? null : get(LABEL_ATTRIBUTE);
257
- if (label !== null) {
258
- put("label", labelText(label, names, cx.html, RECORD.has(shape), at("label")));
259
- }
260
- if (!cx.cluster) {
261
- readSize(get, shape, n.point, label ?? (n.point ? null : cx.name), put, at);
262
- }
263
- if (Number(get("peripheries")) > 1 || nonEmpty(get("xlabel")) !== null) {
264
- noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, nonEmpty(get("xlabel")) === null ? "peripheries" : "xlabel");
265
- }
266
- }
267
- function readClusterFill(n) {
268
- const { get, tokens } = n;
269
- const filled = tokens.includes("filled") || tokens.includes("radial") || tokens.includes("striped");
270
- const bg = nonEmpty(get("bgcolor"));
271
- const raw = filled ? nonEmpty(get("fillcolor")) ?? n.color ?? bg ?? "lightgrey" : bg;
272
- readColor(raw, n.scheme, "fill", "fill", "fillOpacity", n.put, n.at);
273
- }
274
- function readNodeFill(n) {
275
- const { shape, point } = n;
276
- const fillcolor = nonEmpty(n.get("fillcolor"));
277
- const filled = point || n.tokens.some(
278
- (t) => t === "filled" || t === "radial" || t === "striped" && BOX_LIKE.has(shape) || t === "wedged" && ELLIPSE_LIKE.has(shape)
279
- );
280
- if (filled) {
281
- const raw = fillcolor ?? n.color ?? (point ? "black" : "lightgrey");
282
- readColor(raw, n.scheme, "fill", "fill", "fillOpacity", n.put, n.at);
283
- } else if (fillcolor !== null) {
284
- noteAt(n.at("fill"), STYLE_ISSUE.UNFILLED, fillcolor.slice(0, MAX_STYLE_VALUE_LENGTH));
285
- }
286
- }
287
- function readNodeOutline(n) {
288
- const { get, cx, put, at, tokens } = n;
289
- if (!cx.cluster && NO_OUTLINE.has(n.shape)) {
290
- put("borderWidth", 0);
291
- } else {
292
- const outline = cx.cluster ? nonEmpty(get("pencolor")) ?? n.color : n.color;
293
- const alpha = readColor(outline, n.scheme, "line", "borderColor", null, put, at);
294
- const width = nonEmpty(get("penwidth")) ?? setLineWidth(tokens);
295
- if (alpha === 0) {
296
- put("borderWidth", 0);
297
- } else if (width !== null) {
298
- put("borderWidth", penWidth(width, get("penwidth") !== null, at("borderWidth")));
299
- } else if (tokens.includes("bold")) {
300
- put("borderWidth", 2);
301
- }
302
- }
303
- if (tokens.includes("dashed")) {
304
- put("borderStyle", "dashed");
305
- } else if (tokens.includes("dotted")) {
306
- put("borderStyle", "dotted");
307
- }
308
- }
309
- function readNodeShape(n) {
310
- const rounded = n.tokens.includes("rounded");
311
- if (n.cx.cluster) {
312
- n.put("shape", rounded ? "round-rectangle" : "rectangle");
313
- } else if (n.shapeRaw !== null) {
314
- n.put(
315
- "shape",
316
- rounded && BOX_LIKE.has(n.shape) ? "round-rectangle" : canonEnum("shape", n.shapeRaw, "graphviz", n.at("shape"))
317
- );
318
- }
319
- }
320
- function penWidth(raw, attribute, site) {
321
- const value = Number(raw.trim());
322
- if (attribute && Number.isFinite(value) && value < 0) {
323
- noteAt(site, STYLE_ISSUE.BAD_VALUE, raw.slice(0, MAX_STYLE_VALUE_LENGTH));
324
- return 0;
325
- }
326
- return canonNumber(raw, site);
327
- }
328
- function readSize(get, shape, point, label, put, at) {
329
- let w = inches(get("width"), at("width"));
330
- let h = inches(get("height"), at("height"));
331
- const same = point || CIRCLE_LIKE.has(shape) || isTrue(get("regular"));
332
- if (shape === "plain") {
333
- w = h = 0;
334
- } else if (w === null && h === null) {
335
- if (point) {
336
- put("width", num6(POINT_SIZE * DOT_POINTS_PER_INCH));
337
- put("height", num6(POINT_SIZE * DOT_POINTS_PER_INCH));
338
- return;
339
- }
340
- if (!same) {
341
- return;
342
- }
343
- w = h = REGULAR_SIZE;
344
- }
345
- let ww = w;
346
- let hh = h;
347
- if (point) {
348
- ww = hh = Math.min(w ?? Infinity, h ?? Infinity);
349
- } else if (same) {
350
- ww = hh = Math.max(w ?? 0, h ?? 0);
351
- }
352
- const exact = point || isTrue(get("fixedsize")) || label === "" && !RECORD.has(shape);
353
- if (!exact) {
354
- noteAt(at("width"), STYLE_ISSUE.SIZE_MINIMUM, "grows to fit its label");
355
- }
356
- put("width", ww === null ? null : canonNumber(ww, at("width"), DOT_POINTS_PER_INCH));
357
- put("height", hh === null ? null : canonNumber(hh, at("height"), DOT_POINTS_PER_INCH));
358
- }
359
- function readEdge(get, cx, put, at) {
360
- const tokens = styleTokens(get("style"), at("visible"));
361
- const scheme = get("colorscheme");
362
- readCommon(get, tokens, scheme, cx.names, put, at);
363
- readColor(nonEmpty(get("color")), scheme, "edge", "color", "opacity", put, at);
364
- readEdgeLine(get, tokens, put, at);
365
- readEdgeArrows(get, cx, put, at);
366
- for (const [attribute, property] of [
367
- [LABEL_ATTRIBUTE, "label"],
368
- ["headlabel", "targetLabel"],
369
- ["taillabel", "sourceLabel"]
370
- ]) {
371
- const raw = get(attribute);
372
- if (raw !== null) {
373
- put(property, labelText(raw, cx.names, cx.html, false, at(property)));
374
- }
375
- }
376
- if (nonEmpty(get("xlabel")) !== null) {
377
- noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, "xlabel");
378
- }
379
- }
380
- function readEdgeLine(get, tokens, put, at) {
381
- const width = nonEmpty(get("penwidth")) ?? setLineWidth(tokens);
382
- if (width !== null) {
383
- put("width", penWidth(width, get("penwidth") !== null, at("width")));
384
- } else if (tokens.includes("bold")) {
385
- put("width", 2);
386
- }
387
- if (tokens.includes("dashed")) {
388
- put("lineStyle", "dashed");
389
- } else if (tokens.includes("dotted")) {
390
- put("lineStyle", "dotted");
391
- } else if (tokens.includes("solid") || tokens.includes("bold")) {
392
- put("lineStyle", "solid");
393
- } else if (tokens.includes("tapered")) {
394
- put("lineStyle", "other:tapered");
395
- }
396
- }
397
- function readEdgeArrows(get, cx, put, at) {
398
- const dirRaw = nonEmpty(get("dir"));
399
- const head = nonEmpty(get("arrowhead"));
400
- const tail = nonEmpty(get("arrowtail"));
401
- if (dirRaw !== null || head !== null || tail !== null) {
402
- const dir = (dirRaw ?? (cx.directed ? "forward" : "none")).trim().toLowerCase();
403
- const forward = dir === "forward" || dir === "both";
404
- const back = dir === "back" || dir === "both";
405
- put("targetArrow", forward ? canonEnum("arrow", head ?? "normal", "graphviz", at("targetArrow")) : "none");
406
- put("sourceArrow", back ? canonEnum("arrow", tail ?? "normal", "graphviz", at("sourceArrow")) : "none");
407
- }
408
- const size = get("arrowsize");
409
- if (size !== null) {
410
- put("arrowSize", canonNumber(size, at("arrowSize")));
411
- }
412
- }
413
- function htmlStrings(snapshot) {
414
- const out = /* @__PURE__ */ new Set();
415
- for (let i = 0; i < snapshot.nodeCount; i++) {
416
- const id = snapshot.ids.idOf(i);
417
- if (typeof id === "string" && isHtmlString(id)) {
418
- out.add(id);
419
- }
420
- }
421
- for (const [table, n] of [
422
- [snapshot.nodes, snapshot.nodeCount],
423
- [snapshot.edges, snapshot.edgeCount]
424
- ]) {
425
- for (const name of [LABEL_ATTRIBUTE, "headlabel", "taillabel"].filter((c) => table.has(c))) {
426
- addHtmlCells(table, name, n, out);
427
- }
428
- }
429
- return out;
430
- }
431
- function addHtmlCells(table, name, n, out) {
432
- for (let i = 0; i < n; i++) {
433
- const v = cellText$1(table, name, i);
434
- if (v !== null && isHtmlString(v)) {
435
- out.add(v);
436
- }
437
- }
438
- }
439
- function directedEdges(snapshot) {
440
- const out = new Array(snapshot.edgeCount).fill(snapshot.directed);
441
- const col = snapshot.directed ? snapshot.edges.byRole("directed") : null;
442
- if (col !== null) {
443
- for (let e = 0; e < snapshot.edgeCount; e++) {
444
- const v = plainCell(col.value(e));
445
- if (typeof v === "boolean") {
446
- out[e] = v;
447
- }
448
- }
449
- }
450
- return out;
451
- }
452
- function isCluster(snapshot, i) {
453
- return snapshot.nodes.has(CLUSTER_COLUMN) && snapshot.nodes.value(CLUSTER_COLUMN, i) === true;
454
- }
455
- function contexts(snapshot, written = null) {
456
- const html = htmlStrings(snapshot);
457
- const graph = snapshot.meta.name ?? "";
458
- const own = directedEdges(snapshot);
459
- const directed = written === null || own.every((d) => d === snapshot.directed) ? own : own.map(() => written);
460
- const name = (i) => String(snapshot.ids.idOf(i));
461
- return {
462
- node: (i) => ({ name: name(i), graph, cluster: isCluster(snapshot, i), html }),
463
- edge: (e) => {
464
- const tail = name(snapshot.edgeSource(e));
465
- const head = name(snapshot.edgeTarget(e));
466
- return {
467
- names: { graph, tail, head, edge: `${tail}${directed[e] ? "->" : "--"}${head}` },
468
- directed: directed[e],
469
- html
470
- };
471
- }
472
- };
473
- }
474
- function defaultLabel(cx, shape, notes) {
475
- if (cx.cluster || shape === "point") {
476
- return null;
477
- }
478
- const at = { notes, target: "node", property: "label" };
479
- return isHtmlString(cx.name) ? htmlLabelText(cx.name, at) : dotLabelText(String.raw`\N`, { node: cx.name, graph: cx.graph }, at);
480
- }
481
- function styleColumns(table, attributes) {
482
- const own = /* @__PURE__ */ new Set([...attributes, ...NOTED_ATTRIBUTES]);
483
- return [...table.names()].filter((c) => own.has(c) || c.startsWith("graphty.style."));
484
- }
485
- function dotStyles(snapshot, context) {
486
- const notes = new StyleNotes();
487
- const cx = contexts(snapshot);
488
- const node = valueColumns(snapshot.nodeCount);
489
- const nameColumn = new Array(snapshot.nodeCount).fill(null);
490
- const clusterColumn = new Array(snapshot.nodeCount).fill(null);
491
- let named = 0;
492
- let clusters = 0;
493
- for (let i = 0; i < snapshot.nodeCount; i++) {
494
- context.budget.spend("node", NODE_ATTRIBUTES.length);
495
- const get = (name) => cellText$1(snapshot.nodes, name, i);
496
- const ncx = cx.node(i);
497
- const at = (property) => ({ notes, target: "node", property, element: i, budget: context.budget });
498
- readNode(
499
- get,
500
- ncx,
501
- (p, v) => {
502
- node.put(i, p, v);
503
- },
504
- at
505
- );
506
- const shown = defaultLabel(ncx, (get("shape") ?? "").toLowerCase(), notes);
507
- if (shown !== null) {
508
- nameColumn[i] = shown;
509
- named++;
510
- }
511
- if (ncx.cluster) {
512
- clusterColumn[i] = true;
513
- clusters++;
514
- }
515
- }
516
- const edge = valueColumns(snapshot.edgeCount);
517
- for (let e = 0; e < snapshot.edgeCount; e++) {
518
- context.budget.spend("edge", EDGE_ATTRIBUTES.length);
519
- const get = (name) => cellText$1(snapshot.edges, name, e);
520
- const at = (property) => ({ notes, target: "edge", property, element: e, budget: context.budget });
521
- readEdge(
522
- get,
523
- cx.edge(e),
524
- (p, v) => {
525
- edge.put(e, p, v);
526
- },
527
- at
528
- );
529
- }
530
- const graph = {};
531
- const bg = nonEmpty(cellText$1(snapshot.graph, "bgcolor", 0));
532
- if (snapshot.graph.has("bgcolor") && bg !== null) {
533
- readColor(
534
- bg,
535
- cellText$1(snapshot.graph, "colorscheme", 0),
536
- "fill",
537
- "background",
538
- null,
539
- (p, v) => {
540
- if (v !== null) {
541
- graph[p] = v;
542
- }
543
- },
544
- (property) => ({ notes, target: "graph", property })
545
- );
546
- }
547
- const blockText = cellText$1(snapshot.graph, STYLE_BLOCK_NAME, 0);
548
- if (blockText !== null) {
549
- exactFromBlock(snapshot, blockText, { node: node.values, edge: edge.values }, cx);
550
- }
551
- const nodeRules = [];
552
- const nodeColumns = /* @__PURE__ */ new Map();
553
- if (named > 0) {
554
- nodeColumns.set(NAME_KEY, nameColumn);
555
- nodeRules.push({
556
- id: "node.tool.name-label",
557
- target: "node",
558
- role: "passthrough",
559
- origin: "tool",
560
- where: { has: { style: NAME_KEY } },
561
- map: { label: { kind: "passthrough", by: { style: NAME_KEY } } },
562
- facts: { elements: named, reason: "NODE_NAME" }
563
- });
564
- }
565
- const features = clusters > 0 ? [{ ref: { style: CLUSTER_KEY }, values: clusterColumn }] : [];
566
- const edgeRules = [];
567
- const edgeColumns = /* @__PURE__ */ new Map();
568
- const directed = directedEdges(snapshot);
569
- if (directed.some(Boolean)) {
570
- edgeColumns.set(
571
- DIRECTED_KEY,
572
- directed.map((d) => d ? true : null)
573
- );
574
- edgeRules.push({
575
- id: "edge.tool.arrow",
576
- target: "edge",
577
- role: "group",
578
- origin: "tool",
579
- where: { has: { style: DIRECTED_KEY } },
580
- set: { targetArrow: "triangle" }
581
- });
582
- }
583
- return {
584
- canonical: true,
585
- dialect: "graphviz",
586
- tool: "graphviz",
587
- units: "px",
588
- node: { values: node.values, rules: nodeRules, columns: nodeColumns, features },
589
- edge: { values: edge.values, rules: edgeRules, columns: edgeColumns },
590
- graph,
591
- notes: notes.list(),
592
- readFrom: {
593
- node: styleColumns(snapshot.nodes, NODE_ATTRIBUTES),
594
- edge: styleColumns(snapshot.edges, EDGE_ATTRIBUTES)
595
- }
596
- };
597
- }
598
- const SHAPES = /* @__PURE__ */ new Map([
599
- ["ellipse", "ellipse"],
600
- ["rectangle", "box"],
601
- ["round-rectangle", "box"],
602
- ["triangle", "triangle"],
603
- ["diamond", "diamond"],
604
- ["pentagon", "pentagon"],
605
- ["hexagon", "hexagon"],
606
- ["octagon", "octagon"],
607
- ["parallelogram", "parallelogram"],
608
- ["trapezoid", "trapezium"],
609
- ["star", "star"],
610
- ["none", "none"]
611
- ]);
612
- const ARROWS = /* @__PURE__ */ new Map([
613
- ["none", "none"],
614
- ["triangle", "normal"],
615
- ["triangle-open", "onormal"],
616
- ["vee", "vee"],
617
- ["tee", "tee"],
618
- ["diamond", "diamond"],
619
- ["diamond-open", "odiamond"],
620
- ["circle", "dot"],
621
- ["circle-open", "odot"],
622
- ["square", "box"],
623
- ["crow", "crow"],
624
- ["half", "lnormal"],
625
- ["inverted", "inv"]
626
- ]);
627
- const STROKES = /* @__PURE__ */ new Map([
628
- ["dashed", "dashed"],
629
- ["dotted", "dotted"]
630
- ]);
631
- function graphvizDefaults(target) {
632
- const t = toolDefaults("graphviz")?.[target];
633
- const out = /* @__PURE__ */ new Map();
634
- const add = (attribute, property, scale = 1) => {
635
- const v = t[property]?.value;
636
- if (typeof v === "number") {
637
- out.set(attribute, num6(v / scale));
638
- } else if (typeof v === "string") {
639
- out.set(attribute, v);
640
- }
641
- };
642
- add("fontcolor", "labelColor");
643
- add("fontsize", "labelSize");
644
- add("fontname", "labelFont");
645
- if (target === "node") {
646
- add("color", "borderColor");
647
- add("pencolor", "borderColor");
648
- add("penwidth", "borderWidth");
649
- add("shape", "shape");
650
- add("width", "width", DOT_POINTS_PER_INCH);
651
- add("height", "height", DOT_POINTS_PER_INCH);
652
- } else {
653
- add("color", "color");
654
- add("penwidth", "width");
655
- add("arrowsize", "arrowSize");
656
- }
657
- return out;
658
- }
659
- const DEFAULT_ATTRIBUTES = {
660
- node: graphvizDefaults("node"),
661
- edge: graphvizDefaults("edge")
662
- };
663
- function withoutDefaults(out, target) {
664
- for (const [attribute, value] of DEFAULT_ATTRIBUTES[target]) {
665
- if (out.get(attribute) === value) {
666
- out.delete(attribute);
667
- }
668
- }
669
- if (!out.has("width") && !out.has("height")) {
670
- out.delete("fixedsize");
671
- }
672
- return out;
673
- }
674
- function gvColor(color, opacity) {
675
- if (typeof opacity !== "number" || opacity >= 1) {
676
- return color;
677
- }
678
- const a = Math.max(0, Math.min(255, Math.round(opacity * 255)));
679
- return color + a.toString(16).padStart(2, "0");
680
- }
681
- function escapeLabel(text) {
682
- return text.replaceAll("\\", String.raw`\\`).replaceAll("\n", String.raw`\n`);
683
- }
684
- function spelled(table, value, nearest, property, approximate) {
685
- const exact = table.get(value);
686
- if (exact !== void 0) {
687
- return exact;
688
- }
689
- if (value.startsWith("other:")) {
690
- return value.slice("other:".length);
691
- }
692
- approximate(property, value);
693
- return nearest;
694
- }
695
- function writeCommon(get, out, tokens) {
696
- const color = get("labelColor");
697
- if (typeof color === "string") {
698
- out.set("fontcolor", color);
699
- }
700
- const size = get("labelSize");
701
- if (typeof size === "number") {
702
- out.set("fontsize", size);
703
- }
704
- const font = get("labelFont");
705
- if (typeof font === "string") {
706
- out.set("fontname", font);
707
- }
708
- const tip = get("tooltip");
709
- if (typeof tip === "string") {
710
- out.set("tooltip", escapeLabel(tip));
711
- }
712
- if (get("visible") === false) {
713
- tokens.push("invis");
714
- }
715
- }
716
- function nodeAttributes(get, cx, approximate, notes) {
717
- const out = /* @__PURE__ */ new Map();
718
- const tokens = [];
719
- writeCommon(get, out, tokens);
720
- writeNodeOutline(get, cx, approximate, out, tokens);
721
- const gvShape = writeNodeShape(get, cx, approximate, out, tokens);
722
- if (!cx.cluster) {
723
- writeNodeSize(get, out);
724
- }
725
- const label = get("label");
726
- const shown = defaultLabel(cx, gvShape, notes);
727
- if (typeof label === "string" && label !== shown) {
728
- out.set(LABEL_ATTRIBUTE, escapeLabel(label));
729
- } else if (label === null && shown !== null) {
730
- out.set(LABEL_ATTRIBUTE, "");
731
- }
732
- if (tokens.length > 0) {
733
- out.set("style", tokens.join(","));
734
- }
735
- return withoutDefaults(out, "node");
736
- }
737
- function writeNodeOutline(get, cx, approximate, out, tokens) {
738
- const fill = get("fill");
739
- const fillOpacity = get("fillOpacity");
740
- if (typeof fill === "string" && fillOpacity !== 0) {
741
- tokens.push("filled");
742
- out.set("fillcolor", gvColor(fill, fillOpacity));
743
- }
744
- const border = get("borderColor");
745
- if (typeof border === "string") {
746
- out.set(cx.cluster ? "pencolor" : "color", border);
747
- }
748
- const borderWidth = get("borderWidth");
749
- if (typeof borderWidth === "number") {
750
- out.set("penwidth", borderWidth);
751
- }
752
- const borderStyle = get("borderStyle");
753
- if (typeof borderStyle === "string" && borderStyle !== "solid") {
754
- const nearest = borderStyle.includes("dash") ? "dashed" : "solid";
755
- tokens.push(spelled(STROKES, borderStyle, nearest, "borderStyle", approximate));
756
- }
757
- }
758
- function writeNodeShape(get, cx, approximate, out, tokens) {
759
- const shape = get("shape");
760
- if (typeof shape !== "string") {
761
- return "";
762
- }
763
- if (shape === "round-rectangle") {
764
- tokens.push("rounded");
765
- }
766
- if (cx.cluster) {
767
- if (shape !== "rectangle" && shape !== "round-rectangle") {
768
- approximate("shape", shape);
769
- }
770
- return "";
771
- }
772
- const gvShape = spelled(SHAPES, shape, shape === "vee" ? "invtriangle" : "box", "shape", approximate);
773
- out.set("shape", gvShape);
774
- return gvShape;
775
- }
776
- function writeNodeSize(get, out) {
777
- const width = get("width");
778
- const height = get("height");
779
- if (typeof width === "number" || typeof height === "number") {
780
- out.set("fixedsize", "true");
781
- }
782
- if (typeof width === "number") {
783
- out.set("width", inchesOf(width));
784
- }
785
- if (typeof height === "number") {
786
- out.set("height", inchesOf(height));
787
- }
788
- }
789
- function edgeAttributes(get, directed, approximate) {
790
- const out = /* @__PURE__ */ new Map();
791
- const tokens = [];
792
- writeCommon(get, out, tokens);
793
- const color = get("color");
794
- if (typeof color === "string") {
795
- out.set("color", gvColor(color, get("opacity")));
796
- }
797
- const width = get("width");
798
- if (typeof width === "number") {
799
- out.set("penwidth", width);
800
- }
801
- const line = get("lineStyle");
802
- if (typeof line === "string" && line !== "solid") {
803
- tokens.push(spelled(STROKES, line, line.includes("dash") ? "dashed" : "solid", "lineStyle", approximate));
804
- }
805
- writeEdgeArrows(get, directed, approximate, out);
806
- const arrowSize = get("arrowSize");
807
- if (typeof arrowSize === "number") {
808
- out.set("arrowsize", arrowSize);
809
- }
810
- for (const [property, attribute] of [
811
- ["label", LABEL_ATTRIBUTE],
812
- ["targetLabel", "headlabel"],
813
- ["sourceLabel", "taillabel"]
814
- ]) {
815
- const v = get(property);
816
- if (typeof v === "string") {
817
- out.set(attribute, escapeLabel(v));
818
- }
819
- }
820
- if (tokens.length > 0) {
821
- out.set("style", tokens.join(","));
822
- }
823
- return withoutDefaults(out, "edge");
824
- }
825
- function writeEdgeArrows(get, directed, approximate, out) {
826
- const source = get("sourceArrow");
827
- const target = get("targetArrow");
828
- const tail = typeof source === "string" && source !== "none";
829
- const head = typeof target === "string" && target !== "none";
830
- const plain = directed ? head && !tail && target === "triangle" : !head && !tail;
831
- if (plain || source === null && target === null) {
832
- return;
833
- }
834
- let dir = "none";
835
- if (head && tail) {
836
- dir = "both";
837
- } else if (head) {
838
- dir = "forward";
839
- } else if (tail) {
840
- dir = "back";
841
- }
842
- out.set("dir", dir);
843
- if (head) {
844
- out.set("arrowhead", spelled(ARROWS, target, "normal", "targetArrow", approximate));
845
- }
846
- if (tail) {
847
- out.set("arrowtail", spelled(ARROWS, source, "normal", "sourceArrow", approximate));
848
- }
849
- }
850
- function getter(picture, target) {
851
- const columns = /* @__PURE__ */ new Map();
852
- for (const p of DOT_STYLE_CAPABILITIES[target]) {
853
- columns.set(p, picture(target, p));
854
- }
855
- return (i) => (property) => columns.get(property)?.[i] ?? null;
856
- }
857
- function exactFromBlock(snapshot, text, read, cx) {
858
- const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
859
- const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "dot") : null;
860
- if (ex === null) {
861
- return;
862
- }
863
- const notes = new StyleNotes();
864
- for (const target of ["node", "edge"]) {
865
- const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
866
- const get = getter((t, p) => resolveStyles(ex, t, p, snapshot), target);
867
- const values = read[target];
868
- for (let i = 0; i < n; i++) {
869
- const want = get(i);
870
- const back = writtenAndReadBack(target, i, want, cx, notes);
871
- for (const property of DOT_STYLE_CAPABILITIES[target]) {
872
- const native = values[property]?.[i] ?? null;
873
- const w = want(property);
874
- if (native !== w && native === (back.get(property) ?? null)) {
875
- values[property] ??= new Array(n).fill(null);
876
- values[property][i] = w;
877
- }
878
- }
879
- }
880
- }
881
- }
882
- function writtenAndReadBack(target, i, want, cx, notes) {
883
- const ignore = () => void 0;
884
- const back = /* @__PURE__ */ new Map();
885
- const put = (property, value) => {
886
- if (value !== null) {
887
- back.set(property, value);
888
- }
889
- };
890
- const at = (property) => ({ notes, target, property });
891
- if (target === "node") {
892
- const ncx = cx.node(i);
893
- const attrs = nodeAttributes(want, ncx, ignore, notes);
894
- readNode((name) => textOf(attrs.get(name)), ncx, put, at);
895
- } else {
896
- const ecx = cx.edge(i);
897
- const attrs = edgeAttributes(want, ecx.directed, ignore);
898
- readEdge((name) => textOf(attrs.get(name)), ecx, put, at);
899
- }
900
- return back;
901
- }
902
- function textOf(v) {
903
- return v === void 0 ? null : String(v);
904
- }
905
- function readsBack(col) {
906
- const vals = col.filter((v) => v !== null);
907
- if (vals.every((v) => typeof v === "number")) {
908
- return vals.every((v) => Number.isFinite(v));
909
- }
910
- if (vals.every((v) => typeof v === "boolean")) {
911
- return true;
912
- }
913
- if (vals.every((v) => typeof v === "string")) {
914
- return vals.some((v) => inferTextDtype(v) === "string") && vals.every((v) => isWritableDotText(v));
915
- }
916
- return false;
917
- }
918
- function dotSafeJson(json) {
919
- return json.replaceAll(/\\(["\\])/g, (_m, c) => c === '"' ? String.raw`\u0022` : String.raw`\u005c`);
920
- }
921
- function dotStyledExport(snapshot, input, onMixedDirection) {
922
- if (input === void 0) {
923
- return null;
924
- }
925
- return sharedInExportCall(
926
- input,
927
- [snapshot, onMixedDirection],
928
- () => styledExport(snapshot, input, onMixedDirection)
929
- );
930
- }
931
- function styledExport(snapshot, input, onMixedDirection) {
932
- const approximated = new StyleApproximations();
933
- const replaced = [];
934
- const out = snapshot.withColumns();
935
- const written = onMixedDirection === "directed" || onMixedDirection === "undirected";
936
- const cx = contexts(snapshot, written ? onMixedDirection === "directed" : null);
937
- const notes = new StyleNotes();
938
- for (const target of ["node", "edge"]) {
939
- const table = target === "node" ? out.nodes : out.edges;
940
- const read = dataRead(input.rules.styles.rules, target);
941
- const approximate = (property, value) => {
942
- approximated.add(target, property, value);
943
- };
944
- const columns = attributeColumns(snapshot, input, target, { cx, approximate, notes, read });
945
- replaced.push(...removeStyleAttributes(table, target, columns, read));
946
- setAttributeColumns(table, columns);
947
- }
948
- const { background } = input.rules.styles.graph;
949
- if (out.graph.has("bgcolor")) {
950
- out.graph.remove("bgcolor");
951
- }
952
- if (typeof background === "string" && background !== toolDefaults("graphviz")?.graph.background?.value) {
953
- out.graph.set("bgcolor", [background], { dtype: "string" });
954
- }
955
- const inline = [...input.tags.node.values(), ...input.tags.edge.values()].some((col) => !readsBack(col));
956
- if (!inline) {
957
- setTagColumns(out, input);
958
- }
959
- const block = inline ? writeStyleBlock(input.rules, { inlineColumns: true, snapshot }) : input.block;
960
- out.graph.set(STYLE_BLOCK_NAME, [dotSafeJson(block)], { dtype: "string" });
961
- const losses = approximated.notes("Graphviz");
962
- if (inline) {
963
- losses.push(...styleBlockLosses(block, input.rules.styles.rules.length, "size"));
964
- }
965
- return { snapshot: out, notes: [...replaced, ...losses] };
966
- }
967
- function attributeColumns(snapshot, input, target, w) {
968
- const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
969
- const get = getter((t, p) => input.picture(t, p), target);
970
- const columns = /* @__PURE__ */ new Map();
971
- for (let i = 0; i < n; i++) {
972
- const attrs = target === "node" ? nodeAttributes(get(i), w.cx.node(i), w.approximate, w.notes) : edgeAttributes(get(i), w.cx.edge(i).directed, w.approximate);
973
- if (w.read.has(LABEL_ATTRIBUTE) && attrs.get(LABEL_ATTRIBUTE) === "" && get(i)("label") === null) {
974
- w.approximate("label", "");
975
- }
976
- for (const [name, value] of attrs) {
977
- let col = columns.get(name);
978
- if (col === void 0) {
979
- col = new Array(n).fill(null);
980
- columns.set(name, col);
981
- }
982
- col[i] = value;
983
- }
984
- }
985
- return columns;
986
- }
987
- function removeStyleAttributes(table, target, columns, read) {
988
- const attributes = target === "node" ? NODE_ATTRIBUTES : EDGE_ATTRIBUTES;
989
- const replaced = [];
990
- for (const name of table.names()) {
991
- if (!attributes.includes(name) && name !== LABEL_ATTRIBUTE && !name.startsWith("graphty.style.")) {
992
- continue;
993
- }
994
- const differs = read.has(name) ? replacedRows(table, name, columns.get(name)) : 0;
995
- if (differs > 0) {
996
- replaced.push(
997
- Object.freeze({
998
- code: DOT_ATTRIBUTE_CLASH_CODE,
999
- message: `${target} column "${name}" is not written: the ${name} attribute holds what graphty draws (${String(differs)} ${target}${differs === 1 ? "" : "s"} differ)`,
1000
- column: name,
1001
- count: differs
1002
- })
1003
- );
1004
- }
1005
- table.remove(name);
1006
- }
1007
- return replaced;
1008
- }
1009
- function setAttributeColumns(table, columns) {
1010
- for (const [name, col] of columns) {
1011
- if (name === LABEL_ATTRIBUTE) {
1012
- table.set(name, col, { dtype: "string", role: "label" }, { replaceRole: true });
1013
- } else if (col.every((v) => v === null || typeof v === "number")) {
1014
- table.set(name, col, { dtype: "f64" });
1015
- } else {
1016
- table.set(
1017
- name,
1018
- col.map((v) => v === null ? null : String(v)),
1019
- { dtype: "string" }
1020
- );
1021
- }
1022
- }
1023
- }
1024
- function setTagColumns(out, input) {
1025
- for (const target of ["node", "edge"]) {
1026
- const table = target === "node" ? out.nodes : out.edges;
1027
- for (const [name, col] of input.tags[target]) {
1028
- const kinds = new Set(col.filter((v) => v !== null).map((v) => typeof v));
1029
- let dtype = "string";
1030
- if (kinds.has("number")) {
1031
- dtype = "f64";
1032
- } else if (kinds.has("boolean")) {
1033
- dtype = "bool";
1034
- }
1035
- table.set(name, col, { dtype });
1036
- }
1037
- }
1038
- }
1039
- function dataRead(rules, target) {
1040
- const out = /* @__PURE__ */ new Set();
1041
- for (const { ext: _ext, ...rule } of rules.filter((r) => r.target === target)) {
1042
- JSON.stringify(rule, (_k, v) => {
1043
- if (typeof v === "object" && v !== null && !Array.isArray(v) && Object.keys(v).length === 1) {
1044
- const { data } = v;
1045
- if (typeof data === "string") {
1046
- out.add(data);
1047
- }
1048
- }
1049
- return v;
1050
- });
1051
- }
1052
- return out;
1053
- }
1054
- const DOT_ATTRIBUTE_CLASH_CODE = "W_DOT_ATTRIBUTE_CLASH";
1055
- function replacedRows(table, name, written) {
1056
- const column = table.get(name);
1057
- let n = 0;
1058
- for (let i = 0; column !== null && i < column.length; i++) {
1059
- const cell = column.isSet(i) ? plainCell(column.value(i)) : null;
1060
- const w = written?.[i] ?? null;
1061
- const text = typeof cell === "string" ? cell : JSON.stringify(cell);
1062
- if (cell !== null && (w === null || String(w) !== text)) {
1063
- n++;
1064
- }
1065
- }
1066
- return n;
1067
- }
9
+ import { b as DOT_ATTRIBUTE_CLASH_CODE, c as DOT_FORMAT, d as dotStyledExport, D as DOT_STYLE_CAPABILITIES, C as CLUSTER_COLUMN, P as POS_ATTRIBUTE, K as KEY_ATTRIBUTE, L as LABEL_ATTRIBUTE, R as RANK_COLUMN, a as RANK_SET_COLUMN, e as DOT_META_KEY, i as isHtmlString, f as PARENT_COLUMN, T as TARGET_PORT_COLUMN, S as SOURCE_PORT_COLUMN, h as dotStyles, j as DOT_ORIGIN, k as PIN_ATTRIBUTE, l as POSITION_COLUMN } from "./styles-boK6Ln54.js";
10
+ import { i as importChosenGraph } from "./choose-CczZJaX_.js";
11
+ import { r as readText, b as throwIfAborted, c as canonicalEncoding } from "./input-CAxt_aV-.js";
12
+ import { m as median } from "./convert-Ct2zelbQ.js";
13
+ const RANK_COLUMNS = /* @__PURE__ */ new Set([RANK_COLUMN, RANK_SET_COLUMN]);
1068
14
  const DOT_LOSS = Object.freeze({
1069
15
  /**
1070
16
  * An id, name or text with a backslash before a quote or a line break, or at its end, cannot be written as a DOT
@@ -1447,7 +393,7 @@ class ExportPlan {
1447
393
  */
1448
394
  writesNodeColumn(column) {
1449
395
  const { name, role } = column.meta;
1450
- if (!isTextualDtype(column) || name === CLUSTER_COLUMN) {
396
+ if (!isTextualDtype(column) || name === CLUSTER_COLUMN || RANK_COLUMNS.has(name)) {
1451
397
  return false;
1452
398
  }
1453
399
  if (role !== null && SKIPPED_NODE_ROLES.has(role)) {
@@ -1703,9 +649,39 @@ class ExportPlan {
1703
649
  for (let i = 0; i < snapshot.nodeCount; i++) {
1704
650
  yield* this.writeNode(i, 1, emitted);
1705
651
  }
652
+ yield* this.writeRanks();
1706
653
  yield* this.writeEdges();
1707
654
  yield "}\n";
1708
655
  }
656
+ /**
657
+ * Write each rank subgraph the `graphty.rank` and `graphty.rankSet` columns hold, after the nodes: a named one
658
+ * under its name, an anonymous one (`%<n>`) as an anonymous subgraph.
659
+ * @yields the statements
660
+ * @returns nothing
661
+ */
662
+ *writeRanks() {
663
+ const { nodes } = this.snapshot;
664
+ const rank = nodes.get(RANK_COLUMN);
665
+ const set = nodes.get(RANK_SET_COLUMN);
666
+ if (rank === null || set === null) {
667
+ return;
668
+ }
669
+ const sets = /* @__PURE__ */ new Map();
670
+ for (let i = 0; i < this.snapshot.nodeCount; i++) {
671
+ if (rank.isSet(i) && set.isSet(i)) {
672
+ const key = String(set.value(i));
673
+ const entry = sets.get(key) ?? { rank: String(rank.value(i)), members: [] };
674
+ entry.members.push(writeId(this.idText(i)));
675
+ sets.set(key, entry);
676
+ }
677
+ }
678
+ const order = (key) => key.startsWith("%") ? Number(key.slice(1)) : -1;
679
+ for (const [key, entry] of [...sets].sort(([a], [b]) => order(a) - order(b))) {
680
+ const head = key.startsWith("%") ? "" : `subgraph ${quoteDotId(key)} `;
681
+ yield `${this.indent}${head}{ rank=${quoteDotId(entry.rank)}; ${entry.members.join("; ")}; }
682
+ `;
683
+ }
684
+ }
1709
685
  /**
1710
686
  * Write one node (and, for a container, its cluster block with the members nested).
1711
687
  * @param i - the node index
@@ -2454,8 +1430,13 @@ const DOT_ISSUE = Object.freeze({
2454
1430
  AMBIGUOUS_GRAPH_NAME: AMBIGUOUS_GRAPH_NAME_CODE,
2455
1431
  /** A badly delimited numeral (`1e3`) split into two tokens, as Graphviz does with a warning. */
2456
1432
  NUMERAL_AMBIGUITY: "W_DOT_NUMERAL_AMBIGUITY",
2457
- /** Attributes of a subgraph that is not a cluster (rank=same and the like) cannot be represented. */
1433
+ /**
1434
+ * Attributes of a subgraph that is not a cluster cannot be represented, except its `rank`, which is kept in the
1435
+ * `graphty.rank` and `graphty.rankSet` node columns.
1436
+ */
2458
1437
  SUBGRAPH_ATTRIBUTES_DROPPED: "W_DOT_SUBGRAPH_ATTRIBUTES_DROPPED",
1438
+ /** A node in two rank subgraphs (`rank=same` and the like) keeps the first one's rank. */
1439
+ RANK_CONFLICT: "W_DOT_RANK_CONFLICT",
2459
1440
  /** A port on a node statement has no meaning and was dropped. */
2460
1441
  NODE_PORT_DROPPED: "W_DOT_NODE_PORT_DROPPED",
2461
1442
  /** A plain node and a cluster share a name and were merged into one container node. */
@@ -2533,8 +1514,28 @@ const EXTENSIONS = Object.freeze([".dot", ".gv"]);
2533
1514
  const MIME_TYPES = Object.freeze(["text/vnd.graphviz"]);
2534
1515
  const CLUSTER_PREFIX = "cluster";
2535
1516
  const CLUSTER_ATTRIBUTE = "cluster";
1517
+ const RANK_ATTRIBUTE = "rank";
1518
+ const RANK_KINDS = /* @__PURE__ */ new Set(["same", "min", "max", "source", "sink"]);
2536
1519
  const STATEMENTS_PER_ABORT_CHECK = 64;
2537
1520
  const MAX_ANCESTOR_WALK = 4096;
1521
+ const INHERITED_GRAPH_ATTRIBUTES = /* @__PURE__ */ new Set([
1522
+ "bgcolor",
1523
+ "color",
1524
+ "colorscheme",
1525
+ "fillcolor",
1526
+ "fontcolor",
1527
+ "fontname",
1528
+ "fontsize",
1529
+ "gradientangle",
1530
+ "label",
1531
+ "labeljust",
1532
+ "labelloc",
1533
+ "pencolor",
1534
+ "penwidth",
1535
+ "peripheries",
1536
+ "style",
1537
+ "tooltip"
1538
+ ]);
2538
1539
  const DOT_HEADER = /^\s*(strict\s+)?(di)?graph(?=[\s{"/]|$)(?!\s*\[)/i;
2539
1540
  const TRUE_TEXTS = /* @__PURE__ */ new Set(["true", "yes", "1"]);
2540
1541
  const COMPASS_POINTS = /* @__PURE__ */ new Set(["n", "ne", "e", "se", "s", "sw", "w", "nw", "c", "_"]);
@@ -2824,6 +1825,8 @@ class DotParser {
2824
1825
  this.idOf = /* @__PURE__ */ new Map();
2825
1826
  this.containers = /* @__PURE__ */ new Set();
2826
1827
  this.parentOf = /* @__PURE__ */ new Map();
1828
+ this.inherited = /* @__PURE__ */ new Map();
1829
+ this.ownAttributes = /* @__PURE__ */ new Map();
2827
1830
  this.conflictWarned = /* @__PURE__ */ new Set();
2828
1831
  this.strictEdges = /* @__PURE__ */ new Map();
2829
1832
  this.keyedEdges = /* @__PURE__ */ new Map();
@@ -2835,6 +1838,10 @@ class DotParser {
2835
1838
  this.keyHandle = INVALID_INDEX;
2836
1839
  this.sourcePortHandle = INVALID_INDEX;
2837
1840
  this.targetPortHandle = INVALID_INDEX;
1841
+ this.rankHandle = INVALID_INDEX;
1842
+ this.rankSetHandle = INVALID_INDEX;
1843
+ this.rankSetOf = /* @__PURE__ */ new Map();
1844
+ this.anonymousRanks = 0;
2838
1845
  this.depth = 0;
2839
1846
  this.posDims = 0;
2840
1847
  this.headCharset = void 0;
@@ -2892,6 +1899,7 @@ class DotParser {
2892
1899
  });
2893
1900
  const root = this.newScope(null, headerLine, true, null);
2894
1901
  this.statementList(root);
1902
+ this.applyInherited();
2895
1903
  return lexer.next();
2896
1904
  }
2897
1905
  /**
@@ -2913,6 +1921,7 @@ class DotParser {
2913
1921
  memberSet: /* @__PURE__ */ new Set(),
2914
1922
  containers: [],
2915
1923
  attributes: /* @__PURE__ */ new Map(),
1924
+ graphDefaults: new Map(parent?.graphDefaults),
2916
1925
  cluster: false,
2917
1926
  container: INVALID_INDEX
2918
1927
  };
@@ -3140,42 +2149,10 @@ class DotParser {
3140
2149
  */
3141
2150
  closeScope(scope, parent) {
3142
2151
  const { container } = scope;
3143
- if (container !== INVALID_INDEX) {
3144
- for (const attribute of scope.attributes.values()) {
3145
- if (attribute.name !== CLUSTER_ATTRIBUTE) {
3146
- this.setNodeAttribute(container, attribute.name, attribute.value, attribute.line);
3147
- }
3148
- }
3149
- for (const nested of scope.containers) {
3150
- if (nested !== container && !this.parentOf.has(nested)) {
3151
- this.setParent(nested, container);
3152
- }
3153
- }
3154
- for (const member of scope.members) {
3155
- if (member === container) {
3156
- continue;
3157
- }
3158
- const existing = this.parentOf.get(member);
3159
- if (existing === void 0) {
3160
- this.setParent(member, container);
3161
- } else if (existing !== container && !this.isAncestor(container, existing)) {
3162
- this.clusterConflict(member, existing, container, scope.line);
3163
- }
3164
- }
3165
- parent.containers.push(container);
2152
+ if (container === INVALID_INDEX) {
2153
+ this.closePlainSubgraph(scope, parent);
3166
2154
  } else {
3167
- if (scope.attributes.size > 0) {
3168
- const names = [...scope.attributes.keys()].join(", ");
3169
- this.report.warning(
3170
- "unsupported",
3171
- DOT_ISSUE.SUBGRAPH_ATTRIBUTES_DROPPED,
3172
- `subgraph ${scope.name === null ? "(anonymous)" : JSON.stringify(scope.name)} is not a cluster; its attributes (${names}) cannot be represented and were dropped`,
3173
- { line: scope.line, element: scope.name }
3174
- );
3175
- }
3176
- for (const nested of scope.containers) {
3177
- parent.containers.push(nested);
3178
- }
2155
+ this.closeCluster(scope, parent, container);
3179
2156
  }
3180
2157
  if (!parent.root) {
3181
2158
  for (const member of scope.members) {
@@ -3186,6 +2163,84 @@ class DotParser {
3186
2163
  }
3187
2164
  }
3188
2165
  }
2166
+ /**
2167
+ * Finish a cluster: apply its attributes to its container node, assign parents to its nested
2168
+ * containers and its members, and hand the container to the enclosing scope.
2169
+ * @param scope - the closed scope
2170
+ * @param parent - the enclosing scope
2171
+ * @param container - the cluster's container node
2172
+ */
2173
+ closeCluster(scope, parent, container) {
2174
+ const own = this.ownAttributes.get(container) ?? /* @__PURE__ */ new Set();
2175
+ this.ownAttributes.set(container, own);
2176
+ for (const attribute of scope.attributes.values()) {
2177
+ if (attribute.name !== CLUSTER_ATTRIBUTE) {
2178
+ own.add(attribute.name);
2179
+ this.setNodeAttribute(container, attribute.name, attribute.value, attribute.line);
2180
+ }
2181
+ }
2182
+ for (const nested of scope.containers) {
2183
+ if (nested !== container && !this.parentOf.has(nested)) {
2184
+ this.setParent(nested, container);
2185
+ }
2186
+ }
2187
+ for (const member of scope.members) {
2188
+ if (member !== container) {
2189
+ this.adoptMember(member, container, scope.line);
2190
+ }
2191
+ }
2192
+ parent.containers.push(container);
2193
+ }
2194
+ /**
2195
+ * Put a cluster's member in it, unless it is already in another cluster this one is not inside.
2196
+ * @param member - the member node
2197
+ * @param container - the cluster's container node
2198
+ * @param line - the cluster's line
2199
+ */
2200
+ adoptMember(member, container, line) {
2201
+ const existing = this.parentOf.get(member);
2202
+ if (existing === void 0) {
2203
+ this.setParent(member, container);
2204
+ } else if (existing !== container && !this.isAncestor(container, existing)) {
2205
+ this.clusterConflict(member, existing, container, line);
2206
+ }
2207
+ }
2208
+ /**
2209
+ * Finish a subgraph that is not a cluster: keep its rank, report its other attributes dropped, and hand its nested
2210
+ * containers to the enclosing scope.
2211
+ * @param scope - the closed scope
2212
+ * @param parent - the enclosing scope
2213
+ */
2214
+ closePlainSubgraph(scope, parent) {
2215
+ const ranked = this.recordRank(scope);
2216
+ const dropped = [...scope.attributes.keys()].filter((name) => !(ranked && name === RANK_ATTRIBUTE));
2217
+ if (dropped.length > 0) {
2218
+ const names = dropped.join(", ");
2219
+ this.report.warning(
2220
+ "unsupported",
2221
+ DOT_ISSUE.SUBGRAPH_ATTRIBUTES_DROPPED,
2222
+ `subgraph ${scope.name === null ? "(anonymous)" : JSON.stringify(scope.name)} is not a cluster; its attributes (${names}) cannot be represented and were dropped`,
2223
+ { line: scope.line, element: scope.name }
2224
+ );
2225
+ }
2226
+ for (const nested of scope.containers) {
2227
+ parent.containers.push(nested);
2228
+ }
2229
+ }
2230
+ /**
2231
+ * Give every cluster the drawing attributes it inherits and does not set itself (Graphviz's subgraph attribute
2232
+ * inheritance), once the whole graph is read: a cluster reopened later can still set its own.
2233
+ */
2234
+ applyInherited() {
2235
+ for (const [container, attributes] of this.inherited) {
2236
+ const own = this.ownAttributes.get(container);
2237
+ for (const attribute of attributes.values()) {
2238
+ if (own?.has(attribute.name) !== true) {
2239
+ this.setNodeAttribute(container, attribute.name, attribute.value, attribute.line);
2240
+ }
2241
+ }
2242
+ }
2243
+ }
3189
2244
  /**
3190
2245
  * Whether `candidate` is an ancestor of `node` through the parents assigned so far.
3191
2246
  * @param candidate - the possible ancestor
@@ -3267,6 +2322,7 @@ class DotParser {
3267
2322
  if (!this.containers.has(index)) {
3268
2323
  this.containers.add(index);
3269
2324
  this.sink.setNodeValue(this.clusterColumn(), index, true);
2325
+ this.inherited.set(index, new Map(scope.graphDefaults));
3270
2326
  }
3271
2327
  scope.container = index;
3272
2328
  } catch (err) {
@@ -3283,6 +2339,9 @@ class DotParser {
3283
2339
  * @param attribute - the attribute
3284
2340
  */
3285
2341
  scopeAttribute(scope, attribute) {
2342
+ if (INHERITED_GRAPH_ATTRIBUTES.has(attribute.name)) {
2343
+ scope.graphDefaults.set(attribute.name, attribute);
2344
+ }
3286
2345
  if (scope.root) {
3287
2346
  this.setGraphAttribute(attribute);
3288
2347
  return;
@@ -3876,6 +2935,52 @@ class DotParser {
3876
2935
  }
3877
2936
  return this.positionHandle;
3878
2937
  }
2938
+ /**
2939
+ * Keep a non-cluster subgraph's `rank` on its nodes: each gets the rank and the subgraph's name (`%<n>` for an
2940
+ * anonymous one). A node already in another rank subgraph keeps that one, with a warning.
2941
+ * @param scope - the closed subgraph
2942
+ * @returns true when the subgraph has a rank Graphviz knows
2943
+ */
2944
+ recordRank(scope) {
2945
+ const rank = scope.attributes.get(RANK_ATTRIBUTE)?.value.trim();
2946
+ if (rank === void 0 || !RANK_KINDS.has(rank)) {
2947
+ return false;
2948
+ }
2949
+ const set = scope.name ?? `%${this.anonymousRanks++}`;
2950
+ for (const member of scope.members) {
2951
+ const held = this.rankSetOf.get(member);
2952
+ const id = String(this.idOf.get(member) ?? member);
2953
+ if (held === void 0) {
2954
+ this.rankSetOf.set(member, set);
2955
+ try {
2956
+ this.sink.setNodeValue(this.stringColumn("rankHandle", RANK_COLUMN), member, rank);
2957
+ this.sink.setNodeValue(this.stringColumn("rankSetHandle", RANK_SET_COLUMN), member, set);
2958
+ } catch (err) {
2959
+ this.report.recordError(err, { element: id });
2960
+ }
2961
+ } else if (held !== set) {
2962
+ this.report.warning(
2963
+ "coercion",
2964
+ DOT_ISSUE.RANK_CONFLICT,
2965
+ `node ${JSON.stringify(id)} is in rank subgraph ${JSON.stringify(held)} and in rank subgraph ${JSON.stringify(set)}; the first is kept`,
2966
+ { line: scope.line, element: id }
2967
+ );
2968
+ }
2969
+ }
2970
+ return true;
2971
+ }
2972
+ /**
2973
+ * One of the importer's string node columns, declared on first use.
2974
+ * @param field - the field holding its handle
2975
+ * @param name - the column name
2976
+ * @returns the handle
2977
+ */
2978
+ stringColumn(field, name) {
2979
+ if (this[field] === INVALID_INDEX) {
2980
+ this[field] = this.declare("node", { name, dtype: "string", nullable: true, origin: DOT_ORIGIN });
2981
+ }
2982
+ return this[field];
2983
+ }
3879
2984
  /**
3880
2985
  * The cluster marker column (bool).
3881
2986
  * @returns the handle
@@ -3989,8 +3094,7 @@ class DotParser {
3989
3094
  export {
3990
3095
  DOT_ISSUE as D,
3991
3096
  DOT_LOSS as a,
3992
- DOT_STYLE_CAPABILITIES as b,
3993
- dotImporter as c,
3097
+ dotImporter as b,
3994
3098
  dotExporter as d
3995
3099
  };
3996
- //# sourceMappingURL=importer-CB_zV5_L.js.map
3100
+ //# sourceMappingURL=importer-ClCsdgTJ.js.map