@graphty/graph-io 0.3.43 → 0.3.45

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 (674) hide show
  1. package/dist/chunks/approximations-DJMHdDvv.js +40 -0
  2. package/dist/chunks/approximations-DJMHdDvv.js.map +1 -0
  3. package/dist/chunks/block-CPCHkX42.js +2777 -0
  4. package/dist/chunks/block-CPCHkX42.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose--jM0yYCo.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose--jM0yYCo.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BKwqelYD.js} +6 -2
  8. package/dist/chunks/constants-BKwqelYD.js.map +1 -0
  9. package/dist/chunks/convert-BcQ8_jMo.js +59 -0
  10. package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
  11. package/dist/chunks/emit-DZy6JgdA.js +3456 -0
  12. package/dist/chunks/emit-DZy6JgdA.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-CgzxiYPg.js} +44 -21
  14. package/dist/chunks/escape-CgzxiYPg.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-BvqAXCKh.js} +196 -792
  16. package/dist/chunks/export-BvqAXCKh.js.map +1 -0
  17. package/dist/chunks/{exporter-yLxKBvLE.js → exporter--Mk9gXCJ.js} +4 -3
  18. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter--Mk9gXCJ.js.map} +1 -1
  19. package/dist/chunks/{exporter-RVtXVetw.js → exporter-C-9cgZKa.js} +1805 -287
  20. package/dist/chunks/exporter-C-9cgZKa.js.map +1 -0
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-DFqJhBnj.js} +133 -74
  22. package/dist/chunks/exporter-DFqJhBnj.js.map +1 -0
  23. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-DteVeJki.js} +22 -12
  24. package/dist/chunks/exporter-DteVeJki.js.map +1 -0
  25. package/dist/chunks/format-BpQBx8MZ.js +676 -0
  26. package/dist/chunks/format-BpQBx8MZ.js.map +1 -0
  27. package/dist/chunks/generic-BGO71QBv.js +1347 -0
  28. package/dist/chunks/generic-BGO71QBv.js.map +1 -0
  29. package/dist/chunks/{importer-C98dpSH4.js → importer-B-9Rc1zO.js} +141 -82
  30. package/dist/chunks/importer-B-9Rc1zO.js.map +1 -0
  31. package/dist/chunks/{importer-D794XUTe.js → importer-BVVR740x.js} +31 -8
  32. package/dist/chunks/importer-BVVR740x.js.map +1 -0
  33. package/dist/chunks/{importer-WrGRZb0N.js → importer-C0AjA3Ax.js} +449 -102
  34. package/dist/chunks/importer-C0AjA3Ax.js.map +1 -0
  35. package/dist/chunks/{importer-BbNb7eNg.js → importer-C7pvJe1L.js} +1398 -129
  36. package/dist/chunks/importer-C7pvJe1L.js.map +1 -0
  37. package/dist/chunks/{importer-xZ-3suY1.js → importer-ClwoVx3O.js} +791 -135
  38. package/dist/chunks/importer-ClwoVx3O.js.map +1 -0
  39. package/dist/chunks/{importer-Ht7LNg8L.js → importer-D0sC_6bO.js} +116 -296
  40. package/dist/chunks/importer-D0sC_6bO.js.map +1 -0
  41. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-EHQk1jbM.js} +617 -115
  42. package/dist/chunks/importer-EHQk1jbM.js.map +1 -0
  43. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-DJZRZ6jd.js} +123 -32
  44. package/dist/chunks/json-elements-DJZRZ6jd.js.map +1 -0
  45. package/dist/chunks/lexicon-WMsNddyU.js +509 -0
  46. package/dist/chunks/lexicon-WMsNddyU.js.map +1 -0
  47. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-G4MqRdux.js} +3 -2
  48. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-G4MqRdux.js.map} +1 -1
  49. package/dist/chunks/{records-Cu4bxYOm.js → records-CiaWZrFH.js} +2 -2
  50. package/dist/chunks/{records-Cu4bxYOm.js.map → records-CiaWZrFH.js.map} +1 -1
  51. package/dist/chunks/styles-DvoFBKCK.js +690 -0
  52. package/dist/chunks/styles-DvoFBKCK.js.map +1 -0
  53. package/dist/chunks/styles-yed-Cz9rLBCP.js +842 -0
  54. package/dist/chunks/styles-yed-Cz9rLBCP.js.map +1 -0
  55. package/dist/chunks/styles-zNTmz5R7.js +2102 -0
  56. package/dist/chunks/styles-zNTmz5R7.js.map +1 -0
  57. package/dist/chunks/{text-DHOJXnED.js → text-CzJNFOS9.js} +2 -2
  58. package/dist/chunks/{text-DHOJXnED.js.map → text-CzJNFOS9.js.map} +1 -1
  59. package/dist/chunks/units-XMZFIFe1.js +19 -0
  60. package/dist/chunks/units-XMZFIFe1.js.map +1 -0
  61. package/dist/chunks/writer-gQ8kx99H.js +448 -0
  62. package/dist/chunks/writer-gQ8kx99H.js.map +1 -0
  63. package/dist/csv.js +5 -4
  64. package/dist/csv.js.map +1 -1
  65. package/dist/cx.js +1 -1
  66. package/dist/cx2.js +2 -2
  67. package/dist/cys.js +1 -1
  68. package/dist/dot.js +5 -2
  69. package/dist/dot.js.map +1 -1
  70. package/dist/gexf.js +292 -412
  71. package/dist/gexf.js.map +1 -1
  72. package/dist/gml.js +927 -74
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +351 -236
  75. package/dist/graph-io.js.map +1 -1
  76. package/dist/graphml.js +4 -2
  77. package/dist/graphml.js.map +1 -1
  78. package/dist/json.js +1 -1
  79. package/dist/neo4j.js +4 -3
  80. package/dist/neo4j.js.map +1 -1
  81. package/dist/obo.js +1 -1
  82. package/dist/pajek.js +4 -2
  83. package/dist/positions.d.ts +1 -0
  84. package/dist/positions.js +427 -0
  85. package/dist/positions.js.map +1 -0
  86. package/dist/src/common/codes.d.ts +6 -0
  87. package/dist/src/common/codes.d.ts.map +1 -1
  88. package/dist/src/common/codes.js +6 -0
  89. package/dist/src/common/codes.js.map +1 -1
  90. package/dist/src/common/escape.d.ts.map +1 -1
  91. package/dist/src/common/escape.js +4 -2
  92. package/dist/src/common/escape.js.map +1 -1
  93. package/dist/src/common/export.d.ts +10 -0
  94. package/dist/src/common/export.d.ts.map +1 -1
  95. package/dist/src/common/export.js +123 -100
  96. package/dist/src/common/export.js.map +1 -1
  97. package/dist/src/common/input.d.ts.map +1 -1
  98. package/dist/src/common/input.js +8 -1
  99. package/dist/src/common/input.js.map +1 -1
  100. package/dist/src/common/json-elements.d.ts +12 -9
  101. package/dist/src/common/json-elements.d.ts.map +1 -1
  102. package/dist/src/common/json-elements.js +160 -37
  103. package/dist/src/common/json-elements.js.map +1 -1
  104. package/dist/src/common/notes.d.ts +42 -0
  105. package/dist/src/common/notes.d.ts.map +1 -0
  106. package/dist/src/common/notes.js +72 -0
  107. package/dist/src/common/notes.js.map +1 -0
  108. package/dist/src/common/report.d.ts +18 -0
  109. package/dist/src/common/report.d.ts.map +1 -1
  110. package/dist/src/common/report.js +36 -1
  111. package/dist/src/common/report.js.map +1 -1
  112. package/dist/src/common/units.d.ts +24 -0
  113. package/dist/src/common/units.d.ts.map +1 -0
  114. package/dist/src/common/units.js +26 -0
  115. package/dist/src/common/units.js.map +1 -0
  116. package/dist/src/common/xml.d.ts +18 -0
  117. package/dist/src/common/xml.d.ts.map +1 -1
  118. package/dist/src/common/xml.js +42 -5
  119. package/dist/src/common/xml.js.map +1 -1
  120. package/dist/src/formats/cx/exporter.d.ts +6 -0
  121. package/dist/src/formats/cx/exporter.d.ts.map +1 -1
  122. package/dist/src/formats/cx/exporter.js +71 -8
  123. package/dist/src/formats/cx/exporter.js.map +1 -1
  124. package/dist/src/formats/cx/importer.d.ts +5 -2
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +102 -72
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +102 -0
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -0
  130. package/dist/src/formats/cx/styles.js +225 -0
  131. package/dist/src/formats/cx/styles.js.map +1 -0
  132. package/dist/src/formats/cx2/exporter.d.ts +5 -0
  133. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  134. package/dist/src/formats/cx2/exporter.js +181 -71
  135. package/dist/src/formats/cx2/exporter.js.map +1 -1
  136. package/dist/src/formats/cx2/importer.d.ts +4 -1
  137. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  138. package/dist/src/formats/cx2/importer.js +19 -1
  139. package/dist/src/formats/cx2/importer.js.map +1 -1
  140. package/dist/src/formats/cx2/styles.d.ts +18 -0
  141. package/dist/src/formats/cx2/styles.d.ts.map +1 -0
  142. package/dist/src/formats/cx2/styles.js +24 -0
  143. package/dist/src/formats/cx2/styles.js.map +1 -0
  144. package/dist/src/formats/cys/constants.d.ts +2 -0
  145. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  146. package/dist/src/formats/cys/constants.js +2 -0
  147. package/dist/src/formats/cys/constants.js.map +1 -1
  148. package/dist/src/formats/cys/exporter.d.ts +6 -2
  149. package/dist/src/formats/cys/exporter.d.ts.map +1 -1
  150. package/dist/src/formats/cys/exporter.js +215 -53
  151. package/dist/src/formats/cys/exporter.js.map +1 -1
  152. package/dist/src/formats/cys/importer.d.ts +2 -1
  153. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  154. package/dist/src/formats/cys/importer.js +119 -6
  155. package/dist/src/formats/cys/importer.js.map +1 -1
  156. package/dist/src/formats/cys/session.d.ts +2 -0
  157. package/dist/src/formats/cys/session.d.ts.map +1 -1
  158. package/dist/src/formats/cys/session.js +5 -0
  159. package/dist/src/formats/cys/session.js.map +1 -1
  160. package/dist/src/formats/cys/styles.d.ts +38 -0
  161. package/dist/src/formats/cys/styles.d.ts.map +1 -0
  162. package/dist/src/formats/cys/styles.js +213 -0
  163. package/dist/src/formats/cys/styles.js.map +1 -0
  164. package/dist/src/formats/cys/tables.d.ts +8 -3
  165. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  166. package/dist/src/formats/cys/tables.js +88 -34
  167. package/dist/src/formats/cys/tables.js.map +1 -1
  168. package/dist/src/formats/dot/exporter.d.ts +2 -0
  169. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  170. package/dist/src/formats/dot/exporter.js +195 -81
  171. package/dist/src/formats/dot/exporter.js.map +1 -1
  172. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  173. package/dist/src/formats/dot/importer.js +100 -20
  174. package/dist/src/formats/dot/importer.js.map +1 -1
  175. package/dist/src/formats/dot/index.d.ts +1 -0
  176. package/dist/src/formats/dot/index.d.ts.map +1 -1
  177. package/dist/src/formats/dot/index.js +1 -0
  178. package/dist/src/formats/dot/index.js.map +1 -1
  179. package/dist/src/formats/dot/positions.d.ts +14 -0
  180. package/dist/src/formats/dot/positions.d.ts.map +1 -0
  181. package/dist/src/formats/dot/positions.js +70 -0
  182. package/dist/src/formats/dot/positions.js.map +1 -0
  183. package/dist/src/formats/dot/styles.d.ts +82 -0
  184. package/dist/src/formats/dot/styles.d.ts.map +1 -0
  185. package/dist/src/formats/dot/styles.js +1496 -0
  186. package/dist/src/formats/dot/styles.js.map +1 -0
  187. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  188. package/dist/src/formats/gexf/exporter.js +20 -5
  189. package/dist/src/formats/gexf/exporter.js.map +1 -1
  190. package/dist/src/formats/gexf/importer.d.ts +8 -1
  191. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  192. package/dist/src/formats/gexf/importer.js +251 -131
  193. package/dist/src/formats/gexf/importer.js.map +1 -1
  194. package/dist/src/formats/gexf/index.d.ts +8 -0
  195. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  196. package/dist/src/formats/gexf/index.js +10 -2
  197. package/dist/src/formats/gexf/index.js.map +1 -1
  198. package/dist/src/formats/gexf/schema.d.ts +5 -0
  199. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  200. package/dist/src/formats/gexf/schema.js +5 -0
  201. package/dist/src/formats/gexf/schema.js.map +1 -1
  202. package/dist/src/formats/gexf/styles.d.ts +74 -0
  203. package/dist/src/formats/gexf/styles.d.ts.map +1 -0
  204. package/dist/src/formats/gexf/styles.js +604 -0
  205. package/dist/src/formats/gexf/styles.js.map +1 -0
  206. package/dist/src/formats/gml/exporter.d.ts +1 -5
  207. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  208. package/dist/src/formats/gml/exporter.js +19 -8
  209. package/dist/src/formats/gml/exporter.js.map +1 -1
  210. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  211. package/dist/src/formats/gml/importer.js +4 -0
  212. package/dist/src/formats/gml/importer.js.map +1 -1
  213. package/dist/src/formats/gml/index.d.ts +2 -1
  214. package/dist/src/formats/gml/index.d.ts.map +1 -1
  215. package/dist/src/formats/gml/index.js +2 -1
  216. package/dist/src/formats/gml/index.js.map +1 -1
  217. package/dist/src/formats/gml/positions.d.ts +14 -0
  218. package/dist/src/formats/gml/positions.d.ts.map +1 -0
  219. package/dist/src/formats/gml/positions.js +46 -0
  220. package/dist/src/formats/gml/positions.js.map +1 -0
  221. package/dist/src/formats/gml/styles.d.ts +59 -0
  222. package/dist/src/formats/gml/styles.d.ts.map +1 -0
  223. package/dist/src/formats/gml/styles.js +1056 -0
  224. package/dist/src/formats/gml/styles.js.map +1 -0
  225. package/dist/src/formats/gml/syntax.d.ts +11 -0
  226. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  227. package/dist/src/formats/gml/syntax.js +151 -62
  228. package/dist/src/formats/gml/syntax.js.map +1 -1
  229. package/dist/src/formats/graphml/constants.d.ts +4 -0
  230. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  231. package/dist/src/formats/graphml/constants.js +5 -1
  232. package/dist/src/formats/graphml/constants.js.map +1 -1
  233. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  234. package/dist/src/formats/graphml/exporter.js +133 -65
  235. package/dist/src/formats/graphml/exporter.js.map +1 -1
  236. package/dist/src/formats/graphml/importer.d.ts +4 -1
  237. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  238. package/dist/src/formats/graphml/importer.js +100 -44
  239. package/dist/src/formats/graphml/importer.js.map +1 -1
  240. package/dist/src/formats/graphml/index.d.ts +1 -0
  241. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  242. package/dist/src/formats/graphml/index.js +1 -0
  243. package/dist/src/formats/graphml/index.js.map +1 -1
  244. package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
  245. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
  246. package/dist/src/formats/graphml/styles-plain.js +187 -0
  247. package/dist/src/formats/graphml/styles-plain.js.map +1 -0
  248. package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
  249. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
  250. package/dist/src/formats/graphml/styles-yed.js +1086 -0
  251. package/dist/src/formats/graphml/styles-yed.js.map +1 -0
  252. package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
  253. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
  254. package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
  255. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
  256. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  257. package/dist/src/formats/graphml/tree.js +34 -19
  258. package/dist/src/formats/graphml/tree.js.map +1 -1
  259. package/dist/src/formats/graphml/yfiles.d.ts +16 -2
  260. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  261. package/dist/src/formats/graphml/yfiles.js +83 -12
  262. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  263. package/dist/src/formats/json/exporter.d.ts +5 -0
  264. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  265. package/dist/src/formats/json/exporter.js +68 -25
  266. package/dist/src/formats/json/exporter.js.map +1 -1
  267. package/dist/src/formats/json/importer.d.ts +22 -3
  268. package/dist/src/formats/json/importer.d.ts.map +1 -1
  269. package/dist/src/formats/json/importer.js +439 -264
  270. package/dist/src/formats/json/importer.js.map +1 -1
  271. package/dist/src/formats/json/positions.d.ts +16 -0
  272. package/dist/src/formats/json/positions.d.ts.map +1 -0
  273. package/dist/src/formats/json/positions.js +44 -0
  274. package/dist/src/formats/json/positions.js.map +1 -0
  275. package/dist/src/formats/json/styles.d.ts +102 -0
  276. package/dist/src/formats/json/styles.d.ts.map +1 -0
  277. package/dist/src/formats/json/styles.js +1753 -0
  278. package/dist/src/formats/json/styles.js.map +1 -0
  279. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  280. package/dist/src/formats/neo4j/exporter.js +2 -1
  281. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  282. package/dist/src/formats/pajek/exporter.d.ts +2 -0
  283. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/pajek/exporter.js +142 -76
  285. package/dist/src/formats/pajek/exporter.js.map +1 -1
  286. package/dist/src/formats/pajek/importer.d.ts +4 -0
  287. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  288. package/dist/src/formats/pajek/importer.js +60 -6
  289. package/dist/src/formats/pajek/importer.js.map +1 -1
  290. package/dist/src/formats/pajek/index.d.ts +2 -0
  291. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  292. package/dist/src/formats/pajek/index.js +2 -0
  293. package/dist/src/formats/pajek/index.js.map +1 -1
  294. package/dist/src/formats/pajek/styles.d.ts +50 -0
  295. package/dist/src/formats/pajek/styles.d.ts.map +1 -0
  296. package/dist/src/formats/pajek/styles.js +569 -0
  297. package/dist/src/formats/pajek/styles.js.map +1 -0
  298. package/dist/src/formats/pajek/syntax.d.ts +6 -0
  299. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  300. package/dist/src/formats/pajek/syntax.js +6 -0
  301. package/dist/src/formats/pajek/syntax.js.map +1 -1
  302. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  303. package/dist/src/formats/xgmml/columns.js +34 -9
  304. package/dist/src/formats/xgmml/columns.js.map +1 -1
  305. package/dist/src/formats/xgmml/constants.d.ts +2 -0
  306. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  307. package/dist/src/formats/xgmml/constants.js +3 -1
  308. package/dist/src/formats/xgmml/constants.js.map +1 -1
  309. package/dist/src/formats/xgmml/document.d.ts +12 -8
  310. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  311. package/dist/src/formats/xgmml/document.js +56 -13
  312. package/dist/src/formats/xgmml/document.js.map +1 -1
  313. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  314. package/dist/src/formats/xgmml/emit.js +12 -6
  315. package/dist/src/formats/xgmml/emit.js.map +1 -1
  316. package/dist/src/formats/xgmml/exporter.d.ts +3 -1
  317. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  318. package/dist/src/formats/xgmml/exporter.js +22 -9
  319. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  320. package/dist/src/formats/xgmml/importer.d.ts +2 -1
  321. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  322. package/dist/src/formats/xgmml/importer.js +31 -24
  323. package/dist/src/formats/xgmml/importer.js.map +1 -1
  324. package/dist/src/formats/xgmml/styles.d.ts +104 -0
  325. package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
  326. package/dist/src/formats/xgmml/styles.js +310 -0
  327. package/dist/src/formats/xgmml/styles.js.map +1 -0
  328. package/dist/src/index.d.ts +9 -7
  329. package/dist/src/index.d.ts.map +1 -1
  330. package/dist/src/index.js +7 -7
  331. package/dist/src/index.js.map +1 -1
  332. package/dist/src/positions/codes.d.ts +31 -0
  333. package/dist/src/positions/codes.d.ts.map +1 -0
  334. package/dist/src/positions/codes.js +26 -0
  335. package/dist/src/positions/codes.js.map +1 -0
  336. package/dist/src/positions/convert.d.ts +58 -0
  337. package/dist/src/positions/convert.d.ts.map +1 -0
  338. package/dist/src/positions/convert.js +107 -0
  339. package/dist/src/positions/convert.js.map +1 -0
  340. package/dist/src/positions/extract.d.ts +27 -0
  341. package/dist/src/positions/extract.d.ts.map +1 -0
  342. package/dist/src/positions/extract.js +526 -0
  343. package/dist/src/positions/extract.js.map +1 -0
  344. package/dist/src/positions/index.d.ts +10 -0
  345. package/dist/src/positions/index.d.ts.map +1 -0
  346. package/dist/src/positions/index.js +9 -0
  347. package/dist/src/positions/index.js.map +1 -0
  348. package/dist/src/positions/types.d.ts +208 -0
  349. package/dist/src/positions/types.d.ts.map +1 -0
  350. package/dist/src/positions/types.js +10 -0
  351. package/dist/src/positions/types.js.map +1 -0
  352. package/dist/src/registry.d.ts +30 -0
  353. package/dist/src/registry.d.ts.map +1 -1
  354. package/dist/src/registry.js +130 -9
  355. package/dist/src/registry.js.map +1 -1
  356. package/dist/src/styles/annotations.d.ts +132 -0
  357. package/dist/src/styles/annotations.d.ts.map +1 -0
  358. package/dist/src/styles/annotations.js +320 -0
  359. package/dist/src/styles/annotations.js.map +1 -0
  360. package/dist/src/styles/budget.d.ts +45 -0
  361. package/dist/src/styles/budget.d.ts.map +1 -0
  362. package/dist/src/styles/budget.js +58 -0
  363. package/dist/src/styles/budget.js.map +1 -0
  364. package/dist/src/styles/canon/bends.d.ts +32 -0
  365. package/dist/src/styles/canon/bends.d.ts.map +1 -0
  366. package/dist/src/styles/canon/bends.js +74 -0
  367. package/dist/src/styles/canon/bends.js.map +1 -0
  368. package/dist/src/styles/canon/color-tables.d.ts +22 -0
  369. package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
  370. package/dist/src/styles/canon/color-tables.js +369 -0
  371. package/dist/src/styles/canon/color-tables.js.map +1 -0
  372. package/dist/src/styles/canon/color.d.ts +66 -0
  373. package/dist/src/styles/canon/color.d.ts.map +1 -0
  374. package/dist/src/styles/canon/color.js +548 -0
  375. package/dist/src/styles/canon/color.js.map +1 -0
  376. package/dist/src/styles/canon/enums.d.ts +25 -0
  377. package/dist/src/styles/canon/enums.d.ts.map +1 -0
  378. package/dist/src/styles/canon/enums.js +187 -0
  379. package/dist/src/styles/canon/enums.js.map +1 -0
  380. package/dist/src/styles/canon/graphviz.d.ts +48 -0
  381. package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
  382. package/dist/src/styles/canon/graphviz.js +160 -0
  383. package/dist/src/styles/canon/graphviz.js.map +1 -0
  384. package/dist/src/styles/canon/index.d.ts +13 -0
  385. package/dist/src/styles/canon/index.d.ts.map +1 -0
  386. package/dist/src/styles/canon/index.js +13 -0
  387. package/dist/src/styles/canon/index.js.map +1 -0
  388. package/dist/src/styles/canon/number.d.ts +59 -0
  389. package/dist/src/styles/canon/number.d.ts.map +1 -0
  390. package/dist/src/styles/canon/number.js +142 -0
  391. package/dist/src/styles/canon/number.js.map +1 -0
  392. package/dist/src/styles/canon/site.d.ts +51 -0
  393. package/dist/src/styles/canon/site.d.ts.map +1 -0
  394. package/dist/src/styles/canon/site.js +63 -0
  395. package/dist/src/styles/canon/site.js.map +1 -0
  396. package/dist/src/styles/canon/text.d.ts +61 -0
  397. package/dist/src/styles/canon/text.d.ts.map +1 -0
  398. package/dist/src/styles/canon/text.js +199 -0
  399. package/dist/src/styles/canon/text.js.map +1 -0
  400. package/dist/src/styles/codes.d.ts +95 -0
  401. package/dist/src/styles/codes.d.ts.map +1 -0
  402. package/dist/src/styles/codes.js +97 -0
  403. package/dist/src/styles/codes.js.map +1 -0
  404. package/dist/src/styles/cyjs/cascade.d.ts +134 -0
  405. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
  406. package/dist/src/styles/cyjs/cascade.js +2252 -0
  407. package/dist/src/styles/cyjs/cascade.js.map +1 -0
  408. package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
  409. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
  410. package/dist/src/styles/cyjs/defaults-table.js +76 -0
  411. package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
  412. package/dist/src/styles/cyjs/emit.d.ts +82 -0
  413. package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
  414. package/dist/src/styles/cyjs/emit.js +791 -0
  415. package/dist/src/styles/cyjs/emit.js.map +1 -0
  416. package/dist/src/styles/cyjs/index.d.ts +13 -0
  417. package/dist/src/styles/cyjs/index.d.ts.map +1 -0
  418. package/dist/src/styles/cyjs/index.js +13 -0
  419. package/dist/src/styles/cyjs/index.js.map +1 -0
  420. package/dist/src/styles/cyjs/live.d.ts +46 -0
  421. package/dist/src/styles/cyjs/live.d.ts.map +1 -0
  422. package/dist/src/styles/cyjs/live.js +108 -0
  423. package/dist/src/styles/cyjs/live.js.map +1 -0
  424. package/dist/src/styles/cyjs/mappers.d.ts +147 -0
  425. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
  426. package/dist/src/styles/cyjs/mappers.js +744 -0
  427. package/dist/src/styles/cyjs/mappers.js.map +1 -0
  428. package/dist/src/styles/cyjs/selector.d.ts +113 -0
  429. package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
  430. package/dist/src/styles/cyjs/selector.js +611 -0
  431. package/dist/src/styles/cyjs/selector.js.map +1 -0
  432. package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
  433. package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
  434. package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
  435. package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
  436. package/dist/src/styles/cytoscape/emit.d.ts +125 -0
  437. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
  438. package/dist/src/styles/cytoscape/emit.js +1025 -0
  439. package/dist/src/styles/cytoscape/emit.js.map +1 -0
  440. package/dist/src/styles/cytoscape/index.d.ts +10 -0
  441. package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
  442. package/dist/src/styles/cytoscape/index.js +10 -0
  443. package/dist/src/styles/cytoscape/index.js.map +1 -0
  444. package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
  445. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
  446. package/dist/src/styles/cytoscape/lexicon.js +605 -0
  447. package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
  448. package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
  449. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
  450. package/dist/src/styles/cytoscape/mappings.js +460 -0
  451. package/dist/src/styles/cytoscape/mappings.js.map +1 -0
  452. package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
  453. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
  454. package/dist/src/styles/cytoscape/resolve.js +381 -0
  455. package/dist/src/styles/cytoscape/resolve.js.map +1 -0
  456. package/dist/src/styles/cytoscape/translate.d.ts +50 -0
  457. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
  458. package/dist/src/styles/cytoscape/translate.js +156 -0
  459. package/dist/src/styles/cytoscape/translate.js.map +1 -0
  460. package/dist/src/styles/defaults.d.ts +90 -0
  461. package/dist/src/styles/defaults.d.ts.map +1 -0
  462. package/dist/src/styles/defaults.js +414 -0
  463. package/dist/src/styles/defaults.js.map +1 -0
  464. package/dist/src/styles/index.d.ts +15 -0
  465. package/dist/src/styles/index.d.ts.map +1 -0
  466. package/dist/src/styles/index.js +14 -0
  467. package/dist/src/styles/index.js.map +1 -0
  468. package/dist/src/styles/internal.d.ts +17 -0
  469. package/dist/src/styles/internal.d.ts.map +1 -0
  470. package/dist/src/styles/internal.js +16 -0
  471. package/dist/src/styles/internal.js.map +1 -0
  472. package/dist/src/styles/io/approximations.d.ts +24 -0
  473. package/dist/src/styles/io/approximations.d.ts.map +1 -0
  474. package/dist/src/styles/io/approximations.js +51 -0
  475. package/dist/src/styles/io/approximations.js.map +1 -0
  476. package/dist/src/styles/io/block.d.ts +166 -0
  477. package/dist/src/styles/io/block.d.ts.map +1 -0
  478. package/dist/src/styles/io/block.js +930 -0
  479. package/dist/src/styles/io/block.js.map +1 -0
  480. package/dist/src/styles/io/generic.d.ts +88 -0
  481. package/dist/src/styles/io/generic.d.ts.map +1 -0
  482. package/dist/src/styles/io/generic.js +516 -0
  483. package/dist/src/styles/io/generic.js.map +1 -0
  484. package/dist/src/styles/io/index.d.ts +8 -0
  485. package/dist/src/styles/io/index.d.ts.map +1 -0
  486. package/dist/src/styles/io/index.js +7 -0
  487. package/dist/src/styles/io/index.js.map +1 -0
  488. package/dist/src/styles/io/writer.d.ts +89 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +626 -0
  491. package/dist/src/styles/io/writer.js.map +1 -0
  492. package/dist/src/styles/notes.d.ts +47 -0
  493. package/dist/src/styles/notes.d.ts.map +1 -0
  494. package/dist/src/styles/notes.js +140 -0
  495. package/dist/src/styles/notes.js.map +1 -0
  496. package/dist/src/styles/plan/classes.d.ts +31 -0
  497. package/dist/src/styles/plan/classes.d.ts.map +1 -0
  498. package/dist/src/styles/plan/classes.js +139 -0
  499. package/dist/src/styles/plan/classes.js.map +1 -0
  500. package/dist/src/styles/plan/continuous.d.ts +32 -0
  501. package/dist/src/styles/plan/continuous.d.ts.map +1 -0
  502. package/dist/src/styles/plan/continuous.js +165 -0
  503. package/dist/src/styles/plan/continuous.js.map +1 -0
  504. package/dist/src/styles/plan/discrete.d.ts +39 -0
  505. package/dist/src/styles/plan/discrete.d.ts.map +1 -0
  506. package/dist/src/styles/plan/discrete.js +127 -0
  507. package/dist/src/styles/plan/discrete.js.map +1 -0
  508. package/dist/src/styles/plan/families.d.ts +31 -0
  509. package/dist/src/styles/plan/families.d.ts.map +1 -0
  510. package/dist/src/styles/plan/families.js +95 -0
  511. package/dist/src/styles/plan/families.js.map +1 -0
  512. package/dist/src/styles/plan/features.d.ts +58 -0
  513. package/dist/src/styles/plan/features.d.ts.map +1 -0
  514. package/dist/src/styles/plan/features.js +185 -0
  515. package/dist/src/styles/plan/features.js.map +1 -0
  516. package/dist/src/styles/plan/index.d.ts +7 -0
  517. package/dist/src/styles/plan/index.d.ts.map +1 -0
  518. package/dist/src/styles/plan/index.js +7 -0
  519. package/dist/src/styles/plan/index.js.map +1 -0
  520. package/dist/src/styles/plan/plan.d.ts +71 -0
  521. package/dist/src/styles/plan/plan.d.ts.map +1 -0
  522. package/dist/src/styles/plan/plan.js +893 -0
  523. package/dist/src/styles/plan/plan.js.map +1 -0
  524. package/dist/src/styles/plan/resolve.d.ts +137 -0
  525. package/dist/src/styles/plan/resolve.d.ts.map +1 -0
  526. package/dist/src/styles/plan/resolve.js +587 -0
  527. package/dist/src/styles/plan/resolve.js.map +1 -0
  528. package/dist/src/styles/types.d.ts +702 -0
  529. package/dist/src/styles/types.d.ts.map +1 -0
  530. package/dist/src/styles/types.js +10 -0
  531. package/dist/src/styles/types.js.map +1 -0
  532. package/dist/src/styles/vocabulary.d.ts +41 -0
  533. package/dist/src/styles/vocabulary.d.ts.map +1 -0
  534. package/dist/src/styles/vocabulary.js +140 -0
  535. package/dist/src/styles/vocabulary.js.map +1 -0
  536. package/dist/src/types.d.ts +64 -1
  537. package/dist/src/types.d.ts.map +1 -1
  538. package/dist/src/types.js.map +1 -1
  539. package/dist/styles.d.ts +1 -0
  540. package/dist/styles.js +322 -0
  541. package/dist/styles.js.map +1 -0
  542. package/dist/xgmml.js +5 -4
  543. package/dist/xgmml.js.map +1 -1
  544. package/package.json +13 -2
  545. package/src/common/codes.ts +7 -0
  546. package/src/common/escape.ts +5 -2
  547. package/src/common/export.ts +179 -140
  548. package/src/common/input.ts +8 -4
  549. package/src/common/json-elements.ts +169 -38
  550. package/src/common/notes.ts +94 -0
  551. package/src/common/report.ts +41 -1
  552. package/src/common/units.ts +42 -0
  553. package/src/common/xml.ts +45 -5
  554. package/src/formats/cx/exporter.ts +95 -11
  555. package/src/formats/cx/importer.ts +126 -90
  556. package/src/formats/cx/styles.ts +304 -0
  557. package/src/formats/cx2/exporter.ts +234 -77
  558. package/src/formats/cx2/importer.ts +19 -1
  559. package/src/formats/cx2/styles.ts +29 -0
  560. package/src/formats/cys/constants.ts +3 -0
  561. package/src/formats/cys/exporter.ts +246 -60
  562. package/src/formats/cys/importer.ts +125 -9
  563. package/src/formats/cys/session.ts +6 -0
  564. package/src/formats/cys/styles.ts +254 -0
  565. package/src/formats/cys/tables.ts +117 -48
  566. package/src/formats/dot/exporter.ts +262 -126
  567. package/src/formats/dot/importer.ts +111 -20
  568. package/src/formats/dot/index.ts +1 -0
  569. package/src/formats/dot/positions.ts +77 -0
  570. package/src/formats/dot/styles.ts +1755 -0
  571. package/src/formats/gexf/exporter.ts +27 -11
  572. package/src/formats/gexf/importer.ts +308 -158
  573. package/src/formats/gexf/index.ts +10 -0
  574. package/src/formats/gexf/schema.ts +5 -0
  575. package/src/formats/gexf/styles.ts +719 -0
  576. package/src/formats/gml/exporter.ts +33 -14
  577. package/src/formats/gml/importer.ts +4 -0
  578. package/src/formats/gml/index.ts +2 -1
  579. package/src/formats/gml/positions.ts +52 -0
  580. package/src/formats/gml/styles.ts +1248 -0
  581. package/src/formats/gml/syntax.ts +173 -62
  582. package/src/formats/graphml/constants.ts +5 -0
  583. package/src/formats/graphml/exporter.ts +163 -71
  584. package/src/formats/graphml/importer.ts +119 -45
  585. package/src/formats/graphml/index.ts +1 -0
  586. package/src/formats/graphml/styles-plain.ts +236 -0
  587. package/src/formats/graphml/styles-yed.ts +1221 -0
  588. package/src/formats/graphml/styles-yfiles3.ts +573 -0
  589. package/src/formats/graphml/tree.ts +36 -20
  590. package/src/formats/graphml/yfiles.ts +89 -13
  591. package/src/formats/json/exporter.ts +76 -26
  592. package/src/formats/json/importer.ts +541 -322
  593. package/src/formats/json/positions.ts +50 -0
  594. package/src/formats/json/styles.ts +2082 -0
  595. package/src/formats/neo4j/exporter.ts +2 -1
  596. package/src/formats/pajek/exporter.ts +195 -106
  597. package/src/formats/pajek/importer.ts +78 -9
  598. package/src/formats/pajek/index.ts +2 -0
  599. package/src/formats/pajek/styles.ts +685 -0
  600. package/src/formats/pajek/syntax.ts +7 -0
  601. package/src/formats/xgmml/columns.ts +39 -9
  602. package/src/formats/xgmml/constants.ts +3 -0
  603. package/src/formats/xgmml/document.ts +54 -12
  604. package/src/formats/xgmml/emit.ts +11 -6
  605. package/src/formats/xgmml/exporter.ts +32 -13
  606. package/src/formats/xgmml/importer.ts +43 -29
  607. package/src/formats/xgmml/styles.ts +400 -0
  608. package/src/index.ts +16 -0
  609. package/src/positions/codes.ts +32 -0
  610. package/src/positions/convert.ts +123 -0
  611. package/src/positions/extract.ts +619 -0
  612. package/src/positions/index.ts +23 -0
  613. package/src/positions/types.ts +221 -0
  614. package/src/registry.ts +179 -8
  615. package/src/styles/annotations.ts +478 -0
  616. package/src/styles/budget.ts +60 -0
  617. package/src/styles/canon/bends.ts +84 -0
  618. package/src/styles/canon/color-tables.ts +386 -0
  619. package/src/styles/canon/color.ts +624 -0
  620. package/src/styles/canon/enums.ts +211 -0
  621. package/src/styles/canon/graphviz.ts +189 -0
  622. package/src/styles/canon/index.ts +13 -0
  623. package/src/styles/canon/number.ts +152 -0
  624. package/src/styles/canon/site.ts +87 -0
  625. package/src/styles/canon/text.ts +221 -0
  626. package/src/styles/codes.ts +104 -0
  627. package/src/styles/cyjs/cascade.ts +2670 -0
  628. package/src/styles/cyjs/defaults-table.ts +82 -0
  629. package/src/styles/cyjs/emit.ts +952 -0
  630. package/src/styles/cyjs/index.ts +37 -0
  631. package/src/styles/cyjs/live.ts +147 -0
  632. package/src/styles/cyjs/mappers.ts +879 -0
  633. package/src/styles/cyjs/selector.ts +778 -0
  634. package/src/styles/cyjs/stylesheet-text.ts +214 -0
  635. package/src/styles/cytoscape/emit.ts +1264 -0
  636. package/src/styles/cytoscape/index.ts +40 -0
  637. package/src/styles/cytoscape/lexicon.ts +658 -0
  638. package/src/styles/cytoscape/mappings.ts +603 -0
  639. package/src/styles/cytoscape/resolve.ts +521 -0
  640. package/src/styles/cytoscape/translate.ts +237 -0
  641. package/src/styles/defaults.ts +504 -0
  642. package/src/styles/index.ts +57 -0
  643. package/src/styles/internal.ts +17 -0
  644. package/src/styles/io/approximations.ts +47 -0
  645. package/src/styles/io/block.ts +1138 -0
  646. package/src/styles/io/generic.ts +687 -0
  647. package/src/styles/io/index.ts +18 -0
  648. package/src/styles/io/writer.ts +780 -0
  649. package/src/styles/notes.ts +165 -0
  650. package/src/styles/plan/classes.ts +166 -0
  651. package/src/styles/plan/continuous.ts +218 -0
  652. package/src/styles/plan/discrete.ts +165 -0
  653. package/src/styles/plan/families.ts +115 -0
  654. package/src/styles/plan/features.ts +234 -0
  655. package/src/styles/plan/index.ts +7 -0
  656. package/src/styles/plan/plan.ts +1129 -0
  657. package/src/styles/plan/resolve.ts +685 -0
  658. package/src/styles/types.ts +814 -0
  659. package/src/styles/vocabulary.ts +172 -0
  660. package/src/types.ts +76 -1
  661. package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
  662. package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
  663. package/dist/chunks/export-rKLeGQMo.js.map +0 -1
  664. package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
  665. package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
  666. package/dist/chunks/exporter-RVtXVetw.js.map +0 -1
  667. package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
  668. package/dist/chunks/importer-C98dpSH4.js.map +0 -1
  669. package/dist/chunks/importer-D794XUTe.js.map +0 -1
  670. package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
  671. package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
  672. package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
  673. package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
  674. package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
