@graphty/graph-io 0.3.48 → 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 (570) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-Bzn3L-je.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.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-Cu22ewuS.js → block-iptrlMBb.js} +906 -164
  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-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-C3p0RQxR.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-C3p0RQxR.js.map} +1 -1
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/{credentials-BiQsnMTb.js → credentials-DXHx7nwR.js} +16 -14
  18. package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-DLA5kINx.js} +7 -2
  24. package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-BwHQkZle.js} +1660 -133
  26. package/dist/chunks/emit-BwHQkZle.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  32. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  33. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-D2CETOMK.js} +1222 -156
  34. package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
  35. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-D9yMtocA.js} +7 -7
  36. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-D9yMtocA.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-_jrBTnos.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-_jrBTnos.js.map} +1 -1
  39. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-nDfxIK5D.js} +9 -8
  40. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-nDfxIK5D.js.map} +1 -1
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-ymWCETAJ.js} +387 -31
  44. package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
  45. package/dist/chunks/{importer-e3huMZbm.js → importer-B92x1xY5.js} +14 -10
  46. package/dist/chunks/importer-B92x1xY5.js.map +1 -0
  47. package/dist/chunks/{importer-B87_fmVx.js → importer-CT9mJ1nn.js} +326 -84
  48. package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
  49. package/dist/chunks/{importer-CB_zV5_L.js → importer-DaLTjbds.js} +116 -1102
  50. package/dist/chunks/importer-DaLTjbds.js.map +1 -0
  51. package/dist/chunks/{importer-DPZDN40-.js → importer-GREKMdIf.js} +25 -17
  52. package/dist/chunks/importer-GREKMdIf.js.map +1 -0
  53. package/dist/chunks/{importer-Bji2MeWr.js → importer-PqaaKKnY.js} +13 -10
  54. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-PqaaKKnY.js.map} +1 -1
  55. package/dist/chunks/{importer-Cyy6UseH.js → importer-Vn5QvmmJ.js} +66 -13
  56. package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
  57. package/dist/chunks/{importer-CVT-JyDE.js → importer-vRq4h3j5.js} +1469 -356
  58. package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-Clf4QIyl.js} +282 -74
  64. package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
  72. package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-EokFic1V.js} +5 -5
  74. package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CCs214_3.js} +1237 -138
  76. package/dist/chunks/styles-CCs214_3.js.map +1 -0
  77. package/dist/chunks/styles-Cm62yyQX.js +2812 -0
  78. package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
  79. package/dist/chunks/styles-DPQQIig4.js +1928 -0
  80. package/dist/chunks/styles-DPQQIig4.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-UMFdNqze.js} +503 -172
  82. package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +5 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +847 -193
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +232 -220
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +138 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +16 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +405 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  137. package/dist/src/formats/dot/importer.js +108 -31
  138. package/dist/src/formats/dot/importer.js.map +1 -1
  139. package/dist/src/formats/dot/label-places.d.ts +34 -0
  140. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  141. package/dist/src/formats/dot/label-places.js +179 -0
  142. package/dist/src/formats/dot/label-places.js.map +1 -0
  143. package/dist/src/formats/dot/record.d.ts +50 -0
  144. package/dist/src/formats/dot/record.d.ts.map +1 -0
  145. package/dist/src/formats/dot/record.js +275 -0
  146. package/dist/src/formats/dot/record.js.map +1 -0
  147. package/dist/src/formats/dot/styles.d.ts +62 -2
  148. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  149. package/dist/src/formats/dot/styles.js +1454 -119
  150. package/dist/src/formats/dot/styles.js.map +1 -1
  151. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  152. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  153. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  154. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  155. package/dist/src/formats/gexf/importer.d.ts +7 -0
  156. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  157. package/dist/src/formats/gexf/importer.js +41 -5
  158. package/dist/src/formats/gexf/importer.js.map +1 -1
  159. package/dist/src/formats/gexf/preview.d.ts +77 -0
  160. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  161. package/dist/src/formats/gexf/preview.js +191 -0
  162. package/dist/src/formats/gexf/preview.js.map +1 -0
  163. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  164. package/dist/src/formats/gexf/schema.js +2 -1
  165. package/dist/src/formats/gexf/schema.js.map +1 -1
  166. package/dist/src/formats/gexf/styles.d.ts +58 -31
  167. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  168. package/dist/src/formats/gexf/styles.js +848 -225
  169. package/dist/src/formats/gexf/styles.js.map +1 -1
  170. package/dist/src/formats/gml/importer.d.ts +5 -2
  171. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  172. package/dist/src/formats/gml/importer.js +258 -71
  173. package/dist/src/formats/gml/importer.js.map +1 -1
  174. package/dist/src/formats/gml/index.d.ts +1 -1
  175. package/dist/src/formats/gml/index.d.ts.map +1 -1
  176. package/dist/src/formats/gml/index.js +1 -1
  177. package/dist/src/formats/gml/index.js.map +1 -1
  178. package/dist/src/formats/gml/positions.d.ts +7 -0
  179. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  180. package/dist/src/formats/gml/positions.js +29 -7
  181. package/dist/src/formats/gml/positions.js.map +1 -1
  182. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  183. package/dist/src/formats/gml/styles.js +753 -101
  184. package/dist/src/formats/gml/styles.js.map +1 -1
  185. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  186. package/dist/src/formats/graphml/styles-plain.js +6 -10
  187. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  188. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  189. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  190. package/dist/src/formats/graphml/styles-yed.js +692 -161
  191. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  192. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  193. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  194. package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
  195. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  196. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  197. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/yfiles.js +16 -6
  199. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  200. package/dist/src/formats/json/dialect.d.ts +3 -2
  201. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  202. package/dist/src/formats/json/dialect.js +39 -5
  203. package/dist/src/formats/json/dialect.js.map +1 -1
  204. package/dist/src/formats/json/importer.d.ts +13 -2
  205. package/dist/src/formats/json/importer.d.ts.map +1 -1
  206. package/dist/src/formats/json/importer.js +42 -6
  207. package/dist/src/formats/json/importer.js.map +1 -1
  208. package/dist/src/formats/json/index.d.ts +1 -1
  209. package/dist/src/formats/json/index.d.ts.map +1 -1
  210. package/dist/src/formats/json/index.js +1 -1
  211. package/dist/src/formats/json/index.js.map +1 -1
  212. package/dist/src/formats/json/positions.d.ts +5 -2
  213. package/dist/src/formats/json/positions.d.ts.map +1 -1
  214. package/dist/src/formats/json/positions.js +20 -4
  215. package/dist/src/formats/json/positions.js.map +1 -1
  216. package/dist/src/formats/json/styles.d.ts +12 -1
  217. package/dist/src/formats/json/styles.d.ts.map +1 -1
  218. package/dist/src/formats/json/styles.js +1755 -136
  219. package/dist/src/formats/json/styles.js.map +1 -1
  220. package/dist/src/formats/pajek/draw.d.ts +96 -0
  221. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  222. package/dist/src/formats/pajek/draw.js +372 -0
  223. package/dist/src/formats/pajek/draw.js.map +1 -0
  224. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  225. package/dist/src/formats/pajek/exporter.js +70 -51
  226. package/dist/src/formats/pajek/exporter.js.map +1 -1
  227. package/dist/src/formats/pajek/importer.d.ts +9 -0
  228. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  229. package/dist/src/formats/pajek/importer.js +233 -102
  230. package/dist/src/formats/pajek/importer.js.map +1 -1
  231. package/dist/src/formats/pajek/index.d.ts +1 -0
  232. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  233. package/dist/src/formats/pajek/index.js.map +1 -1
  234. package/dist/src/formats/pajek/styles.d.ts +15 -7
  235. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  236. package/dist/src/formats/pajek/styles.js +1278 -114
  237. package/dist/src/formats/pajek/styles.js.map +1 -1
  238. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  239. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  240. package/dist/src/formats/pajek/syntax.js +26 -2
  241. package/dist/src/formats/pajek/syntax.js.map +1 -1
  242. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  243. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  244. package/dist/src/formats/xgmml/emit.js +65 -5
  245. package/dist/src/formats/xgmml/emit.js.map +1 -1
  246. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  247. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  248. package/dist/src/formats/xgmml/styles.js +277 -60
  249. package/dist/src/formats/xgmml/styles.js.map +1 -1
  250. package/dist/src/index.d.ts +4 -3
  251. package/dist/src/index.d.ts.map +1 -1
  252. package/dist/src/index.js +4 -3
  253. package/dist/src/index.js.map +1 -1
  254. package/dist/src/positions/convert.d.ts.map +1 -1
  255. package/dist/src/positions/convert.js +11 -1
  256. package/dist/src/positions/convert.js.map +1 -1
  257. package/dist/src/positions/extract.d.ts.map +1 -1
  258. package/dist/src/positions/extract.js +53 -1
  259. package/dist/src/positions/extract.js.map +1 -1
  260. package/dist/src/positions/index.d.ts +1 -1
  261. package/dist/src/positions/index.d.ts.map +1 -1
  262. package/dist/src/positions/types.d.ts +59 -0
  263. package/dist/src/positions/types.d.ts.map +1 -1
  264. package/dist/src/sources/builtins.d.ts +1 -1
  265. package/dist/src/sources/builtins.d.ts.map +1 -1
  266. package/dist/src/sources/builtins.js +8 -2
  267. package/dist/src/sources/builtins.js.map +1 -1
  268. package/dist/src/sources/context.d.ts.map +1 -1
  269. package/dist/src/sources/context.js +1 -0
  270. package/dist/src/sources/context.js.map +1 -1
  271. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  272. package/dist/src/sources/cypher/descriptor.js +5 -0
  273. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  274. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  275. package/dist/src/sources/cypher/index.js +124 -18
  276. package/dist/src/sources/cypher/index.js.map +1 -1
  277. package/dist/src/sources/cypher/params.d.ts +1 -1
  278. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  279. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  280. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  281. package/dist/src/sources/cypher/query-builder.js +31 -0
  282. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  283. package/dist/src/sources/ids.d.ts +5 -0
  284. package/dist/src/sources/ids.d.ts.map +1 -1
  285. package/dist/src/sources/ids.js +5 -0
  286. package/dist/src/sources/ids.js.map +1 -1
  287. package/dist/src/sources/params.d.ts +3 -0
  288. package/dist/src/sources/params.d.ts.map +1 -1
  289. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  290. package/dist/src/sources/rest/descriptor.js +5 -0
  291. package/dist/src/sources/rest/descriptor.js.map +1 -1
  292. package/dist/src/sources/rest/source.d.ts.map +1 -1
  293. package/dist/src/sources/rest/source.js +15 -0
  294. package/dist/src/sources/rest/source.js.map +1 -1
  295. package/dist/src/sources/sigv4.d.ts +5 -3
  296. package/dist/src/sources/sigv4.d.ts.map +1 -1
  297. package/dist/src/sources/sigv4.js +6 -4
  298. package/dist/src/sources/sigv4.js.map +1 -1
  299. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  300. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  301. package/dist/src/sources/sparql/descriptor.js +64 -0
  302. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  303. package/dist/src/sources/sparql/index.d.ts +28 -0
  304. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  305. package/dist/src/sources/sparql/index.js +314 -0
  306. package/dist/src/sources/sparql/index.js.map +1 -0
  307. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  308. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  309. package/dist/src/sources/sparql/ntriples.js +180 -0
  310. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  311. package/dist/src/sources/sparql/params.d.ts +27 -0
  312. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  313. package/dist/src/sources/sparql/params.js +5 -0
  314. package/dist/src/sources/sparql/params.js.map +1 -0
  315. package/dist/src/sources/sparql/query.d.ts +72 -0
  316. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  317. package/dist/src/sources/sparql/query.js +113 -0
  318. package/dist/src/sources/sparql/query.js.map +1 -0
  319. package/dist/src/sources/types.d.ts +31 -0
  320. package/dist/src/sources/types.d.ts.map +1 -1
  321. package/dist/src/styles/annotations.d.ts +61 -5
  322. package/dist/src/styles/annotations.d.ts.map +1 -1
  323. package/dist/src/styles/annotations.js +130 -22
  324. package/dist/src/styles/annotations.js.map +1 -1
  325. package/dist/src/styles/canon/bends.d.ts +46 -0
  326. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  327. package/dist/src/styles/canon/bends.js +123 -0
  328. package/dist/src/styles/canon/bends.js.map +1 -1
  329. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  330. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  331. package/dist/src/styles/canon/color-tables.js +10 -4
  332. package/dist/src/styles/canon/color-tables.js.map +1 -1
  333. package/dist/src/styles/canon/color.d.ts +3 -1
  334. package/dist/src/styles/canon/color.d.ts.map +1 -1
  335. package/dist/src/styles/canon/color.js +103 -3
  336. package/dist/src/styles/canon/color.js.map +1 -1
  337. package/dist/src/styles/canon/enums.d.ts +2 -2
  338. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  339. package/dist/src/styles/canon/enums.js +81 -7
  340. package/dist/src/styles/canon/enums.js.map +1 -1
  341. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  342. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  343. package/dist/src/styles/canon/graphviz.js +57 -9
  344. package/dist/src/styles/canon/graphviz.js.map +1 -1
  345. package/dist/src/styles/canon/number.d.ts +8 -0
  346. package/dist/src/styles/canon/number.d.ts.map +1 -1
  347. package/dist/src/styles/canon/number.js +18 -0
  348. package/dist/src/styles/canon/number.js.map +1 -1
  349. package/dist/src/styles/canon/text.d.ts +29 -2
  350. package/dist/src/styles/canon/text.d.ts.map +1 -1
  351. package/dist/src/styles/canon/text.js +156 -16
  352. package/dist/src/styles/canon/text.js.map +1 -1
  353. package/dist/src/styles/codes.d.ts +2 -0
  354. package/dist/src/styles/codes.d.ts.map +1 -1
  355. package/dist/src/styles/codes.js +2 -0
  356. package/dist/src/styles/codes.js.map +1 -1
  357. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  358. package/dist/src/styles/cyjs/cascade.js +1015 -79
  359. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  360. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  361. package/dist/src/styles/cyjs/defaults-table.js +3 -0
  362. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  363. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  364. package/dist/src/styles/cyjs/emit.js +202 -9
  365. package/dist/src/styles/cyjs/emit.js.map +1 -1
  366. package/dist/src/styles/cyjs/face.d.ts +20 -0
  367. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  368. package/dist/src/styles/cyjs/face.js +332 -0
  369. package/dist/src/styles/cyjs/face.js.map +1 -0
  370. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  371. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  372. package/dist/src/styles/cyjs/mappers.js +461 -26
  373. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  374. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  375. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  376. package/dist/src/styles/cyjs/routes.js +360 -0
  377. package/dist/src/styles/cyjs/routes.js.map +1 -0
  378. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  379. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  380. package/dist/src/styles/cytoscape/charts.js +560 -0
  381. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  382. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  383. package/dist/src/styles/cytoscape/emit.js +156 -48
  384. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  385. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  386. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  387. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  388. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  389. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  390. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  391. package/dist/src/styles/cytoscape/mappings.js +92 -0
  392. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  393. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  394. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  395. package/dist/src/styles/cytoscape/resolve.js +623 -17
  396. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  397. package/dist/src/styles/defaults.d.ts +46 -26
  398. package/dist/src/styles/defaults.d.ts.map +1 -1
  399. package/dist/src/styles/defaults.js +308 -71
  400. package/dist/src/styles/defaults.js.map +1 -1
  401. package/dist/src/styles/index.d.ts +4 -3
  402. package/dist/src/styles/index.d.ts.map +1 -1
  403. package/dist/src/styles/index.js +3 -2
  404. package/dist/src/styles/index.js.map +1 -1
  405. package/dist/src/styles/internal.d.ts +1 -0
  406. package/dist/src/styles/internal.d.ts.map +1 -1
  407. package/dist/src/styles/internal.js +1 -0
  408. package/dist/src/styles/internal.js.map +1 -1
  409. package/dist/src/styles/io/generic.d.ts.map +1 -1
  410. package/dist/src/styles/io/generic.js +56 -16
  411. package/dist/src/styles/io/generic.js.map +1 -1
  412. package/dist/src/styles/io/round-trip.d.ts +56 -0
  413. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  414. package/dist/src/styles/io/round-trip.js +138 -0
  415. package/dist/src/styles/io/round-trip.js.map +1 -0
  416. package/dist/src/styles/io/writer.d.ts.map +1 -1
  417. package/dist/src/styles/io/writer.js +6 -1
  418. package/dist/src/styles/io/writer.js.map +1 -1
  419. package/dist/src/styles/notes.d.ts.map +1 -1
  420. package/dist/src/styles/notes.js +1 -0
  421. package/dist/src/styles/notes.js.map +1 -1
  422. package/dist/src/styles/plan/features.d.ts +1 -1
  423. package/dist/src/styles/plan/features.d.ts.map +1 -1
  424. package/dist/src/styles/plan/features.js +22 -2
  425. package/dist/src/styles/plan/features.js.map +1 -1
  426. package/dist/src/styles/plan/index.d.ts +1 -1
  427. package/dist/src/styles/plan/index.d.ts.map +1 -1
  428. package/dist/src/styles/plan/index.js +1 -1
  429. package/dist/src/styles/plan/index.js.map +1 -1
  430. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  431. package/dist/src/styles/plan/plan.js +61 -4
  432. package/dist/src/styles/plan/plan.js.map +1 -1
  433. package/dist/src/styles/plan/resolve.d.ts +11 -0
  434. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  435. package/dist/src/styles/plan/resolve.js +40 -4
  436. package/dist/src/styles/plan/resolve.js.map +1 -1
  437. package/dist/src/styles/slots.d.ts +14 -0
  438. package/dist/src/styles/slots.d.ts.map +1 -0
  439. package/dist/src/styles/slots.js +20 -0
  440. package/dist/src/styles/slots.js.map +1 -0
  441. package/dist/src/styles/types.d.ts +622 -6
  442. package/dist/src/styles/types.d.ts.map +1 -1
  443. package/dist/src/styles/vocabulary.d.ts +3 -2
  444. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  445. package/dist/src/styles/vocabulary.js +203 -0
  446. package/dist/src/styles/vocabulary.js.map +1 -1
  447. package/dist/styles.js +30 -239
  448. package/dist/styles.js.map +1 -1
  449. package/dist/xgmml.js +3 -3
  450. package/package.json +27 -7
  451. package/src/formats/cx/importer.ts +6 -1
  452. package/src/formats/cx/styles.ts +143 -9
  453. package/src/formats/cx2/importer.ts +1 -0
  454. package/src/formats/cx2/styles.ts +3 -1
  455. package/src/formats/cys/importer.ts +1 -0
  456. package/src/formats/cys/styles.ts +27 -5
  457. package/src/formats/dot/drawing.ts +799 -0
  458. package/src/formats/dot/importer.ts +120 -35
  459. package/src/formats/dot/label-places.ts +228 -0
  460. package/src/formats/dot/record.ts +336 -0
  461. package/src/formats/dot/styles.ts +1654 -153
  462. package/src/formats/gexf/dialog-metrics.ts +61 -0
  463. package/src/formats/gexf/importer.ts +50 -5
  464. package/src/formats/gexf/preview.ts +217 -0
  465. package/src/formats/gexf/schema.ts +2 -1
  466. package/src/formats/gexf/styles.ts +1099 -245
  467. package/src/formats/gml/importer.ts +291 -76
  468. package/src/formats/gml/index.ts +1 -1
  469. package/src/formats/gml/positions.ts +29 -7
  470. package/src/formats/gml/styles.ts +851 -109
  471. package/src/formats/graphml/styles-plain.ts +6 -15
  472. package/src/formats/graphml/styles-yed.ts +762 -173
  473. package/src/formats/graphml/styles-yfiles3.ts +485 -63
  474. package/src/formats/graphml/yfiles.ts +19 -6
  475. package/src/formats/json/dialect.ts +41 -5
  476. package/src/formats/json/importer.ts +59 -7
  477. package/src/formats/json/index.ts +1 -0
  478. package/src/formats/json/positions.ts +22 -5
  479. package/src/formats/json/styles.ts +2041 -185
  480. package/src/formats/pajek/draw.ts +458 -0
  481. package/src/formats/pajek/exporter.ts +81 -49
  482. package/src/formats/pajek/importer.ts +278 -103
  483. package/src/formats/pajek/index.ts +1 -0
  484. package/src/formats/pajek/styles.ts +1381 -133
  485. package/src/formats/pajek/syntax.ts +27 -2
  486. package/src/formats/xgmml/emit.ts +73 -5
  487. package/src/formats/xgmml/styles.ts +330 -71
  488. package/src/index.ts +5 -1
  489. package/src/positions/convert.ts +12 -1
  490. package/src/positions/extract.ts +55 -1
  491. package/src/positions/index.ts +1 -0
  492. package/src/positions/types.ts +60 -0
  493. package/src/sources/builtins.ts +8 -1
  494. package/src/sources/context.ts +1 -0
  495. package/src/sources/cypher/descriptor.ts +7 -1
  496. package/src/sources/cypher/index.ts +148 -18
  497. package/src/sources/cypher/params.ts +1 -1
  498. package/src/sources/cypher/query-builder.ts +33 -0
  499. package/src/sources/ids.ts +6 -0
  500. package/src/sources/params.ts +3 -0
  501. package/src/sources/rest/descriptor.ts +5 -0
  502. package/src/sources/rest/source.ts +16 -0
  503. package/src/sources/sigv4.ts +6 -4
  504. package/src/sources/sparql/descriptor.ts +67 -0
  505. package/src/sources/sparql/index.ts +356 -0
  506. package/src/sources/sparql/ntriples.ts +219 -0
  507. package/src/sources/sparql/params.ts +28 -0
  508. package/src/sources/sparql/query.ts +162 -0
  509. package/src/sources/types.ts +35 -0
  510. package/src/styles/annotations.ts +201 -27
  511. package/src/styles/canon/bends.ts +137 -0
  512. package/src/styles/canon/color-tables.ts +10 -4
  513. package/src/styles/canon/color.ts +105 -3
  514. package/src/styles/canon/enums.ts +98 -8
  515. package/src/styles/canon/graphviz.ts +71 -10
  516. package/src/styles/canon/number.ts +19 -0
  517. package/src/styles/canon/text.ts +187 -16
  518. package/src/styles/codes.ts +2 -0
  519. package/src/styles/cyjs/cascade.ts +1160 -84
  520. package/src/styles/cyjs/defaults-table.ts +3 -0
  521. package/src/styles/cyjs/emit.ts +233 -13
  522. package/src/styles/cyjs/face.ts +372 -0
  523. package/src/styles/cyjs/mappers.ts +492 -27
  524. package/src/styles/cyjs/routes.ts +432 -0
  525. package/src/styles/cytoscape/charts.ts +684 -0
  526. package/src/styles/cytoscape/emit.ts +170 -48
  527. package/src/styles/cytoscape/lexicon.ts +431 -78
  528. package/src/styles/cytoscape/mappings.ts +108 -0
  529. package/src/styles/cytoscape/resolve.ts +741 -17
  530. package/src/styles/defaults.ts +417 -108
  531. package/src/styles/index.ts +5 -0
  532. package/src/styles/internal.ts +1 -0
  533. package/src/styles/io/generic.ts +79 -23
  534. package/src/styles/io/round-trip.ts +202 -0
  535. package/src/styles/io/writer.ts +6 -1
  536. package/src/styles/notes.ts +1 -0
  537. package/src/styles/plan/features.ts +23 -2
  538. package/src/styles/plan/index.ts +1 -1
  539. package/src/styles/plan/plan.ts +69 -5
  540. package/src/styles/plan/resolve.ts +47 -4
  541. package/src/styles/slots.ts +25 -0
  542. package/src/styles/types.ts +633 -5
  543. package/src/styles/vocabulary.ts +211 -2
  544. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  545. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  546. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  547. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  548. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  549. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  550. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  551. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  552. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  553. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  554. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  555. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  556. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  557. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  558. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  559. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  560. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  561. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  562. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  563. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  564. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  565. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  566. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  567. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  568. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  569. package/dist/chunks/writer-DvHTl36J.js +0 -449
  570. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -0,0 +1,61 @@
