@graphty/graph-io 0.3.43 → 0.3.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/dist/chunks/approximations-DJMHdDvv.js +40 -0
  2. package/dist/chunks/approximations-DJMHdDvv.js.map +1 -0
  3. package/dist/chunks/block-CPCHkX42.js +2777 -0
  4. package/dist/chunks/block-CPCHkX42.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose--jM0yYCo.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose--jM0yYCo.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BKwqelYD.js} +6 -2
  8. package/dist/chunks/constants-BKwqelYD.js.map +1 -0
  9. package/dist/chunks/convert-BcQ8_jMo.js +59 -0
  10. package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
  11. package/dist/chunks/emit-DZy6JgdA.js +3456 -0
  12. package/dist/chunks/emit-DZy6JgdA.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-CgzxiYPg.js} +44 -21
  14. package/dist/chunks/escape-CgzxiYPg.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-BvqAXCKh.js} +196 -792
  16. package/dist/chunks/export-BvqAXCKh.js.map +1 -0
  17. package/dist/chunks/{exporter-yLxKBvLE.js → exporter--Mk9gXCJ.js} +4 -3
  18. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter--Mk9gXCJ.js.map} +1 -1
  19. package/dist/chunks/{exporter-RVtXVetw.js → exporter-C-9cgZKa.js} +1805 -287
  20. package/dist/chunks/exporter-C-9cgZKa.js.map +1 -0
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-DFqJhBnj.js} +133 -74
  22. package/dist/chunks/exporter-DFqJhBnj.js.map +1 -0
  23. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-DteVeJki.js} +22 -12
  24. package/dist/chunks/exporter-DteVeJki.js.map +1 -0
  25. package/dist/chunks/format-BpQBx8MZ.js +676 -0
  26. package/dist/chunks/format-BpQBx8MZ.js.map +1 -0
  27. package/dist/chunks/generic-BGO71QBv.js +1347 -0
  28. package/dist/chunks/generic-BGO71QBv.js.map +1 -0
  29. package/dist/chunks/{importer-C98dpSH4.js → importer-B-9Rc1zO.js} +141 -82
  30. package/dist/chunks/importer-B-9Rc1zO.js.map +1 -0
  31. package/dist/chunks/{importer-D794XUTe.js → importer-BVVR740x.js} +31 -8
  32. package/dist/chunks/importer-BVVR740x.js.map +1 -0
  33. package/dist/chunks/{importer-WrGRZb0N.js → importer-C0AjA3Ax.js} +449 -102
  34. package/dist/chunks/importer-C0AjA3Ax.js.map +1 -0
  35. package/dist/chunks/{importer-BbNb7eNg.js → importer-C7pvJe1L.js} +1398 -129
  36. package/dist/chunks/importer-C7pvJe1L.js.map +1 -0
  37. package/dist/chunks/{importer-xZ-3suY1.js → importer-ClwoVx3O.js} +791 -135
  38. package/dist/chunks/importer-ClwoVx3O.js.map +1 -0
  39. package/dist/chunks/{importer-Ht7LNg8L.js → importer-D0sC_6bO.js} +116 -296
  40. package/dist/chunks/importer-D0sC_6bO.js.map +1 -0
  41. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-EHQk1jbM.js} +617 -115
  42. package/dist/chunks/importer-EHQk1jbM.js.map +1 -0
  43. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-DJZRZ6jd.js} +123 -32
  44. package/dist/chunks/json-elements-DJZRZ6jd.js.map +1 -0
  45. package/dist/chunks/lexicon-WMsNddyU.js +509 -0
  46. package/dist/chunks/lexicon-WMsNddyU.js.map +1 -0
  47. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-G4MqRdux.js} +3 -2
  48. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-G4MqRdux.js.map} +1 -1
  49. package/dist/chunks/{records-Cu4bxYOm.js → records-CiaWZrFH.js} +2 -2
  50. package/dist/chunks/{records-Cu4bxYOm.js.map → records-CiaWZrFH.js.map} +1 -1
  51. package/dist/chunks/styles-DvoFBKCK.js +690 -0
  52. package/dist/chunks/styles-DvoFBKCK.js.map +1 -0
  53. package/dist/chunks/styles-yed-Cz9rLBCP.js +842 -0
  54. package/dist/chunks/styles-yed-Cz9rLBCP.js.map +1 -0
  55. package/dist/chunks/styles-zNTmz5R7.js +2102 -0
  56. package/dist/chunks/styles-zNTmz5R7.js.map +1 -0
  57. package/dist/chunks/{text-DHOJXnED.js → text-CzJNFOS9.js} +2 -2
  58. package/dist/chunks/{text-DHOJXnED.js.map → text-CzJNFOS9.js.map} +1 -1
  59. package/dist/chunks/units-XMZFIFe1.js +19 -0
  60. package/dist/chunks/units-XMZFIFe1.js.map +1 -0
  61. package/dist/chunks/writer-gQ8kx99H.js +448 -0
  62. package/dist/chunks/writer-gQ8kx99H.js.map +1 -0
  63. package/dist/csv.js +5 -4
  64. package/dist/csv.js.map +1 -1
  65. package/dist/cx.js +1 -1
  66. package/dist/cx2.js +2 -2
  67. package/dist/cys.js +1 -1
  68. package/dist/dot.js +5 -2
  69. package/dist/dot.js.map +1 -1
  70. package/dist/gexf.js +292 -412
  71. package/dist/gexf.js.map +1 -1
  72. package/dist/gml.js +927 -74
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +351 -236
  75. package/dist/graph-io.js.map +1 -1
  76. package/dist/graphml.js +4 -2
  77. package/dist/graphml.js.map +1 -1
  78. package/dist/json.js +1 -1
  79. package/dist/neo4j.js +4 -3
  80. package/dist/neo4j.js.map +1 -1
  81. package/dist/obo.js +1 -1
  82. package/dist/pajek.js +4 -2
  83. package/dist/positions.d.ts +1 -0
  84. package/dist/positions.js +427 -0
  85. package/dist/positions.js.map +1 -0
  86. package/dist/src/common/codes.d.ts +6 -0
  87. package/dist/src/common/codes.d.ts.map +1 -1
  88. package/dist/src/common/codes.js +6 -0
  89. package/dist/src/common/codes.js.map +1 -1
  90. package/dist/src/common/escape.d.ts.map +1 -1
  91. package/dist/src/common/escape.js +4 -2
  92. package/dist/src/common/escape.js.map +1 -1
  93. package/dist/src/common/export.d.ts +10 -0
  94. package/dist/src/common/export.d.ts.map +1 -1
  95. package/dist/src/common/export.js +123 -100
  96. package/dist/src/common/export.js.map +1 -1
  97. package/dist/src/common/input.d.ts.map +1 -1
  98. package/dist/src/common/input.js +8 -1
  99. package/dist/src/common/input.js.map +1 -1
  100. package/dist/src/common/json-elements.d.ts +12 -9
  101. package/dist/src/common/json-elements.d.ts.map +1 -1
  102. package/dist/src/common/json-elements.js +160 -37
  103. package/dist/src/common/json-elements.js.map +1 -1
  104. package/dist/src/common/notes.d.ts +42 -0
  105. package/dist/src/common/notes.d.ts.map +1 -0
  106. package/dist/src/common/notes.js +72 -0
  107. package/dist/src/common/notes.js.map +1 -0
  108. package/dist/src/common/report.d.ts +18 -0
  109. package/dist/src/common/report.d.ts.map +1 -1
  110. package/dist/src/common/report.js +36 -1
  111. package/dist/src/common/report.js.map +1 -1
  112. package/dist/src/common/units.d.ts +24 -0
  113. package/dist/src/common/units.d.ts.map +1 -0
  114. package/dist/src/common/units.js +26 -0
  115. package/dist/src/common/units.js.map +1 -0
  116. package/dist/src/common/xml.d.ts +18 -0
  117. package/dist/src/common/xml.d.ts.map +1 -1
  118. package/dist/src/common/xml.js +42 -5
  119. package/dist/src/common/xml.js.map +1 -1
  120. package/dist/src/formats/cx/exporter.d.ts +6 -0
  121. package/dist/src/formats/cx/exporter.d.ts.map +1 -1
  122. package/dist/src/formats/cx/exporter.js +71 -8
  123. package/dist/src/formats/cx/exporter.js.map +1 -1
  124. package/dist/src/formats/cx/importer.d.ts +5 -2
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +102 -72
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +102 -0
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -0
  130. package/dist/src/formats/cx/styles.js +225 -0
  131. package/dist/src/formats/cx/styles.js.map +1 -0
  132. package/dist/src/formats/cx2/exporter.d.ts +5 -0
  133. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  134. package/dist/src/formats/cx2/exporter.js +181 -71
  135. package/dist/src/formats/cx2/exporter.js.map +1 -1
  136. package/dist/src/formats/cx2/importer.d.ts +4 -1
  137. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  138. package/dist/src/formats/cx2/importer.js +19 -1
  139. package/dist/src/formats/cx2/importer.js.map +1 -1
  140. package/dist/src/formats/cx2/styles.d.ts +18 -0
  141. package/dist/src/formats/cx2/styles.d.ts.map +1 -0
  142. package/dist/src/formats/cx2/styles.js +24 -0
  143. package/dist/src/formats/cx2/styles.js.map +1 -0
  144. package/dist/src/formats/cys/constants.d.ts +2 -0
  145. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  146. package/dist/src/formats/cys/constants.js +2 -0
  147. package/dist/src/formats/cys/constants.js.map +1 -1
  148. package/dist/src/formats/cys/exporter.d.ts +6 -2
  149. package/dist/src/formats/cys/exporter.d.ts.map +1 -1
  150. package/dist/src/formats/cys/exporter.js +215 -53
  151. package/dist/src/formats/cys/exporter.js.map +1 -1
  152. package/dist/src/formats/cys/importer.d.ts +2 -1
  153. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  154. package/dist/src/formats/cys/importer.js +119 -6
  155. package/dist/src/formats/cys/importer.js.map +1 -1
  156. package/dist/src/formats/cys/session.d.ts +2 -0
  157. package/dist/src/formats/cys/session.d.ts.map +1 -1
  158. package/dist/src/formats/cys/session.js +5 -0
  159. package/dist/src/formats/cys/session.js.map +1 -1
  160. package/dist/src/formats/cys/styles.d.ts +38 -0
  161. package/dist/src/formats/cys/styles.d.ts.map +1 -0
  162. package/dist/src/formats/cys/styles.js +213 -0
  163. package/dist/src/formats/cys/styles.js.map +1 -0
  164. package/dist/src/formats/cys/tables.d.ts +8 -3
  165. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  166. package/dist/src/formats/cys/tables.js +88 -34
  167. package/dist/src/formats/cys/tables.js.map +1 -1
  168. package/dist/src/formats/dot/exporter.d.ts +2 -0
  169. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  170. package/dist/src/formats/dot/exporter.js +195 -81
  171. package/dist/src/formats/dot/exporter.js.map +1 -1
  172. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  173. package/dist/src/formats/dot/importer.js +100 -20
  174. package/dist/src/formats/dot/importer.js.map +1 -1
  175. package/dist/src/formats/dot/index.d.ts +1 -0
  176. package/dist/src/formats/dot/index.d.ts.map +1 -1
  177. package/dist/src/formats/dot/index.js +1 -0
  178. package/dist/src/formats/dot/index.js.map +1 -1
  179. package/dist/src/formats/dot/positions.d.ts +14 -0
  180. package/dist/src/formats/dot/positions.d.ts.map +1 -0
  181. package/dist/src/formats/dot/positions.js +70 -0
  182. package/dist/src/formats/dot/positions.js.map +1 -0
  183. package/dist/src/formats/dot/styles.d.ts +82 -0
  184. package/dist/src/formats/dot/styles.d.ts.map +1 -0
  185. package/dist/src/formats/dot/styles.js +1496 -0
  186. package/dist/src/formats/dot/styles.js.map +1 -0
  187. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  188. package/dist/src/formats/gexf/exporter.js +20 -5
  189. package/dist/src/formats/gexf/exporter.js.map +1 -1
  190. package/dist/src/formats/gexf/importer.d.ts +8 -1
  191. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  192. package/dist/src/formats/gexf/importer.js +251 -131
  193. package/dist/src/formats/gexf/importer.js.map +1 -1
  194. package/dist/src/formats/gexf/index.d.ts +8 -0
  195. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  196. package/dist/src/formats/gexf/index.js +10 -2
  197. package/dist/src/formats/gexf/index.js.map +1 -1
  198. package/dist/src/formats/gexf/schema.d.ts +5 -0
  199. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  200. package/dist/src/formats/gexf/schema.js +5 -0
  201. package/dist/src/formats/gexf/schema.js.map +1 -1
  202. package/dist/src/formats/gexf/styles.d.ts +74 -0
  203. package/dist/src/formats/gexf/styles.d.ts.map +1 -0
  204. package/dist/src/formats/gexf/styles.js +604 -0
  205. package/dist/src/formats/gexf/styles.js.map +1 -0
  206. package/dist/src/formats/gml/exporter.d.ts +1 -5
  207. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  208. package/dist/src/formats/gml/exporter.js +19 -8
  209. package/dist/src/formats/gml/exporter.js.map +1 -1
  210. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  211. package/dist/src/formats/gml/importer.js +4 -0
  212. package/dist/src/formats/gml/importer.js.map +1 -1
  213. package/dist/src/formats/gml/index.d.ts +2 -1
  214. package/dist/src/formats/gml/index.d.ts.map +1 -1
  215. package/dist/src/formats/gml/index.js +2 -1
  216. package/dist/src/formats/gml/index.js.map +1 -1
  217. package/dist/src/formats/gml/positions.d.ts +14 -0
  218. package/dist/src/formats/gml/positions.d.ts.map +1 -0
  219. package/dist/src/formats/gml/positions.js +46 -0
  220. package/dist/src/formats/gml/positions.js.map +1 -0
  221. package/dist/src/formats/gml/styles.d.ts +59 -0
  222. package/dist/src/formats/gml/styles.d.ts.map +1 -0
  223. package/dist/src/formats/gml/styles.js +1056 -0
  224. package/dist/src/formats/gml/styles.js.map +1 -0
  225. package/dist/src/formats/gml/syntax.d.ts +11 -0
  226. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  227. package/dist/src/formats/gml/syntax.js +151 -62
  228. package/dist/src/formats/gml/syntax.js.map +1 -1
  229. package/dist/src/formats/graphml/constants.d.ts +4 -0
  230. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  231. package/dist/src/formats/graphml/constants.js +5 -1
  232. package/dist/src/formats/graphml/constants.js.map +1 -1
  233. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  234. package/dist/src/formats/graphml/exporter.js +133 -65
  235. package/dist/src/formats/graphml/exporter.js.map +1 -1
  236. package/dist/src/formats/graphml/importer.d.ts +4 -1
  237. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  238. package/dist/src/formats/graphml/importer.js +100 -44
  239. package/dist/src/formats/graphml/importer.js.map +1 -1
  240. package/dist/src/formats/graphml/index.d.ts +1 -0
  241. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  242. package/dist/src/formats/graphml/index.js +1 -0
  243. package/dist/src/formats/graphml/index.js.map +1 -1
  244. package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
  245. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
  246. package/dist/src/formats/graphml/styles-plain.js +187 -0
  247. package/dist/src/formats/graphml/styles-plain.js.map +1 -0
  248. package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
  249. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
  250. package/dist/src/formats/graphml/styles-yed.js +1086 -0
  251. package/dist/src/formats/graphml/styles-yed.js.map +1 -0
  252. package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
  253. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
  254. package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
  255. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
  256. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  257. package/dist/src/formats/graphml/tree.js +34 -19
  258. package/dist/src/formats/graphml/tree.js.map +1 -1
  259. package/dist/src/formats/graphml/yfiles.d.ts +16 -2
  260. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  261. package/dist/src/formats/graphml/yfiles.js +83 -12
  262. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  263. package/dist/src/formats/json/exporter.d.ts +5 -0
  264. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  265. package/dist/src/formats/json/exporter.js +68 -25
  266. package/dist/src/formats/json/exporter.js.map +1 -1
  267. package/dist/src/formats/json/importer.d.ts +22 -3
  268. package/dist/src/formats/json/importer.d.ts.map +1 -1
  269. package/dist/src/formats/json/importer.js +439 -264
  270. package/dist/src/formats/json/importer.js.map +1 -1
  271. package/dist/src/formats/json/positions.d.ts +16 -0
  272. package/dist/src/formats/json/positions.d.ts.map +1 -0
  273. package/dist/src/formats/json/positions.js +44 -0
  274. package/dist/src/formats/json/positions.js.map +1 -0
  275. package/dist/src/formats/json/styles.d.ts +102 -0
  276. package/dist/src/formats/json/styles.d.ts.map +1 -0
  277. package/dist/src/formats/json/styles.js +1753 -0
  278. package/dist/src/formats/json/styles.js.map +1 -0
  279. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  280. package/dist/src/formats/neo4j/exporter.js +2 -1
  281. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  282. package/dist/src/formats/pajek/exporter.d.ts +2 -0
  283. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/pajek/exporter.js +142 -76
  285. package/dist/src/formats/pajek/exporter.js.map +1 -1
  286. package/dist/src/formats/pajek/importer.d.ts +4 -0
  287. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  288. package/dist/src/formats/pajek/importer.js +60 -6
  289. package/dist/src/formats/pajek/importer.js.map +1 -1
  290. package/dist/src/formats/pajek/index.d.ts +2 -0
  291. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  292. package/dist/src/formats/pajek/index.js +2 -0
  293. package/dist/src/formats/pajek/index.js.map +1 -1
  294. package/dist/src/formats/pajek/styles.d.ts +50 -0
  295. package/dist/src/formats/pajek/styles.d.ts.map +1 -0
  296. package/dist/src/formats/pajek/styles.js +569 -0
  297. package/dist/src/formats/pajek/styles.js.map +1 -0
  298. package/dist/src/formats/pajek/syntax.d.ts +6 -0
  299. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  300. package/dist/src/formats/pajek/syntax.js +6 -0
  301. package/dist/src/formats/pajek/syntax.js.map +1 -1
  302. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  303. package/dist/src/formats/xgmml/columns.js +34 -9
  304. package/dist/src/formats/xgmml/columns.js.map +1 -1
  305. package/dist/src/formats/xgmml/constants.d.ts +2 -0
  306. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  307. package/dist/src/formats/xgmml/constants.js +3 -1
  308. package/dist/src/formats/xgmml/constants.js.map +1 -1
  309. package/dist/src/formats/xgmml/document.d.ts +12 -8
  310. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  311. package/dist/src/formats/xgmml/document.js +56 -13
  312. package/dist/src/formats/xgmml/document.js.map +1 -1
  313. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  314. package/dist/src/formats/xgmml/emit.js +12 -6
  315. package/dist/src/formats/xgmml/emit.js.map +1 -1
  316. package/dist/src/formats/xgmml/exporter.d.ts +3 -1
  317. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  318. package/dist/src/formats/xgmml/exporter.js +22 -9
  319. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  320. package/dist/src/formats/xgmml/importer.d.ts +2 -1
  321. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  322. package/dist/src/formats/xgmml/importer.js +31 -24
  323. package/dist/src/formats/xgmml/importer.js.map +1 -1
  324. package/dist/src/formats/xgmml/styles.d.ts +104 -0
  325. package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
  326. package/dist/src/formats/xgmml/styles.js +310 -0
  327. package/dist/src/formats/xgmml/styles.js.map +1 -0
  328. package/dist/src/index.d.ts +9 -7
  329. package/dist/src/index.d.ts.map +1 -1
  330. package/dist/src/index.js +7 -7
  331. package/dist/src/index.js.map +1 -1
  332. package/dist/src/positions/codes.d.ts +31 -0
  333. package/dist/src/positions/codes.d.ts.map +1 -0
  334. package/dist/src/positions/codes.js +26 -0
  335. package/dist/src/positions/codes.js.map +1 -0
  336. package/dist/src/positions/convert.d.ts +58 -0
  337. package/dist/src/positions/convert.d.ts.map +1 -0
  338. package/dist/src/positions/convert.js +107 -0
  339. package/dist/src/positions/convert.js.map +1 -0
  340. package/dist/src/positions/extract.d.ts +27 -0
  341. package/dist/src/positions/extract.d.ts.map +1 -0
  342. package/dist/src/positions/extract.js +526 -0
  343. package/dist/src/positions/extract.js.map +1 -0
  344. package/dist/src/positions/index.d.ts +10 -0
  345. package/dist/src/positions/index.d.ts.map +1 -0
  346. package/dist/src/positions/index.js +9 -0
  347. package/dist/src/positions/index.js.map +1 -0
  348. package/dist/src/positions/types.d.ts +208 -0
  349. package/dist/src/positions/types.d.ts.map +1 -0
  350. package/dist/src/positions/types.js +10 -0
  351. package/dist/src/positions/types.js.map +1 -0
  352. package/dist/src/registry.d.ts +30 -0
  353. package/dist/src/registry.d.ts.map +1 -1
  354. package/dist/src/registry.js +130 -9
  355. package/dist/src/registry.js.map +1 -1
  356. package/dist/src/styles/annotations.d.ts +132 -0
  357. package/dist/src/styles/annotations.d.ts.map +1 -0
  358. package/dist/src/styles/annotations.js +320 -0
  359. package/dist/src/styles/annotations.js.map +1 -0
  360. package/dist/src/styles/budget.d.ts +45 -0
  361. package/dist/src/styles/budget.d.ts.map +1 -0
  362. package/dist/src/styles/budget.js +58 -0
  363. package/dist/src/styles/budget.js.map +1 -0
  364. package/dist/src/styles/canon/bends.d.ts +32 -0
  365. package/dist/src/styles/canon/bends.d.ts.map +1 -0
  366. package/dist/src/styles/canon/bends.js +74 -0
  367. package/dist/src/styles/canon/bends.js.map +1 -0
  368. package/dist/src/styles/canon/color-tables.d.ts +22 -0
  369. package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
  370. package/dist/src/styles/canon/color-tables.js +369 -0
  371. package/dist/src/styles/canon/color-tables.js.map +1 -0
  372. package/dist/src/styles/canon/color.d.ts +66 -0
  373. package/dist/src/styles/canon/color.d.ts.map +1 -0
  374. package/dist/src/styles/canon/color.js +548 -0
  375. package/dist/src/styles/canon/color.js.map +1 -0
  376. package/dist/src/styles/canon/enums.d.ts +25 -0
  377. package/dist/src/styles/canon/enums.d.ts.map +1 -0
  378. package/dist/src/styles/canon/enums.js +187 -0
  379. package/dist/src/styles/canon/enums.js.map +1 -0
  380. package/dist/src/styles/canon/graphviz.d.ts +48 -0
  381. package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
  382. package/dist/src/styles/canon/graphviz.js +160 -0
  383. package/dist/src/styles/canon/graphviz.js.map +1 -0
  384. package/dist/src/styles/canon/index.d.ts +13 -0
  385. package/dist/src/styles/canon/index.d.ts.map +1 -0
  386. package/dist/src/styles/canon/index.js +13 -0
  387. package/dist/src/styles/canon/index.js.map +1 -0
  388. package/dist/src/styles/canon/number.d.ts +59 -0
  389. package/dist/src/styles/canon/number.d.ts.map +1 -0
  390. package/dist/src/styles/canon/number.js +142 -0
  391. package/dist/src/styles/canon/number.js.map +1 -0
  392. package/dist/src/styles/canon/site.d.ts +51 -0
  393. package/dist/src/styles/canon/site.d.ts.map +1 -0
  394. package/dist/src/styles/canon/site.js +63 -0
  395. package/dist/src/styles/canon/site.js.map +1 -0
  396. package/dist/src/styles/canon/text.d.ts +61 -0
  397. package/dist/src/styles/canon/text.d.ts.map +1 -0
  398. package/dist/src/styles/canon/text.js +199 -0
  399. package/dist/src/styles/canon/text.js.map +1 -0
  400. package/dist/src/styles/codes.d.ts +95 -0
  401. package/dist/src/styles/codes.d.ts.map +1 -0
  402. package/dist/src/styles/codes.js +97 -0
  403. package/dist/src/styles/codes.js.map +1 -0
  404. package/dist/src/styles/cyjs/cascade.d.ts +134 -0
  405. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
  406. package/dist/src/styles/cyjs/cascade.js +2252 -0
  407. package/dist/src/styles/cyjs/cascade.js.map +1 -0
  408. package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
  409. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
  410. package/dist/src/styles/cyjs/defaults-table.js +76 -0
  411. package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
  412. package/dist/src/styles/cyjs/emit.d.ts +82 -0
  413. package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
  414. package/dist/src/styles/cyjs/emit.js +791 -0
  415. package/dist/src/styles/cyjs/emit.js.map +1 -0
  416. package/dist/src/styles/cyjs/index.d.ts +13 -0
  417. package/dist/src/styles/cyjs/index.d.ts.map +1 -0
  418. package/dist/src/styles/cyjs/index.js +13 -0
  419. package/dist/src/styles/cyjs/index.js.map +1 -0
  420. package/dist/src/styles/cyjs/live.d.ts +46 -0
  421. package/dist/src/styles/cyjs/live.d.ts.map +1 -0
  422. package/dist/src/styles/cyjs/live.js +108 -0
  423. package/dist/src/styles/cyjs/live.js.map +1 -0
  424. package/dist/src/styles/cyjs/mappers.d.ts +147 -0
  425. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
  426. package/dist/src/styles/cyjs/mappers.js +744 -0
  427. package/dist/src/styles/cyjs/mappers.js.map +1 -0
  428. package/dist/src/styles/cyjs/selector.d.ts +113 -0
  429. package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
  430. package/dist/src/styles/cyjs/selector.js +611 -0
  431. package/dist/src/styles/cyjs/selector.js.map +1 -0
  432. package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
  433. package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
  434. package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
  435. package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
  436. package/dist/src/styles/cytoscape/emit.d.ts +125 -0
  437. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
  438. package/dist/src/styles/cytoscape/emit.js +1025 -0
  439. package/dist/src/styles/cytoscape/emit.js.map +1 -0
  440. package/dist/src/styles/cytoscape/index.d.ts +10 -0
  441. package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
  442. package/dist/src/styles/cytoscape/index.js +10 -0
  443. package/dist/src/styles/cytoscape/index.js.map +1 -0
  444. package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
  445. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
  446. package/dist/src/styles/cytoscape/lexicon.js +605 -0
  447. package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
  448. package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
  449. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
  450. package/dist/src/styles/cytoscape/mappings.js +460 -0
  451. package/dist/src/styles/cytoscape/mappings.js.map +1 -0
  452. package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
  453. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
  454. package/dist/src/styles/cytoscape/resolve.js +381 -0
  455. package/dist/src/styles/cytoscape/resolve.js.map +1 -0
  456. package/dist/src/styles/cytoscape/translate.d.ts +50 -0
  457. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
  458. package/dist/src/styles/cytoscape/translate.js +156 -0
  459. package/dist/src/styles/cytoscape/translate.js.map +1 -0
  460. package/dist/src/styles/defaults.d.ts +90 -0
  461. package/dist/src/styles/defaults.d.ts.map +1 -0
  462. package/dist/src/styles/defaults.js +414 -0
  463. package/dist/src/styles/defaults.js.map +1 -0
  464. package/dist/src/styles/index.d.ts +15 -0
  465. package/dist/src/styles/index.d.ts.map +1 -0
  466. package/dist/src/styles/index.js +14 -0
  467. package/dist/src/styles/index.js.map +1 -0
  468. package/dist/src/styles/internal.d.ts +17 -0
  469. package/dist/src/styles/internal.d.ts.map +1 -0
  470. package/dist/src/styles/internal.js +16 -0
  471. package/dist/src/styles/internal.js.map +1 -0
  472. package/dist/src/styles/io/approximations.d.ts +24 -0
  473. package/dist/src/styles/io/approximations.d.ts.map +1 -0
  474. package/dist/src/styles/io/approximations.js +51 -0
  475. package/dist/src/styles/io/approximations.js.map +1 -0
  476. package/dist/src/styles/io/block.d.ts +166 -0
  477. package/dist/src/styles/io/block.d.ts.map +1 -0
  478. package/dist/src/styles/io/block.js +930 -0
  479. package/dist/src/styles/io/block.js.map +1 -0
  480. package/dist/src/styles/io/generic.d.ts +88 -0
  481. package/dist/src/styles/io/generic.d.ts.map +1 -0
  482. package/dist/src/styles/io/generic.js +516 -0
  483. package/dist/src/styles/io/generic.js.map +1 -0
  484. package/dist/src/styles/io/index.d.ts +8 -0
  485. package/dist/src/styles/io/index.d.ts.map +1 -0
  486. package/dist/src/styles/io/index.js +7 -0
  487. package/dist/src/styles/io/index.js.map +1 -0
  488. package/dist/src/styles/io/writer.d.ts +89 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +626 -0
  491. package/dist/src/styles/io/writer.js.map +1 -0
  492. package/dist/src/styles/notes.d.ts +47 -0
  493. package/dist/src/styles/notes.d.ts.map +1 -0
  494. package/dist/src/styles/notes.js +140 -0
  495. package/dist/src/styles/notes.js.map +1 -0
  496. package/dist/src/styles/plan/classes.d.ts +31 -0
  497. package/dist/src/styles/plan/classes.d.ts.map +1 -0
  498. package/dist/src/styles/plan/classes.js +139 -0
  499. package/dist/src/styles/plan/classes.js.map +1 -0
  500. package/dist/src/styles/plan/continuous.d.ts +32 -0
  501. package/dist/src/styles/plan/continuous.d.ts.map +1 -0
  502. package/dist/src/styles/plan/continuous.js +165 -0
  503. package/dist/src/styles/plan/continuous.js.map +1 -0
  504. package/dist/src/styles/plan/discrete.d.ts +39 -0
  505. package/dist/src/styles/plan/discrete.d.ts.map +1 -0
  506. package/dist/src/styles/plan/discrete.js +127 -0
  507. package/dist/src/styles/plan/discrete.js.map +1 -0
  508. package/dist/src/styles/plan/families.d.ts +31 -0
  509. package/dist/src/styles/plan/families.d.ts.map +1 -0
  510. package/dist/src/styles/plan/families.js +95 -0
  511. package/dist/src/styles/plan/families.js.map +1 -0
  512. package/dist/src/styles/plan/features.d.ts +58 -0
  513. package/dist/src/styles/plan/features.d.ts.map +1 -0
  514. package/dist/src/styles/plan/features.js +185 -0
  515. package/dist/src/styles/plan/features.js.map +1 -0
  516. package/dist/src/styles/plan/index.d.ts +7 -0
  517. package/dist/src/styles/plan/index.d.ts.map +1 -0
  518. package/dist/src/styles/plan/index.js +7 -0
  519. package/dist/src/styles/plan/index.js.map +1 -0
  520. package/dist/src/styles/plan/plan.d.ts +71 -0
  521. package/dist/src/styles/plan/plan.d.ts.map +1 -0
  522. package/dist/src/styles/plan/plan.js +893 -0
  523. package/dist/src/styles/plan/plan.js.map +1 -0
  524. package/dist/src/styles/plan/resolve.d.ts +137 -0
  525. package/dist/src/styles/plan/resolve.d.ts.map +1 -0
  526. package/dist/src/styles/plan/resolve.js +587 -0
  527. package/dist/src/styles/plan/resolve.js.map +1 -0
  528. package/dist/src/styles/types.d.ts +702 -0
  529. package/dist/src/styles/types.d.ts.map +1 -0
  530. package/dist/src/styles/types.js +10 -0
  531. package/dist/src/styles/types.js.map +1 -0
  532. package/dist/src/styles/vocabulary.d.ts +41 -0
  533. package/dist/src/styles/vocabulary.d.ts.map +1 -0
  534. package/dist/src/styles/vocabulary.js +140 -0
  535. package/dist/src/styles/vocabulary.js.map +1 -0
  536. package/dist/src/types.d.ts +64 -1
  537. package/dist/src/types.d.ts.map +1 -1
  538. package/dist/src/types.js.map +1 -1
  539. package/dist/styles.d.ts +1 -0
  540. package/dist/styles.js +322 -0
  541. package/dist/styles.js.map +1 -0
  542. package/dist/xgmml.js +5 -4
  543. package/dist/xgmml.js.map +1 -1
  544. package/package.json +13 -2
  545. package/src/common/codes.ts +7 -0
  546. package/src/common/escape.ts +5 -2
  547. package/src/common/export.ts +179 -140
  548. package/src/common/input.ts +8 -4
  549. package/src/common/json-elements.ts +169 -38
  550. package/src/common/notes.ts +94 -0
  551. package/src/common/report.ts +41 -1
  552. package/src/common/units.ts +42 -0
  553. package/src/common/xml.ts +45 -5
  554. package/src/formats/cx/exporter.ts +95 -11
  555. package/src/formats/cx/importer.ts +126 -90
  556. package/src/formats/cx/styles.ts +304 -0
  557. package/src/formats/cx2/exporter.ts +234 -77
  558. package/src/formats/cx2/importer.ts +19 -1
  559. package/src/formats/cx2/styles.ts +29 -0
  560. package/src/formats/cys/constants.ts +3 -0
  561. package/src/formats/cys/exporter.ts +246 -60
  562. package/src/formats/cys/importer.ts +125 -9
  563. package/src/formats/cys/session.ts +6 -0
  564. package/src/formats/cys/styles.ts +254 -0
  565. package/src/formats/cys/tables.ts +117 -48
  566. package/src/formats/dot/exporter.ts +262 -126
  567. package/src/formats/dot/importer.ts +111 -20
  568. package/src/formats/dot/index.ts +1 -0
  569. package/src/formats/dot/positions.ts +77 -0
  570. package/src/formats/dot/styles.ts +1755 -0
  571. package/src/formats/gexf/exporter.ts +27 -11
  572. package/src/formats/gexf/importer.ts +308 -158
  573. package/src/formats/gexf/index.ts +10 -0
  574. package/src/formats/gexf/schema.ts +5 -0
  575. package/src/formats/gexf/styles.ts +719 -0
  576. package/src/formats/gml/exporter.ts +33 -14
  577. package/src/formats/gml/importer.ts +4 -0
  578. package/src/formats/gml/index.ts +2 -1
  579. package/src/formats/gml/positions.ts +52 -0
  580. package/src/formats/gml/styles.ts +1248 -0
  581. package/src/formats/gml/syntax.ts +173 -62
  582. package/src/formats/graphml/constants.ts +5 -0
  583. package/src/formats/graphml/exporter.ts +163 -71
  584. package/src/formats/graphml/importer.ts +119 -45
  585. package/src/formats/graphml/index.ts +1 -0
  586. package/src/formats/graphml/styles-plain.ts +236 -0
  587. package/src/formats/graphml/styles-yed.ts +1221 -0
  588. package/src/formats/graphml/styles-yfiles3.ts +573 -0
  589. package/src/formats/graphml/tree.ts +36 -20
  590. package/src/formats/graphml/yfiles.ts +89 -13
  591. package/src/formats/json/exporter.ts +76 -26
  592. package/src/formats/json/importer.ts +541 -322
  593. package/src/formats/json/positions.ts +50 -0
  594. package/src/formats/json/styles.ts +2082 -0
  595. package/src/formats/neo4j/exporter.ts +2 -1
  596. package/src/formats/pajek/exporter.ts +195 -106
  597. package/src/formats/pajek/importer.ts +78 -9
  598. package/src/formats/pajek/index.ts +2 -0
  599. package/src/formats/pajek/styles.ts +685 -0
  600. package/src/formats/pajek/syntax.ts +7 -0
  601. package/src/formats/xgmml/columns.ts +39 -9
  602. package/src/formats/xgmml/constants.ts +3 -0
  603. package/src/formats/xgmml/document.ts +54 -12
  604. package/src/formats/xgmml/emit.ts +11 -6
  605. package/src/formats/xgmml/exporter.ts +32 -13
  606. package/src/formats/xgmml/importer.ts +43 -29
  607. package/src/formats/xgmml/styles.ts +400 -0
  608. package/src/index.ts +16 -0
  609. package/src/positions/codes.ts +32 -0
  610. package/src/positions/convert.ts +123 -0
  611. package/src/positions/extract.ts +619 -0
  612. package/src/positions/index.ts +23 -0
  613. package/src/positions/types.ts +221 -0
  614. package/src/registry.ts +179 -8
  615. package/src/styles/annotations.ts +478 -0
  616. package/src/styles/budget.ts +60 -0
  617. package/src/styles/canon/bends.ts +84 -0
  618. package/src/styles/canon/color-tables.ts +386 -0
  619. package/src/styles/canon/color.ts +624 -0
  620. package/src/styles/canon/enums.ts +211 -0
  621. package/src/styles/canon/graphviz.ts +189 -0
  622. package/src/styles/canon/index.ts +13 -0
  623. package/src/styles/canon/number.ts +152 -0
  624. package/src/styles/canon/site.ts +87 -0
  625. package/src/styles/canon/text.ts +221 -0
  626. package/src/styles/codes.ts +104 -0
  627. package/src/styles/cyjs/cascade.ts +2670 -0
  628. package/src/styles/cyjs/defaults-table.ts +82 -0
  629. package/src/styles/cyjs/emit.ts +952 -0
  630. package/src/styles/cyjs/index.ts +37 -0
  631. package/src/styles/cyjs/live.ts +147 -0
  632. package/src/styles/cyjs/mappers.ts +879 -0
  633. package/src/styles/cyjs/selector.ts +778 -0
  634. package/src/styles/cyjs/stylesheet-text.ts +214 -0
  635. package/src/styles/cytoscape/emit.ts +1264 -0
  636. package/src/styles/cytoscape/index.ts +40 -0
  637. package/src/styles/cytoscape/lexicon.ts +658 -0
  638. package/src/styles/cytoscape/mappings.ts +603 -0
  639. package/src/styles/cytoscape/resolve.ts +521 -0
  640. package/src/styles/cytoscape/translate.ts +237 -0
  641. package/src/styles/defaults.ts +504 -0
  642. package/src/styles/index.ts +57 -0
  643. package/src/styles/internal.ts +17 -0
  644. package/src/styles/io/approximations.ts +47 -0
  645. package/src/styles/io/block.ts +1138 -0
  646. package/src/styles/io/generic.ts +687 -0
  647. package/src/styles/io/index.ts +18 -0
  648. package/src/styles/io/writer.ts +780 -0
  649. package/src/styles/notes.ts +165 -0
  650. package/src/styles/plan/classes.ts +166 -0
  651. package/src/styles/plan/continuous.ts +218 -0
  652. package/src/styles/plan/discrete.ts +165 -0
  653. package/src/styles/plan/families.ts +115 -0
  654. package/src/styles/plan/features.ts +234 -0
  655. package/src/styles/plan/index.ts +7 -0
  656. package/src/styles/plan/plan.ts +1129 -0
  657. package/src/styles/plan/resolve.ts +685 -0
  658. package/src/styles/types.ts +814 -0
  659. package/src/styles/vocabulary.ts +172 -0
  660. package/src/types.ts +76 -1
  661. package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
  662. package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
  663. package/dist/chunks/export-rKLeGQMo.js.map +0 -1
  664. package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
  665. package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
  666. package/dist/chunks/exporter-RVtXVetw.js.map +0 -1
  667. package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
  668. package/dist/chunks/importer-C98dpSH4.js.map +0 -1
  669. package/dist/chunks/importer-D794XUTe.js.map +0 -1
  670. package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
  671. package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
  672. package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
  673. package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
  674. package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
