@graphty/graph-io 0.3.48 → 0.3.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-Bzn3L-je.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-Bzn3L-je.js.map} +1 -1
  3. package/dist/chunks/bends-BGXjv_U4.js +129 -0
  4. package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
  5. package/dist/chunks/{block-Cu22ewuS.js → block-iptrlMBb.js} +906 -164
  6. package/dist/chunks/block-iptrlMBb.js.map +1 -0
  7. package/dist/chunks/choose-CczZJaX_.js +717 -0
  8. package/dist/chunks/choose-CczZJaX_.js.map +1 -0
  9. package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-C3p0RQxR.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-C3p0RQxR.js.map} +1 -1
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/{credentials-BiQsnMTb.js → credentials-DXHx7nwR.js} +16 -14
  18. package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-DLA5kINx.js} +7 -2
  24. package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-BwHQkZle.js} +1660 -133
  26. package/dist/chunks/emit-BwHQkZle.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  32. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  33. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-D2CETOMK.js} +1222 -156
  34. package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
  35. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-D9yMtocA.js} +7 -7
  36. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-D9yMtocA.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-_jrBTnos.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-_jrBTnos.js.map} +1 -1
  39. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-nDfxIK5D.js} +9 -8
  40. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-nDfxIK5D.js.map} +1 -1
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-ymWCETAJ.js} +387 -31
  44. package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
  45. package/dist/chunks/{importer-e3huMZbm.js → importer-B92x1xY5.js} +14 -10
  46. package/dist/chunks/importer-B92x1xY5.js.map +1 -0
  47. package/dist/chunks/{importer-B87_fmVx.js → importer-CT9mJ1nn.js} +326 -84
  48. package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
  49. package/dist/chunks/{importer-CB_zV5_L.js → importer-DaLTjbds.js} +116 -1102
  50. package/dist/chunks/importer-DaLTjbds.js.map +1 -0
  51. package/dist/chunks/{importer-DPZDN40-.js → importer-GREKMdIf.js} +25 -17
  52. package/dist/chunks/importer-GREKMdIf.js.map +1 -0
  53. package/dist/chunks/{importer-Bji2MeWr.js → importer-PqaaKKnY.js} +13 -10
  54. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-PqaaKKnY.js.map} +1 -1
  55. package/dist/chunks/{importer-Cyy6UseH.js → importer-Vn5QvmmJ.js} +66 -13
  56. package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
  57. package/dist/chunks/{importer-CVT-JyDE.js → importer-vRq4h3j5.js} +1469 -356
  58. package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-Clf4QIyl.js} +282 -74
  64. package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
  72. package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-EokFic1V.js} +5 -5
  74. package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CCs214_3.js} +1237 -138
  76. package/dist/chunks/styles-CCs214_3.js.map +1 -0
  77. package/dist/chunks/styles-Cm62yyQX.js +2812 -0
  78. package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
  79. package/dist/chunks/styles-DPQQIig4.js +1928 -0
  80. package/dist/chunks/styles-DPQQIig4.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-UMFdNqze.js} +503 -172
  82. package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +5 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +847 -193
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +232 -220
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +138 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +16 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +405 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  137. package/dist/src/formats/dot/importer.js +108 -31
  138. package/dist/src/formats/dot/importer.js.map +1 -1
  139. package/dist/src/formats/dot/label-places.d.ts +34 -0
  140. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  141. package/dist/src/formats/dot/label-places.js +179 -0
  142. package/dist/src/formats/dot/label-places.js.map +1 -0
  143. package/dist/src/formats/dot/record.d.ts +50 -0
  144. package/dist/src/formats/dot/record.d.ts.map +1 -0
  145. package/dist/src/formats/dot/record.js +275 -0
  146. package/dist/src/formats/dot/record.js.map +1 -0
  147. package/dist/src/formats/dot/styles.d.ts +62 -2
  148. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  149. package/dist/src/formats/dot/styles.js +1454 -119
  150. package/dist/src/formats/dot/styles.js.map +1 -1
  151. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  152. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  153. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  154. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  155. package/dist/src/formats/gexf/importer.d.ts +7 -0
  156. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  157. package/dist/src/formats/gexf/importer.js +41 -5
  158. package/dist/src/formats/gexf/importer.js.map +1 -1
  159. package/dist/src/formats/gexf/preview.d.ts +77 -0
  160. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  161. package/dist/src/formats/gexf/preview.js +191 -0
  162. package/dist/src/formats/gexf/preview.js.map +1 -0
  163. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  164. package/dist/src/formats/gexf/schema.js +2 -1
  165. package/dist/src/formats/gexf/schema.js.map +1 -1
  166. package/dist/src/formats/gexf/styles.d.ts +58 -31
  167. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  168. package/dist/src/formats/gexf/styles.js +848 -225
  169. package/dist/src/formats/gexf/styles.js.map +1 -1
  170. package/dist/src/formats/gml/importer.d.ts +5 -2
  171. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  172. package/dist/src/formats/gml/importer.js +258 -71
  173. package/dist/src/formats/gml/importer.js.map +1 -1
  174. package/dist/src/formats/gml/index.d.ts +1 -1
  175. package/dist/src/formats/gml/index.d.ts.map +1 -1
  176. package/dist/src/formats/gml/index.js +1 -1
  177. package/dist/src/formats/gml/index.js.map +1 -1
  178. package/dist/src/formats/gml/positions.d.ts +7 -0
  179. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  180. package/dist/src/formats/gml/positions.js +29 -7
  181. package/dist/src/formats/gml/positions.js.map +1 -1
  182. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  183. package/dist/src/formats/gml/styles.js +753 -101
  184. package/dist/src/formats/gml/styles.js.map +1 -1
  185. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  186. package/dist/src/formats/graphml/styles-plain.js +6 -10
  187. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  188. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  189. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  190. package/dist/src/formats/graphml/styles-yed.js +692 -161
  191. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  192. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  193. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  194. package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
  195. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  196. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  197. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/yfiles.js +16 -6
  199. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  200. package/dist/src/formats/json/dialect.d.ts +3 -2
  201. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  202. package/dist/src/formats/json/dialect.js +39 -5
  203. package/dist/src/formats/json/dialect.js.map +1 -1
  204. package/dist/src/formats/json/importer.d.ts +13 -2
  205. package/dist/src/formats/json/importer.d.ts.map +1 -1
  206. package/dist/src/formats/json/importer.js +42 -6
  207. package/dist/src/formats/json/importer.js.map +1 -1
  208. package/dist/src/formats/json/index.d.ts +1 -1
  209. package/dist/src/formats/json/index.d.ts.map +1 -1
  210. package/dist/src/formats/json/index.js +1 -1
  211. package/dist/src/formats/json/index.js.map +1 -1
  212. package/dist/src/formats/json/positions.d.ts +5 -2
  213. package/dist/src/formats/json/positions.d.ts.map +1 -1
  214. package/dist/src/formats/json/positions.js +20 -4
  215. package/dist/src/formats/json/positions.js.map +1 -1
  216. package/dist/src/formats/json/styles.d.ts +12 -1
  217. package/dist/src/formats/json/styles.d.ts.map +1 -1
  218. package/dist/src/formats/json/styles.js +1755 -136
  219. package/dist/src/formats/json/styles.js.map +1 -1
  220. package/dist/src/formats/pajek/draw.d.ts +96 -0
  221. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  222. package/dist/src/formats/pajek/draw.js +372 -0
  223. package/dist/src/formats/pajek/draw.js.map +1 -0
  224. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  225. package/dist/src/formats/pajek/exporter.js +70 -51
  226. package/dist/src/formats/pajek/exporter.js.map +1 -1
  227. package/dist/src/formats/pajek/importer.d.ts +9 -0
  228. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  229. package/dist/src/formats/pajek/importer.js +233 -102
  230. package/dist/src/formats/pajek/importer.js.map +1 -1
  231. package/dist/src/formats/pajek/index.d.ts +1 -0
  232. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  233. package/dist/src/formats/pajek/index.js.map +1 -1
  234. package/dist/src/formats/pajek/styles.d.ts +15 -7
  235. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  236. package/dist/src/formats/pajek/styles.js +1278 -114
  237. package/dist/src/formats/pajek/styles.js.map +1 -1
  238. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  239. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  240. package/dist/src/formats/pajek/syntax.js +26 -2
  241. package/dist/src/formats/pajek/syntax.js.map +1 -1
  242. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  243. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  244. package/dist/src/formats/xgmml/emit.js +65 -5
  245. package/dist/src/formats/xgmml/emit.js.map +1 -1
  246. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  247. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  248. package/dist/src/formats/xgmml/styles.js +277 -60
  249. package/dist/src/formats/xgmml/styles.js.map +1 -1
  250. package/dist/src/index.d.ts +4 -3
  251. package/dist/src/index.d.ts.map +1 -1
  252. package/dist/src/index.js +4 -3
  253. package/dist/src/index.js.map +1 -1
  254. package/dist/src/positions/convert.d.ts.map +1 -1
  255. package/dist/src/positions/convert.js +11 -1
  256. package/dist/src/positions/convert.js.map +1 -1
  257. package/dist/src/positions/extract.d.ts.map +1 -1
  258. package/dist/src/positions/extract.js +53 -1
  259. package/dist/src/positions/extract.js.map +1 -1
  260. package/dist/src/positions/index.d.ts +1 -1
  261. package/dist/src/positions/index.d.ts.map +1 -1
  262. package/dist/src/positions/types.d.ts +59 -0
  263. package/dist/src/positions/types.d.ts.map +1 -1
  264. package/dist/src/sources/builtins.d.ts +1 -1
  265. package/dist/src/sources/builtins.d.ts.map +1 -1
  266. package/dist/src/sources/builtins.js +8 -2
  267. package/dist/src/sources/builtins.js.map +1 -1
  268. package/dist/src/sources/context.d.ts.map +1 -1
  269. package/dist/src/sources/context.js +1 -0
  270. package/dist/src/sources/context.js.map +1 -1
  271. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  272. package/dist/src/sources/cypher/descriptor.js +5 -0
  273. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  274. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  275. package/dist/src/sources/cypher/index.js +124 -18
  276. package/dist/src/sources/cypher/index.js.map +1 -1
  277. package/dist/src/sources/cypher/params.d.ts +1 -1
  278. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  279. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  280. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  281. package/dist/src/sources/cypher/query-builder.js +31 -0
  282. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  283. package/dist/src/sources/ids.d.ts +5 -0
  284. package/dist/src/sources/ids.d.ts.map +1 -1
  285. package/dist/src/sources/ids.js +5 -0
  286. package/dist/src/sources/ids.js.map +1 -1
  287. package/dist/src/sources/params.d.ts +3 -0
  288. package/dist/src/sources/params.d.ts.map +1 -1
  289. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  290. package/dist/src/sources/rest/descriptor.js +5 -0
  291. package/dist/src/sources/rest/descriptor.js.map +1 -1
  292. package/dist/src/sources/rest/source.d.ts.map +1 -1
  293. package/dist/src/sources/rest/source.js +15 -0
  294. package/dist/src/sources/rest/source.js.map +1 -1
  295. package/dist/src/sources/sigv4.d.ts +5 -3
  296. package/dist/src/sources/sigv4.d.ts.map +1 -1
  297. package/dist/src/sources/sigv4.js +6 -4
  298. package/dist/src/sources/sigv4.js.map +1 -1
  299. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  300. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  301. package/dist/src/sources/sparql/descriptor.js +64 -0
  302. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  303. package/dist/src/sources/sparql/index.d.ts +28 -0
  304. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  305. package/dist/src/sources/sparql/index.js +314 -0
  306. package/dist/src/sources/sparql/index.js.map +1 -0
  307. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  308. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  309. package/dist/src/sources/sparql/ntriples.js +180 -0
  310. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  311. package/dist/src/sources/sparql/params.d.ts +27 -0
  312. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  313. package/dist/src/sources/sparql/params.js +5 -0
  314. package/dist/src/sources/sparql/params.js.map +1 -0
  315. package/dist/src/sources/sparql/query.d.ts +72 -0
  316. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  317. package/dist/src/sources/sparql/query.js +113 -0
  318. package/dist/src/sources/sparql/query.js.map +1 -0
  319. package/dist/src/sources/types.d.ts +31 -0
  320. package/dist/src/sources/types.d.ts.map +1 -1
  321. package/dist/src/styles/annotations.d.ts +61 -5
  322. package/dist/src/styles/annotations.d.ts.map +1 -1
  323. package/dist/src/styles/annotations.js +130 -22
  324. package/dist/src/styles/annotations.js.map +1 -1
  325. package/dist/src/styles/canon/bends.d.ts +46 -0
  326. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  327. package/dist/src/styles/canon/bends.js +123 -0
  328. package/dist/src/styles/canon/bends.js.map +1 -1
  329. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  330. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  331. package/dist/src/styles/canon/color-tables.js +10 -4
  332. package/dist/src/styles/canon/color-tables.js.map +1 -1
  333. package/dist/src/styles/canon/color.d.ts +3 -1
  334. package/dist/src/styles/canon/color.d.ts.map +1 -1
  335. package/dist/src/styles/canon/color.js +103 -3
  336. package/dist/src/styles/canon/color.js.map +1 -1
  337. package/dist/src/styles/canon/enums.d.ts +2 -2
  338. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  339. package/dist/src/styles/canon/enums.js +81 -7
  340. package/dist/src/styles/canon/enums.js.map +1 -1
  341. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  342. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  343. package/dist/src/styles/canon/graphviz.js +57 -9
  344. package/dist/src/styles/canon/graphviz.js.map +1 -1
  345. package/dist/src/styles/canon/number.d.ts +8 -0
  346. package/dist/src/styles/canon/number.d.ts.map +1 -1
  347. package/dist/src/styles/canon/number.js +18 -0
  348. package/dist/src/styles/canon/number.js.map +1 -1
  349. package/dist/src/styles/canon/text.d.ts +29 -2
  350. package/dist/src/styles/canon/text.d.ts.map +1 -1
  351. package/dist/src/styles/canon/text.js +156 -16
  352. package/dist/src/styles/canon/text.js.map +1 -1
  353. package/dist/src/styles/codes.d.ts +2 -0
  354. package/dist/src/styles/codes.d.ts.map +1 -1
  355. package/dist/src/styles/codes.js +2 -0
  356. package/dist/src/styles/codes.js.map +1 -1
  357. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  358. package/dist/src/styles/cyjs/cascade.js +1015 -79
  359. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  360. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  361. package/dist/src/styles/cyjs/defaults-table.js +3 -0
  362. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  363. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  364. package/dist/src/styles/cyjs/emit.js +202 -9
  365. package/dist/src/styles/cyjs/emit.js.map +1 -1
  366. package/dist/src/styles/cyjs/face.d.ts +20 -0
  367. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  368. package/dist/src/styles/cyjs/face.js +332 -0
  369. package/dist/src/styles/cyjs/face.js.map +1 -0
  370. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  371. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  372. package/dist/src/styles/cyjs/mappers.js +461 -26
  373. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  374. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  375. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  376. package/dist/src/styles/cyjs/routes.js +360 -0
  377. package/dist/src/styles/cyjs/routes.js.map +1 -0
  378. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  379. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  380. package/dist/src/styles/cytoscape/charts.js +560 -0
  381. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  382. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  383. package/dist/src/styles/cytoscape/emit.js +156 -48
  384. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  385. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  386. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  387. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  388. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  389. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  390. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  391. package/dist/src/styles/cytoscape/mappings.js +92 -0
  392. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  393. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  394. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  395. package/dist/src/styles/cytoscape/resolve.js +623 -17
  396. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  397. package/dist/src/styles/defaults.d.ts +46 -26
  398. package/dist/src/styles/defaults.d.ts.map +1 -1
  399. package/dist/src/styles/defaults.js +308 -71
  400. package/dist/src/styles/defaults.js.map +1 -1
  401. package/dist/src/styles/index.d.ts +4 -3
  402. package/dist/src/styles/index.d.ts.map +1 -1
  403. package/dist/src/styles/index.js +3 -2
  404. package/dist/src/styles/index.js.map +1 -1
  405. package/dist/src/styles/internal.d.ts +1 -0
  406. package/dist/src/styles/internal.d.ts.map +1 -1
  407. package/dist/src/styles/internal.js +1 -0
  408. package/dist/src/styles/internal.js.map +1 -1
  409. package/dist/src/styles/io/generic.d.ts.map +1 -1
  410. package/dist/src/styles/io/generic.js +56 -16
  411. package/dist/src/styles/io/generic.js.map +1 -1
  412. package/dist/src/styles/io/round-trip.d.ts +56 -0
  413. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  414. package/dist/src/styles/io/round-trip.js +138 -0
  415. package/dist/src/styles/io/round-trip.js.map +1 -0
  416. package/dist/src/styles/io/writer.d.ts.map +1 -1
  417. package/dist/src/styles/io/writer.js +6 -1
  418. package/dist/src/styles/io/writer.js.map +1 -1
  419. package/dist/src/styles/notes.d.ts.map +1 -1
  420. package/dist/src/styles/notes.js +1 -0
  421. package/dist/src/styles/notes.js.map +1 -1
  422. package/dist/src/styles/plan/features.d.ts +1 -1
  423. package/dist/src/styles/plan/features.d.ts.map +1 -1
  424. package/dist/src/styles/plan/features.js +22 -2
  425. package/dist/src/styles/plan/features.js.map +1 -1
  426. package/dist/src/styles/plan/index.d.ts +1 -1
  427. package/dist/src/styles/plan/index.d.ts.map +1 -1
  428. package/dist/src/styles/plan/index.js +1 -1
  429. package/dist/src/styles/plan/index.js.map +1 -1
  430. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  431. package/dist/src/styles/plan/plan.js +61 -4
  432. package/dist/src/styles/plan/plan.js.map +1 -1
  433. package/dist/src/styles/plan/resolve.d.ts +11 -0
  434. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  435. package/dist/src/styles/plan/resolve.js +40 -4
  436. package/dist/src/styles/plan/resolve.js.map +1 -1
  437. package/dist/src/styles/slots.d.ts +14 -0
  438. package/dist/src/styles/slots.d.ts.map +1 -0
  439. package/dist/src/styles/slots.js +20 -0
  440. package/dist/src/styles/slots.js.map +1 -0
  441. package/dist/src/styles/types.d.ts +622 -6
  442. package/dist/src/styles/types.d.ts.map +1 -1
  443. package/dist/src/styles/vocabulary.d.ts +3 -2
  444. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  445. package/dist/src/styles/vocabulary.js +203 -0
  446. package/dist/src/styles/vocabulary.js.map +1 -1
  447. package/dist/styles.js +30 -239
  448. package/dist/styles.js.map +1 -1
  449. package/dist/xgmml.js +3 -3
  450. package/package.json +27 -7
  451. package/src/formats/cx/importer.ts +6 -1
  452. package/src/formats/cx/styles.ts +143 -9
  453. package/src/formats/cx2/importer.ts +1 -0
  454. package/src/formats/cx2/styles.ts +3 -1
  455. package/src/formats/cys/importer.ts +1 -0
  456. package/src/formats/cys/styles.ts +27 -5
  457. package/src/formats/dot/drawing.ts +799 -0
  458. package/src/formats/dot/importer.ts +120 -35
  459. package/src/formats/dot/label-places.ts +228 -0
  460. package/src/formats/dot/record.ts +336 -0
  461. package/src/formats/dot/styles.ts +1654 -153
  462. package/src/formats/gexf/dialog-metrics.ts +61 -0
  463. package/src/formats/gexf/importer.ts +50 -5
  464. package/src/formats/gexf/preview.ts +217 -0
  465. package/src/formats/gexf/schema.ts +2 -1
  466. package/src/formats/gexf/styles.ts +1099 -245
  467. package/src/formats/gml/importer.ts +291 -76
  468. package/src/formats/gml/index.ts +1 -1
  469. package/src/formats/gml/positions.ts +29 -7
  470. package/src/formats/gml/styles.ts +851 -109
  471. package/src/formats/graphml/styles-plain.ts +6 -15
  472. package/src/formats/graphml/styles-yed.ts +762 -173
  473. package/src/formats/graphml/styles-yfiles3.ts +485 -63
  474. package/src/formats/graphml/yfiles.ts +19 -6
  475. package/src/formats/json/dialect.ts +41 -5
  476. package/src/formats/json/importer.ts +59 -7
  477. package/src/formats/json/index.ts +1 -0
  478. package/src/formats/json/positions.ts +22 -5
  479. package/src/formats/json/styles.ts +2041 -185
  480. package/src/formats/pajek/draw.ts +458 -0
  481. package/src/formats/pajek/exporter.ts +81 -49
  482. package/src/formats/pajek/importer.ts +278 -103
  483. package/src/formats/pajek/index.ts +1 -0
  484. package/src/formats/pajek/styles.ts +1381 -133
  485. package/src/formats/pajek/syntax.ts +27 -2
  486. package/src/formats/xgmml/emit.ts +73 -5
  487. package/src/formats/xgmml/styles.ts +330 -71
  488. package/src/index.ts +5 -1
  489. package/src/positions/convert.ts +12 -1
  490. package/src/positions/extract.ts +55 -1
  491. package/src/positions/index.ts +1 -0
  492. package/src/positions/types.ts +60 -0
  493. package/src/sources/builtins.ts +8 -1
  494. package/src/sources/context.ts +1 -0
  495. package/src/sources/cypher/descriptor.ts +7 -1
  496. package/src/sources/cypher/index.ts +148 -18
  497. package/src/sources/cypher/params.ts +1 -1
  498. package/src/sources/cypher/query-builder.ts +33 -0
  499. package/src/sources/ids.ts +6 -0
  500. package/src/sources/params.ts +3 -0
  501. package/src/sources/rest/descriptor.ts +5 -0
  502. package/src/sources/rest/source.ts +16 -0
  503. package/src/sources/sigv4.ts +6 -4
  504. package/src/sources/sparql/descriptor.ts +67 -0
  505. package/src/sources/sparql/index.ts +356 -0
  506. package/src/sources/sparql/ntriples.ts +219 -0
  507. package/src/sources/sparql/params.ts +28 -0
  508. package/src/sources/sparql/query.ts +162 -0
  509. package/src/sources/types.ts +35 -0
  510. package/src/styles/annotations.ts +201 -27
  511. package/src/styles/canon/bends.ts +137 -0
  512. package/src/styles/canon/color-tables.ts +10 -4
  513. package/src/styles/canon/color.ts +105 -3
  514. package/src/styles/canon/enums.ts +98 -8
  515. package/src/styles/canon/graphviz.ts +71 -10
  516. package/src/styles/canon/number.ts +19 -0
  517. package/src/styles/canon/text.ts +187 -16
  518. package/src/styles/codes.ts +2 -0
  519. package/src/styles/cyjs/cascade.ts +1160 -84
  520. package/src/styles/cyjs/defaults-table.ts +3 -0
  521. package/src/styles/cyjs/emit.ts +233 -13
  522. package/src/styles/cyjs/face.ts +372 -0
  523. package/src/styles/cyjs/mappers.ts +492 -27
  524. package/src/styles/cyjs/routes.ts +432 -0
  525. package/src/styles/cytoscape/charts.ts +684 -0
  526. package/src/styles/cytoscape/emit.ts +170 -48
  527. package/src/styles/cytoscape/lexicon.ts +431 -78
  528. package/src/styles/cytoscape/mappings.ts +108 -0
  529. package/src/styles/cytoscape/resolve.ts +741 -17
  530. package/src/styles/defaults.ts +417 -108
  531. package/src/styles/index.ts +5 -0
  532. package/src/styles/internal.ts +1 -0
  533. package/src/styles/io/generic.ts +79 -23
  534. package/src/styles/io/round-trip.ts +202 -0
  535. package/src/styles/io/writer.ts +6 -1
  536. package/src/styles/notes.ts +1 -0
  537. package/src/styles/plan/features.ts +23 -2
  538. package/src/styles/plan/index.ts +1 -1
  539. package/src/styles/plan/plan.ts +69 -5
  540. package/src/styles/plan/resolve.ts +47 -4
  541. package/src/styles/slots.ts +25 -0
  542. package/src/styles/types.ts +633 -5
  543. package/src/styles/vocabulary.ts +211 -2
  544. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  545. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  546. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  547. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  548. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  549. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  550. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  551. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  552. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  553. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  554. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  555. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  556. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  557. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  558. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  559. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  560. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  561. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  562. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  563. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  564. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  565. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  566. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  567. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  568. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  569. package/dist/chunks/writer-DvHTl36J.js +0 -449
  570. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Canonical enumeration values: each dialect's spellings matched against an alias table without regard to case,
