@graphty/graph-io 0.3.43 → 0.3.44

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-3Q4TsdTh.js +40 -0
  2. package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
  3. package/dist/chunks/block-JQiwViEt.js +2777 -0
  4. package/dist/chunks/block-JQiwViEt.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
  8. package/dist/chunks/constants-BFUR_CtU.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-DCwFLts5.js +3456 -0
  12. package/dist/chunks/emit-DCwFLts5.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
  14. package/dist/chunks/escape-B1rMftd9.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
  16. package/dist/chunks/export-D7IGzTG4.js.map +1 -0
  17. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
  18. package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
  19. package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
  20. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
  22. package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
  23. package/dist/chunks/{exporter-RVtXVetw.js → exporter-quPUCBiC.js} +1805 -287
  24. package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
  25. package/dist/chunks/format-GDmO6m6Q.js +676 -0
  26. package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
  27. package/dist/chunks/generic-BL06jrJf.js +1347 -0
  28. package/dist/chunks/generic-BL06jrJf.js.map +1 -0
  29. package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
  30. package/dist/chunks/importer-B7r2owVf.js.map +1 -0
  31. package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
  32. package/dist/chunks/importer-BFmOP96W.js.map +1 -0
  33. package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
  34. package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
  35. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
  36. package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
  37. package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
  38. package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
  39. package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
  40. package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
  41. package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
  42. package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
  43. package/dist/chunks/index-B9fdNpTA.js +4310 -0
  44. package/dist/chunks/index-B9fdNpTA.js.map +1 -0
  45. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
  46. package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
  47. package/dist/chunks/lexicon-B-knUi-l.js +508 -0
  48. package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
  49. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
  50. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
  51. package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
  52. package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
  53. package/dist/chunks/styles-Brt9JMfs.js +690 -0
  54. package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
  55. package/dist/chunks/styles-_N-C8S-U.js +2102 -0
  56. package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
  57. package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
  58. package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
  59. package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
  60. package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
  61. package/dist/chunks/units-XMZFIFe1.js +19 -0
  62. package/dist/chunks/units-XMZFIFe1.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 +8 -3031
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +354 -240
  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 +1484 -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 +790 -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 +603 -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 +80 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +596 -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 +1741 -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 +951 -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 +656 -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 +745 -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,687 @@
