@graphty/graph-io 0.3.47 → 0.3.49

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 (770) hide show
  1. package/dist/chunks/{approximations-wWjCRzKj.js → approximations-Bzn3L-je.js} +2 -2
  2. package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-Bzn3L-je.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-DiGq58c3.js → block-iptrlMBb.js} +947 -134
  6. package/dist/chunks/block-iptrlMBb.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-BE2xir2k.js +157 -0
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-BKwqelYD.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-BKwqelYD.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/context-C3p0RQxR.js +664 -0
  14. package/dist/chunks/context-C3p0RQxR.js.map +1 -0
  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-DXHx7nwR.js +349 -0
  18. package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
  19. package/dist/chunks/cx-export-Bt6NoqTQ.js +259 -0
  20. package/dist/chunks/cx-export-Bt6NoqTQ.js.map +1 -0
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/descriptor-C-YDhtsn.js +48 -0
  24. package/dist/chunks/descriptor-C-YDhtsn.js.map +1 -0
  25. package/dist/chunks/descriptor-DLA5kINx.js +142 -0
  26. package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
  27. package/dist/chunks/{emit-CwU8cUmG.js → emit-BwHQkZle.js} +1690 -103
  28. package/dist/chunks/emit-BwHQkZle.js.map +1 -0
  29. package/dist/chunks/{escape-CgzxiYPg.js → escape-CuCIzNMB.js} +12 -12
  30. package/dist/chunks/{escape-CgzxiYPg.js.map → escape-CuCIzNMB.js.map} +1 -1
  31. package/dist/chunks/{export-BvqAXCKh.js → export-Cha4dRFz.js} +48 -1780
  32. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  33. package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-BP6otMO6.js} +6 -4
  34. package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-BP6otMO6.js.map} +1 -1
  35. package/dist/chunks/{exporter-CrDWIyiq.js → exporter-D2CETOMK.js} +1222 -154
  36. package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
  37. package/dist/chunks/{exporter-DndFlGSa.js → exporter-D9yMtocA.js} +7 -6
  38. package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-D9yMtocA.js.map} +1 -1
  39. package/dist/chunks/exporter-_jrBTnos.js +1009 -0
  40. package/dist/chunks/exporter-_jrBTnos.js.map +1 -0
  41. package/dist/chunks/{exporter-CJgfhF-l.js → exporter-nDfxIK5D.js} +9 -7
  42. package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-nDfxIK5D.js.map} +1 -1
  43. package/dist/chunks/format-BXiAb-1h.js +408 -0
  44. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  45. package/dist/chunks/{generic-Dq1ntt9q.js → generic-ymWCETAJ.js} +387 -31
  46. package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
  47. package/dist/chunks/{importer-CMmeMWlC.js → importer-B92x1xY5.js} +15 -263
  48. package/dist/chunks/importer-B92x1xY5.js.map +1 -0
  49. package/dist/chunks/{importer-DiZRmOQG.js → importer-CT9mJ1nn.js} +328 -90
  50. package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
  51. package/dist/chunks/{importer-COTK9Tsl.js → importer-DaLTjbds.js} +116 -1099
  52. package/dist/chunks/importer-DaLTjbds.js.map +1 -0
  53. package/dist/chunks/{importer-iFYPEKaJ.js → importer-GREKMdIf.js} +28 -16
  54. package/dist/chunks/importer-GREKMdIf.js.map +1 -0
  55. package/dist/chunks/{importer-BSvfrX_h.js → importer-PqaaKKnY.js} +23 -1016
  56. package/dist/chunks/importer-PqaaKKnY.js.map +1 -0
  57. package/dist/chunks/{importer-yh_aBCU6.js → importer-Vn5QvmmJ.js} +66 -12
  58. package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
  59. package/dist/chunks/{importer-e6LGpqHB.js → importer-vRq4h3j5.js} +1470 -354
  60. package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
  61. package/dist/chunks/input-CAxt_aV-.js +1397 -0
  62. package/dist/chunks/input-CAxt_aV-.js.map +1 -0
  63. package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-Cq76WjnZ.js} +4 -4
  64. package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  65. package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-Clf4QIyl.js} +299 -77
  66. package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
  67. package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-OMo91mb0.js} +4 -3
  68. package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  69. package/dist/chunks/{records-CiaWZrFH.js → records-NJiYvekn.js} +2 -2
  70. package/dist/chunks/{records-CiaWZrFH.js.map → records-NJiYvekn.js.map} +1 -1
  71. package/dist/chunks/{format-BpQBx8MZ.js → report-CwMfYa9J.js} +70 -127
  72. package/dist/chunks/report-CwMfYa9J.js.map +1 -0
  73. package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
  74. package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
  75. package/dist/chunks/sigv4-EokFic1V.js +247 -0
  76. package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
  77. package/dist/chunks/{styles-BQnsga7p.js → styles-CCs214_3.js} +1300 -168
  78. package/dist/chunks/styles-CCs214_3.js.map +1 -0
  79. package/dist/chunks/styles-Cm62yyQX.js +2812 -0
  80. package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
  81. package/dist/chunks/styles-DPQQIig4.js +1928 -0
  82. package/dist/chunks/styles-DPQQIig4.js.map +1 -0
  83. package/dist/chunks/styles-yed-UMFdNqze.js +1213 -0
  84. package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
  85. package/dist/chunks/{text-CzJNFOS9.js → text-ystE2bYi.js} +2 -2
  86. package/dist/chunks/{text-CzJNFOS9.js.map → text-ystE2bYi.js.map} +1 -1
  87. package/dist/csv.js +7 -5
  88. package/dist/csv.js.map +1 -1
  89. package/dist/cx.js +5 -4
  90. package/dist/cx.js.map +1 -1
  91. package/dist/cx2.js +2 -2
  92. package/dist/cys.js +1 -1
  93. package/dist/dot.js +5 -4
  94. package/dist/dot.js.map +1 -1
  95. package/dist/gexf.js +42 -10
  96. package/dist/gexf.js.map +1 -1
  97. package/dist/gml.js +850 -193
  98. package/dist/gml.js.map +1 -1
  99. package/dist/graph-io.js +1189 -220
  100. package/dist/graph-io.js.map +1 -1
  101. package/dist/graphml.js +3 -3
  102. package/dist/json.js +3 -2
  103. package/dist/neo4j.js +6 -4
  104. package/dist/neo4j.js.map +1 -1
  105. package/dist/obo.js +1 -1
  106. package/dist/pajek.js +1 -1
  107. package/dist/positions.js +45 -3
  108. package/dist/positions.js.map +1 -1
  109. package/dist/sources-cypher.d.ts +1 -0
  110. package/dist/sources-cypher.js +1351 -0
  111. package/dist/sources-cypher.js.map +1 -0
  112. package/dist/sources-ndex.d.ts +1 -0
  113. package/dist/sources-ndex.js +278 -0
  114. package/dist/sources-ndex.js.map +1 -0
  115. package/dist/sources-rest.d.ts +1 -0
  116. package/dist/sources-rest.js +1377 -0
  117. package/dist/sources-rest.js.map +1 -0
  118. package/dist/sources-sparql.d.ts +1 -0
  119. package/dist/sources-sparql.js +405 -0
  120. package/dist/sources-sparql.js.map +1 -0
  121. package/dist/src/common/report.d.ts +6 -3
  122. package/dist/src/common/report.d.ts.map +1 -1
  123. package/dist/src/common/report.js +15 -9
  124. package/dist/src/common/report.js.map +1 -1
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +5 -1
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +24 -1
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cx/styles.js +118 -11
  131. package/dist/src/formats/cx/styles.js.map +1 -1
  132. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  133. package/dist/src/formats/cx2/importer.js +1 -0
  134. package/dist/src/formats/cx2/importer.js.map +1 -1
  135. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  136. package/dist/src/formats/cx2/styles.js +3 -1
  137. package/dist/src/formats/cx2/styles.js.map +1 -1
  138. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  139. package/dist/src/formats/cys/importer.js +1 -0
  140. package/dist/src/formats/cys/importer.js.map +1 -1
  141. package/dist/src/formats/cys/styles.d.ts +2 -0
  142. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  143. package/dist/src/formats/cys/styles.js +15 -7
  144. package/dist/src/formats/cys/styles.js.map +1 -1
  145. package/dist/src/formats/dot/drawing.d.ts +98 -0
  146. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  147. package/dist/src/formats/dot/drawing.js +734 -0
  148. package/dist/src/formats/dot/drawing.js.map +1 -0
  149. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  150. package/dist/src/formats/dot/importer.js +108 -31
  151. package/dist/src/formats/dot/importer.js.map +1 -1
  152. package/dist/src/formats/dot/label-places.d.ts +34 -0
  153. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  154. package/dist/src/formats/dot/label-places.js +179 -0
  155. package/dist/src/formats/dot/label-places.js.map +1 -0
  156. package/dist/src/formats/dot/record.d.ts +50 -0
  157. package/dist/src/formats/dot/record.d.ts.map +1 -0
  158. package/dist/src/formats/dot/record.js +275 -0
  159. package/dist/src/formats/dot/record.js.map +1 -0
  160. package/dist/src/formats/dot/styles.d.ts +62 -2
  161. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  162. package/dist/src/formats/dot/styles.js +1457 -120
  163. package/dist/src/formats/dot/styles.js.map +1 -1
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  165. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  167. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  168. package/dist/src/formats/gexf/importer.d.ts +7 -0
  169. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  170. package/dist/src/formats/gexf/importer.js +41 -5
  171. package/dist/src/formats/gexf/importer.js.map +1 -1
  172. package/dist/src/formats/gexf/preview.d.ts +77 -0
  173. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  174. package/dist/src/formats/gexf/preview.js +191 -0
  175. package/dist/src/formats/gexf/preview.js.map +1 -0
  176. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  177. package/dist/src/formats/gexf/schema.js +2 -1
  178. package/dist/src/formats/gexf/schema.js.map +1 -1
  179. package/dist/src/formats/gexf/styles.d.ts +60 -16
  180. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  181. package/dist/src/formats/gexf/styles.js +883 -131
  182. package/dist/src/formats/gexf/styles.js.map +1 -1
  183. package/dist/src/formats/gml/importer.d.ts +5 -2
  184. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  185. package/dist/src/formats/gml/importer.js +258 -71
  186. package/dist/src/formats/gml/importer.js.map +1 -1
  187. package/dist/src/formats/gml/index.d.ts +1 -1
  188. package/dist/src/formats/gml/index.d.ts.map +1 -1
  189. package/dist/src/formats/gml/index.js +1 -1
  190. package/dist/src/formats/gml/index.js.map +1 -1
  191. package/dist/src/formats/gml/positions.d.ts +7 -0
  192. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  193. package/dist/src/formats/gml/positions.js +29 -7
  194. package/dist/src/formats/gml/positions.js.map +1 -1
  195. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  196. package/dist/src/formats/gml/styles.js +756 -103
  197. package/dist/src/formats/gml/styles.js.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  199. package/dist/src/formats/graphml/styles-plain.js +8 -12
  200. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  201. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  202. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  203. package/dist/src/formats/graphml/styles-yed.js +749 -148
  204. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  207. package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
  208. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  209. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  210. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  211. package/dist/src/formats/graphml/yfiles.js +16 -6
  212. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  213. package/dist/src/formats/json/dialect.d.ts +3 -2
  214. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  215. package/dist/src/formats/json/dialect.js +39 -5
  216. package/dist/src/formats/json/dialect.js.map +1 -1
  217. package/dist/src/formats/json/importer.d.ts +13 -2
  218. package/dist/src/formats/json/importer.d.ts.map +1 -1
  219. package/dist/src/formats/json/importer.js +42 -6
  220. package/dist/src/formats/json/importer.js.map +1 -1
  221. package/dist/src/formats/json/index.d.ts +1 -1
  222. package/dist/src/formats/json/index.d.ts.map +1 -1
  223. package/dist/src/formats/json/index.js +1 -1
  224. package/dist/src/formats/json/index.js.map +1 -1
  225. package/dist/src/formats/json/positions.d.ts +5 -2
  226. package/dist/src/formats/json/positions.d.ts.map +1 -1
  227. package/dist/src/formats/json/positions.js +20 -4
  228. package/dist/src/formats/json/positions.js.map +1 -1
  229. package/dist/src/formats/json/styles.d.ts +12 -1
  230. package/dist/src/formats/json/styles.d.ts.map +1 -1
  231. package/dist/src/formats/json/styles.js +1755 -136
  232. package/dist/src/formats/json/styles.js.map +1 -1
  233. package/dist/src/formats/pajek/draw.d.ts +96 -0
  234. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  235. package/dist/src/formats/pajek/draw.js +372 -0
  236. package/dist/src/formats/pajek/draw.js.map +1 -0
  237. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  238. package/dist/src/formats/pajek/exporter.js +70 -51
  239. package/dist/src/formats/pajek/exporter.js.map +1 -1
  240. package/dist/src/formats/pajek/importer.d.ts +9 -0
  241. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  242. package/dist/src/formats/pajek/importer.js +233 -102
  243. package/dist/src/formats/pajek/importer.js.map +1 -1
  244. package/dist/src/formats/pajek/index.d.ts +1 -0
  245. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  246. package/dist/src/formats/pajek/index.js.map +1 -1
  247. package/dist/src/formats/pajek/styles.d.ts +15 -7
  248. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  249. package/dist/src/formats/pajek/styles.js +1279 -114
  250. package/dist/src/formats/pajek/styles.js.map +1 -1
  251. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  252. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  253. package/dist/src/formats/pajek/syntax.js +26 -2
  254. package/dist/src/formats/pajek/syntax.js.map +1 -1
  255. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  256. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  257. package/dist/src/formats/xgmml/emit.js +65 -5
  258. package/dist/src/formats/xgmml/emit.js.map +1 -1
  259. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  260. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  261. package/dist/src/formats/xgmml/styles.js +278 -60
  262. package/dist/src/formats/xgmml/styles.js.map +1 -1
  263. package/dist/src/index.d.ts +10 -2
  264. package/dist/src/index.d.ts.map +1 -1
  265. package/dist/src/index.js +11 -2
  266. package/dist/src/index.js.map +1 -1
  267. package/dist/src/positions/convert.d.ts.map +1 -1
  268. package/dist/src/positions/convert.js +11 -1
  269. package/dist/src/positions/convert.js.map +1 -1
  270. package/dist/src/positions/extract.d.ts.map +1 -1
  271. package/dist/src/positions/extract.js +53 -1
  272. package/dist/src/positions/extract.js.map +1 -1
  273. package/dist/src/positions/index.d.ts +1 -1
  274. package/dist/src/positions/index.d.ts.map +1 -1
  275. package/dist/src/positions/types.d.ts +59 -0
  276. package/dist/src/positions/types.d.ts.map +1 -1
  277. package/dist/src/registry.d.ts +173 -1
  278. package/dist/src/registry.d.ts.map +1 -1
  279. package/dist/src/registry.js +196 -1
  280. package/dist/src/registry.js.map +1 -1
  281. package/dist/src/sources/builtins.d.ts +11 -0
  282. package/dist/src/sources/builtins.d.ts.map +1 -0
  283. package/dist/src/sources/builtins.js +53 -0
  284. package/dist/src/sources/builtins.js.map +1 -0
  285. package/dist/src/sources/codes.d.ts +230 -0
  286. package/dist/src/sources/codes.d.ts.map +1 -0
  287. package/dist/src/sources/codes.js +58 -0
  288. package/dist/src/sources/codes.js.map +1 -0
  289. package/dist/src/sources/context.d.ts +112 -0
  290. package/dist/src/sources/context.d.ts.map +1 -0
  291. package/dist/src/sources/context.js +740 -0
  292. package/dist/src/sources/context.js.map +1 -0
  293. package/dist/src/sources/credentials.d.ts +179 -0
  294. package/dist/src/sources/credentials.d.ts.map +1 -0
  295. package/dist/src/sources/credentials.js +301 -0
  296. package/dist/src/sources/credentials.js.map +1 -0
  297. package/dist/src/sources/cypher/descriptor.d.ts +21 -0
  298. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -0
  299. package/dist/src/sources/cypher/descriptor.js +124 -0
  300. package/dist/src/sources/cypher/descriptor.js.map +1 -0
  301. package/dist/src/sources/cypher/flatten.d.ts +72 -0
  302. package/dist/src/sources/cypher/flatten.d.ts.map +1 -0
  303. package/dist/src/sources/cypher/flatten.js +279 -0
  304. package/dist/src/sources/cypher/flatten.js.map +1 -0
  305. package/dist/src/sources/cypher/index.d.ts +33 -0
  306. package/dist/src/sources/cypher/index.d.ts.map +1 -0
  307. package/dist/src/sources/cypher/index.js +511 -0
  308. package/dist/src/sources/cypher/index.js.map +1 -0
  309. package/dist/src/sources/cypher/params.d.ts +40 -0
  310. package/dist/src/sources/cypher/params.d.ts.map +1 -0
  311. package/dist/src/sources/cypher/params.js +6 -0
  312. package/dist/src/sources/cypher/params.js.map +1 -0
  313. package/dist/src/sources/cypher/profiles.d.ts +44 -0
  314. package/dist/src/sources/cypher/profiles.d.ts.map +1 -0
  315. package/dist/src/sources/cypher/profiles.js +61 -0
  316. package/dist/src/sources/cypher/profiles.js.map +1 -0
  317. package/dist/src/sources/cypher/query-builder.d.ts +123 -0
  318. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
  319. package/dist/src/sources/cypher/query-builder.js +267 -0
  320. package/dist/src/sources/cypher/query-builder.js.map +1 -0
  321. package/dist/src/sources/cypher/transports/bolt.d.ts +21 -0
  322. package/dist/src/sources/cypher/transports/bolt.d.ts.map +1 -0
  323. package/dist/src/sources/cypher/transports/bolt.js +185 -0
  324. package/dist/src/sources/cypher/transports/bolt.js.map +1 -0
  325. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts +15 -0
  326. package/dist/src/sources/cypher/transports/neptune-analytics.d.ts.map +1 -0
  327. package/dist/src/sources/cypher/transports/neptune-analytics.js +38 -0
  328. package/dist/src/sources/cypher/transports/neptune-analytics.js.map +1 -0
  329. package/dist/src/sources/cypher/transports/neptune-https.d.ts +31 -0
  330. package/dist/src/sources/cypher/transports/neptune-https.d.ts.map +1 -0
  331. package/dist/src/sources/cypher/transports/neptune-https.js +104 -0
  332. package/dist/src/sources/cypher/transports/neptune-https.js.map +1 -0
  333. package/dist/src/sources/cypher/transports/query-api.d.ts +14 -0
  334. package/dist/src/sources/cypher/transports/query-api.d.ts.map +1 -0
  335. package/dist/src/sources/cypher/transports/query-api.js +80 -0
  336. package/dist/src/sources/cypher/transports/query-api.js.map +1 -0
  337. package/dist/src/sources/cypher/transports/transport.d.ts +78 -0
  338. package/dist/src/sources/cypher/transports/transport.d.ts.map +1 -0
  339. package/dist/src/sources/cypher/transports/transport.js +77 -0
  340. package/dist/src/sources/cypher/transports/transport.js.map +1 -0
  341. package/dist/src/sources/cypher/types-map.d.ts +91 -0
  342. package/dist/src/sources/cypher/types-map.d.ts.map +1 -0
  343. package/dist/src/sources/cypher/types-map.js +306 -0
  344. package/dist/src/sources/cypher/types-map.js.map +1 -0
  345. package/dist/src/sources/define.d.ts +47 -0
  346. package/dist/src/sources/define.d.ts.map +1 -0
  347. package/dist/src/sources/define.js +173 -0
  348. package/dist/src/sources/define.js.map +1 -0
  349. package/dist/src/sources/fail.d.ts +33 -0
  350. package/dist/src/sources/fail.d.ts.map +1 -0
  351. package/dist/src/sources/fail.js +49 -0
  352. package/dist/src/sources/fail.js.map +1 -0
  353. package/dist/src/sources/ids.d.ts +69 -0
  354. package/dist/src/sources/ids.d.ts.map +1 -0
  355. package/dist/src/sources/ids.js +69 -0
  356. package/dist/src/sources/ids.js.map +1 -0
  357. package/dist/src/sources/ndex/client.d.ts +31 -0
  358. package/dist/src/sources/ndex/client.d.ts.map +1 -0
  359. package/dist/src/sources/ndex/client.js +90 -0
  360. package/dist/src/sources/ndex/client.js.map +1 -0
  361. package/dist/src/sources/ndex/descriptor.d.ts +10 -0
  362. package/dist/src/sources/ndex/descriptor.d.ts.map +1 -0
  363. package/dist/src/sources/ndex/descriptor.js +55 -0
  364. package/dist/src/sources/ndex/descriptor.js.map +1 -0
  365. package/dist/src/sources/ndex/expand.d.ts +20 -0
  366. package/dist/src/sources/ndex/expand.d.ts.map +1 -0
  367. package/dist/src/sources/ndex/expand.js +87 -0
  368. package/dist/src/sources/ndex/expand.js.map +1 -0
  369. package/dist/src/sources/ndex/index.d.ts +25 -0
  370. package/dist/src/sources/ndex/index.d.ts.map +1 -0
  371. package/dist/src/sources/ndex/index.js +191 -0
  372. package/dist/src/sources/ndex/index.js.map +1 -0
  373. package/dist/src/sources/ndex/params.d.ts +17 -0
  374. package/dist/src/sources/ndex/params.d.ts.map +1 -0
  375. package/dist/src/sources/ndex/params.js +6 -0
  376. package/dist/src/sources/ndex/params.js.map +1 -0
  377. package/dist/src/sources/ndex/share-url.d.ts +40 -0
  378. package/dist/src/sources/ndex/share-url.d.ts.map +1 -0
  379. package/dist/src/sources/ndex/share-url.js +64 -0
  380. package/dist/src/sources/ndex/share-url.js.map +1 -0
  381. package/dist/src/sources/params.d.ts +31 -0
  382. package/dist/src/sources/params.d.ts.map +1 -0
  383. package/dist/src/sources/params.js +6 -0
  384. package/dist/src/sources/params.js.map +1 -0
  385. package/dist/src/sources/registry.d.ts +118 -0
  386. package/dist/src/sources/registry.d.ts.map +1 -0
  387. package/dist/src/sources/registry.js +193 -0
  388. package/dist/src/sources/registry.js.map +1 -0
  389. package/dist/src/sources/rest/descriptor.d.ts +16 -0
  390. package/dist/src/sources/rest/descriptor.d.ts.map +1 -0
  391. package/dist/src/sources/rest/descriptor.js +76 -0
  392. package/dist/src/sources/rest/descriptor.js.map +1 -0
  393. package/dist/src/sources/rest/index.d.ts +14 -0
  394. package/dist/src/sources/rest/index.d.ts.map +1 -0
  395. package/dist/src/sources/rest/index.js +13 -0
  396. package/dist/src/sources/rest/index.js.map +1 -0
  397. package/dist/src/sources/rest/mapping.d.ts +30 -0
  398. package/dist/src/sources/rest/mapping.d.ts.map +1 -0
  399. package/dist/src/sources/rest/mapping.js +362 -0
  400. package/dist/src/sources/rest/mapping.js.map +1 -0
  401. package/dist/src/sources/rest/openalex.d.ts +27 -0
  402. package/dist/src/sources/rest/openalex.d.ts.map +1 -0
  403. package/dist/src/sources/rest/openalex.js +269 -0
  404. package/dist/src/sources/rest/openalex.js.map +1 -0
  405. package/dist/src/sources/rest/paging.d.ts +53 -0
  406. package/dist/src/sources/rest/paging.d.ts.map +1 -0
  407. package/dist/src/sources/rest/paging.js +138 -0
  408. package/dist/src/sources/rest/paging.js.map +1 -0
  409. package/dist/src/sources/rest/params.d.ts +216 -0
  410. package/dist/src/sources/rest/params.d.ts.map +1 -0
  411. package/dist/src/sources/rest/params.js +7 -0
  412. package/dist/src/sources/rest/params.js.map +1 -0
  413. package/dist/src/sources/rest/records.d.ts +41 -0
  414. package/dist/src/sources/rest/records.d.ts.map +1 -0
  415. package/dist/src/sources/rest/records.js +240 -0
  416. package/dist/src/sources/rest/records.js.map +1 -0
  417. package/dist/src/sources/rest/samples/deps-dev.d.ts +10 -0
  418. package/dist/src/sources/rest/samples/deps-dev.d.ts.map +1 -0
  419. package/dist/src/sources/rest/samples/deps-dev.js +47 -0
  420. package/dist/src/sources/rest/samples/deps-dev.js.map +1 -0
  421. package/dist/src/sources/rest/samples/string.d.ts +9 -0
  422. package/dist/src/sources/rest/samples/string.d.ts.map +1 -0
  423. package/dist/src/sources/rest/samples/string.js +42 -0
  424. package/dist/src/sources/rest/samples/string.js.map +1 -0
  425. package/dist/src/sources/rest/selectors.d.ts +41 -0
  426. package/dist/src/sources/rest/selectors.d.ts.map +1 -0
  427. package/dist/src/sources/rest/selectors.js +81 -0
  428. package/dist/src/sources/rest/selectors.js.map +1 -0
  429. package/dist/src/sources/rest/source.d.ts +67 -0
  430. package/dist/src/sources/rest/source.d.ts.map +1 -0
  431. package/dist/src/sources/rest/source.js +650 -0
  432. package/dist/src/sources/rest/source.js.map +1 -0
  433. package/dist/src/sources/rest/templates.d.ts +38 -0
  434. package/dist/src/sources/rest/templates.d.ts.map +1 -0
  435. package/dist/src/sources/rest/templates.js +125 -0
  436. package/dist/src/sources/rest/templates.js.map +1 -0
  437. package/dist/src/sources/run.d.ts +93 -0
  438. package/dist/src/sources/run.d.ts.map +1 -0
  439. package/dist/src/sources/run.js +673 -0
  440. package/dist/src/sources/run.js.map +1 -0
  441. package/dist/src/sources/sha256.d.ts +12 -0
  442. package/dist/src/sources/sha256.d.ts.map +1 -0
  443. package/dist/src/sources/sha256.js +95 -0
  444. package/dist/src/sources/sha256.js.map +1 -0
  445. package/dist/src/sources/sigv4.d.ts +26 -0
  446. package/dist/src/sources/sigv4.d.ts.map +1 -0
  447. package/dist/src/sources/sigv4.js +184 -0
  448. package/dist/src/sources/sigv4.js.map +1 -0
  449. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  450. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  451. package/dist/src/sources/sparql/descriptor.js +64 -0
  452. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  453. package/dist/src/sources/sparql/index.d.ts +28 -0
  454. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  455. package/dist/src/sources/sparql/index.js +314 -0
  456. package/dist/src/sources/sparql/index.js.map +1 -0
  457. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  458. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  459. package/dist/src/sources/sparql/ntriples.js +180 -0
  460. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  461. package/dist/src/sources/sparql/params.d.ts +27 -0
  462. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  463. package/dist/src/sources/sparql/params.js +5 -0
  464. package/dist/src/sources/sparql/params.js.map +1 -0
  465. package/dist/src/sources/sparql/query.d.ts +72 -0
  466. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  467. package/dist/src/sources/sparql/query.js +113 -0
  468. package/dist/src/sources/sparql/query.js.map +1 -0
  469. package/dist/src/sources/testing.d.ts +96 -0
  470. package/dist/src/sources/testing.d.ts.map +1 -0
  471. package/dist/src/sources/testing.js +138 -0
  472. package/dist/src/sources/testing.js.map +1 -0
  473. package/dist/src/sources/types.d.ts +696 -0
  474. package/dist/src/sources/types.d.ts.map +1 -0
  475. package/dist/src/sources/types.js +10 -0
  476. package/dist/src/sources/types.js.map +1 -0
  477. package/dist/src/styles/annotations.d.ts +61 -5
  478. package/dist/src/styles/annotations.d.ts.map +1 -1
  479. package/dist/src/styles/annotations.js +130 -22
  480. package/dist/src/styles/annotations.js.map +1 -1
  481. package/dist/src/styles/canon/bends.d.ts +46 -0
  482. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  483. package/dist/src/styles/canon/bends.js +123 -0
  484. package/dist/src/styles/canon/bends.js.map +1 -1
  485. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  486. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  487. package/dist/src/styles/canon/color-tables.js +10 -4
  488. package/dist/src/styles/canon/color-tables.js.map +1 -1
  489. package/dist/src/styles/canon/color.d.ts +3 -1
  490. package/dist/src/styles/canon/color.d.ts.map +1 -1
  491. package/dist/src/styles/canon/color.js +103 -3
  492. package/dist/src/styles/canon/color.js.map +1 -1
  493. package/dist/src/styles/canon/enums.d.ts +2 -2
  494. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  495. package/dist/src/styles/canon/enums.js +82 -7
  496. package/dist/src/styles/canon/enums.js.map +1 -1
  497. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  498. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  499. package/dist/src/styles/canon/graphviz.js +57 -9
  500. package/dist/src/styles/canon/graphviz.js.map +1 -1
  501. package/dist/src/styles/canon/number.d.ts +8 -0
  502. package/dist/src/styles/canon/number.d.ts.map +1 -1
  503. package/dist/src/styles/canon/number.js +18 -0
  504. package/dist/src/styles/canon/number.js.map +1 -1
  505. package/dist/src/styles/canon/text.d.ts +29 -2
  506. package/dist/src/styles/canon/text.d.ts.map +1 -1
  507. package/dist/src/styles/canon/text.js +156 -16
  508. package/dist/src/styles/canon/text.js.map +1 -1
  509. package/dist/src/styles/codes.d.ts +2 -0
  510. package/dist/src/styles/codes.d.ts.map +1 -1
  511. package/dist/src/styles/codes.js +2 -0
  512. package/dist/src/styles/codes.js.map +1 -1
  513. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  514. package/dist/src/styles/cyjs/cascade.js +1037 -35
  515. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  516. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  517. package/dist/src/styles/cyjs/defaults-table.js +5 -0
  518. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  519. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  520. package/dist/src/styles/cyjs/emit.js +216 -12
  521. package/dist/src/styles/cyjs/emit.js.map +1 -1
  522. package/dist/src/styles/cyjs/face.d.ts +20 -0
  523. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  524. package/dist/src/styles/cyjs/face.js +332 -0
  525. package/dist/src/styles/cyjs/face.js.map +1 -0
  526. package/dist/src/styles/cyjs/mappers.d.ts +48 -2
  527. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  528. package/dist/src/styles/cyjs/mappers.js +463 -26
  529. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  530. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  531. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  532. package/dist/src/styles/cyjs/routes.js +360 -0
  533. package/dist/src/styles/cyjs/routes.js.map +1 -0
  534. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  535. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  536. package/dist/src/styles/cytoscape/charts.js +560 -0
  537. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  538. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  539. package/dist/src/styles/cytoscape/emit.js +204 -44
  540. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  541. package/dist/src/styles/cytoscape/lexicon.d.ts +97 -3
  542. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  543. package/dist/src/styles/cytoscape/lexicon.js +413 -79
  544. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  545. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  546. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  547. package/dist/src/styles/cytoscape/mappings.js +92 -0
  548. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  549. package/dist/src/styles/cytoscape/resolve.d.ts +46 -3
  550. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  551. package/dist/src/styles/cytoscape/resolve.js +632 -22
  552. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  553. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -1
  554. package/dist/src/styles/cytoscape/translate.js +10 -10
  555. package/dist/src/styles/cytoscape/translate.js.map +1 -1
  556. package/dist/src/styles/defaults.d.ts +50 -0
  557. package/dist/src/styles/defaults.d.ts.map +1 -1
  558. package/dist/src/styles/defaults.js +315 -37
  559. package/dist/src/styles/defaults.js.map +1 -1
  560. package/dist/src/styles/index.d.ts +4 -3
  561. package/dist/src/styles/index.d.ts.map +1 -1
  562. package/dist/src/styles/index.js +3 -2
  563. package/dist/src/styles/index.js.map +1 -1
  564. package/dist/src/styles/internal.d.ts +1 -0
  565. package/dist/src/styles/internal.d.ts.map +1 -1
  566. package/dist/src/styles/internal.js +1 -0
  567. package/dist/src/styles/internal.js.map +1 -1
  568. package/dist/src/styles/io/block.d.ts.map +1 -1
  569. package/dist/src/styles/io/block.js +9 -0
  570. package/dist/src/styles/io/block.js.map +1 -1
  571. package/dist/src/styles/io/generic.d.ts.map +1 -1
  572. package/dist/src/styles/io/generic.js +56 -16
  573. package/dist/src/styles/io/generic.js.map +1 -1
  574. package/dist/src/styles/io/round-trip.d.ts +56 -0
  575. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  576. package/dist/src/styles/io/round-trip.js +138 -0
  577. package/dist/src/styles/io/round-trip.js.map +1 -0
  578. package/dist/src/styles/io/writer.d.ts.map +1 -1
  579. package/dist/src/styles/io/writer.js +13 -4
  580. package/dist/src/styles/io/writer.js.map +1 -1
  581. package/dist/src/styles/notes.d.ts.map +1 -1
  582. package/dist/src/styles/notes.js +1 -0
  583. package/dist/src/styles/notes.js.map +1 -1
  584. package/dist/src/styles/plan/features.d.ts +1 -1
  585. package/dist/src/styles/plan/features.d.ts.map +1 -1
  586. package/dist/src/styles/plan/features.js +22 -2
  587. package/dist/src/styles/plan/features.js.map +1 -1
  588. package/dist/src/styles/plan/index.d.ts +1 -1
  589. package/dist/src/styles/plan/index.d.ts.map +1 -1
  590. package/dist/src/styles/plan/index.js +1 -1
  591. package/dist/src/styles/plan/index.js.map +1 -1
  592. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  593. package/dist/src/styles/plan/plan.js +61 -4
  594. package/dist/src/styles/plan/plan.js.map +1 -1
  595. package/dist/src/styles/plan/resolve.d.ts +13 -1
  596. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  597. package/dist/src/styles/plan/resolve.js +53 -6
  598. package/dist/src/styles/plan/resolve.js.map +1 -1
  599. package/dist/src/styles/slots.d.ts +14 -0
  600. package/dist/src/styles/slots.d.ts.map +1 -0
  601. package/dist/src/styles/slots.js +20 -0
  602. package/dist/src/styles/slots.js.map +1 -0
  603. package/dist/src/styles/types.d.ts +638 -5
  604. package/dist/src/styles/types.d.ts.map +1 -1
  605. package/dist/src/styles/vocabulary.d.ts +3 -2
  606. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  607. package/dist/src/styles/vocabulary.js +218 -1
  608. package/dist/src/styles/vocabulary.js.map +1 -1
  609. package/dist/src/types.d.ts +19 -5
  610. package/dist/src/types.d.ts.map +1 -1
  611. package/dist/src/types.js.map +1 -1
  612. package/dist/styles.js +29 -238
  613. package/dist/styles.js.map +1 -1
  614. package/dist/xgmml.js +3 -3
  615. package/docs/samples/people.json +6 -0
  616. package/package.json +53 -8
  617. package/src/common/report.ts +27 -7
  618. package/src/formats/cx/importer.ts +6 -1
  619. package/src/formats/cx/styles.ts +144 -9
  620. package/src/formats/cx2/importer.ts +1 -0
  621. package/src/formats/cx2/styles.ts +3 -1
  622. package/src/formats/cys/importer.ts +1 -0
  623. package/src/formats/cys/styles.ts +27 -5
  624. package/src/formats/dot/drawing.ts +799 -0
  625. package/src/formats/dot/importer.ts +120 -35
  626. package/src/formats/dot/label-places.ts +228 -0
  627. package/src/formats/dot/record.ts +336 -0
  628. package/src/formats/dot/styles.ts +1657 -154
  629. package/src/formats/gexf/dialog-metrics.ts +61 -0
  630. package/src/formats/gexf/importer.ts +50 -5
  631. package/src/formats/gexf/preview.ts +217 -0
  632. package/src/formats/gexf/schema.ts +2 -1
  633. package/src/formats/gexf/styles.ts +1144 -142
  634. package/src/formats/gml/importer.ts +291 -76
  635. package/src/formats/gml/index.ts +1 -1
  636. package/src/formats/gml/positions.ts +29 -7
  637. package/src/formats/gml/styles.ts +854 -111
  638. package/src/formats/graphml/styles-plain.ts +8 -23
  639. package/src/formats/graphml/styles-yed.ts +821 -159
  640. package/src/formats/graphml/styles-yfiles3.ts +485 -63
  641. package/src/formats/graphml/yfiles.ts +19 -6
  642. package/src/formats/json/dialect.ts +41 -5
  643. package/src/formats/json/importer.ts +59 -7
  644. package/src/formats/json/index.ts +1 -0
  645. package/src/formats/json/positions.ts +22 -5
  646. package/src/formats/json/styles.ts +2041 -185
  647. package/src/formats/pajek/draw.ts +458 -0
  648. package/src/formats/pajek/exporter.ts +81 -49
  649. package/src/formats/pajek/importer.ts +278 -103
  650. package/src/formats/pajek/index.ts +1 -0
  651. package/src/formats/pajek/styles.ts +1382 -133
  652. package/src/formats/pajek/syntax.ts +27 -2
  653. package/src/formats/xgmml/emit.ts +73 -5
  654. package/src/formats/xgmml/styles.ts +331 -71
  655. package/src/index.ts +94 -0
  656. package/src/positions/convert.ts +12 -1
  657. package/src/positions/extract.ts +55 -1
  658. package/src/positions/index.ts +1 -0
  659. package/src/positions/types.ts +60 -0
  660. package/src/registry.ts +326 -1
  661. package/src/sources/builtins.ts +63 -0
  662. package/src/sources/codes.ts +235 -0
  663. package/src/sources/context.ts +894 -0
  664. package/src/sources/credentials.ts +409 -0
  665. package/src/sources/cypher/descriptor.ts +131 -0
  666. package/src/sources/cypher/flatten.ts +323 -0
  667. package/src/sources/cypher/index.ts +628 -0
  668. package/src/sources/cypher/params.ts +41 -0
  669. package/src/sources/cypher/profiles.ts +78 -0
  670. package/src/sources/cypher/query-builder.ts +327 -0
  671. package/src/sources/cypher/transports/bolt.ts +228 -0
  672. package/src/sources/cypher/transports/neptune-analytics.ts +41 -0
  673. package/src/sources/cypher/transports/neptune-https.ts +122 -0
  674. package/src/sources/cypher/transports/query-api.ts +100 -0
  675. package/src/sources/cypher/transports/transport.ts +139 -0
  676. package/src/sources/cypher/types-map.ts +418 -0
  677. package/src/sources/define.ts +195 -0
  678. package/src/sources/fail.ts +70 -0
  679. package/src/sources/ids.ts +80 -0
  680. package/src/sources/ndex/client.ts +102 -0
  681. package/src/sources/ndex/descriptor.ts +64 -0
  682. package/src/sources/ndex/expand.ts +100 -0
  683. package/src/sources/ndex/index.ts +235 -0
  684. package/src/sources/ndex/params.ts +17 -0
  685. package/src/sources/ndex/share-url.ts +84 -0
  686. package/src/sources/params.ts +32 -0
  687. package/src/sources/registry.ts +325 -0
  688. package/src/sources/rest/descriptor.ts +79 -0
  689. package/src/sources/rest/index.ts +22 -0
  690. package/src/sources/rest/mapping.ts +401 -0
  691. package/src/sources/rest/openalex.ts +288 -0
  692. package/src/sources/rest/paging.ts +180 -0
  693. package/src/sources/rest/params.ts +243 -0
  694. package/src/sources/rest/records.ts +289 -0
  695. package/src/sources/rest/samples/deps-dev.ts +49 -0
  696. package/src/sources/rest/samples/string.ts +44 -0
  697. package/src/sources/rest/selectors.ts +91 -0
  698. package/src/sources/rest/source.ts +776 -0
  699. package/src/sources/rest/templates.ts +151 -0
  700. package/src/sources/run.ts +793 -0
  701. package/src/sources/sha256.ts +99 -0
  702. package/src/sources/sigv4.ts +209 -0
  703. package/src/sources/sparql/descriptor.ts +67 -0
  704. package/src/sources/sparql/index.ts +356 -0
  705. package/src/sources/sparql/ntriples.ts +219 -0
  706. package/src/sources/sparql/params.ts +28 -0
  707. package/src/sources/sparql/query.ts +162 -0
  708. package/src/sources/testing.ts +210 -0
  709. package/src/sources/types.ts +776 -0
  710. package/src/styles/annotations.ts +201 -27
  711. package/src/styles/canon/bends.ts +137 -0
  712. package/src/styles/canon/color-tables.ts +10 -4
  713. package/src/styles/canon/color.ts +105 -3
  714. package/src/styles/canon/enums.ts +99 -8
  715. package/src/styles/canon/graphviz.ts +71 -10
  716. package/src/styles/canon/number.ts +19 -0
  717. package/src/styles/canon/text.ts +187 -16
  718. package/src/styles/codes.ts +2 -0
  719. package/src/styles/cyjs/cascade.ts +1193 -38
  720. package/src/styles/cyjs/defaults-table.ts +5 -0
  721. package/src/styles/cyjs/emit.ts +247 -16
  722. package/src/styles/cyjs/face.ts +372 -0
  723. package/src/styles/cyjs/mappers.ts +498 -28
  724. package/src/styles/cyjs/routes.ts +432 -0
  725. package/src/styles/cytoscape/charts.ts +684 -0
  726. package/src/styles/cytoscape/emit.ts +220 -44
  727. package/src/styles/cytoscape/lexicon.ts +459 -80
  728. package/src/styles/cytoscape/mappings.ts +108 -0
  729. package/src/styles/cytoscape/resolve.ts +763 -23
  730. package/src/styles/cytoscape/translate.ts +11 -11
  731. package/src/styles/defaults.ts +436 -38
  732. package/src/styles/index.ts +5 -0
  733. package/src/styles/internal.ts +1 -0
  734. package/src/styles/io/block.ts +10 -0
  735. package/src/styles/io/generic.ts +79 -23
  736. package/src/styles/io/round-trip.ts +202 -0
  737. package/src/styles/io/writer.ts +14 -4
  738. package/src/styles/notes.ts +1 -0
  739. package/src/styles/plan/features.ts +23 -2
  740. package/src/styles/plan/index.ts +1 -1
  741. package/src/styles/plan/plan.ts +69 -5
  742. package/src/styles/plan/resolve.ts +61 -6
  743. package/src/styles/slots.ts +25 -0
  744. package/src/styles/types.ts +658 -4
  745. package/src/styles/vocabulary.ts +226 -3
  746. package/src/types.ts +19 -5
  747. package/dist/chunks/block-DiGq58c3.js.map +0 -1
  748. package/dist/chunks/choose--jM0yYCo.js +0 -57
  749. package/dist/chunks/choose--jM0yYCo.js.map +0 -1
  750. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  751. package/dist/chunks/emit-CwU8cUmG.js.map +0 -1
  752. package/dist/chunks/export-BvqAXCKh.js.map +0 -1
  753. package/dist/chunks/exporter-CrDWIyiq.js.map +0 -1
  754. package/dist/chunks/format-BpQBx8MZ.js.map +0 -1
  755. package/dist/chunks/generic-Dq1ntt9q.js.map +0 -1
  756. package/dist/chunks/importer-BSvfrX_h.js.map +0 -1
  757. package/dist/chunks/importer-CMmeMWlC.js.map +0 -1
  758. package/dist/chunks/importer-COTK9Tsl.js.map +0 -1
  759. package/dist/chunks/importer-DiZRmOQG.js.map +0 -1
  760. package/dist/chunks/importer-e6LGpqHB.js.map +0 -1
  761. package/dist/chunks/importer-iFYPEKaJ.js.map +0 -1
  762. package/dist/chunks/importer-yh_aBCU6.js.map +0 -1
  763. package/dist/chunks/lexicon-CT69Kd87.js.map +0 -1
  764. package/dist/chunks/styles-BQnsga7p.js.map +0 -1
  765. package/dist/chunks/styles-D3fRphrO.js +0 -690
  766. package/dist/chunks/styles-D3fRphrO.js.map +0 -1
  767. package/dist/chunks/styles-yed-BF5x3_Y5.js +0 -842
  768. package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
  769. package/dist/chunks/writer-DMKvthQE.js +0 -448
  770. package/dist/chunks/writer-DMKvthQE.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-DPQQIig4.js","sources":["../../src/formats/gexf/schema.ts","../../src/formats/gexf/dialog-metrics.ts","../../src/formats/gexf/preview.ts","../../src/formats/gexf/styles.ts"],"sourcesContent":["/**\n * What the GEXF importer and exporter share (research note 07 section 2.1, design sections 5.1,\n * 5.5, 5.6 and 5.10): the namespaces of the two supported versions, the fixed names and\n * declarations of the columns derived from XML attributes and viz elements (design section 5.6:\n * XML-attribute-derived columns have fixed names and roles, and a declared attribute that would\n * take one of them is renamed `<name>#<id>`), the shape of a temporal extension table, and the\n * declared-type table of each version for the exporter.\n */\n\nimport { type ColumnDecl, type Dtype } from \"@graphty/graph-format\";\n\nimport { TIME_TEXT_ROLE, TIME_TEXT_SUFFIX } from \"../../common/temporal.js\";\n\n/**\n * The GEXF versions the exporter writes.\n * @category Built-in formats\n */\nexport type GexfVersion = \"1.2\" | \"1.3\";\n\n/**\n * The format name.\n * @category Plugin helpers\n */\nexport const GEXF_FORMAT = \"gexf\";\n\n/**\n * The namespace URIs of each version.\n * @category Plugin helpers\n */\nexport const GEXF_NAMESPACES: Readonly<Record<GexfVersion, { readonly gexf: string; readonly viz: string }>> = {\n \"1.2\": { gexf: \"http://www.gexf.net/1.2draft\", viz: \"http://www.gexf.net/1.2draft/viz\" },\n \"1.3\": { gexf: \"http://gexf.net/1.3\", viz: \"http://gexf.net/1.3/viz\" },\n};\n\n/**\n * The default edge type values of `<graph defaultedgetype>` and `<edge type>`.\n * @category Plugin helpers\n */\nexport type GexfEdgeType = \"directed\" | \"undirected\" | \"mutual\";\n\n/**\n * The GEXF `timeformat` values.\n * @category Plugin helpers\n */\nexport const TIME_FORMATS: ReadonlySet<string> = new Set([\"integer\", \"double\", \"date\", \"dateTime\"]);\n\n/**\n * The GEXF graph `mode` values.\n * @category Plugin helpers\n */\nexport const GRAPH_MODES: ReadonlySet<string> = new Set([\"static\", \"dynamic\", \"slice\"]);\n\n/**\n * The GEXF 1.3 `timerepresentation` values.\n * @category Plugin helpers\n */\nexport const TIME_REPRESENTATIONS: ReadonlySet<string> = new Set([\"interval\", \"timestamp\"]);\n\n/**\n * The `origin.namespace` of viz-derived columns.\n * @category Plugin helpers\n */\nexport const VIZ_NAMESPACE = \"viz\";\n\n/** The origin every XML-derived column declares. */\nconst XML_ORIGIN = { format: GEXF_FORMAT };\n\n/** The origin of every viz-derived column. */\nconst VIZ_ORIGIN = { format: GEXF_FORMAT, namespace: VIZ_NAMESPACE };\n\n/**\n * The fixed node column names the importer owns (design section 5.6): a declared attribute with\n * one of these titles is renamed `<title>#<id>` so the XML-derived column keeps its name and role.\n *\n * Deprecated, unchanged until the next major version: the viz role columns (`color`, `size`,\n * `shape`, `shape.uri`, and on edges `color`, `thickness`, `shape`) and the rename of an attribute\n * titled like one. The GEXF style reader (styles.ts) is the only code that turns them into\n * drawing; in the next major they leave the import result.\n * @category Plugin helpers\n */\nexport const NODE_COLUMNS = Object.freeze({\n label: \"label\",\n parent: \"parent\",\n parents: \"parents\",\n start: \"start\",\n end: \"end\",\n timestamp: \"timestamp\",\n spells: \"spells\",\n spellsOpen: \"spells.open\",\n timestamps: \"timestamps\",\n open: \"open\",\n position: \"position\",\n color: \"color\",\n size: \"size\",\n shape: \"shape\",\n shapeUri: \"shape.uri\",\n});\n\n/** The fixed edge column names the importer owns. */\nconst EDGE_COLUMNS = Object.freeze({\n id: \"id\",\n label: \"label\",\n kind: \"kind\",\n start: \"start\",\n end: \"end\",\n timestamp: \"timestamp\",\n spells: \"spells\",\n spellsOpen: \"spells.open\",\n timestamps: \"timestamps\",\n open: \"open\",\n color: \"color\",\n thickness: \"thickness\",\n shape: \"shape\",\n});\n\n/**\n * Every reserved node column name, including the temporal companions.\n * @category Plugin helpers\n */\nexport const RESERVED_NODE_NAMES: ReadonlySet<string> = new Set([\n ...Object.values(NODE_COLUMNS),\n NODE_COLUMNS.start + TIME_TEXT_SUFFIX,\n NODE_COLUMNS.end + TIME_TEXT_SUFFIX,\n NODE_COLUMNS.timestamp + TIME_TEXT_SUFFIX,\n]);\n\n/**\n * Every reserved edge column name, including the temporal companions.\n * @category Plugin helpers\n */\nexport const RESERVED_EDGE_NAMES: ReadonlySet<string> = new Set([\n ...Object.values(EDGE_COLUMNS),\n EDGE_COLUMNS.start + TIME_TEXT_SUFFIX,\n EDGE_COLUMNS.end + TIME_TEXT_SUFFIX,\n EDGE_COLUMNS.timestamp + TIME_TEXT_SUFFIX,\n]);\n\n/**\n * The declarations of the XML-derived node columns, keyed as NODE_COLUMNS.\n * @category Plugin helpers\n */\nexport const NODE_DECLS: Readonly<Record<keyof typeof NODE_COLUMNS, ColumnDecl>> = {\n label: { name: NODE_COLUMNS.label, dtype: \"string\", role: \"label\", nullable: true, origin: XML_ORIGIN },\n parent: {\n name: NODE_COLUMNS.parent,\n dtype: \"u32\",\n role: \"parent\",\n refersTo: \"node\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n parents: {\n name: NODE_COLUMNS.parents,\n dtype: \"list\",\n itemDtype: \"u32\",\n role: \"parents\",\n refersTo: \"node\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n start: { name: NODE_COLUMNS.start, dtype: \"f64\", role: \"start\", nullable: true, origin: XML_ORIGIN },\n end: { name: NODE_COLUMNS.end, dtype: \"f64\", role: \"end\", nullable: true, origin: XML_ORIGIN },\n timestamp: { name: NODE_COLUMNS.timestamp, dtype: \"f64\", role: \"timestamp\", nullable: true, origin: XML_ORIGIN },\n spells: {\n name: NODE_COLUMNS.spells,\n dtype: \"list\",\n itemDtype: \"f64\",\n itemComponents: 2,\n role: \"spells\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n timestamps: {\n name: NODE_COLUMNS.timestamps,\n dtype: \"list\",\n itemDtype: \"f64\",\n role: \"timestamps\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n open: { name: NODE_COLUMNS.open, dtype: \"u8\", role: \"open\", nullable: true, origin: XML_ORIGIN },\n spellsOpen: {\n name: NODE_COLUMNS.spellsOpen,\n dtype: \"list\",\n itemDtype: \"u8\",\n role: \"spellsOpen\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n position: {\n name: NODE_COLUMNS.position,\n dtype: \"f64\",\n components: 3,\n role: \"position\",\n mutable: true,\n nullable: true,\n origin: VIZ_ORIGIN,\n // Gephi puts a node with no viz:position at the origin (gexf-specimen-node-sizes-opacity: position-none)\n extra: { units: \"file\", originUnplaced: true },\n },\n color: {\n name: NODE_COLUMNS.color,\n dtype: \"f32\",\n components: 4,\n role: \"color\",\n nullable: true,\n origin: VIZ_ORIGIN,\n },\n size: { name: NODE_COLUMNS.size, dtype: \"f32\", role: \"size\", nullable: true, origin: VIZ_ORIGIN },\n shape: { name: NODE_COLUMNS.shape, dtype: \"dict\", role: \"shape\", nullable: true, origin: VIZ_ORIGIN },\n shapeUri: { name: NODE_COLUMNS.shapeUri, dtype: \"string\", nullable: true, origin: VIZ_ORIGIN },\n};\n\n/**\n * The declarations of the XML-derived edge columns, keyed as EDGE_COLUMNS.\n * @category Plugin helpers\n */\nexport const EDGE_DECLS: Readonly<Record<keyof typeof EDGE_COLUMNS, ColumnDecl>> = {\n id: { name: EDGE_COLUMNS.id, dtype: \"string\", role: \"id\", unique: true, nullable: true, origin: XML_ORIGIN },\n label: { name: EDGE_COLUMNS.label, dtype: \"string\", role: \"label\", nullable: true, origin: XML_ORIGIN },\n kind: { name: EDGE_COLUMNS.kind, dtype: \"dict\", role: \"kind\", nullable: true, origin: XML_ORIGIN },\n start: { name: EDGE_COLUMNS.start, dtype: \"f64\", role: \"start\", nullable: true, origin: XML_ORIGIN },\n end: { name: EDGE_COLUMNS.end, dtype: \"f64\", role: \"end\", nullable: true, origin: XML_ORIGIN },\n timestamp: { name: EDGE_COLUMNS.timestamp, dtype: \"f64\", role: \"timestamp\", nullable: true, origin: XML_ORIGIN },\n spells: {\n name: EDGE_COLUMNS.spells,\n dtype: \"list\",\n itemDtype: \"f64\",\n itemComponents: 2,\n role: \"spells\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n timestamps: {\n name: EDGE_COLUMNS.timestamps,\n dtype: \"list\",\n itemDtype: \"f64\",\n role: \"timestamps\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n open: { name: EDGE_COLUMNS.open, dtype: \"u8\", role: \"open\", nullable: true, origin: XML_ORIGIN },\n spellsOpen: {\n name: EDGE_COLUMNS.spellsOpen,\n dtype: \"list\",\n itemDtype: \"u8\",\n role: \"spellsOpen\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n color: {\n name: EDGE_COLUMNS.color,\n dtype: \"f32\",\n components: 4,\n role: \"color\",\n nullable: true,\n origin: VIZ_ORIGIN,\n },\n thickness: { name: EDGE_COLUMNS.thickness, dtype: \"f32\", role: \"thickness\", nullable: true, origin: VIZ_ORIGIN },\n shape: { name: EDGE_COLUMNS.shape, dtype: \"dict\", role: \"shape\", nullable: true, origin: VIZ_ORIGIN },\n};\n\n/**\n * The bit of the `open` column marking an open start (design section 5.1).\n * @category Plugin helpers\n */\nexport const OPEN_START = 1;\n\n/**\n * The bit of the `open` column marking an open end.\n * @category Plugin helpers\n */\nexport const OPEN_END = 2;\n\n/** The prefix of a temporal extension table's name (design section 5.10). */\nconst TEMPORAL_TABLE_PREFIX = \"temporal:\";\n\n/**\n * The column names of a temporal extension table (design section 5.10).\n * @category Plugin helpers\n */\nexport const TEMPORAL_COLUMNS = Object.freeze({\n element: \"element\",\n start: \"start\",\n end: \"end\",\n value: \"value\",\n open: \"open\",\n startText: `start${TIME_TEXT_SUFFIX}`,\n endText: `end${TIME_TEXT_SUFFIX}`,\n valueText: `value${TIME_TEXT_SUFFIX}`,\n});\n\n/**\n * The name of the temporal extension table of a dynamic attribute.\n * @param domain - node or edge\n * @param column - the static column's name\n * @returns `temporal:<domain>:<column>`\n * @category Plugin helpers\n */\nexport function temporalTableName(domain: \"node\" | \"edge\", column: string): string {\n return `${TEMPORAL_TABLE_PREFIX}${domain}:${column}`;\n}\n\n/**\n * Split a temporal table name into its domain and column.\n * @param name - the table name\n * @returns the parts, or null when the name is not a temporal table's\n * @category Plugin helpers\n */\nexport function parseTemporalTableName(name: string): { domain: \"node\" | \"edge\"; column: string } | null {\n if (!name.startsWith(TEMPORAL_TABLE_PREFIX)) {\n return null;\n }\n const rest = name.slice(TEMPORAL_TABLE_PREFIX.length);\n const colon = rest.indexOf(\":\");\n if (colon < 0) {\n return null;\n }\n const domain = rest.slice(0, colon);\n if (domain !== \"node\" && domain !== \"edge\") {\n return null;\n }\n return { domain, column: rest.slice(colon + 1) };\n}\n\n/**\n * The column declarations of a temporal extension table (design section 5.10): the element index,\n * the interval, the value in the attribute's dtype, the interval's text companions, an open-bounds\n * byte and, for a temporal-typed attribute, the value's text companion.\n * @param domain - the domain the element column refers to\n * @param value - the value column's declaration fields (dtype, itemDtype, options...)\n * @param temporalValue - whether the value is itself a temporal type needing a text companion\n * @returns the declarations in table order\n * @category Plugin helpers\n */\nexport function temporalTableDecls(\n domain: \"node\" | \"edge\",\n value: Pick<ColumnDecl, \"dtype\" | \"itemDtype\" | \"options\" | \"origin\">,\n temporalValue: boolean,\n): ColumnDecl[] {\n const decls: ColumnDecl[] = [\n { name: TEMPORAL_COLUMNS.element, dtype: \"u32\", refersTo: domain, nullable: false },\n { name: TEMPORAL_COLUMNS.start, dtype: \"f64\", role: \"start\", nullable: true },\n { name: TEMPORAL_COLUMNS.end, dtype: \"f64\", role: \"end\", nullable: true },\n { name: TEMPORAL_COLUMNS.value, ...value, nullable: true },\n {\n name: TEMPORAL_COLUMNS.startText,\n dtype: \"string\",\n role: TIME_TEXT_ROLE,\n nullable: true,\n extra: { for: TEMPORAL_COLUMNS.start },\n },\n { name: TEMPORAL_COLUMNS.endText, dtype: \"string\", nullable: true, extra: { for: TEMPORAL_COLUMNS.end } },\n { name: TEMPORAL_COLUMNS.open, dtype: \"u8\", role: \"open\", nullable: true },\n ];\n if (temporalValue) {\n decls.push({\n name: TEMPORAL_COLUMNS.valueText,\n dtype: \"string\",\n nullable: true,\n extra: { for: TEMPORAL_COLUMNS.value },\n });\n }\n return decls;\n}\n\n/** The scalar type names GEXF 1.2 declares. */\nconst TYPES_1_2: ReadonlySet<string> = new Set([\"integer\", \"long\", \"double\", \"float\", \"boolean\", \"string\", \"anyURI\"]);\n\n/** The scalar type names GEXF 1.3 declares (the list variants are derived). */\nconst TYPES_1_3: ReadonlySet<string> = new Set([\n ...TYPES_1_2,\n \"bigdecimal\",\n \"biginteger\",\n \"byte\",\n \"char\",\n \"short\",\n \"date\",\n \"dateTime\",\n]);\n\n/**\n * Whether a declared type text is a scalar type of a version (case-sensitive, as the schema spells\n * them).\n * @param type - the type text\n * @param version - the target version\n * @returns true when the version declares it\n * @category Plugin helpers\n */\nexport function isScalarType(type: string, version: GexfVersion): boolean {\n return (version === \"1.2\" ? TYPES_1_2 : TYPES_1_3).has(type);\n}\n\n/**\n * Whether a declared type text is a list type of a version: `liststring` in 1.2, `list<scalar>` in 1.3.\n * @param type - the type text\n * @param version - the target version\n * @returns true when the version declares it\n * @category Plugin helpers\n */\nexport function isListType(type: string, version: GexfVersion): boolean {\n if (version === \"1.2\") {\n return type === \"liststring\";\n }\n return type.startsWith(\"list\") && type.length > 4 && isScalarType(type.slice(4), \"1.3\");\n}\n\n/**\n * The canonical GEXF scalar type of a column dtype (design section 5.1 reversed).\n * @param dtype - a scalar dtype\n * @returns the type text; u32 becomes `long` (its range exceeds `integer`), u8 `integer`, json `string`\n * @category Plugin helpers\n */\nexport function canonicalScalarType(dtype: Dtype): string {\n switch (dtype) {\n case \"bool\":\n return \"boolean\";\n case \"i32\":\n case \"u8\":\n return \"integer\";\n case \"u32\":\n return \"long\";\n case \"f32\":\n return \"float\";\n case \"f64\":\n return \"double\";\n case \"dict\":\n case \"string\":\n case \"json\":\n case \"list\":\n return \"string\";\n default: {\n const name: string = dtype;\n return name;\n }\n }\n}\n","/**\n * The advance widths of Java's logical font \"Dialog\" (DejaVu Sans on the Linux JRE the Gephi oracle runs on), which\n * Gephi measures its node labels with, in thousandths of an em: what Font.getStringBounds gives for one character with\n * fractional metrics on (Temurin JDK 17, Font(\"Dialog\").deriveFont(1000f).getStringBounds). No kerning\n * (\"AV\" is A + V). Its line box is 1.1640625 em tall (ascent plus descent, no leading).\n */\n\n/** The widths of U+0020 .. U+007E. */\nconst ASCII = [\n 318, 401, 460, 838, 636, 950, 780, 275, 390, 390, 500, 838, 318, 361, 318, 337, 636, 636, 636, 636, 636, 636, 636,\n 636, 636, 636, 337, 337, 838, 838, 838, 531, 1000, 684, 686, 698, 770, 632, 575, 775, 752, 295, 295, 656, 557, 863,\n 748, 787, 603, 787, 695, 635, 611, 732, 684, 989, 685, 611, 685, 390, 337, 390, 838, 500, 500, 613, 635, 550, 635,\n 615, 352, 635, 634, 278, 278, 579, 278, 974, 634, 612, 635, 635, 411, 521, 392, 634, 592, 818, 592, 592, 525, 636,\n 337, 636, 838,\n];\n\n/** The widths of U+00A0 .. U+024F (Latin-1 Supplement, Latin Extended-A and -B). */\nconst LATIN = [\n 318, 401, 636, 636, 636, 636, 337, 500, 500, 1000, 471, 612, 838, 361, 1000, 500, 500, 838, 401, 401, 500, 636, 636,\n 318, 500, 401, 471, 612, 969, 969, 969, 531, 684, 684, 684, 684, 684, 684, 974, 698, 632, 632, 632, 632, 295, 295,\n 295, 295, 775, 748, 787, 787, 787, 787, 787, 838, 787, 732, 732, 732, 732, 611, 605, 630, 613, 613, 613, 613, 613,\n 613, 982, 550, 615, 615, 615, 615, 278, 278, 278, 278, 612, 634, 612, 612, 612, 612, 612, 838, 612, 634, 634, 634,\n 634, 592, 635, 592, 684, 613, 684, 613, 684, 613, 698, 550, 698, 550, 698, 550, 698, 550, 770, 635, 775, 635, 632,\n 615, 632, 615, 632, 615, 632, 615, 632, 615, 775, 635, 775, 635, 775, 635, 775, 635, 752, 634, 916, 695, 295, 278,\n 295, 278, 295, 278, 295, 278, 295, 278, 590, 556, 295, 278, 656, 579, 579, 557, 278, 557, 278, 557, 375, 557, 342,\n 562, 284, 748, 634, 748, 634, 748, 634, 813, 748, 634, 787, 612, 787, 612, 787, 612, 1070, 1023, 695, 411, 695, 411,\n 695, 411, 635, 521, 635, 521, 635, 521, 635, 521, 611, 392, 611, 392, 611, 392, 732, 634, 732, 634, 732, 634, 732,\n 634, 732, 634, 732, 634, 989, 818, 611, 592, 611, 685, 525, 685, 525, 685, 525, 352, 635, 735, 686, 635, 686, 635,\n 703, 698, 550, 775, 819, 686, 635, 612, 632, 787, 614, 575, 352, 775, 687, 984, 354, 295, 746, 579, 278, 592, 974,\n 748, 634, 787, 913, 612, 949, 759, 652, 635, 695, 635, 521, 632, 336, 392, 611, 392, 611, 858, 634, 764, 721, 744,\n 730, 685, 525, 666, 666, 578, 525, 636, 666, 578, 510, 635, 295, 492, 459, 295, 1422, 1299, 1154, 835, 787, 457,\n 931, 924, 797, 684, 613, 295, 278, 787, 612, 732, 634, 732, 634, 732, 634, 732, 634, 732, 634, 615, 684, 613, 684,\n 613, 974, 982, 775, 635, 775, 635, 656, 579, 787, 612, 787, 612, 666, 578, 278, 1422, 1299, 1154, 775, 635, 1113,\n 682, 748, 634, 684, 613, 974, 982, 787, 612, 684, 613, 684, 613, 632, 615, 632, 615, 295, 278, 295, 278, 787, 612,\n 787, 612, 695, 411, 695, 411, 732, 634, 732, 634, 635, 521, 611, 392, 627, 521, 752, 634, 735, 838, 698, 610, 685,\n 525, 684, 613, 632, 615, 787, 612, 787, 612, 787, 612, 787, 612, 611, 592, 475, 843, 477, 278, 998, 998, 684, 698,\n 550, 557, 611, 521, 525, 603, 479, 686, 732, 684, 632, 615, 295, 278, 781, 635, 695, 411, 611, 592,\n];\n\n/** How tall Dialog's line box is, in ems: what getStringBounds gives as a string's height. */\nexport const DIALOG_LINE_HEIGHT = 1.1640625;\n\n/**\n * How wide Dialog draws a text, in ems.\n * @param text - the text\n * @returns its advance width\n */\nexport function dialogWidth(text: string): number {\n let sum = 0;\n for (const ch of text) {\n const c = ch.codePointAt(0) ?? 0;\n // ponytail: a character outside the table (CJK and other scripts Java falls back to another font for) is\n // counted a full em; a measured table per script when a sample needs it\n if (c >= 32 && c < 127) {\n sum += ASCII[c - 32];\n } else {\n sum += c >= 160 && c < 0x250 ? LATIN[c - 160] : 1000;\n }\n }\n return sum / 1000;\n}\n","/**\n * Gephi's Preview settings: what Gephi keeps in its project, not in a GEXF file, and how each one changes the\n * drawing. Every rule here was measured on the Gephi Toolkit 0.11.3's SVG export of the GEXF specimen sheets\n * (`graph-io/test/fidelity/specimens/gexf/pages.json`, one Preview setting per page).\n */\n\nimport type { StyleValue } from \"../../styles/types.js\";\n\n/**\n * Gephi's Preview defaults as the Gephi Toolkit 0.11.3 spells them (a fresh PreviewModel), with node labels shown,\n * as graph-io has always drawn a GEXF file.\n */\nconst GEPHI_PREVIEW: Readonly<Record<string, string>> = Object.freeze({\n \"edge.show\": \"true\",\n \"edge.thickness\": \"1.0\",\n \"edge.use-weight\": \"true\",\n \"edge.rescale-weight\": \"false\",\n \"edge.rescale-weight.min\": \"0.4\",\n \"edge.rescale-weight.max\": \"8.0\",\n \"edge.color\": \"mixed\",\n \"edge.opacity\": \"100.0\",\n \"edge.curved\": \"true\",\n \"arrow.size\": \"3.0\",\n \"node.border.fixed\": \"false\",\n \"node.border.width\": \"1.0\",\n \"node.border.color\": \"darker\",\n \"node.opacity\": \"100.0\",\n \"node.per.node.opacity\": \"false\",\n \"node.label.show\": \"true\",\n \"node.label.customFont\": \"false\",\n \"node.label.font\": \"Dialog,plain,12\",\n \"node.label.proportinalSize\": \"true\",\n \"node.label.color\": \"#000000\",\n \"node.label.shorten\": \"false\",\n \"node.label.avoidOverlap\": \"true\",\n \"node.label.overlapGridSize\": \"10\",\n \"node.label.scale\": \"1.0\",\n \"node.label.max-char\": \"30\",\n \"node.label.outline.size\": \"0.0\",\n \"node.label.outline.color\": \"#ffffff\",\n \"node.label.outline.opacity\": \"80.0\",\n \"node.label.box\": \"false\",\n \"node.label.box.color\": \"parent\",\n \"node.label.box.opacity\": \"100.0\",\n \"edge.label.show\": \"false\",\n \"edge.label.customFont\": \"false\",\n \"edge.label.font\": \"Dialog,plain,10\",\n \"edge.label.color\": \"original\",\n \"edge.label.shorten\": \"false\",\n \"edge.label.max-char\": \"30\",\n \"edge.label.outline.size\": \"0.0\",\n \"edge.label.outline.color\": \"#ffffff\",\n \"edge.label.outline.opacity\": \"80.0\",\n});\n\n/** A Java Font as Gephi's Preview writes it: `Family,style,size`. */\nexport interface GephiFont {\n readonly family: string;\n readonly bold: boolean;\n readonly italic: boolean;\n readonly size: number;\n}\n\n/** The Preview settings a drawing was made with: Gephi's defaults under the ones given. */\nexport class GephiPreview {\n private readonly values: Readonly<Record<string, string>>;\n\n /**\n * The settings: Gephi's defaults under the ones given.\n * @param given - the settings given, by Gephi's property names\n */\n constructor(given: Readonly<Record<string, string>> = {}) {\n this.values = { ...GEPHI_PREVIEW, ...given };\n }\n\n /**\n * A setting's text, trimmed and lower case.\n * @param name - the property\n * @returns the text\n */\n text(name: string): string {\n return (this.values[name] ?? \"\").trim().toLowerCase();\n }\n\n /**\n * A boolean setting.\n * @param name - the property\n * @returns its value\n */\n on(name: string): boolean {\n return this.text(name) === \"true\";\n }\n\n /**\n * A number setting; Gephi's default where the text is not a number.\n * @param name - the property\n * @returns its value\n */\n num(name: string): number {\n const v = Number(this.text(name));\n return Number.isFinite(v) ? v : Number(GEPHI_PREVIEW[name] ?? 0);\n }\n\n /**\n * The font of node or edge labels: the given font when `<target>.label.customFont` is on, else Gephi's.\n * @param target - \"node\" or \"edge\"\n * @returns the font\n */\n font(target: \"node\" | \"edge\"): GephiFont {\n const name = `${target}.label.font`;\n const raw = this.on(`${target}.label.customFont`) ? (this.values[name] ?? \"\") : (GEPHI_PREVIEW[name] ?? \"\");\n const [family = \"Dialog\", style = \"plain\", size = \"\"] = raw.split(\",\").map((s) => s.trim());\n const s = style.toLowerCase();\n const pt = Number(size);\n const fallback = target === \"node\" ? 12 : 10;\n return {\n family,\n bold: s.includes(\"bold\"),\n italic: s.includes(\"italic\"),\n size: Number.isFinite(pt) && pt > 0 ? pt : fallback,\n };\n }\n}\n\n/**\n * A label as Gephi's shorten setting cuts it: only a label of at least max-char + 3 characters, to its first max-char\n * characters and \"...\" (`gexf-specimen-labels-p7`, `-p8`).\n * @param label - the label\n * @param max - max-char\n * @returns the label drawn\n */\nfunction shortened(label: string, max: number): string {\n return label.length >= max + 3 ? `${label.slice(0, max)}...` : label;\n}\n\n/**\n * A color derived from another as Gephi's DependantColor modes derive it: `darker` halves each channel, `lighter`\n * raises each by half (to 255 at most), `parent` (and `original`) is the color itself, `#rrggbb` is that color.\n * @param mode - the mode, lower case\n * @param parent - the color it derives from, r, g and b 0..255\n * @returns the color as r, g and b, or null for a mode Gephi does not have\n */\nexport function dependantColor(mode: string, parent: readonly number[]): number[] | null {\n switch (mode) {\n case \"darker\":\n return parent.slice(0, 3).map((v) => Math.floor(v / 2));\n case \"lighter\":\n return parent.slice(0, 3).map((v) => Math.min(255, Math.floor(v * 1.5)));\n case \"parent\":\n case \"original\":\n return parent.slice(0, 3);\n default: {\n const m = /^#([0-9a-f]{6})$/.exec(mode);\n if (m === null) {\n return null;\n }\n const n = Number.parseInt(m[1], 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n }\n }\n}\n\n/**\n * The labels drawn: none when `<target>.label.show` is off, each cut when `<target>.label.shorten` is on, and, unless\n * the file keeps its own values, with its line breaks left out, as Java's `drawString` draws a label on one line with\n * nothing for a break (\"line one\\nline two\" is drawn \"line oneline two\": Gephi Toolkit 0.11.3's preview and PNG\n * export, `gexf-specimen-labels`).\n * @param labels - each element's label, or undefined when none has one\n * @param preview - the settings\n * @param target - \"node\" or \"edge\"\n * @param kept - whether the file keeps its own values (a `graphty.styles` block): its line breaks are drawn\n * @returns the labels drawn, or undefined for none\n */\nexport function drawnLabels(\n labels: readonly (StyleValue | null)[] | undefined,\n preview: GephiPreview,\n target: \"node\" | \"edge\",\n kept = false,\n): (StyleValue | null)[] | undefined {\n if (labels === undefined || !preview.on(`${target}.label.show`)) {\n return undefined;\n }\n const max = preview.on(`${target}.label.shorten`) ? preview.num(`${target}.label.max-char`) : Infinity;\n const drawn = (l: string): string => (kept ? l : l.replaceAll(/[\\r\\n]/g, \"\"));\n return labels.map((l) => (typeof l === \"string\" ? drawn(shortened(l, max)) : l));\n}\n\n/**\n * Each edge's weight as Gephi draws its thickness: with `edge.use-weight` off, `edge.thickness`; else the weight,\n * rescaled linearly from the smallest and largest drawn weights to `edge.rescale-weight.min` .. `.max` when\n * `edge.rescale-weight` is on, times `edge.thickness` (`gexf-specimen-edges-lines-p8` .. `-p11`).\n * @param weights - each edge's weight\n * @param drawn - whether each edge is drawn\n * @param preview - the settings\n * @returns each edge's thickness\n */\nexport function edgeThickness(weights: readonly number[], drawn: readonly boolean[], preview: GephiPreview): number[] {\n const thickness = preview.num(\"edge.thickness\");\n if (!preview.on(\"edge.use-weight\")) {\n return weights.map(() => thickness);\n }\n if (!preview.on(\"edge.rescale-weight\")) {\n return weights.map((w) => w * thickness);\n }\n // loops, not Math.min(...): a spread of every edge overflows the call stack on a large graph\n let lo = Infinity;\n let hi = -Infinity;\n weights.forEach((w, e) => {\n if (drawn[e]) {\n lo = Math.min(lo, w);\n hi = Math.max(hi, w);\n }\n });\n const min = preview.num(\"edge.rescale-weight.min\");\n const max = preview.num(\"edge.rescale-weight.max\");\n return weights.map((w) => (hi > lo ? min + ((w - lo) / (hi - lo)) * (max - min) : min) * thickness);\n}\n","/**\n * GEXF styles: reading the viz module (`viz:color`, `viz:size`, `viz:shape`, `viz:thickness`) into the neutral\n * style vocabulary with Gephi's defaults, and writing a graph's styles back into the viz module, with graphty's\n * `graphty.styles` block in `<meta>` (in graphty's own XML namespace, which graph-io, NetworkX's `read_gexf` and\n * Gephi's GEXF importer all skip) and the per-element style values the block reads as ordinary attributes.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { explicitWeights } from \"../../common/weights.js\";\nimport { canonColor } from \"../../styles/canon/color.js\";\nimport { canonEnum } from \"../../styles/canon/enums.js\";\nimport { canonNumber } from \"../../styles/canon/number.js\";\nimport type { CanonSite } from \"../../styles/canon/site.js\";\nimport { canonText } from \"../../styles/canon/text.js\";\nimport { StyleApproximations } from \"../../styles/io/approximations.js\";\nimport { STYLE_BLOCK_NAME } from \"../../styles/io/block.js\";\nimport { type ElementValues, takeFromBlock } from \"../../styles/io/round-trip.js\";\nimport type { ExporterStyleInput } from \"../../styles/io/writer.js\";\nimport { StyleNotes } from \"../../styles/notes.js\";\nimport { plainCell } from \"../../styles/plan/resolve.js\";\nimport type {\n ImporterStyles,\n StyleColumn,\n StyleReadContext,\n StyleRule,\n StyleTarget,\n StyleValue,\n StyleWriteCapabilities,\n} from \"../../styles/types.js\";\nimport type { LossNote } from \"../../types.js\";\nimport { DIALOG_LINE_HEIGHT, dialogWidth } from \"./dialog-metrics.js\";\nimport { dependantColor, drawnLabels, edgeThickness, type GephiFont, GephiPreview } from \"./preview.js\";\nimport { NODE_COLUMNS, TEMPORAL_COLUMNS, temporalTableName, VIZ_NAMESPACE } from \"./schema.js\";\n\n/** The column of a node's `label` attribute. */\nconst LABEL_COLUMN = NODE_COLUMNS.label;\n\n/**\n * The XML namespace of graphty's own elements in a GEXF file (the `graphty.styles` block inside `<meta>`).\n * @category Built-in formats\n */\nexport const GRAPHTY_XML_NAMESPACE = \"https://graphty.app/ns/gexf\";\n\n/**\n * What the GEXF writer holds natively: a node's `label` attribute, the viz module's color (with its alpha), size, shape and\n * thickness, and the edge line shape. The block goes into `<meta>`.\n * @category Built-in formats\n */\nexport const GEXF_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({\n tool: \"gephi\",\n node: Object.freeze([\"label\", \"fill\", \"fillOpacity\", \"width\", \"height\", \"shape\", \"image\"] as const),\n edge: Object.freeze([\"color\", \"opacity\", \"width\", \"lineStyle\"] as const),\n block: \"native\",\n});\n\n/** Gephi's node fill when a node has no `viz:color` (graphstore NodeImpl), which its edges then take. */\nconst GEPHI_NODE_FILL = \"#000000\";\n\n/** The style column marking directed edges, which Gephi draws with an arrow at the target. */\nconst DIRECTED_KEY = \"directed\";\n\n/** The style column marking the nodes whose labels Gephi hides where they overlap (node.label.avoidOverlap). */\nconst AVOID_OVERLAP_KEY = \"label-avoid-overlap\";\n\n/** The style column marking the edges Gephi does not draw (dropped, or merged into a parallel edge). */\nconst HIDDEN_KEY = \"gephi-hidden\";\n\n/** The style column holding the mix of its end nodes' colors of each edge without a color of its own. */\nconst MIXED_COLOR_KEY = \"end-colors\";\n/** The width property and the style column of the width Gephi draws an edge with from its weight. */\nconst WEIGHT_WIDTH = [\"width\", \"weight-width\"] as const;\n/** Gephi's node width when a node has no `viz:size` (graphstore NodeImpl size 10, a radius). */\nconst GEPHI_NODE_WIDTH = 20;\n/** How much thicker than its weight Gephi draws a self-loop. */\nconst SELF_LOOP_THICKNESS = 1.3;\n\n/** GEXF's node shapes, by the neutral shape each writes exactly. */\nconst NODE_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"ellipse\", \"disc\"],\n [\"rectangle\", \"square\"],\n [\"triangle\", \"triangle\"],\n [\"diamond\", \"diamond\"],\n]);\n\n/** The nearest GEXF node shape of the neutral shapes GEXF does not have; anything else is a disc. */\nconst NEAREST_NODE_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"round-rectangle\", \"square\"],\n [\"vee\", \"triangle\"],\n]);\n\n/** GEXF's edge shapes; a dash pattern GEXF does not have is dashed, anything else solid. */\nconst EDGE_SHAPES: ReadonlySet<string> = new Set([\"solid\", \"dotted\", \"dashed\", \"double\"]);\n\n/**\n * The GEXF node shape written for a neutral shape.\n * @param shape - the neutral shape\n * @returns the GEXF shape and whether it is exact\n */\nfunction gexfNodeShape(shape: string): { readonly value: string; readonly exact: boolean } {\n const exact = NODE_SHAPES.get(shape);\n return exact === undefined\n ? { value: NEAREST_NODE_SHAPES.get(shape) ?? \"disc\", exact: false }\n : { value: exact, exact: true };\n}\n\n/**\n * The GEXF edge shape written for a neutral line style.\n * @param line - the neutral line style\n * @returns the GEXF shape and whether it is exact\n */\nfunction gexfEdgeShape(line: string): { readonly value: string; readonly exact: boolean } {\n if (EDGE_SHAPES.has(line)) {\n return { value: line, exact: true };\n }\n return { value: line === \"dash-dot\" || line === \"long-dash\" ? \"dashed\" : \"solid\", exact: false };\n}\n\n/** The viz-derived columns the reader reads; `shape.uri` is the image of an `image` shape. */\nconst VIZ_COLUMNS: Readonly<Record<StyleTarget, readonly string[]>> = {\n node: [\"color\", \"size\", \"shape\", \"shape.uri\"],\n edge: [\"color\", \"thickness\", \"shape\"],\n};\n\n/**\n * A `viz:color` `hex` value as channels: r, g and b 0..255 and an alpha 0..1, read the way Gephi reads it: Java's\n * `Color.decode`, which parses the text as one integer (`Integer.decode`: `#` or `0x` hexadecimal, a leading `0`\n * octal, otherwise decimal; a leading sign allowed) and keeps its low 24 bits, opaque. So `#rrggbb` is the color it\n * names, but `#f80` is `#000f80`, `#4daf4a80` is `#af4a80` and `984ea3` is not a color at all (Gephi draws that node\n * as if it had no color: `gexf-specimen-node-fills-borders`, `color-hex-short`, `color-hex-alpha`, `color-hex-nohash`).\n * @param hex - the attribute's value\n * @returns `[r, g, b, 1]`, or null when Java cannot read it as an int\n */\nexport function canonVizColor(hex: string): [number, number, number, number] | null {\n const m = /^([+-]?)(?:(0x|0X|#)([0-9a-fA-F]+)|(0[0-7]+)|(\\d+))$/.exec(hex.trim());\n if (m === null) {\n return null;\n }\n const [, sign, , hexDigits, octal, decimal] = m;\n let v: number;\n if (hexDigits !== undefined) {\n v = Number.parseInt(hexDigits, 16);\n } else if (octal !== undefined) {\n v = Number.parseInt(octal, 8);\n } else {\n v = Number.parseInt(decimal, 10);\n }\n if (sign === \"-\") {\n v = -v;\n }\n // Integer.decode accepts -2^31 .. 2^31 - 1 only\n if (v < -2147483648 || v > 2147483647) {\n return null;\n }\n const n = v & 0xffffff;\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255, 1];\n}\n\n/**\n * A viz column of the snapshot, or null when the column is absent or not viz-derived.\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @param name - the column's fixed name\n * @returns the column's name, or null\n */\nfunction vizColumn(snapshot: GraphSnapshot, target: StyleTarget, name: string): string | null {\n const col = (target === \"node\" ? snapshot.nodes : snapshot.edges).get(name);\n return col !== null && col.meta.origin?.namespace === VIZ_NAMESPACE ? name : null;\n}\n\n/** What the per-element readers of vizValues() share. */\ninterface VizRead {\n readonly table: GraphSnapshot[\"nodes\"];\n readonly target: StyleTarget;\n /** The values of a property, created on first use. */\n readonly column: (property: string) => (StyleValue | null)[];\n /** Where a value of an element was read. */\n readonly site: (i: number, property: string) => CanonSite;\n}\n\n/**\n * One target's canonical values from its viz columns and, on a node, its `label` attribute, which Gephi draws.\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @param notes - where problems are noted\n * @param context - the work budget\n * @returns the values per property\n */\nfunction vizValues(\n snapshot: GraphSnapshot,\n target: StyleTarget,\n notes: StyleNotes,\n context: StyleReadContext,\n): Record<string, (StyleValue | null)[]> {\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n const out: Record<string, (StyleValue | null)[]> = {};\n const viz: VizRead = {\n table,\n target,\n column: (p) => (out[p] ??= new Array<StyleValue | null>(n).fill(null)),\n site: (i, property) => ({ notes, target, property, element: i, budget: context.budget }),\n };\n const color = vizColumn(snapshot, target, \"color\");\n const size = vizColumn(snapshot, target, target === \"node\" ? \"size\" : \"thickness\");\n const shape = vizColumn(snapshot, target, \"shape\");\n const uri = target === \"node\" ? vizColumn(snapshot, target, \"shape.uri\") : null;\n // Gephi draws the labels of nodes; an edge's label it does not draw\n const label = target === \"node\" ? table.byRole(\"label\") : null;\n for (let i = 0; i < n; i++) {\n if (label !== null) {\n readLabel(viz, label, i);\n }\n if (color !== null) {\n readVizColor(viz, color, i);\n }\n if (size !== null) {\n readVizSize(viz, size, i);\n }\n // GEXF gives a shape a uri only to name the picture of an `image` shape\n if (shape !== null && readVizShape(viz, shape, i) && uri !== null) {\n readVizImage(viz, uri, i);\n }\n }\n return out;\n}\n\n/**\n * Reads one node's label, which Gephi draws.\n * @param viz - the target's reading\n * @param label - the label column\n * @param i - the element\n */\nfunction readLabel(viz: VizRead, label: NonNullable<ReturnType<GraphSnapshot[\"nodes\"][\"byRole\"]>>, i: number): void {\n const text = canonText(plainCell(label.value(i)), viz.site(i, \"label\"));\n if (text !== null) {\n viz.column(\"label\")[i] = text;\n }\n}\n\n/**\n * Reads the picture of one node whose viz shape is `image`.\n * @param viz - the target's reading\n * @param uri - the viz shape uri column\n * @param i - the element\n */\nfunction readVizImage(viz: VizRead, uri: string, i: number): void {\n const v = plainCell(viz.table.value(uri, i));\n if (typeof v === \"string\" && v.length > 0) {\n viz.column(\"image\")[i] = v;\n }\n}\n\n/**\n * Reads one element's viz color: a fill on a node, a color on an edge, with its alpha as an opacity.\n * @param viz - the target's reading\n * @param color - the viz color column\n * @param i - the element\n */\nfunction readVizColor(viz: VizRead, color: string, i: number): void {\n const v = plainCell(viz.table.value(color, i));\n if (!Array.isArray(v)) {\n return;\n }\n const [fill, opacity] = viz.target === \"node\" ? [\"fill\", \"fillOpacity\"] : [\"color\", \"opacity\"];\n const [r, g, b, a = 1] = v as number[];\n const c = canonColor({ r: r * 255, g: g * 255, b: b * 255, a }, \"gexf\", viz.site(i, fill));\n if (c !== null) {\n viz.column(fill)[i] = c.color;\n if (c.alpha < 1) {\n viz.column(opacity)[i] = c.alpha;\n }\n }\n}\n\n/**\n * Reads one element's viz size (a node's width and height) or thickness (an edge's width). A node's\n * size is a radius, as Gephi and sigma draw it (Gephi's preview: a circle of radius 0.92 x size plus\n * a 0.16 x size outline, an outer diameter of 2 x size), so its width and height are twice it.\n * @param viz - the target's reading\n * @param size - the viz size or thickness column\n * @param i - the element\n */\nfunction readVizSize(viz: VizRead, size: string, i: number): void {\n const v = canonNumber(plainCell(viz.table.value(size, i)), viz.site(i, \"width\"));\n // Gephi draws a node of viz:size 0 at its default size 10 (gexf-specimen-node-sizes-opacity, size-0)\n if (v !== null && !(v === 0 && viz.target === \"node\")) {\n if (viz.target === \"node\") {\n viz.column(\"width\")[i] = 2 * v;\n viz.column(\"height\")[i] = 2 * v;\n } else {\n viz.column(\"width\")[i] = v;\n }\n }\n}\n\n/**\n * Reads one element's viz shape: a node's shape, an edge's line style.\n * @param viz - the target's reading\n * @param shape - the viz shape column\n * @param i - the element\n * @returns whether it is an `image` shape\n */\nfunction readVizShape(viz: VizRead, shape: string, i: number): boolean {\n const raw = plainCell(viz.table.value(shape, i));\n if (raw === null) {\n return false;\n }\n const kind = viz.target === \"node\" ? \"shape\" : \"lineStyle\";\n viz.column(kind)[i] = canonEnum(kind, raw, \"gexf\", viz.site(i, kind));\n return typeof raw === \"string\" && raw.toLowerCase() === \"image\";\n}\n\n/** What Gephi draws of each edge (gephiEdges()). */\ninterface GephiDrawnEdges {\n /** Whether Gephi draws the edge directed, with an arrow at its target. */\n readonly directed: boolean[];\n /** Whether Gephi does not draw the edge at all. */\n readonly hidden: boolean[];\n /** The weight Gephi draws the edge with: merged, then shifted. */\n readonly weight: number[];\n}\n\n/**\n * The edges as Gephi's importer and preview draw them (measured with the Gephi Toolkit 0.11.3:\n * `gexf-specimen-edges-lines`, `-p13`, `-p15`, `gexf-specimen-arrows`, `-p6`, `-p7`):\n * - an edge whose own type is against the graph's `defaultedgetype` is dropped (`undirected` in a `directed`\n * graph, `directed` in an `undirected` one); a `mutual` graph, or one with no `defaultedgetype`, keeps every\n * edge, an untyped or `mutual` one directed;\n * - edges of one kind between the same ends (either way round for an undirected edge) are merged into the first,\n * whose weight is their sum;\n * - an edge's weight is its `weight` (1 when it has none), or, when an edge attribute named weight is dynamic, its\n * value over the earliest interval (0 when it has none);\n * - when the smallest weight drawn is 0 or less, every weight is raised by |smallest| + 1.\n * An undirected edge of a directed snapshot is two halves here; both take what its first half gets.\n * @param snapshot - the graph\n * @param gexf - whether the file is a GEXF; another format keeps its own direction, with nothing merged or dropped\n * @returns per edge, what Gephi draws\n */\nfunction gephiEdges(snapshot: GraphSnapshot, gexf: boolean): GephiDrawnEdges {\n const n = snapshot.edgeCount;\n const first = firstHalf(snapshot);\n // another format Gephi draws: its own direction, nothing merged or dropped\n if (!gexf) {\n return otherFormatEdges(snapshot);\n }\n const header = gexfDefaultEdgeType(snapshot);\n const dirCol = snapshot.edges.byRole(\"directed\");\n const mutualCol = snapshot.edges.byRole(\"mutual\");\n const kindCol = snapshot.edges.byRole(\"kind\");\n const weightOf = gephiWeight(snapshot);\n const out: GephiDrawnEdges = {\n directed: new Array<boolean>(n).fill(false),\n hidden: new Array<boolean>(n).fill(false),\n weight: new Array<number>(n).fill(1),\n };\n const leaders = new Map<string, number>();\n const drawnLeaders: number[] = [];\n const ownDirection = gexfOwnDirection(header, dirCol, mutualCol);\n for (let e = 0; e < n; e++) {\n const f = first(e);\n if (f !== e) {\n continue;\n }\n // the edge's own type: graph-io records it only when the file mixes directions\n const { ownUndirected, mismatched } = ownDirection(f);\n if (mismatched) {\n out.hidden[f] = true;\n continue;\n }\n // Gephi draws no arrowhead on a self-loop\n const s = snapshot.edgeSource(f);\n const t = snapshot.edgeTarget(f);\n const directed = header !== \"undirected\" && s !== t && !ownUndirected;\n out.directed[f] = directed;\n const kind = kindCol?.isSet(f) === true ? String(kindCol.value(f)) : \"\";\n const key = `${kind}\\u0000${gephiEndsKey(s, t, directed)}`;\n const leader = leaders.get(key);\n if (leader === undefined) {\n leaders.set(key, f);\n drawnLeaders.push(f);\n out.weight[f] = weightOf(f);\n } else {\n out.weight[leader] += weightOf(f);\n out.hidden[f] = true;\n }\n }\n // a loop, not Math.min(...): a spread of every edge overflows the call stack on a large graph\n const smallest = drawnLeaders.reduce((m, f) => Math.min(m, out.weight[f]), Infinity);\n const shift = smallest <= 0 ? 1 - smallest : 0;\n for (let e = 0; e < n; e++) {\n const f = first(e);\n out.directed[e] = out.directed[f];\n out.hidden[e] = out.hidden[f];\n out.weight[e] = out.weight[f] + shift;\n }\n return out;\n}\n\n/**\n * The ends of an edge as the key Gephi merges parallel edges by: in order for a directed edge, either way round\n * for an undirected one.\n * @param s - the source node index\n * @param t - the target node index\n * @param directed - whether the edge is drawn directed\n * @returns the key\n */\nfunction gephiEndsKey(s: number, t: number, directed: boolean): string {\n return directed ? `${String(s)}>${String(t)}` : `${String(Math.min(s, t))}-${String(Math.max(s, t))}`;\n}\n\n/**\n * A GEXF edge's own type, read from the directed and mutual columns, or from the header when the file did not\n * mix directions (no directed column); an edge whose own type disagrees with the header's is one Gephi never loads.\n * @param header - the file's default edge type\n * @param dirCol - the directed column, or null\n * @param mutualCol - the mutual column, or null\n * @returns per edge index, whether its own type is undirected and whether it disagrees with the header\n */\nfunction gexfOwnDirection(\n header: ReturnType<typeof gexfDefaultEdgeType>,\n dirCol: ReturnType<GraphSnapshot[\"edges\"][\"byRole\"]>,\n mutualCol: ReturnType<GraphSnapshot[\"edges\"][\"byRole\"]>,\n): (f: number) => { ownUndirected: boolean; mismatched: boolean } {\n const verdict = (\n ownUndirected: boolean,\n ownDirected: boolean,\n ): { ownUndirected: boolean; mismatched: boolean } => ({\n ownUndirected,\n mismatched: (header === \"directed\" && ownUndirected) || (header === \"undirected\" && ownDirected),\n });\n return (f) => {\n if (dirCol === null) {\n return verdict(header === \"undirected\", header !== \"undirected\");\n }\n const mutual = mutualCol?.value(f) === true;\n return verdict(dirCol.value(f) === false && !mutual, dirCol.value(f) === true && !mutual);\n };\n}\n\n/**\n * The edges of a format other than GEXF as Gephi draws them: each in its own direction, as thick as its weight (1\n * for a weight of 0 or below, so the edge stays visible).\n * @param snapshot - the graph\n * @returns per edge, what Gephi draws\n */\nfunction otherFormatEdges(snapshot: GraphSnapshot): GephiDrawnEdges {\n const first = firstHalf(snapshot);\n const weightOf = gephiWeight(snapshot);\n const directed = new Array<boolean>(snapshot.edgeCount).fill(snapshot.directed);\n const col = snapshot.directed ? snapshot.edges.byRole(\"directed\") : null;\n const weight: number[] = [];\n for (let e = 0; e < snapshot.edgeCount; e++) {\n if (col !== null) {\n directed[e] = plainCell(col.value(e)) !== false;\n }\n const w = weightOf(first(e));\n weight.push(w > 0 ? w : 1);\n }\n return { directed, hidden: directed.map(() => false), weight };\n}\n\n/**\n * The graph's `defaultedgetype` as written, lower case, or null when it wrote none.\n * @param snapshot - the graph\n * @returns the keyword\n */\nfunction gexfDefaultEdgeType(snapshot: GraphSnapshot): string | null {\n const written = (snapshot.meta.extra.gexf as { defaultedgetype?: unknown } | undefined)?.defaultedgetype;\n return typeof written === \"string\" ? written.trim().toLowerCase() : null;\n}\n\n/**\n * Each edge's weight as Gephi reads it: an edge attribute whose id or title is `weight` and is dynamic is the weight,\n * at its value over the earliest interval (0 for an edge without one: its static `weight` is not read); otherwise\n * the edge's `weight`, 1 for an edge with none.\n * @param snapshot - the graph\n * @returns the weight of an edge\n */\nfunction gephiWeight(snapshot: GraphSnapshot): (e: number) => number {\n const isWeight = (v: unknown): boolean => typeof v === \"string\" && v.toLowerCase() === \"weight\";\n const dynamic = snapshot.edges\n .names()\n .map((name) => snapshot.edges.get(name))\n .find(\n (c) =>\n c !== null && c.meta.dynamic && [c.meta.name, c.meta.origin?.id, c.meta.origin?.title].some(isWeight),\n );\n const table =\n dynamic === undefined || dynamic === null\n ? undefined\n : snapshot.extensions.get(temporalTableName(\"edge\", dynamic.meta.name));\n if (table !== undefined) {\n const element = table.get(TEMPORAL_COLUMNS.element);\n const start = table.get(TEMPORAL_COLUMNS.start);\n const value = table.get(TEMPORAL_COLUMNS.value);\n const earliest = new Map<number, { start: number; value: number }>();\n for (let row = 0; element !== null && value !== null && row < table.rowCount; row++) {\n const e = element.value(row) as number;\n const at = start?.isSet(row) === true ? (start.value(row) as number) : -Infinity;\n const v = Number(value.value(row));\n const seen = earliest.get(e);\n if (Number.isFinite(v) && (seen === undefined || at < seen.start)) {\n earliest.set(e, { start: at, value: v });\n }\n }\n return (e) => earliest.get(e)?.value ?? 0;\n }\n // the snapshot's own weights (the role column exists only when some edge has none), as their shortest decimal\n const weights = explicitWeights(snapshot);\n return (e) => {\n const w = Number(weights.text(e) ?? 1);\n return Number.isFinite(w) ? w : 1;\n };\n}\n\n/** The node values Gephi's per-element defaults are worked out from, each undefined when no node has one. */\ninterface GephiNodeValues {\n /** Each node's fill. */\n readonly fill?: readonly (StyleValue | null)[];\n /** Each node's fill opacity (the alpha of its color), null for opaque. */\n readonly fillOpacity?: readonly (StyleValue | null)[];\n /** Each node's width, twice its Gephi size. */\n readonly width?: readonly (StyleValue | null)[];\n}\n\n/** The edge values Gephi's per-element defaults give way to, each undefined when no edge has one. */\ninterface GephiEdgeValues {\n /** Each edge's own color. */\n readonly color?: readonly (StyleValue | null)[];\n /** Each edge's own width. */\n readonly width?: readonly (StyleValue | null)[];\n}\n\n/** The rules of one target and the style columns they read. */\ninterface GephiTargetRules {\n readonly rules: StyleRule[];\n readonly columns: Map<string, StyleColumn>;\n}\n\n/**\n * A node color's channels as Gephi holds them: r, g, b and alpha, 0..255.\n * @param fill - the node's fill, or null for Gephi's default\n * @param opacity - its opacity, or null for opaque\n * @returns the channels\n */\nfunction nodeChannels(fill: StyleValue | null | undefined, opacity: StyleValue | null | undefined): number[] {\n const n = Number.parseInt((typeof fill === \"string\" ? fill : GEPHI_NODE_FILL).slice(1), 16);\n const a = typeof opacity === \"number\" ? Math.round(opacity * 255) : 255;\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255, a];\n}\n\n/**\n * `#rrggbb` of three channels.\n * @param c - r, g and b, 0..255\n * @returns the color\n */\nfunction hexOf(c: readonly number[]): string {\n return `#${c\n .slice(0, 3)\n .map((v) => v.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\n/**\n * A passthrough rule of a tool default that is itself per element, and its column, when any element takes it.\n * @param out - the target's rules and columns, changed in place\n * @param target - nodes or edges\n * @param pair - the style property and its style column, which is also the rule's id after `<target>.tool.`\n * @param column - the default per element, null where the element has its own value\n * @param reason - why the values are per element\n */\nfunction perElementDefault(\n out: GephiTargetRules,\n target: StyleTarget,\n pair: readonly [string, string],\n column: (StyleValue | null)[],\n reason: string,\n): void {\n const [property, key] = pair;\n const elements = column.filter((v) => v !== null).length;\n if (elements === 0) {\n return;\n }\n out.columns.set(key, column);\n out.rules.push({\n id: `${target}.tool.${key}`,\n target,\n role: \"passthrough\",\n origin: \"tool\",\n where: { has: { style: key } },\n map: { [property]: { kind: \"passthrough\" as const, by: { style: key } } },\n facts: { elements, reason },\n });\n}\n\n/** What a GEXF drawing adds to gephiRules(): the file is a GEXF, drawn under these Preview settings. */\ninterface GephiDrawing {\n /** The Preview settings, Gephi's defaults where none is given. */\n readonly preview: GephiPreview;\n /** Each edge's own viz color and its alpha, which `edge.color=original` draws. */\n readonly original?: {\n readonly color?: readonly (StyleValue | null)[];\n readonly opacity?: readonly (StyleValue | null)[];\n };\n /** Each edge's label, drawn under `edge.label.show`. */\n readonly edgeLabels?: readonly (StyleValue | null)[];\n /** Whether the node labels Gephi's overlap avoidance hides are already left out (gephiOverlapHidden()). */\n readonly overlapSettled?: boolean;\n}\n\n/**\n * A tool rule that sets the same values on every element.\n * @param out - the target's rules, changed in place\n * @param target - nodes or edges\n * @param id - the rule's id after `<target>.tool.`\n * @param set - the values\n */\nfunction everyElement(out: GephiTargetRules, target: StyleTarget, id: string, set: Record<string, StyleValue>): void {\n if (Object.keys(set).length > 0) {\n out.rules.push({\n id: `${target}.tool.${id}`,\n target,\n role: \"group\",\n origin: \"tool\",\n where: { all: true },\n set,\n });\n }\n}\n\n/**\n * The rules Gephi's preview defaults (DefaultPreset) make per element, as its SVG export draws every GEXF and GraphML\n * file: each node outlined in a darker shade of its fill, 0.08 of its width wide, with its label 0.3 of its width\n * tall; each edge in the mix of its two end nodes' colors and alphas, as thick as its weight, with an arrow at the\n * target of a directed edge. An element's own value is kept (a file graphty wrote states every one). A GEXF drawing\n * also merges and drops edges as Gephi's importer does (gephiEdges()) and follows the Preview settings it was drawn\n * with.\n * @param snapshot - the graph\n * @param nodes - each node's fill, opacity and width\n * @param edges - each edge's own color and width\n * @param budget - the work budget\n * @param gexf - the GEXF drawing, or undefined for another format Gephi draws\n * @returns the node and edge rules and the style columns they read\n */\nexport function gephiRules(\n snapshot: GraphSnapshot,\n nodes: GephiNodeValues,\n edges: GephiEdgeValues,\n budget: StyleReadContext[\"budget\"],\n gexf?: GephiDrawing,\n): { readonly node: GephiTargetRules; readonly edge: GephiTargetRules } {\n const preview = gexf?.preview ?? new GephiPreview();\n const node: GephiTargetRules = { rules: [], columns: new Map() };\n const edge: GephiTargetRules = { rules: [], columns: new Map() };\n budget.spend(\"node\", snapshot.nodeCount);\n budget.spend(\"edge\", snapshot.edgeCount);\n const channels = Array.from({ length: snapshot.nodeCount }, (_, i) =>\n nodeChannels(nodes.fill?.[i], nodes.fillOpacity?.[i]),\n );\n const labelSizes = nodeRules(node, snapshot, channels, nodes, preview);\n edgeRules(edge, snapshot, channels, nodes, edges, gexf, preview);\n nodeLabelRules(node, channels, labelSizes, preview, gexf?.overlapSettled === true);\n labelBox(node, channels, nodes, preview);\n return { node, edge };\n}\n\n/**\n * A node's width, twice its Gephi size.\n * @param nodes - the node values\n * @param i - the node\n * @returns the width\n */\nfunction nodeWidth(nodes: GephiNodeValues, i: number): number {\n const w = nodes.width?.[i];\n return typeof w === \"number\" ? w : GEPHI_NODE_WIDTH;\n}\n\n/**\n * The node rules: opacity, border and label size.\n * @param node - the node rules, changed in place\n * @param snapshot - the graph\n * @param channels - each node's color channels\n * @param nodes - the node values\n * @param preview - the settings\n * @returns each node's label size\n */\nfunction nodeRules(\n node: GephiTargetRules,\n snapshot: GraphSnapshot,\n channels: readonly number[][],\n nodes: GephiNodeValues,\n preview: GephiPreview,\n): number[] {\n const nodeIndices = Array.from({ length: snapshot.nodeCount }, (_, i) => i);\n // a node's alpha is drawn only under node.per.node.opacity, times node.opacity, on its fill and its border alike:\n // a node not opaque is a fill of radius 0.84 s and a separate ring out to s, both at that alpha\n const perNode = preview.on(\"node.per.node.opacity\");\n const alpha = channels.map((c) => ((perNode ? c[3] : 255) / 255) * (preview.num(\"node.opacity\") / 100));\n const translucent = alpha.map((a) => (a < 1 ? a : null));\n perElementDefault(node, \"node\", [\"fillOpacity\", \"preview-opacity\"], translucent, \"NODE_OPACITY\");\n perElementDefault(node, \"node\", [\"borderOpacity\", \"preview-border-opacity\"], translucent, \"NODE_OPACITY\");\n // NodeRenderer: the border is DependantColor DARKER by default, half of each channel (+-1 from Gephi's float math)\n const borderMode = preview.text(\"node.border.color\");\n perElementDefault(\n node,\n \"node\",\n [\"borderColor\", \"border-shade\"],\n channels.map((c) => hexOf(dependantColor(borderMode, c) ?? c.map((v) => Math.floor(v / 2)))),\n \"NODE_FILL_SHADE\",\n );\n // A node of size s is a circle of radius 0.92 s with a 0.16 s border: 0.08 of its 2 s width, or node.border.width\n // under node.border.fixed. Its label is the label font's size in proportion to the node's, round(size / 20 * s)\n // (NODE_LABEL_PROPORTIONAL_SIZE; Arial 12 makes round(0.6 s)), never under 1.\n const fixed = preview.on(\"node.border.fixed\") ? preview.num(\"node.border.width\") : null;\n perElementDefault(\n node,\n \"node\",\n [\"borderWidth\", \"size-border\"],\n nodeIndices.map((i) => {\n // a fixed border is no wider than the node's size (radius): a size-3 node takes a border of 4 as 3\n return fixed === null ? 0.08 * nodeWidth(nodes, i) : Math.min(fixed, nodeWidth(nodes, i) / 2);\n }),\n \"NODE_SIZE\",\n );\n const font = preview.font(\"node\");\n const labelSizes = nodeIndices.map((i) =>\n preview.on(\"node.label.proportinalSize\")\n ? Math.max(1, Math.round((font.size / 40) * nodeWidth(nodes, i)))\n : font.size,\n );\n perElementDefault(node, \"node\", [\"labelSize\", \"size-label\"], labelSizes, \"NODE_SIZE\");\n return labelSizes;\n}\n\n/**\n * The node label rules the Preview settings make beyond the size: color, outline, font and overlap avoidance.\n * @param node - the node rules, changed in place\n * @param channels - each node's color channels\n * @param sizes - each node's label size\n * @param preview - the settings\n * @param settled - whether the labels overlap avoidance hides are already left out\n */\nfunction nodeLabelRules(\n node: GephiTargetRules,\n channels: readonly number[][],\n sizes: readonly number[],\n preview: GephiPreview,\n settled: boolean,\n): void {\n const color = preview.text(\"node.label.color\");\n if (color !== \"#000000\" && color !== \"original\") {\n perElementDefault(\n node,\n \"node\",\n [\"labelColor\", \"preview-label-color\"],\n channels.map((c) => hexOf(dependantColor(color, c) ?? [0, 0, 0])),\n \"NODE_LABEL_COLOR\",\n );\n }\n labelOutline(node, \"node\", channels, sizes, preview);\n const font = preview.font(\"node\");\n everyElement(node, \"node\", \"preview-label\", fontValues(font, preview.on(\"node.label.customFont\")));\n // ponytail: where a node has no stored position Gephi's own grid (gephiOverlapHidden()) cannot be run; avoiding\n // overlap, larger first, is that test without the grid's rounding. A rule only while it is on: graphty-element\n // has no value that turns a lower rule's overlap avoidance off again.\n if (preview.on(\"node.label.avoidOverlap\") && !settled) {\n node.columns.set(\n AVOID_OVERLAP_KEY,\n sizes.map(() => true),\n );\n node.rules.push({\n id: \"node.tool.label-avoid-overlap\",\n target: \"node\",\n role: \"group\",\n origin: \"tool\",\n where: { has: { style: AVOID_OVERLAP_KEY } },\n set: { labelAvoidOverlap: true },\n });\n }\n}\n\n/**\n * Gephi's alpha for a Preview opacity in percent: Java's `Color` keeps it as one of 256 steps, cut down to a whole\n * step (`labels-p10`'s 30 is drawn 76 / 255, not 77).\n * @param percent - the opacity, 0 to 100\n * @returns the alpha, 0 to 1\n */\nfunction gephiAlpha(percent: number): number {\n // ponytail: 1e-9 keeps a step that floating point lands a hair under (0.4 x 255) on its step\n return Math.floor((Math.min(Math.max(percent, 0), 100) / 100) * 255 + 1e-9) / 255;\n}\n\n/**\n * The label box of `node.label.box`: Gephi strokes an unfilled box round the label, 0.08 of the node's size wide, in\n * the color `node.label.box.color` derives from the node's and at `node.label.box.opacity` (`gexf-specimen-labels-p11`,\n * `-p12`, `-p13`, `-p20`, `-p21`). The box is the text's own bounds -- its advance width and its font's ascent plus\n * descent, with no leading -- grown by the stroke's width, so the stroke's inner edge lies on the text's bounds\n * (`labels-p11`: a 15 px \"Label\" is 40.47 x 17.46 inside a 2.0 stroke): no padding, a line height of 1.\n * @param node - the node rules, changed in place\n * @param channels - each node's color channels\n * @param nodes - the node values\n * @param preview - the settings\n */\nfunction labelBox(\n node: GephiTargetRules,\n channels: readonly number[][],\n nodes: GephiNodeValues,\n preview: GephiPreview,\n): void {\n if (!preview.on(\"node.label.box\")) {\n return;\n }\n const mode = preview.text(\"node.label.box.color\");\n perElementDefault(\n node,\n \"node\",\n [\"labelBorderColor\", \"preview-box-color\"],\n channels.map((c) => hexOf(dependantColor(mode, c) ?? c)),\n \"LABEL_BOX\",\n );\n perElementDefault(\n node,\n \"node\",\n [\"labelBorderWidth\", \"preview-box-width\"],\n channels.map((_, i) => 0.04 * nodeWidth(nodes, i)),\n \"LABEL_BOX\",\n );\n everyElement(node, \"node\", \"preview-box\", {\n labelBorderOpacity: gephiAlpha(preview.num(\"node.label.box.opacity\")),\n labelPadding: 0,\n labelLineHeight: 1,\n });\n}\n\n/**\n * The label font values a custom font sets.\n * @param font - the font\n * @param custom - whether the font is custom\n * @returns the values\n */\nfunction fontValues(font: GephiFont, custom: boolean): Record<string, StyleValue> {\n if (!custom) {\n return {};\n }\n return {\n labelFont: font.family,\n ...(font.bold ? { labelWeight: \"bold\" } : {}),\n ...(font.italic ? { labelItalic: true } : {}),\n };\n}\n\n/**\n * The label outline of `<target>.label.outline.size` and `.color`: a stroke size / 32 of the label's size wide, round\n * each letter, in the color its mode derives from the element's color and at `.outline.opacity` (Gephi's default 80;\n * `gexf-specimen-labels-p9`, `-p10`, `-p17` .. `-p19`, `edge-labels-p5`, `-p6`).\n * @param out - the rules, changed in place\n * @param target - nodes or edges\n * @param colors - each element's color channels\n * @param sizes - each element's label size\n * @param preview - the settings\n */\nfunction labelOutline(\n out: GephiTargetRules,\n target: StyleTarget,\n colors: readonly number[][],\n sizes: readonly number[],\n preview: GephiPreview,\n): void {\n const size = preview.num(`${target}.label.outline.size`);\n if (size <= 0) {\n return;\n }\n const mode = preview.text(`${target}.label.outline.color`);\n perElementDefault(\n out,\n target,\n [\"labelOutlineWidth\", \"preview-outline-width\"],\n sizes.map((s) => (size / 32) * s),\n \"LABEL_OUTLINE\",\n );\n perElementDefault(\n out,\n target,\n [\"labelOutlineColor\", \"preview-outline-color\"],\n colors.map((c) => hexOf(dependantColor(mode, c) ?? [255, 255, 255])),\n \"LABEL_OUTLINE\",\n );\n everyElement(out, target, \"preview-outline\", {\n labelOutlineOpacity: gephiAlpha(preview.num(`${target}.label.outline.opacity`)),\n });\n}\n\n/**\n * The node labels Gephi's label overlap avoidance hides (`node.label.avoidOverlap`, Gephi 0.11\n * NodeLabelRenderer.preProcess): largest font first, each label's box -- its Dialog advance width by its line height,\n * centered on its node -- marks the cells of a `node.label.overlapGridSize` grid over the nodes' bounds, and a label\n * any of whose cells an earlier one marked is hidden. A label's font size is 12 x 0.05 x its node's size (proportional\n * size) or the font's, measured in the float size of the last label of the same whole size (Gephi's font cache),\n * its labels taken largest node first.\n * Decided where every node has a stored position; elsewhere graphty-element lays the graph out, so null.\n * @param snapshot - the graph\n * @param labels - each node's label as drawn\n * @param widths - each node's width (twice its size), or undefined for Gephi's default\n * @param preview - the settings\n * @returns whether each label is hidden, or null\n */\nfunction gephiOverlapHidden(\n snapshot: GraphSnapshot,\n labels: readonly (StyleValue | null)[],\n widths: readonly (StyleValue | null)[] | undefined,\n preview: GephiPreview,\n): boolean[] | null {\n const centers = gephiCenters(snapshot);\n if (centers.includes(null)) {\n return null;\n }\n const f = Math.fround;\n const grid = preview.num(\"node.label.overlapGridSize\");\n const proportional = preview.on(\"node.label.proportinalSize\");\n const base = f(preview.font(\"node\").size * preview.num(\"node.label.scale\"));\n const nodeSizes = centers.map((_, i) => {\n const w = widths?.[i];\n return f((typeof w === \"number\" ? w : GEPHI_NODE_WIDTH) / 2);\n });\n const sizes = nodeSizes.map((nodeSize) =>\n proportional ? f(f(base * nodeSize) * f(0.05)) : f(base * f(1 + f(nodeSize * f(0.00001)))),\n );\n // Gephi's label items come largest node first (file order among equals; measured on six corpus files)\n const items = sizes.map((_, i) => i).sort((a, b) => nodeSizes[b] - nodeSizes[a]);\n // Font.deriveFont(size).getSize() rounds; the cache keeps the last font of each whole size\n const cached = new Map<number, number>();\n items.forEach((i) => cached.set(Math.round(sizes[i]), sizes[i]));\n // NodeItem Y is the file's y turned over\n const at = centers.map((c) => [c?.[0] ?? 0, -(c?.[1] ?? 0)] as const);\n // loops, not Math.min(...): a spread of every node overflows the call stack on a large graph\n let [loX, loY, hiX, hiY] = [Infinity, Infinity, -Infinity, -Infinity];\n for (const [x, y] of at) {\n [loX, loY, hiX, hiY] = [Math.min(loX, x), Math.min(loY, y), Math.max(hiX, x), Math.max(hiY, y)];\n }\n const [minX, minY] = [loX - grid, loY - grid];\n const cols = Math.ceil((hiX + grid - minX) / grid);\n const rows = Math.ceil((hiY + grid - minY) / grid);\n const taken = new Set<number>();\n const hidden = labels.map(() => false);\n const order = [...items].sort((a, b) => sizes[b] - sizes[a]);\n for (const i of order) {\n const label = labels[i];\n if (typeof label !== \"string\" || label.trim() === \"\") {\n continue;\n }\n const size = cached.get(Math.round(sizes[i])) ?? sizes[i];\n const half = [(dialogWidth(label) * size) / 2, (DIALOG_LINE_HEIGHT * size) / 2] as const;\n const cells = gridCells(\n { min: [minX, minY], size: grid, cols, rows },\n [at[i][0] - half[0], at[i][1] - half[1]],\n [at[i][0] + half[0], at[i][1] + half[1]],\n );\n if (cells.some((k) => taken.has(k))) {\n hidden[i] = true;\n } else {\n cells.forEach((k) => taken.add(k));\n }\n }\n return hidden;\n}\n\n/**\n * The cells of a grid a box covers, as Gephi's label grid counts them (each corner's cell truncated, kept on the grid).\n * @param grid - the grid: its lowest corner, cell size and cell counts\n * @param grid.min - its lowest x and y\n * @param grid.size - its cell size\n * @param grid.cols - its columns\n * @param grid.rows - its rows\n * @param lo - the box's lowest x and y\n * @param hi - the box's highest x and y\n * @returns the cell indices, row by row\n */\nfunction gridCells(\n grid: {\n readonly min: readonly [number, number];\n readonly size: number;\n readonly cols: number;\n readonly rows: number;\n },\n lo: readonly [number, number],\n hi: readonly [number, number],\n): number[] {\n const cell = (v: number, axis: 0 | 1): number =>\n Math.min((axis === 0 ? grid.cols : grid.rows) - 1, Math.max(0, Math.trunc((v - grid.min[axis]) / grid.size)));\n const cells: number[] = [];\n for (let r = cell(lo[1], 1); r <= cell(hi[1], 1); r++) {\n for (let c = cell(lo[0], 0); c <= cell(hi[0], 0); c++) {\n cells.push(r * grid.cols + c);\n }\n }\n return cells;\n}\n\n/** Gephi's `edge.arc-curveness`: a curved edge is an arc of radius its nodes' distance over it (code only, 1.2). */\nconst GEPHI_ARC_CURVENESS = 1.2;\n\n/**\n * Each node's stored center, its viz:position; null without one (graphty-element lays such a node out, where Gephi\n * would put it at (0, 0)).\n * @param snapshot - the graph\n * @returns x and y by node\n */\nfunction gephiCenters(snapshot: GraphSnapshot): ([number, number] | null)[] {\n const position = snapshot.nodes.byRole(\"position\");\n return Array.from({ length: snapshot.nodeCount }, (_, i) => {\n const v = position?.isSet(i) === true ? (position.value(i) as ArrayLike<number>) : null;\n return v === null ? null : [v[0] || 0, v[1] || 0];\n });\n}\n\n/**\n * The curved edges Gephi draws no line for: its arc (radius distance / 1.2) is cut back at each end by a chord as long\n * as that end's node radius (its size), plus `edge.radius`, plus at the target of a directed edge its arrowhead\n * (`arrow.size` x its thickness); where the two cuts meet or pass each other, or a cut is longer than the arc, the\n * nodes swallow the edge and no line is drawn (Gephi 0.11 EdgeRenderer.CurvedEdgeRenderer.Helper,\n * computeTruncateAngle; gexf-cns-wos: 24 edges between overlapping nodes). Its arrowhead is still drawn, unless its\n * nodes are at one place (ArrowRenderer).\n * @param snapshot - the graph\n * @param nodes - the node values (their widths)\n * @param directed - whether each edge is drawn directed\n * @param thickness - each edge's drawn thickness\n * @param preview - the settings\n * @returns for each edge, \"line\" when only its line is swallowed, \"all\" when its nodes are at one place, else null\n */\nfunction swallowedEdges(\n snapshot: GraphSnapshot,\n nodes: GephiNodeValues,\n directed: readonly boolean[],\n thickness: readonly number[],\n preview: GephiPreview,\n): (\"line\" | \"all\" | null)[] {\n const centers = gephiCenters(snapshot);\n const edgeRadius = preview.num(\"edge.radius\");\n const arrowSize = preview.num(\"arrow.size\");\n const arc = 2 * Math.asin(Math.min(1, GEPHI_ARC_CURVENESS / 2));\n return Array.from({ length: snapshot.edgeCount }, (_, e) => {\n const [a, b] = [snapshot.edgeSource(e), snapshot.edgeTarget(e)];\n const [pa, pb] = [centers[a], centers[b]];\n if (a === b || pa === null || pb === null) {\n return null;\n }\n const d = Math.hypot(pb[0] - pa[0], pb[1] - pa[1]);\n if (d === 0) {\n return \"all\";\n }\n const r = d / GEPHI_ARC_CURVENESS;\n // the angle a cut of chord length c takes off the arc; past the arc's length, more than the whole arc\n const cut = (c: number): number =>\n c >= r * arc ? Infinity : 2 * Math.atan2(c / 2, Math.sqrt(r * r - (c / 2) * (c / 2)));\n const source = edgeRadius + nodeWidth(nodes, a) / 2;\n const target = edgeRadius + nodeWidth(nodes, b) / 2 + (directed[e] ? arrowSize * thickness[e] : 0);\n return cut(source) + cut(target) >= arc ? \"line\" : null;\n });\n}\n\n/** How many points a Gephi self-loop's circle is drawn through. */\nconst SELF_LOOP_STEPS = 96;\n\n/**\n * Gephi's self-loops as bends round their node: a circle up and to the right of it, centered `r` right of and `r`\n * above the node's center, of radius `r` = half the node's size (a radius) plus a third of the loop's stroke, which is\n * 1.3 times the edge's weight (gephi PreviewPlugin EdgeRenderer, SelfLoopEdgeRenderer; measured on the GEXF specimen\n * sheets and gexf-graphology-rio: r = 0.5435 x the drawn radius + 0.33 x the stroke). The circle runs from the side\n * facing the node all the way round; its part inside the node is not drawn.\n * @param snapshot - the graph\n * @param thickness - each edge's drawn thickness\n * @param hidden - whether each edge is not drawn\n * @returns each loop's bends, as fractions of its node's half size; null for any other edge\n */\nfunction selfLoopBends(\n snapshot: GraphSnapshot,\n thickness: readonly number[],\n hidden: readonly boolean[],\n): (StyleValue | null)[] {\n const sizes = vizColumn(snapshot, \"node\", \"size\");\n const sizeOf = (n: number): number => {\n const v = sizes === null ? null : Number(plainCell(snapshot.nodes.value(sizes, n)));\n return v !== null && Number.isFinite(v) && v > 0 ? v : GEPHI_NODE_WIDTH / 2;\n };\n const fraction = (v: number): string => String(Math.round(v * 1e4) / 1e4);\n return Array.from({ length: snapshot.edgeCount }, (_, e) => {\n const n = snapshot.edgeSource(e);\n if (n !== snapshot.edgeTarget(e) || hidden[e]) {\n return null;\n }\n const size = sizeOf(n);\n const r = (0.5 * size + 0.33 * SELF_LOOP_THICKNESS * thickness[e]) / size;\n const points: string[] = [];\n for (let k = 0; k <= SELF_LOOP_STEPS; k++) {\n // from the point facing the node's center (225 degrees), clockwise all the way round\n const a = (5 * Math.PI) / 4 - (2 * Math.PI * k) / SELF_LOOP_STEPS;\n points.push(`${fraction(r + r * Math.cos(a))},${fraction(r + r * Math.sin(a))}`);\n }\n return points.join(\" \");\n });\n}\n\n/**\n * The edge rules: arrows, thickness, the edges not drawn, color and opacity, curves and labels.\n * @param edge - the edge rules, changed in place\n * @param snapshot - the graph\n * @param channels - each node's color channels\n * @param nodes - the node values (their widths)\n * @param edges - each edge's own color and width\n * @param gexf - the GEXF drawing, or undefined\n * @param preview - the settings\n */\nfunction edgeRules(\n edge: GephiTargetRules,\n snapshot: GraphSnapshot,\n channels: readonly number[][],\n nodes: GephiNodeValues,\n edges: GephiEdgeValues,\n gexf: GephiDrawing | undefined,\n preview: GephiPreview,\n): void {\n const drawn = gephiEdges(snapshot, gexf !== undefined);\n const arrowSize = preview.num(\"arrow.size\");\n if (drawn.directed.some(Boolean) && arrowSize > 0) {\n edge.columns.set(\n DIRECTED_KEY,\n drawn.directed.map((d) => (d ? true : null)),\n );\n // arrow.size scales the arrowhead from its default 3 (gexf-specimen-arrows-p2); 0 draws none (-p3)\n edge.rules.push({\n id: \"edge.tool.arrow\",\n target: \"edge\",\n role: \"group\",\n origin: \"tool\",\n where: { has: { style: DIRECTED_KEY } },\n set: { targetArrow: \"triangle\", ...(arrowSize === 3 ? {} : { arrowSize: arrowSize / 3 }) },\n });\n }\n // Gephi draws an edge as thick as its weight (gephiEdges(): merged and shifted); a width of its own is the file's\n const hidden = preview.on(\"edge.show\") ? drawn.hidden : drawn.hidden.map(() => true);\n const thickness = edgeThickness(\n drawn.weight,\n hidden.map((h) => !h),\n preview,\n );\n perElementDefault(\n edge,\n \"edge\",\n WEIGHT_WIDTH,\n // Gephi's self-loop is 1.3 times as thick (measured: weight 1 draws 1.3, 3.25 draws 4.225)\n withoutOwn(edges.width, snapshot.edgeCount, (e) =>\n snapshot.edgeSource(e) === snapshot.edgeTarget(e) ? SELF_LOOP_THICKNESS * thickness[e] : thickness[e],\n ),\n \"EDGE_WEIGHT\",\n );\n perElementDefault(edge, \"edge\", [\"bends\", \"self-loop\"], selfLoopBends(snapshot, thickness, hidden), \"NODE_SIZE\");\n // a curved edge its nodes (and its arrowhead) swallow draws no line; its arrowhead is still drawn\n const swallowed = preview.on(\"edge.curved\")\n ? swallowedEdges(snapshot, nodes, drawn.directed, thickness, preview)\n : hidden.map(() => null);\n // the edges Gephi does not draw: one of another direction than the graph's, one merged into a parallel edge, or a\n // swallowed one with no arrowhead to keep\n hidden.forEach((h, e) => {\n const arrow = drawn.directed[e] && arrowSize > 0 && swallowed[e] === \"line\";\n hidden[e] = h || (swallowed[e] !== null && !arrow);\n });\n if (hidden.some(Boolean)) {\n edge.columns.set(\n HIDDEN_KEY,\n hidden.map((h) => (h ? true : null)),\n );\n edge.rules.push({\n id: \"edge.tool.gephi-hidden\",\n target: \"edge\",\n role: \"group\",\n origin: \"tool\",\n where: { has: { style: HIDDEN_KEY } },\n set: { visible: false },\n });\n }\n const colors = edgeColors(snapshot, channels, gexf, preview);\n perElementDefault(\n edge,\n \"edge\",\n [\"color\", MIXED_COLOR_KEY],\n withoutOwn(edges.color, snapshot.edgeCount, (e) => hexOf(colors[e])),\n \"END_NODE_COLORS\",\n );\n perElementDefault(\n edge,\n \"edge\",\n [\"opacity\", \"end-opacity\"],\n withoutOwn(edges.color, snapshot.edgeCount, (e) => colors[e][3] / 255).map((v, e) => {\n // a swallowed edge Gephi draws only the arrowhead of draws no line\n if (swallowed[e] !== null && !hidden[e]) {\n return 0;\n }\n return v === 1 ? null : v;\n }),\n \"END_NODE_COLORS\",\n );\n everyElement(edge, \"edge\", \"preview-curve\", preview.on(\"edge.curved\") ? {} : { curved: false });\n // Gephi's `edge.radius` leaves that much empty between each node and its edges' ends, arrowheads too\n const nodeGap = preview.num(\"edge.radius\");\n everyElement(edge, \"edge\", \"preview-radius\", nodeGap > 0 ? { nodeGap } : {});\n edgeLabelRules(edge, colors, gexf, preview);\n}\n\n/**\n * Each edge's color and alpha (0..255) under `edge.color` and `edge.opacity`: MIXED (the default) is each channel,\n * alpha too, the truncated mean of the two end nodes'; `source` and `target` are that node's; `original` is the edge's\n * own viz color, black without one; `#rrggbb` is that color, opaque (`gexf-specimen-edges-lines-p3` .. `-p7`).\n * graphty-element cannot bind an edge's color to its nodes' drawn colors, so the color is frozen here.\n * @param snapshot - the graph\n * @param channels - each node's color channels\n * @param gexf - the GEXF drawing, or undefined\n * @param preview - the settings\n * @returns each edge's r, g, b and alpha\n */\nfunction edgeColors(\n snapshot: GraphSnapshot,\n channels: readonly number[][],\n gexf: GephiDrawing | undefined,\n preview: GephiPreview,\n): number[][] {\n const mode = preview.text(\"edge.color\");\n const factor = preview.num(\"edge.opacity\") / 100;\n const own = (e: number): number[] => {\n const c = gexf?.original?.color?.[e];\n const a = gexf?.original?.opacity?.[e];\n return nodeChannels(typeof c === \"string\" ? c : GEPHI_NODE_FILL, typeof a === \"number\" ? a : null);\n };\n const custom = dependantColor(mode, [0, 0, 0]);\n return Array.from({ length: snapshot.edgeCount }, (_, e) => {\n const s = channels[snapshot.edgeSource(e)];\n const t = channels[snapshot.edgeTarget(e)];\n let c: number[];\n if (mode === \"source\") {\n c = [...s];\n } else if (mode === \"target\") {\n c = [...t];\n } else if (mode === \"original\") {\n c = own(e);\n } else if (mode.startsWith(\"#\") && custom !== null) {\n c = [...custom, 255];\n } else {\n c = s.map((v, k) => Math.floor((v + t[k]) / 2));\n }\n return factor === 1 ? c : [c[0], c[1], c[2], c[3] * factor];\n });\n}\n\n/**\n * The edge label rules of `edge.label.show`: the font's size (not in proportion to anything), color, outline and\n * font (`gexf-specimen-edge-labels-p2` .. `-p15`).\n * @param edge - the edge rules, changed in place\n * @param colors - each edge's color and alpha\n * @param gexf - the GEXF drawing, or undefined\n * @param preview - the settings\n */\nfunction edgeLabelRules(\n edge: GephiTargetRules,\n colors: readonly number[][],\n gexf: GephiDrawing | undefined,\n preview: GephiPreview,\n): void {\n if (gexf?.edgeLabels === undefined || !preview.on(\"edge.label.show\")) {\n return;\n }\n const font = preview.font(\"edge\");\n const color = preview.text(\"edge.label.color\");\n if (color !== \"original\") {\n perElementDefault(\n edge,\n \"edge\",\n [\"labelColor\", \"preview-label-color\"],\n colors.map((c) => hexOf(dependantColor(color, c) ?? [0, 0, 0])),\n \"EDGE_LABEL_COLOR\",\n );\n }\n labelOutline(\n edge,\n \"edge\",\n colors,\n colors.map(() => font.size),\n preview,\n );\n // Gephi centers an edge label on its line's middle (gexf-specimen-edge-labels-p2: 0.04 of the font off it)\n everyElement(edge, \"edge\", \"preview-label\", {\n labelSize: font.size,\n labelPosition: \"center\",\n ...fontValues(font, preview.on(\"edge.label.customFont\")),\n });\n}\n\n/**\n * Preview's \"mixed\" edge color: the mean of two colors, each channel rounded down (`EdgeColor.java` lines 89-93).\n * @param a - one end's color, `#rrggbb`\n * @param b - the other's\n * @returns the mixed color\n */\nfunction gephiMix(a: string, b: string): string {\n const x = Number.parseInt(a.slice(1), 16);\n const y = Number.parseInt(b.slice(1), 16);\n let out = 0;\n for (const shift of [16, 8, 0]) {\n out |= Math.floor((((x >> shift) & 255) + ((y >> shift) & 255)) / 2) << shift;\n }\n return `#${out.toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * The edge whose source Gephi draws for each edge: an undirected edge in a directed graph is one edge in the file\n * and two halves here, and the second half takes the first half's.\n * @param snapshot - the graph\n * @returns the first half of each edge\n */\nfunction firstHalf(snapshot: GraphSnapshot): (e: number) => number {\n const pair = snapshot.edges.byRole(\"pair\");\n return (e) => (pair?.isSet(e) === true ? Math.min(e, pair.value(e) as number) : e);\n}\n\n/**\n * A default value for every edge without a value of its own.\n * @param own - each edge's own value, or undefined when no edge has one\n * @param count - the edge count\n * @param value - the default of an edge\n * @returns the defaults, null where an edge has its own\n */\nfunction withoutOwn(\n own: readonly (StyleValue | null)[] | undefined,\n count: number,\n value: (e: number) => StyleValue,\n): (StyleValue | null)[] {\n const out = new Array<StyleValue | null>(count).fill(null);\n for (let e = 0; e < count; e++) {\n if (own?.[e] === null || own === undefined) {\n out[e] = value(e);\n }\n }\n return out;\n}\n\n/**\n * The styles of a GEXF file as Gephi's preview draws it: each node's label, fill and size, Gephi's defaults beneath\n * (black size-10 discs, curved edges) and its per-element defaults (gephiRules()); the viz values Gephi does not draw\n * are left out (withoutUndrawn()); plus a `graphty.styles` block the file holds in `<meta>`, whose file keeps every\n * value.\n * @param snapshot - the graph the import built\n * @param context - the work budget and the block text the import kept\n * @returns the styles\n */\nexport function gexfStyles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {\n const notes = new StyleNotes();\n const node = vizValues(snapshot, \"node\", notes, context);\n const edge = vizValues(snapshot, \"edge\", notes, context);\n const { block, preview } = keptOf(context.kept);\n const nodeOpacity = node.fillOpacity;\n const original = { color: edge.color, opacity: edge.opacity };\n if (block === null) {\n withoutUndrawn(node, edge);\n } else {\n exactFromBlock(snapshot, block, node, edge);\n }\n const labels = drawnLabels(node.label, preview, \"node\", block !== null);\n const overlapHidden =\n block === null && labels !== undefined && preview.on(\"node.label.avoidOverlap\")\n ? gephiOverlapHidden(snapshot, labels, node.width, preview)\n : null;\n overlapHidden?.forEach((hide, i) => {\n if (hide && labels !== undefined) {\n labels[i] = null;\n }\n });\n if (labels === undefined) {\n delete node.label;\n } else {\n node.label = labels;\n }\n const edgeLabels = drawnLabels(edgeLabelValues(snapshot), preview, \"edge\", block !== null);\n if (edgeLabels !== undefined) {\n edge.label = edgeLabels;\n }\n const rules = gephiRules(\n snapshot,\n { fill: node.fill, fillOpacity: nodeOpacity, width: node.width },\n { color: edge.color, width: edge.width },\n context.budget,\n { preview, original, edgeLabels, overlapSettled: overlapHidden !== null },\n );\n return {\n canonical: true,\n dialect: \"gexf\",\n tool: \"gephi\",\n units: \"relative\",\n node: { values: node, ...rules.node },\n edge: { values: edge, ...rules.edge },\n notes: notes.list(),\n opacityInColor: true,\n block,\n readFrom: {\n node: VIZ_COLUMNS.node.filter((name) => vizColumn(snapshot, \"node\", name) !== null),\n edge: VIZ_COLUMNS.edge.filter((name) => vizColumn(snapshot, \"edge\", name) !== null),\n },\n };\n}\n\n/**\n * What the import kept for the styles: the `graphty.styles` block, and the Preview settings of the `gephiPreview`\n * option.\n * @param kept - the kept value: the block's text, or `{ block, gephiPreview }`\n * @returns the block (null without one) and the Preview settings\n */\nfunction keptOf(kept: unknown): { readonly block: string | null; readonly preview: GephiPreview } {\n if (typeof kept === \"string\") {\n return { block: kept, preview: new GephiPreview() };\n }\n if (typeof kept === \"object\" && kept !== null) {\n const { block, gephiPreview } = kept as { block?: unknown; gephiPreview?: Record<string, string> };\n return { block: typeof block === \"string\" ? block : null, preview: new GephiPreview(gephiPreview) };\n }\n return { block: null, preview: new GephiPreview() };\n}\n\n/**\n * Each edge's `label` attribute.\n * @param snapshot - the graph\n * @returns the labels, or undefined when no edge has one\n */\nfunction edgeLabelValues(snapshot: GraphSnapshot): (StyleValue | null)[] | undefined {\n const col = snapshot.edges.byRole(\"label\");\n if (col === null) {\n return undefined;\n }\n return Array.from({ length: snapshot.edgeCount }, (_, e) => {\n const v = plainCell(col.value(e));\n return typeof v === \"string\" && v.length > 0 ? v : null;\n });\n}\n\n/**\n * Leaves out the viz values Gephi does not draw, for a file graphty did not write: its preview draws every node an\n * opaque disc (a node's alpha only tints its edges) and every edge a solid line in its end nodes' mixed color, as\n * thick as its weight (graphstore keeps no edge thickness or shape, and EdgeColor MIXED ignores an edge's color).\n * Every `viz:shape` is drawn a disc, an `image` shape too: Gephi Toolkit 0.11.3 draws no picture\n * (`gexf-specimen-images-charts`: a data: URI and a web URL both drawn as the node's colored disc).\n * @param node - the node values, changed in place\n * @param edge - the edge values, changed in place\n */\nfunction withoutUndrawn(\n node: Record<string, (StyleValue | null)[]>,\n edge: Record<string, (StyleValue | null)[]>,\n): void {\n delete node.shape;\n delete node.image;\n delete node.fillOpacity;\n delete edge.color;\n delete edge.opacity;\n delete edge.width;\n delete edge.lineStyle;\n}\n\n/**\n * For a file graphty wrote: where a viz value is the nearest GEXF value of what the `graphty.styles` block gives (a\n * hexagon written as a disc, a width and height written as one size), the block's exact value is the truth, so a\n * re-import gives the same rules. A value that differs from what graphty wrote (another program edited it) stays\n * the truth.\n * @param snapshot - the graph\n * @param text - the block's text\n * @param node - the node values, changed in place\n * @param edge - the edge values, changed in place\n */\nfunction exactFromBlock(\n snapshot: GraphSnapshot,\n text: string,\n node: Record<string, (StyleValue | null)[]>,\n edge: Record<string, (StyleValue | null)[]>,\n): void {\n const shapeRead = new Map([\n [\"disc\", \"ellipse\"],\n [\"square\", \"rectangle\"],\n ]);\n const size = (want: ElementValues): StyleValue | null => {\n const w = want(\"width\");\n const h = want(\"height\");\n return typeof w === \"number\" && typeof h === \"number\" ? Math.max(w, h) : (w ?? h);\n };\n // what the viz element written for an element's block values reads back as\n const written: Readonly<Record<string, (want: ElementValues) => StyleValue | null>> = {\n shape: (want) => {\n const { value } = gexfNodeShape(String(want(\"shape\")));\n return shapeRead.get(value) ?? value;\n },\n width: size,\n height: size,\n lineStyle: (want) => gexfEdgeShape(String(want(\"lineStyle\"))).value,\n };\n takeFromBlock(snapshot, text, \"gexf\", (target) => ({\n values: target === \"node\" ? node : edge,\n properties: target === \"node\" ? [\"shape\", \"width\", \"height\"] : [\"lineStyle\"],\n readBack: (_i, want) => (property) => written[property](want),\n // a size is written from the width and the height together: one the block leaves unset reads back too\n take: (property, wanted, native) =>\n native !== null && (wanted !== null || property === \"width\" || property === \"height\"),\n }));\n}\n\n// ============================================================ writing\n\n/** A GEXF export with styles worked out. */\nexport interface GexfStyledExport {\n /** The graph to write: the viz-derived columns the styles replace removed, the tagged style values added. */\n readonly snapshot: GraphSnapshot;\n /** The `<meta>` child holding the block. */\n readonly blockElement: string;\n /** The viz elements of one node from the styles. */\n node(row: number, indent: string): string;\n /** The viz elements of one edge from the styles. */\n edge(row: number, indent: string): string;\n /** W_STYLE_APPROXIMATED for every value written as the nearest one GEXF has. */\n readonly notes: readonly LossNote[];\n}\n\n/**\n * The dtype a tagged column is written with: numbers, booleans or text (a mixed column as text).\n * @param col - the values\n * @returns the dtype\n */\nfunction tagDtype(col: StyleColumn): \"f64\" | \"bool\" | \"string\" {\n const kinds = new Set(col.filter((v) => v !== null).map((v) => typeof v));\n if (kinds.size === 1 && kinds.has(\"number\")) {\n return \"f64\";\n }\n return kinds.size === 1 && kinds.has(\"boolean\") ? \"bool\" : \"string\";\n}\n\n/**\n * Works out a GEXF export with styles: the snapshot to write, the viz elements of each element from what graphty\n * draws, the block element and the approximations.\n * @param snapshot - the graph handed to the exporter\n * @param input - the styles, or undefined when none are written\n * @returns the styled export, or null without styles\n */\nexport function gexfStyledExport(\n snapshot: GraphSnapshot,\n input: ExporterStyleInput | undefined,\n): GexfStyledExport | null {\n if (input === undefined) {\n return null;\n }\n const p = (target: StyleTarget, property: string): readonly (StyleValue | null)[] =>\n input.picture(target, property as never);\n const fill = p(\"node\", \"fill\");\n const fillOpacity = p(\"node\", \"fillOpacity\");\n const image = p(\"node\", \"image\");\n const color = p(\"edge\", \"color\");\n const opacity = p(\"edge\", \"opacity\");\n const thickness = p(\"edge\", \"width\");\n const height = p(\"node\", \"height\");\n // the approximations are counted once, up front, so check() reports them before anything is written\n const approximated = new StyleApproximations();\n const nodeShapes = p(\"node\", \"shape\").map((s, i) => gexfShapeOf(s, typeof image[i] === \"string\", approximated));\n const nodeSizes = p(\"node\", \"width\").map((w, i) => gexfSizeOf(w, height[i], approximated));\n const edgeShapes = p(\"edge\", \"lineStyle\").map((s) => gexfLineOf(s, approximated));\n return {\n snapshot: withTagColumns(snapshot, input),\n blockElement: `<graphty:styles xmlns:graphty=\"${GRAPHTY_XML_NAMESPACE}\" name=\"${STYLE_BLOCK_NAME}\">${escapeXml(input.block)}</graphty:styles>`,\n notes: approximated.notes(\"GEXF\"),\n node(i, indent) {\n const size = nodeSizes[i];\n const s = nodeShapes[i];\n return (\n colorElement(fill[i], fillOpacity[i], indent) +\n (size === null ? \"\" : `${indent}<viz:size value=\"${String(size / 2)}\"/>\\n`) +\n shapeElement(s, s === \"image\" ? String(image[i]) : null, indent)\n );\n },\n edge(e, indent) {\n const w = thickness[e];\n // an edge in the mixed color of its nodes is left without one: Gephi, and graph-io, draw it so anyway\n const c = color[e];\n const end = (i: number): string => String(fill[i] ?? GEPHI_NODE_FILL);\n const mixed =\n typeof c === \"string\" && c === gephiMix(end(snapshot.edgeSource(e)), end(snapshot.edgeTarget(e)));\n return (\n (mixed && (opacity[e] ?? 1) === 1 ? \"\" : colorElement(c, opacity[e], indent)) +\n (typeof w === \"number\" ? `${indent}<viz:thickness value=\"${String(w)}\"/>\\n` : \"\") +\n shapeElement(edgeShapes[e], null, indent)\n );\n },\n };\n}\n\n/**\n * The snapshot to write: the viz columns the styles replace removed, the tagged style values and the drawn labels\n * added.\n * @param snapshot - the graph handed to the exporter\n * @param input - the styles\n * @returns the snapshot\n */\nfunction withTagColumns(snapshot: GraphSnapshot, input: ExporterStyleInput): GraphSnapshot {\n const out = snapshot.withColumns();\n for (const target of [\"node\", \"edge\"] as const) {\n const table = target === \"node\" ? out.nodes : out.edges;\n for (const name of VIZ_COLUMNS[target]) {\n if (table.get(name)?.meta.origin?.namespace === VIZ_NAMESPACE) {\n table.remove(name);\n }\n }\n for (const [name, col] of input.tags[target]) {\n const dtype = tagDtype(col);\n table.set(name, dtype === \"string\" ? col.map((v) => (v === null ? null : String(v))) : col, { dtype });\n }\n }\n // a node's label attribute is the label Gephi draws\n const label = input.picture(\"node\", \"label\").map((v) => (typeof v === \"string\" ? v : null));\n out.nodes.set(LABEL_COLUMN, label, { dtype: \"string\", role: \"label\" }, { replaceRole: true });\n return out;\n}\n\n/**\n * A node's GEXF shape. A node with a picture is an `image` shape, the only shape GEXF gives a uri: another shape is\n * not written.\n * @param s - the node's shape\n * @param pictured - whether the node has a picture\n * @param approximated - where approximations are counted\n * @returns the shape, or null for none\n */\nfunction gexfShapeOf(s: StyleValue | null, pictured: boolean, approximated: StyleApproximations): string | null {\n if (pictured) {\n if (typeof s === \"string\" && s !== \"other:image\") {\n approximated.add(\"node\", \"shape\", s);\n }\n return \"image\";\n }\n if (typeof s !== \"string\") {\n return null;\n }\n const g = gexfNodeShape(s);\n if (!g.exact) {\n approximated.add(\"node\", \"shape\", s);\n }\n return g.value;\n}\n\n/**\n * An edge's GEXF shape.\n * @param s - the edge's line style\n * @param approximated - where approximations are counted\n * @returns the shape, or null for none\n */\nfunction gexfLineOf(s: StyleValue | null, approximated: StyleApproximations): string | null {\n if (typeof s !== \"string\") {\n return null;\n }\n const g = gexfEdgeShape(s);\n if (!g.exact) {\n approximated.add(\"edge\", \"lineStyle\", s);\n }\n return g.value;\n}\n\n/**\n * A node's GEXF size: one value, the larger of a width and height that differ.\n * @param w - the node's width\n * @param h - its height\n * @param approximated - where approximations are counted\n * @returns the size, or null for none\n */\nfunction gexfSizeOf(w: StyleValue | null, h: StyleValue | null, approximated: StyleApproximations): number | null {\n if (typeof w === \"number\" && typeof h === \"number\" && w !== h) {\n approximated.add(\"node\", w > h ? \"height\" : \"width\", `${String(w)} x ${String(h)}`);\n return Math.max(w, h);\n }\n if (typeof w === \"number\") {\n return w;\n }\n return typeof h === \"number\" ? h : null;\n}\n\n/**\n * A `<viz:color>` element.\n * @param hex - the color, `#rrggbb`\n * @param alpha - its opacity\n * @param indent - the indentation\n * @returns the element, \"\" without a color\n */\nfunction colorElement(hex: StyleValue | null, alpha: StyleValue | null, indent: string): string {\n if (typeof hex !== \"string\") {\n return \"\";\n }\n const n = Number.parseInt(hex.slice(1), 16);\n const a = typeof alpha === \"number\" && alpha !== 1 ? ` a=\"${String(alpha)}\"` : \"\";\n return `${indent}<viz:color r=\"${String((n >> 16) & 255)}\" g=\"${String((n >> 8) & 255)}\" b=\"${String(n & 255)}\"${a}/>\\n`;\n}\n\n/**\n * A `<viz:shape>` element.\n * @param shape - the GEXF shape, or null\n * @param uri - the picture of an `image` shape, or null\n * @param indent - the indentation\n * @returns the element, \"\" without a shape\n */\nfunction shapeElement(shape: string | null, uri: string | null, indent: string): string {\n if (shape === null) {\n return \"\";\n }\n return uri === null\n ? `${indent}<viz:shape value=\"${shape}\"/>\\n`\n : `${indent}<viz:shape value=\"${shape}\" uri=\"${escapeXml(uri)}\"/>\\n`;\n}\n\n/**\n * Text as XML character data or an attribute value.\n * @param text - the text\n * @returns the escaped text\n */\nfunction escapeXml(text: string): string {\n return text.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\");\n}\n"],"names":["s"],"mappings":"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AAAA,EAChH;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChH;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAC5G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAC5G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9G;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA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"}