3
3
  * spaces or underscores. An unknown value of an open enumeration (shapes, border and line styles, arrows) is kept as
4
- * `other:<raw>` and noted; an unknown value of a closed one (weights, positions) gives no value and is noted.
4
+ * `other:<raw>` and noted; an unknown value of a closed one (weights, positions, label fits) gives no value and is noted.
5
5
  */
6
6
 
7
7
  import { STYLE_ISSUE } from "../codes.js";
@@ -12,7 +12,17 @@ import { type CanonSite, noteAt, scalarText } from "./site.js";
12
12
  * The enumerations a style value can belong to.
13
13
  * @category Styles
14
14
  */
15
- export type StyleEnumKind = "shape" | "borderStyle" | "lineStyle" | "arrow" | "weight" | "position";
15
+ export type StyleEnumKind =
16
+ | "shape"
17
+ | "borderStyle"
18
+ | "borderPosition"
19
+ | "lineStyle"
20
+ | "arrow"
21
+ | "arrowSide"
22
+ | "weight"
23
+ | "position"
24
+ | "labelFit"
25
+ | "textAlign";
16
26
 
17
27
  type Aliases = Readonly<Record<string, readonly string[]>>;
18
28
 
@@ -55,16 +65,34 @@ const SHAPES: Aliases = {
55
65
  "roundedrectangle",
56
66
  "round-rect",
57
67
  "mrecord",
58
- "cut-rectangle",
59
68
  "round-tag",
60
69
  "bottom-round-rectangle",
70
+ "bottomroundrectangle",
61
71
  ],