1
+ /**
2
+ * The advance widths of Java's logical font "Dialog" (DejaVu Sans on the Linux JRE the Gephi oracle runs on), which
3
+ * Gephi measures its node labels with, in thousandths of an em: what Font.getStringBounds gives for one character with
4
+ * fractional metrics on (Temurin JDK 17, Font("Dialog").deriveFont(1000f).getStringBounds). No kerning
5
+ * ("AV" is A + V). Its line box is 1.1640625 em tall (ascent plus descent, no leading).
6
+ */
7
+
8
+ /** The widths of U+0020 .. U+007E. */
9
+ const ASCII = [
10
+ 318, 401, 460, 838, 636, 950, 780, 275, 390, 390, 500, 838, 318, 361, 318, 337, 636, 636, 636, 636, 636, 636, 636,
11
+ 636, 636, 636, 337, 337, 838, 838, 838, 531, 1000, 684, 686, 698, 770, 632, 575, 775, 752, 295, 295, 656, 557, 863,
12
+ 748, 787, 603, 787, 695, 635, 611, 732, 684, 989, 685, 611, 685, 390, 337, 390, 838, 500, 500, 613, 635, 550, 635,
13
+ 615, 352, 635, 634, 278, 278, 579, 278, 974, 634, 612, 635, 635, 411, 521, 392, 634, 592, 818, 592, 592, 525, 636,
14
+ 337, 636, 838,
15
+ ];
16
+
17
+ /** The widths of U+00A0 .. U+024F (Latin-1 Supplement, Latin Extended-A and -B). */
18
+ const LATIN = [
19
+ 318, 401, 636, 636, 636, 636, 337, 500, 500, 1000, 471, 612, 838, 361, 1000, 500, 500, 838, 401, 401, 500, 636, 636,
20
+ 318, 500, 401, 471, 612, 969, 969, 969, 531, 684, 684, 684, 684, 684, 684, 974, 698, 632, 632, 632, 632, 295, 295,
21
+ 295, 295, 775, 748, 787, 787, 787, 787, 787, 838, 787, 732, 732, 732, 732, 611, 605, 630, 613, 613, 613, 613, 613,
22
+ 613, 982, 550, 615, 615, 615, 615, 278, 278, 278, 278, 612, 634, 612, 612, 612, 612, 612, 838, 612, 634, 634, 634,
23
+ 634, 592, 635, 592, 684, 613, 684, 613, 684, 613, 698, 550, 698, 550, 698, 550, 698, 550, 770, 635, 775, 635, 632,
24
+ 615, 632, 615, 632, 615, 632, 615, 632, 615, 775, 635, 775, 635, 775, 635, 775, 635, 752, 634, 916, 695, 295, 278,
25
+ 295, 278, 295, 278, 295, 278, 295, 278, 590, 556, 295, 278, 656, 579, 579, 557, 278, 557, 278, 557, 375, 557, 342,
26
+ 562, 284, 748, 634, 748, 634, 748, 634, 813, 748, 634, 787, 612, 787, 612, 787, 612, 1070, 1023, 695, 411, 695, 411,
27
+ 695, 411, 635, 521, 635, 521, 635, 521, 635, 521, 611, 392, 611, 392, 611, 392, 732, 634, 732, 634, 732, 634, 732,
28
+ 634, 732, 634, 732, 634, 989, 818, 611, 592, 611, 685, 525, 685, 525, 685, 525, 352, 635, 735, 686, 635, 686, 635,
29
+ 703, 698, 550, 775, 819, 686, 635, 612, 632, 787, 614, 575, 352, 775, 687, 984, 354, 295, 746, 579, 278, 592, 974,
30
+ 748, 634, 787, 913, 612, 949, 759, 652, 635, 695, 635, 521, 632, 336, 392, 611, 392, 611, 858, 634, 764, 721, 744,
31
+ 730, 685, 525, 666, 666, 578, 525, 636, 666, 578, 510, 635, 295, 492, 459, 295, 1422, 1299, 1154, 835, 787, 457,
32
+ 931, 924, 797, 684, 613, 295, 278, 787, 612, 732, 634, 732, 634, 732, 634, 732, 634, 732, 634, 615, 684, 613, 684,
33
+ 613, 974, 982, 775, 635, 775, 635, 656, 579, 787, 612, 787, 612, 666, 578, 278, 1422, 1299, 1154, 775, 635, 1113,
34
+ 682, 748, 634, 684, 613, 974, 982, 787, 612, 684, 613, 684, 613, 632, 615, 632, 615, 295, 278, 295, 278, 787, 612,
35
+ 787, 612, 695, 411, 695, 411, 732, 634, 732, 634, 635, 521, 611, 392, 627, 521, 752, 634, 735, 838, 698, 610, 685,
36
+ 525, 684, 613, 632, 615, 787, 612, 787, 612, 787, 612, 787, 612, 611, 592, 475, 843, 477, 278, 998, 998, 684, 698,
37
+ 550, 557, 611, 521, 525, 603, 479, 686, 732, 684, 632, 615, 295, 278, 781, 635, 695, 411, 611, 592,
38
+ ];
39
+
40
+ /** How tall Dialog's line box is, in ems: what getStringBounds gives as a string's height. */
41
+ export const DIALOG_LINE_HEIGHT = 1.1640625;
42
+
43
+ /**
44
+ * How wide Dialog draws a text, in ems.
45
+ * @param text - the text
46
+ * @returns its advance width
47
+ */
48
+ export function dialogWidth(text: string): number {
49
+ let sum = 0;
50
+ for (const ch of text) {
51
+ const c = ch.codePointAt(0) ?? 0;
52
+ // ponytail: a character outside the table (CJK and other scripts Java falls back to another font for) is
53
+ // counted a full em; a measured table per script when a sample needs it
54
+ if (c >= 32 && c < 127) {
55
+ sum += ASCII[c - 32];
56
+ } else {
57
+ sum += c >= 160 && c < 0x250 ? LATIN[c - 160] : 1000;
58
+ }
59
+ }
60
+ return sum / 1000;
61
+ }
@@ -128,6 +128,13 @@ export interface GexfImportOptions extends CommonImportOptions {
128
128
  * @defaultValue true
129
129
  */
130
130
  viz?: boolean | undefined;
131
+ /**
132
+ * The Gephi Preview settings the file is drawn with, by Gephi's own property names and values as Gephi's
133
+ * Preview spells them (`{ "edge.curved": "false", "node.label.avoidOverlap": "false" }`): Gephi keeps them in its
134
+ * project, not in the GEXF, so a file's styles are Gephi's defaults unless they are given here. Read only when
135
+ * the file's styles are read; a property not given keeps Gephi's default.
136
+ */
137
+ gephiPreview?: Readonly<Record<string, string | number | boolean>> | undefined;
131
138
  }
