@graphty/graph-io 0.3.48 → 0.3.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (600) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
  3. package/dist/chunks/bends-BGXjv_U4.js +129 -0
  4. package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
  5. package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
  6. package/dist/chunks/block-yl0f_qLO.js.map +1 -0
  7. package/dist/chunks/choose-CczZJaX_.js +717 -0
  8. package/dist/chunks/choose-CczZJaX_.js.map +1 -0
  9. package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
  18. package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
  24. package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
  26. package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
  32. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
  33. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
  34. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
  35. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  36. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
  39. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
  40. package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
  44. package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
  45. package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
  46. package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
  47. package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
  48. package/dist/chunks/importer-CKFe4q54.js.map +1 -0
  49. package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
  50. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
  51. package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
  52. package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
  53. package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
  54. package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
  55. package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
  56. package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
  57. package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
  58. package/dist/chunks/importer-asFUrIsj.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
  64. package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
  72. package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
  74. package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
  76. package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
  77. package/dist/chunks/styles-CPczw1Jz.js +1928 -0
  78. package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
  79. package/dist/chunks/styles-boK6Ln54.js +2847 -0
  80. package/dist/chunks/styles-boK6Ln54.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
  82. package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +8 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +848 -194
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +230 -193
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +141 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +32 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +439 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  137. package/dist/src/formats/dot/exporter.js +34 -2
  138. package/dist/src/formats/dot/exporter.js.map +1 -1
  139. package/dist/src/formats/dot/importer.d.ts +6 -1
  140. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  141. package/dist/src/formats/dot/importer.js +170 -33
  142. package/dist/src/formats/dot/importer.js.map +1 -1
  143. package/dist/src/formats/dot/index.d.ts +3 -1
  144. package/dist/src/formats/dot/index.d.ts.map +1 -1
  145. package/dist/src/formats/dot/index.js +2 -1
  146. package/dist/src/formats/dot/index.js.map +1 -1
  147. package/dist/src/formats/dot/label-places.d.ts +41 -0
  148. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  149. package/dist/src/formats/dot/label-places.js +185 -0
  150. package/dist/src/formats/dot/label-places.js.map +1 -0
  151. package/dist/src/formats/dot/names.d.ts +13 -0
  152. package/dist/src/formats/dot/names.d.ts.map +1 -1
  153. package/dist/src/formats/dot/names.js +13 -0
  154. package/dist/src/formats/dot/names.js.map +1 -1
  155. package/dist/src/formats/dot/record.d.ts +50 -0
  156. package/dist/src/formats/dot/record.d.ts.map +1 -0
  157. package/dist/src/formats/dot/record.js +275 -0
  158. package/dist/src/formats/dot/record.js.map +1 -0
  159. package/dist/src/formats/dot/styles.d.ts +72 -2
  160. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  161. package/dist/src/formats/dot/styles.js +1500 -119
  162. package/dist/src/formats/dot/styles.js.map +1 -1
  163. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  165. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  167. package/dist/src/formats/gexf/importer.d.ts +7 -0
  168. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  169. package/dist/src/formats/gexf/importer.js +41 -5
  170. package/dist/src/formats/gexf/importer.js.map +1 -1
  171. package/dist/src/formats/gexf/preview.d.ts +77 -0
  172. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  173. package/dist/src/formats/gexf/preview.js +191 -0
  174. package/dist/src/formats/gexf/preview.js.map +1 -0
  175. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  176. package/dist/src/formats/gexf/schema.js +2 -1
  177. package/dist/src/formats/gexf/schema.js.map +1 -1
  178. package/dist/src/formats/gexf/styles.d.ts +58 -31
  179. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  180. package/dist/src/formats/gexf/styles.js +848 -225
  181. package/dist/src/formats/gexf/styles.js.map +1 -1
  182. package/dist/src/formats/gml/importer.d.ts +5 -2
  183. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  184. package/dist/src/formats/gml/importer.js +258 -71
  185. package/dist/src/formats/gml/importer.js.map +1 -1
  186. package/dist/src/formats/gml/index.d.ts +1 -1
  187. package/dist/src/formats/gml/index.d.ts.map +1 -1
  188. package/dist/src/formats/gml/index.js +1 -1
  189. package/dist/src/formats/gml/index.js.map +1 -1
  190. package/dist/src/formats/gml/positions.d.ts +7 -0
  191. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  192. package/dist/src/formats/gml/positions.js +29 -7
  193. package/dist/src/formats/gml/positions.js.map +1 -1
  194. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  195. package/dist/src/formats/gml/styles.js +754 -102
  196. package/dist/src/formats/gml/styles.js.map +1 -1
  197. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.js +6 -10
  199. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  200. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  201. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  202. package/dist/src/formats/graphml/styles-yed.js +695 -164
  203. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  204. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
  207. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  208. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  209. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  210. package/dist/src/formats/graphml/yfiles.js +16 -6
  211. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  212. package/dist/src/formats/json/dialect.d.ts +3 -2
  213. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  214. package/dist/src/formats/json/dialect.js +39 -5
  215. package/dist/src/formats/json/dialect.js.map +1 -1
  216. package/dist/src/formats/json/importer.d.ts +13 -2
  217. package/dist/src/formats/json/importer.d.ts.map +1 -1
  218. package/dist/src/formats/json/importer.js +42 -6
  219. package/dist/src/formats/json/importer.js.map +1 -1
  220. package/dist/src/formats/json/index.d.ts +1 -1
  221. package/dist/src/formats/json/index.d.ts.map +1 -1
  222. package/dist/src/formats/json/index.js +1 -1
  223. package/dist/src/formats/json/index.js.map +1 -1
  224. package/dist/src/formats/json/positions.d.ts +5 -2
  225. package/dist/src/formats/json/positions.d.ts.map +1 -1
  226. package/dist/src/formats/json/positions.js +20 -4
  227. package/dist/src/formats/json/positions.js.map +1 -1
  228. package/dist/src/formats/json/styles.d.ts +12 -1
  229. package/dist/src/formats/json/styles.d.ts.map +1 -1
  230. package/dist/src/formats/json/styles.js +1843 -136
  231. package/dist/src/formats/json/styles.js.map +1 -1
  232. package/dist/src/formats/pajek/draw.d.ts +104 -0
  233. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  234. package/dist/src/formats/pajek/draw.js +382 -0
  235. package/dist/src/formats/pajek/draw.js.map +1 -0
  236. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  237. package/dist/src/formats/pajek/exporter.js +70 -51
  238. package/dist/src/formats/pajek/exporter.js.map +1 -1
  239. package/dist/src/formats/pajek/importer.d.ts +9 -0
  240. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  241. package/dist/src/formats/pajek/importer.js +233 -102
  242. package/dist/src/formats/pajek/importer.js.map +1 -1
  243. package/dist/src/formats/pajek/index.d.ts +1 -0
  244. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  245. package/dist/src/formats/pajek/index.js.map +1 -1
  246. package/dist/src/formats/pajek/styles.d.ts +15 -7
  247. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  248. package/dist/src/formats/pajek/styles.js +1395 -114
  249. package/dist/src/formats/pajek/styles.js.map +1 -1
  250. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  251. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  252. package/dist/src/formats/pajek/syntax.js +26 -2
  253. package/dist/src/formats/pajek/syntax.js.map +1 -1
  254. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  255. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  256. package/dist/src/formats/xgmml/emit.js +65 -5
  257. package/dist/src/formats/xgmml/emit.js.map +1 -1
  258. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  259. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  260. package/dist/src/formats/xgmml/styles.js +277 -60
  261. package/dist/src/formats/xgmml/styles.js.map +1 -1
  262. package/dist/src/index.d.ts +6 -5
  263. package/dist/src/index.d.ts.map +1 -1
  264. package/dist/src/index.js +6 -5
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/positions/convert.d.ts.map +1 -1
  267. package/dist/src/positions/convert.js +11 -1
  268. package/dist/src/positions/convert.js.map +1 -1
  269. package/dist/src/positions/extract.d.ts.map +1 -1
  270. package/dist/src/positions/extract.js +53 -1
  271. package/dist/src/positions/extract.js.map +1 -1
  272. package/dist/src/positions/index.d.ts +1 -1
  273. package/dist/src/positions/index.d.ts.map +1 -1
  274. package/dist/src/positions/types.d.ts +59 -0
  275. package/dist/src/positions/types.d.ts.map +1 -1
  276. package/dist/src/sources/builtins.d.ts +1 -1
  277. package/dist/src/sources/builtins.d.ts.map +1 -1
  278. package/dist/src/sources/builtins.js +8 -2
  279. package/dist/src/sources/builtins.js.map +1 -1
  280. package/dist/src/sources/context.d.ts.map +1 -1
  281. package/dist/src/sources/context.js +1 -0
  282. package/dist/src/sources/context.js.map +1 -1
  283. package/dist/src/sources/credentials.d.ts +50 -1
  284. package/dist/src/sources/credentials.d.ts.map +1 -1
  285. package/dist/src/sources/credentials.js +69 -0
  286. package/dist/src/sources/credentials.js.map +1 -1
  287. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  288. package/dist/src/sources/cypher/descriptor.js +5 -0
  289. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  290. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  291. package/dist/src/sources/cypher/index.js +125 -18
  292. package/dist/src/sources/cypher/index.js.map +1 -1
  293. package/dist/src/sources/cypher/params.d.ts +1 -1
  294. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  295. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  296. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  297. package/dist/src/sources/cypher/query-builder.js +31 -0
  298. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  299. package/dist/src/sources/ids.d.ts +5 -0
  300. package/dist/src/sources/ids.d.ts.map +1 -1
  301. package/dist/src/sources/ids.js +5 -0
  302. package/dist/src/sources/ids.js.map +1 -1
  303. package/dist/src/sources/params.d.ts +3 -0
  304. package/dist/src/sources/params.d.ts.map +1 -1
  305. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  306. package/dist/src/sources/rest/descriptor.js +9 -0
  307. package/dist/src/sources/rest/descriptor.js.map +1 -1
  308. package/dist/src/sources/rest/openalex.d.ts +4 -2
  309. package/dist/src/sources/rest/openalex.d.ts.map +1 -1
  310. package/dist/src/sources/rest/openalex.js +4 -2
  311. package/dist/src/sources/rest/openalex.js.map +1 -1
  312. package/dist/src/sources/rest/source.d.ts.map +1 -1
  313. package/dist/src/sources/rest/source.js +38 -0
  314. package/dist/src/sources/rest/source.js.map +1 -1
  315. package/dist/src/sources/run.d.ts +2 -0
  316. package/dist/src/sources/run.d.ts.map +1 -1
  317. package/dist/src/sources/run.js +30 -3
  318. package/dist/src/sources/run.js.map +1 -1
  319. package/dist/src/sources/sigv4.d.ts +5 -3
  320. package/dist/src/sources/sigv4.d.ts.map +1 -1
  321. package/dist/src/sources/sigv4.js +6 -4
  322. package/dist/src/sources/sigv4.js.map +1 -1
  323. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  324. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  325. package/dist/src/sources/sparql/descriptor.js +64 -0
  326. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  327. package/dist/src/sources/sparql/index.d.ts +28 -0
  328. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  329. package/dist/src/sources/sparql/index.js +327 -0
  330. package/dist/src/sources/sparql/index.js.map +1 -0
  331. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  332. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  333. package/dist/src/sources/sparql/ntriples.js +180 -0
  334. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  335. package/dist/src/sources/sparql/params.d.ts +27 -0
  336. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  337. package/dist/src/sources/sparql/params.js +5 -0
  338. package/dist/src/sources/sparql/params.js.map +1 -0
  339. package/dist/src/sources/sparql/query.d.ts +73 -0
  340. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  341. package/dist/src/sources/sparql/query.js +164 -0
  342. package/dist/src/sources/sparql/query.js.map +1 -0
  343. package/dist/src/sources/types.d.ts +60 -0
  344. package/dist/src/sources/types.d.ts.map +1 -1
  345. package/dist/src/styles/annotations.d.ts +61 -5
  346. package/dist/src/styles/annotations.d.ts.map +1 -1
  347. package/dist/src/styles/annotations.js +130 -22
  348. package/dist/src/styles/annotations.js.map +1 -1
  349. package/dist/src/styles/canon/bends.d.ts +46 -0
  350. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  351. package/dist/src/styles/canon/bends.js +123 -0
  352. package/dist/src/styles/canon/bends.js.map +1 -1
  353. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  354. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  355. package/dist/src/styles/canon/color-tables.js +10 -4
  356. package/dist/src/styles/canon/color-tables.js.map +1 -1
  357. package/dist/src/styles/canon/color.d.ts +3 -1
  358. package/dist/src/styles/canon/color.d.ts.map +1 -1
  359. package/dist/src/styles/canon/color.js +103 -3
  360. package/dist/src/styles/canon/color.js.map +1 -1
  361. package/dist/src/styles/canon/enums.d.ts +2 -2
  362. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  363. package/dist/src/styles/canon/enums.js +89 -7
  364. package/dist/src/styles/canon/enums.js.map +1 -1
  365. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  366. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  367. package/dist/src/styles/canon/graphviz.js +57 -9
  368. package/dist/src/styles/canon/graphviz.js.map +1 -1
  369. package/dist/src/styles/canon/number.d.ts +8 -0
  370. package/dist/src/styles/canon/number.d.ts.map +1 -1
  371. package/dist/src/styles/canon/number.js +18 -0
  372. package/dist/src/styles/canon/number.js.map +1 -1
  373. package/dist/src/styles/canon/text.d.ts +29 -2
  374. package/dist/src/styles/canon/text.d.ts.map +1 -1
  375. package/dist/src/styles/canon/text.js +156 -16
  376. package/dist/src/styles/canon/text.js.map +1 -1
  377. package/dist/src/styles/codes.d.ts +2 -0
  378. package/dist/src/styles/codes.d.ts.map +1 -1
  379. package/dist/src/styles/codes.js +2 -0
  380. package/dist/src/styles/codes.js.map +1 -1
  381. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  382. package/dist/src/styles/cyjs/cascade.js +1139 -79
  383. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  384. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  385. package/dist/src/styles/cyjs/defaults-table.js +4 -0
  386. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  387. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  388. package/dist/src/styles/cyjs/emit.js +232 -10
  389. package/dist/src/styles/cyjs/emit.js.map +1 -1
  390. package/dist/src/styles/cyjs/face.d.ts +20 -0
  391. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  392. package/dist/src/styles/cyjs/face.js +332 -0
  393. package/dist/src/styles/cyjs/face.js.map +1 -0
  394. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  395. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  396. package/dist/src/styles/cyjs/mappers.js +475 -26
  397. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  398. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  399. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  400. package/dist/src/styles/cyjs/routes.js +360 -0
  401. package/dist/src/styles/cyjs/routes.js.map +1 -0
  402. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  403. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  404. package/dist/src/styles/cytoscape/charts.js +560 -0
  405. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  406. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  407. package/dist/src/styles/cytoscape/emit.js +156 -48
  408. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  409. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  410. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  411. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  412. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  413. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  414. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  415. package/dist/src/styles/cytoscape/mappings.js +92 -0
  416. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  417. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  418. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  419. package/dist/src/styles/cytoscape/resolve.js +623 -17
  420. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  421. package/dist/src/styles/defaults.d.ts +46 -26
  422. package/dist/src/styles/defaults.d.ts.map +1 -1
  423. package/dist/src/styles/defaults.js +308 -71
  424. package/dist/src/styles/defaults.js.map +1 -1
  425. package/dist/src/styles/index.d.ts +4 -3
  426. package/dist/src/styles/index.d.ts.map +1 -1
  427. package/dist/src/styles/index.js +3 -2
  428. package/dist/src/styles/index.js.map +1 -1
  429. package/dist/src/styles/internal.d.ts +1 -0
  430. package/dist/src/styles/internal.d.ts.map +1 -1
  431. package/dist/src/styles/internal.js +1 -0
  432. package/dist/src/styles/internal.js.map +1 -1
  433. package/dist/src/styles/io/generic.d.ts.map +1 -1
  434. package/dist/src/styles/io/generic.js +56 -16
  435. package/dist/src/styles/io/generic.js.map +1 -1
  436. package/dist/src/styles/io/round-trip.d.ts +56 -0
  437. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  438. package/dist/src/styles/io/round-trip.js +138 -0
  439. package/dist/src/styles/io/round-trip.js.map +1 -0
  440. package/dist/src/styles/io/writer.d.ts.map +1 -1
  441. package/dist/src/styles/io/writer.js +6 -1
  442. package/dist/src/styles/io/writer.js.map +1 -1
  443. package/dist/src/styles/notes.d.ts.map +1 -1
  444. package/dist/src/styles/notes.js +1 -0
  445. package/dist/src/styles/notes.js.map +1 -1
  446. package/dist/src/styles/plan/features.d.ts +1 -1
  447. package/dist/src/styles/plan/features.d.ts.map +1 -1
  448. package/dist/src/styles/plan/features.js +22 -2
  449. package/dist/src/styles/plan/features.js.map +1 -1
  450. package/dist/src/styles/plan/index.d.ts +1 -1
  451. package/dist/src/styles/plan/index.d.ts.map +1 -1
  452. package/dist/src/styles/plan/index.js +1 -1
  453. package/dist/src/styles/plan/index.js.map +1 -1
  454. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  455. package/dist/src/styles/plan/plan.js +61 -4
  456. package/dist/src/styles/plan/plan.js.map +1 -1
  457. package/dist/src/styles/plan/resolve.d.ts +11 -0
  458. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  459. package/dist/src/styles/plan/resolve.js +40 -4
  460. package/dist/src/styles/plan/resolve.js.map +1 -1
  461. package/dist/src/styles/slots.d.ts +14 -0
  462. package/dist/src/styles/slots.d.ts.map +1 -0
  463. package/dist/src/styles/slots.js +20 -0
  464. package/dist/src/styles/slots.js.map +1 -0
  465. package/dist/src/styles/types.d.ts +687 -6
  466. package/dist/src/styles/types.d.ts.map +1 -1
  467. package/dist/src/styles/vocabulary.d.ts +3 -2
  468. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  469. package/dist/src/styles/vocabulary.js +224 -0
  470. package/dist/src/styles/vocabulary.js.map +1 -1
  471. package/dist/styles.js +30 -239
  472. package/dist/styles.js.map +1 -1
  473. package/dist/xgmml.js +3 -3
  474. package/package.json +27 -7
  475. package/src/formats/cx/importer.ts +6 -1
  476. package/src/formats/cx/styles.ts +143 -9
  477. package/src/formats/cx2/importer.ts +1 -0
  478. package/src/formats/cx2/styles.ts +3 -1
  479. package/src/formats/cys/importer.ts +1 -0
  480. package/src/formats/cys/styles.ts +27 -5
  481. package/src/formats/dot/drawing.ts +799 -0
  482. package/src/formats/dot/exporter.ts +37 -1
  483. package/src/formats/dot/importer.ts +192 -36
  484. package/src/formats/dot/index.ts +3 -1
  485. package/src/formats/dot/label-places.ts +241 -0
  486. package/src/formats/dot/names.ts +15 -0
  487. package/src/formats/dot/record.ts +336 -0
  488. package/src/formats/dot/styles.ts +1702 -149
  489. package/src/formats/gexf/dialog-metrics.ts +61 -0
  490. package/src/formats/gexf/importer.ts +50 -5
  491. package/src/formats/gexf/preview.ts +217 -0
  492. package/src/formats/gexf/schema.ts +2 -1
  493. package/src/formats/gexf/styles.ts +1099 -245
  494. package/src/formats/gml/importer.ts +291 -76
  495. package/src/formats/gml/index.ts +1 -1
  496. package/src/formats/gml/positions.ts +29 -7
  497. package/src/formats/gml/styles.ts +852 -110
  498. package/src/formats/graphml/styles-plain.ts +6 -15
  499. package/src/formats/graphml/styles-yed.ts +765 -176
  500. package/src/formats/graphml/styles-yfiles3.ts +487 -63
  501. package/src/formats/graphml/yfiles.ts +19 -6
  502. package/src/formats/json/dialect.ts +41 -5
  503. package/src/formats/json/importer.ts +59 -7
  504. package/src/formats/json/index.ts +1 -0
  505. package/src/formats/json/positions.ts +22 -5
  506. package/src/formats/json/styles.ts +2123 -171
  507. package/src/formats/pajek/draw.ts +469 -0
  508. package/src/formats/pajek/exporter.ts +81 -49
  509. package/src/formats/pajek/importer.ts +278 -103
  510. package/src/formats/pajek/index.ts +1 -0
  511. package/src/formats/pajek/styles.ts +1506 -133
  512. package/src/formats/pajek/syntax.ts +27 -2
  513. package/src/formats/xgmml/emit.ts +73 -5
  514. package/src/formats/xgmml/styles.ts +330 -71
  515. package/src/index.ts +12 -1
  516. package/src/positions/convert.ts +12 -1
  517. package/src/positions/extract.ts +55 -1
  518. package/src/positions/index.ts +1 -0
  519. package/src/positions/types.ts +60 -0
  520. package/src/sources/builtins.ts +8 -1
  521. package/src/sources/context.ts +1 -0
  522. package/src/sources/credentials.ts +90 -1
  523. package/src/sources/cypher/descriptor.ts +7 -1
  524. package/src/sources/cypher/index.ts +149 -18
  525. package/src/sources/cypher/params.ts +1 -1
  526. package/src/sources/cypher/query-builder.ts +33 -0
  527. package/src/sources/ids.ts +6 -0
  528. package/src/sources/params.ts +3 -0
  529. package/src/sources/rest/descriptor.ts +9 -0
  530. package/src/sources/rest/openalex.ts +4 -2
  531. package/src/sources/rest/source.ts +41 -0
  532. package/src/sources/run.ts +35 -3
  533. package/src/sources/sigv4.ts +6 -4
  534. package/src/sources/sparql/descriptor.ts +67 -0
  535. package/src/sources/sparql/index.ts +371 -0
  536. package/src/sources/sparql/ntriples.ts +219 -0
  537. package/src/sources/sparql/params.ts +28 -0
  538. package/src/sources/sparql/query.ts +216 -0
  539. package/src/sources/types.ts +68 -0
  540. package/src/styles/annotations.ts +201 -27
  541. package/src/styles/canon/bends.ts +137 -0
  542. package/src/styles/canon/color-tables.ts +10 -4
  543. package/src/styles/canon/color.ts +105 -3
  544. package/src/styles/canon/enums.ts +107 -8
  545. package/src/styles/canon/graphviz.ts +71 -10
  546. package/src/styles/canon/number.ts +19 -0
  547. package/src/styles/canon/text.ts +187 -16
  548. package/src/styles/codes.ts +2 -0
  549. package/src/styles/cyjs/cascade.ts +1303 -84
  550. package/src/styles/cyjs/defaults-table.ts +4 -0
  551. package/src/styles/cyjs/emit.ts +268 -14
  552. package/src/styles/cyjs/face.ts +372 -0
  553. package/src/styles/cyjs/mappers.ts +506 -27
  554. package/src/styles/cyjs/routes.ts +432 -0
  555. package/src/styles/cytoscape/charts.ts +684 -0
  556. package/src/styles/cytoscape/emit.ts +170 -48
  557. package/src/styles/cytoscape/lexicon.ts +431 -78
  558. package/src/styles/cytoscape/mappings.ts +108 -0
  559. package/src/styles/cytoscape/resolve.ts +741 -17
  560. package/src/styles/defaults.ts +417 -108
  561. package/src/styles/index.ts +5 -0
  562. package/src/styles/internal.ts +1 -0
  563. package/src/styles/io/generic.ts +79 -23
  564. package/src/styles/io/round-trip.ts +202 -0
  565. package/src/styles/io/writer.ts +6 -1
  566. package/src/styles/notes.ts +1 -0
  567. package/src/styles/plan/features.ts +23 -2
  568. package/src/styles/plan/index.ts +1 -1
  569. package/src/styles/plan/plan.ts +69 -5
  570. package/src/styles/plan/resolve.ts +47 -4
  571. package/src/styles/slots.ts +25 -0
  572. package/src/styles/types.ts +698 -5
  573. package/src/styles/vocabulary.ts +232 -2
  574. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  575. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  576. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  577. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  578. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  579. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  580. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  581. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  582. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  583. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  584. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  585. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  586. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  587. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  588. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  589. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  590. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  591. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  592. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  593. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  594. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  595. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  596. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  597. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  598. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  599. package/dist/chunks/writer-DvHTl36J.js +0 -449
  600. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -0,0 +1,469 @@