62
72
  triangle: ["triangle", "invtriangle", "round-triangle", "tag"],
63
73
  diamond: ["diamond", "rhombus", "mdiamond", "round-diamond"],
64
74
  pentagon: ["pentagon", "round-pentagon"],
65
- hexagon: ["hexagon", "hexagon2", "round-hexagon", "concave-hexagon", "septagon", "heptagon", "round-heptagon"],
66
- octagon: ["octagon", "doubleoctagon", "tripleoctagon", "round-octagon", "octagon2"],
67
- parallelogram: ["parallelogram", "parallelogram2", "rhomboid", "fat-arrow", "fatarrow"],
75
+ hexagon: [
76
+ "hexagon",
77
+ "hexagon2",
78
+ "round-hexagon",
79
+ "concave-hexagon",
80
+ "concavehexagon",
81
+ "septagon",
82
+ "heptagon",
83
+ "round-heptagon",
84
+ ],
85
+ // a cut rectangle is a rectangle with its four corners cut off: eight sides
86
+ octagon: [
87
+ "octagon",
88
+ "doubleoctagon",
89
+ "tripleoctagon",
90
+ "round-octagon",
91
+ "octagon2",
92
+ "cut-rectangle",
93
+ "cutrectangle",
94
+ ],
95
+ parallelogram: ["parallelogram", "parallelogram2", "rhomboid", "right-rhomboid", "fat-arrow", "fatarrow"],
68
96
  trapezoid: ["trapezoid", "trapezoid2", "invtrapezoid", "trapezium", "round-trapezoid"],