@@ -0,0 +1,791 @@
1
+ /**
2
+ * Neutral styles written as a Cytoscape.js stylesheet: the rules in order as stylesheet rules, the per-element values
3
+ * those rules read as element data under flat keys, and per-element bypasses for the values no rule gives.
4
+ *
5
+ * - A short predicate becomes a selector (`all`, `has`, `eq`, `in`, `not`, one `and`); a predicate a selector cannot
6
+ * state exactly (a computed degree, a boolean value, a column whose name a selector cannot spell) becomes a
7
+ * membership value written into element data and tested with `[key]`.
8
+ * - A passthrough becomes `data(key)` over the values, written ready for Cytoscape.js; a discrete mapping becomes one
9
+ * rule per table key; a continuous mapping becomes `mapData()`, one per segment; every mapped rule is scoped to the
10
+ * elements it gives a value, because a Cytoscape.js mapper that finds nothing resets the property to its default.
11
+ * - The stylesheet is then applied to the element data with graph-io's own Cytoscape.js engine, and every element
12
+ * whose drawn value still differs from the styles gets a bypass (its own `style`), so the result is exact.
13
+ * - With an import id, every element gets `graphty_import: <id>` and every selector tests it, so two imports in one
14
+ * core never style each other's elements.
15
+ * - Cytoscape.js draws what it draws regardless of any stylesheet: a loop is always curved, and its own default rules
16
+ * (compound parents, selected elements) apply beneath the stylesheet. A file Cytoscape.js wrote keeps those
17
+ * defaults as Cytoscape.js's own; they are not written again.
18
+ */
19
+ import { STYLE_ISSUE } from "../codes.js";
20
+ import { StyleNotes } from "../notes.js";
21
+ import { matches, refSource, resolveRules } from "../plan/resolve.js";
22
+ import { STYLE_PROPERTIES } from "../vocabulary.js";
23
+ import { evaluateCytoscapeJs } from "./cascade.js";
24
+ import { CYJS_EDGE_PROPERTIES, CYJS_NODE_PROPERTIES, isFontFamily } from "./mappers.js";
25
+ import { parseCyjsSelector } from "./selector.js";
26
+ /** The element data key that holds the import id. */
27
+ export const CYTOSCAPE_IMPORT_KEY = "graphty_import";
28
+ /**
29
+ * The flat element data key of a style column: Cytoscape.js reads a dot in a data selector as a nested path, so the
30
+ * key has none (`member.3` is `graphty_style_member_3`).
31
+ * @param key - the style column's key
32
+ * @returns the element data key
33
+ * @category Styles
34
+ */
35
+ export function cytoscapeStyleKey(key) {
36
+ return `graphty_style_${key.replaceAll(/\W/g, "_")}`;
37
+ }
38
+ /** A name a selector and a mapper can both spell without escapes or paths. */
39
+ const PLAIN_NAME = /^[A-Za-z_]\w*$/;
40
+ const SHAPES_TO_CYJS = new Map([
41
+ ["ellipse", "ellipse"],
42
+ ["rectangle", "rectangle"],
43
+ ["round-rectangle", "round-rectangle"],
44
+ ["triangle", "triangle"],
45
+ ["diamond", "diamond"],
46
+ ["pentagon", "pentagon"],
47
+ ["hexagon", "hexagon"],
48
+ ["octagon", "octagon"],
49
+ ["parallelogram", "rhomboid"],
50
+ ["star", "star"],
51
+ ["vee", "vee"],
52
+ ]);
53
+ const ARROWS_TO_CYJS = new Map([
54
+ ["none", "none"],
55
+ ["triangle", "triangle"],
56
+ ["vee", "vee"],
57
+ ["tee", "tee"],
58
+ ["diamond", "diamond"],
59
+ ["circle", "circle"],
60
+ ["square", "square"],
61
+ ]);
62
+ const ARROWS_NEAREST = new Map([
63
+ ["triangle-open", "triangle"],
64
+ ["diamond-open", "diamond"],
65
+ ["circle-open", "circle"],
66
+ ["half", "triangle"],
67
+ ["inverted", "triangle"],
68
+ ["crow", "vee"],
69
+ ]);
70
+ /**
71
+ * A neutral value as Cytoscape.js properties.
72
+ * @param target - nodes or edges
73
+ * @param property - the neutral property
74
+ * @param value - the value
75
+ * @returns the properties, or null when Cytoscape.js has no place for it
76
+ */
77
+ function toCyjs(target, property, value) {
78
+ const specs = target === "node" ? CYJS_NODE_PROPERTIES : CYJS_EDGE_PROPERTIES;
79
+ switch (property) {
80
+ case "visible":
81
+ return exact({ display: value === false ? "none" : "element" });
82
+ case "labelItalic":
83
+ return exact({ "font-style": value === true ? "italic" : "normal" });
84
+ case "curved":
85
+ // `bezier` bows only parallel edges; `unbundled-bezier` bows every edge
86
+ return exact({ "curve-style": value === true ? "unbundled-bezier" : "straight" });
87
+ case "labelPosition":
88
+ return labelPositionToCyjs(String(value));
89
+ case "shape":
90
+ return enumToCyjs("shape", String(value), SHAPES_TO_CYJS, specs);
91
+ case "borderStyle":
92
+ return borderStyleToCyjs(String(value));
93
+ case "lineStyle":
94
+ return lineStyleToCyjs(String(value));
95
+ case "sourceArrow":
96
+ case "targetArrow":
97
+ return arrowToCyjs(property === "sourceArrow" ? "source-arrow-shape" : "target-arrow-shape", String(value), specs);
98
+ case "labelFont":
99
+ return isFontFamily(String(value)) ? exact({ "font-family": String(value) }) : null;
100
+ default:
101
+ return propertyToCyjs(property, value, specs);
102
+ }
103
+ }
104
+ /**
105
+ * Properties written exactly.
106
+ * @param props - the properties
107
+ * @returns the written value
108
+ */
109
+ function exact(props) {
110
+ return { props, approximate: false };
111
+ }
112
+ /**
113
+ * Properties written as the nearest Cytoscape.js has.
114
+ * @param props - the properties
115
+ * @returns the written value
116
+ */
117
+ function near(props) {
118
+ return { props, approximate: true };
119
+ }
120
+ /**
121
+ * A label position as the vertical and horizontal alignments.
122
+ * @param text - the position
123
+ * @returns the written value
124
+ */
125
+ function labelPositionToCyjs(text) {
126
+ const v = ["top", "bottom"].find((x) => text.startsWith(x)) ?? "center";
127
+ const h = ["left", "right"].find((x) => text.endsWith(x)) ?? "center";
128
+ return exact({ "text-valign": v, "text-halign": h });
129
+ }
130
+ /**
131
+ * An enumeration value: Cytoscape.js's name for it, or an `other:` value Cytoscape.js has.
132
+ * @param name - the Cytoscape.js property
133
+ * @param value - the neutral value
134
+ * @param table - the neutral values Cytoscape.js has, by their Cytoscape.js names
135
+ * @param specs - the target's properties
136
+ * @returns the written value, or null when Cytoscape.js has none
137
+ */
138
+ function enumToCyjs(name, value, table, specs) {
139
+ const cy = table.get(value);
140
+ if (cy !== undefined) {
141
+ return exact({ [name]: cy });
142
+ }
143
+ const other = value.startsWith("other:") ? value.slice(6) : null;
144
+ return other !== null && specs.get(name)?.enums?.includes(other) === true ? exact({ [name]: other }) : null;
145
+ }
146
+ /**
147
+ * An arrow, or the nearest arrow Cytoscape.js has.
148
+ * @param name - the Cytoscape.js property
149
+ * @param value - the neutral arrow
150
+ * @param specs - the target's properties
151
+ * @returns the written value, or null when Cytoscape.js has none near
152
+ */
153
+ function arrowToCyjs(name, value, specs) {
154
+ const own = enumToCyjs(name, value, ARROWS_TO_CYJS, specs);
155
+ if (own !== null) {
156
+ return own;
157
+ }
158
+ const nearest = ARROWS_NEAREST.get(value);
159
+ return nearest === undefined ? null : near({ [name]: nearest });
160
+ }
161
+ /**
162
+ * A border style: dash-dot is drawn dashed.
163
+ * @param value - the neutral style
164
+ * @returns the written value, or null when Cytoscape.js has none
165
+ */
166
+ function borderStyleToCyjs(value) {
167
+ if (value === "dash-dot") {
168
+ return near({ "border-style": "dashed" });
169
+ }
170
+ return ["solid", "dotted", "dashed", "double"].includes(value) ? exact({ "border-style": value }) : null;
171
+ }
172
+ /**
173
+ * A line style: the dashed kinds are drawn dashed, any other solid.
174
+ * @param value - the neutral style
175
+ * @returns the written value
176
+ */
177
+ function lineStyleToCyjs(value) {
178
+ if (["solid", "dotted", "dashed"].includes(value)) {
179
+ return exact({ "line-style": value });
180
+ }
181
+ return near({ "line-style": value === "dash-dot" || value === "long-dash" ? "dashed" : "solid" });
182
+ }
183
+ /**
184
+ * Any other property: the Cytoscape.js property that carries it, the value as it is.
185
+ * @param property - the neutral property
186
+ * @param value - the value
187
+ * @param specs - the target's properties
188
+ * @returns the written value, or null when no property carries it
189
+ */
190
+ function propertyToCyjs(property, value, specs) {
191
+ const entry = Array.from(specs).find(([, spec]) => spec.property === property);
192
+ if (entry === undefined) {
193
+ return null;
194
+ }
195
+ const [name, spec] = entry;
196
+ if (spec.type === "positive" && !(typeof value === "number" && value > 0)) {
197
+ return null;
198
+ }
199
+ // Cytoscape.js takes an empty bypass as no bypass at all; a blank, which it trims, draws no text
200
+ if (value === "" && /label$/i.test(property)) {
201
+ return exact({ [name]: " " });
202
+ }
203
+ return exact({ [name]: typeof value === "boolean" ? String(value) : value });
204
+ }
205
+ /**
206
+ * A selector value literal: a string in quotes (when it holds no quote of that kind and no backslash) or a number.
207
+ * @param v - the value
208
+ * @returns the literal, or null when a selector cannot state it
209
+ */
210
+ function literal(v) {
211
+ if (typeof v === "number") {
212
+ return Number.isFinite(v) ? String(v) : null;
213
+ }
214
+ if (typeof v !== "string" || v.includes("\\") || /[\n\r\u2028\u2029]/.test(v)) {
215
+ return null;
216
+ }
217
+ if (!v.includes('"')) {
218
+ return `"${v}"`;
219
+ }
220
+ return v.includes("'") ? null : `'${v}'`;
221
+ }
222
+ /**
223
+ * A flat element data key for a source, unique within the target's data.
224
+ * @param e - the emit
225
+ * @param target - nodes or edges
226
+ * @param source - the source: a style column key, or a generated name
227
+ * @returns the flat key, and whether it is new
228
+ */
229
+ function flatKey(e, target, source) {
230
+ const known = e.keys[target].get(source);
231
+ if (known !== undefined) {
232
+ return { key: known, fresh: false };
233
+ }
234
+ let key = cytoscapeStyleKey(source);
235
+ let k = 2;
236
+ while (e.used[target].has(key)) {
237
+ key = `${cytoscapeStyleKey(source)}_${String(k)}`;
238
+ k++;
239
+ }
240
+ e.keys[target].set(source, key);
241
+ e.used[target].add(key);
242
+ return { key, fresh: true };
243
+ }
244
+ /**
245
+ * Writes a column into element data.
246
+ * @param e - the emit
247
+ * @param target - nodes or edges
248
+ * @param key - the flat key
249
+ * @param values - the values by element index; null and false are not written
250
+ */
251
+ function writeColumn(e, target, key, values) {
252
+ const rows = e.data[target];
253
+ for (let i = 0; i < rows.length && i < values.length; i++) {
254
+ const v = values[i];
255
+ if (v !== null && v !== undefined && v !== false) {
256
+ rows[i][key] = v;
257
+ }
258
+ }
259
+ }
260
+ /**
261
+ * The selector tests of a predicate, as alternatives of conjunctions; null when a selector cannot state it exactly.
262
+ * @param e - the emit
263
+ * @param target - nodes or edges
264
+ * @param where - the predicate
265
+ * @returns the alternatives (each a string of tests), or null
266
+ */
267
+ function testsOf(e, target, where) {
268
+ if ("all" in where) {
269
+ return where.all ? [""] : null;
270
+ }
271
+ if ("has" in where) {
272
+ const k = keyOf(e, target, where.has);
273
+ return k === null || !("style" in where.has) ? null : [`[${k}]`];
274
+ }
275
+ if ("eq" in where) {
276
+ return equalTest(e, target, where.eq, "=");
277
+ }
278
+ if ("in" in where) {
279
+ const k = keyOf(e, target, where.in[0]);
280
+ const values = where.in[1].map((x) => literal(x));
281
+ if (values.length === 0) {
282
+ return [];
283
+ }
284
+ return k === null || values.includes(null) ? null : values.map((v) => `[${k} = ${String(v)}]`);
285
+ }
286
+ if ("not" in where) {
287
+ return notTests(e, target, where.not);
288
+ }
289
+ if ("and" in where) {
290
+ return andTests(e, target, where.and);
291
+ }
292
+ if ("or" in where) {
293
+ return orTests(e, target, where.or);
294
+ }
295
+ return null;
296
+ }
297
+ /**
298
+ * An equality test, or its negation.
299
+ * @param e - the emit
300
+ * @param target - nodes or edges
301
+ * @param eq - the column and the value
302
+ * @param op - `=` or `!=`
303
+ * @returns the test, or null when a selector cannot state it
304
+ */
305
+ function equalTest(e, target, eq, op) {
306
+ const k = keyOf(e, target, eq[0]);
307
+ const v = literal(eq[1]);
308
+ return k === null || v === null ? null : [`[${k} ${op} ${v}]`];
309
+ }
310
+ /**
311
+ * A negated predicate: only a style column's absence and an inequality are stated.
312
+ * @param e - the emit
313
+ * @param target - nodes or edges
314
+ * @param inner - the predicate negated
315
+ * @returns the tests, or null
316
+ */
317
+ function notTests(e, target, inner) {
318
+ if ("has" in inner && "style" in inner.has) {
319
+ const k = keyOf(e, target, inner.has);
320
+ return k === null ? null : [`[^${k}]`];
321
+ }
322
+ return "eq" in inner ? equalTest(e, target, inner.eq, "!=") : null;
323
+ }
324
+ /**
325
+ * A conjunction: every combination of its parts' alternatives, at most 8.
326
+ * @param e - the emit
327
+ * @param target - nodes or edges
328
+ * @param parts - the predicates joined
329
+ * @returns the alternatives, or null
330
+ */
331
+ function andTests(e, target, parts) {
332
+ let alts = [""];
333
+ for (const p of parts) {
334
+ const t = testsOf(e, target, p);
335
+ if (t === null) {
336
+ return null;
337
+ }
338
+ alts = alts.flatMap((a) => t.map((b) => a + b));
339
+ if (alts.length > 8) {
340
+ return null;
341
+ }
342
+ }
343
+ return alts;
344
+ }
345
+ /**
346
+ * A disjunction: its parts' alternatives, at most 8.
347
+ * @param e - the emit
348
+ * @param target - nodes or edges
349
+ * @param parts - the predicates joined
350
+ * @returns the alternatives, or null
351
+ */
352
+ function orTests(e, target, parts) {
353
+ const out = [];
354
+ for (const p of parts) {
355
+ const t = testsOf(e, target, p);
356
+ if (t === null) {
357
+ return null;
358
+ }
359
+ out.push(...t);
360
+ }
361
+ return out.length > 8 ? null : out;
362
+ }
363
+ /**
364
+ * The element data key a column reference is read from: a style column's flat key (its values written into element
365
+ * data) or a data column's own name when a selector can spell it; null for anything else.
366
+ * @param e - the emit
367
+ * @param target - nodes or edges
368
+ * @param ref - the reference
369
+ * @returns the key, or null
370
+ */
371
+ function keyOf(e, target, ref) {
372
+ if ("style" in ref) {
373
+ const col = e.extracted.columns[target].get(ref.style);
374
+ if (col === undefined) {
375
+ return null;
376
+ }
377
+ const { key, fresh } = flatKey(e, target, ref.style);
378
+ if (fresh) {
379
+ writeColumn(e, target, key, col);
380
+ }
381
+ return key;
382
+ }
383
+ if ("data" in ref &&
384
+ PLAIN_NAME.test(ref.data) &&
385
+ ref.data !== CYTOSCAPE_IMPORT_KEY &&
386
+ !ref.data.startsWith("graphty_")) {
387
+ return ref.data;
388
+ }
389
+ return null;
390
+ }
391
+ /**
392
+ * The selectors of a rule: its predicate as tests, or a membership value written into element data.
393
+ * @param e - the emit
394
+ * @param rule - the rule
395
+ * @param index - the rule's position
396
+ * @returns the selector prefixes (group and scope included), one per alternative
397
+ */
398
+ function selectorsOf(e, rule, index) {
399
+ const head = `${rule.target}${e.scope}`;
400
+ const tests = testsOf(e, rule.target, rule.where);
401
+ if (tests !== null) {
402
+ return tests.map((t) => head + t);
403
+ }
404
+ const src = refSource(rule.target, e.data[rule.target].length, e.extracted.columns[rule.target], e.extracted.features[rule.target]);
405
+ const { key } = flatKey(e, rule.target, `emit.where.${String(index)}`);
406
+ const col = new Array(src.n);
407
+ for (let i = 0; i < src.n; i++) {
408
+ col[i] = matches(rule.where, src, i) ? true : null;
409
+ }
410
+ writeColumn(e, rule.target, key, col);
411
+ return [`${head}[${key}]`];
412
+ }
413
+ /**
414
+ * Emits one rule's constants and mappings.
415
+ * @param e - the emit
416
+ * @param rule - the rule
417
+ * @param index - the rule's position
418
+ */
419
+ function emitRule(e, rule, index) {
420
+ const { target } = rule;
421
+ const selectors = selectorsOf(e, rule, index);
422
+ const constants = {};
423
+ for (const [p, v] of Object.entries(rule.set ?? {})) {
424
+ if (v === undefined) {
425
+ continue;
426
+ }
427
+ const w = written(e, target, p, v);
428
+ if (w !== null) {
429
+ Object.assign(constants, w);
430
+ }
431
+ }
432
+ if (Object.keys(constants).length > 0) {
433
+ for (const sel of selectors) {
434
+ e.stylesheet.push({ selector: sel, style: constants });
435
+ // Cytoscape.js curves a straight loop, but keeps a loop it is told to draw as a haystack
436
+ if (target === "edge" && constants["curve-style"] === "straight") {
437
+ e.stylesheet.push({ selector: `${sel}:loop`, style: { "curve-style": "haystack" } });
438
+ }
439
+ }
440
+ }
441
+ for (const [p, m] of Object.entries(rule.map ?? {})) {
442
+ if (m !== undefined) {
443
+ emitMapping(e, rule, index, selectors, p, m);
444
+ }
445
+ }
446
+ }
447
+ /**
448
+ * Whether Cytoscape.js holds a neutral value exactly: a value it cannot hold, or holds only as a nearest one, reads back
449
+ * as something else.
450
+ * @param target - nodes or edges
451
+ * @param property - the neutral property
452
+ * @param value - the value
453
+ * @returns true when it is written as it is
454
+ */
455
+ export function cyjsHoldsExactly(target, property, value) {
456
+ const w = toCyjs(target, property, value);
457
+ return w !== null && !w.approximate;
458
+ }
459
+ /**
460
+ * A value as Cytoscape.js properties, noted when it cannot be written or only approximately.
461
+ * @param e - the emit
462
+ * @param target - nodes or edges
463
+ * @param property - the neutral property
464
+ * @param value - the value
465
+ * @returns the properties, or null
466
+ */
467
+ function written(e, target, property, value) {
468
+ const w = toCyjs(target, property, value);
469
+ if (w === null) {
470
+ e.notes.add(STYLE_ISSUE.NOT_WRITTEN, target, property, { sample: value });
471
+ return null;
472
+ }
473
+ if (w.approximate) {
474
+ e.notes.add(STYLE_ISSUE.APPROXIMATED, target, property, { sample: value });
475
+ }
476
+ return w.props;
477
+ }
478
+ /**
479
+ * Emits one mapping of a rule.
480
+ * @param e - the emit
481
+ * @param rule - the rule
482
+ * @param index - the rule's position
483
+ * @param selectors - the rule's selectors
484
+ * @param property - the property
485
+ * @param m - the mapping
486
+ */
487
+ function emitMapping(e, rule, index, selectors, property, m) {
488
+ const { target } = rule;
489
+ if (m.kind === "discrete") {
490
+ // one rule per table key, when a selector can state every key; else the per-element values
491
+ const key = keyOf(e, target, m.by);
492
+ const keys = m.table.map(([k]) => literal(k));
493
+ if (key === null || keys.includes(null)) {
494
+ emitValues(e, rule, index, selectors, property);
495
+ return;
496
+ }
497
+ m.table.forEach(([, v], j) => {
498
+ const w = written(e, target, property, v);
499
+ if (w === null) {
500
+ return;
501
+ }
502
+ for (const sel of selectors) {
503
+ e.stylesheet.push({ selector: `${sel}[${key} = ${String(keys[j])}]`, style: w });
504
+ }
505
+ });
506
+ return;
507
+ }
508
+ if (m.kind === "continuous" && isNumericOutput(target, property)) {
509
+ const key = numericKey(e, target, m.by, index);
510
+ if (key !== null) {
511
+ emitContinuous(e, target, selectors, property, key, m.points);
512
+ return;
513
+ }
514
+ }
515
+ emitValues(e, rule, index, selectors, property);
516
+ }
517
+ /**
518
+ * Whether a property's values are numbers or colors, which `mapData()` interpolates.
519
+ * @param target - nodes or edges
520
+ * @param property - the property
521
+ * @returns true for a number, opacity or color property
522
+ */
523
+ function isNumericOutput(target, property) {
524
+ const kind = STYLE_PROPERTIES[target].get(property);
525
+ return kind === "number" || kind === "opacity" || kind === "color";
526
+ }
527
+ /**
528
+ * The element data key of a mapping's numeric input: a data column a mapper can spell, or the input copied into
529
+ * element data.
530
+ * @param e - the emit
531
+ * @param target - nodes or edges
532
+ * @param by - the input
533
+ * @param index - the rule's position
534
+ * @returns the key, or null when the input has no values
535
+ */
536
+ function numericKey(e, target, by, index) {
537
+ const src = refSource(target, e.data[target].length, e.extracted.columns[target], e.extracted.features[target]);
538
+ const col = src.column(by);
539
+ if (col === null) {
540
+ return null;
541
+ }
542
+ if ("data" in by && PLAIN_NAME.test(by.data) && !by.data.startsWith("graphty_")) {
543
+ return by.data;
544
+ }
545
+ const { key } = flatKey(e, target, `emit.input.${String(index)}`);
546
+ const values = new Array(src.n);
547
+ for (let i = 0; i < src.n; i++) {
548
+ const v = col[i];
549
+ values[i] = typeof v === "number" && Number.isFinite(v) ? v : null;
550
+ }
551
+ writeColumn(e, target, key, values);
552
+ return key;
553
+ }
554
+ /**
555
+ * A continuous mapping as `mapData()` rules: one per segment, the values below the first point and above the last,
556
+ * and the exact values at the points, each scoped to its input range.
557
+ * @param e - the emit
558
+ * @param target - nodes or edges
559
+ * @param selectors - the rule's selectors
560
+ * @param property - the property
561
+ * @param key - the input's element data key
562
+ * @param points - the points
563
+ */
564
+ function emitContinuous(e, target, selectors, property, key, points) {
565
+ if (points.length === 0) {
566
+ return;
567
+ }
568
+ const lit = String;
569
+ const push = (test, style) => {
570
+ if (style === null) {
571
+ return;
572
+ }
573
+ for (const sel of selectors) {
574
+ e.stylesheet.push({ selector: `${sel}${test}`, style });
575
+ }
576
+ };
577
+ const first = points[0];
578
+ const last = points.at(-1) ?? first;
579
+ push(`[${key} < ${lit(first.at)}]`, written(e, target, property, first.below));
580
+ for (let k = 0; k + 1 < points.length; k++) {
581
+ const a = points[k];
582
+ const b = points[k + 1];
583
+ const wa = written(e, target, property, a.above);
584
+ const wb = written(e, target, property, b.below);
585
+ if (wa === null || wb === null) {
586
+ continue;
587
+ }
588
+ const style = {};
589
+ for (const name of Object.keys(wa)) {
590
+ style[name] = `mapData(${key}, ${lit(a.at)}, ${lit(b.at)}, ${String(wa[name])}, ${String(wb[name])})`;
591
+ }
592
+ push(`[${key} > ${lit(a.at)}][${key} < ${lit(b.at)}]`, style);
593
+ }
594
+ push(`[${key} > ${lit(last.at)}]`, written(e, target, property, last.above));
595
+ for (const p of points) {
596
+ push(`[${key} = ${lit(p.at)}]`, written(e, target, property, p.value));
597
+ }
598
+ }
599
+ /**
600
+ * A mapping as its per-element values: what the rule gives each element, written ready for Cytoscape.js into element
601
+ * data and read with `data()`, scoped to the elements that have a value.
602
+ * @param e - the emit
603
+ * @param rule - the rule
604
+ * @param index - the rule's position
605
+ * @param selectors - the rule's selectors
606
+ * @param property - the property
607
+ */
608
+ function emitValues(e, rule, index, selectors, property) {
609
+ const { target } = rule;
610
+ const n = e.data[target].length;
611
+ const src = refSource(target, n, e.extracted.columns[target], e.extracted.features[target]);
612
+ const mapping = new Map(Object.entries(rule.map ?? {})).get(property);
613
+ const only = { ...rule, where: { all: true }, set: undefined, map: { [property]: mapping } };
614
+ const values = resolveRules([only], target, property, src);
615
+ const names = new Map();
616
+ for (let i = 0; i < n; i++) {
617
+ const v = values[i];
618
+ if (v === null) {
619
+ continue;
620
+ }
621
+ const w = written(e, target, property, v);
622
+ if (w === null) {
623
+ continue;
624
+ }
625
+ for (const [name, x] of Object.entries(w)) {
626
+ let col = names.get(name);
627
+ if (col === undefined) {
628
+ col = new Array(n).fill(null);
629
+ names.set(name, col);
630
+ }
631
+ col[i] = x;
632
+ }
633
+ }
634
+ for (const [name, col] of names) {
635
+ const { key } = flatKey(e, target, `emit.value.${String(index)}.${name}`);
636
+ writeColumn(e, target, key, col);
637
+ for (const sel of selectors) {
638
+ e.stylesheet.push({ selector: `${sel}[${key}]`, style: { [name]: `data(${key})` } });
639
+ }
640
+ }
641
+ }
642
+ /**
643
+ * Writes neutral styles as a Cytoscape.js stylesheet, the element data it reads and the bypasses that make it exact.
644
+ * @param extracted - the styles
645
+ * @param options - the import id that scopes the stylesheet
646
+ * @returns the stylesheet, the element data, the bypasses and the notes of what could not be written
647
+ * @category Styles
648
+ */
649
+ export function toCytoscapeStylesheet(extracted, options = {}) {
650
+ const notes = new StyleNotes();
651
+ const importId = options.importId?.replaceAll(/["'\\\n\r\u2028\u2029]/g, "_");
652
+ const { nodes } = extracted.fingerprint;
653
+ const { edges } = extracted.fingerprint;
654
+ const e = {
655
+ extracted,
656
+ notes,
657
+ scope: importId === undefined ? "" : `[${CYTOSCAPE_IMPORT_KEY} = "${importId}"]`,
658
+ stylesheet: [],
659
+ data: {
660
+ node: Array.from({ length: nodes }, () => ({})),
661
+ edge: Array.from({ length: edges }, () => ({})),
662
+ },
663
+ keys: { node: new Map(), edge: new Map() },
664
+ // a flat key never takes the name of a data field the elements already hold
665
+ used: {
666
+ node: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, "node")]),
667
+ edge: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, "edge")]),
668
+ },
669
+ };
670
+ if (importId !== undefined) {
671
+ for (const rows of [e.data.node, e.data.edge]) {
672
+ for (const row of rows) {
673
+ row[CYTOSCAPE_IMPORT_KEY] = importId;
674
+ }
675
+ }
676
+ }
677
+ // Cytoscape.js draws its own defaults: the rules that state them are not written again
678
+ const rules = extracted.styles.source.tool === "cytoscape-js"
679
+ ? extracted.styles.rules.filter((r) => r.origin !== "tool")
680
+ : extracted.styles.rules;
681
+ rules.forEach((rule, k) => {
682
+ if (rule.role !== "exceptions") {
683
+ emitRule(e, rule, k);
684
+ }
685
+ });
686
+ const bypass = exactness(e, rules);
687
+ for (const sel of e.stylesheet) {
688
+ if (parseCyjsSelector(sel.selector).invalid) {
689
+ notes.add(STYLE_ISSUE.NOT_WRITTEN, null, "selector", { sample: sel.selector });
690
+ }
691
+ }
692
+ const rows = (list) => list.map((r) => (Object.keys(r).length > 0 ? r : null));
693
+ return {
694
+ stylesheet: e.stylesheet,
695
+ elementData: { node: rows(e.data.node), edge: rows(e.data.edge) },
696
+ bypass,
697
+ notes: notes.list(),
698
+ };
699
+ }
700
+ /**
701
+ * Applies the stylesheet to the element data with graph-io's Cytoscape.js engine and gives every element whose drawn
702
+ * value differs from the styles a bypass with the right value.
703
+ * @param e - the emit
704
+ * @param rules - the rules written (Cytoscape.js's own defaults left out)
705
+ * @returns the bypasses
706
+ */
707
+ function exactness(e, rules) {
708
+ const { extracted } = e;
709
+ const nodes = e.data.node.length;
710
+ const elements = [];
711
+ for (let i = 0; i < nodes; i++) {
712
+ elements.push({
713
+ group: "nodes",
714
+ data: { ...dataColumns(extracted, "node", i), ...e.data.node[i], id: `n${String(i)}` },
715
+ });
716
+ }
717
+ // the edges join two nodes (no loops: Cytoscape.js draws a loop curved whatever the stylesheet says)
718
+ const far = nodes > 1 ? "n1" : "n0";
719
+ for (let i = 0; i < e.data.edge.length && nodes > 0; i++) {
720
+ elements.push({
721
+ group: "edges",
722
+ data: {
723
+ ...dataColumns(extracted, "edge", i),
724
+ ...e.data.edge[i],
725
+ id: `e${String(i)}`,
726
+ source: "n0",
727
+ target: far,
728
+ },
729
+ });
730
+ }
731
+ const drawn = evaluateCytoscapeJs({ elements, style: e.stylesheet, toolDefaults: false });
732
+ const out = {
733
+ node: [],
734
+ edge: [],
735
+ };
736
+ for (const target of ["node", "edge"]) {
737
+ const n = e.data[target].length;
738
+ const src = refSource(target, n, extracted.columns[target], extracted.features[target]);
739
+ const rows = new Array(n).fill(null);
740
+ for (const property of STYLE_PROPERTIES[target].keys()) {
741
+ const want = resolveRules(rules, target, property, src);
742
+ addBypasses(rows, target, property, want, drawn[target].values[property]);
743
+ }
744
+ out[target] = rows;
745
+ }
746
+ return out;
747
+ }
748
+ /**
749
+ * A bypass of one property for every element whose drawn value differs from the styles' and that Cytoscape.js can
750
+ * hold exactly.
751
+ * @param rows - the bypasses, changed in place
752
+ * @param target - nodes or edges
753
+ * @param property - the property
754
+ * @param want - the styles' values
755
+ * @param got - what is drawn, or undefined for nothing
756
+ */
757
+ function addBypasses(rows, target, property, want, got) {
758
+ for (let i = 0; i < rows.length; i++) {
759
+ const w = want[i];
760
+ const conv = w === null || (got?.[i] ?? null) === w ? null : toCyjs(target, property, w);
761
+ if (conv !== null && !conv.approximate) {
762
+ rows[i] = { ...rows[i], ...conv.props };
763
+ }
764
+ }
765
+ }
766
+ /**
767
+ * The names of the data columns among the styles' features.
768
+ * @param extracted - the styles
769
+ * @param target - nodes or edges
770
+ * @returns the names
771
+ */
772
+ function dataNames(extracted, target) {
773
+ return extracted.features[target].flatMap((f) => ("data" in f.ref ? [f.ref.data] : []));
774
+ }
775
+ /**
776
+ * An element's data columns from the styles' features: what a consumer writes into element data from the graph.
777
+ * @param extracted - the styles
778
+ * @param target - nodes or edges
779
+ * @param i - the element
780
+ * @returns the data fields
781
+ */
782
+ function dataColumns(extracted, target, i) {
783
+ const out = Object.create(null);
784
+ for (const f of extracted.features[target]) {
785
+ if ("data" in f.ref && f.values[i] !== null) {
786
+ out[f.ref.data] = f.values[i];
787
+ }
788
+ }
789
+ return out;
790
+ }
791
+ //# sourceMappingURL=emit.js.map