@@ -0,0 +1,624 @@
1
+ /**
2
+ * Canonical colors: lowercase `#rrggbb` plus an alpha from 0 to 1, read in the namespace of the file's dialect. The
3
+ * alpha never stays in the color: `colorOpacity()` moves it into the property's opacity or drops it with a note.
4
+ */
5
+
6
+ import { STYLE_ISSUE } from "../codes.js";
7
+ import type { StyleColor, StyleDialect } from "../types.js";
8
+ import { CSS_COLORS, DVIPS_COLORS, JAVA_COLORS } from "./color-tables.js";
9
+ import { graphvizColor, type GraphvizColorUse } from "./graphviz.js";
10
+ import { num6 } from "./number.js";
11
+ import { type CanonSite, noteAt, scalarText, spendAt } from "./site.js";
12
+
13
+ /**
14
+ * A canonical color and the alpha the file gave it.
15
+ * @category Styles
16
+ */
17
+ export interface CanonColor {
18
+ /** Lowercase `#rrggbb`. */
19
+ readonly color: StyleColor;
20
+ /** 0..1 at 6 significant digits; 1 when the file gave none. */
21
+ readonly alpha: number;
22
+ }
23
+
24
+ /**
25
+ * Options of `canonColor()`.
26
+ * @category Styles
27
+ */
28
+ export interface CanonColorOptions {
29
+ /** Graphviz only: the object's `colorscheme`. */
30
+ readonly scheme?: string | null;
31
+ /**
32
+ * Graphviz only: how the value is drawn, which decides how a color list is read (`line` for an outline or a
33
+ * font color, `fill`, or `edge` for an edge's line); defaults to `line`.
34
+ */
35
+ readonly use?: GraphvizColorUse;
36
+ }
37
+
38
+ /**
39
+ * A byte as two hex digits, clamped and rounded.
40
+ * @param v - a channel 0..255
41
+ * @returns two lowercase hex digits
42
+ */
43
+ function hex2(v: number): string {
44
+ return Math.max(0, Math.min(255, Math.round(v)))
45
+ .toString(16)
46
+ .padStart(2, "0");
47
+ }
48
+
49
+ /**
50
+ * `#rrggbb` from channels 0..255.
51
+ * @param r - red
52
+ * @param g - green
53
+ * @param b - blue
54
+ * @returns the color
55
+ */
56
+ function rgbHex(r: number, g: number, b: number): StyleColor {
57
+ return `#${hex2(r)}${hex2(g)}${hex2(b)}`;
58
+ }
59
+
60
+ /**
61
+ * An alpha clamped to 0..1 at 6 significant digits.
62
+ * @param a - the alpha
63
+ * @returns the canonical alpha
64
+ */
65
+ function alpha01(a: number): number {
66
+ return num6(Math.max(0, Math.min(1, a)));
67
+ }
68
+
69
+ // ------------------------------------------------------------ CSS Color 4 gamut mapping, as graphty-element draws
70
+
71
+ type Vec3 = readonly [number, number, number];
72
+
73
+ /**
74
+ * A 3x3 matrix times a vector.
75
+ * @param m - the matrix, row by row
76
+ * @param v - the vector
77
+ * @returns m * v
78
+ */
79
+ function mul(m: readonly Vec3[], v: Vec3): Vec3 {
80
+ return [
81
+ m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2],
82
+ m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2],
83
+ m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2],
84
+ ];
85
+ }
86
+
87
+ const LIN_TO_XYZ: readonly Vec3[] = [
88
+ [0.41239079926595934, 0.357584339383878, 0.1804807884018343],
89
+ [0.21263900587151027, 0.715168678767756, 0.07219231536073371],
90
+ [0.01933081871559182, 0.11919477979462598, 0.9505321522496607],
91
+ ];
92
+ const XYZ_TO_LIN: readonly Vec3[] = [
93
+ [3.2409699419045226, -1.537383177570094, -0.4986107602930034],
94
+ [-0.9692436362808796, 1.8759675015077202, 0.04155505740717559],
95
+ [0.05563007969699366, -0.20397695888897652, 1.0569715142428786],
96
+ ];
97
+ const XYZ_TO_LMS: readonly Vec3[] = [
98
+ [0.819022437996703, 0.3619062600528904, -0.1288737815209879],
99
+ [0.0329836539323885, 0.929286861586343, 0.0361446663506424],
100
+ [0.0481771893596242, 0.2642395317527308, 0.6335478284694309],
101
+ ];
102
+ const LMS_TO_XYZ: readonly Vec3[] = [
103
+ [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],
104
+ [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],
105
+ [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816],
106
+ ];
107
+ const LMS_TO_LAB: readonly Vec3[] = [
108
+ [0.210454268309314, 0.7936177747023054, -0.0040720430116193],
109
+ [1.9779985324311684, -2.42859224204858, 0.450593709617411],
110
+ [0.0259040424655478, 0.7827717124575296, -0.8086757549230774],
111
+ ];
112
+ const LAB_TO_LMS: readonly Vec3[] = [
113
+ [1, 0.3963377773761749, 0.2158037573099136],
114
+ [1, -0.1055613458156586, -0.0638541728258133],
115
+ [1, -0.0894841775298119, -1.2914855480194092],
116
+ ];
117
+
118
+ /**
119
+ * sRGB (0..1, possibly out of range) to OKLab.
120
+ * @param rgb - the channels
121
+ * @returns L, a, b
122
+ */
123
+ function srgbToOklab(rgb: Vec3): Vec3 {
124
+ const lin = rgb.map((c) => {
125
+ const a = Math.abs(c);
126
+ return Math.sign(c) * (a <= 0.04045 ? a / 12.92 : ((a + 0.055) / 1.055) ** 2.4);
127
+ }) as unknown as Vec3;
128
+ const lms = mul(XYZ_TO_LMS, mul(LIN_TO_XYZ, lin));
129
+ return mul(LMS_TO_LAB, lms.map(Math.cbrt) as unknown as Vec3);
130
+ }
131
+
132
+ /**
133
+ * OKLab to sRGB (0..1, possibly out of range).
134
+ * @param lab - L, a, b
135
+ * @returns the channels
136
+ */
137
+ function oklabToSrgb(lab: Vec3): Vec3 {
138
+ const lms = mul(LAB_TO_LMS, lab).map((c) => c ** 3) as unknown as Vec3;
139
+ return mul(XYZ_TO_LIN, mul(LMS_TO_XYZ, lms)).map((c) => {
140
+ const a = Math.abs(c);
141
+ return Math.sign(c) * (a > 0.0031308 ? 1.055 * a ** (1 / 2.4) - 0.055 : 12.92 * a);
142
+ }) as unknown as Vec3;
143
+ }
144
+
145
+ /**
146
+ * Whether sRGB channels are within 0..1.
147
+ * @param rgb - the channels
148
+ * @returns true when every channel is in range
149
+ */
150
+ function inGamut(rgb: Vec3): boolean {
151
+ return rgb.every((c) => c >= 0 && c <= 1);
152
+ }
153
+
154
+ /**
155
+ * Clamps sRGB channels to 0..1.
156
+ * @param rgb - the channels
157
+ * @returns the clamped channels
158
+ */
159
+ function clip(rgb: Vec3): Vec3 {
160
+ return rgb.map((c) => Math.max(0, Math.min(1, c))) as unknown as Vec3;
161
+ }
162
+
163
+ /**
164
+ * Distance in OKLab.
165
+ * @param p - one color
166
+ * @param q - the other
167
+ * @returns delta E OK
168
+ */
169
+ function deltaEOK(p: Vec3, q: Vec3): number {
170
+ return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2]);
171
+ }
172
+
173
+ /**
174
+ * CSS Color 4's gamut mapping into sRGB: chroma is reduced in OKLCh until clipping changes the color by less than
175
+ * a just noticeable difference. It is what graphty-element's color parser does with an out-of-range `rgb()` or
176
+ * `hsl()`, so a canonical color equals the color graphty-element draws for the same text.
177
+ * @param rgb - sRGB channels 0..1, possibly out of range
178
+ * @returns channels within 0..1
179
+ */
180
+ function toGamut(rgb: Vec3): Vec3 {
181
+ if (inGamut(rgb)) {
182
+ return rgb;
183
+ }
184
+ const JND = 0.02;
185
+ const [l, a, b] = srgbToOklab(rgb);
186
+ if (l >= 1) {
187
+ return [1, 1, 1];
188
+ }
189
+ if (l <= 0) {
190
+ return [0, 0, 0];
191
+ }
192
+ // The hue in degrees and back, as graphty-element's OKLCh does, so channels on a rounding edge round the same way.
193
+ const achromatic = Math.abs(a) < 0.0002 && Math.abs(b) < 0.0002;
194
+ const degrees = ((((Math.atan2(b, a) * 180) / Math.PI) % 360) + 360) % 360;
195
+ const at = (chroma: number): Vec3 =>
196
+ achromatic
197
+ ? [l, 0, 0]
198
+ : [l, chroma * Math.cos((degrees * Math.PI) / 180), chroma * Math.sin((degrees * Math.PI) / 180)];
199
+ const chroma0 = Math.sqrt(a ** 2 + b ** 2); // NOSONAR(S7769): colorjs.io's own formula, so chroma matches it bit for bit
200
+ const first = oklabToSrgb(at(chroma0));
201
+ if (inGamut(first)) {
202
+ return first;
203
+ }
204
+ const clipped = clip(first);
205
+ if (deltaEOK(srgbToOklab(clipped), at(chroma0)) < JND) {
206
+ // Clipping is close enough: clip the channels as given, without the round trip's rounding noise.
207
+ return clip(rgb);
208
+ }
209
+ return bisectChroma(at, chroma0, clipped);
210
+ }
211
+
212
+ /**
213
+ * CSS Color 4's chroma bisection: the largest chroma whose clipped color is within a just noticeable difference.
214
+ * A bisection: log2(chroma / EPSILON) rounds, about 30 for the most extreme finite input.
215
+ * @param at - the OKLab color of a chroma at the color's lightness and hue
216
+ * @param chroma0 - the color's own chroma
217
+ * @param first - the clipped color at that chroma
218
+ * @returns the clipped color found
219
+ */
220
+ function bisectChroma(at: (chroma: number) => Vec3, chroma0: number, first: Vec3): Vec3 {
221
+ const JND = 0.02;
222
+ const EPSILON = 0.0001;
223
+ let clipped = first;
224
+ let min = 0;
225
+ let max = chroma0;
226
+ let minInGamut = true;
227
+ while (max - min > EPSILON) {
228
+ const chroma = (min + max) / 2;
229
+ const current = at(chroma);
230
+ const rgbNow = oklabToSrgb(current);
231
+ if (minInGamut && inGamut(rgbNow)) {
232
+ min = chroma;
233
+ continue;
234
+ }
235
+ clipped = clip(rgbNow);
236
+ const e = deltaEOK(srgbToOklab(clipped), current);
237
+ if (e >= JND) {
238
+ max = chroma;
239
+ } else if (JND - e < EPSILON) {
240
+ break;
241
+ } else {
242
+ minInGamut = false;
243
+ min = chroma;
244
+ }
245
+ }
246
+ return clipped;
247
+ }
248
+
249
+ /**
250
+ * sRGB channels 0..1 (after gamut mapping) as `#rrggbb`.
251
+ * @param rgb - the channels
252
+ * @returns the color
253
+ */
254
+ function srgbHex(rgb: Vec3): StyleColor {
255
+ const [r, g, b] = toGamut(rgb);
256
+ return rgbHex(r * 255, g * 255, b * 255);
257
+ }
258
+
259
+ // ------------------------------------------------------------ CSS functional notation
260
+
261
+ /** One CSS number, without its unit. */
262
+ const CSS_NUMBER = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
263
+
264
+ /** A CSS number's unit: a percentage or an angle. */
265
+ const CSS_UNIT = /(%|deg|grad|rad|turn)$/i;
266
+
267
+ /**
268
+ * Splits a functional color's arguments: commas or blanks, with an optional `/` before the alpha.
269
+ * @param body - the text between the parentheses
270
+ * @returns the arguments and the alpha argument, or null when malformed
271
+ */
272
+ function cssArgs(body: string): { parts: string[]; alpha: string | undefined } | null {
273
+ const slash = body.split("/");
274
+ if (slash.length > 2) {
275
+ return null;
276
+ }
277
+ const parts = slash[0].split(/[\s,]+/).filter((p) => p !== "");
278
+ let alpha = slash.length === 2 ? slash[1].trim() : undefined;
279
+ if (alpha === undefined && parts.length === 4) {
280
+ alpha = parts.pop();
281
+ }
282
+ return parts.length === 3 && alpha !== "" ? { parts, alpha } : null;
283
+ }
284
+
285
+ /**
286
+ * Reads one CSS number.
287
+ * @param text - the argument
288
+ * @returns the value and its unit (lowercase, "" for none), or null
289
+ */
290
+ function cssNumber(text: string): { value: number; unit: string } | null {
291
+ const unit = CSS_UNIT.exec(text)?.[1] ?? "";
292
+ const number = text.slice(0, text.length - unit.length);
293
+ if (!CSS_NUMBER.test(number)) {
294
+ return null;
295
+ }
296
+ const value = Number(number);
297
+ return Number.isFinite(value) ? { value, unit: unit.toLowerCase() } : null;
298
+ }
299
+
300
+ /**
301
+ * Reads a CSS alpha: a number 0..1 or a percentage, clamped.
302
+ * @param text - the argument, or undefined for none
303
+ * @returns the alpha, or null when malformed
304
+ */
305
+ function cssAlpha(text: string | undefined): number | null {
306
+ if (text === undefined) {
307
+ return 1;
308
+ }
309
+ const n = cssNumber(text);
310
+ if (n === null || (n.unit !== "" && n.unit !== "%")) {
311
+ return null;
312
+ }
313
+ return alpha01(n.unit === "%" ? n.value / 100 : n.value);
314
+ }
315
+
316
+ /**
317
+ * `rgb()`, `rgba()`, `hsl()` and `hsla()` as graphty-element reads them: channels and lightness out of range are
318
+ * gamut mapped, not refused.
319
+ * @param text - the value, trimmed
320
+ * @returns the color, or null when it is not one
321
+ */
322
+ function cssFunction(text: string): { hex: StyleColor; alpha: number } | null {
323
+ const m = /^(rgba?|hsla?)\(([^()]*)\)$/i.exec(text);
324
+ if (m === null) {
325
+ return null;
326
+ }
327
+ const args = cssArgs(m[2]);
328
+ if (args === null) {
329
+ return null;
330
+ }
331
+ const nums = args.parts.map(cssNumber);
332
+ const alpha = cssAlpha(args.alpha);
333
+ if (nums.includes(null) || alpha === null) {
334
+ return null;
335
+ }
336
+ const [x, y, z] = nums as { value: number; unit: string }[];
337
+ if (m[1].toLowerCase().startsWith("rgb")) {
338
+ if ([x, y, z].some((n) => n.unit !== "" && n.unit !== "%")) {
339
+ return null;
340
+ }
341
+ const ch = [x, y, z].map((n) => (n.unit === "%" ? n.value / 100 : n.value / 255)) as unknown as Vec3;
342
+ return { hex: srgbHex(ch), alpha };
343
+ }
344
+ const turns: Readonly<Record<string, number>> = { "": 360, deg: 360, grad: 400, rad: 2 * Math.PI, turn: 1 };
345
+ if (x.unit === "%" || !Object.hasOwn(turns, x.unit) || [y, z].some((n) => n.unit !== "" && n.unit !== "%")) {
346
+ return null;
347
+ }
348
+ const h = ((((x.value / turns[x.unit]) * 360) % 360) + 360) % 360;
349
+ const s = y.value / 100;
350
+ const l = z.value / 100;
351
+ const f = (n: number): number => {
352
+ const k = (n + h / 30) % 12;
353
+ return l - s * Math.min(l, 1 - l) * Math.max(-1, Math.min(k - 3, 9 - k, 1));
354
+ };
355
+ return { hex: srgbHex([f(0), f(8), f(4)]), alpha };
356
+ }
357
+
358
+ // ------------------------------------------------------------ hex and names
359
+
360
+ /**
361
+ * A `#` hex color of 3, 4, 6 or 8 digits. Eight digits put the alpha last, except in yFiles 3, which puts it first.
362
+ * @param text - the value, trimmed
363
+ * @param alphaFirst - whether 8 digits are `#AARRGGBB`
364
+ * @returns the color, or null
365
+ */
366
+ function hexColor(text: string, alphaFirst: boolean): { hex: StyleColor; alpha: number } | null {
367
+ const m = /^#([0-9a-f]+)$/i.exec(text);
368
+ if (m === null) {
369
+ return null;
370
+ }
371
+ const h = m[1];
372
+ const byte = (i: number): number => Number.parseInt(h.slice(i, i + 2), 16);
373
+ switch (h.length) {
374
+ case 3:
375
+ case 4: {
376
+ const v = Array.from(h, (c) => Number.parseInt(c + c, 16));
377
+ return { hex: rgbHex(v[0], v[1], v[2]), alpha: h.length === 4 ? alpha01(v[3] / 255) : 1 };
378
+ }
379
+ case 6:
380
+ return { hex: `#${h.toLowerCase()}`, alpha: 1 };
381
+ case 8:
382
+ return alphaFirst
383
+ ? { hex: rgbHex(byte(2), byte(4), byte(6)), alpha: alpha01(byte(0) / 255) }
384
+ : { hex: rgbHex(byte(0), byte(2), byte(4)), alpha: alpha01(byte(6) / 255) };
385
+ default:
386
+ return null;
387
+ }
388
+ }
389
+
390
+ /**
391
+ * A CSS color as graphty-element reads it: hex, `rgb()`/`hsl()` and their alpha forms, a CSS name or
392
+ * `transparent`.
393
+ * @param text - the value, trimmed
394
+ * @returns the color, or null
395
+ */
396
+ function cssColor(text: string): { hex: StyleColor; alpha: number } | null {
397
+ const lower = text.toLowerCase();
398
+ if (lower === "transparent") {
399
+ return { hex: "#000000", alpha: 0 };
400
+ }
401
+ const named = CSS_COLORS.get(lower);
402
+ if (named !== undefined) {
403
+ return { hex: named as StyleColor, alpha: 1 };
404
+ }
405
+ return hexColor(text, false) ?? cssFunction(text);
406
+ }
407
+
408
+ /** One of Pajek's decimal color channels in `RGB(1,0.8,0)`: 0..1, no spaces (Pajek 6.02 manual p. 76). */
409
+ const PAJEK_CHANNEL = /^(?:\d+(?:\.\d*)?|\.\d+)$/;
410
+
411
+ /**
412
+ * Pajek's color names: the dvips names as written, `GrayNN` (NN percent black), `RGBrrggbb`, `RGB(r,g,b)` with
413
+ * channels 0..1, `CMYKccmmyykk` and `CMYK(c,m,y,k)` (CMYK converted as dvips converts its names: each channel is
414
+ * 1 - min(1, c + k)).
415
+ * @param text - the value, trimmed
416
+ * @returns the color, or null
417
+ */
418
+ function pajekColor(text: string): { hex: StyleColor; alpha: number } | null {
419
+ const named = DVIPS_COLORS.get(text);
420
+ if (named !== undefined) {
421
+ return { hex: named as StyleColor, alpha: 1 };
422
+ }
423
+ const gray = /^Gray(\d\d)$/.exec(text);
424
+ if (gray !== null) {
425
+ const v = 255 * (1 - Number(gray[1]) / 100);
426
+ return { hex: rgbHex(v, v, v), alpha: 1 };
427
+ }
428
+ const rgb = /^RGB([0-9A-Fa-f]{6})$/.exec(text);
429
+ if (rgb !== null) {
430
+ return { hex: `#${rgb[1].toLowerCase()}`, alpha: 1 };
431
+ }
432
+ const cmyk = /^CMYK([0-9A-Fa-f]{8})$/.exec(text);
433
+ let parts: number[] | null = null;
434
+ let model = "";
435
+ if (cmyk === null) {
436
+ const fn = /^(RGB|CMYK)\(([^()]*)\)$/.exec(text);
437
+ const channels = fn === null ? [] : fn[2].split(",");
438
+ if (fn !== null && channels.every((c) => PAJEK_CHANNEL.test(c))) {
439
+ model = fn[1];
440
+ parts = channels.map(Number);
441
+ }
442
+ } else {
443
+ model = "CMYK";
444
+ parts = [0, 2, 4, 6].map((i) => Number.parseInt(cmyk[1].slice(i, i + 2), 16) / 255);
445
+ }
446
+ if (parts === null || parts.some((p) => p > 1) || parts.length !== (model === "RGB" ? 3 : 4)) {
447
+ return hexColor(text, false);
448
+ }
449
+ if (model === "RGB") {
450
+ return { hex: rgbHex(parts[0] * 255, parts[1] * 255, parts[2] * 255), alpha: 1 };
451
+ }
452
+ const [c, m, y, k] = parts;
453
+ const ch = (v: number): number => 255 * (1 - Math.min(1, v + k));
454
+ return { hex: rgbHex(ch(c), ch(m), ch(y)), alpha: 1 };
455
+ }
456
+
457
+ /**
458
+ * A color given as separate channels (`{ r, g, b, a? }`, GEXF's `viz:color` and Gephi's keys): r, g and b 0..255,
459
+ * a 0..1.
460
+ * @param raw - the object
461
+ * @returns the color, or null when a channel is missing or out of range
462
+ */
463
+ function channels(raw: object): { hex: StyleColor; alpha: number } | null {
464
+ if (!Object.hasOwn(raw, "r") || !Object.hasOwn(raw, "g") || !Object.hasOwn(raw, "b")) {
465
+ return null;
466
+ }
467
+ const o = raw as { r: unknown; g: unknown; b: unknown; a?: unknown };
468
+ const [r, g, b] = [o.r, o.g, o.b].map((v) =>
469
+ typeof v === "number" || typeof v === "string" ? Number(v) : Number.NaN,
470
+ );
471
+ if (![r, g, b].every((v) => Number.isFinite(v) && v >= 0 && v <= 255)) {
472
+ return null;
473
+ }
474
+ const a = Object.hasOwn(raw, "a") && o.a !== undefined && o.a !== null ? Number(o.a) : 1;
475
+ return Number.isFinite(a) ? { hex: rgbHex(r, g, b), alpha: alpha01(a) } : null;
476
+ }
477
+
478
+ /**
479
+ * A canonical color in the file's dialect, or null with a note.
480
+ *
481
+ * - CSS (`css`, `vis`, `graphology`, `cytoscape-js`, `graphty` and any dialect not listed): `#rgb`, `#rgba`,
482
+ * `#rrggbb`, `#rrggbbaa`, `rgb()`, `rgba()`, `hsl()`, `hsla()`, CSS names and `transparent`, resolved as
483
+ * graphty-element resolves them (out-of-range channels are gamut mapped).
484
+ * - `graphviz`: Graphviz's own rules (see `graphvizColor`); an unknown color is BLACK, with a note, because that is
485
+ * what Graphviz draws. `x11`: the same names, and an unknown one is null.
486
+ * - `java`, `gephi`, `cytoscape`: the `java.awt.Color` names first, then CSS; a `java` integer is an RGB value.
487
+ * - `dvips`: Pajek's names.
488
+ * - `yed`: `#RRGGBBAA` with the alpha last; `yfiles3`: `#AARRGGBB` with the alpha first and constants such as
489
+ * `DARK_ORANGE`.
490
+ * - `gexf` and `gephi` also take `{ r, g, b, a }` objects.
491
+ *
492
+ * A Graphviz color list is read as `options.use` says and noted (`W_STYLE_GRADIENT`, `W_STYLE_COLOR_LIST`).
493
+ * @param raw - the file's value
494
+ * @param dialect - the file's dialect
495
+ * @param site - where it was read
496
+ * @param options - Graphviz's scheme and use
497
+ * @returns the color and its alpha, or null
498
+ * @category Styles
499
+ */
500
+ export function canonColor(
501
+ raw: unknown,
502
+ dialect: StyleDialect,
503
+ site: CanonSite,
504
+ options: CanonColorOptions = {},
505
+ ): CanonColor | null {
506
+ if (raw !== null && typeof raw === "object") {
507
+ return objectColor(raw, dialect, site);
508
+ }
509
+ if (typeof raw === "number" && dialect === "java" && Number.isInteger(raw) && Math.abs(raw) <= 0xffffffff) {
510
+ spendAt(site, 1);
511
+ const v = raw >>> 0;
512
+ return { color: rgbHex((v >>> 16) & 255, (v >>> 8) & 255, v & 255), alpha: 1 };
513
+ }
514
+ const text = scalarText(raw, site);
515
+ if (text === null) {
516
+ return null;
517
+ }
518
+ if (dialect === "graphviz" || dialect === "x11") {
519
+ return graphvizCanon(text, dialect === "x11" ? "x11" : "graphviz", site, options);
520
+ }
521
+ const c = textColor(text.trim(), dialect);
522
+ if (c === null) {
523
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, text);
524
+ return null;
525
+ }
526
+ return { color: c.hex, alpha: c.alpha };
527
+ }
528
+
529
+ /**
530
+ * A color given as an object: only GEXF and Gephi write one, as channels.
531
+ * @param raw - the object
532
+ * @param dialect - the file's dialect
533
+ * @param site - where it was read
534
+ * @returns the color and its alpha, or null with a note
535
+ */
536
+ function objectColor(raw: object, dialect: StyleDialect, site: CanonSite): CanonColor | null {
537
+ spendAt(site, 1);
538
+ const c = dialect === "gexf" || dialect === "gephi" ? channels(raw) : null;
539
+ if (c === null) {
540
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);
541
+ return null;
542
+ }
543
+ return { color: c.hex, alpha: c.alpha };
544
+ }
545
+
546
+ /**
547
+ * A Graphviz or X11 color: Graphviz draws an unknown color black; a plain X11 name that is unknown is no color at all.
548
+ * @param text - the value
549
+ * @param dialect - `graphviz` or `x11`
550
+ * @param site - where it was read
551
+ * @param options - Graphviz's scheme and use
552
+ * @returns the color and its alpha, or null
553
+ */
554
+ function graphvizCanon(
555
+ text: string,
556
+ dialect: "graphviz" | "x11",
557
+ site: CanonSite,
558
+ options: CanonColorOptions,
559
+ ): CanonColor | null {
560
+ const g = graphvizColor(text, dialect === "x11" ? null : (options.scheme ?? null), options.use ?? "line");
561
+ if (g.unknown) {
562
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, text);
563
+ if (dialect === "x11") {
564
+ return null;
565
+ }
566
+ }
567
+ if (g.list !== null) {
568
+ noteAt(site, g.list === "gradient" ? STYLE_ISSUE.GRADIENT : STYLE_ISSUE.COLOR_LIST, text);
569
+ }
570
+ return { color: g.hex as StyleColor, alpha: alpha01(g.alpha) };
571
+ }
572
+
573
+ /**
574
+ * A color written as text in a dialect other than Graphviz's.
575
+ * @param trimmed - the value, trimmed
576
+ * @param dialect - the file's dialect
577
+ * @returns the color and its alpha, or null
578
+ */
579
+ function textColor(trimmed: string, dialect: StyleDialect): { hex: StyleColor; alpha: number } | null {
580
+ const lower = trimmed.toLowerCase();
581
+ switch (dialect) {
582
+ case "dvips":
583
+ return pajekColor(trimmed);
584
+ case "yfiles3":
585
+ return hexColor(trimmed, true) ?? cssColor(lower.replaceAll("_", ""));
586
+ case "java":
587
+ case "gephi":
588
+ case "cytoscape": {
589
+ const java = JAVA_COLORS.get(lower);
590
+ return java === undefined ? cssColor(trimmed) : { hex: java as StyleColor, alpha: 1 };
591
+ }
592
+ default:
593
+ return cssColor(trimmed);
594
+ }
595
+ }
596
+
597
+ /**
598
+ * Moves a color's alpha into the property's opacity. When the property has an opacity (`fill` has `fillOpacity`,
599
+ * an edge's `color` has `opacity`) the alpha is multiplied with any opacity the file also states; when it has none
600
+ * (an outline, a label color) an alpha below 1 is dropped and noted as `W_STYLE_ALPHA_DROPPED`.
601
+ * @param color - the canonical color
602
+ * @param stated - the opacity the file states for the same element, or null
603
+ * @param site - where the color was read
604
+ * @param carried - whether the property has an opacity to carry the alpha
605
+ * @returns the opacity to write, or null when there is none to write
606
+ * @category Styles
607
+ */
608
+ export function colorOpacity(
609
+ color: CanonColor,
610
+ stated: number | null,
611
+ site: CanonSite,
612
+ carried: boolean,
613
+ ): number | null {
614
+ if (!carried) {
615
+ if (color.alpha < 1) {
616
+ noteAt(site, STYLE_ISSUE.ALPHA_DROPPED, color.color);
617
+ }
618
+ return stated;
619
+ }
620
+ if (color.alpha === 1) {
621
+ return stated;
622
+ }
623
+ return num6((stated ?? 1) * color.alpha);
624
+ }