69
97
  star: ["star", "star5", "star6", "star8", "polygon"],
70
98
  vee: ["vee", "v"],
@@ -136,6 +164,35 @@ const POSITIONS: Aliases = {
136
164
  "bottom-left": ["bottom-left", "south-west", "southwest"],
137
165
  "bottom-right": ["bottom-right", "south-east", "southeast"],
138
166
  "inside-top": ["inside-top"],
167
+ "inside-bottom": ["inside-bottom"],
168
+ "inside-left": ["inside-left"],
169
+ "inside-right": ["inside-right"],
170
+ "inside-top-left": ["inside-top-left"],
171
+ "inside-top-right": ["inside-top-right"],
172
+ "inside-bottom-left": ["inside-bottom-left"],
173
+ "inside-bottom-right": ["inside-bottom-right"],
174
+ };
175
+
176
+ const BORDER_POSITIONS: Aliases = {
177
+ inside: ["inside"],
178
+ center: ["center", "centre", "middle"],
179
+ outside: ["outside"],
180
+ };
181
+
182
+ const ARROW_SIDES: Aliases = {
183
+ left: ["left"],
184
+ right: ["right"],
185
+ };
186
+
187
+ const TEXT_ALIGNS: Aliases = {
188
+ left: ["left", "start"],
189
+ center: ["center", "centre", "middle"],
190
+ right: ["right", "end"],
191
+ };
192
+
193
+ const LABEL_FITS: Aliases = {
194
+ inside: ["inside"],
195
+ bounds: ["bounds"],
139
196
  };
