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