@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,799 @@
1
+ /**
2
+ * Two parts of how Graphviz draws a node that its attributes alone do not say: the font a `fontname` picks, and the
3
+ * corners of a `shape=polygon` node.
4
+ *
5
+ * - Fonts (`lib/common/ps_font_equiv.h`): a PostScript name such as `Helvetica-Bold` or `Times-Italic` (any case)
6
+ * is that family at that weight and slant, drawn by a generic family when the machine lacks it. Any other name
7
+ * goes to fontconfig as it is, which draws a family it does not have in its default, sans-serif face.
8
+ * - Polygons (`poly_init`, `lib/common/shapes.c`): `sides` corners of a regular polygon, widened by `distortion`
9
+ * toward the top or the bottom, sheared by `skew` and turned by `orientation` degrees, then stretched to the
10
+ * node's box. Corners that reach past the box after the turn make the node larger.
11
+ */
12
+
13
+ /** A family a CSS font list falls back to. */
14
+ const GENERIC_FAMILIES: ReadonlySet<string> = new Set([
15
+ "serif",
16
+ "sans-serif",
17
+ "monospace",
18
+ "cursive",
19
+ "fantasy",
20
+ "system-ui",
21
+ ]);
22
+
23
+ /** The PostScript font families Graphviz knows, by the name before the dash, lowercase: the family and its generic. */
24
+ const POSTSCRIPT_FAMILIES: ReadonlyMap<string, readonly [string, string]> = new Map([
25
+ ["avantgarde", ["URW Gothic", "sans-serif"]],
26
+ ["bookman", ["URW Bookman", "serif"]],
27
+ ["courier", ["Courier", "monospace"]],
28
+ ["helvetica", ["Helvetica", "sans-serif"]],
29
+ ["helvetica-narrow", ["Helvetica", "sans-serif"]],
30
+ ["newcenturyschlbk", ["Century Schoolbook", "serif"]],
31
+ ["palatino", ["Palatino", "serif"]],
32
+ ["symbol", ["Symbol", "fantasy"]],
33
+ ["times", ["Times", "serif"]],
34
+ ["zapfchancery", ["URW Chancery", "serif"]],
35
+ ["zapfdingbats", ["Dingbats", "fantasy"]],
36
+ ]);
37
+
38
+ /** The weight and slant suffixes of the PostScript names, lowercase. */
39
+ const POSTSCRIPT_STYLES: ReadonlyMap<string, readonly [bold: boolean, italic: boolean]> = new Map([
40
+ ["", [false, false]],
41
+ ["roman", [false, false]],
42
+ ["book", [false, false]],
43
+ ["light", [false, false]],
44
+ ["bold", [true, false]],
45
+ ["demi", [true, false]],
46
+ ["italic", [false, true]],
47
+ ["oblique", [false, true]],
48
+ ["bookoblique", [false, true]],
49
+ ["lightitalic", [false, true]],
50
+ ["mediumitalic", [false, true]],
51
+ ["bolditalic", [true, true]],
52
+ ["boldoblique", [true, true]],
53
+ ["demiitalic", [true, true]],
54
+ ["demioblique", [true, true]],
55
+ ]);
56
+
57
+ /** A font as graphty draws it: a CSS family list, and whether it is bold and italic. */
58
+ interface GraphvizFont {
59
+ /** The families, the last a generic one. */
60
+ readonly family: string;
61
+ readonly bold: boolean;
62
+ readonly italic: boolean;
63
+ }
64
+
65
+ /**
66
+ * The font a Graphviz `fontname` draws.
67
+ * @param name - the `fontname` value
68
+ * @returns the families, weight and slant
69
+ */
70
+ export function graphvizFont(name: string): GraphvizFont {
71
+ const trimmed = name.trim();
72
+ // a fontconfig pattern (`DejaVu Sans:bold`) is written into the SVG as it is, a family no viewer has, so the
73
+ // drawing falls back to the viewer's default face
74
+ if (trimmed.includes(":")) {
75
+ return { family: "Times, serif", bold: false, italic: false };
76
+ }
77
+ const ps = postscriptFont(trimmed);
78
+ if (ps !== null) {
79
+ return ps;
80
+ }
81
+ const last = trimmed.split(",").at(-1)?.trim().toLowerCase() ?? "";
82
+ return { family: GENERIC_FAMILIES.has(last) ? trimmed : `${trimmed}, sans-serif`, bold: false, italic: false };
83
+ }
84
+
85
+ /**
86
+ * The font a PostScript font name such as `Helvetica-Bold` or `Times-Italic` (any case) names: its family with a
87
+ * generic one after it, its weight and its slant (`lib/common/ps_font_equiv.h`). Pajek writes its `font` into its SVG
88
+ * export as given, which the pinned fonts resolve the same way.
89
+ * @param name - the name, trimmed
90
+ * @returns the font, or null for a name that is not a PostScript font name
91
+ */
92
+ export function postscriptFont(name: string): GraphvizFont | null {
93
+ const lower = name.toLowerCase();
94
+ for (const [base, [family, generic]] of POSTSCRIPT_FAMILIES) {
95
+ if (lower === base || lower.startsWith(`${base}-`)) {
96
+ const style = POSTSCRIPT_STYLES.get(lower.slice(base.length + 1));
97
+ if (style !== undefined) {
98
+ return { family: `${family}, ${generic}`, bold: style[0], italic: style[1] };
99
+ }
100
+ }
101
+ }
102
+ return null;
103
+ }
104
+
105
+ /** How each PostScript family is spelled, with the suffixes of its upright, bold and slanted faces. */
106
+ const POSTSCRIPT_NAMES: readonly { family: string; name: string; plain: string; bold: string; slant: string }[] = [
107
+ { family: "URW Gothic", name: "AvantGarde", plain: "Book", bold: "Demi", slant: "Oblique" },
108
+ { family: "URW Bookman", name: "Bookman", plain: "Light", bold: "Demi", slant: "Italic" },
109
+ { family: "Courier", name: "Courier", plain: "", bold: "Bold", slant: "Oblique" },
110
+ { family: "Helvetica", name: "Helvetica", plain: "", bold: "Bold", slant: "Oblique" },
111
+ { family: "Century Schoolbook", name: "NewCenturySchlbk", plain: "Roman", bold: "Bold", slant: "Italic" },
112
+ { family: "Palatino", name: "Palatino", plain: "Roman", bold: "Bold", slant: "Italic" },
113
+ { family: "Times", name: "Times", plain: "Roman", bold: "Bold", slant: "Italic" },
114
+ ];
115
+
116
+ /**
117
+ * The `fontname` that draws a font in Graphviz: a PostScript name for a family Graphviz knows by one, the family
118
+ * alone when the list only adds a generic fallback (which Graphviz falls back to anyway), else the list as it is.
119
+ * @param family - the CSS family list
120
+ * @param bold - whether it is bold
121
+ * @param italic - whether it is italic
122
+ * @returns the name
123
+ */
124
+ export function graphvizFontName(family: string, bold: boolean, italic: boolean): string {
125
+ const parts = family.split(",").map((p) => p.trim());
126
+ if (parts.length !== 2 || !GENERIC_FAMILIES.has(parts[1].toLowerCase())) {
127
+ return family;
128
+ }
129
+ const ps = POSTSCRIPT_NAMES.find((p) => p.family.toLowerCase() === parts[0].toLowerCase());
130
+ if (ps === undefined) {
131
+ return parts[0];
132
+ }
133
+ const slant = italic ? ps.slant : "";
134
+ const suffix = bold ? `${ps.bold}${slant}` : slant || ps.plain;
135
+ return suffix === "" ? ps.name : `${ps.name}-${suffix}`;
136
+ }
137
+
138
+ /** A `shape=polygon` node's form: Graphviz's polygon attributes. */
139
+ interface GraphvizPolygon {
140
+ readonly sides: number;
141
+ readonly distortion: number;
142
+ readonly skew: number;
143
+ /** Degrees, counter-clockwise. */
144
+ readonly orientation: number;
145
+ }
146
+
147
+ /**
148
+ * The corners of a Graphviz polygon as fractions of the half width and half height of the box Graphviz fits it to
149
+ * (y up): a regular polygon's corners lie on the box's ellipse, and a distorted, skewed or turned one may reach past
150
+ * the box, which Graphviz then grows to hold it.
151
+ * @param polygon - the polygon's attributes
152
+ * @returns the corners, in Graphviz's order
153
+ */
154
+ export function graphvizPolygonCorners(polygon: GraphvizPolygon): [number, number][] {
155
+ const { sides, distortion, skew, orientation } = polygon;
156
+ const sector = (2 * Math.PI) / sides;
157
+ const sideLength = Math.sin(sector / 2);
158
+ const skewDist = Math.hypot(Math.abs(distortion) + Math.abs(skew), 1);
159
+ const gDistortion = (distortion * Math.SQRT2) / Math.cos(sector / 2);
160
+ const gSkew = skew / 2;
161
+ let angle = (sector - Math.PI) / 2;
162
+ let rx = 0.5 * Math.cos(angle);
163
+ let ry = 0.5 * Math.sin(angle);
164
+ angle += (Math.PI - sector) / 2;
165
+ const corners: [number, number][] = [];
166
+ for (let i = 0; i < sides; i++) {
167
+ angle += sector;
168
+ rx += sideLength * Math.cos(angle);
169
+ ry += sideLength * Math.sin(angle);
170
+ const px = rx * (skewDist + ry * gDistortion) + ry * gSkew;
171
+ const alpha = (orientation * Math.PI) / 180 + Math.atan2(ry, px);
172
+ const r = Math.hypot(px, ry);
173
+ // Graphviz's corners are fractions of the box's whole width; twice that is a fraction of the half width
174
+ corners.push([2 * r * Math.cos(alpha), 2 * r * Math.sin(alpha)]);
175
+ }
176
+ return corners;
177
+ }
178
+
179
+ /**
180
+ * Whether a polygon is drawn as a plain box: four sides, no distortion or skew, turned by a multiple of 90 degrees
181
+ * (Graphviz then fits the label exactly, with no ellipse around it).
182
+ * @param polygon - the polygon's attributes
183
+ * @returns true for a box
184
+ */
185
+ export function isGraphvizBox(polygon: GraphvizPolygon): boolean {
186
+ return (
187
+ polygon.sides === 4 &&
188
+ Math.abs(polygon.orientation % 90) < 0.5 &&
189
+ polygon.distortion === 0 &&
190
+ polygon.skew === 0
191
+ );
192
+ }
193
+
194
+ /** Graphviz's built-in shapes that are polygons of their own sides, distortion, skew and orientation (`shapes.c`). */
195
+ export const GRAPHVIZ_POLYGON_SHAPES: ReadonlyMap<string, GraphvizPolygon> = new Map(
196
+ (
197
+ [
198
+ ["triangle", 3, 0, 0, 0],
199
+ ["invtriangle", 3, 0, 0, 180],
200
+ ["trapezium", 4, -0.4, 0, 0],
201
+ ["invtrapezium", 4, -0.4, 0, 180],
202
+ ["parallelogram", 4, 0, 0.6, 0],
203
+ ["house", 5, -0.64, 0, 0],
204
+ ["invhouse", 5, -0.64, 0, 180],
205
+ ["pentagon", 5, 0, 0, 0],
206
+ ["septagon", 7, 0, 0, 0],
207
+ // a distorted ellipse is drawn as a polygon of 120 sides
208
+ ["egg", 120, -0.3, 0, 0],
209
+ ] as const
210
+ ).map(([name, sides, distortion, skew, orientation]) => [name, { sides, distortion, skew, orientation }]),
211
+ );
212
+
213
+ /** A point in points, relative to a node's center, y up. */
214
+ type GlyphPoint = readonly [number, number];
215
+
216
+ /**
217
+ * A Graphviz shape drawn as pieces of its own (`round_corners`, lib/common/shapes.c): its outline, further closed
218
+ * pieces beside it, and open lines, every point in points relative to the node's center, y up.
219
+ */
220
+ interface GraphvizGlyph {
221
+ /** The outline the node's fill and border follow. */
222
+ readonly outline: readonly GlyphPoint[];
223
+ /** Further closed pieces, filled and outlined as the outline is (an `assembly`'s second bar). */
224
+ readonly parts: readonly (readonly GlyphPoint[])[];
225
+ /** Open lines in the pen's color (a `promoter`'s baseline, a `box3d`'s edges); one ending where it starts is closed. */
226
+ readonly lines: readonly (readonly GlyphPoint[])[];
227
+ /** Whether the outline is filled with no line round it (an `underline`, whose line is its lines alone). */
228
+ readonly unstroked?: boolean;
229
+ /** How far out from the outline a ring round it is drawn, line to line (an `insulator`'s open square). */
230
+ readonly ring?: number;
231
+ }
232
+
233
+ /**
234
+ * A synthetic-biology shape's baseline across the node's middle.
235
+ * @param W - half the node's width
236
+ * @returns the line
237
+ */
238
+ const baseline = (W: number): GlyphPoint[] => [
239
+ [-W, 0],
240
+ [W, 0],
241
+ ];
242
+
243
+ /** The bow tie of a ribosome or protease site (shapes.c's `RIBOSITE`, `PROTEASESITE`), 6 by 6 points. */
244
+ const BOW_TIE: readonly GlyphPoint[] = [
245
+ [3, 6],
246
+ [3, 7.5],
247
+ [1.5, 9],
248
+ [3, 10.5],
249
+ [3, 12],
250
+ [1.5, 12],
251
+ [0, 10.5],
252
+ [-1.5, 12],
253
+ [-3, 12],
254
+ [-3, 10.5],
255
+ [-1.5, 9],
256
+ [-3, 7.5],
257
+ [-3, 6],
258
+ [-1.5, 6],
259
+ [0, 7.5],
260
+ [1.5, 6],
261
+ ];
262
+
263
+ /** The octagon of an RNA or protein stability element (shapes.c's `RNASTAB`, `PROTEINSTAB`), 6 by 6 points. */
264
+ const OCTAGON: readonly GlyphPoint[] = [
265
+ [1.5, 6],
266
+ [3, 7.5],
267
+ [3, 10.5],
268
+ [1.5, 12],
269
+ [-1.5, 12],
270
+ [-3, 10.5],
271
+ [-3, 7.5],
272
+ [-1.5, 6],
273
+ ];
274
+
275
+ /** A stem drawn as two short dashes from the baseline up to a glyph 6 points above it. */
276
+ const DASHED_STEM: readonly GlyphPoint[][] = [
277
+ [
278
+ [0, 0],
279
+ [0, 1.5],
280
+ ],
281
+ [
282
+ [0, 3],
283
+ [0, 4.5],
284
+ ],
285
+ ];
286
+
287
+ /**
288
+ * A bar 6 points tall.
289
+ * @param x0 - its left
290
+ * @param x1 - its right
291
+ * @param y - its bottom
292
+ * @returns its corners
293
+ */
294
+ const bar = (x0: number, x1: number, y: number): GlyphPoint[] => [
295
+ [x0, y],
296
+ [x1, y],
297
+ [x1, y + 6],
298
+ [x0, y + 6],
299
+ ];
300
+
301
+ // Each shape's pieces at a node W by H points from its center (half its width and height). Graphviz draws the
302
+ // decorations a fixed number of points across whatever the node's size, and the synthetic-biology glyphs on a
303
+ // baseline through the node's middle, most of them a fixed size (measured with Graphviz 14.1.2's `neato -n2 -Tsvg`
304
+ // at 36 x 36, 72 x 36, 36 x 72 and 108 x 54 points).
305
+ const GLYPHS: ReadonlyMap<string, (W: number, H: number) => GraphvizGlyph> = new Map<
306
+ string,
307
+ (W: number, H: number) => GraphvizGlyph
308
+ >([
309
+ [
310
+ "box3d",
311
+ (W, H) => ({
312
+ outline: [
313
+ [W, H],
314
+ [-W + 4, H],
315
+ [-W, H - 4],
316
+ [-W, -H],
317
+ [W - 4, -H],
318
+ [W, -H + 4],
319
+ ],
320
+ parts: [],
321
+ lines: [
322
+ [
323
+ [W - 4, H - 4],
324
+ [-W, H - 4],
325
+ ],
326
+ [
327
+ [W - 4, H - 4],
328
+ [W - 4, -H],
329
+ ],
330
+ [
331
+ [W - 4, H - 4],
332
+ [W, H],
333
+ ],
334
+ ],
335
+ }),
336
+ ],
337
+ [
338
+ "tab",
339
+ (W, H) => ({
340
+ outline: [
341
+ [W, H],
342
+ [-W + 12, H],
343
+ [-W + 12, H + 4],
344
+ [-W, H + 4],
345
+ [-W, -H],
346
+ [W, -H],
347
+ ],
348
+ parts: [],
349
+ lines: [
350
+ [
351
+ [-W, H],
352
+ [-W + 12, H],
353
+ ],
354
+ ],
355
+ }),
356
+ ],
357
+ [
358
+ "folder",
359
+ (W, H) => ({
360
+ outline: [
361
+ [W, H],
362
+ [W - 3, H + 4],
363
+ [W - 24, H + 4],
364
+ [W - 27, H],
365
+ [-W, H],
366
+ [-W, -H],
367
+ [W, -H],
368
+ ],
369
+ parts: [],
370
+ lines: [],
371
+ }),
372
+ ],
373
+ [
374
+ "component",
375
+ (W, H) => ({
376
+ outline: [
377
+ [W, H],
378
+ [-W, H],
379
+ [-W, H - 4],
380
+ [-W - 4, H - 4],
381
+ [-W - 4, H - 8],
382
+ [-W, H - 8],
383
+ [-W, -H + 8],
384
+ [-W - 4, -H + 8],
385
+ [-W - 4, -H + 4],
386
+ [-W, -H + 4],
387
+ [-W, -H],
388
+ [W, -H],
389
+ ],
390
+ parts: [],
391
+ lines: [
392
+ [
393
+ [-W, H - 4],
394
+ [-W + 4, H - 4],
395
+ [-W + 4, H - 8],
396
+ [-W, H - 8],
397
+ ],
398
+ [
399
+ [-W, -H + 8],
400
+ [-W + 4, -H + 8],
401
+ [-W + 4, -H + 4],
402
+ [-W, -H + 4],
403
+ ],
404
+ ],
405
+ }),
406
+ ],
407
+ [
408
+ "note",
409
+ (W, H) => ({
410
+ outline: [
411
+ [W - 6, H],
412
+ [-W, H],
413
+ [-W, -H],
414
+ [W, -H],
415
+ [W, H - 6],
416
+ ],
417
+ parts: [],
418
+ lines: [
419
+ [
420
+ [W - 6, H],
421
+ [W - 6, H - 6],
422
+ ],
423
+ [
424
+ [W, H - 6],
425
+ [W - 6, H - 6],
426
+ ],
427
+ ],
428
+ }),
429
+ ],
430
+ [
431
+ "underline",
432
+ (W, H) => ({
433
+ outline: [
434
+ [W, H],
435
+ [-W, H],
436
+ [-W, -H],
437
+ [W, -H],
438
+ ],
439
+ parts: [],
440
+ lines: [
441
+ [
442
+ [-W, -H],
443
+ [W, -H],
444
+ ],
445
+ ],
446
+ unstroked: true,
447
+ }),
448
+ ],
449
+ [
450
+ "cds",
451
+ (W, H) => ({
452
+ outline: [
453
+ [W - 12, H - 6],
454
+ [-W, H - 6],
455
+ [-W, -H + 6],
456
+ [W - 12, -H + 6],
457
+ [W, 0],
458
+ ],
459
+ parts: [],
460
+ lines: [],
461
+ }),
462
+ ],
463
+ [
464
+ "larrow",
465
+ (W, H) => ({
466
+ outline: [
467
+ [W, H - 6],
468
+ [-W + 18, H - 6],
469
+ [-W + 18, H],
470
+ [-W, 0],
471
+ [-W + 18, -H],
472
+ [-W + 18, -H + 6],
473
+ [W, -H + 6],
474
+ ],
475
+ parts: [],
476
+ lines: [],
477
+ }),
478
+ ],
479
+ [
480
+ "rarrow",
481
+ (W, H) => ({
482
+ outline: [
483
+ [W - 18, H - 6],
484
+ [-W, H - 6],
485
+ [-W, -H + 6],
486
+ [W - 18, -H + 6],
487
+ [W - 18, -H],
488
+ [W, 0],
489
+ [W - 18, H],
490
+ ],
491
+ parts: [],
492
+ lines: [],
493
+ }),
494
+ ],
495
+ [
496
+ "lpromoter",
497
+ (W, H) => ({
498
+ outline: [
499
+ [W, H - 6],
500
+ [-W + 18, H - 6],
501
+ [-W + 18, H],
502
+ [-W, 0],
503
+ [-W + 18, -H],
504
+ [-W + 18, -H + 6],
505
+ [W - 18, -H + 6],
506
+ [W - 18, -H],
507
+ [W, -H],
508
+ ],
509
+ parts: [],
510
+ lines: [],
511
+ }),
512
+ ],
513
+ [
514
+ "rpromoter",
515
+ (W, H) => ({
516
+ outline: [
517
+ [W - 18, H - 6],
518
+ [-W, H - 6],
519
+ [-W, -H],
520
+ [-W + 18, -H],
521
+ [-W + 18, -H + 6],
522
+ [W - 18, -H + 6],
523
+ [W - 18, -H],
524
+ [W, 0],
525
+ [W - 18, H],
526
+ ],
527
+ parts: [],
528
+ lines: [],
529
+ }),
530
+ ],
531
+ [
532
+ "promoter",
533
+ (W) => ({
534
+ outline: [
535
+ [W / 4, 18],
536
+ [-W / 2, 18],
537
+ [-W / 2, 0],
538
+ [-W / 2 + 6, 0],
539
+ [-W / 2 + 6, 12],
540
+ [W / 4, 12],
541
+ [W / 4, 9],
542
+ [W / 4 + 12, 15],
543
+ [W / 4, 21],
544
+ ],
545
+ parts: [],
546
+ lines: [baseline(W)],
547
+ }),
548
+ ],
549
+ [
550
+ "terminator",
551
+ (W) => ({
552
+ outline: [
553
+ [3, 0],
554
+ [3, 6],
555
+ [9, 6],
556
+ [9, 12],
557
+ [-9, 12],
558
+ [-9, 6],
559
+ [-3, 6],
560
+ [-3, 0],
561
+ ],
562
+ parts: [],
563
+ lines: [baseline(W)],
564
+ }),
565
+ ],
566
+ [
567
+ "utr",
568
+ (W) => ({
569
+ outline: [
570
+ [9, 0],
571
+ [9, 3],
572
+ [3, 9],
573
+ [-3, 9],
574
+ [-9, 3],
575
+ [-9, 0],
576
+ ],
577
+ parts: [],
578
+ lines: [baseline(W)],
579
+ }),
580
+ ],
581
+ [
582
+ "primersite",
583
+ (W) => ({
584
+ outline: [
585
+ [12, 3],
586
+ [0, 15],
587
+ [0, 9],
588
+ [-W / 2, 9],
589
+ [-W / 2, 3],
590
+ ],
591
+ parts: [],
592
+ lines: [baseline(W)],
593
+ }),
594
+ ],
595
+ [
596
+ "restrictionsite",
597
+ (W) => {
598
+ const [a, b] = [W / 4, W / 4 + 6];
599
+ return {
600
+ outline: [
601
+ [b, 3],
602
+ [-a, 3],
603
+ [-a, 9],
604
+ [-b, 9],
605
+ [-b, -3],
606
+ [a, -3],
607
+ [a, -9],
608
+ [b, -9],
609
+ ],
610
+ parts: [],
611
+ lines: [
612
+ [
613
+ [-W, 0],
614
+ [-b, 0],
615
+ ],
616
+ [
617
+ [b, 0],
618
+ [W, 0],
619
+ ],
620
+ ],
621
+ };
622
+ },
623
+ ],
624
+ [
625
+ "fivepoverhang",
626
+ (W) => ({
627
+ outline: bar(-W, -W + 24, 1.5),
628
+ parts: [bar(-W + 12, -W + 24, -7.5)],
629
+ lines: [
630
+ [
631
+ [-W + 24, 0],
632
+ [W, 0],
633
+ ],
634
+ ],
635
+ }),
636
+ ],
637
+ [
638
+ "threepoverhang",
639
+ (W) => ({
640
+ outline: bar(W - 24, W, 1.5),
641
+ parts: [bar(W - 24, W - 12, -7.5)],
642
+ lines: [
643
+ [
644
+ [-W, 0],
645
+ [W - 24, 0],
646
+ ],
647
+ ],
648
+ }),
649
+ ],
650
+ [
651
+ "noverhang",
652
+ (W) => ({
653
+ outline: bar(-13.5, -1.5, 1.5),
654
+ parts: [bar(-13.5, -1.5, -7.5), bar(1.5, 13.5, -7.5), bar(1.5, 13.5, 1.5)],
655
+ lines: [
656
+ [
657
+ [13.5, 0],
658
+ [W, 0],
659
+ ],
660
+ [
661
+ [-13.5, 0],
662
+ [-W, 0],
663
+ ],
664
+ ],
665
+ }),
666
+ ],
667
+ [
668
+ "assembly",
669
+ (W) => ({
670
+ outline: bar(-12, 12, 1.5),
671
+ parts: [bar(-12, 12, -7.5)],
672
+ lines: [
673
+ [
674
+ [12, 0],
675
+ [W, 0],
676
+ ],
677
+ [
678
+ [-W, 0],
679
+ [-12, 0],
680
+ ],
681
+ ],
682
+ }),
683
+ ],
684
+ [
685
+ "signature",
686
+ (W, H) => ({
687
+ outline: [
688
+ [W, H - 6],
689
+ [-W, H - 6],
690
+ [-W, -H + 6],
691
+ [W, -H + 6],
692
+ ],
693
+ parts: [],
694
+ lines: [
695
+ [
696
+ [-W + 3, 1.5],
697
+ [-W + 6, -1.5],
698
+ ],
699
+ [
700
+ [-W + 3, -1.5],
701
+ [-W + 6, 1.5],
702
+ ],
703
+ [
704
+ [-W + 3, -H + 9],
705
+ [W - 3, -H + 9],
706
+ ],
707
+ ],
708
+ }),
709
+ ],
710
+ [
711
+ "insulator",
712
+ (W) => ({
713
+ outline: [
714
+ [6, 6],
715
+ [6, -6],
716
+ [-6, -6],
717
+ [-6, 6],
718
+ ],
719
+ parts: [],
720
+ // the square 3 points round it is a ring
721
+ ring: 3,
722
+ lines: [
723
+ [
724
+ [9, 0],
725
+ [W, 0],
726
+ ],
727
+ [
728
+ [-W, 0],
729
+ [-9, 0],
730
+ ],
731
+ ],
732
+ }),
733
+ ],
734
+ ["ribosite", (W) => ({ outline: BOW_TIE, parts: [], lines: [...DASHED_STEM, baseline(W)] })],
735
+ ["rnastab", (W) => ({ outline: OCTAGON, parts: [], lines: [...DASHED_STEM, baseline(W)] })],
736
+ [
737
+ "proteasesite",
738
+ (W) => ({
739
+ outline: BOW_TIE,
740
+ parts: [],
741
+ lines: [
742
+ [
743
+ [0, 7.5],
744
+ [0, 0],
745
+ ],
746
+ baseline(W),
747
+ ],
748
+ }),
749
+ ],
750
+ [
751
+ "proteinstab",
752
+ (W) => ({
753
+ outline: OCTAGON,
754
+ parts: [],
755
+ lines: [
756
+ [
757
+ [0, 6],
758
+ [0, 0],
759
+ ],
760
+ baseline(W),
761
+ ],
762
+ }),
763
+ ],
764
+ ]);
765
+
766
+ /** The shapes Graphviz draws as pieces of their own (`GLYPHS`). */
767
+ export const GRAPHVIZ_GLYPH_SHAPES: ReadonlySet<string> = new Set(GLYPHS.keys());
768
+
769
+ /** The shapes among them that are boxes with a decoration, which Graphviz fits the label inside exactly, as a box. */
770
+ export const GRAPHVIZ_DECORATED_BOXES: ReadonlySet<string> = new Set([
771
+ "box3d",
772
+ "tab",
773
+ "folder",
774
+ "component",
775
+ "note",
776
+ "underline",
777
+ "cds",
778
+ "larrow",
779
+ "rarrow",
780
+ "lpromoter",
781
+ "rpromoter",
782
+ ]);
783
+
784
+ /** Graphviz's default node size in points, 0.75 by 0.5 inch, for a node that states none. */
785
+ const DEFAULT_SIZE = [54, 36] as const;
786
+
787
+ /**
788
+ * The pieces Graphviz draws a shape as at a size, or null for a shape it draws otherwise.
789
+ * @param shape - the shape name, lowercase
790
+ * @param width - the node's width in points, or null for Graphviz's default
791
+ * @param height - its height in points, or null for the default
792
+ * @returns the pieces
793
+ */
794
+ export function graphvizGlyph(shape: string, width: number | null, height: number | null): GraphvizGlyph | null {
795
+ const glyph = GLYPHS.get(shape);
796
+ const w = width !== null && width > 0 ? width : DEFAULT_SIZE[0];
797
+ const h = height !== null && height > 0 ? height : DEFAULT_SIZE[1];
798
+ return glyph === undefined ? null : glyph(w / 2, h / 2);
799
+ }