140
197
 
141
198
  /** vis-network draws these spellings differently from the common reading. */
@@ -146,11 +203,40 @@ const VIS: Partial<Record<StyleEnumKind, Aliases>> = {
146
203
  triangle: ["triangledown"],
147
204
  none: ["text"],
148
205
  },
149
- arrow: { inverted: ["inv-triangle"], square: ["box"] },
206
+ // curve and inv_curve: an arc at the end, bulging toward the node and away from it
207
+ arrow: { inverted: ["inv-triangle"], square: ["box"], "other:curve": ["curve"], "other:inv-curve": ["inv-curve"] },
208
+ };
209
+
210
+ /**
211
+ * Cytoscape.js's compound arrows (https://js.cytoscape.org/#style/edge-arrow): a triangle with a bar behind it, with a
212
+ * thin bar across the line behind it, a dot with a triangle behind it and its short chevron each keep their own name;
213
+ * its triangle-backcurve is a triangle whose back is hollowed out, which is how a vee is drawn.
214
+ */
215
+ const CYJS: Partial<Record<StyleEnumKind, Aliases>> = {
216
+ arrow: {
217
+ "other:triangle-tee": ["triangle-tee"],
218
+ "other:triangle-cross": ["triangle-cross"],
219
+ "other:circle-triangle": ["circle-triangle"],
220
+ // a vee two thirds as long as its triangle (0.2 of the arrow width against 0.3)
221
+ "other:chevron": ["chevron"],
222
+ vee: ["triangle-backcurve"],
223
+ },
224
+ };
225
+
226
+ /**
227
+ * Graphviz's curve and icurve (lib/common/arrows.c arrow_type_curve): a stem to the tip with an arc across it, bulging
228
+ * toward the tip and, inverted, away from it -- vis-network's curve and inv_curve.
229
+ */
230
+ const GRAPHVIZ: Partial<Record<StyleEnumKind, Aliases>> = {
231
+ arrow: { "other:curve": ["curve"], "other:inv-curve": ["icurve"] },
150
232
  };
151
233
 
152
234
  /** Per-dialect overrides; a dialect not listed reads the common table alone. */
153
- const OVERRIDES: ReadonlyMap<string, Partial<Record<StyleEnumKind, Aliases>>> = new Map([["vis", VIS]]);
235
+ const OVERRIDES: ReadonlyMap<string, Partial<Record<StyleEnumKind, Aliases>>> = new Map([
236
+ ["vis", VIS],
237
+ ["graphviz", GRAPHVIZ],
238
+ ["cytoscape-js", CYJS],
239
+ ]);
154
240
 
155
241
  const OPEN: ReadonlySet<StyleEnumKind> = new Set<StyleEnumKind>(["shape", "borderStyle", "lineStyle", "arrow"]);
156
242
 
@@ -174,8 +260,12 @@ const COMMON: ReadonlyMap<StyleEnumKind, ReadonlyMap<string, string>> = new Map(
174
260
  ["borderStyle", lookup(BORDER_STYLES)],
175
261
  ["lineStyle", lookup(LINE_STYLES)],
176
262
  ["arrow", lookup(ARROWS)],
263
+ ["arrowSide", lookup(ARROW_SIDES)],
177
264
  ["weight", lookup(WEIGHTS)],
178
265
  ["position", lookup(POSITIONS)],
266
+ ["labelFit", lookup(LABEL_FITS)],
267
+ ["borderPosition", lookup(BORDER_POSITIONS)],
268
+ ["textAlign", lookup(TEXT_ALIGNS)],
179
269
  ]);
180
270
 