132
139
 
133
140
  /**
@@ -641,6 +648,9 @@ class GexfReader implements XmlHandler {
641
648
  /** The text of graphty's `graphty.styles` block, read up to one character past the longest block read. */
642
649
  private styleBlock = "";
643
650
 
651
+ /** The `graphty.styles` block kept for the styles, or null. */
652
+ keptBlock: string | null = null;
653
+
644
654
  /** GEXF 1.0 only: nodes added for edges read before `<nodes>`, until their `<node>` declares them. */
645
655
  private readonly implicitNodes = new Map<number, NodeId>();
646
656
 
@@ -870,6 +880,7 @@ class GexfReader implements XmlHandler {
870
880
  return;
871
881
  case Ctx.StyleBlock:
872
882
  this.report.keepForStyles(this.styleBlock);
883
+ this.keptBlock = this.styleBlock;
873
884
  this.styleBlock = "";
874
885
  return;
875
886
  case Ctx.Graph:
@@ -2841,8 +2852,9 @@ class GexfReader implements XmlHandler {
2841
2852
 
2842
2853
  /**
2843
2854
  * `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
2844
- * `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; a channel outside 0..255 or an alpha outside 0..1 is clamped and
2845
- * reported, as Gephi clamps it.
2855
+ * Gephi reads it (Java's `Color.decode`: `canonVizColor`), and wins over `r` / `g` / `b` when both are written, as Gephi
2856
+ * reads it (`gexf-specimen-node-fills-borders`, `color-hex-and-rgb`); a channel outside 0..255 or an alpha
2857
+ * outside 0..1 is clamped and reported, as Gephi clamps it.
2846
2858
  * @param attrs - the element's attributes
2847
2859
  * @param name - the element name as written
2848
2860
  * @param where - the element's location
@@ -2851,12 +2863,12 @@ class GexfReader implements XmlHandler {
2851
2863
  private vizColor(attrs: ReadonlyMap<string, string>, name: string, where: IssueLocation): number[] {
2852
2864
  const hex = attrs.get("hex");
2853
2865
  let rgba: number[];
2854
- if (hex !== undefined && !attrs.has("r")) {
2866
+ if (hex !== undefined) {
2855
2867
  const c = canonVizColor(hex);
2856
2868
  if (c === null) {
2857
2869
  throw new GraphFormatError(
2858
2870
  "E_COLUMN_TYPE",
2859
- `viz hex="${hex}" is not a #RRGGBB, #RGB or #RRGGBBAA color`,
2871
+ `viz hex="${hex}" is not a color Gephi reads (a #-prefixed hexadecimal, 0x, octal or decimal integer)`,
2860
2872
  { attribute: "hex" },
2861
2873
  );
2862
2874
  }
@@ -3104,13 +3116,42 @@ function resolveGexfOptions(options: (GexfImportOptions & CommonImportOptions) |
3104
3116
  return viz;
3105
3117
  }
3106
3118
 
3119
+ /**
3120
+ * The `gephiPreview` option, each value as text.
3121
+ * @param options - the import options
3122
+ * @returns the settings, or null when none are given
3123
+ */
3124
+ function resolveGephiPreview(options: GexfImportOptions | undefined): Readonly<Record<string, string>> | null {
3125
+ const preview = options?.gephiPreview;
3126
+ if (preview === undefined) {
3127
+ return null;
3128
+ }
3129
+ const bad = (found: unknown): never => {
3130
+ throw new GraphFormatError("E_UNSUPPORTED", "option gephiPreview: not an object of Preview property values", {
3131
+ option: "gephiPreview",
3132
+ found,
3133
+ });
3134
+ };
3135
+ if (typeof preview !== "object" || preview === null || Array.isArray(preview)) {
3136
+ return bad(preview);
3137
+ }
3138
+ const out: Record<string, string> = {};
3139
+ for (const [name, value] of Object.entries(preview)) {
3140
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
3141
+ return bad(value);
3142
+ }
3143
+ out[name] = String(value);
3144
+ }
3145
+ return out;
3146
+ }
3147
+
3107
3148
  /**
3108
3149
  * The GEXF importer.
3109
3150
  * @category Built-in formats
3110
3151
  */
3111
3152
  export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
3112
3153
  format: GEXF_FORMAT,
3113
- options: Object.freeze(["viz"]),
3154
+ options: Object.freeze(["viz", "gephiPreview"]),
3114
3155
  extensions: Object.freeze([".gexf"]),
3115
3156
  mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
3116
3157
  sniff: sniffGexf,
@@ -3156,6 +3197,10 @@ export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
3156
3197
  throw err;
3157
3198
  }
