@graphty/graph-io 0.3.48 → 0.3.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (600) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
  3. package/dist/chunks/bends-BGXjv_U4.js +129 -0
  4. package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
  5. package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
  6. package/dist/chunks/block-yl0f_qLO.js.map +1 -0
  7. package/dist/chunks/choose-CczZJaX_.js +717 -0
  8. package/dist/chunks/choose-CczZJaX_.js.map +1 -0
  9. package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
  18. package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
  24. package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
  26. package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
  32. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
  33. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
  34. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
  35. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  36. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
  39. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
  40. package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
  44. package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
  45. package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
  46. package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
  47. package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
  48. package/dist/chunks/importer-CKFe4q54.js.map +1 -0
  49. package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
  50. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
  51. package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
  52. package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
  53. package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
  54. package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
  55. package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
  56. package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
  57. package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
  58. package/dist/chunks/importer-asFUrIsj.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
  64. package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
  72. package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
  74. package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
  76. package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
  77. package/dist/chunks/styles-CPczw1Jz.js +1928 -0
  78. package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
  79. package/dist/chunks/styles-boK6Ln54.js +2847 -0
  80. package/dist/chunks/styles-boK6Ln54.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
  82. package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +8 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +848 -194
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +230 -193
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +141 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +32 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +439 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  137. package/dist/src/formats/dot/exporter.js +34 -2
  138. package/dist/src/formats/dot/exporter.js.map +1 -1
  139. package/dist/src/formats/dot/importer.d.ts +6 -1
  140. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  141. package/dist/src/formats/dot/importer.js +170 -33
  142. package/dist/src/formats/dot/importer.js.map +1 -1
  143. package/dist/src/formats/dot/index.d.ts +3 -1
  144. package/dist/src/formats/dot/index.d.ts.map +1 -1
  145. package/dist/src/formats/dot/index.js +2 -1
  146. package/dist/src/formats/dot/index.js.map +1 -1
  147. package/dist/src/formats/dot/label-places.d.ts +41 -0
  148. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  149. package/dist/src/formats/dot/label-places.js +185 -0
  150. package/dist/src/formats/dot/label-places.js.map +1 -0
  151. package/dist/src/formats/dot/names.d.ts +13 -0
  152. package/dist/src/formats/dot/names.d.ts.map +1 -1
  153. package/dist/src/formats/dot/names.js +13 -0
  154. package/dist/src/formats/dot/names.js.map +1 -1
  155. package/dist/src/formats/dot/record.d.ts +50 -0
  156. package/dist/src/formats/dot/record.d.ts.map +1 -0
  157. package/dist/src/formats/dot/record.js +275 -0
  158. package/dist/src/formats/dot/record.js.map +1 -0
  159. package/dist/src/formats/dot/styles.d.ts +72 -2
  160. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  161. package/dist/src/formats/dot/styles.js +1500 -119
  162. package/dist/src/formats/dot/styles.js.map +1 -1
  163. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  165. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  167. package/dist/src/formats/gexf/importer.d.ts +7 -0
  168. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  169. package/dist/src/formats/gexf/importer.js +41 -5
  170. package/dist/src/formats/gexf/importer.js.map +1 -1
  171. package/dist/src/formats/gexf/preview.d.ts +77 -0
  172. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  173. package/dist/src/formats/gexf/preview.js +191 -0
  174. package/dist/src/formats/gexf/preview.js.map +1 -0
  175. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  176. package/dist/src/formats/gexf/schema.js +2 -1
  177. package/dist/src/formats/gexf/schema.js.map +1 -1
  178. package/dist/src/formats/gexf/styles.d.ts +58 -31
  179. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  180. package/dist/src/formats/gexf/styles.js +848 -225
  181. package/dist/src/formats/gexf/styles.js.map +1 -1
  182. package/dist/src/formats/gml/importer.d.ts +5 -2
  183. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  184. package/dist/src/formats/gml/importer.js +258 -71
  185. package/dist/src/formats/gml/importer.js.map +1 -1
  186. package/dist/src/formats/gml/index.d.ts +1 -1
  187. package/dist/src/formats/gml/index.d.ts.map +1 -1
  188. package/dist/src/formats/gml/index.js +1 -1
  189. package/dist/src/formats/gml/index.js.map +1 -1
  190. package/dist/src/formats/gml/positions.d.ts +7 -0
  191. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  192. package/dist/src/formats/gml/positions.js +29 -7
  193. package/dist/src/formats/gml/positions.js.map +1 -1
  194. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  195. package/dist/src/formats/gml/styles.js +754 -102
  196. package/dist/src/formats/gml/styles.js.map +1 -1
  197. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.js +6 -10
  199. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  200. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  201. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  202. package/dist/src/formats/graphml/styles-yed.js +695 -164
  203. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  204. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
  207. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  208. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  209. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  210. package/dist/src/formats/graphml/yfiles.js +16 -6
  211. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  212. package/dist/src/formats/json/dialect.d.ts +3 -2
  213. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  214. package/dist/src/formats/json/dialect.js +39 -5
  215. package/dist/src/formats/json/dialect.js.map +1 -1
  216. package/dist/src/formats/json/importer.d.ts +13 -2
  217. package/dist/src/formats/json/importer.d.ts.map +1 -1
  218. package/dist/src/formats/json/importer.js +42 -6
  219. package/dist/src/formats/json/importer.js.map +1 -1
  220. package/dist/src/formats/json/index.d.ts +1 -1
  221. package/dist/src/formats/json/index.d.ts.map +1 -1
  222. package/dist/src/formats/json/index.js +1 -1
  223. package/dist/src/formats/json/index.js.map +1 -1
  224. package/dist/src/formats/json/positions.d.ts +5 -2
  225. package/dist/src/formats/json/positions.d.ts.map +1 -1
  226. package/dist/src/formats/json/positions.js +20 -4
  227. package/dist/src/formats/json/positions.js.map +1 -1
  228. package/dist/src/formats/json/styles.d.ts +12 -1
  229. package/dist/src/formats/json/styles.d.ts.map +1 -1
  230. package/dist/src/formats/json/styles.js +1843 -136
  231. package/dist/src/formats/json/styles.js.map +1 -1
  232. package/dist/src/formats/pajek/draw.d.ts +104 -0
  233. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  234. package/dist/src/formats/pajek/draw.js +382 -0
  235. package/dist/src/formats/pajek/draw.js.map +1 -0
  236. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  237. package/dist/src/formats/pajek/exporter.js +70 -51
  238. package/dist/src/formats/pajek/exporter.js.map +1 -1
  239. package/dist/src/formats/pajek/importer.d.ts +9 -0
  240. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  241. package/dist/src/formats/pajek/importer.js +233 -102
  242. package/dist/src/formats/pajek/importer.js.map +1 -1
  243. package/dist/src/formats/pajek/index.d.ts +1 -0
  244. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  245. package/dist/src/formats/pajek/index.js.map +1 -1
  246. package/dist/src/formats/pajek/styles.d.ts +15 -7
  247. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  248. package/dist/src/formats/pajek/styles.js +1395 -114
  249. package/dist/src/formats/pajek/styles.js.map +1 -1
  250. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  251. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  252. package/dist/src/formats/pajek/syntax.js +26 -2
  253. package/dist/src/formats/pajek/syntax.js.map +1 -1
  254. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  255. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  256. package/dist/src/formats/xgmml/emit.js +65 -5
  257. package/dist/src/formats/xgmml/emit.js.map +1 -1
  258. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  259. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  260. package/dist/src/formats/xgmml/styles.js +277 -60
  261. package/dist/src/formats/xgmml/styles.js.map +1 -1
  262. package/dist/src/index.d.ts +6 -5
  263. package/dist/src/index.d.ts.map +1 -1
  264. package/dist/src/index.js +6 -5
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/positions/convert.d.ts.map +1 -1
  267. package/dist/src/positions/convert.js +11 -1
  268. package/dist/src/positions/convert.js.map +1 -1
  269. package/dist/src/positions/extract.d.ts.map +1 -1
  270. package/dist/src/positions/extract.js +53 -1
  271. package/dist/src/positions/extract.js.map +1 -1
  272. package/dist/src/positions/index.d.ts +1 -1
  273. package/dist/src/positions/index.d.ts.map +1 -1
  274. package/dist/src/positions/types.d.ts +59 -0
  275. package/dist/src/positions/types.d.ts.map +1 -1
  276. package/dist/src/sources/builtins.d.ts +1 -1
  277. package/dist/src/sources/builtins.d.ts.map +1 -1
  278. package/dist/src/sources/builtins.js +8 -2
  279. package/dist/src/sources/builtins.js.map +1 -1
  280. package/dist/src/sources/context.d.ts.map +1 -1
  281. package/dist/src/sources/context.js +1 -0
  282. package/dist/src/sources/context.js.map +1 -1
  283. package/dist/src/sources/credentials.d.ts +50 -1
  284. package/dist/src/sources/credentials.d.ts.map +1 -1
  285. package/dist/src/sources/credentials.js +69 -0
  286. package/dist/src/sources/credentials.js.map +1 -1
  287. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  288. package/dist/src/sources/cypher/descriptor.js +5 -0
  289. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  290. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  291. package/dist/src/sources/cypher/index.js +125 -18
  292. package/dist/src/sources/cypher/index.js.map +1 -1
  293. package/dist/src/sources/cypher/params.d.ts +1 -1
  294. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  295. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  296. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  297. package/dist/src/sources/cypher/query-builder.js +31 -0
  298. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  299. package/dist/src/sources/ids.d.ts +5 -0
  300. package/dist/src/sources/ids.d.ts.map +1 -1
  301. package/dist/src/sources/ids.js +5 -0
  302. package/dist/src/sources/ids.js.map +1 -1
  303. package/dist/src/sources/params.d.ts +3 -0
  304. package/dist/src/sources/params.d.ts.map +1 -1
  305. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  306. package/dist/src/sources/rest/descriptor.js +9 -0
  307. package/dist/src/sources/rest/descriptor.js.map +1 -1
  308. package/dist/src/sources/rest/openalex.d.ts +4 -2
  309. package/dist/src/sources/rest/openalex.d.ts.map +1 -1
  310. package/dist/src/sources/rest/openalex.js +4 -2
  311. package/dist/src/sources/rest/openalex.js.map +1 -1
  312. package/dist/src/sources/rest/source.d.ts.map +1 -1
  313. package/dist/src/sources/rest/source.js +38 -0
  314. package/dist/src/sources/rest/source.js.map +1 -1
  315. package/dist/src/sources/run.d.ts +2 -0
  316. package/dist/src/sources/run.d.ts.map +1 -1
  317. package/dist/src/sources/run.js +30 -3
  318. package/dist/src/sources/run.js.map +1 -1
  319. package/dist/src/sources/sigv4.d.ts +5 -3
  320. package/dist/src/sources/sigv4.d.ts.map +1 -1
  321. package/dist/src/sources/sigv4.js +6 -4
  322. package/dist/src/sources/sigv4.js.map +1 -1
  323. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  324. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  325. package/dist/src/sources/sparql/descriptor.js +64 -0
  326. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  327. package/dist/src/sources/sparql/index.d.ts +28 -0
  328. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  329. package/dist/src/sources/sparql/index.js +327 -0
  330. package/dist/src/sources/sparql/index.js.map +1 -0
  331. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  332. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  333. package/dist/src/sources/sparql/ntriples.js +180 -0
  334. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  335. package/dist/src/sources/sparql/params.d.ts +27 -0
  336. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  337. package/dist/src/sources/sparql/params.js +5 -0
  338. package/dist/src/sources/sparql/params.js.map +1 -0
  339. package/dist/src/sources/sparql/query.d.ts +73 -0
  340. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  341. package/dist/src/sources/sparql/query.js +164 -0
  342. package/dist/src/sources/sparql/query.js.map +1 -0
  343. package/dist/src/sources/types.d.ts +60 -0
  344. package/dist/src/sources/types.d.ts.map +1 -1
  345. package/dist/src/styles/annotations.d.ts +61 -5
  346. package/dist/src/styles/annotations.d.ts.map +1 -1
  347. package/dist/src/styles/annotations.js +130 -22
  348. package/dist/src/styles/annotations.js.map +1 -1
  349. package/dist/src/styles/canon/bends.d.ts +46 -0
  350. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  351. package/dist/src/styles/canon/bends.js +123 -0
  352. package/dist/src/styles/canon/bends.js.map +1 -1
  353. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  354. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  355. package/dist/src/styles/canon/color-tables.js +10 -4
  356. package/dist/src/styles/canon/color-tables.js.map +1 -1
  357. package/dist/src/styles/canon/color.d.ts +3 -1
  358. package/dist/src/styles/canon/color.d.ts.map +1 -1
  359. package/dist/src/styles/canon/color.js +103 -3
  360. package/dist/src/styles/canon/color.js.map +1 -1
  361. package/dist/src/styles/canon/enums.d.ts +2 -2
  362. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  363. package/dist/src/styles/canon/enums.js +89 -7
  364. package/dist/src/styles/canon/enums.js.map +1 -1
  365. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  366. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  367. package/dist/src/styles/canon/graphviz.js +57 -9
  368. package/dist/src/styles/canon/graphviz.js.map +1 -1
  369. package/dist/src/styles/canon/number.d.ts +8 -0
  370. package/dist/src/styles/canon/number.d.ts.map +1 -1
  371. package/dist/src/styles/canon/number.js +18 -0
  372. package/dist/src/styles/canon/number.js.map +1 -1
  373. package/dist/src/styles/canon/text.d.ts +29 -2
  374. package/dist/src/styles/canon/text.d.ts.map +1 -1
  375. package/dist/src/styles/canon/text.js +156 -16
  376. package/dist/src/styles/canon/text.js.map +1 -1
  377. package/dist/src/styles/codes.d.ts +2 -0
  378. package/dist/src/styles/codes.d.ts.map +1 -1
  379. package/dist/src/styles/codes.js +2 -0
  380. package/dist/src/styles/codes.js.map +1 -1
  381. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  382. package/dist/src/styles/cyjs/cascade.js +1139 -79
  383. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  384. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  385. package/dist/src/styles/cyjs/defaults-table.js +4 -0
  386. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  387. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  388. package/dist/src/styles/cyjs/emit.js +232 -10
  389. package/dist/src/styles/cyjs/emit.js.map +1 -1
  390. package/dist/src/styles/cyjs/face.d.ts +20 -0
  391. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  392. package/dist/src/styles/cyjs/face.js +332 -0
  393. package/dist/src/styles/cyjs/face.js.map +1 -0
  394. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  395. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  396. package/dist/src/styles/cyjs/mappers.js +475 -26
  397. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  398. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  399. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  400. package/dist/src/styles/cyjs/routes.js +360 -0
  401. package/dist/src/styles/cyjs/routes.js.map +1 -0
  402. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  403. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  404. package/dist/src/styles/cytoscape/charts.js +560 -0
  405. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  406. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  407. package/dist/src/styles/cytoscape/emit.js +156 -48
  408. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  409. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  410. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  411. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  412. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  413. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  414. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  415. package/dist/src/styles/cytoscape/mappings.js +92 -0
  416. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  417. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  418. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  419. package/dist/src/styles/cytoscape/resolve.js +623 -17
  420. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  421. package/dist/src/styles/defaults.d.ts +46 -26
  422. package/dist/src/styles/defaults.d.ts.map +1 -1
  423. package/dist/src/styles/defaults.js +308 -71
  424. package/dist/src/styles/defaults.js.map +1 -1
  425. package/dist/src/styles/index.d.ts +4 -3
  426. package/dist/src/styles/index.d.ts.map +1 -1
  427. package/dist/src/styles/index.js +3 -2
  428. package/dist/src/styles/index.js.map +1 -1
  429. package/dist/src/styles/internal.d.ts +1 -0
  430. package/dist/src/styles/internal.d.ts.map +1 -1
  431. package/dist/src/styles/internal.js +1 -0
  432. package/dist/src/styles/internal.js.map +1 -1
  433. package/dist/src/styles/io/generic.d.ts.map +1 -1
  434. package/dist/src/styles/io/generic.js +56 -16
  435. package/dist/src/styles/io/generic.js.map +1 -1
  436. package/dist/src/styles/io/round-trip.d.ts +56 -0
  437. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  438. package/dist/src/styles/io/round-trip.js +138 -0
  439. package/dist/src/styles/io/round-trip.js.map +1 -0
  440. package/dist/src/styles/io/writer.d.ts.map +1 -1
  441. package/dist/src/styles/io/writer.js +6 -1
  442. package/dist/src/styles/io/writer.js.map +1 -1
  443. package/dist/src/styles/notes.d.ts.map +1 -1
  444. package/dist/src/styles/notes.js +1 -0
  445. package/dist/src/styles/notes.js.map +1 -1
  446. package/dist/src/styles/plan/features.d.ts +1 -1
  447. package/dist/src/styles/plan/features.d.ts.map +1 -1
  448. package/dist/src/styles/plan/features.js +22 -2
  449. package/dist/src/styles/plan/features.js.map +1 -1
  450. package/dist/src/styles/plan/index.d.ts +1 -1
  451. package/dist/src/styles/plan/index.d.ts.map +1 -1
  452. package/dist/src/styles/plan/index.js +1 -1
  453. package/dist/src/styles/plan/index.js.map +1 -1
  454. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  455. package/dist/src/styles/plan/plan.js +61 -4
  456. package/dist/src/styles/plan/plan.js.map +1 -1
  457. package/dist/src/styles/plan/resolve.d.ts +11 -0
  458. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  459. package/dist/src/styles/plan/resolve.js +40 -4
  460. package/dist/src/styles/plan/resolve.js.map +1 -1
  461. package/dist/src/styles/slots.d.ts +14 -0
  462. package/dist/src/styles/slots.d.ts.map +1 -0
  463. package/dist/src/styles/slots.js +20 -0
  464. package/dist/src/styles/slots.js.map +1 -0
  465. package/dist/src/styles/types.d.ts +687 -6
  466. package/dist/src/styles/types.d.ts.map +1 -1
  467. package/dist/src/styles/vocabulary.d.ts +3 -2
  468. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  469. package/dist/src/styles/vocabulary.js +224 -0
  470. package/dist/src/styles/vocabulary.js.map +1 -1
  471. package/dist/styles.js +30 -239
  472. package/dist/styles.js.map +1 -1
  473. package/dist/xgmml.js +3 -3
  474. package/package.json +27 -7
  475. package/src/formats/cx/importer.ts +6 -1
  476. package/src/formats/cx/styles.ts +143 -9
  477. package/src/formats/cx2/importer.ts +1 -0
  478. package/src/formats/cx2/styles.ts +3 -1
  479. package/src/formats/cys/importer.ts +1 -0
  480. package/src/formats/cys/styles.ts +27 -5
  481. package/src/formats/dot/drawing.ts +799 -0
  482. package/src/formats/dot/exporter.ts +37 -1
  483. package/src/formats/dot/importer.ts +192 -36
  484. package/src/formats/dot/index.ts +3 -1
  485. package/src/formats/dot/label-places.ts +241 -0
  486. package/src/formats/dot/names.ts +15 -0
  487. package/src/formats/dot/record.ts +336 -0
  488. package/src/formats/dot/styles.ts +1702 -149
  489. package/src/formats/gexf/dialog-metrics.ts +61 -0
  490. package/src/formats/gexf/importer.ts +50 -5
  491. package/src/formats/gexf/preview.ts +217 -0
  492. package/src/formats/gexf/schema.ts +2 -1
  493. package/src/formats/gexf/styles.ts +1099 -245
  494. package/src/formats/gml/importer.ts +291 -76
  495. package/src/formats/gml/index.ts +1 -1
  496. package/src/formats/gml/positions.ts +29 -7
  497. package/src/formats/gml/styles.ts +852 -110
  498. package/src/formats/graphml/styles-plain.ts +6 -15
  499. package/src/formats/graphml/styles-yed.ts +765 -176
  500. package/src/formats/graphml/styles-yfiles3.ts +487 -63
  501. package/src/formats/graphml/yfiles.ts +19 -6
  502. package/src/formats/json/dialect.ts +41 -5
  503. package/src/formats/json/importer.ts +59 -7
  504. package/src/formats/json/index.ts +1 -0
  505. package/src/formats/json/positions.ts +22 -5
  506. package/src/formats/json/styles.ts +2123 -171
  507. package/src/formats/pajek/draw.ts +469 -0
  508. package/src/formats/pajek/exporter.ts +81 -49
  509. package/src/formats/pajek/importer.ts +278 -103
  510. package/src/formats/pajek/index.ts +1 -0
  511. package/src/formats/pajek/styles.ts +1506 -133
  512. package/src/formats/pajek/syntax.ts +27 -2
  513. package/src/formats/xgmml/emit.ts +73 -5
  514. package/src/formats/xgmml/styles.ts +330 -71
  515. package/src/index.ts +12 -1
  516. package/src/positions/convert.ts +12 -1
  517. package/src/positions/extract.ts +55 -1
  518. package/src/positions/index.ts +1 -0
  519. package/src/positions/types.ts +60 -0
  520. package/src/sources/builtins.ts +8 -1
  521. package/src/sources/context.ts +1 -0
  522. package/src/sources/credentials.ts +90 -1
  523. package/src/sources/cypher/descriptor.ts +7 -1
  524. package/src/sources/cypher/index.ts +149 -18
  525. package/src/sources/cypher/params.ts +1 -1
  526. package/src/sources/cypher/query-builder.ts +33 -0
  527. package/src/sources/ids.ts +6 -0
  528. package/src/sources/params.ts +3 -0
  529. package/src/sources/rest/descriptor.ts +9 -0
  530. package/src/sources/rest/openalex.ts +4 -2
  531. package/src/sources/rest/source.ts +41 -0
  532. package/src/sources/run.ts +35 -3
  533. package/src/sources/sigv4.ts +6 -4
  534. package/src/sources/sparql/descriptor.ts +67 -0
  535. package/src/sources/sparql/index.ts +371 -0
  536. package/src/sources/sparql/ntriples.ts +219 -0
  537. package/src/sources/sparql/params.ts +28 -0
  538. package/src/sources/sparql/query.ts +216 -0
  539. package/src/sources/types.ts +68 -0
  540. package/src/styles/annotations.ts +201 -27
  541. package/src/styles/canon/bends.ts +137 -0
  542. package/src/styles/canon/color-tables.ts +10 -4
  543. package/src/styles/canon/color.ts +105 -3
  544. package/src/styles/canon/enums.ts +107 -8
  545. package/src/styles/canon/graphviz.ts +71 -10
  546. package/src/styles/canon/number.ts +19 -0
  547. package/src/styles/canon/text.ts +187 -16
  548. package/src/styles/codes.ts +2 -0
  549. package/src/styles/cyjs/cascade.ts +1303 -84
  550. package/src/styles/cyjs/defaults-table.ts +4 -0
  551. package/src/styles/cyjs/emit.ts +268 -14
  552. package/src/styles/cyjs/face.ts +372 -0
  553. package/src/styles/cyjs/mappers.ts +506 -27
  554. package/src/styles/cyjs/routes.ts +432 -0
  555. package/src/styles/cytoscape/charts.ts +684 -0
  556. package/src/styles/cytoscape/emit.ts +170 -48
  557. package/src/styles/cytoscape/lexicon.ts +431 -78
  558. package/src/styles/cytoscape/mappings.ts +108 -0
  559. package/src/styles/cytoscape/resolve.ts +741 -17
  560. package/src/styles/defaults.ts +417 -108
  561. package/src/styles/index.ts +5 -0
  562. package/src/styles/internal.ts +1 -0
  563. package/src/styles/io/generic.ts +79 -23
  564. package/src/styles/io/round-trip.ts +202 -0
  565. package/src/styles/io/writer.ts +6 -1
  566. package/src/styles/notes.ts +1 -0
  567. package/src/styles/plan/features.ts +23 -2
  568. package/src/styles/plan/index.ts +1 -1
  569. package/src/styles/plan/plan.ts +69 -5
  570. package/src/styles/plan/resolve.ts +47 -4
  571. package/src/styles/slots.ts +25 -0
  572. package/src/styles/types.ts +698 -5
  573. package/src/styles/vocabulary.ts +232 -2
  574. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  575. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  576. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  577. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  578. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  579. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  580. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  581. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  582. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  583. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  584. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  585. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  586. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  587. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  588. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  589. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  590. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  591. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  592. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  593. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  594. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  595. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  596. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  597. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  598. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  599. package/dist/chunks/writer-DvHTl36J.js +0 -449
  600. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -0,0 +1,684 @@
