@graphty/graph-io 0.3.42 → 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-CpRyHZ3H.js → exporter-quPUCBiC.js} +1807 -288
  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 +295 -414
  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 +23 -7
  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 +441 -265
  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 +30 -13
  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 +543 -323
  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-CpRyHZ3H.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,879 @@
1
+ /**
2
+ * Cytoscape.js's property values: the properties graph-io carries, how Cytoscape.js 3.34 parses each value
3
+ * (`style.parse`), the `data()` and `mapData()` mappers and how they evaluate per element, and the neutral value
4
+ * each parsed value is drawn as.
5
+ *
6
+ * What Cytoscape.js does and this module repeats:
7
+ * - a number property takes `px`, `em` or no unit; a value with any other suffix is read with `parseFloat`, so
8
+ * `width: 50%` draws 50 pixels wide. Unitless properties (opacities, `arrow-scale`) are read with `parseFloat`.
9
+ * - a color is a name, `#rgb`, `#rrggbb`, `rgb()`, `rgba()`, `hsl()` or `hsla()` with Cytoscape.js's own limits; its
10
+ * alpha is never drawn (the opacity properties are).
11
+ * - `mapData(field, a, b, x, y)` maps a numeric field linearly from [a, b] to [x, y], clamped at the ends; a reversed
12
+ * range runs backwards, a zero range gives x, equal x and y make it the constant x. A color is interpolated per
13
+ * channel and rounded.
14
+ * - a mapper that fails for an element (no field, a value the property refuses, a non-number for `mapData`) resets the
15
+ * property to its Cytoscape.js default, whatever the rules beneath say.
16
+ */
17
+
18
+ import { CSS_COLORS } from "../canon/color-tables.js";
19
+ import { canonEnum } from "../canon/enums.js";
20
+ import { num6 } from "../canon/number.js";
21
+ import type { CanonSite } from "../canon/site.js";
22
+ import { STYLE_ISSUE } from "../codes.js";
23
+ import type { StyleTarget, StyleValue } from "../types.js";
24
+
25
+ /** How Cytoscape.js types a property's value. */
26
+ export type CyjsValueType =
27
+ "color" | "zeroOne" | "size" | "nodeSize" | "positive" | "text" | "fontFamily" | "fontWeight" | "enum";
28
+
29
+ /** One property graph-io carries: the neutral property it sets (or a part it combines) and how it is parsed. */
30
+ export interface CyjsPropertySpec {
31
+ /** The neutral property, or `_valign`, `_halign`, `_visibility`, `_display` for the parts combined afterward. */
32
+ readonly property: string;
33
+ /** The value type. */
34
+ readonly type: CyjsValueType;
35
+ /** The allowed values of an enumeration. */
36
+ readonly enums?: readonly (string | number)[];
37
+ }
38
+
39
+ const NODE_SHAPES = [
40
+ "rectangle",
41
+ "roundrectangle",
42
+ "round-rectangle",
43
+ "cutrectangle",
44
+ "cut-rectangle",
45
+ "bottomroundrectangle",
46
+ "bottom-round-rectangle",
47
+ "barrel",
48
+ "ellipse",
49
+ "triangle",
50
+ "round-triangle",
51
+ "square",
52
+ "pentagon",
53
+ "round-pentagon",
54
+ "hexagon",
55
+ "round-hexagon",
56
+ "concavehexagon",
57
+ "concave-hexagon",
58
+ "heptagon",
59
+ "round-heptagon",
60
+ "octagon",
61
+ "round-octagon",
62
+ "tag",
63
+ "round-tag",
64
+ "star",
65
+ "diamond",
66
+ "round-diamond",
67
+ "vee",
68
+ "rhomboid",
69
+ "right-rhomboid",
70
+ "polygon",
71
+ ];
72
+ const ARROWS = [
73
+ "tee",
74
+ "triangle",
75
+ "triangle-tee",
76
+ "circle-triangle",
77
+ "triangle-cross",
78
+ "triangle-backcurve",
79
+ "vee",
80
+ "square",
81
+ "circle",
82
+ "diamond",
83
+ "chevron",
84
+ "none",
85
+ ];
86
+ const FONT_WEIGHTS: readonly (string | number)[] = [
87
+ "normal",
88
+ "bold",
89
+ "bolder",
90
+ "lighter",
91
+ "100",
92
+ "200",
93
+ "300",
94
+ "400",
95
+ "500",
96
+ "600",
97
+ "800",
98
+ "900",
99
+ 100,
100
+ 200,
101
+ 300,
102
+ 400,
103
+ 500,
104
+ 600,
105
+ 700,
106
+ 800,
107
+ 900,
108
+ ];
109
+ const CURVES = [
110
+ "bezier",
111
+ "unbundled-bezier",
112
+ "haystack",
113
+ "segments",
114
+ "straight",
115
+ "straight-triangle",
116
+ "taxi",
117
+ "round-segments",
118
+ "round-taxi",
119
+ ];
120
+ /** The curve styles Cytoscape.js draws as straight lines or straight pieces: only the beziers bow. */
121
+ const STRAIGHT: ReadonlySet<string> = new Set([
122
+ "haystack",
123
+ "straight",
124
+ "straight-triangle",
125
+ "segments",
126
+ "taxi",
127
+ "round-segments",
128
+ "round-taxi",
129
+ ]);
130
+
131
+ const LABEL: [string, CyjsPropertySpec][] = [
132
+ ["label", { property: "label", type: "text" }],
133
+ ["color", { property: "labelColor", type: "color" }],
134
+ ["font-size", { property: "labelSize", type: "size" }],
135
+ ["font-family", { property: "labelFont", type: "fontFamily" }],
136
+ ["font-weight", { property: "labelWeight", type: "fontWeight" }],
137
+ ["font-style", { property: "labelItalic", type: "enum", enums: ["italic", "normal", "oblique"] }],
138
+ ["visibility", { property: "_visibility", type: "enum", enums: ["hidden", "visible"] }],
139
+ ["display", { property: "_display", type: "enum", enums: ["element", "none"] }],
140
+ ["opacity", { property: "opacity", type: "zeroOne" }],
141
+ ];
142
+
143
+ /** The node properties graph-io carries, by Cytoscape.js name. */
144
+ export const CYJS_NODE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new Map<string, CyjsPropertySpec>([
145
+ ["background-color", { property: "fill", type: "color" }],
146
+ ["background-opacity", { property: "fillOpacity", type: "zeroOne" }],
147
+ ["border-color", { property: "borderColor", type: "color" }],
148
+ ["border-width", { property: "borderWidth", type: "size" }],
149
+ ["border-style", { property: "borderStyle", type: "enum", enums: ["solid", "dotted", "dashed", "double"] }],
150
+ ["shape", { property: "shape", type: "enum", enums: NODE_SHAPES }],
151
+ ["corner-radius", { property: "cornerRadius", type: "size" }],
152
+ ["width", { property: "width", type: "nodeSize" }],
153
+ ["height", { property: "height", type: "nodeSize" }],
154
+ [
155
+ "text-valign",
156
+ { property: "_valign", type: "enum", enums: ["top", "top-inside", "center", "bottom", "bottom-inside"] },
157
+ ],
158
+ [
159
+ "text-halign",
160
+ { property: "_halign", type: "enum", enums: ["left", "left-inside", "center", "right", "right-inside"] },
161
+ ],
162
+ ...LABEL,
163
+ ]);
164
+
165
+ /** The edge properties graph-io carries, by Cytoscape.js name. */
166
+ export const CYJS_EDGE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new Map<string, CyjsPropertySpec>([
167
+ ["line-color", { property: "color", type: "color" }],
168
+ ["width", { property: "width", type: "nodeSize" }],
169
+ ["line-style", { property: "lineStyle", type: "enum", enums: ["solid", "dotted", "dashed"] }],
170
+ ["target-arrow-shape", { property: "targetArrow", type: "enum", enums: ARROWS }],
171
+ ["source-arrow-shape", { property: "sourceArrow", type: "enum", enums: ARROWS }],
172
+ ["target-arrow-color", { property: "targetArrowColor", type: "color" }],
173
+ ["source-arrow-color", { property: "sourceArrowColor", type: "color" }],
174
+ ["curve-style", { property: "curved", type: "enum", enums: CURVES }],
175
+ ["arrow-scale", { property: "arrowSize", type: "positive" }],
176
+ ["source-label", { property: "sourceLabel", type: "text" }],
177
+ ["target-label", { property: "targetLabel", type: "text" }],
178
+ ...LABEL,
179
+ ]);
180
+
181
+ /**
182
+ * The carried properties of a target.
183
+ * @param target - nodes or edges
184
+ * @returns Cytoscape.js name to its spec
185
+ */
186
+ export function cyjsProperties(target: StyleTarget): ReadonlyMap<string, CyjsPropertySpec> {
187
+ return target === "node" ? CYJS_NODE_PROPERTIES : CYJS_EDGE_PROPERTIES;
188
+ }
189
+
190
+ /**
191
+ * A property name in Cytoscape.js's dash form, aliases resolved (`backgroundColor` and `content` are read as
192
+ * `background-color` and `label`).
193
+ * @param name - the name as written
194
+ * @returns the dash-form name
195
+ */
196
+ export function cyjsPropertyName(name: string): string {
197
+ const dashed = name.replaceAll(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
198
+ return dashed === "content" ? "label" : dashed;
199
+ }
200
+
201
+ /** A parsed value, ready to draw. */
202
+ export type CyjsFlat =
203
+ | {
204
+ /** A color. */
205
+ readonly kind: "color";
206
+ /** Red, green, blue (0..255, possibly NaN for a malformed hex digit Cytoscape.js accepts). */
207
+ readonly rgb: readonly [number, number, number];
208
+ /** `rgb(r,g,b)`, as Cytoscape.js writes it. */
209
+ readonly str: string;
210
+ }
211
+ | {
212
+ /** A number. */
213
+ readonly kind: "number";
214
+ /** The number in its unit. */
215
+ readonly value: number;
216
+ /** `px`, `em`, or null for a value read with `parseFloat` past an unknown suffix. */
217
+ readonly units: "px" | "em" | null;
218
+ /** As Cytoscape.js writes it. */
219
+ readonly str: string;
220
+ }
221
+ | {
222
+ /** An enumeration value or a text. */
223
+ readonly kind: "word";
224
+ /** The value. */
225
+ readonly value: string | number;
226
+ /** As Cytoscape.js writes it. */
227
+ readonly str: string;
228
+ };
229
+
230
+ /** A parsed property value: a flat value or a mapper. */
231
+ export type CyjsParsed =
232
+ | CyjsFlat
233
+ | {
234
+ /** `data(field)`. */
235
+ readonly kind: "data";
236
+ /** The field, a dotted path. */
237
+ readonly field: string;
238
+ }
239
+ | {
240
+ /** `mapData(field, fieldMin, fieldMax, valueMin, valueMax)`. */
241
+ readonly kind: "mapData";
242
+ /** The field, a dotted path. */
243
+ readonly field: string;
244
+ /** The start of the input range. */
245
+ readonly fieldMin: number;
246
+ /** The end of the input range. */
247
+ readonly fieldMax: number;
248
+ /** The value at the start. */
249
+ readonly min: CyjsFlat;
250
+ /** The value at the end. */
251
+ readonly max: CyjsFlat;
252
+ }
253
+ | {
254
+ /** A function, from a live core's stylesheet. */
255
+ readonly kind: "fn";
256
+ };
257
+
258
+ /** Where a value is parsed: a stylesheet rule, an element's own `style` (a bypass), or a mapper's per-element value. */
259
+ type CyjsParseMode = "rule" | "bypass" | "flat";
260
+
261
+ /** Thrown by Cytoscape.js itself: a color given as a number makes its parser call `toLowerCase` on a number. */
262
+ export const CYJS_THROWS = "throws";
263
+
264
+ const NUM = String.raw`[-+]?(?:(?:\d+|\d*\.\d+)(?:[Ee][+-]?\d+)?)`;
265
+ const NUMBER_UNITS = new RegExp(`^(${NUM})(px|em)?$`);
266
+ const NUMBER_ONLY = new RegExp(String.raw`^\s*${NUM}\s*$`);
267
+ const RGBA = new RegExp(
268
+ String.raw`^rgb[a]?\((${NUM}[%]?)\s*,\s*(${NUM}[%]?)\s*,\s*(${NUM}[%]?)(?:\s*,\s*(${NUM}))?\)$`,
269
+ );
270
+ const HSLA = new RegExp(String.raw`^hsl[a]?\((${NUM})\s*,\s*(${NUM}[%])\s*,\s*(${NUM}[%])(?:\s*,\s*(${NUM}))?\)$`);
271
+ const MAP_ARG = new RegExp(
272
+ String.raw`^(?:${NUM}|\w+|rgb[a]?\((?:${NUM}[%]?)\s*,\s*(?:${NUM}[%]?)\s*,\s*(?:${NUM}[%]?)(?:\s*,\s*(?:${NUM}))?\)` +
273
+ String.raw`|hsl[a]?\((?:${NUM})\s*,\s*(?:${NUM}[%])\s*,\s*(?:${NUM}[%])(?:\s*,\s*(?:${NUM}))?\)` +
274
+ String.raw`|\#[0-9a-fA-F]{3}|\#[0-9a-fA-F]{6})$`,
275
+ );
276
+ const FIELD = /^[\w.]+$/;
277
+ const WORD_FONT = /^[\w\- "]$/;
278
+
279
+ /**
280
+ * Cytoscape.js's color names: the CSS names without `rebeccapurple`, plus `transparent` (black with no alpha).
281
+ * @param name - the lowercased name
282
+ * @returns `#rrggbb`, or undefined
283
+ */
284
+ function namedColor(name: string): string | undefined {
285
+ if (name === "transparent") {
286
+ return "#000000";
287
+ }
288
+ return name === "rebeccapurple" ? undefined : CSS_COLORS.get(name);
289
+ }
290
+
291
+ /**
292
+ * A color as Cytoscape.js reads it (`color2tuple`).
293
+ * @param value - the trimmed text
294
+ * @returns red, green and blue, or null when Cytoscape.js refuses it
295
+ */
296
+ function colorTuple(value: string): [number, number, number] | null {
297
+ const named = namedColor(value.toLowerCase());
298
+ if (named !== undefined) {
299
+ return [
300
+ Number.parseInt(named.slice(1, 3), 16),
301
+ Number.parseInt(named.slice(3, 5), 16),
302
+ Number.parseInt(named.slice(5, 7), 16),
303
+ ];
304
+ }
305
+ if ((value.length === 4 || value.length === 7) && value.startsWith("#")) {
306
+ const short = value.length === 4;
307
+ const pair = (k: number): number =>
308
+ Number.parseInt(short ? value[k] + value[k] : value.slice(2 * k - 1, 2 * k + 1), 16);
309
+ return [pair(1), pair(2), pair(3)];
310
+ }
311
+ const m = RGBA.exec(value);
312
+ return m === null ? hslTuple(value) : rgbaTuple(m);
313
+ }
314
+
315
+ /**
316
+ * `rgb()` and `rgba()` as Cytoscape.js reads them: channels all numbers or all percentages, within 0..255, and an
317
+ * alpha within 0..1.
318
+ * @param m - the match of the pattern
319
+ * @returns red, green and blue, or null
320
+ */
321
+ function rgbaTuple(m: RegExpExecArray): [number, number, number] | null {
322
+ const pct = [1, 2, 3].map((k) => m[k].endsWith("%"));
323
+ if (pct.some(Boolean) && !pct.every(Boolean)) {
324
+ return null;
325
+ }
326
+ const channels = [1, 2, 3].map((k) => {
327
+ const c = Number.parseFloat(m[k]);
328
+ return pct[k - 1] ? (c / 100) * 255 : c;
329
+ });
330
+ if (channels.some((c) => c < 0 || c > 255)) {
331
+ return null;
332
+ }
333
+ const alpha = m.at(4);
334
+ if (alpha !== undefined && (Number.parseFloat(alpha) < 0 || Number.parseFloat(alpha) > 1)) {
335
+ return null;
336
+ }
337
+ return [Math.floor(channels[0]), Math.floor(channels[1]), Math.floor(channels[2])];
338
+ }
339
+
340
+ /**
341
+ * `hsl()` and `hsla()` as Cytoscape.js reads them.
342
+ * @param value - the trimmed text
343
+ * @returns red, green and blue, or null
344
+ */
345
+ function hslTuple(value: string): [number, number, number] | null {
346
+ const m = HSLA.exec(value);
347
+ if (m === null) {
348
+ return null;
349
+ }
350
+ let h = Number.parseInt(m[1], 10);
351
+ if (h < 0) {
352
+ h = (360 - ((-1 * h) % 360)) % 360;
353
+ } else if (h > 360) {
354
+ h = h % 360;
355
+ }
356
+ h /= 360;
357
+ const s = Number.parseFloat(m[2]);
358
+ const l = Number.parseFloat(m[3]);
359
+ if (s < 0 || s > 100 || l < 0 || l > 100) {
360
+ return null;
361
+ }
362
+ const alpha = m.at(4);
363
+ if (alpha !== undefined && (Number.parseFloat(alpha) < 0 || Number.parseFloat(alpha) > 1)) {
364
+ return null;
365
+ }
366
+ const sn = s / 100;
367
+ const ln = l / 100;
368
+ if (sn === 0) {
369
+ const g = Math.round(ln * 255);
370
+ return [g, g, g];
371
+ }
372
+ const hue = (p: number, q: number, t0: number): number => {
373
+ let t = t0;
374
+ if (t < 0) {
375
+ t += 1;
376
+ }
377
+ if (t > 1) {
378
+ t -= 1;
379
+ }
380
+ if (t < 1 / 6) {
381
+ return p + (q - p) * 6 * t;
382
+ }
383
+ if (t < 1 / 2) {
384
+ return q;
385
+ }
386
+ if (t < 2 / 3) {
387
+ return p + (q - p) * (2 / 3 - t) * 6;
388
+ }
389
+ return p;
390
+ };
391
+ const q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn;
392
+ const p = 2 * ln - q;
393
+ return [
394
+ Math.round(255 * hue(p, q, h + 1 / 3)),
395
+ Math.round(255 * hue(p, q, h)),
396
+ Math.round(255 * hue(p, q, h - 1 / 3)),
397
+ ];
398
+ }
399
+
400
+ /**
401
+ * Whether a value matches Cytoscape.js's font family pattern `^([\w- "]+(?:\s*,\s*[\w- "]+)*)$`, checked part by
402
+ * part in one pass instead of with the backtracking pattern: items of word characters, `-`, space and `"`, joined
403
+ * by commas with any whitespace around them.
404
+ * @param value - the text
405
+ * @returns true when Cytoscape.js accepts it
406
+ */
407
+ export function isFontFamily(value: string): boolean {
408
+ const parts = value.split(",");
409
+ if (parts.length === 1) {
410
+ return parts[0].length > 0 && allOf(parts[0], isFontChar);
411
+ }
412
+ return (
413
+ firstFontPart(parts[0]) &&
414
+ lastFontPart(parts.at(-1) ?? "") &&
415
+ parts.slice(1, -1).every((part) => middleFontPart(part))
416
+ );
417
+ }
418
+
419
+ /**
420
+ * Whether a character may be part of a font family item: a word character, `-`, space or `"`.
421
+ * @param c - the character
422
+ * @returns true when it may
423
+ */
424
+ function isFontChar(c: string): boolean {
425
+ return WORD_FONT.test(c);
426
+ }
427
+
428
+ /**
429
+ * Whether a character is whitespace.
430
+ * @param c - the character
431
+ * @returns true for whitespace
432
+ */
433
+ function isSpace(c: string): boolean {
434
+ return /\s/.test(c);
435
+ }
436
+
437
+ /**
438
+ * Whether every character of a text passes a test.
439
+ * @param text - the text
440
+ * @param test - the test
441
+ * @returns true when all do (and for an empty text)
442
+ */
443
+ function allOf(text: string, test: (c: string) => boolean): boolean {
444
+ return Array.from(text).every(test);
445
+ }
446
+
447
+ /**
448
+ * The part before the first comma: an item, then whitespace before the comma.
449
+ * @param part - the part
450
+ * @returns true when it is one
451
+ */
452
+ function firstFontPart(part: string): boolean {
453
+ let a = 0;
454
+ while (a < part.length && isFontChar(part[a])) {
455
+ a++;
456
+ }
457
+ return a > 0 && allOf(part.slice(a), isSpace);
458
+ }
459
+
460
+ /**
461
+ * The part after the last comma: whitespace after the comma, then an item to the end.
462
+ * @param part - the part
463
+ * @returns true when it is one
464
+ */
465
+ function lastFontPart(part: string): boolean {
466
+ let b = part.length;
467
+ while (b > 0 && isFontChar(part[b - 1])) {
468
+ b--;
469
+ }
470
+ return b < part.length && allOf(part.slice(0, b), isSpace);
471
+ }
472
+
473
+ /**
474
+ * A part between two commas: whitespace, an item, whitespace; a part of whitespace only holds an item when one of its
475
+ * characters is a space.
476
+ * @param part - the part
477
+ * @returns true when it is one
478
+ */
479
+ function middleFontPart(part: string): boolean {
480
+ let a = 0;
481
+ let b = part.length;
482
+ while (a < b && isSpace(part[a])) {
483
+ a++;
484
+ }
485
+ while (b > a && isSpace(part[b - 1])) {
486
+ b--;
487
+ }
488
+ return a === b ? part.includes(" ") : allOf(part.slice(a, b), isFontChar);
489
+ }
490
+
491
+ /** A flat value parsed: the value, null when Cytoscape.js refuses it, or `CYJS_THROWS` where Cytoscape.js throws. */
492
+ type FlatParse = CyjsFlat | null | typeof CYJS_THROWS;
493
+
494
+ /**
495
+ * Parses a flat value (no mappers) the way Cytoscape.js does.
496
+ * @param spec - the property
497
+ * @param raw - the value
498
+ * @param rendered - the value is one Cytoscape.js reported (`ele.style(name)`), where every enumeration is text
499
+ * @returns the parsed value, null when Cytoscape.js refuses it, or `CYJS_THROWS` where Cytoscape.js itself throws
500
+ */
501
+ function parseFlat(spec: CyjsPropertySpec, raw: unknown, rendered = false): FlatParse {
502
+ const value: unknown = typeof raw === "string" ? raw.trim() : raw;
503
+ switch (spec.type) {
504
+ case "color":
505
+ return parseColorValue(value);
506
+ case "zeroOne":
507
+ case "positive": {
508
+ const x = Number.parseFloat(String(value));
509
+ const ok = spec.type === "zeroOne" ? x >= 0 && x <= 1 : x > 0;
510
+ return ok ? { kind: "number", value: x, units: null, str: String(x) } : null;
511
+ }
512
+ case "size":
513
+ case "nodeSize":
514
+ return parseSizeValue(spec, value, raw);
515
+ case "text":
516
+ return { kind: "word", value: String(value), str: String(value) };
517
+ case "fontFamily": {
518
+ const text = String(value);
519
+ return isFontFamily(text) ? { kind: "word", value: text, str: text } : null;
520
+ }
521
+ case "fontWeight":
522
+ case "enum": {
523
+ const enums = spec.type === "fontWeight" ? FONT_WEIGHTS : (spec.enums ?? []);
524
+ const e = enums.find((x) => x === value || (rendered && String(x) === value));
525
+ return e === undefined ? null : { kind: "word", value: e, str: String(e) };
526
+ }
527
+ default:
528
+ return null;
529
+ }
530
+ }
531
+
532
+ /**
533
+ * A color as Cytoscape.js reads it: an `[r, g, b]` array as it is, else text.
534
+ * @param value - the value, trimmed
535
+ * @returns the color, null when refused, or `CYJS_THROWS` for a value that is neither
536
+ */
537
+ function parseColorValue(value: unknown): FlatParse {
538
+ if (Array.isArray(value)) {
539
+ const [r, g, b] = value as unknown[];
540
+ const t: [number, number, number] = [Number(r), Number(g), Number(b)];
541
+ return { kind: "color", rgb: t, str: `rgb(${t[0]},${t[1]},${t[2]})` };
542
+ }
543
+ if (typeof value !== "string") {
544
+ return CYJS_THROWS;
545
+ }
546
+ const t = colorTuple(value);
547
+ return t === null ? null : { kind: "color", rgb: t, str: `rgb(${t[0]},${t[1]},${t[2]})` };
548
+ }
549
+
550
+ /**
551
+ * A size as Cytoscape.js reads it: a non-negative number in `px` or `em`, a number read past an unknown suffix, and
552
+ * a node size of `label`.
553
+ * @param spec - the property
554
+ * @param value - the value, trimmed
555
+ * @param raw - the value as given
556
+ * @returns the size, or null when refused
557
+ */
558
+ function parseSizeValue(spec: CyjsPropertySpec, value: unknown, raw: unknown): CyjsFlat | null {
559
+ let units: "px" | "em" | null = "px";
560
+ let text: unknown = value;
561
+ if (typeof value === "string") {
562
+ const m = NUMBER_UNITS.exec(value);
563
+ if (m === null) {
564
+ units = null;
565
+ } else {
566
+ text = m[1];
567
+ units = m.at(2) === "em" ? "em" : "px";
568
+ }
569
+ }
570
+ const x = Number.parseFloat(String(text));
571
+ if (Number.isNaN(x)) {
572
+ return spec.type === "nodeSize" && raw === "label" ? { kind: "word", value: "label", str: "label" } : null;
573
+ }
574
+ return x < 0 ? null : { kind: "number", value: x, units, str: `${String(x)}${units ?? ""}` };
575
+ }
576
+
577
+ /**
578
+ * Splits the arguments of `mapData(...)` at the commas outside parentheses.
579
+ * @param inner - the text between the outer parentheses
580
+ * @returns the arguments
581
+ */
582
+ function splitArgs(inner: string): string[] {
583
+ const out: string[] = [];
584
+ let depth = 0;
585
+ let start = 0;
586
+ for (let i = 0; i < inner.length; i++) {
587
+ const c = inner[i];
588
+ if (c === "(") {
589
+ depth++;
590
+ } else if (c === ")") {
591
+ depth--;
592
+ } else if (c === "," && depth === 0) {
593
+ out.push(inner.slice(start, i));
594
+ start = i + 1;
595
+ }
596
+ }
597
+ out.push(inner.slice(start));
598
+ return out;
599
+ }
600
+
601
+ /**
602
+ * The text between the parentheses of `name(...)`, found by position: the name, optional whitespace, `(`, and a
603
+ * last character `)`.
604
+ * @param value - the trimmed value
605
+ * @param name - `data` or `mapData`
606
+ * @returns the inner text, or null
607
+ */
608
+ function callArgs(value: string, name: string): string | null {
609
+ if (!value.startsWith(name) || !value.endsWith(")")) {
610
+ return null;
611
+ }
612
+ let i = name.length;
613
+ while (i < value.length && /\s/.test(value[i])) {
614
+ i++;
615
+ }
616
+ return value[i] === "(" ? value.slice(i + 1, -1) : null;
617
+ }
618
+
619
+ /**
620
+ * Parses a property value the way Cytoscape.js does: a mapper in a rule, else a flat value.
621
+ * @param spec - the property
622
+ * @param raw - the value as given
623
+ * @param mode - a stylesheet rule, an element bypass, or a mapper's per-element value
624
+ * @returns the parsed value, null when Cytoscape.js refuses it, or `CYJS_THROWS`
625
+ */
626
+ export function parseCyjsValue(
627
+ spec: CyjsPropertySpec,
628
+ raw: unknown,
629
+ mode: CyjsParseMode,
630
+ ): CyjsParsed | null | typeof CYJS_THROWS {
631
+ if (raw === undefined) {
632
+ return null;
633
+ }
634
+ if (typeof raw === "function") {
635
+ return mode === "flat" ? null : { kind: "fn" };
636
+ }
637
+ const value = typeof raw === "string" ? raw.trim() : raw;
638
+ if (mode !== "flat" && typeof value === "string" && value.length >= 7 && value[1] === "a") {
639
+ const mapper = parseMapper(spec, value, mode);
640
+ if (mapper !== undefined) {
641
+ return mapper;
642
+ }
643
+ }
644
+ return parseFlat(spec, raw);
645
+ }
646
+
647
+ /**
648
+ * A `data()` or `mapData()` value.
649
+ * @param spec - the property
650
+ * @param value - the trimmed value
651
+ * @param mode - a rule or a bypass
652
+ * @returns the mapper, null when it is refused (or its constant), or undefined when the value is not a mapper
653
+ */
654
+ function parseMapper(spec: CyjsPropertySpec, value: string, mode: CyjsParseMode): CyjsParsed | null | undefined {
655
+ if (value.startsWith("d")) {
656
+ const field = callArgs(value, "data")?.trim();
657
+ if (field === undefined || !FIELD.test(field)) {
658
+ return undefined;
659
+ }
660
+ return mode === "bypass" ? null : { kind: "data", field };
661
+ }
662
+ if (!value.startsWith("m") || value.length < 10) {
663
+ return undefined;
664
+ }
665
+ return parseMapData(spec, value, mode);
666
+ }
667
+
668
+ /**
669
+ * A `mapData()` value.
670
+ * @param spec - the property
671
+ * @param value - the trimmed value, starting with `m`
672
+ * @param mode - a rule or a bypass
673
+ * @returns the mapper, null when it is refused (or its constant), or undefined when the value is not a mapper
674
+ */
675
+ function parseMapData(spec: CyjsPropertySpec, value: string, mode: CyjsParseMode): CyjsParsed | null | undefined {
676
+ const inner = callArgs(value, "mapData");
677
+ if (inner === null) {
678
+ return undefined;
679
+ }
680
+ const args = splitArgs(inner);
681
+ if (!isMapDataArgs(args)) {
682
+ return undefined;
683
+ }
684
+ if (mode === "bypass") {
685
+ return null;
686
+ }
687
+ const numeric =
688
+ spec.type === "zeroOne" || spec.type === "positive" || spec.type === "size" || spec.type === "nodeSize";
689
+ if (spec.type !== "color" && !numeric) {
690
+ return null;
691
+ }
692
+ const min = parseFlat(spec, args[3].trim());
693
+ const max = parseFlat(spec, args[4].trim());
694
+ if (min === null || max === null || min === CYJS_THROWS || max === CYJS_THROWS) {
695
+ return null;
696
+ }
697
+ if (min.str === max.str || (min.kind === "number" && max.kind === "number" && pfValue(min) === pfValue(max))) {
698
+ const constant = parseFlat(spec, min.str);
699
+ return constant === CYJS_THROWS ? null : constant;
700
+ }
701
+ return {
702
+ kind: "mapData",
703
+ field: args[0].trim(),
704
+ fieldMin: Number.parseFloat(args[1]),
705
+ fieldMax: Number.parseFloat(args[2]),
706
+ min,
707
+ max,
708
+ };
709
+ }
710
+
711
+ /**
712
+ * Whether `mapData`'s arguments have Cytoscape.js's shape: a field, two numbers and two values.
713
+ * @param args - the arguments
714
+ * @returns true when they do
715
+ */
716
+ function isMapDataArgs(args: readonly string[]): boolean {
717
+ return (
718
+ args.length === 5 &&
719
+ /^[\w.]+\s*$/.test(args[0]) &&
720
+ NUMBER_ONLY.test(args[1]) &&
721
+ NUMBER_ONLY.test(args[2]) &&
722
+ MAP_ARG.test(args[3].trim()) &&
723
+ MAP_ARG.test(args[4].replace(/^\s+/, ""))
724
+ );
725
+ }
726
+
727
+ /**
728
+ * A number's value in pixels as Cytoscape.js normalizes it in a headless core (an `em` is 1 pixel there).
729
+ * @param v - the number
730
+ * @returns the normalized value
731
+ */
732
+ function pfValue(v: CyjsFlat & { kind: "number" }): number {
733
+ return v.value;
734
+ }
735
+
736
+ /**
737
+ * A field of an element's data as a mapper reads it: the dotted path walked while each step is truthy.
738
+ * @param data - the element's data object
739
+ * @param field - the field
740
+ * @returns the value
741
+ */
742
+ function mapperField(data: unknown, field: string): unknown {
743
+ let v: unknown = data;
744
+ for (const step of field.split(".")) {
745
+ if (!v) {
746
+ break;
747
+ }
748
+ v = (v as Record<string, unknown>)[step];
749
+ }
750
+ return v;
751
+ }
752
+
753
+ /**
754
+ * Evaluates a mapper for one element the way Cytoscape.js applies it.
755
+ * @param spec - the property
756
+ * @param m - the mapper
757
+ * @param data - the element's data object
758
+ * @returns the flat value, null when the mapper fails (the property resets to its default), or `CYJS_THROWS`
759
+ */
760
+ export function applyCyjsMapper(
761
+ spec: CyjsPropertySpec,
762
+ m: CyjsParsed & { kind: "data" | "mapData" },
763
+ data: unknown,
764
+ ): FlatParse {
765
+ const v = mapperField(data, m.field);
766
+ if (v === null || v === undefined) {
767
+ return null;
768
+ }
769
+ if (m.kind === "data") {
770
+ return parseFlat(spec, v);
771
+ }
772
+ if (typeof v !== "number" || Number.isNaN(v)) {
773
+ return null;
774
+ }
775
+ const width = m.fieldMax - m.fieldMin;
776
+ const p = Math.min(1, Math.max(0, width === 0 ? 0 : (v - m.fieldMin) / width));
777
+ const { min, max } = m;
778
+ if (min.kind === "color" && max.kind === "color") {
779
+ const c = [0, 1, 2].map((k) => Math.round(min.rgb[k] + (max.rgb[k] - min.rgb[k]) * p)) as [
780
+ number,
781
+ number,
782
+ number,
783
+ ];
784
+ return { kind: "color", rgb: c, str: `rgb(${c[0]}, ${c[1]}, ${c[2]})` };
785
+ }
786
+ if (min.kind === "number" && max.kind === "number") {
787
+ return parseFlat(spec, min.value + (max.value - min.value) * p);
788
+ }
789
+ return null;
790
+ }
791
+
792
+ /**
793
+ * The neutral value a flat value is drawn as, for one property. A value Cytoscape.js draws from the page (an `em`
794
+ * size, a node sized to its label) cannot be evaluated: it is noted and undefined is returned.
795
+ * @param spec - the property
796
+ * @param v - the flat value
797
+ * @param site - where it was read
798
+ * @returns the neutral value (for the combined parts, the Cytoscape.js word), or undefined
799
+ */
800
+ export function cyjsNeutral(spec: CyjsPropertySpec, v: CyjsFlat, site: CanonSite): StyleValue | undefined {
801
+ switch (v.kind) {
802
+ case "color": {
803
+ if (v.rgb.some((c) => !Number.isFinite(c) || c < 0 || c > 255)) {
804
+ site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {
805
+ sample: v.str,
806
+ element: site.element,
807
+ });
808
+ return undefined;
809
+ }
810
+ return `#${v.rgb.map((c) => Math.round(c).toString(16).padStart(2, "0")).join("")}`;
811
+ }
812
+ case "number":
813
+ if (v.units === "em") {
814
+ site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {
815
+ sample: v.str,
816
+ element: site.element,
817
+ });
818
+ return undefined;
819
+ }
820
+ return num6(v.value);
821
+ default:
822
+ break;
823
+ }
824
+ const word = v.value;
825
+ switch (spec.property) {
826
+ case "width":
827
+ case "height":
828
+ site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, { sample: v.str, element: site.element });
829
+ return undefined;
830
+ case "label":
831
+ case "sourceLabel":
832
+ case "targetLabel":
833
+ case "labelFont":
834
+ return String(word);
835
+ case "labelItalic":
836
+ return word === "italic" || word === "oblique";
837
+ case "curved":
838
+ return !STRAIGHT.has(String(word));
839
+ case "shape":
840
+ return canonEnum("shape", String(word), "cytoscape-js", site) ?? undefined;
841
+ case "borderStyle":
842
+ return canonEnum("borderStyle", String(word), "cytoscape-js", site) ?? undefined;
843
+ case "lineStyle":
844
+ return canonEnum("lineStyle", String(word), "cytoscape-js", site) ?? undefined;
845
+ case "sourceArrow":
846
+ case "targetArrow":
847
+ return canonEnum("arrow", String(word), "cytoscape-js", site) ?? undefined;
848
+ case "labelWeight":
849
+ return canonEnum("weight", String(word), "cytoscape-js", site) ?? undefined;
850
+ default:
851
+ return word;
852
+ }
853
+ }
854
+
855
+ /**
856
+ * What a value a Cytoscape.js core reports for an element (`ele.style(name)`, always text) is drawn as.
857
+ * @param target - nodes or edges
858
+ * @param name - the Cytoscape.js property name
859
+ * @param str - the reported value
860
+ * @param site - where it was read
861
+ * @returns the neutral value (for the combined parts, the Cytoscape.js word), null when the property is not carried
862
+ * or the value does not parse, or undefined when it cannot be evaluated (noted)
863
+ */
864
+ export function cyjsRendered(
865
+ target: StyleTarget,
866
+ name: string,
867
+ str: unknown,
868
+ site: CanonSite,
869
+ ): StyleValue | null | undefined {
870
+ const spec = cyjsProperties(target).get(cyjsPropertyName(name));
871
+ if (spec === undefined || typeof str !== "string") {
872
+ return null;
873
+ }
874
+ const v = parseFlat(spec, str, true);
875
+ if (v === null || v === CYJS_THROWS) {
876
+ return null;
877
+ }
878
+ return cyjsNeutral(spec, v, site);
879
+ }