1
+ /**
2
+ * Reading a file's styles after an import: the importer's own `styles()` (the simple path, canonicalized and planned
3
+ * here, or the advanced path), the generic reader of the style roles (`color`, `size`, `shape`, `thickness`,
4
+ * `hidden`) for an importer without one, and the `graphty.styles` block when a file graphty wrote carries it as a
5
+ * graph attribute.
6
+ */
7
+
8
+ import type { GraphSnapshot } from "@graphty/graph-format";
9
+
10
+ import { keptForStyles } from "../../common/report.js";
11
+ import type { GraphImporter, ImportReport } from "../../types.js";
12
+ import { StyleBudget } from "../budget.js";
13
+ import { canonColor, colorOpacity } from "../canon/color.js";
14
+ import { canonEnum, type StyleEnumKind } from "../canon/enums.js";
15
+ import { canonBoolean, canonNumber, canonOpacity, DOT_POINTS_PER_INCH, styleLengthUnit } from "../canon/number.js";
16
+ import type { CanonSite } from "../canon/site.js";
17
+ import { canonText } from "../canon/text.js";
18
+ import { STYLE_ISSUE } from "../codes.js";
19
+ import { StyleNotes } from "../notes.js";
20
+ import { featuresOf, styleFingerprint } from "../plan/features.js";
21
+ import { planStyles } from "../plan/plan.js";
22
+ import { plainCell } from "../plan/resolve.js";
23
+ import type {
24
+ ExtractedStyles,
25
+ GraphStyle,
26
+ ImporterStyles,
27
+ ReaderOutput,
28
+ StyleColumn,
29
+ StyleDialect,
30
+ StyleNote,
31
+ StyleProperty,
32
+ StyleTarget,
33
+ StyleTool,
34
+ StyleValue,
35
+ } from "../types.js";
36
+ import { STYLE_PROPERTIES } from "../vocabulary.js";
37
+ import { blockStyles, parseStyleBlock, STYLE_BLOCK_NAME } from "./block.js";
38
+
39
+ /**
40
+ * The `styles` option of `importGraph()` given as an object.
41
+ * @category Styles
42
+ */
43
+ export interface StyleImportOptions {
44
+ /**
45
+ * Whether a property the file leaves to its writing program's default gets that program's default (Cytoscape's,
46
+ * Graphviz's, Gephi's ...), so the graph looks as it does there. Defaults to true.
47
+ */
48
+ readonly toolDefaults?: boolean;
49
+ }
50
+
51
+ /**
52
+ * Options of `extractStyles()`.
53
+ * @category Styles
54
+ */
55
+ export interface ExtractStylesOptions extends StyleImportOptions {
56
+ /** Cancels the extraction. */
57
+ readonly signal?: AbortSignal | null;
58
+ /**
59
+ * The counted work budget to spend (and read back after: `budget.used("node")`); a new one of
60
+ * `STYLE_WORK_BUDGET` operations per target when absent.
61
+ * @internal
62
+ */
63
+ readonly budget?: StyleBudget;
64
+ }
65
+
66
+ const TARGETS: readonly StyleTarget[] = ["node", "edge"];
67
+ const ENUM_KINDS: ReadonlySet<string> = new Set(["shape", "borderStyle", "lineStyle", "arrow", "weight", "position"]);
68
+
69
+ /** What the readers here produce before planning: canonical values and the data columns they came from. */
70
+ interface StyleTruth {
71
+ readonly dialect: StyleDialect | null;
72
+ readonly tool: StyleTool | null;
73
+ readonly units: "px" | "relative";
74
+ readonly graph: GraphStyle;
75
+ readonly node: ReaderOutput;
76
+ readonly edge: ReaderOutput;
77
+ readonly raw: { readonly node: readonly string[]; readonly edge: readonly string[] };
78
+ readonly notes: readonly StyleNote[];
79
+ /** A `graphty.styles` block the importer found outside the graph attributes, or null. */
80
+ readonly block?: string | null;
81
+ /** Whether the format writes an opacity as its color's alpha (see `ImporterStyles`). */
82
+ readonly opacityInColor?: boolean;
83
+ }
84
+
85
+ /**
86
+ * Reads the styles of a file after its import: the reading importer's own `styles()` (with what its `import()` kept
87
+ * for it), or the columns whose role is a style role when it has none; a `graphty.styles` block carried as a graph
88
+ * attribute gives the rules, with the importer's values as the truth. Called by `importGraph()` when styles are
89
+ * requested; a caller that drives an importer itself (into its own builder) calls it with the report `import()`
90
+ * returned.
91
+ * @param importer - the importer that read the file
92
+ * @param snapshot - the graph it built
93
+ * @param report - the report its `import()` returned
94
+ * @param options - tool defaults and a cancel signal
95
+ * @returns the styles, or null when the file has none
96
+ * @category Styles
97
+ */
98
+ export function extractStyles(
99
+ importer: GraphImporter,
100
+ snapshot: GraphSnapshot,
101
+ report: ImportReport,
102
+ options: ExtractStylesOptions = {},
103
+ ): ExtractedStyles | null {
104
+ const signal = options.signal ?? undefined;
105
+ const notes = new StyleNotes();
106
+ const budget = options.budget ?? new StyleBudget();
107
+ const canonical = readStyleValues(importer, snapshot, report, { notes, budget, signal });
108
+ const fingerprint = styleFingerprint(snapshot);
109
+ const blockText = canonical?.block ?? graphValue(snapshot, STYLE_BLOCK_NAME);
110
+ if (blockText !== undefined) {
111
+ const parsed = parseStyleBlock(blockText, fingerprint);
112
+ if (parsed.ok) {
113
+ const truth = canonical === null ? {} : { node: canonical.node.values, edge: canonical.edge.values };
114
+ const fromBlock = blockStyles(
115
+ parsed.block,
116
+ snapshot,
117
+ importer.format,
118
+ truth,
119
+ canonical?.notes ?? [],
120
+ canonical?.tool ?? null,
121
+ canonical?.opacityInColor === true,
122
+ );
123
+ if (fromBlock !== null) {
124
+ return fromBlock;
125
+ }
126
+ notes.add(STYLE_ISSUE.BLOCK_IGNORED, null, null, { sample: "INVALID" });
127
+ } else {
128
+ notes.add(STYLE_ISSUE.BLOCK_IGNORED, null, null, { sample: parsed.reason });
129
+ }
130
+ }
131
+ if (canonical === null) {
132
+ const list = notes.list();
133
+ return list.length === 0 ? null : emptyStyles(importer.format, list, snapshot, fingerprint);
134
+ }
135
+ const raw = { node: new Set(canonical.raw.node), edge: new Set(canonical.raw.edge) };
136
+ const features = {
137
+ node: featuresOf(snapshot, "node").filter((f) => !("data" in f.ref && raw.node.has(f.ref.data))),
138
+ edge: featuresOf(snapshot, "edge").filter((f) => !("data" in f.ref && raw.edge.has(f.ref.data))),
139
+ };
140
+ const planned = planStyles(
141
+ {
142
+ format: importer.format,
143
+ dialect: canonical.dialect,
144
+ tool: canonical.tool,
145
+ units: canonical.units,
146
+ graph: canonical.graph,
147
+ node: canonical.node,
148
+ edge: canonical.edge,
149
+ fingerprint,
150
+ },
151
+ features,
152
+ {
153
+ toolDefaults: options.toolDefaults,
154
+ budget,
155
+ notes,
156
+ rawColumns: { node: canonical.raw.node, edge: canonical.raw.edge },
157
+ signal,
158
+ },
159
+ );
160
+ if (canonical.notes.length === 0) {
161
+ return planned;
162
+ }
163
+ return { ...planned, styles: { ...planned.styles, notes: [...canonical.notes, ...planned.styles.notes] } };
164
+ }
165
+
166
+ /**
167
+ * What a file's styles are before planning: each element's canonical value per property, as the importer's own
168
+ * `styles()` gives them (the simple path canonicalized) or, for an importer without one, as the generic reader reads
169
+ * the columns with a style role. The truth the planned rules must reproduce; not part of the published entry.
170
+ * @param importer - the importer that read the file
171
+ * @param snapshot - the graph it built
172
+ * @param report - the report its `import()` returned
173
+ * @param context - where problems are noted, the work budget and a cancel signal
174
+ * @param context.notes - where problems are noted
175
+ * @param context.budget - the work budget
176
+ * @param context.signal - cancels the work
177
+ * @returns the canonical values, or null when the file has no styles
178
+ */
179
+ export function readStyleValues(
180
+ importer: GraphImporter,
181
+ snapshot: GraphSnapshot,
182
+ report: ImportReport,
183
+ context: { readonly notes: StyleNotes; readonly budget: StyleBudget; readonly signal?: AbortSignal | undefined },
184
+ ): StyleTruth | null {
185
+ const { notes, budget, signal } = context;
186
+ signal?.throwIfAborted();
187
+ let canonical: StyleTruth | null;
188
+ if (importer.styles === undefined) {
189
+ canonical = roleStyles(snapshot, importer.format, notes, budget);
190
+ } else {
191
+ const got = importer.styles(snapshot, { signal, budget, kept: keptForStyles(report) });
192
+ canonical = got === null ? null : canonicalOf(got, snapshot, notes, budget, signal);
193
+ }
194
+ signal?.throwIfAborted();
195
+ return canonical === null ? null : withPairedHalves(canonical, snapshot);
196
+ }
197
+
198
+ /**
199
+ * The values with the second half of each undirected edge of a directed graph given its first half's value: the file
200
+ * holds the edge once, its program draws it once, and the import read the element's values onto the first half.
201
+ * @param truth - the values read
202
+ * @param snapshot - the graph
203
+ * @returns the values
204
+ */
205
+ function withPairedHalves(truth: StyleTruth, snapshot: GraphSnapshot): StyleTruth {
206
+ const pair = snapshot.edges.byRole("pair");
207
+ if (pair === null) {
208
+ return truth;
209
+ }
210
+ const values: Partial<Record<StyleProperty, StyleColumn>> = {};
211
+ for (const [property, col] of Object.entries(truth.edge.values) as [StyleProperty, StyleColumn | undefined][]) {
212
+ if (col === undefined) {
213
+ continue;
214
+ }
215
+ const out = [...col];
216
+ for (let e = 0; e < out.length; e++) {
217
+ const first = pair.isSet(e) ? (pair.value(e) as number) : e;
218
+ if (first < e) {
219
+ out[e] = col[first] ?? null;
220
+ }
221
+ }
222
+ values[property] = out;
223
+ }
224
+ return { ...truth, edge: { ...truth.edge, values } };
225
+ }
226
+
227
+ /**
228
+ * A graph attribute's value, or undefined.
229
+ * @param snapshot - the graph
230
+ * @param name - the attribute
231
+ * @returns its value
232
+ */
233
+ function graphValue(snapshot: GraphSnapshot, name: string): unknown {
234
+ return snapshot.graph.has(name) ? plainCell(snapshot.graph.value(name, 0)) : undefined;
235
+ }
236
+
237
+ /**
238
+ * Styles holding nothing but notes.
239
+ * @param format - the format
240
+ * @param notes - the notes
241
+ * @param snapshot - the graph
242
+ * @param fingerprint - its fingerprint
243
+ * @returns the styles
244
+ */
245
+ function emptyStyles(
246
+ format: string,
247
+ notes: readonly StyleNote[],
248
+ snapshot: GraphSnapshot,
249
+ fingerprint: ExtractedStyles["fingerprint"],
250
+ ): ExtractedStyles {
251
+ return {
252
+ styles: {
253
+ version: 1,
254
+ source: { format, dialect: null, tool: null },
255
+ units: { length: "px" },
256
+ graph: {},
257
+ rules: [],
258
+ notes,
259
+ },
260
+ columns: { node: new Map(), edge: new Map() },
261
+ features: { node: featuresOf(snapshot, "node"), edge: featuresOf(snapshot, "edge") },
262
+ fingerprint,
263
+ };
264
+ }
265
+
266
+ /**
267
+ * An importer's styles as canonical values: the advanced path as it is, the simple path read and canonicalized.
268
+ * @param got - what the importer's `styles()` returned
269
+ * @param snapshot - the graph
270
+ * @param notes - where problems are noted
271
+ * @param budget - the work budget
272
+ * @param signal - cancels the work
273
+ * @returns the canonical values
274
+ */
275
+ function canonicalOf(
276
+ got: ImporterStyles,
277
+ snapshot: GraphSnapshot,
278
+ notes: StyleNotes,
279
+ budget: StyleBudget,
280
+ signal: AbortSignal | undefined,
281
+ ): StyleTruth {
282
+ if ("canonical" in got) {
283
+ return {
284
+ dialect: got.dialect ?? null,
285
+ tool: got.tool ?? null,
286
+ units: got.units ?? "px",
287
+ graph: got.graph ?? {},
288
+ node: got.node ?? { values: {} },
289
+ edge: got.edge ?? { values: {} },
290
+ raw: { node: got.readFrom?.node ?? [], edge: got.readFrom?.edge ?? [] },
291
+ notes: got.notes ?? [],
292
+ block: got.block ?? null,
293
+ opacityInColor: got.opacityInColor === true,
294
+ };
295
+ }
296
+ const { dialect } = got;
297
+ const raw = { node: [] as string[], edge: [] as string[] };
298
+ const out = { node: { values: {} } as ReaderOutput, edge: { values: {} } as ReaderOutput };
299
+ for (const target of TARGETS) {
300
+ const given = got[target];
301
+ if (given === undefined) {
302
+ continue;
303
+ }
304
+ const columns = new Map<string, readonly unknown[]>();
305
+ for (const [property, source] of Object.entries(given)) {
306
+ signal?.throwIfAborted();
307
+ const values = rawValues(snapshot, target, property, source, notes, raw[target]);
308
+ if (values !== null) {
309
+ columns.set(property, values);
310
+ }
311
+ }
312
+ out[target] = { values: canonicalize(target, columns, dialect, count(snapshot, target), notes, budget) };
313
+ }
314
+ return {
315
+ dialect,
316
+ tool: null,
317
+ units: styleLengthUnit(dialect),
318
+ graph: {},
319
+ node: out.node,
320
+ edge: out.edge,
321
+ raw,
322
+ notes: [],
323
+ };
324
+ }
325
+
326
+ /**
327
+ * The element count of a target.
328
+ * @param snapshot - the graph
329
+ * @param target - nodes or edges
330
+ * @returns the count
331
+ */
332
+ function count(snapshot: GraphSnapshot, target: StyleTarget): number {
333
+ return target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
334
+ }
335
+
336
+ /**
337
+ * The raw values of one property on the simple path: a snapshot column by name, or an array by element index.
338
+ * @param snapshot - the graph
339
+ * @param target - nodes or edges
340
+ * @param property - the property
341
+ * @param source - `{ data: "<column>" }` or an array
342
+ * @param notes - where a missing column is noted
343
+ * @param raw - collects the names of the columns read
344
+ * @returns the values, or null
345
+ */
346
+ function rawValues(
347
+ snapshot: GraphSnapshot,
348
+ target: StyleTarget,
349
+ property: string,
350
+ source: unknown,
351
+ notes: StyleNotes,
352
+ raw: string[],
353
+ ): readonly unknown[] | null {
354
+ if (Array.isArray(source)) {
355
+ return source as unknown[];
356
+ }
357
+ if (source === null || typeof source !== "object" || typeof (source as { data?: unknown }).data !== "string") {
358
+ notes.add(STYLE_ISSUE.BAD_MAPPING, target, property, { sample: source });
359
+ return null;
360
+ }
361
+ const name = (source as { data: string }).data;
362
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
363
+ if (!table.has(name)) {
364
+ notes.add(STYLE_ISSUE.MAPPING_COLUMN_MISSING, target, property, { sample: name });
365
+ return null;
366
+ }
367
+ raw.push(name);
368
+ const n = count(snapshot, target);
369
+ const out = new Array<unknown>(n);
370
+ for (let i = 0; i < n; i++) {
371
+ out[i] = plainCell(table.value(name, i));
372
+ }
373
+ return out;
374
+ }
375
+
376
+ /**
377
+ * Canonical values of every property of one target. A list value is read as its first item. A color's alpha moves
378
+ * into the fill's or the edge's opacity (multiplied with an opacity the file also states) or is dropped with a note.
379
+ * @param target - nodes or edges
380
+ * @param columns - the raw values per property
381
+ * @param dialect - how they are spelled
382
+ * @param n - the element count
383
+ * @param notes - where problems are noted
384
+ * @param budget - the work budget
385
+ * @returns the canonical values per property
386
+ */
387
+ function canonicalize(
388
+ target: StyleTarget,
389
+ columns: ReadonlyMap<string, readonly unknown[]>,
390
+ dialect: StyleDialect,
391
+ n: number,
392
+ notes: StyleNotes,
393
+ budget: StyleBudget,
394
+ ): Record<string, StyleColumn> {
395
+ const cx: CanonContext = { target, dialect, n, notes, budget };
396
+ // keyed by the importer's property names: no prototype, so `__proto__` is a property like any other
397
+ const out: Record<string, (StyleValue | null)[]> = Object.create(null) as Record<string, (StyleValue | null)[]>;
398
+ const alphas = new Map<string, (number | null)[]>();
399
+ for (const [property, raws] of columns) {
400
+ const { col, alpha } = canonicalColumn(cx, property, raws);
401
+ out[property] = col;
402
+ if (alpha !== null) {
403
+ alphas.set(property, alpha);
404
+ }
405
+ }
406
+ for (const [property, alpha] of alphas) {
407
+ moveAlpha(cx, out, property, alpha);
408
+ }
409
+ return out;
410
+ }
411
+
412
+ /** What canonicalize() reads one target's values with. */
413
+ interface CanonContext {
414
+ readonly target: StyleTarget;
415
+ readonly dialect: StyleDialect;
416
+ /** The element count. */
417
+ readonly n: number;
418
+ readonly notes: StyleNotes;
419
+ readonly budget: StyleBudget;
420
+ }
421
+
422
+ /**
423
+ * Canonical values of one property; a color's alpha below 1 is kept apart.
424
+ * @param cx - the target being read
425
+ * @param property - the property
426
+ * @param raws - its raw values
427
+ * @returns the values, and the alphas (null when every color is opaque)
428
+ */
429
+ function canonicalColumn(
430
+ cx: CanonContext,
431
+ property: string,
432
+ raws: readonly unknown[],
433
+ ): { col: (StyleValue | null)[]; alpha: (number | null)[] | null } {
434
+ const { target, dialect, n, notes, budget } = cx;
435
+ const kind = STYLE_PROPERTIES[target].get(property);
436
+ const col = new Array<StyleValue | null>(n).fill(null);
437
+ let alpha: (number | null)[] | null = null;
438
+ for (let i = 0; i < n && i < raws.length; i++) {
439
+ const site: CanonSite = { notes, target, property, element: i, budget };
440
+ const v = firstItem(raws[i], site);
441
+ if (v === null || v === undefined) {
442
+ continue;
443
+ }
444
+ if (kind !== "color") {
445
+ col[i] = canonValue(kind, property, v, dialect, site);
446
+ continue;
447
+ }
448
+ const c = canonColor(v, dialect, site, { use: colorUse(target, property) });
449
+ col[i] = c?.color ?? null;
450
+ if (c !== null && c.alpha < 1) {
451
+ alpha ??= new Array<number | null>(n).fill(null);
452
+ alpha[i] = c.alpha;
453
+ }
454
+ }
455
+ return { col, alpha };
456
+ }
457
+
458
+ /**
459
+ * A raw value, a list read as its first item (a longer list noted).
460
+ * @param v - the raw value
461
+ * @param site - where it was read
462
+ * @returns the value
463
+ */
464
+ function firstItem(v: unknown, site: CanonSite): unknown {
465
+ if (!Array.isArray(v)) {
466
+ return v;
467
+ }
468
+ if (v.length > 1) {
469
+ site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, { sample: v, element: site.element });
470
+ }
471
+ return v.length === 0 ? null : v[0];
472
+ }
473
+
474
+ /**
475
+ * Moves a color property's alphas into its opacity (multiplied with an opacity the file also states), or drops them
476
+ * with a note where the property has none.
477
+ * @param cx - the target being read
478
+ * @param out - the canonical values, changed in place
479
+ * @param property - the color property
480
+ * @param alpha - its alphas
481
+ */
482
+ function moveAlpha(
483
+ cx: CanonContext,
484
+ out: Record<string, (StyleValue | null)[]>,
485
+ property: string,
486
+ alpha: readonly (number | null)[],
487
+ ): void {
488
+ const { target, n, notes, budget } = cx;
489
+ const carrier = OPACITY_OF.get(`${target}.${property}`) ?? null;
490
+ let opacity: (StyleValue | null)[] | null = null;
491
+ if (carrier !== null) {
492
+ out[carrier] ??= new Array<StyleValue | null>(n).fill(null);
493
+ opacity = out[carrier];
494
+ }
495
+ for (let i = 0; i < n; i++) {
496
+ const a = alpha[i];
497
+ if (a === null) {
498
+ continue;
499
+ }
500
+ const site: CanonSite = { notes, target, property, element: i, budget };
501
+ const stated = opacity === null ? null : (opacity[i] as number | null);
502
+ const merged = colorOpacity(
503
+ { color: out[property][i] as `#${string}`, alpha: a },
504
+ stated,
505
+ site,
506
+ opacity !== null,
507
+ );
508
+ if (opacity !== null) {
509
+ opacity[i] = merged;
510
+ }
511
+ }
512
+ }
513
+
514
+ /** The opacity property that carries a color's alpha: a node's fill and an edge's line. */
515
+ const OPACITY_OF: ReadonlyMap<string, string> = new Map([
516
+ ["node.fill", "fillOpacity"],
517
+ ["edge.color", "opacity"],
518
+ ]);
519
+
520
+ /**
521
+ * How a color is drawn, which decides how a Graphviz color list is read.
522
+ * @param target - nodes or edges
523
+ * @param property - the property
524
+ * @returns the use
525
+ */
526
+ function colorUse(target: StyleTarget, property: string): "fill" | "edge" | "line" {
527
+ if (property === "fill") {
528
+ return "fill";
529
+ }
530
+ return target === "edge" && property === "color" ? "edge" : "line";
531
+ }
532
+
533
+ /**
534
+ * The canonical value of a property that is not a color.
535
+ * @param kind - the property's value kind, or undefined for a property outside the vocabulary
536
+ * @param property - the property
537
+ * @param raw - the raw value
538
+ * @param dialect - how it is spelled
539
+ * @param site - where it was read
540
+ * @returns the value, or null
541
+ */
542
+ function canonValue(
543
+ kind: string | undefined,
544
+ property: string,
545
+ raw: unknown,
546
+ dialect: StyleDialect,
547
+ site: CanonSite,
548
+ ): StyleValue | null {
549
+ switch (kind) {
550
+ case "number":
551
+ return canonNumber(
552
+ raw,
553
+ site,
554
+ dialect === "graphviz" && (property === "width" || property === "height") ? DOT_POINTS_PER_INCH : 1,
555
+ );
556
+ case "opacity":
557
+ return canonOpacity(raw, dialect, site);
558
+ case "boolean":
559
+ return canonBoolean(raw, site);
560
+ case "text":
561
+ return canonText(raw, site);
562
+ case undefined:
563
+ // a property only one consumer draws (graphty:<channel>) is carried as it is
564
+ return typeof raw === "string" ||
565
+ typeof raw === "boolean" ||
566
+ (typeof raw === "number" && Number.isFinite(raw))
567
+ ? raw
568
+ : null;
569
+ default:
570
+ return ENUM_KINDS.has(kind) ? canonEnum(kind as StyleEnumKind, raw, dialect, site) : null;
571
+ }
572
+ }
573
+
574
+ /** The style roles and the property each sets, per target; `size` sets a node's width and height. */
575
+ const ROLE_PROPERTIES: Readonly<Record<StyleTarget, readonly (readonly [string, readonly string[]])[]>> = {
576
+ node: [
577
+ ["color", ["fill"]],
578
+ ["size", ["width", "height"]],
579
+ ["shape", ["shape"]],
580
+ ["hidden", ["visible"]],
581
+ ],
582
+ edge: [
583
+ ["color", ["color"]],
584
+ ["thickness", ["width"]],
585
+ ["shape", ["lineStyle"]],
586
+ ["hidden", ["visible"]],
587
+ ],
588
+ };
589
+
590
+ /**
591
+ * The generic reader: the styles of the columns whose role is `color`, `size`, `shape`, `thickness` or `hidden`, so a
592
+ * format that tags its style columns needs no reader of its own. A color column holds CSS text or channel numbers
593
+ * (0..1 in a float column, 0..255 otherwise, with an optional alpha); a hidden column holds booleans.
594
+ * @param snapshot - the graph
595
+ * @param dialect - how text values are spelled (the format's name; CSS for a format with no dialect of its own)
596
+ * @param notes - where problems are noted
597
+ * @param budget - the work budget
598
+ * @returns the canonical values, or null when no column has a style role
599
+ */
600
+ function roleStyles(
601
+ snapshot: GraphSnapshot,
602
+ dialect: StyleDialect,
603
+ notes: StyleNotes,
604
+ budget: StyleBudget,
605
+ ): StyleTruth | null {
606
+ const raw = { node: [] as string[], edge: [] as string[] };
607
+ const out = { node: { values: {} } as ReaderOutput, edge: { values: {} } as ReaderOutput };
608
+ for (const target of TARGETS) {
609
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
610
+ const n = count(snapshot, target);
611
+ const columns = new Map<string, readonly unknown[]>();
612
+ for (const [role, properties] of ROLE_PROPERTIES[target]) {
613
+ const col = table.byRole(role);
614
+ if (col === null) {
615
+ continue;
616
+ }
617
+ raw[target].push(col.meta.name);
618
+ const vals = roleValues(table, col.meta, role, n);
619
+ for (const p of properties) {
620
+ columns.set(p, vals);
621
+ }
622
+ }
623
+ out[target] = { values: canonicalize(target, columns, dialect, n, notes, budget) };
624
+ }
625
+ if (raw.node.length === 0 && raw.edge.length === 0) {
626
+ return null;
627
+ }
628
+ return {
629
+ dialect,
630
+ tool: null,
631
+ units: styleLengthUnit(dialect),
632
+ graph: {},
633
+ node: out.node,
634
+ edge: out.edge,
635
+ raw,
636
+ notes: [],
637
+ };
638
+ }
639
+
640
+ /**
641
+ * A role column's raw values: a color as text, a hidden flag as the visibility it says the opposite of.
642
+ * @param table - the node or edge table
643
+ * @param meta - the column's name and dtype
644
+ * @param meta.name - the column's name
645
+ * @param meta.dtype - its dtype
646
+ * @param role - its role
647
+ * @param n - the element count
648
+ * @returns the values
649
+ */
650
+ function roleValues(
651
+ table: GraphSnapshot["nodes"],
652
+ meta: { readonly name: string; readonly dtype: string },
653
+ role: string,
654
+ n: number,
655
+ ): unknown[] {
656
+ return Array.from({ length: n }, (_, i) => {
657
+ const v = plainCell(table.value(meta.name, i));
658
+ if (role === "color") {
659
+ return channelsColor(v, meta.dtype);
660
+ }
661
+ if (role === "hidden") {
662
+ return typeof v === "boolean" ? !v : null;
663
+ }
664
+ return v;
665
+ });
666
+ }
667
+
668
+ /**
669
+ * A color cell as text: channel numbers become `rgba()` (floats 0..1, integers 0..255); text stays as it is.
670
+ * @param v - the cell
671
+ * @param dtype - the column's dtype
672
+ * @returns the color's text, or the cell unchanged
673
+ */
674
+ function channelsColor(v: unknown, dtype: string): unknown {
675
+ if (
676
+ !Array.isArray(v) ||
677
+ (v.length !== 3 && v.length !== 4) ||
678
+ !v.every((x) => typeof x === "number" && Number.isFinite(x))
679
+ ) {
680
+ return v;
681
+ }
682
+ const scale = dtype === "f32" || dtype === "f64" ? 255 : 1;
683
+ const [r, g, b] = (v as number[]).map((x) => Math.round(x * scale));
684
+ const alphaScale = scale === 255 ? 1 : 255;
685
+ const a = v.length === 4 ? (v[3] as number) / alphaScale : 1;
686
+ return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${String(a)})`;
687
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Reading and writing styles through the importer and exporter contracts: the `graphty.styles` block, the generic
3
+ * reader of style roles, and what an exporter receives when styles are written.
4
+ */
5
+
6
+ export {
7
+ blockStyles,
8
+ MAX_STYLE_BLOCK_LENGTH,
9
+ type ParsedStyleBlock,
10
+ parseStyleBlock,
11
+ STYLE_BLOCK_NAME,
12
+ type StyleBlock,
13
+ styleTag,
14
+ writeStyleBlock,
15
+ type WriteStyleBlockOptions,
16
+ } from "./block.js";
17
+ export { extractStyles, type ExtractStylesOptions, type StyleImportOptions } from "./generic.js";
18
+ export { type ExporterStyleInput, type ExporterStyleOptions } from "./writer.js";