1
+ /**
2
+ * Cytoscape desktop's charts (`NODE_CUSTOMGRAPHICS_1` .. `_9` holding `org.cytoscape.PieChart:{...}`,
3
+ * `org.cytoscape.RingChart:{...}`, `BarChart`, `LineChart`, `BoxChart` or `HeatMapChart`), read per node from the
4
+ * node's own data as the neutral `pie*` properties (pie and ring) and `chart*` properties (the others)
5
+ * (https://manual.cytoscape.org/en/stable/Styles.html#using-graphics-in-styles).
6
+ *
7
+ * As Cytoscape 3.10.5 draws them (measured from its own SVG export): each slice is its data column's share of the
8
+ * node's values, the slices run counter-clockwise from `cy_startAngle` degrees counter-clockwise from 3 o'clock,
9
+ * the disc is 0.9 of the node across (of `NODE_CUSTOMGRAPHICS_SIZE_<slot>` with `nodeCustomGraphicsSizeSync` off),
10
+ * and a ring's hole is `cy_holeSize` (default 0.4) of its radius. The same pie
11
+ * drawn clockwise is its slices in reverse order from where the last one ends.
12
+ */
13
+
14
+ import { num6 } from "../canon/number.js";
15
+ import type { StyleColumn, StyleValue } from "../types.js";
16
+
17
+ /** How far across the node Cytoscape draws a pie, measured from its SVG export. */
18
+ const CHART_ACROSS = 0.9;
19
+
20
+ /** A ring chart's hole when its options name none (Cytoscape's `RingChart` default). */
21
+ const RING_HOLE = 0.4;
22
+
23
+ /** The custom graphics slots, in the order Cytoscape stacks them. */
24
+ const SLOTS = Array.from({ length: 9 }, (_, k) => `NODE_CUSTOMGRAPHICS_${String(k + 1)}`);
25
+
26
+ /** A chart's options as Cytoscape writes them. */
27
+ interface ChartOptions {
28
+ readonly cy_colors?: unknown;
29
+ readonly cy_dataColumns?: unknown;
30
+ readonly cy_startAngle?: unknown;
31
+ readonly cy_holeSize?: unknown;
32
+ readonly cy_range?: unknown;
33
+ readonly cy_globalRange?: unknown;
34
+ readonly cy_type?: unknown;
35
+ readonly cy_orientation?: unknown;
36
+ readonly cy_separation?: unknown;
37
+ readonly cy_borderWidth?: unknown;
38
+ readonly cy_borderColor?: unknown;
39
+ readonly cy_lineWidth?: unknown;
40
+ readonly cy_showItemLabels?: unknown;
41
+ readonly cy_itemLabels?: unknown;
42
+ readonly cy_itemLabelsColumn?: unknown;
43
+ readonly cy_itemLabelFontSize?: unknown;
44
+ }
45
+
46
+ /** The charts Cytoscape draws, by the name of their class. */
47
+ type ChartKind = "PieChart" | "RingChart" | "BarChart" | "LineChart" | "BoxChart" | "HeatMapChart";
48
+
49
+ /** A Cytoscape chart class name, without its package. */
50
+ const CHART_CLASS = /^org\.cytoscape\.(PieChart|RingChart|BarChart|LineChart|BoxChart|HeatMapChart)$/;
51
+
52
+ /**
53
+ * The chart a custom graphics value holds, or null for anything else.
54
+ * @param raw - the value
55
+ * @returns the chart's kind and options
56
+ */
57
+ function chartOf(raw: unknown): { kind: ChartKind; ring: boolean; options: ChartOptions } | null {
58
+ // CX2 writes the chart as an object, the desktop, CX and sessions as `<class>:<options as JSON>`
59
+ if (typeof raw === "object" && raw !== null && !Array.isArray(raw)) {
60
+ const o = raw as { type?: unknown; name?: unknown; properties?: unknown };
61
+ const kind = CHART_CLASS.exec(typeof o.name === "string" ? o.name : "")?.[1] as ChartKind | undefined;
62
+ return kind !== undefined && typeof o.properties === "object" && o.properties !== null
63
+ ? { kind, ring: kind === "RingChart", options: o.properties }
64
+ : null;
65
+ }
66
+ if (typeof raw !== "string") {
67
+ return null;
68
+ }
69
+ const m = /^(org\.cytoscape\.\w+):(\{.*\})\s*$/s.exec(raw.trim());
70
+ const kind = m === null ? undefined : (CHART_CLASS.exec(m[1])?.[1] as ChartKind | undefined);
71
+ if (m === null || kind === undefined) {
72
+ return null;
73
+ }
74
+ try {
75
+ const options = JSON.parse(m[2]) as unknown;
76
+ return typeof options === "object" && options !== null
77
+ ? { kind, ring: kind === "RingChart", options: options }
78
+ : null;
79
+ } catch {
80
+ return null;
81
+ }
82
+ }
83
+
84
+ /** Where each of Cytoscape's anchors is on a box, as fractions of its half width and half height, y down. */
85
+ const ANCHORS: Readonly<Record<string, readonly [number, number]>> = {
86
+ C: [0, 0],
87
+ N: [0, -1],
88
+ NE: [1, -1],
89
+ E: [1, 0],
90
+ SE: [1, 1],
91
+ S: [0, 1],
92
+ SW: [-1, 1],
93
+ W: [-1, 0],
94
+ NW: [-1, -1],
95
+ };
96
+
97
+ /**
98
+ * A custom graphic's position: `NODE_CUSTOMGRAPHICS_POSITION_<slot>` as the desktop writes it
99
+ * (`<node anchor>,<graphic anchor>,<justification>,<x offset>,<y offset>`) or as CX2 does (an object of
100
+ * `ENTITY_ANCHOR`, `GRAPHICS_ANCHOR`, `MARGIN_X`, `MARGIN_Y`).
101
+ * @param raw - the value
102
+ * @returns the anchors and offsets, or null when it does not read
103
+ */
104
+ function positionOf(
105
+ raw: unknown,
106
+ ): { node: readonly [number, number]; chart: readonly [number, number]; x: number; y: number } | null {
107
+ let parts: [unknown, unknown, unknown, unknown];
108
+ if (typeof raw === "string") {
109
+ const p = raw.split(",");
110
+ parts = [p[0], p[1], p[3], p[4]];
111
+ } else if (typeof raw === "object" && raw !== null) {
112
+ const o = raw as Record<string, unknown>;
113
+ parts = [o.ENTITY_ANCHOR, o.GRAPHICS_ANCHOR, o.MARGIN_X, o.MARGIN_Y];
114
+ } else {
115
+ return null;
116
+ }
117
+ const anchor = (v: unknown): readonly [number, number] | undefined =>
118
+ typeof v === "string" ? ANCHORS[v.trim().toUpperCase()] : undefined;
119
+ const [node, chart] = [anchor(parts[0]), anchor(parts[1])];
120
+ const [x, y] = [Number(parts[2] ?? 0), Number(parts[3] ?? 0)];
121
+ return node === undefined || chart === undefined
122
+ ? null
123
+ : { node, chart, x: Number.isFinite(x) ? x : 0, y: Number.isFinite(y) ? y : 0 };
124
+ }
125
+
126
+ /**
127
+ * A node's values for a chart's data columns: one per column, or the items of a single list column.
128
+ * @param columns - the chart's data columns
129
+ * @param value - reads the node's value of a column
130
+ * @returns the values, NaN where one is not a number
131
+ */
132
+ function valuesOf(columns: readonly string[], value: (column: string) => unknown): number[] {
133
+ const first = columns.length === 1 ? value(columns[0]) : undefined;
134
+ const raw = Array.isArray(first) ? (first as unknown[]) : columns.map((c) => value(c));
135
+ return raw.map((v) => (typeof v === "number" ? v : Number(v)));
136
+ }
137
+
138
+ /**
139
+ * Sets each node's `pie*` properties from the first pie or ring chart among its custom graphics.
140
+ * @param out - the node values per property, changed in place
141
+ * @param n - the node count
142
+ * @param graphicOf - a node's resolved value of a custom graphics slot
143
+ * @param value - a node's value of a data column
144
+ * @param sizeSync - whether charts are fitted to their node (`nodeCustomGraphicsSizeSync`, true by default)
145
+ */
146
+ export function readCytoscapeCharts(
147
+ out: Partial<Record<string, StyleColumn>>,
148
+ n: number,
149
+ graphicOf: (slot: string, i: number) => unknown,
150
+ value: (column: string, i: number) => unknown,
151
+ sizeSync: boolean,
152
+ ): void {
153
+ const col = (property: string): (StyleValue | null)[] => {
154
+ const existing = out[property];
155
+ if (existing !== undefined) {
156
+ return existing as (StyleValue | null)[];
157
+ }
158
+ const fresh = new Array<StyleValue | null>(n).fill(null);
159
+ out[property] = fresh;
160
+ return fresh;
161
+ };
162
+ for (let i = 0; i < n; i++) {
163
+ const slot = SLOTS.findIndex((vp) => chartOf(graphicOf(vp, i)) !== null);
164
+ const chart = slot < 0 ? null : chartOf(graphicOf(SLOTS[slot], i));
165
+ if (chart === null) {
166
+ continue;
167
+ }
168
+ const [w, h] = [out.width?.[i], out.height?.[i]];
169
+ chartOnNode(
170
+ chart,
171
+ {
172
+ put: (property, v) => {
173
+ col(property)[i] = v;
174
+ },
175
+ get: (property) => out[property]?.[i],
176
+ graphic: (name) => graphicOf(`${name}_${String(slot + 1)}`, i),
177
+ value: (column) => value(column, i),
178
+ w: typeof w === "number" ? w : null,
179
+ h: typeof h === "number" ? h : null,
180
+ },
181
+ sizeSync,
182
+ );
183
+ }
184
+ }
185
+
186
+ /** A node with a chart: what it reads, and where its values go. */
187
+ interface ChartNode {
188
+ /** sets one of the node's values */
189
+ readonly put: (property: string, v: StyleValue) => void;
190
+ /** one of the node's values as set so far */
191
+ readonly get: (property: string) => StyleValue | null | undefined;
192
+ /** the node's value of one of its chart slot's custom graphics properties, by name without the slot number */
193
+ readonly graphic: (name: string) => unknown;
194
+ /** the node's value of a data column */
195
+ readonly value: (column: string) => unknown;
196
+ /** the node's width, or null when it is not a number */
197
+ readonly w: number | null;
198
+ /** the node's height, or null when it is not a number */
199
+ readonly h: number | null;
200
+ }
201
+
202
+ /**
203
+ * A node's shorter side, when its width and height are known.
204
+ * @param node - the node
205
+ * @returns the side, or null
206
+ */
207
+ function shorterSide(node: ChartNode): number | null {
208
+ return node.w !== null && node.h !== null ? Math.min(node.w, node.h) : null;
209
+ }
210
+
211
+ /**
212
+ * Sets a node's `pie*` or `chart*` properties from its chart.
213
+ * @param chart - the chart
214
+ * @param chart.kind - its class
215
+ * @param chart.ring - whether it is a ring
216
+ * @param chart.options - its options
217
+ * @param node - the node
218
+ * @param sizeSync - whether charts are fitted to their node
219
+ */
220
+ function chartOnNode(
221
+ chart: { kind: ChartKind; ring: boolean; options: ChartOptions },
222
+ node: ChartNode,
223
+ sizeSync: boolean,
224
+ ): void {
225
+ const { options } = chart;
226
+ const colors = Array.isArray(options.cy_colors) ? options.cy_colors.map(String) : [];
227
+ const columns = Array.isArray(options.cy_dataColumns) ? options.cy_dataColumns.map(String) : [];
228
+ const values = valuesOf(columns, node.value);
229
+ if (chart.kind === "PieChart" || chart.kind === "RingChart") {
230
+ pieOnNode(chart.ring, options, values, colors, node, sizeSync);
231
+ return;
232
+ }
233
+ const own = Number(node.graphic("NODE_CUSTOMGRAPHICS_SIZE"));
234
+ const side = shorterSide(node);
235
+ const ownSize = own > 0;
236
+ const fitted = sizeSync || !ownSize;
237
+ const box = side === null ? null : { disc: CHART_ACROSS * (fitted ? side : own), side };
238
+ for (const [property, v] of Object.entries(plotChart(chart.kind, options, values, colors, box))) {
239
+ node.put(property, v);
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Each slice of a pie: a value above 0 with a color, its share of the values above 0.
245
+ * @param values - the node's values
246
+ * @param colors - the chart's colors
247
+ * @returns the slices in order
248
+ */
249
+ function pieSlices(values: readonly number[], colors: readonly string[]): { color: string; size: number }[] {
250
+ const total = values.reduce((sum, v) => sum + (Number.isFinite(v) && v > 0 ? v : 0), 0);
251
+ return values.flatMap((v, k) =>
252
+ Number.isFinite(v) && v > 0 && colors[k] !== undefined
253
+ ? [{ color: colors[k].toLowerCase(), size: v / total }]
254
+ : [],
255
+ );
256
+ }
257
+
258
+ /**
259
+ * Sets a node's `pie*` properties from a pie or ring chart.
260
+ * @param ring - whether it is a ring
261
+ * @param options - the chart's options
262
+ * @param values - the node's values
263
+ * @param colors - the chart's colors
264
+ * @param node - the node
265
+ * @param sizeSync - whether charts are fitted to their node
266
+ */
267
+ function pieOnNode(
268
+ ring: boolean,
269
+ options: ChartOptions,
270
+ values: readonly number[],
271
+ colors: readonly string[],
272
+ node: ChartNode,
273
+ sizeSync: boolean,
274
+ ): void {
275
+ const slices = pieSlices(values, colors);
276
+ if (slices.length === 0) {
277
+ return;
278
+ }
279
+ const start = Number(options.cy_startAngle ?? 0);
280
+ const from = Number.isFinite(start) ? start : 0;
281
+ // counter-clockwise from `start` past 3 o'clock is clockwise from 12 o'clock at 90 - start, slices reversed
282
+ const reversed = [...slices].reverse();
283
+ node.put("pieColors", reversed.map((s) => s.color).join(" "));
284
+ node.put("pieSizes", reversed.map((s) => String(num6(s.size))).join(" "));
285
+ // fitted to the node, or with `nodeCustomGraphicsSizeSync` off at the slot's own size
286
+ const own = Number(node.graphic("NODE_CUSTOMGRAPHICS_SIZE"));
287
+ const side = shorterSide(node);
288
+ const ownSize = own > 0;
289
+ const fitted = sizeSync || !ownSize || side === null || side <= 0;
290
+ node.put("pieRadius", fitted ? CHART_ACROSS : num6((CHART_ACROSS * own) / side));
291
+ pieOffset(node, fitted, own);
292
+ node.put("pieRotation", num6((((90 - from) % 360) + 360) % 360));
293
+ const texts = pieItemLabels(options, values, colors, node.value, {
294
+ start: from,
295
+ radius: (CHART_ACROSS * (fitted || side === null ? 1 : own / side) * (side ?? 0)) / 2,
296
+ dx: Number(node.get("pieOffsetX") ?? 0),
297
+ dy: Number(node.get("pieOffsetY") ?? 0),
298
+ w: node.w,
299
+ h: node.h,
300
+ });
301
+ if (texts !== null && (node.get("shapeTexts") ?? null) === null) {
302
+ node.put("shapeTexts", texts);
303
+ }
304
+ if (ring) {
305
+ const hole = Number(options.cy_holeSize ?? RING_HOLE);
306
+ node.put("pieHole", Number.isFinite(hole) ? Math.max(0, Math.min(1, hole)) : RING_HOLE);
307
+ }
308
+ }
309
+
310
+ /**
311
+ * A pie's offset from its node's center, as Cytoscape 3.10.5 draws a chart's position (measured from its SVG export
312
+ * of the specimen sheets, every anchor pair they hold, fitted and at a size of its own): the node anchor scales by
313
+ * the drawn disc and the chart anchor by the node, so on a 60 node NW,NW moves a fitted 54 disc 3 px down and right
314
+ * and a 21.6 disc 19 px, C,NW puts either one's center 30 px down and right, and E,W puts a fitted disc 57 px right;
315
+ * then the position's offsets (y down).
316
+ * @param node - the node
317
+ * @param fitted - whether the pie is fitted to the node
318
+ * @param own - the slot's own size
319
+ */
320
+ function pieOffset(node: ChartNode, fitted: boolean, own: number): void {
321
+ const at = positionOf(node.graphic("NODE_CUSTOMGRAPHICS_POSITION"));
322
+ const { w, h } = node;
323
+ if (at === null || w === null || h === null) {
324
+ return;
325
+ }
326
+ const disc = CHART_ACROSS * (fitted ? Math.min(w, h) : own);
327
+ const dx = (at.node[0] * disc) / 2 - (at.chart[0] * w) / 2 + at.x;
328
+ const dy = (at.node[1] * disc) / 2 - (at.chart[1] * h) / 2 + at.y;
329
+ if (dx !== 0 || dy !== 0) {
330
+ node.put("pieOffsetX", num6(dx));
331
+ node.put("pieOffsetY", num6(dy));
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Where Cytoscape's pie draws an item label: centered on its slice's middle, this share of the radius out (measured
337
+ * from its SVG export of xgmml-specimen-images-charts-p5 and -p7: 16.4 to 17.3 px from the center of a 27.2 px disc,
338
+ * at 1, 10 and 20 px).
339
+ */
340
+ const ITEM_LABEL_RADIUS = 0.62;
341
+
342
+ /**
343
+ * The size of a chart's item labels, in the file's lengths, when its options name none: Cytoscape 3.10.5 draws them 1
344
+ * px tall (xgmml-specimen-images-charts-p5 `pie-item-labels`).
345
+ */
346
+ const ITEM_LABEL_FONT_SIZE = 1;
347
+
348
+ /** The color JFreeChart draws Cytoscape's chart labels in. */
349
+ const CHART_LABEL_COLOR = "#404040";
350
+
351
+ /**
352
+ * A chart's item labels: `cy_itemLabels`, or the node's list in `cy_itemLabelsColumn`, one per data column; none
353
+ * unless `cy_showItemLabels` is on.
354
+ * @param options - the chart's options
355
+ * @param value - reads the node's value of a column
356
+ * @returns the labels, or null
357
+ */
358
+ function itemLabelsOf(options: ChartOptions, value: (column: string) => unknown): string[] | null {
359
+ if (options.cy_showItemLabels !== true) {
360
+ return null;
361
+ }
362
+ const column = typeof options.cy_itemLabelsColumn === "string" ? value(options.cy_itemLabelsColumn) : undefined;
363
+ const list = Array.isArray(column) ? column : options.cy_itemLabels;
364
+ return Array.isArray(list) ? list.map((v) => (v === null || v === undefined ? "" : String(v))) : null;
365
+ }
366
+
367
+ /**
368
+ * A pie's or a ring's item labels as the node's further texts (`shapeTexts`), as Cytoscape 3.10.5 draws them
369
+ * (measured from its SVG export of the specimen sheets): each slice's label centered on the middle of its slice, a
370
+ * share of the disc's radius out from its center, in `cy_itemLabelFontSize` (the file's lengths) and JFreeChart's
371
+ * dark gray.
372
+ * @param options - the chart's options
373
+ * @param values - the node's values, one per data column
374
+ * @param colors - the chart's colors, one per data column
375
+ * @param value - reads the node's value of a column
376
+ * @param at - where the disc is: its start angle (degrees counter-clockwise from 3 o'clock), radius and offset from
377
+ * the node's center (y down), and the node's width and height
378
+ * @param at.start - start angle
379
+ * @param at.radius - the disc's radius
380
+ * @param at.dx - offset right
381
+ * @param at.dy - offset down
382
+ * @param at.w - the node's width
383
+ * @param at.h - the node's height
384
+ * @returns the texts as JSON, or null for none
385
+ */
386
+ function pieItemLabels(
387
+ options: ChartOptions,
388
+ values: readonly number[],
389
+ colors: readonly string[],
390
+ value: (column: string) => unknown,
391
+ at: { start: number; radius: number; dx: number; dy: number; w: number | null; h: number | null },
392
+ ): string | null {
393
+ const labels = itemLabelsOf(options, value);
394
+ const { w, h } = at;
395
+ if (labels === null || w === null || h === null) {
396
+ return null;
397
+ }
398
+ // a size that is not a number, like one of 0, draws nothing
399
+ const drawn = w > 0 && h > 0 && at.radius > 0;
400
+ if (!drawn) {
401
+ return null;
402
+ }
403
+ const shown = values.map((v, k) => Number.isFinite(v) && v > 0 && colors[k] !== undefined);
404
+ const total = values.reduce((sum, v, k) => sum + (shown[k] ? v : 0), 0);
405
+ const size = Number(options.cy_itemLabelFontSize ?? ITEM_LABEL_FONT_SIZE);
406
+ const texts: [number, number, string, { size: number; color: string }][] = [];
407
+ let from = at.start;
408
+ values.forEach((v, k) => {
409
+ if (!shown[k]) {
410
+ return;
411
+ }
412
+ const sweep = (360 * v) / total;
413
+ const mid = ((from + sweep / 2) * Math.PI) / 180;
414
+ from += sweep;
415
+ const text = labels[k] ?? "";
416
+ if (text === "") {
417
+ return;
418
+ }
419
+ // counter-clockwise from 3 o'clock, y up in the node's frame
420
+ const x = at.dx + ITEM_LABEL_RADIUS * at.radius * Math.cos(mid);
421
+ const y = -at.dy + ITEM_LABEL_RADIUS * at.radius * Math.sin(mid);
422
+ texts.push([
423
+ num6(x / (w / 2)),
424
+ num6(y / (h / 2)),
425
+ text,
426
+ {
427
+ size: num6((Number.isFinite(size) && size > 0 ? size : ITEM_LABEL_FONT_SIZE) / h),
428
+ color: CHART_LABEL_COLOR,
429
+ },
430
+ ]);
431
+ });
432
+ return texts.length === 0 ? null : JSON.stringify(texts);
433
+ }
434
+
435
+ /** How many of the file's lengths one of Cytoscape's chart units is: it draws a chart at twice the node's scale. */
436
+ const CHART_UNIT = 0.5;
437
+
438
+ /**
439
+ * How far in from the disc a pie would fill Cytoscape draws a chart's plot, in the file's lengths, measured from its
440
+ * SVG export of the specimen sheets (60 nodes): the chart's own box is 0.9 of the node less 0.9, its plot 1 less
441
+ * again, a heat map's 2 less.
442
+ */
443
+ const CHART_INSET = 0.9;
444
+ const PLOT_INSET = 1;
445
+ const HEAT_MAP_INSET = 2;
446
+
447
+ /** The default outline Cytoscape draws round each bar and box, in chart units: JFreeChart's dark gray, a quarter wide. */
448
+ const BAR_OUTLINE = { color: "#404040", width: 0.25 };
449
+
450
+ /** How much of the category side JFreeChart leaves at each end of a bar and a box chart, and of a line chart. */
451
+ const BAR_MARGIN = 0.025;
452
+ const LINE_MARGIN = -0.0125;
453
+
454
+ /** The share of its range JFreeChart adds above a line chart's, and above an automatic range's top. */
455
+ const RANGE_HEADROOM = 0.1;
456
+
457
+ /**
458
+ * A color between two `#rrggbb` colors, each channel rounded, as Cytoscape interpolates a heat map's.
459
+ * @param a - the color at 0
460
+ * @param b - the color at 1
461
+ * @param t - how far, 0..1
462
+ * @returns the color
463
+ */
464
+ function mix(a: string, b: string, t: number): string {
465
+ const rgb = (c: string): number[] => [1, 3, 5].map((k) => Number.parseInt(c.slice(k, k + 2), 16));
466
+ const [x, y] = [rgb(a), rgb(b)];
467
+ if ([...x, ...y].some((v) => !Number.isFinite(v))) {
468
+ return a;
469
+ }
470
+ const u = Math.max(0, Math.min(1, t));
471
+ return `#${x
472
+ .map((v, k) =>
473
+ Math.round(v + (y[k] - v) * u)
474
+ .toString(16)
475
+ .padStart(2, "0"),
476
+ )
477
+ .join("")}`;
478
+ }
479
+
480
+ /**
481
+ * A value's color on Cytoscape's three-color scale (`[up, zero, down]`): from the zero color toward the up color as
482
+ * the value nears the top of the range, toward the down color as it nears the bottom (`cy-heat-map`: 5 of 0..10
483
+ * half way from #F7F7F7 to #2166AC).
484
+ * @param colors - the three colors
485
+ * @param v - the value
486
+ * @param range - the range
487
+ * @returns the color
488
+ */
489
+ function scaleColor(colors: readonly string[], v: number, range: readonly [number, number]): string {
490
+ const [up, zero, down] = [colors[0], colors[1] ?? colors[0], colors[2] ?? colors[0]];
491
+ if (v >= 0) {
492
+ return mix(zero, up, range[1] > 0 ? v / range[1] : 0);
493
+ }
494
+ return mix(zero, down, range[0] < 0 ? v / range[0] : 0);
495
+ }
496
+
497
+ /**
498
+ * The quartiles, median and whiskers JFreeChart draws a box chart's values as (`BoxAndWhiskerCalculator`): the
499
+ * quartiles are the medians of each half, the middle value in both halves of an odd count; each whisker reaches the
500
+ * furthest value within 1.5 times the quartiles' spread.
501
+ * @param values - the values
502
+ * @returns low whisker, lower quartile, median, upper quartile, high whisker
503
+ */
504
+ function boxStats(values: readonly number[]): number[] {
505
+ const v = [...values].sort((a, b) => a - b);
506
+ const median = (list: readonly number[]): number => {
507
+ const m = list.length / 2;
508
+ return list.length % 2 === 1 ? list[Math.floor(m)] : (list[m - 1] + list[m]) / 2;
509
+ };
510
+ const half = Math.ceil(v.length / 2);
511
+ const [q1, q3] = [median(v.slice(0, half)), median(v.slice(v.length - half))];
512
+ const reach = 1.5 * (q3 - q1);
513
+ const inside = v.filter((x) => x >= q1 - reach && x <= q3 + reach);
514
+ // never empty: the middle values lie between the quartiles
515
+ return [inside[0], q1, median(v), q3, inside.at(-1) ?? q3];
516
+ }
517
+
518
+ /**
519
+ * How large a chart's plot is drawn: inside the disc a pie fills, as a share of the node.
520
+ * @param kind - the chart's class
521
+ * @param box - the pie's width and the node's shorter side, or null when the node's size is unknown
522
+ * @returns `chartSize`, or nothing when the node's size is unknown
523
+ */
524
+ function plotSize(
525
+ kind: Exclude<ChartKind, "PieChart" | "RingChart">,
526
+ box: { disc: number; side: number } | null,
527
+ ): Record<string, StyleValue> {
528
+ const sized = box !== null && box.side > 0;
529
+ if (!sized) {
530
+ return {};
531
+ }
532
+ // ponytail: the insets are measured on 60 nodes only; whether they scale with the node is not known
533
+ const inset = CHART_INSET + (kind === "HeatMapChart" ? HEAT_MAP_INSET : PLOT_INSET);
534
+ return { chartSize: num6(Math.max(0, box.disc - inset) / box.side) };
535
+ }
536
+
537
+ /**
538
+ * The outline Cytoscape draws round each bar and box.
539
+ * @param options - the chart's options
540
+ * @returns `chartBorderColor` and `chartBorderWidth`
541
+ */
542
+ function chartOutline(options: ChartOptions): Record<string, StyleValue> {
543
+ const color = typeof options.cy_borderColor === "string" ? options.cy_borderColor : BAR_OUTLINE.color;
544
+ return {
545
+ chartBorderColor: color.toLowerCase(),
546
+ chartBorderWidth: num6(CHART_UNIT * (Number(options.cy_borderWidth ?? BAR_OUTLINE.width) || 0)),
547
+ };
548
+ }
549
+
550
+ /**
551
+ * A bar chart's own properties: grouped, stacked, up and down (the first color up, the last down) or heat strips
552
+ * (each bar colored on the three-color scale).
553
+ * @param options - its options
554
+ * @param finite - the node's values that are numbers
555
+ * @param colors - its colors
556
+ * @param range - its range
557
+ * @param horizontal - whether its orientation is horizontal
558
+ * @returns the properties
559
+ */
560
+ function barChart(
561
+ options: ChartOptions,
562
+ finite: readonly number[],
563
+ colors: readonly string[],
564
+ range: readonly [number, number],
565
+ horizontal: boolean,
566
+ ): Record<string, StyleValue> {
567
+ const type = typeof options.cy_type === "string" ? options.cy_type : "GROUPED";
568
+ const stacked = type === "STACKED";
569
+ return {
570
+ chartKind: stacked ? "stacked-bar" : "bar",
571
+ chartValues: finite.join(" "),
572
+ chartColors: finite.map((v, k) => barColor(type, colors, v, k, range)).join(" "),
573
+ chartMin: range[0],
574
+ chartMax: range[1],
575
+ // Cytoscape lays a stacked bar's values across the node when its orientation says up
576
+ chartHorizontal: stacked ? !horizontal : horizontal,
577
+ chartMargin: BAR_MARGIN,
578
+ chartGap: num6(Math.max(0, Math.min(1, Number(options.cy_separation ?? 0) || 0))),
579
+ };
580
+ }
581
+
582
+ /**
583
+ * One bar's color.
584
+ * @param type - the bar chart's type
585
+ * @param colors - its colors
586
+ * @param v - the bar's value
587
+ * @param k - the bar's place
588
+ * @param range - the chart's range
589
+ * @returns the color
590
+ */
591
+ function barColor(
592
+ type: string,
593
+ colors: readonly string[],
594
+ v: number,
595
+ k: number,
596
+ range: readonly [number, number],
597
+ ): string {
598
+ if (type === "HEAT_STRIPS") {
599
+ return scaleColor(colors, v, range);
600
+ }
601
+ if (type === "UP_DOWN") {
602
+ return colors[v >= 0 ? 0 : colors.length - 1].toLowerCase();
603
+ }
604
+ return colors[Math.min(k, colors.length - 1)].toLowerCase();
605
+ }
606
+
607
+ /**
608
+ * A bar, line, box or heat map chart as the neutral `chart*` properties, as Cytoscape 3.10.5 draws it (measured from
609
+ * its own SVG export of the specimen sheets: JFreeChart plots in a square box inset from the disc a pie fills).
610
+ * @param kind - the chart's class
611
+ * @param options - its options
612
+ * @param values - the node's values for its data columns
613
+ * @param colors - its colors
614
+ * @param box - how far across a pie would be drawn on the node and the node's shorter side, in the file's lengths;
615
+ * null when the node's size is unknown
616
+ * @param box.disc - the pie's width
617
+ * @param box.side - the node's shorter side
618
+ * @returns the properties to set
619
+ */
620
+ function plotChart(
621
+ kind: Exclude<ChartKind, "PieChart" | "RingChart">,
622
+ options: ChartOptions,
623
+ values: readonly number[],
624
+ colors: readonly string[],
625
+ box: { disc: number; side: number } | null,
626
+ ): Record<string, StyleValue> {
627
+ const finite = values.filter((v) => Number.isFinite(v));
628
+ if (finite.length === 0 || colors.length === 0) {
629
+ // ponytail: a chart colored by a named scheme (cy_colorScheme) without its colors is not drawn
630
+ return {};
631
+ }
632
+ const given = Array.isArray(options.cy_range) ? options.cy_range.map(Number) : [];
633
+ const global = options.cy_globalRange !== false && given.length === 2 && given.every((v) => Number.isFinite(v));
634
+ // an automatic range holds zero and the values, with headroom above
635
+ const auto: [number, number] = [Math.min(0, ...finite), Math.max(0, ...finite)];
636
+ auto[1] += RANGE_HEADROOM * (auto[1] - auto[0]);
637
+ const range: [number, number] = global ? [given[0], given[1]] : auto;
638
+ const horizontal = options.cy_orientation === "HORIZONTAL";
639
+ const out: Record<string, StyleValue> = plotSize(kind, box);
640
+ const outline = chartOutline(options);
641
+ switch (kind) {
642
+ case "BarChart":
643
+ Object.assign(out, outline, barChart(options, finite, colors, range, horizontal));
644
+ break;
645
+ case "LineChart":
646
+ // drawn up the node whatever its orientation, with headroom above its range
647
+ Object.assign(out, {
648
+ chartKind: "line",
649
+ chartValues: finite.join(" "),
650
+ chartColors: colors[0].toLowerCase(),
651
+ chartMin: range[0],
652
+ chartMax: num6(range[1] + (global ? RANGE_HEADROOM * (range[1] - range[0]) : 0)),
653
+ chartMargin: LINE_MARGIN,
654
+ chartLineWidth: num6(CHART_UNIT * (Number(options.cy_lineWidth ?? 1) || 0)),
655
+ });
656
+ break;
657
+ case "BoxChart":
658
+ Object.assign(out, outline, {
659
+ chartKind: "box",
660
+ chartValues: boxStats(finite).map(num6).join(" "),
661
+ chartColors: `${colors[0].toLowerCase()} #000000`,
662
+ chartMin: range[0],
663
+ chartMax: range[1],
664
+ chartHorizontal: horizontal,
665
+ chartMargin: BAR_MARGIN,
666
+ chartLineWidth: num6(CHART_UNIT * BAR_OUTLINE.width),
667
+ });
668
+ break;
669
+ case "HeatMapChart": {
670
+ // one cell per value, top to bottom; laid left to right, the last value first
671
+ const cells = horizontal ? [...finite].reverse() : finite;
672
+ Object.assign(out, {
673
+ chartKind: "cells",
674
+ chartValues: cells.join(" "),
675
+ chartColors: cells.map((v) => scaleColor(colors, v, range)).join(" "),
676
+ chartHorizontal: !horizontal,
677
+ });
678
+ break;
679
+ }
680
+ default:
681
+ break;
682
+ }
683
+ return out;
684
+ }