3158
3199
  reader.finish();
3200
+ const preview = resolveGephiPreview(options);
3201
+ if (preview !== null) {
3202
+ report.keepForStyles({ block: reader.keptBlock, gephiPreview: preview });
3203
+ }
3159
3204
  // an abort raised during the last few elements (after the last periodic check) still rejects
3160
3205
  throwIfAborted(resolved.signal);
3161
3206
  return report.finish();
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Gephi's Preview settings: what Gephi keeps in its project, not in a GEXF file, and how each one changes the
3
+ * drawing. Every rule here was measured on the Gephi Toolkit 0.11.3's SVG export of the GEXF specimen sheets
4
+ * (`graph-io/test/fidelity/specimens/gexf/pages.json`, one Preview setting per page).
5
+ */
6
+
7
+ import type { StyleValue } from "../../styles/types.js";
8
+
9
+ /**
10
+ * Gephi's Preview defaults as the Gephi Toolkit 0.11.3 spells them (a fresh PreviewModel), with node labels shown,
11
+ * as graph-io has always drawn a GEXF file.
12
+ */
13
+ const GEPHI_PREVIEW: Readonly<Record<string, string>> = Object.freeze({
14
+ "edge.show": "true",
15
+ "edge.thickness": "1.0",
16
+ "edge.use-weight": "true",
17
+ "edge.rescale-weight": "false",
18
+ "edge.rescale-weight.min": "0.4",
19
+ "edge.rescale-weight.max": "8.0",
20
+ "edge.color": "mixed",
21
+ "edge.opacity": "100.0",
22
+ "edge.curved": "true",
23
+ "arrow.size": "3.0",
24
+ "node.border.fixed": "false",
25
+ "node.border.width": "1.0",
26
+ "node.border.color": "darker",
27
+ "node.opacity": "100.0",
28
+ "node.per.node.opacity": "false",
29
+ "node.label.show": "true",
30
+ "node.label.customFont": "false",
31
+ "node.label.font": "Dialog,plain,12",
32
+ "node.label.proportinalSize": "true",
33
+ "node.label.color": "#000000",
34
+ "node.label.shorten": "false",
35
+ "node.label.avoidOverlap": "true",
36
+ "node.label.overlapGridSize": "10",
37
+ "node.label.scale": "1.0",
38
+ "node.label.max-char": "30",
39
+ "node.label.outline.size": "0.0",
40
+ "node.label.outline.color": "#ffffff",
41
+ "node.label.outline.opacity": "80.0",
42
+ "node.label.box": "false",
43
+ "node.label.box.color": "parent",
44
+ "node.label.box.opacity": "100.0",
45
+ "edge.label.show": "false",
46
+ "edge.label.customFont": "false",
47
+ "edge.label.font": "Dialog,plain,10",
48
+ "edge.label.color": "original",
49
+ "edge.label.shorten": "false",
50
+ "edge.label.max-char": "30",
51
+ "edge.label.outline.size": "0.0",
52
+ "edge.label.outline.color": "#ffffff",
53
+ "edge.label.outline.opacity": "80.0",
54
+ });
55
+
56
+ /** A Java Font as Gephi's Preview writes it: `Family,style,size`. */
57
+ export interface GephiFont {
58
+ readonly family: string;
59
+ readonly bold: boolean;
60
+ readonly italic: boolean;
61
+ readonly size: number;
62
+ }
63
+
64
+ /** The Preview settings a drawing was made with: Gephi's defaults under the ones given. */
65
+ export class GephiPreview {
66
+ private readonly values: Readonly<Record<string, string>>;
67
+
68
+ /**
69
+ * The settings: Gephi's defaults under the ones given.
70
+ * @param given - the settings given, by Gephi's property names
71
+ */
72
+ constructor(given: Readonly<Record<string, string>> = {}) {
73
+ this.values = { ...GEPHI_PREVIEW, ...given };
74
+ }
75
+
76
+ /**
77
+ * A setting's text, trimmed and lower case.
78
+ * @param name - the property
79
+ * @returns the text
80
+ */
81
+ text(name: string): string {
82
+ return (this.values[name] ?? "").trim().toLowerCase();
83
+ }
84
+
85
+ /**
86
+ * A boolean setting.
87
+ * @param name - the property
88
+ * @returns its value
89
+ */
90
+ on(name: string): boolean {
91
+ return this.text(name) === "true";
92
+ }
93
+
94
+ /**
95
+ * A number setting; Gephi's default where the text is not a number.
96
+ * @param name - the property
97
+ * @returns its value
98
+ */
99
+ num(name: string): number {
100
+ const v = Number(this.text(name));
101
+ return Number.isFinite(v) ? v : Number(GEPHI_PREVIEW[name] ?? 0);
102
+ }
103
+
104
+ /**
105
+ * The font of node or edge labels: the given font when `<target>.label.customFont` is on, else Gephi's.
106
+ * @param target - "node" or "edge"
107
+ * @returns the font
108
+ */
109
+ font(target: "node" | "edge"): GephiFont {
110
+ const name = `${target}.label.font`;
111
+ const raw = this.on(`${target}.label.customFont`) ? (this.values[name] ?? "") : (GEPHI_PREVIEW[name] ?? "");
112
+ const [family = "Dialog", style = "plain", size = ""] = raw.split(",").map((s) => s.trim());
113
+ const s = style.toLowerCase();
114
+ const pt = Number(size);
115
+ const fallback = target === "node" ? 12 : 10;
116
+ return {
117
+ family,
118
+ bold: s.includes("bold"),
119
+ italic: s.includes("italic"),
120
+ size: Number.isFinite(pt) && pt > 0 ? pt : fallback,
121
+ };
122
+ }
123
+ }
124
+
125
+ /**
126
+ * A label as Gephi's shorten setting cuts it: only a label of at least max-char + 3 characters, to its first max-char
127
+ * characters and "..." (`gexf-specimen-labels-p7`, `-p8`).
128
+ * @param label - the label
129
+ * @param max - max-char
130
+ * @returns the label drawn
131
+ */
132
+ function shortened(label: string, max: number): string {
133
+ return label.length >= max + 3 ? `${label.slice(0, max)}...` : label;
134
+ }
135
+
136
+ /**
137
+ * A color derived from another as Gephi's DependantColor modes derive it: `darker` halves each channel, `lighter`
138
+ * raises each by half (to 255 at most), `parent` (and `original`) is the color itself, `#rrggbb` is that color.
139
+ * @param mode - the mode, lower case
140
+ * @param parent - the color it derives from, r, g and b 0..255
141
+ * @returns the color as r, g and b, or null for a mode Gephi does not have
142
+ */
143
+ export function dependantColor(mode: string, parent: readonly number[]): number[] | null {
144
+ switch (mode) {
145
+ case "darker":
146
+ return parent.slice(0, 3).map((v) => Math.floor(v / 2));
147
+ case "lighter":
148
+ return parent.slice(0, 3).map((v) => Math.min(255, Math.floor(v * 1.5)));
149
+ case "parent":
150
+ case "original":
151
+ return parent.slice(0, 3);
152
+ default: {
153
+ const m = /^#([0-9a-f]{6})$/.exec(mode);
154
+ if (m === null) {
155
+ return null;
156
+ }
157
+ const n = Number.parseInt(m[1], 16);
158
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
159
+ }
160
+ }
161
+ }
162
+
163
+ /**
164
+ * The labels drawn: none when `<target>.label.show` is off, each cut when `<target>.label.shorten` is on, and, unless
165
+ * the file keeps its own values, with its line breaks left out, as Java's `drawString` draws a label on one line with
166
+ * nothing for a break ("line one\nline two" is drawn "line oneline two": Gephi Toolkit 0.11.3's preview and PNG
167
+ * export, `gexf-specimen-labels`).
168
+ * @param labels - each element's label, or undefined when none has one
169
+ * @param preview - the settings
170
+ * @param target - "node" or "edge"
171
+ * @param kept - whether the file keeps its own values (a `graphty.styles` block): its line breaks are drawn
172
+ * @returns the labels drawn, or undefined for none
173
+ */
174
+ export function drawnLabels(
175
+ labels: readonly (StyleValue | null)[] | undefined,
176
+ preview: GephiPreview,
177
+ target: "node" | "edge",
178
+ kept = false,
179
+ ): (StyleValue | null)[] | undefined {
180
+ if (labels === undefined || !preview.on(`${target}.label.show`)) {
181
+ return undefined;
182
+ }
183
+ const max = preview.on(`${target}.label.shorten`) ? preview.num(`${target}.label.max-char`) : Infinity;
184
+ const drawn = (l: string): string => (kept ? l : l.replaceAll(/[\r\n]/g, ""));
185
+ return labels.map((l) => (typeof l === "string" ? drawn(shortened(l, max)) : l));
186
+ }
187
+
188
+ /**
189
+ * Each edge's weight as Gephi draws its thickness: with `edge.use-weight` off, `edge.thickness`; else the weight,
190
+ * rescaled linearly from the smallest and largest drawn weights to `edge.rescale-weight.min` .. `.max` when
191
+ * `edge.rescale-weight` is on, times `edge.thickness` (`gexf-specimen-edges-lines-p8` .. `-p11`).
192
+ * @param weights - each edge's weight
193
+ * @param drawn - whether each edge is drawn
194
+ * @param preview - the settings
195
+ * @returns each edge's thickness
196
+ */
197
+ export function edgeThickness(weights: readonly number[], drawn: readonly boolean[], preview: GephiPreview): number[] {
198
+ const thickness = preview.num("edge.thickness");
199
+ if (!preview.on("edge.use-weight")) {
200
+ return weights.map(() => thickness);
201
+ }
202
+ if (!preview.on("edge.rescale-weight")) {
203
+ return weights.map((w) => w * thickness);
204
+ }
205
+ // loops, not Math.min(...): a spread of every edge overflows the call stack on a large graph
206
+ let lo = Infinity;
207
+ let hi = -Infinity;
208
+ weights.forEach((w, e) => {
209
+ if (drawn[e]) {
210
+ lo = Math.min(lo, w);
211
+ hi = Math.max(hi, w);
212
+ }
213
+ });
214
+ const min = preview.num("edge.rescale-weight.min");
215
+ const max = preview.num("edge.rescale-weight.max");
216
+ return weights.map((w) => (hi > lo ? min + ((w - lo) / (hi - lo)) * (max - min) : min) * thickness);
217
+ }
@@ -195,7 +195,8 @@ export const NODE_DECLS: Readonly<Record<keyof typeof NODE_COLUMNS, ColumnDecl>>
195
195
  mutable: true,
196
196
  nullable: true,
197
197
  origin: VIZ_ORIGIN,
198
- extra: { units: "file" },
198
+ // Gephi puts a node with no viz:position at the origin (gexf-specimen-node-sizes-opacity: position-none)
199
+ extra: { units: "file", originUnplaced: true },
199
200
  },
200
201
  color: {
201
202
  name: NODE_COLUMNS.color,