@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,790 @@
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
+ return exact({ "curve-style": value === true ? "bezier" : "straight" });
86
+ case "labelPosition":
87
+ return labelPositionToCyjs(String(value));
88
+ case "shape":
89
+ return enumToCyjs("shape", String(value), SHAPES_TO_CYJS, specs);
90
+ case "borderStyle":
91
+ return borderStyleToCyjs(String(value));
92
+ case "lineStyle":
93
+ return lineStyleToCyjs(String(value));
94
+ case "sourceArrow":
95
+ case "targetArrow":
96
+ return arrowToCyjs(property === "sourceArrow" ? "source-arrow-shape" : "target-arrow-shape", String(value), specs);
97
+ case "labelFont":
98
+ return isFontFamily(String(value)) ? exact({ "font-family": String(value) }) : null;
99
+ default:
100
+ return propertyToCyjs(property, value, specs);
101
+ }
102
+ }
103
+ /**
104
+ * Properties written exactly.
105
+ * @param props - the properties
106
+ * @returns the written value
107
+ */
108
+ function exact(props) {
109
+ return { props, approximate: false };
110
+ }
111
+ /**
112
+ * Properties written as the nearest Cytoscape.js has.
113
+ * @param props - the properties
114
+ * @returns the written value
115
+ */
116
+ function near(props) {
117
+ return { props, approximate: true };
118
+ }
119
+ /**
120
+ * A label position as the vertical and horizontal alignments.
121
+ * @param text - the position
122
+ * @returns the written value
123
+ */
124
+ function labelPositionToCyjs(text) {
125
+ const v = ["top", "bottom"].find((x) => text.startsWith(x)) ?? "center";
126
+ const h = ["left", "right"].find((x) => text.endsWith(x)) ?? "center";
127
+ return exact({ "text-valign": v, "text-halign": h });
128
+ }
129
+ /**
130
+ * An enumeration value: Cytoscape.js's name for it, or an `other:` value Cytoscape.js has.
131
+ * @param name - the Cytoscape.js property
132
+ * @param value - the neutral value
133
+ * @param table - the neutral values Cytoscape.js has, by their Cytoscape.js names
134
+ * @param specs - the target's properties
135
+ * @returns the written value, or null when Cytoscape.js has none
136
+ */
137
+ function enumToCyjs(name, value, table, specs) {
138
+ const cy = table.get(value);
139
+ if (cy !== undefined) {
140
+ return exact({ [name]: cy });
141
+ }
142
+ const other = value.startsWith("other:") ? value.slice(6) : null;
143
+ return other !== null && specs.get(name)?.enums?.includes(other) === true ? exact({ [name]: other }) : null;
144
+ }
145
+ /**
146
+ * An arrow, or the nearest arrow Cytoscape.js has.
147
+ * @param name - the Cytoscape.js property
148
+ * @param value - the neutral arrow
149
+ * @param specs - the target's properties
150
+ * @returns the written value, or null when Cytoscape.js has none near
151
+ */
152
+ function arrowToCyjs(name, value, specs) {
153
+ const own = enumToCyjs(name, value, ARROWS_TO_CYJS, specs);
154
+ if (own !== null) {
155
+ return own;
156
+ }
157
+ const nearest = ARROWS_NEAREST.get(value);
158
+ return nearest === undefined ? null : near({ [name]: nearest });
159
+ }
160
+ /**
161
+ * A border style: dash-dot is drawn dashed.
162
+ * @param value - the neutral style
163
+ * @returns the written value, or null when Cytoscape.js has none
164
+ */
165
+ function borderStyleToCyjs(value) {
166
+ if (value === "dash-dot") {
167
+ return near({ "border-style": "dashed" });
168
+ }
169
+ return ["solid", "dotted", "dashed", "double"].includes(value) ? exact({ "border-style": value }) : null;
170
+ }
171
+ /**
172
+ * A line style: the dashed kinds are drawn dashed, any other solid.
173
+ * @param value - the neutral style
174
+ * @returns the written value
175
+ */
176
+ function lineStyleToCyjs(value) {
177
+ if (["solid", "dotted", "dashed"].includes(value)) {
178
+ return exact({ "line-style": value });
179
+ }
180
+ return near({ "line-style": value === "dash-dot" || value === "long-dash" ? "dashed" : "solid" });
181
+ }
182
+ /**
183
+ * Any other property: the Cytoscape.js property that carries it, the value as it is.
184
+ * @param property - the neutral property
185
+ * @param value - the value
186
+ * @param specs - the target's properties
187
+ * @returns the written value, or null when no property carries it
188
+ */
189
+ function propertyToCyjs(property, value, specs) {
190
+ const entry = Array.from(specs).find(([, spec]) => spec.property === property);
191
+ if (entry === undefined) {
192
+ return null;
193
+ }
194
+ const [name, spec] = entry;
195
+ if (spec.type === "positive" && !(typeof value === "number" && value > 0)) {
196
+ return null;
197
+ }
198
+ // Cytoscape.js takes an empty bypass as no bypass at all; a blank, which it trims, draws no text
199
+ if (value === "" && /label$/i.test(property)) {
200
+ return exact({ [name]: " " });
201
+ }
202
+ return exact({ [name]: typeof value === "boolean" ? String(value) : value });
203
+ }
204
+ /**
205
+ * A selector value literal: a string in quotes (when it holds no quote of that kind and no backslash) or a number.
206
+ * @param v - the value
207
+ * @returns the literal, or null when a selector cannot state it
208
+ */
209
+ function literal(v) {
210
+ if (typeof v === "number") {
211
+ return Number.isFinite(v) ? String(v) : null;
212
+ }
213
+ if (typeof v !== "string" || v.includes("\\") || /[\n\r\u2028\u2029]/.test(v)) {
214
+ return null;
215
+ }
216
+ if (!v.includes('"')) {
217
+ return `"${v}"`;
218
+ }
219
+ return v.includes("'") ? null : `'${v}'`;
220
+ }
221
+ /**
222
+ * A flat element data key for a source, unique within the target's data.
223
+ * @param e - the emit
224
+ * @param target - nodes or edges
225
+ * @param source - the source: a style column key, or a generated name
226
+ * @returns the flat key, and whether it is new
227
+ */
228
+ function flatKey(e, target, source) {
229
+ const known = e.keys[target].get(source);
230
+ if (known !== undefined) {
231
+ return { key: known, fresh: false };
232
+ }
233
+ let key = cytoscapeStyleKey(source);
234
+ let k = 2;
235
+ while (e.used[target].has(key)) {
236
+ key = `${cytoscapeStyleKey(source)}_${String(k)}`;
237
+ k++;
238
+ }
239
+ e.keys[target].set(source, key);
240
+ e.used[target].add(key);
241
+ return { key, fresh: true };
242
+ }
243
+ /**
244
+ * Writes a column into element data.
245
+ * @param e - the emit
246
+ * @param target - nodes or edges
247
+ * @param key - the flat key
248
+ * @param values - the values by element index; null and false are not written
249
+ */
250
+ function writeColumn(e, target, key, values) {
251
+ const rows = e.data[target];
252
+ for (let i = 0; i < rows.length && i < values.length; i++) {
253
+ const v = values[i];
254
+ if (v !== null && v !== undefined && v !== false) {
255
+ rows[i][key] = v;
256
+ }
257
+ }
258
+ }
259
+ /**
260
+ * The selector tests of a predicate, as alternatives of conjunctions; null when a selector cannot state it exactly.
261
+ * @param e - the emit
262
+ * @param target - nodes or edges
263
+ * @param where - the predicate
264
+ * @returns the alternatives (each a string of tests), or null
265
+ */
266
+ function testsOf(e, target, where) {
267
+ if ("all" in where) {
268
+ return where.all ? [""] : null;
269
+ }
270
+ if ("has" in where) {
271
+ const k = keyOf(e, target, where.has);
272
+ return k === null || !("style" in where.has) ? null : [`[${k}]`];
273
+ }
274
+ if ("eq" in where) {
275
+ return equalTest(e, target, where.eq, "=");
276
+ }
277
+ if ("in" in where) {
278
+ const k = keyOf(e, target, where.in[0]);
279
+ const values = where.in[1].map((x) => literal(x));
280
+ if (values.length === 0) {
281
+ return [];
282
+ }
283
+ return k === null || values.includes(null) ? null : values.map((v) => `[${k} = ${String(v)}]`);
284
+ }
285
+ if ("not" in where) {
286
+ return notTests(e, target, where.not);
287
+ }
288
+ if ("and" in where) {
289
+ return andTests(e, target, where.and);
290
+ }
291
+ if ("or" in where) {
292
+ return orTests(e, target, where.or);
293
+ }
294
+ return null;
295
+ }
296
+ /**
297
+ * An equality test, or its negation.
298
+ * @param e - the emit
299
+ * @param target - nodes or edges
300
+ * @param eq - the column and the value
301
+ * @param op - `=` or `!=`
302
+ * @returns the test, or null when a selector cannot state it
303
+ */
304
+ function equalTest(e, target, eq, op) {
305
+ const k = keyOf(e, target, eq[0]);
306
+ const v = literal(eq[1]);
307
+ return k === null || v === null ? null : [`[${k} ${op} ${v}]`];
308
+ }
309
+ /**
310
+ * A negated predicate: only a style column's absence and an inequality are stated.
311
+ * @param e - the emit
312
+ * @param target - nodes or edges
313
+ * @param inner - the predicate negated
314
+ * @returns the tests, or null
315
+ */
316
+ function notTests(e, target, inner) {
317
+ if ("has" in inner && "style" in inner.has) {
318
+ const k = keyOf(e, target, inner.has);
319
+ return k === null ? null : [`[^${k}]`];
320
+ }
321
+ return "eq" in inner ? equalTest(e, target, inner.eq, "!=") : null;
322
+ }
323
+ /**
324
+ * A conjunction: every combination of its parts' alternatives, at most 8.
325
+ * @param e - the emit
326
+ * @param target - nodes or edges
327
+ * @param parts - the predicates joined
328
+ * @returns the alternatives, or null
329
+ */
330
+ function andTests(e, target, parts) {
331
+ let alts = [""];
332
+ for (const p of parts) {
333
+ const t = testsOf(e, target, p);
334
+ if (t === null) {
335
+ return null;
336
+ }
337
+ alts = alts.flatMap((a) => t.map((b) => a + b));
338
+ if (alts.length > 8) {
339
+ return null;
340
+ }
341
+ }
342
+ return alts;
343
+ }
344
+ /**
345
+ * A disjunction: its parts' alternatives, at most 8.
346
+ * @param e - the emit
347
+ * @param target - nodes or edges
348
+ * @param parts - the predicates joined
349
+ * @returns the alternatives, or null
350
+ */
351
+ function orTests(e, target, parts) {
352
+ const out = [];
353
+ for (const p of parts) {
354
+ const t = testsOf(e, target, p);
355
+ if (t === null) {
356
+ return null;
357
+ }
358
+ out.push(...t);
359
+ }
360
+ return out.length > 8 ? null : out;
361
+ }
362
+ /**
363
+ * The element data key a column reference is read from: a style column's flat key (its values written into element
364
+ * data) or a data column's own name when a selector can spell it; null for anything else.
365
+ * @param e - the emit
366
+ * @param target - nodes or edges
367
+ * @param ref - the reference
368
+ * @returns the key, or null
369
+ */
370
+ function keyOf(e, target, ref) {
371
+ if ("style" in ref) {
372
+ const col = e.extracted.columns[target].get(ref.style);
373
+ if (col === undefined) {
374
+ return null;
375
+ }
376
+ const { key, fresh } = flatKey(e, target, ref.style);
377
+ if (fresh) {
378
+ writeColumn(e, target, key, col);
379
+ }
380
+ return key;
381
+ }
382
+ if ("data" in ref &&
383
+ PLAIN_NAME.test(ref.data) &&
384
+ ref.data !== CYTOSCAPE_IMPORT_KEY &&
385
+ !ref.data.startsWith("graphty_")) {
386
+ return ref.data;
387
+ }
388
+ return null;
389
+ }
390
+ /**
391
+ * The selectors of a rule: its predicate as tests, or a membership value written into element data.
392
+ * @param e - the emit
393
+ * @param rule - the rule
394
+ * @param index - the rule's position
395
+ * @returns the selector prefixes (group and scope included), one per alternative
396
+ */
397
+ function selectorsOf(e, rule, index) {
398
+ const head = `${rule.target}${e.scope}`;
399
+ const tests = testsOf(e, rule.target, rule.where);
400
+ if (tests !== null) {
401
+ return tests.map((t) => head + t);
402
+ }
403
+ const src = refSource(rule.target, e.data[rule.target].length, e.extracted.columns[rule.target], e.extracted.features[rule.target]);
404
+ const { key } = flatKey(e, rule.target, `emit.where.${String(index)}`);
405
+ const col = new Array(src.n);
406
+ for (let i = 0; i < src.n; i++) {
407
+ col[i] = matches(rule.where, src, i) ? true : null;
408
+ }
409
+ writeColumn(e, rule.target, key, col);
410
+ return [`${head}[${key}]`];
411
+ }
412
+ /**
413
+ * Emits one rule's constants and mappings.
414
+ * @param e - the emit
415
+ * @param rule - the rule
416
+ * @param index - the rule's position
417
+ */
418
+ function emitRule(e, rule, index) {
419
+ const { target } = rule;
420
+ const selectors = selectorsOf(e, rule, index);
421
+ const constants = {};
422
+ for (const [p, v] of Object.entries(rule.set ?? {})) {
423
+ if (v === undefined) {
424
+ continue;
425
+ }
426
+ const w = written(e, target, p, v);
427
+ if (w !== null) {
428
+ Object.assign(constants, w);
429
+ }
430
+ }
431
+ if (Object.keys(constants).length > 0) {
432
+ for (const sel of selectors) {
433
+ e.stylesheet.push({ selector: sel, style: constants });
434
+ // Cytoscape.js curves a straight loop, but keeps a loop it is told to draw as a haystack
435
+ if (target === "edge" && constants["curve-style"] === "straight") {
436
+ e.stylesheet.push({ selector: `${sel}:loop`, style: { "curve-style": "haystack" } });
437
+ }
438
+ }
439
+ }
440
+ for (const [p, m] of Object.entries(rule.map ?? {})) {
441
+ if (m !== undefined) {
442
+ emitMapping(e, rule, index, selectors, p, m);
443
+ }
444
+ }
445
+ }
446
+ /**
447
+ * Whether Cytoscape.js holds a neutral value exactly: a value it cannot hold, or holds only as a nearest one, reads back
448
+ * as something else.
449
+ * @param target - nodes or edges
450
+ * @param property - the neutral property
451
+ * @param value - the value
452
+ * @returns true when it is written as it is
453
+ */
454
+ export function cyjsHoldsExactly(target, property, value) {
455
+ const w = toCyjs(target, property, value);
456
+ return w !== null && !w.approximate;
457
+ }
458
+ /**
459
+ * A value as Cytoscape.js properties, noted when it cannot be written or only approximately.
460
+ * @param e - the emit
461
+ * @param target - nodes or edges
462
+ * @param property - the neutral property
463
+ * @param value - the value
464
+ * @returns the properties, or null
465
+ */
466
+ function written(e, target, property, value) {
467
+ const w = toCyjs(target, property, value);
468
+ if (w === null) {
469
+ e.notes.add(STYLE_ISSUE.NOT_WRITTEN, target, property, { sample: value });
470
+ return null;
471
+ }
472
+ if (w.approximate) {
473
+ e.notes.add(STYLE_ISSUE.APPROXIMATED, target, property, { sample: value });
474
+ }
475
+ return w.props;
476
+ }
477
+ /**
478
+ * Emits one mapping of a rule.
479
+ * @param e - the emit
480
+ * @param rule - the rule
481
+ * @param index - the rule's position
482
+ * @param selectors - the rule's selectors
483
+ * @param property - the property
484
+ * @param m - the mapping
485
+ */
486
+ function emitMapping(e, rule, index, selectors, property, m) {
487
+ const { target } = rule;
488
+ if (m.kind === "discrete") {
489
+ // one rule per table key, when a selector can state every key; else the per-element values
490
+ const key = keyOf(e, target, m.by);
491
+ const keys = m.table.map(([k]) => literal(k));
492
+ if (key === null || keys.includes(null)) {
493
+ emitValues(e, rule, index, selectors, property);
494
+ return;
495
+ }
496
+ m.table.forEach(([, v], j) => {
497
+ const w = written(e, target, property, v);
498
+ if (w === null) {
499
+ return;
500
+ }
501
+ for (const sel of selectors) {
502
+ e.stylesheet.push({ selector: `${sel}[${key} = ${String(keys[j])}]`, style: w });
503
+ }
504
+ });
505
+ return;
506
+ }
507
+ if (m.kind === "continuous" && isNumericOutput(target, property)) {
508
+ const key = numericKey(e, target, m.by, index);
509
+ if (key !== null) {
510
+ emitContinuous(e, target, selectors, property, key, m.points);
511
+ return;
512
+ }
513
+ }
514
+ emitValues(e, rule, index, selectors, property);
515
+ }
516
+ /**
517
+ * Whether a property's values are numbers or colors, which `mapData()` interpolates.
518
+ * @param target - nodes or edges
519
+ * @param property - the property
520
+ * @returns true for a number, opacity or color property
521
+ */
522
+ function isNumericOutput(target, property) {
523
+ const kind = STYLE_PROPERTIES[target].get(property);
524
+ return kind === "number" || kind === "opacity" || kind === "color";
525
+ }
526
+ /**
527
+ * The element data key of a mapping's numeric input: a data column a mapper can spell, or the input copied into
528
+ * element data.
529
+ * @param e - the emit
530
+ * @param target - nodes or edges
531
+ * @param by - the input
532
+ * @param index - the rule's position
533
+ * @returns the key, or null when the input has no values
534
+ */
535
+ function numericKey(e, target, by, index) {
536
+ const src = refSource(target, e.data[target].length, e.extracted.columns[target], e.extracted.features[target]);
537
+ const col = src.column(by);
538
+ if (col === null) {
539
+ return null;
540
+ }
541
+ if ("data" in by && PLAIN_NAME.test(by.data) && !by.data.startsWith("graphty_")) {
542
+ return by.data;
543
+ }
544
+ const { key } = flatKey(e, target, `emit.input.${String(index)}`);
545
+ const values = new Array(src.n);
546
+ for (let i = 0; i < src.n; i++) {
547
+ const v = col[i];
548
+ values[i] = typeof v === "number" && Number.isFinite(v) ? v : null;
549
+ }
550
+ writeColumn(e, target, key, values);
551
+ return key;
552
+ }
553
+ /**
554
+ * A continuous mapping as `mapData()` rules: one per segment, the values below the first point and above the last,
555
+ * and the exact values at the points, each scoped to its input range.
556
+ * @param e - the emit
557
+ * @param target - nodes or edges
558
+ * @param selectors - the rule's selectors
559
+ * @param property - the property
560
+ * @param key - the input's element data key
561
+ * @param points - the points
562
+ */
563
+ function emitContinuous(e, target, selectors, property, key, points) {
564
+ if (points.length === 0) {
565
+ return;
566
+ }
567
+ const lit = String;
568
+ const push = (test, style) => {
569
+ if (style === null) {
570
+ return;
571
+ }
572
+ for (const sel of selectors) {
573
+ e.stylesheet.push({ selector: `${sel}${test}`, style });
574
+ }
575
+ };
576
+ const first = points[0];
577
+ const last = points.at(-1) ?? first;
578
+ push(`[${key} < ${lit(first.at)}]`, written(e, target, property, first.below));
579
+ for (let k = 0; k + 1 < points.length; k++) {
580
+ const a = points[k];
581
+ const b = points[k + 1];
582
+ const wa = written(e, target, property, a.above);
583
+ const wb = written(e, target, property, b.below);
584
+ if (wa === null || wb === null) {
585
+ continue;
586
+ }
587
+ const style = {};
588
+ for (const name of Object.keys(wa)) {
589
+ style[name] = `mapData(${key}, ${lit(a.at)}, ${lit(b.at)}, ${String(wa[name])}, ${String(wb[name])})`;
590
+ }
591
+ push(`[${key} > ${lit(a.at)}][${key} < ${lit(b.at)}]`, style);
592
+ }
593
+ push(`[${key} > ${lit(last.at)}]`, written(e, target, property, last.above));
594
+ for (const p of points) {
595
+ push(`[${key} = ${lit(p.at)}]`, written(e, target, property, p.value));
596
+ }
597
+ }
598
+ /**
599
+ * A mapping as its per-element values: what the rule gives each element, written ready for Cytoscape.js into element
600
+ * data and read with `data()`, scoped to the elements that have a value.
601
+ * @param e - the emit
602
+ * @param rule - the rule
603
+ * @param index - the rule's position
604
+ * @param selectors - the rule's selectors
605
+ * @param property - the property
606
+ */
607
+ function emitValues(e, rule, index, selectors, property) {
608
+ const { target } = rule;
609
+ const n = e.data[target].length;
610
+ const src = refSource(target, n, e.extracted.columns[target], e.extracted.features[target]);
611
+ const mapping = new Map(Object.entries(rule.map ?? {})).get(property);
612
+ const only = { ...rule, where: { all: true }, set: undefined, map: { [property]: mapping } };
613
+ const values = resolveRules([only], target, property, src);
614
+ const names = new Map();
615
+ for (let i = 0; i < n; i++) {
616
+ const v = values[i];
617
+ if (v === null) {
618
+ continue;
619
+ }
620
+ const w = written(e, target, property, v);
621
+ if (w === null) {
622
+ continue;
623
+ }
624
+ for (const [name, x] of Object.entries(w)) {
625
+ let col = names.get(name);
626
+ if (col === undefined) {
627
+ col = new Array(n).fill(null);
628
+ names.set(name, col);
629
+ }
630
+ col[i] = x;
631
+ }
632
+ }
633
+ for (const [name, col] of names) {
634
+ const { key } = flatKey(e, target, `emit.value.${String(index)}.${name}`);
635
+ writeColumn(e, target, key, col);
636
+ for (const sel of selectors) {
637
+ e.stylesheet.push({ selector: `${sel}[${key}]`, style: { [name]: `data(${key})` } });
638
+ }
639
+ }
640
+ }
641
+ /**
642
+ * Writes neutral styles as a Cytoscape.js stylesheet, the element data it reads and the bypasses that make it exact.
643
+ * @param extracted - the styles
644
+ * @param options - the import id that scopes the stylesheet
645
+ * @returns the stylesheet, the element data, the bypasses and the notes of what could not be written
646
+ * @category Styles
647
+ */
648
+ export function toCytoscapeStylesheet(extracted, options = {}) {
649
+ const notes = new StyleNotes();
650
+ const importId = options.importId?.replaceAll(/["'\\\n\r\u2028\u2029]/g, "_");
651
+ const { nodes } = extracted.fingerprint;
652
+ const { edges } = extracted.fingerprint;
653
+ const e = {
654
+ extracted,
655
+ notes,
656
+ scope: importId === undefined ? "" : `[${CYTOSCAPE_IMPORT_KEY} = "${importId}"]`,
657
+ stylesheet: [],
658
+ data: {
659
+ node: Array.from({ length: nodes }, () => ({})),
660
+ edge: Array.from({ length: edges }, () => ({})),
661
+ },
662
+ keys: { node: new Map(), edge: new Map() },
663
+ // a flat key never takes the name of a data field the elements already hold
664
+ used: {
665
+ node: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, "node")]),
666
+ edge: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, "edge")]),
667
+ },
668
+ };
669
+ if (importId !== undefined) {
670
+ for (const rows of [e.data.node, e.data.edge]) {
671
+ for (const row of rows) {
672
+ row[CYTOSCAPE_IMPORT_KEY] = importId;
673
+ }
674
+ }
675
+ }
676
+ // Cytoscape.js draws its own defaults: the rules that state them are not written again
677
+ const rules = extracted.styles.source.tool === "cytoscape-js"
678
+ ? extracted.styles.rules.filter((r) => r.origin !== "tool")
679
+ : extracted.styles.rules;
680
+ rules.forEach((rule, k) => {
681
+ if (rule.role !== "exceptions") {
682
+ emitRule(e, rule, k);
683
+ }
684
+ });
685
+ const bypass = exactness(e, rules);
686
+ for (const sel of e.stylesheet) {
687
+ if (parseCyjsSelector(sel.selector).invalid) {
688
+ notes.add(STYLE_ISSUE.NOT_WRITTEN, null, "selector", { sample: sel.selector });
689
+ }
690
+ }
691
+ const rows = (list) => list.map((r) => (Object.keys(r).length > 0 ? r : null));
692
+ return {
693
+ stylesheet: e.stylesheet,
694
+ elementData: { node: rows(e.data.node), edge: rows(e.data.edge) },
695
+ bypass,
696
+ notes: notes.list(),
697
+ };
698
+ }
699
+ /**
700
+ * Applies the stylesheet to the element data with graph-io's Cytoscape.js engine and gives every element whose drawn
701
+ * value differs from the styles a bypass with the right value.
702
+ * @param e - the emit
703
+ * @param rules - the rules written (Cytoscape.js's own defaults left out)
704
+ * @returns the bypasses
705
+ */
706
+ function exactness(e, rules) {
707
+ const { extracted } = e;
708
+ const nodes = e.data.node.length;
709
+ const elements = [];
710
+ for (let i = 0; i < nodes; i++) {
711
+ elements.push({
712
+ group: "nodes",
713
+ data: { ...dataColumns(extracted, "node", i), ...e.data.node[i], id: `n${String(i)}` },
714
+ });
715
+ }
716
+ // the edges join two nodes (no loops: Cytoscape.js draws a loop curved whatever the stylesheet says)
717
+ const far = nodes > 1 ? "n1" : "n0";
718
+ for (let i = 0; i < e.data.edge.length && nodes > 0; i++) {
719
+ elements.push({
720
+ group: "edges",
721
+ data: {
722
+ ...dataColumns(extracted, "edge", i),
723
+ ...e.data.edge[i],
724
+ id: `e${String(i)}`,
725
+ source: "n0",
726
+ target: far,
727
+ },
728
+ });
729
+ }
730
+ const drawn = evaluateCytoscapeJs({ elements, style: e.stylesheet, toolDefaults: false });
731
+ const out = {
732
+ node: [],
733
+ edge: [],
734
+ };
735
+ for (const target of ["node", "edge"]) {
736
+ const n = e.data[target].length;
737
+ const src = refSource(target, n, extracted.columns[target], extracted.features[target]);
738
+ const rows = new Array(n).fill(null);
739
+ for (const property of STYLE_PROPERTIES[target].keys()) {
740
+ const want = resolveRules(rules, target, property, src);
741
+ addBypasses(rows, target, property, want, drawn[target].values[property]);
742
+ }
743
+ out[target] = rows;
744
+ }
745
+ return out;
746
+ }
747
+ /**
748
+ * A bypass of one property for every element whose drawn value differs from the styles' and that Cytoscape.js can
749
+ * hold exactly.
750
+ * @param rows - the bypasses, changed in place
751
+ * @param target - nodes or edges
752
+ * @param property - the property
753
+ * @param want - the styles' values
754
+ * @param got - what is drawn, or undefined for nothing
755
+ */
756
+ function addBypasses(rows, target, property, want, got) {
757
+ for (let i = 0; i < rows.length; i++) {
758
+ const w = want[i];
759
+ const conv = w === null || (got?.[i] ?? null) === w ? null : toCyjs(target, property, w);
760
+ if (conv !== null && !conv.approximate) {
761
+ rows[i] = { ...rows[i], ...conv.props };
762
+ }
763
+ }
764
+ }
765
+ /**
766
+ * The names of the data columns among the styles' features.
767
+ * @param extracted - the styles
768
+ * @param target - nodes or edges
769
+ * @returns the names
770
+ */
771
+ function dataNames(extracted, target) {
772
+ return extracted.features[target].flatMap((f) => ("data" in f.ref ? [f.ref.data] : []));
773
+ }
774
+ /**
775
+ * An element's data columns from the styles' features: what a consumer writes into element data from the graph.
776
+ * @param extracted - the styles
777
+ * @param target - nodes or edges
778
+ * @param i - the element
779
+ * @returns the data fields
780
+ */
781
+ function dataColumns(extracted, target, i) {
782
+ const out = Object.create(null);
783
+ for (const f of extracted.features[target]) {
784
+ if ("data" in f.ref && f.values[i] !== null) {
785
+ out[f.ref.data] = f.values[i];
786
+ }
787
+ }
788
+ return out;
789
+ }
790
+ //# sourceMappingURL=emit.js.map