181
271
  const DIALECT: ReadonlyMap<string, ReadonlyMap<StyleEnumKind, ReadonlyMap<string, string>>> = new Map(
@@ -12,6 +12,13 @@
12
12
  * scheme knows no names at all.
13
13
  * - `transparent`, `none` and `invis` are `#fffffe` with alpha 0, whatever the scheme.
14
14
  * - An unknown color is drawn BLACK.
15
+ * - A bare name SVG knows (`gray`, `purple`, `green`, `maroon`, `crimson` ...), not in a `/scheme/` and with no
16
+ * leading blanks, is drawn as the SVG color, whatever the scheme: Graphviz's SVG output writes such a name as it is
17
+ * (`fill="gray"`, gvrender_resolve_color) and every SVG reader draws it as CSS does, so `gray` is #808080 there,
18
+ * not X11's #c0c0c0. The SVG drawing is the one we read Graphviz by.
19
+ * - An outline or font color list whose first entry is such a name is written whole (`stroke="red:blue"`: Graphviz
20
+ * resolves the first entry in place and puts the `:` back), which no SVG reader can draw: an outline is not drawn
21
+ * and a text is black, SVG's own default.
15
22
  * - A color list (`red:blue`, `red;0.3:blue`): an outline or a font color draws the text before the first `:` as one
16
23
  * color, so `red:blue` is red and `red;0.3:blue` is black (`red;0.3` is not a color). A fill draws a gradient and
17
24
  * an edge draws one line per color; both start with the first entry's color, its `;fraction` dropped. A value
@@ -24,7 +31,7 @@ import { BREWER_SCHEMES, CSS_COLORS, X11_COLORS } from "./color-tables.js";
24
31
  * How Graphviz draws a color value, which decides how a color list is read.
25
32
  * @category Styles
26
33
  */
27
- export type GraphvizColorUse = "line" | "fill" | "edge";
34
+ export type GraphvizColorUse = "line" | "text" | "fill" | "edge";
28
35
 
29
36
  /**
30
37
  * A resolved Graphviz color, with how it was read.
@@ -159,30 +166,84 @@ function schemeColor(name: string, scheme: string): string | undefined {
159
166
  return colors !== undefined && index >= 1 ? colors[index - 1] : undefined;
160
167
  }
161
168
 
169
+ /**
170
+ * A color list whose first color is a bare SVG name, as Graphviz's SVG output draws it for a pen: no outline, black
171
+ * text.
172
+ * @param use - `line` or `text`
173
+ * @returns the color
174
+ */
175
+ function svgPenList(use: GraphvizColorUse): GraphvizColor {
176
+ return use === "line"
177
+ ? { hex: "#fffffe", alpha: 0, unknown: false, list: null }
178
+ : { hex: "#000000", alpha: 1, unknown: false, list: null };
179
+ }
180
+
181
+ /**
182
+ * A color list entry without its `;fraction`.
183
+ * @param text - the entry
184
+ * @returns the color part
185
+ */
186
+ function beforeSemicolon(text: string): string {
187
+ const semi = text.indexOf(";");
188
+ return semi >= 0 ? text.slice(0, semi) : text;
189
+ }
190
+
191
+ /**
192
+ * One Graphviz color, read from its scheme (X11 when none), a bare SVG name first when `svgNames` says so.
193
+ * @param raw - the whole value
194
+ * @param text - the color, without the list after it
195
+ * @param scheme - the object's `colorscheme`, or null
196
+ * @param svgNames - whether a bare SVG name is drawn as SVG's color
197
+ * @returns the color, or null when it is unknown
198
+ */
199
+ function resolveColorText(
200
+ raw: string,
201
+ text: string,
202
+ scheme: string | null,
203
+ svgNames: boolean,
204
+ ): { hex: string; alpha: number } | null {
205
+ const svgName = svgNames && raw.startsWith(text) ? CSS_COLORS.get(text.toLowerCase()) : undefined;
206
+ if (svgName !== undefined) {
207
+ return { hex: svgName, alpha: 1 };
208
+ }
209
+ if (text === "") {
210
+ return null;
211
+ }
212
+ const sc = scheme === null || scheme.trim() === "" ? "x11" : scheme.toLowerCase();
213
+ return resolveOne(text, sc);
214
+ }
215
+
162
216
  /**
163
217
  * Resolves a Graphviz color value the way Graphviz draws it for a use; an unknown color is black.
164
218
  * @param raw - the value, at most 256 characters
165
219
  * @param scheme - the object's `colorscheme`, or null
166
- * @param use - an outline or font color (`line`), a fill, or an edge's line color
220
+ * @param use - an outline color (`line`), a font color (`text`), a fill, or an edge's line color
221
+ * @param svgNames - whether a bare SVG name is drawn as SVG's color, as Graphviz's SVG output draws it (false: as
222
+ * every other Graphviz output draws it)
167
223
  * @returns the color and how it was read
168
224
  * @category Styles
169
225
  */
170
- export function graphvizColor(raw: string, scheme: string | null, use: GraphvizColorUse): GraphvizColor {
226
+ export function graphvizColor(
227
+ raw: string,
228
+ scheme: string | null,
229
+ use: GraphvizColorUse,
230
+ svgNames = true,
231
+ ): GraphvizColor {
171
232
  let text = raw.replace(/^[ \t\r\n]+/, "");
172
233
  let list: GraphvizColor["list"] = null;
173
234
  const colon = text.indexOf(":");
235
+ const pen = use === "line" || use === "text";
174
236
  if (colon >= 0) {
175
237
  text = text.slice(0, colon);
176
- if (use !== "line") {
177
- const semi = text.indexOf(";");
178
- if (semi >= 0) {
179
- text = text.slice(0, semi);
180
- }
238
+ if (svgNames && pen && raw.startsWith(text) && CSS_COLORS.has(text.toLowerCase())) {
239
+ return svgPenList(use);
240
+ }
241
+ if (!pen) {
242
+ text = beforeSemicolon(text);
181
243
  list = use === "fill" ? "gradient" : "lines";
182
244
  }
183
245
  }
184
- const sc = scheme === null || scheme.trim() === "" ? "x11" : scheme.toLowerCase();
185
- const resolved = text === "" ? null : resolveOne(text, sc);
246
+ const resolved = resolveColorText(raw, text, scheme, svgNames);
186
247
  return resolved === null
187
248
  ? { hex: "#000000", alpha: 1, unknown: true, list }
188
249
  : { hex: resolved.hex, alpha: resolved.alpha, unknown: false, list };
@@ -82,6 +82,25 @@ export function canonNumber(raw: unknown, site: CanonSite, factor = 1): number |
82
82
  return num6(scaled);
83
83
  }
84
84
 
85
+ /**
86
+ * A signed number (an offset): any finite value within the largest a style number may be, either way.
87
+ * @param raw - the file's value
88
+ * @param site - where it was read
89
+ * @returns the canonical number, or null (noted)
90
+ * @category Styles
91
+ */
92
+ export function canonSigned(raw: unknown, site: CanonSite): number | null {
93
+ const value = finite(raw, site);
94
+ if (value === null) {
95
+ return null;
96
+ }
97
+ if (Math.abs(value) > MAX_STYLE_NUMBER) {
98
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw === "string" ? raw : String(raw));
99
+ return null;
100
+ }
101
+ return num6(value);
102
+ }
103
+
85
104
  /**
86
105
  * An opacity from 0 to 1. Cytoscape desktop states opacities from 0 to 255 and is divided by 255; every other
87
106
  * dialect states 0 to 1. A value outside the dialect's range is null with a `W_STYLE_BAD_VALUE` note.
@@ -51,7 +51,8 @@ export interface DotEscapeNames {
51
51
  /**
52
52
  * The text a DOT label draws, in Graphviz's two passes: first `\N`, `\G`, `\E`, `\T` and `\H` are replaced by the
53
53
  * names and every other backslash pair is kept; then `\n`, `\l` and `\r` end a line (a final one adds no empty line)
54
- * and any other escaped character stands for itself. So a node name holding `\n` breaks the line.
54
+ * and any other escaped character stands for itself. So a node name holding `\n` breaks the line. Between the
55
+ * two, HTML entities (`&amp;`, `&#946;`) are decoded, as Graphviz's `htmlEntityUTF8` does for a plain label.
55
56
  * @param text - the label as the file gives it
56
57
  * @param names - the names to substitute
57
58
  * @param site - where it was read, for the budget
@@ -62,6 +63,20 @@ export function dotLabelText(text: string, names: DotEscapeNames, site?: CanonSi
62
63
  if (site !== undefined) {
63
64
  spendAt(site, text.length);
64
65
  }
66
+ const out = replaceEscapes(decodeEntities(substituteNames(text, names)), (e) =>
67
+ e === "n" || e === "l" || e === "r" ? "\n" : e,
68
+ );
69
+ return out.endsWith("\n") ? out.slice(0, -1) : out;
70
+ }
71
+
72
+ /**
73
+ * Graphviz's first pass over a label: `\N`, `\G`, `\E`, `\T` and `\H` replaced by the names, every other
74
+ * backslash pair kept.
75
+ * @param text - the label as the file gives it
76
+ * @param names - the names to substitute
77
+ * @returns the text
78
+ */
79
+ function substituteNames(text: string, names: DotEscapeNames): string {
65
80
  const subs: Readonly<Record<string, string | undefined>> = {
66
81
  N: names.node,
67
82
  G: names.graph,
@@ -69,9 +84,34 @@ export function dotLabelText(text: string, names: DotEscapeNames, site?: CanonSi
69
84
  T: names.tail,
70
85
  H: names.head,
71
86
  };
72
- const first = replaceEscapes(text, (e) => (Object.hasOwn(subs, e) ? subs[e] : undefined) ?? `\\${e}`);
73
- const out = replaceEscapes(first, (e) => (e === "n" || e === "l" || e === "r" ? "\n" : e));
74
- return out.endsWith("\n") ? out.slice(0, -1) : out;
87
+ return replaceEscapes(text, (e) => (Object.hasOwn(subs, e) ? subs[e] : undefined) ?? `\\${e}`);
88
+ }
89
+
90
+ /**
91
+ * How a DOT label's lines line up: each line ended by `\l` is drawn against the left, by `\r` against the right, and
92
+ * any other line centered (Graphviz's second pass, after `\N` and the other names are substituted). graphty lines
93
+ * up a label's lines one way, so the way most of its lines take wins, the first line's on a tie.
94
+ * @param text - the label as the file gives it
95
+ * @param names - the names to substitute
96
+ * @returns `left` or `right`, or null for a centered label
97
+ * @category Styles
98
+ */
99
+ export function dotLabelAlign(text: string, names: DotEscapeNames): "left" | "right" | null {
100
+ // each line's end, in order: "n" centered, "l" left, "r" right; text after the last end is a centered line
101
+ const parts = replaceEscapes(substituteNames(text, names), (e) =>
102
+ e === "n" || e === "l" || e === "r" ? `\u0000${e}\u0000` : "x",
103
+ ).split("\u0000");
104
+ const ends = parts.filter((_, i) => i % 2 === 1);
105
+ if (parts.at(-1) !== "") {
106
+ ends.push("n");
107
+ }
108
+ const count = (end: string): number => ends.filter((e) => e === end).length;
109
+ const best = ["l", "r", "n"].filter((end) => count(end) === Math.max(count("l"), count("r"), count("n")));
110
+ const winner = best.length > 1 ? (ends.find((e) => best.includes(e)) ?? "n") : best[0];
111
+ if (winner === "l") {
112
+ return "left";
113
+ }
114
+ return winner === "r" ? "right" : null;
75
115
  }
76
116
 
77
117
  /**
@@ -126,7 +166,8 @@ function entity(body: string): string | undefined {
126
166
 
127
167
  /**
128
168
  * The text an HTML-like label shows: tags dropped, `<br/>` as a line break, entities decoded, outer blanks trimmed.
129
- * Notes `W_STYLE_HTML_LABEL` at the site, since the markup is lost.
169
+ * A table's rows are lines and the cells of a row are parted by a space, as Graphviz lays them out; text in a table
170
+ * outside its cells is not drawn. Notes `W_STYLE_HTML_LABEL` at the site, since the markup is lost.
130
171
  * @param html - the label, with or without its outer `<` and `>`
131
172
  * @param site - where it was read
132
173
  * @returns the label's text
@@ -135,8 +176,33 @@ function entity(body: string): string | undefined {
135
176
  export function htmlLabelText(html: string, site: CanonSite): string {
136
177
  spendAt(site, html.length);
137
178
  noteAt(site, STYLE_ISSUE.HTML_LABEL, html);
179
+ return htmlLabelSpans(html)
180
+ .map((s) => s.text)
181
+ .join("")
182
+ .trim();
183
+ }
184
+
185
+ /** A piece of an HTML-like label's text with the font tags open around it, outermost first. */
186
+ export interface HtmlLabelSpan {
187
+ /** The text, entities decoded. */
188
+ readonly text: string;
189
+ /** The open font tags (`<B>`, `<FONT COLOR="red">`, ...) as written, outermost first. */
190
+ readonly tags: readonly string[];
191
+ }
192
+
193
+ /** The tags that change the font of the text inside them. */
194
+ const FONT_TAGS = /^<(\/?)(b|i|u|o|s|sub|sup|font)\b/i;
195
+
196
+ /**
197
+ * The pieces of text an HTML-like label shows, untrimmed, each with the font tags around it (the text
198
+ * {@link htmlLabelText} joins and trims).
199
+ * @param html - the label, with or without its outer `<` and `>`
200
+ * @returns the pieces in order
201
+ * @category Styles
202
+ */
203
+ export function htmlLabelSpans(html: string): HtmlLabelSpan[] {
138
204
  const body = html.startsWith("<") && html.endsWith(">") ? html.slice(1, -1) : html;
139
- let out = "";
205
+ const s: SpanState = { spans: [], tags: [], out: "", open: [] };
140
206
  let i = 0;
141
207
  while (i < body.length) {
142
208
  const c = body[i];
@@ -145,20 +211,125 @@ export function htmlLabelText(html: string, site: CanonSite): string {
145
211
  if (close < 0) {
146
212
  break;
147
213
  }
148
- if (/^<br\b/i.test(body.slice(i, i + 4))) {
149
- out += "\n";
150
- }
214
+ readTag(s, body, i, close);
151
215
  i = close + 1;
152
- } else if (c === "&") {
153
- const [text, next] = entityAt(body, i);
154
- out += text;
155
- i = next;
156
216
  } else {
157
- out += c;
158
- i++;
217
+ const [text, next]: [string, number] = c === "&" ? entityAt(body, i) : [c, i + 1];
218
+ emitSpan(s, s.open.at(-1) === "table" ? "" : text);
219
+ i = next;
159
220
  }
160
221
  }
161
- return out.trim();
222
+ return s.spans;
223
+ }
224
+
225
+ /** What {@link htmlLabelSpans} has read so far. */
226
+ interface SpanState {
227
+ /** the pieces so far */
228
+ spans: HtmlLabelSpan[];
229
+ /** the font tags open now; a new array whenever they change, so a piece's tags are compared by identity */
230
+ tags: string[];
231
+ /** the text so far */
232
+ out: string;
233
+ /** the open tables and cells, innermost last: text is drawn outside every table or inside a cell */
234
+ open: ("table" | "td")[];
235
+ }
236
+
237
+ /**
238
+ * Adds text to the last piece when its tags are the ones open, else as a new piece.
239
+ * @param s - the reading so far, changed in place
240
+ * @param text - the text
241
+ */
242
+ function emitSpan(s: SpanState, text: string): void {
243
+ s.out += text;
244
+ const last = s.spans.at(-1);
245
+ if (last?.tags === s.tags) {
246
+ s.spans[s.spans.length - 1] = { text: last.text + text, tags: s.tags };
247
+ } else if (text !== "") {
248
+ s.spans.push({ text, tags: s.tags });
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Whether the line being read has text on it.
254
+ * @param s - the reading so far
255
+ * @returns whether it has
256
+ */
257
+ function lineHasText(s: SpanState): boolean {
258
+ return s.out.slice(s.out.lastIndexOf("\n") + 1).trim() !== "";
259
+ }
260
+
261
+ /**
262
+ * One tag of an HTML-like label: a line break, a table, row or cell, or a font tag.
263
+ * @param s - the reading so far, changed in place
264
+ * @param body - the label
265
+ * @param i - the offset of the tag's `<`
266
+ * @param close - the offset of its `>`
267
+ */
268
+ function readTag(s: SpanState, body: string, i: number, close: number): void {
269
+ const tag = /^<(\/?)(br|table|tr|td)\b/i.exec(body.slice(i, i + 7));
270
+ if (tag !== null) {
271
+ layoutTag(s, tag[2].toLowerCase(), tag[1] === "/");
272
+ return;
273
+ }
274
+ const font = FONT_TAGS.exec(body.slice(i, i + 6));
275
+ if (font !== null && font[1] === "/") {
276
+ s.tags = withoutLastTag(s.tags, font[2]);
277
+ } else if (font !== null && body[close - 1] !== "/") {
278
+ s.tags = [...s.tags, body.slice(i, close + 1)];
279
+ }
280
+ }
281
+
282
+ /**
283
+ * A line break, table, row or cell tag: a break and a row with text before it start a line, a cell with text before
284
+ * it on its line a space.
285
+ * @param s - the reading so far, changed in place
286
+ * @param name - `br`, `table`, `tr` or `td`, in lower case
287
+ * @param closing - whether it is a closing tag
288
+ */
289
+ function layoutTag(s: SpanState, name: string, closing: boolean): void {
290
+ if (name === "br" || name === "tr") {
291
+ if (name === "br" || (!closing && lineHasText(s))) {
292
+ emitSpan(s, "\n");
293
+ }
294
+ } else if (closing) {
295
+ s.open.pop();
296
+ } else {
297
+ if (name === "td" && lineHasText(s)) {
298
+ emitSpan(s, " ");
299
+ }
300
+ s.open.push(name === "td" ? "td" : "table");
301
+ }
302
+ }
303
+
304
+ /**
305
+ * The open font tags without the innermost one a closing tag closes.
306
+ * @param tags - the open tags
307
+ * @param name - the closing tag's name
308
+ * @returns the tags left open (the same array when none matched)
309
+ */
310
+ function withoutLastTag(tags: string[], name: string): string[] {
311
+ const lower = name.toLowerCase();
312
+ let at = tags.length - 1;
313
+ while (at >= 0 && /^<(\w+)/.exec(tags[at])?.[1].toLowerCase() !== lower) {
314
+ at--;
315
+ }
316
+ return at < 0 ? tags : [...tags.slice(0, at), ...tags.slice(at + 1)];
317
+ }
318
+
319
+ /**
320
+ * Every entity of a text decoded; an `&` that starts none is itself.
321
+ * @param text - the text
322
+ * @returns the decoded text
323
+ */
324
+ function decodeEntities(text: string): string {
325
+ let out = "";
326
+ let i = 0;
327
+ for (let amp = text.indexOf("&"); amp >= 0; amp = text.indexOf("&", i)) {
328
+ const [decoded, next] = entityAt(text, amp);
329
+ out += text.slice(i, amp) + decoded;
330
+ i = next;
331
+ }
332
+ return out + text.slice(i);
162
333
  }
163
334
 
164
335
  /**
@@ -42,6 +42,8 @@ export const STYLE_ISSUE = Object.freeze({
42
42
  INHERIT_COLOR: "W_STYLE_INHERIT_COLOR",
43
43
  /** A style property the vocabulary has no counterpart for was not carried. */
44
44
  NOT_CARRIED: "W_STYLE_NOT_CARRIED",
45
+ /** An annotation of a kind graph-io does not read (a group of annotations); its kinds are the samples. */
46
+ ANNOTATION_SKIPPED: "W_STYLE_ANNOTATION_SKIPPED",
45
47
  // ------------------------------------------------ reading declared styles
46
48
  /** A declared mapping that cannot be read. */
47
49
  BAD_MAPPING: "W_STYLE_BAD_MAPPING",