1
+ /**
2
+ * Pajek's Draw window and export options: what Pajek keeps in its ini file and its Draw menu, not in the network file,
3
+ * and how each one changes the drawing. Every rule here was measured on Pajek 6.02's own SVG export of the Pajek
4
+ * specimen pages (`graph-io/test/fidelity/specimens/pajek/pages.json`, one option per page).
5
+ */
6
+
7
+ import { GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
8
+
9
+ import type { StyleValue } from "../../styles/types.js";
10
+
11
+ /**
12
+ * How a Pajek network is drawn, which Pajek keeps in its ini file and its Draw menu rather than in the file: the size
13
+ * of the Draw window, the partition and vectors Draw > Network + Partition (+ Vector) uses, and the window's options.
14
+ * @category Built-in formats
15
+ */
16
+ export interface PajekDrawOptions {
17
+ /**
18
+ * The Draw window's width in px. Pajek stretches the file's x from 0..1 across it, while vertex sizes, line
19
+ * widths and fonts stay fixed px.
20
+ * @defaultValue 500, the square Pajek's EPS export maps 0..1 to
21
+ */
22
+ readonly width?: number | undefined;
23
+ /**
24
+ * The Draw window's height in px; the file's y from 0..1 is stretched down it.
25
+ * @defaultValue 500
26
+ */
27
+ readonly height?: number | undefined;
28
+ /**
29
+ * Draw > Network + Partition: which `*Partition` of a project file colors the vertices, 1 for its first. Each
30
+ * vertex is filled with the partition color of its cluster (cluster 0 Cyan, 1 Yellow, 2 LimeGreen, 3 Red, ...).
31
+ * Absent or 0 draws the vertices' own colors.
32
+ */
33
+ readonly partition?: number | undefined;
34
+ /**
35
+ * Draw > Network + Vector: which `*Vector` of a project file sizes the vertices, 1 for its first. A vertex is drawn
36
+ * the square root of its value times its own size (0 draws it at no size, a negative value at its own size).
37
+ */
38
+ readonly vector?: number | undefined;
39
+ /**
40
+ * Draw > Network + First Vector + Second Vector: which `*Vector` sets the vertices' heights while `vector` sets
41
+ * their widths, each value then a plain factor of the vertex's own width or height.
42
+ */
43
+ readonly vector2?: number | undefined;
44
+ /**
45
+ * Options of Pajek's ini file by the names its SAVEINI writes; a flag is on when given as "", true, or a value
46
+ * other than "0" or false. Read: `Form8.MarkVerticesUsing` (1 labels, 2 vertex numbers, 3 no labels, 4 no labels
47
+ * and no arrows), `Form8.SizeofVertices` (8), `TransparencyofVertices` and `TransparencyofLines` (the SVG
48
+ * export's opacities, 0 to 1), `Form10.StraightLinesOnly1` (every line straight) and `Form10.ColorGradientLines`
49
+ * (each line a gradient of its end vertices' colors), `Form8.withLabels1` (the lines' labels drawn; without it
50
+ * none is) and `Form10.effect3d` (each vertex filled with a gradient down to half its color). Any other option is
51
+ * ignored.
52
+ */
53
+ readonly ini?: Readonly<Record<string, string | number | boolean>> | undefined;
54
+ }
55
+
56
+ /** The Draw window's size in px. */
57
+ export interface DrawWindow {
58
+ readonly width: number;
59
+ readonly height: number;
60
+ }
61
+
62
+ /** The `pajekDraw` option, checked: every field present, each ini value as text. */
63
+ export interface PajekDraw extends DrawWindow {
64
+ readonly partition: number;
65
+ readonly vector: number;
66
+ readonly vector2: number;
67
+ readonly ini: ReadonlyMap<string, string>;
68
+ }
69
+
70
+ /** The square Pajek's EPS export maps the file's 0..1 coordinates to, and the Draw window's size by default. */
71
+ const PAJEK_WINDOW = 500;
72
+
73
+ /**
74
+ * The `pajekDraw` import option, checked.
75
+ * @param option - the option as given
76
+ * @returns the draw settings, or null when none are given
77
+ */
78
+ export function resolvePajekDraw(option: unknown): PajekDraw | null {
79
+ if (option === undefined) {
80
+ return null;
81
+ }
82
+ const bad = (found: unknown): never => {
83
+ throw new GraphFormatError("E_UNSUPPORTED", "option pajekDraw: not an object of Pajek draw settings", {
84
+ option: "pajekDraw",
85
+ found,
86
+ });
87
+ };
88
+ if (typeof option !== "object" || option === null || Array.isArray(option)) {
89
+ return bad(option);
90
+ }
91
+ const o = option as PajekDrawOptions;
92
+ const num = (v: unknown, fallback: number, positive: boolean): number => {
93
+ if (v === undefined) {
94
+ return fallback;
95
+ }
96
+ if (typeof v !== "number" || !Number.isFinite(v)) {
97
+ return bad(v);
98
+ }
99
+ const inRange = positive ? v > 0 : v >= 0;
100
+ return inRange ? v : bad(v);
101
+ };
102
+ const ini = new Map<string, string>();
103
+ for (const [name, value] of Object.entries(o.ini ?? {})) {
104
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
105
+ return bad(value);
106
+ }
107
+ ini.set(name, String(value));
108
+ }
109
+ return {
110
+ width: num(o.width, PAJEK_WINDOW, true),
111
+ height: num(o.height, PAJEK_WINDOW, true),
112
+ partition: num(o.partition, 0, false),
113
+ vector: num(o.vector, 0, false),
114
+ vector2: num(o.vector2, 0, false),
115
+ ini,
116
+ };
117
+ }
118
+
119
+ /**
120
+ * Whether an ini flag is on.
121
+ * @param draw - the settings
122
+ * @param name - the option
123
+ * @returns true when given as "", "true" or any value but "0" and "false"
124
+ */
125
+ function flag(draw: PajekDraw, name: string): boolean {
126
+ const v = draw.ini.get(name);
127
+ return v !== undefined && v !== "0" && v !== "false";
128
+ }
129
+
130
+ /**
131
+ * Whether Pajek draws the lines' labels: only under Options / Lines / Mark Lines / with Labels (`Form8.withLabels1`);
132
+ * its default, Mark Lines / No, draws none (`pajek-specimen-edge-labels` against `-p2`, `pajek-synth-lines`: 28 `l`
133
+ * labels, none drawn).
134
+ * @param draw - the settings, or null when the import names none (Pajek's defaults)
135
+ * @returns true when the line labels are drawn
136
+ */
137
+ export function drawsLineLabels(draw: PajekDraw | null): boolean {
138
+ return draw !== null && flag(draw, "Form8.withLabels1");
139
+ }
140
+
141
+ /**
142
+ * Whether Pajek draws the arcs it would bow apart (a mutual pair, parallel arcs) straight: under Export Line Default /
143
+ * Straight Lines (`Form10.StraightLinesOnly1`, `pajek-specimen-edges-lines-p4` against `-p2`). A line's own Bezier
144
+ * route stays curved.
145
+ * @param draw - the settings, or null when the import names none (Pajek's defaults)
146
+ * @returns true when they are drawn straight
147
+ */
148
+ export function drawsStraightLines(draw: PajekDraw | null): boolean {
149
+ return draw !== null && flag(draw, "Form10.StraightLinesOnly1");
150
+ }
151
+
152
+ /**
153
+ * An ini number.
154
+ * @param draw - the settings
155
+ * @param name - the option
156
+ * @returns the number, or null when not given or not a number
157
+ */
158
+ function iniNumber(draw: PajekDraw, name: string): number | null {
159
+ const v = draw.ini.get(name);
160
+ const n = v === undefined || v.trim() === "" ? Number.NaN : Number(v);
161
+ return Number.isFinite(n) ? n : null;
162
+ }
163
+
164
+ /**
165
+ * Pajek's 40 partition colors, cluster k drawn in entry k modulo 40 (a negative cluster as its absolute value): the
166
+ * fills Pajek 6.02's SVG export draws for clusters 0 to 39 (`pajek-specimen-mappings-bypass.svg`, `part-*`; the
167
+ * manual's Figure 20 names them Cyan, Yellow, LimeGreen, Red, Blue, ...).
168
+ */
169
+ const PARTITION_COLORS: readonly string[] = [
170
+ "#00ffff",
171
+ "#ffff00",
172
+ "#7fff00",
173
+ "#ff0000",
174
+ "#0000ff",
175
+ "#ffd8f2",
176
+ "#ffffff",
177
+ "#ff6321",
178
+ "#8c23ff",
179
+ "#606dc4",
180
+ "#1ef9a3",
181
+ "#009900",
182
+ "#7f7f7f",
183
+ "#000000",
184
+ "#ad0000",
185
+ "#ccffb2",
186
+ "#ffff99",
187
+ "#ff00ff",
188
+ "#007091",
189
+ "#ffb528",
190
+ "#ff0a9b",
191
+ "#00e000",
192
+ "#ff779e",
193
+ "#d8f2ff",
194
+ "#d8ff4f",
195
+ "#ff84ff",
196
+ "#e5ffcc",
197
+ "#ccccff",
198
+ "#59ddff",
199
+ "#ffd9bc",
200
+ "#db9370",
201
+ "#ccffff",
202
+ "#d8d8d8",
203
+ "#666666",
204
+ "#a5a5a5",
205
+ "#3f3f3f",
206
+ "#e5e5e5",
207
+ "#262626",
208
+ "#bfbfbf",
209
+ "#595959",
210
+ ];
211
+
212
+ /** Pajek's vertex size (`styles.ts`) and its fill where a vertex sets none. */
213
+ const VERTEX_SIZE = 20;
214
+ const VERTEX_FILL = "#ffd9bc";
215
+
216
+ /** The Draw window's default `Form8.SizeofVertices`. */
217
+ const SIZE_OF_VERTICES = 8;
218
+
219
+ /** Per-element values by property, as the style reader builds them. */
220
+ type Values = Record<string, (StyleValue | null)[]>;
221
+
222
+ /**
223
+ * The node column a project file's n-th object of a kind went to (`meta.extra.pajek.objects`).
224
+ * @param snapshot - the graph
225
+ * @param kind - "partition" or "vector"
226
+ * @param n - 1 for the first
227
+ * @returns the column's values, or null
228
+ */
229
+ function objectValues(snapshot: GraphSnapshot, kind: string, n: number): ((i: number) => number | null) | null {
230
+ if (n < 1) {
231
+ return null;
232
+ }
233
+ const pajek = snapshot.meta.extra.pajek as { objects?: { kind: string; column: string }[] } | undefined;
234
+ const name = pajek?.objects?.filter((o) => o.kind === kind)[n - 1]?.column;
235
+ if (name === undefined || !snapshot.nodes.has(name)) {
236
+ return null;
237
+ }
238
+ return (i) => {
239
+ const v = snapshot.nodes.value(name, i);
240
+ return typeof v === "number" && Number.isFinite(v) ? v : null;
241
+ };
242
+ }
243
+
244
+ /**
245
+ * One property's column, made when first written.
246
+ * @param values - the values
247
+ * @param property - the property
248
+ * @param n - the element count
249
+ * @returns the column
250
+ */
251
+ function column(values: Values, property: string, n: number): (StyleValue | null)[] {
252
+ values[property] ??= new Array<StyleValue | null>(n).fill(null);
253
+ return values[property];
254
+ }
255
+
256
+ /**
257
+ * Draws the vertices under the Draw window's options and Draw > Network + Partition (+ Vector), in place.
258
+ * @param draw - the settings
259
+ * @param snapshot - the graph
260
+ * @param node - the vertices' values, as the file sets them
261
+ */
262
+ export function drawVertices(draw: PajekDraw, snapshot: GraphSnapshot, node: Values): void {
263
+ const n = snapshot.nodeCount;
264
+ const width = column(node, "width", n);
265
+ const height = column(node, "height", n);
266
+ scaleVertexSizes(draw, width, height);
267
+ sizeByVectors(draw, snapshot, width, height);
268
+ colorByPartition(draw, snapshot, node);
269
+ // SVG Opacity of Vertices: Pajek writes it as the vertex's opacity and its stroke-opacity both, so the fill is
270
+ // drawn at it and the border at its square (`pajek-specimen-node-sizes-opacity-p3`: 0.5 fills at 0.5, strokes at
271
+ // 0.25); the label is drawn opaque
272
+ const opacity = iniNumber(draw, "TransparencyofVertices");
273
+ if (opacity !== null && opacity < 1) {
274
+ const o = Math.max(0, opacity);
275
+ const fill = column(node, "fillOpacity", n);
276
+ fill.forEach((v, i) => {
277
+ fill[i] = (typeof v === "number" ? v : 1) * o;
278
+ });
279
+ column(node, "borderOpacity", n).fill(o * o);
280
+ }
281
+ if (flag(draw, "Form10.effect3d")) {
282
+ effect3d(snapshot, node);
283
+ }
284
+ markVertices(draw, node, n);
285
+ for (const property of ["width", "height"]) {
286
+ if (node[property].every((v) => v === null)) {
287
+ Reflect.deleteProperty(node, property);
288
+ }
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Options / Size / of Vertices s scales each axis by f = s / 8: an axis the file sizes (x_fact, y_fact) by f, and
294
+ * an axis it does not by f squared, each on its own (`pajek-specimen-node-sizes-opacity-p2` at 16; probed at 4, 16
295
+ * and 24: `x_fact 1.8 y_fact 1.8` 18, 72, 108 across; no parameters 5, 80, 180; `x_fact 2` alone 20 x 5, 80 x 80,
296
+ * 120 x 180).
297
+ * @param draw - the settings
298
+ * @param width - the vertices' widths, changed in place
299
+ * @param height - the vertices' heights, changed in place
300
+ */
301
+ function scaleVertexSizes(draw: PajekDraw, width: (StyleValue | null)[], height: (StyleValue | null)[]): void {
302
+ const size = iniNumber(draw, "Form8.SizeofVertices");
303
+ if (size === null || size === SIZE_OF_VERTICES) {
304
+ return;
305
+ }
306
+ const f = size / SIZE_OF_VERTICES;
307
+ const scaled = (v: StyleValue | null): number => (typeof v === "number" ? v * f : VERTEX_SIZE * f * f);
308
+ for (let i = 0; i < width.length; i++) {
309
+ width[i] = scaled(width[i]);
310
+ height[i] = scaled(height[i]);
311
+ }
312
+ }
313
+
314
+ /**
315
+ * Draw > Network + Partition: fills each vertex in its class's color.
316
+ * @param draw - the settings
317
+ * @param snapshot - the graph
318
+ * @param node - the vertices' values, changed in place
319
+ */
320
+ function colorByPartition(draw: PajekDraw, snapshot: GraphSnapshot, node: Values): void {
321
+ const partition = objectValues(snapshot, "partition", draw.partition);
322
+ if (partition === null) {
323
+ return;
324
+ }
325
+ const fill = column(node, "fill", snapshot.nodeCount);
326
+ for (let i = 0; i < snapshot.nodeCount; i++) {
327
+ const k = partition(i);
328
+ if (k !== null) {
329
+ fill[i] = PARTITION_COLORS[Math.abs(k) % PARTITION_COLORS.length];
330
+ }
331
+ }
332
+ }
333
+
334
+ /**
335
+ * Options / Mark Vertices Using: 2 labels each vertex with its number, 3 and 4 with nothing.
336
+ * @param draw - the settings
337
+ * @param node - the vertices' values, changed in place
338
+ * @param n - the vertex count
339
+ */
340
+ function markVertices(draw: PajekDraw, node: Values, n: number): void {
341
+ const mark = iniNumber(draw, "Form8.MarkVerticesUsing");
342
+ if (mark === 2) {
343
+ // ponytail: a vertex's number is its place in the file, as in every file Pajek writes
344
+ column(node, "label", n).forEach((_, i, a) => {
345
+ a[i] = String(i + 1);
346
+ });
347
+ } else if (mark === 3 || mark === 4) {
348
+ column(node, "label", n).fill("");
349
+ }
350
+ }
351
+
352
+ /**
353
+ * SVG Vertices 3D Effect (`Form10.effect3d`): Pajek 6.02's SVG export fills each vertex with a linear gradient from
354
+ * its color at the top to half of it at the bottom (`pajek-specimen-node-shapes-p2`: `#ffd9bc` to rgb(128,108,94),
355
+ * `#c8c8c8` to rgb(100,100,100); each channel halved and rounded half to even, as Delphi's Round does). The gradient
356
+ * turns with the vertex: `phi 90` runs it from left to right (`phi-90-box`, `phi-90-triangle`).
357
+ * @param snapshot - the graph
358
+ * @param node - the vertices' values, changed in place
359
+ */
360
+ function effect3d(snapshot: GraphSnapshot, node: Values): void {
361
+ const n = snapshot.nodeCount;
362
+ const fill = column(node, "fill", n);
363
+ const end = column(node, "fillGradient", n);
364
+ const angle = column(node, "fillGradientAngle", n);
365
+ const half = (v: number): number => {
366
+ const h = v / 2;
367
+ const f = Math.floor(h);
368
+ return h - f === 0.5 && f % 2 === 0 ? f : Math.round(h);
369
+ };
370
+ for (let i = 0; i < n; i++) {
371
+ const color = typeof fill[i] === "string" ? String(fill[i]) : VERTEX_FILL;
372
+ end[i] = `#${[1, 3, 5]
373
+ .map((k) =>
374
+ half(Number.parseInt(color.slice(k, k + 2), 16))
375
+ .toString(16)
376
+ .padStart(2, "0"),
377
+ )
378
+ .join("")}`;
379
+ const phi = snapshot.nodes.has("phi") ? Number(snapshot.nodes.value("phi", i)) : 0;
380
+ angle[i] = Number.isFinite(phi) ? (((90 - phi) % 360) + 360) % 360 : 90;
381
+ }
382
+ }
383
+
384
+ /**
385
+ * Sizes the vertices by Draw > Network + Vector (+ Second Vector), in place: with one vector each vertex is the square
386
+ * root of its value times its own size, with two the first is a plain factor of its width and the second of its
387
+ * height; 0 draws it at no size and a negative value at its own (`pajek-specimen-mappings-bypass`, `-p3`).
388
+ * @param draw - the settings
389
+ * @param snapshot - the graph
390
+ * @param width - the widths
391
+ * @param height - the heights
392
+ */
393
+ function sizeByVectors(
394
+ draw: PajekDraw,
395
+ snapshot: GraphSnapshot,
396
+ width: (StyleValue | null)[],
397
+ height: (StyleValue | null)[],
398
+ ): void {
399
+ const first = objectValues(snapshot, "vector", draw.vector);
400
+ if (first === null) {
401
+ return;
402
+ }
403
+ const second = objectValues(snapshot, "vector", draw.vector2);
404
+ const scale = (sizes: (StyleValue | null)[], i: number, v: number | null): void => {
405
+ if (v !== null && v >= 0) {
406
+ sizes[i] = (typeof sizes[i] === "number" ? sizes[i] : VERTEX_SIZE) * v;
407
+ }
408
+ };
409
+ for (let i = 0; i < snapshot.nodeCount; i++) {
410
+ const v = first(i);
411
+ if (second === null) {
412
+ const root = v === null || v < 0 ? null : Math.sqrt(v);
413
+ scale(width, i, root);
414
+ scale(height, i, root);
415
+ } else {
416
+ scale(width, i, v);
417
+ scale(height, i, second(i));
418
+ }
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Draws the lines under the Draw window's options, in place.
424
+ * @param draw - the settings
425
+ * @param snapshot - the graph
426
+ * @param node - the vertices' values, already drawn (`drawVertices`)
427
+ * @param edge - the lines' values
428
+ */
429
+ export function drawLines(draw: PajekDraw, snapshot: GraphSnapshot, node: Values, edge: Values): void {
430
+ const m = snapshot.edgeCount;
431
+ // Mark Vertices Using / No Labels no Arrows hides the arrowheads in the Draw window only: the SVG export still
432
+ // draws every one (`pajek-specimen-arrows-p2`), so the arrows are left as the file sets them
433
+ const opacity = iniNumber(draw, "TransparencyofLines");
434
+ if (opacity !== null && opacity < 1) {
435
+ const o = column(edge, "opacity", m);
436
+ o.forEach((v, e) => {
437
+ o[e] = (typeof v === "number" ? v : 1) * Math.max(0, opacity);
438
+ });
439
+ }
440
+ if (flag(draw, "Form10.StraightLinesOnly1")) {
441
+ // Straight Lines draws the two curves of a mutual pair or of parallel lines straight, while a line's own
442
+ // Bezier route (`a1 k1 a2 k2`, which set its bends) stays curved in the SVG export
443
+ // (`pajek-specimen-edges-lines-p4` against `-p2`: only `bidirected` and `parallel-edges` change)
444
+ const curved = column(edge, "curved", m);
445
+ for (let e = 0; e < m; e++) {
446
+ const bends = edge.bends?.[e];
447
+ if (bends === null || bends === undefined) {
448
+ curved[e] = false;
449
+ }
450
+ }
451
+ }
452
+ if (flag(draw, "Form10.ColorGradientLines")) {
453
+ // each line runs from its source vertex's fill to its target's, and an arrowhead is its own end vertex's fill
454
+ // (`pajek-specimen-edges-lines-p5`)
455
+ const fill = node.fill as (StyleValue | null)[] | undefined;
456
+ const fillOf = (i: number): string => (typeof fill?.[i] === "string" ? fill[i] : VERTEX_FILL);
457
+ const colors = column(edge, "gradientColors", m);
458
+ const kind = column(edge, "gradientKind", m);
459
+ const sourceArrow = column(edge, "sourceArrowColor", m);
460
+ const targetArrow = column(edge, "targetArrowColor", m);
461
+ for (let e = 0; e < m; e++) {
462
+ const [s, t] = [fillOf(snapshot.edgeSource(e)), fillOf(snapshot.edgeTarget(e))];
463
+ colors[e] = `${s} ${t}`;
464
+ kind[e] = "linear";
465
+ sourceArrow[e] = s;
466
+ targetArrow[e] = t;
467
+ }
468
+ }
469
+ }
@@ -37,6 +37,7 @@ import {
37
37
  RELATION_COLUMN,
38
38
  SHAPE_COLUMN,
39
39
  SHAPES,
40
+ VOIDING_KEYS,
40
41
  } from "./syntax.js";
41
42
 
42
43
  /** What the writer takes: the format's options, the common ones and the styles. */
@@ -832,27 +833,64 @@ function* writeVertices(
832
833
  nodePlan: readonly PlannedColumn[],
833
834
  mangle: boolean,
834
835
  ): Generator<string, void, undefined> {
835
- let labels: Column | null = null;
836
- let position: Column | null = null;
837
- let shape: Column | null = null;
838
- let nodeSpells: Column | null = null;
839
- const nodeParams: Column[] = [];
836
+ const slots = vertexSlots(nodePlan);
837
+ const writeZ = slots.position !== null && needsZ(slots.position);
838
+ for (let i = 0; i < snapshot.nodeCount; i++) {
839
+ const parts = vertexParts(slots, i, writeZ);
840
+ if (mangle && ids.isChanged(i)) {
841
+ parts.push(`${ORIGINAL_ID_KEY} ${quotePajekLabel(idText(ids.originalAt(i)))}`);
842
+ }
843
+ if (slots.spells !== null) {
844
+ const spells = spellsText(slots.spells, i);
845
+ if (spells !== null) {
846
+ parts.push(spells);
847
+ }
848
+ }
849
+ const label = labelOf(slots.labels, ids, i, parts.length > 0);
850
+ let line = String(i + 1);
851
+ if (label !== null) {
852
+ // the importer decodes `&#dddd;` in labels, so a literal one is written with `&#38;`
853
+ line += ` ${quotePajekLabel(encodeCharacterReferences(label))}`;
854
+ }
855
+ if (parts.length > 0) {
856
+ line += ` ${parts.join(" ")}`;
857
+ }
858
+ yield `${line}\n`;
859
+ }
860
+ }
861
+
862
+ /** The node columns a vertex line writes, by the slot each fills. */
863
+ interface VertexSlots {
864
+ labels: Column | null;
865
+ position: Column | null;
866
+ shape: Column | null;
867
+ spells: Column | null;
868
+ params: Column[];
869
+ }
870
+
871
+ /**
872
+ * Sorts the node column plan into the slots of a vertex line.
873
+ * @param nodePlan - the node column plan
874
+ * @returns the columns by slot
875
+ */
876
+ function vertexSlots(nodePlan: readonly PlannedColumn[]): VertexSlots {
877
+ const slots: VertexSlots = { labels: null, position: null, shape: null, spells: null, params: [] };
840
878
  for (const { column, slot } of nodePlan) {
841
879
  switch (slot) {
842
880
  case "label":
843
- labels = column;
881
+ slots.labels = column;
844
882
  break;
845
883
  case "position":
846
- position = column;
884
+ slots.position = column;
847
885
  break;
848
886
  case "shape":
849
- shape = column;
887
+ slots.shape = column;
850
888
  break;
851
889
  case "spells":
852
- nodeSpells = column;
890
+ slots.spells = column;
853
891
  break;
854
892
  case "param":
855
- nodeParams.push(column);
893
+ slots.params.push(column);
856
894
  break;
857
895
  case "relation":
858
896
  case "skip":
@@ -863,48 +901,42 @@ function* writeVertices(
863
901
  }
864
902
  }
865
903
  }
866
- const writeZ = position !== null && needsZ(position);
867
- for (let i = 0; i < snapshot.nodeCount; i++) {
868
- const parts: string[] = [];
869
- if (position !== null) {
870
- const coordinates = coordinatesText(position, i, writeZ);
871
- if (coordinates !== null) {
872
- parts.push(coordinates);
873
- }
874
- }
875
- if (shape?.isSet(i)) {
876
- const keyword = cellText(shape, i);
877
- if (SHAPES.has(keyword)) {
878
- parts.push(keyword);
879
- } else {
880
- parts.push(`${SHAPE_COLUMN} ${quotePajekLabel(keyword)}`);
881
- }
882
- }
883
- for (const column of nodeParams) {
884
- if (column.isSet(i)) {
885
- parts.push(`${column.meta.name} ${quotePajekLabel(cellText(column, i))}`);
886
- }
887
- }
888
- if (mangle && ids.isChanged(i)) {
889
- parts.push(`${ORIGINAL_ID_KEY} ${quotePajekLabel(idText(ids.originalAt(i)))}`);
890
- }
891
- if (nodeSpells !== null) {
892
- const spells = spellsText(nodeSpells, i);
893
- if (spells !== null) {
894
- parts.push(spells);
895
- }
896
- }
897
- const label = labelOf(labels, ids, i, parts.length > 0);
898
- let line = String(i + 1);
899
- if (label !== null) {
900
- // the importer decodes `&#dddd;` in labels, so a literal one is written with `&#38;`
901
- line += ` ${quotePajekLabel(encodeCharacterReferences(label))}`;
904
+ return slots;
905
+ }
906
+
907
+ /**
908
+ * A vertex line's coordinates, shape and parameters.
909
+ * @param slots - the node columns by slot
910
+ * @param i - the vertex's index
911
+ * @param writeZ - whether coordinates carry a z
912
+ * @returns the parts, in order
913
+ */
914
+ function vertexParts(slots: VertexSlots, i: number, writeZ: boolean): string[] {
915
+ const { position, shape } = slots;
916
+ const parts: string[] = [];
917
+ const coordinates = position === null ? null : coordinatesText(position, i, writeZ);
918
+ if (coordinates !== null) {
919
+ parts.push(coordinates);
920
+ }
921
+ const placed = parts.length > 0;
922
+ const shaped = shape?.isSet(i) === true;
923
+ if (shaped) {
924
+ const keyword = cellText(shape, i);
925
+ parts.push(SHAPES.has(keyword) ? keyword : `${SHAPE_COLUMN} ${quotePajekLabel(keyword)}`);
926
+ }
927
+ const named = parts.length;
928
+ for (const column of slots.params) {
929
+ if (!column.isSet(i)) {
930
+ continue;
902
931
  }
903
- if (parts.length > 0) {
904
- line += ` ${parts.join(" ")}`;
932
+ // a placed line that names no shape and starts with such a key is drawn by Pajek with none of its
933
+ // parameters (`VOIDING_KEYS`): the default shape is named first, so it is drawn as written
934
+ if (placed && !shaped && parts.length === named && VOIDING_KEYS.has(column.meta.name)) {
935
+ parts.push("ellipse");
905
936
  }
906
- yield `${line}\n`;
937
+ parts.push(`${column.meta.name} ${quotePajekLabel(cellText(column, i))}`);
907
938
  }
939
+ return parts;
908
940
  }
909
941
 
910
942
  /**