@graphty/graph-io 0.3.43 → 0.3.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/dist/chunks/approximations-3Q4TsdTh.js +40 -0
  2. package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
  3. package/dist/chunks/block-JQiwViEt.js +2777 -0
  4. package/dist/chunks/block-JQiwViEt.js.map +1 -0
  5. package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
  6. package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
  7. package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
  8. package/dist/chunks/constants-BFUR_CtU.js.map +1 -0
  9. package/dist/chunks/convert-BcQ8_jMo.js +59 -0
  10. package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
  11. package/dist/chunks/emit-DCwFLts5.js +3456 -0
  12. package/dist/chunks/emit-DCwFLts5.js.map +1 -0
  13. package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
  14. package/dist/chunks/escape-B1rMftd9.js.map +1 -0
  15. package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
  16. package/dist/chunks/export-D7IGzTG4.js.map +1 -0
  17. package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
  18. package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
  19. package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
  20. package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
  21. package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
  22. package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
  23. package/dist/chunks/{exporter-RVtXVetw.js → exporter-quPUCBiC.js} +1805 -287
  24. package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
  25. package/dist/chunks/format-GDmO6m6Q.js +676 -0
  26. package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
  27. package/dist/chunks/generic-BL06jrJf.js +1347 -0
  28. package/dist/chunks/generic-BL06jrJf.js.map +1 -0
  29. package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
  30. package/dist/chunks/importer-B7r2owVf.js.map +1 -0
  31. package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
  32. package/dist/chunks/importer-BFmOP96W.js.map +1 -0
  33. package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
  34. package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
  35. package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
  36. package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
  37. package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
  38. package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
  39. package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
  40. package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
  41. package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
  42. package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
  43. package/dist/chunks/index-B9fdNpTA.js +4310 -0
  44. package/dist/chunks/index-B9fdNpTA.js.map +1 -0
  45. package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
  46. package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
  47. package/dist/chunks/lexicon-B-knUi-l.js +508 -0
  48. package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
  49. package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
  50. package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
  51. package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
  52. package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
  53. package/dist/chunks/styles-Brt9JMfs.js +690 -0
  54. package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
  55. package/dist/chunks/styles-_N-C8S-U.js +2102 -0
  56. package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
  57. package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
  58. package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
  59. package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
  60. package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
  61. package/dist/chunks/units-XMZFIFe1.js +19 -0
  62. package/dist/chunks/units-XMZFIFe1.js.map +1 -0
  63. package/dist/csv.js +5 -4
  64. package/dist/csv.js.map +1 -1
  65. package/dist/cx.js +1 -1
  66. package/dist/cx2.js +2 -2
  67. package/dist/cys.js +1 -1
  68. package/dist/dot.js +5 -2
  69. package/dist/dot.js.map +1 -1
  70. package/dist/gexf.js +292 -412
  71. package/dist/gexf.js.map +1 -1
  72. package/dist/gml.js +8 -3031
  73. package/dist/gml.js.map +1 -1
  74. package/dist/graph-io.js +354 -240
  75. package/dist/graph-io.js.map +1 -1
  76. package/dist/graphml.js +4 -2
  77. package/dist/graphml.js.map +1 -1
  78. package/dist/json.js +1 -1
  79. package/dist/neo4j.js +4 -3
  80. package/dist/neo4j.js.map +1 -1
  81. package/dist/obo.js +1 -1
  82. package/dist/pajek.js +4 -2
  83. package/dist/positions.d.ts +1 -0
  84. package/dist/positions.js +427 -0
  85. package/dist/positions.js.map +1 -0
  86. package/dist/src/common/codes.d.ts +6 -0
  87. package/dist/src/common/codes.d.ts.map +1 -1
  88. package/dist/src/common/codes.js +6 -0
  89. package/dist/src/common/codes.js.map +1 -1
  90. package/dist/src/common/escape.d.ts.map +1 -1
  91. package/dist/src/common/escape.js +4 -2
  92. package/dist/src/common/escape.js.map +1 -1
  93. package/dist/src/common/export.d.ts +10 -0
  94. package/dist/src/common/export.d.ts.map +1 -1
  95. package/dist/src/common/export.js +123 -100
  96. package/dist/src/common/export.js.map +1 -1
  97. package/dist/src/common/input.d.ts.map +1 -1
  98. package/dist/src/common/input.js +8 -1
  99. package/dist/src/common/input.js.map +1 -1
  100. package/dist/src/common/json-elements.d.ts +12 -9
  101. package/dist/src/common/json-elements.d.ts.map +1 -1
  102. package/dist/src/common/json-elements.js +160 -37
  103. package/dist/src/common/json-elements.js.map +1 -1
  104. package/dist/src/common/notes.d.ts +42 -0
  105. package/dist/src/common/notes.d.ts.map +1 -0
  106. package/dist/src/common/notes.js +72 -0
  107. package/dist/src/common/notes.js.map +1 -0
  108. package/dist/src/common/report.d.ts +18 -0
  109. package/dist/src/common/report.d.ts.map +1 -1
  110. package/dist/src/common/report.js +36 -1
  111. package/dist/src/common/report.js.map +1 -1
  112. package/dist/src/common/units.d.ts +24 -0
  113. package/dist/src/common/units.d.ts.map +1 -0
  114. package/dist/src/common/units.js +26 -0
  115. package/dist/src/common/units.js.map +1 -0
  116. package/dist/src/common/xml.d.ts +18 -0
  117. package/dist/src/common/xml.d.ts.map +1 -1
  118. package/dist/src/common/xml.js +42 -5
  119. package/dist/src/common/xml.js.map +1 -1
  120. package/dist/src/formats/cx/exporter.d.ts +6 -0
  121. package/dist/src/formats/cx/exporter.d.ts.map +1 -1
  122. package/dist/src/formats/cx/exporter.js +71 -8
  123. package/dist/src/formats/cx/exporter.js.map +1 -1
  124. package/dist/src/formats/cx/importer.d.ts +5 -2
  125. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cx/importer.js +102 -72
  127. package/dist/src/formats/cx/importer.js.map +1 -1
  128. package/dist/src/formats/cx/styles.d.ts +102 -0
  129. package/dist/src/formats/cx/styles.d.ts.map +1 -0
  130. package/dist/src/formats/cx/styles.js +225 -0
  131. package/dist/src/formats/cx/styles.js.map +1 -0
  132. package/dist/src/formats/cx2/exporter.d.ts +5 -0
  133. package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
  134. package/dist/src/formats/cx2/exporter.js +181 -71
  135. package/dist/src/formats/cx2/exporter.js.map +1 -1
  136. package/dist/src/formats/cx2/importer.d.ts +4 -1
  137. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  138. package/dist/src/formats/cx2/importer.js +19 -1
  139. package/dist/src/formats/cx2/importer.js.map +1 -1
  140. package/dist/src/formats/cx2/styles.d.ts +18 -0
  141. package/dist/src/formats/cx2/styles.d.ts.map +1 -0
  142. package/dist/src/formats/cx2/styles.js +24 -0
  143. package/dist/src/formats/cx2/styles.js.map +1 -0
  144. package/dist/src/formats/cys/constants.d.ts +2 -0
  145. package/dist/src/formats/cys/constants.d.ts.map +1 -1
  146. package/dist/src/formats/cys/constants.js +2 -0
  147. package/dist/src/formats/cys/constants.js.map +1 -1
  148. package/dist/src/formats/cys/exporter.d.ts +6 -2
  149. package/dist/src/formats/cys/exporter.d.ts.map +1 -1
  150. package/dist/src/formats/cys/exporter.js +215 -53
  151. package/dist/src/formats/cys/exporter.js.map +1 -1
  152. package/dist/src/formats/cys/importer.d.ts +2 -1
  153. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  154. package/dist/src/formats/cys/importer.js +119 -6
  155. package/dist/src/formats/cys/importer.js.map +1 -1
  156. package/dist/src/formats/cys/session.d.ts +2 -0
  157. package/dist/src/formats/cys/session.d.ts.map +1 -1
  158. package/dist/src/formats/cys/session.js +5 -0
  159. package/dist/src/formats/cys/session.js.map +1 -1
  160. package/dist/src/formats/cys/styles.d.ts +38 -0
  161. package/dist/src/formats/cys/styles.d.ts.map +1 -0
  162. package/dist/src/formats/cys/styles.js +213 -0
  163. package/dist/src/formats/cys/styles.js.map +1 -0
  164. package/dist/src/formats/cys/tables.d.ts +8 -3
  165. package/dist/src/formats/cys/tables.d.ts.map +1 -1
  166. package/dist/src/formats/cys/tables.js +88 -34
  167. package/dist/src/formats/cys/tables.js.map +1 -1
  168. package/dist/src/formats/dot/exporter.d.ts +2 -0
  169. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  170. package/dist/src/formats/dot/exporter.js +195 -81
  171. package/dist/src/formats/dot/exporter.js.map +1 -1
  172. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  173. package/dist/src/formats/dot/importer.js +100 -20
  174. package/dist/src/formats/dot/importer.js.map +1 -1
  175. package/dist/src/formats/dot/index.d.ts +1 -0
  176. package/dist/src/formats/dot/index.d.ts.map +1 -1
  177. package/dist/src/formats/dot/index.js +1 -0
  178. package/dist/src/formats/dot/index.js.map +1 -1
  179. package/dist/src/formats/dot/positions.d.ts +14 -0
  180. package/dist/src/formats/dot/positions.d.ts.map +1 -0
  181. package/dist/src/formats/dot/positions.js +70 -0
  182. package/dist/src/formats/dot/positions.js.map +1 -0
  183. package/dist/src/formats/dot/styles.d.ts +82 -0
  184. package/dist/src/formats/dot/styles.d.ts.map +1 -0
  185. package/dist/src/formats/dot/styles.js +1484 -0
  186. package/dist/src/formats/dot/styles.js.map +1 -0
  187. package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
  188. package/dist/src/formats/gexf/exporter.js +20 -5
  189. package/dist/src/formats/gexf/exporter.js.map +1 -1
  190. package/dist/src/formats/gexf/importer.d.ts +8 -1
  191. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  192. package/dist/src/formats/gexf/importer.js +251 -131
  193. package/dist/src/formats/gexf/importer.js.map +1 -1
  194. package/dist/src/formats/gexf/index.d.ts +8 -0
  195. package/dist/src/formats/gexf/index.d.ts.map +1 -1
  196. package/dist/src/formats/gexf/index.js +10 -2
  197. package/dist/src/formats/gexf/index.js.map +1 -1
  198. package/dist/src/formats/gexf/schema.d.ts +5 -0
  199. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  200. package/dist/src/formats/gexf/schema.js +5 -0
  201. package/dist/src/formats/gexf/schema.js.map +1 -1
  202. package/dist/src/formats/gexf/styles.d.ts +74 -0
  203. package/dist/src/formats/gexf/styles.d.ts.map +1 -0
  204. package/dist/src/formats/gexf/styles.js +604 -0
  205. package/dist/src/formats/gexf/styles.js.map +1 -0
  206. package/dist/src/formats/gml/exporter.d.ts +1 -5
  207. package/dist/src/formats/gml/exporter.d.ts.map +1 -1
  208. package/dist/src/formats/gml/exporter.js +19 -8
  209. package/dist/src/formats/gml/exporter.js.map +1 -1
  210. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  211. package/dist/src/formats/gml/importer.js +4 -0
  212. package/dist/src/formats/gml/importer.js.map +1 -1
  213. package/dist/src/formats/gml/index.d.ts +2 -1
  214. package/dist/src/formats/gml/index.d.ts.map +1 -1
  215. package/dist/src/formats/gml/index.js +2 -1
  216. package/dist/src/formats/gml/index.js.map +1 -1
  217. package/dist/src/formats/gml/positions.d.ts +14 -0
  218. package/dist/src/formats/gml/positions.d.ts.map +1 -0
  219. package/dist/src/formats/gml/positions.js +46 -0
  220. package/dist/src/formats/gml/positions.js.map +1 -0
  221. package/dist/src/formats/gml/styles.d.ts +59 -0
  222. package/dist/src/formats/gml/styles.d.ts.map +1 -0
  223. package/dist/src/formats/gml/styles.js +1056 -0
  224. package/dist/src/formats/gml/styles.js.map +1 -0
  225. package/dist/src/formats/gml/syntax.d.ts +11 -0
  226. package/dist/src/formats/gml/syntax.d.ts.map +1 -1
  227. package/dist/src/formats/gml/syntax.js +151 -62
  228. package/dist/src/formats/gml/syntax.js.map +1 -1
  229. package/dist/src/formats/graphml/constants.d.ts +4 -0
  230. package/dist/src/formats/graphml/constants.d.ts.map +1 -1
  231. package/dist/src/formats/graphml/constants.js +5 -1
  232. package/dist/src/formats/graphml/constants.js.map +1 -1
  233. package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
  234. package/dist/src/formats/graphml/exporter.js +133 -65
  235. package/dist/src/formats/graphml/exporter.js.map +1 -1
  236. package/dist/src/formats/graphml/importer.d.ts +4 -1
  237. package/dist/src/formats/graphml/importer.d.ts.map +1 -1
  238. package/dist/src/formats/graphml/importer.js +100 -44
  239. package/dist/src/formats/graphml/importer.js.map +1 -1
  240. package/dist/src/formats/graphml/index.d.ts +1 -0
  241. package/dist/src/formats/graphml/index.d.ts.map +1 -1
  242. package/dist/src/formats/graphml/index.js +1 -0
  243. package/dist/src/formats/graphml/index.js.map +1 -1
  244. package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
  245. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
  246. package/dist/src/formats/graphml/styles-plain.js +187 -0
  247. package/dist/src/formats/graphml/styles-plain.js.map +1 -0
  248. package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
  249. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
  250. package/dist/src/formats/graphml/styles-yed.js +1086 -0
  251. package/dist/src/formats/graphml/styles-yed.js.map +1 -0
  252. package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
  253. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
  254. package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
  255. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
  256. package/dist/src/formats/graphml/tree.d.ts.map +1 -1
  257. package/dist/src/formats/graphml/tree.js +34 -19
  258. package/dist/src/formats/graphml/tree.js.map +1 -1
  259. package/dist/src/formats/graphml/yfiles.d.ts +16 -2
  260. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  261. package/dist/src/formats/graphml/yfiles.js +83 -12
  262. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  263. package/dist/src/formats/json/exporter.d.ts +5 -0
  264. package/dist/src/formats/json/exporter.d.ts.map +1 -1
  265. package/dist/src/formats/json/exporter.js +68 -25
  266. package/dist/src/formats/json/exporter.js.map +1 -1
  267. package/dist/src/formats/json/importer.d.ts +22 -3
  268. package/dist/src/formats/json/importer.d.ts.map +1 -1
  269. package/dist/src/formats/json/importer.js +439 -264
  270. package/dist/src/formats/json/importer.js.map +1 -1
  271. package/dist/src/formats/json/positions.d.ts +16 -0
  272. package/dist/src/formats/json/positions.d.ts.map +1 -0
  273. package/dist/src/formats/json/positions.js +44 -0
  274. package/dist/src/formats/json/positions.js.map +1 -0
  275. package/dist/src/formats/json/styles.d.ts +102 -0
  276. package/dist/src/formats/json/styles.d.ts.map +1 -0
  277. package/dist/src/formats/json/styles.js +1753 -0
  278. package/dist/src/formats/json/styles.js.map +1 -0
  279. package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
  280. package/dist/src/formats/neo4j/exporter.js +2 -1
  281. package/dist/src/formats/neo4j/exporter.js.map +1 -1
  282. package/dist/src/formats/pajek/exporter.d.ts +2 -0
  283. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  284. package/dist/src/formats/pajek/exporter.js +142 -76
  285. package/dist/src/formats/pajek/exporter.js.map +1 -1
  286. package/dist/src/formats/pajek/importer.d.ts +4 -0
  287. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  288. package/dist/src/formats/pajek/importer.js +60 -6
  289. package/dist/src/formats/pajek/importer.js.map +1 -1
  290. package/dist/src/formats/pajek/index.d.ts +2 -0
  291. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  292. package/dist/src/formats/pajek/index.js +2 -0
  293. package/dist/src/formats/pajek/index.js.map +1 -1
  294. package/dist/src/formats/pajek/styles.d.ts +50 -0
  295. package/dist/src/formats/pajek/styles.d.ts.map +1 -0
  296. package/dist/src/formats/pajek/styles.js +569 -0
  297. package/dist/src/formats/pajek/styles.js.map +1 -0
  298. package/dist/src/formats/pajek/syntax.d.ts +6 -0
  299. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  300. package/dist/src/formats/pajek/syntax.js +6 -0
  301. package/dist/src/formats/pajek/syntax.js.map +1 -1
  302. package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
  303. package/dist/src/formats/xgmml/columns.js +34 -9
  304. package/dist/src/formats/xgmml/columns.js.map +1 -1
  305. package/dist/src/formats/xgmml/constants.d.ts +2 -0
  306. package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
  307. package/dist/src/formats/xgmml/constants.js +3 -1
  308. package/dist/src/formats/xgmml/constants.js.map +1 -1
  309. package/dist/src/formats/xgmml/document.d.ts +12 -8
  310. package/dist/src/formats/xgmml/document.d.ts.map +1 -1
  311. package/dist/src/formats/xgmml/document.js +56 -13
  312. package/dist/src/formats/xgmml/document.js.map +1 -1
  313. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  314. package/dist/src/formats/xgmml/emit.js +12 -6
  315. package/dist/src/formats/xgmml/emit.js.map +1 -1
  316. package/dist/src/formats/xgmml/exporter.d.ts +3 -1
  317. package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
  318. package/dist/src/formats/xgmml/exporter.js +22 -9
  319. package/dist/src/formats/xgmml/exporter.js.map +1 -1
  320. package/dist/src/formats/xgmml/importer.d.ts +2 -1
  321. package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
  322. package/dist/src/formats/xgmml/importer.js +31 -24
  323. package/dist/src/formats/xgmml/importer.js.map +1 -1
  324. package/dist/src/formats/xgmml/styles.d.ts +104 -0
  325. package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
  326. package/dist/src/formats/xgmml/styles.js +310 -0
  327. package/dist/src/formats/xgmml/styles.js.map +1 -0
  328. package/dist/src/index.d.ts +9 -7
  329. package/dist/src/index.d.ts.map +1 -1
  330. package/dist/src/index.js +7 -7
  331. package/dist/src/index.js.map +1 -1
  332. package/dist/src/positions/codes.d.ts +31 -0
  333. package/dist/src/positions/codes.d.ts.map +1 -0
  334. package/dist/src/positions/codes.js +26 -0
  335. package/dist/src/positions/codes.js.map +1 -0
  336. package/dist/src/positions/convert.d.ts +58 -0
  337. package/dist/src/positions/convert.d.ts.map +1 -0
  338. package/dist/src/positions/convert.js +107 -0
  339. package/dist/src/positions/convert.js.map +1 -0
  340. package/dist/src/positions/extract.d.ts +27 -0
  341. package/dist/src/positions/extract.d.ts.map +1 -0
  342. package/dist/src/positions/extract.js +526 -0
  343. package/dist/src/positions/extract.js.map +1 -0
  344. package/dist/src/positions/index.d.ts +10 -0
  345. package/dist/src/positions/index.d.ts.map +1 -0
  346. package/dist/src/positions/index.js +9 -0
  347. package/dist/src/positions/index.js.map +1 -0
  348. package/dist/src/positions/types.d.ts +208 -0
  349. package/dist/src/positions/types.d.ts.map +1 -0
  350. package/dist/src/positions/types.js +10 -0
  351. package/dist/src/positions/types.js.map +1 -0
  352. package/dist/src/registry.d.ts +30 -0
  353. package/dist/src/registry.d.ts.map +1 -1
  354. package/dist/src/registry.js +130 -9
  355. package/dist/src/registry.js.map +1 -1
  356. package/dist/src/styles/annotations.d.ts +132 -0
  357. package/dist/src/styles/annotations.d.ts.map +1 -0
  358. package/dist/src/styles/annotations.js +320 -0
  359. package/dist/src/styles/annotations.js.map +1 -0
  360. package/dist/src/styles/budget.d.ts +45 -0
  361. package/dist/src/styles/budget.d.ts.map +1 -0
  362. package/dist/src/styles/budget.js +58 -0
  363. package/dist/src/styles/budget.js.map +1 -0
  364. package/dist/src/styles/canon/bends.d.ts +32 -0
  365. package/dist/src/styles/canon/bends.d.ts.map +1 -0
  366. package/dist/src/styles/canon/bends.js +74 -0
  367. package/dist/src/styles/canon/bends.js.map +1 -0
  368. package/dist/src/styles/canon/color-tables.d.ts +22 -0
  369. package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
  370. package/dist/src/styles/canon/color-tables.js +369 -0
  371. package/dist/src/styles/canon/color-tables.js.map +1 -0
  372. package/dist/src/styles/canon/color.d.ts +66 -0
  373. package/dist/src/styles/canon/color.d.ts.map +1 -0
  374. package/dist/src/styles/canon/color.js +548 -0
  375. package/dist/src/styles/canon/color.js.map +1 -0
  376. package/dist/src/styles/canon/enums.d.ts +25 -0
  377. package/dist/src/styles/canon/enums.d.ts.map +1 -0
  378. package/dist/src/styles/canon/enums.js +187 -0
  379. package/dist/src/styles/canon/enums.js.map +1 -0
  380. package/dist/src/styles/canon/graphviz.d.ts +48 -0
  381. package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
  382. package/dist/src/styles/canon/graphviz.js +160 -0
  383. package/dist/src/styles/canon/graphviz.js.map +1 -0
  384. package/dist/src/styles/canon/index.d.ts +13 -0
  385. package/dist/src/styles/canon/index.d.ts.map +1 -0
  386. package/dist/src/styles/canon/index.js +13 -0
  387. package/dist/src/styles/canon/index.js.map +1 -0
  388. package/dist/src/styles/canon/number.d.ts +59 -0
  389. package/dist/src/styles/canon/number.d.ts.map +1 -0
  390. package/dist/src/styles/canon/number.js +142 -0
  391. package/dist/src/styles/canon/number.js.map +1 -0
  392. package/dist/src/styles/canon/site.d.ts +51 -0
  393. package/dist/src/styles/canon/site.d.ts.map +1 -0
  394. package/dist/src/styles/canon/site.js +63 -0
  395. package/dist/src/styles/canon/site.js.map +1 -0
  396. package/dist/src/styles/canon/text.d.ts +61 -0
  397. package/dist/src/styles/canon/text.d.ts.map +1 -0
  398. package/dist/src/styles/canon/text.js +199 -0
  399. package/dist/src/styles/canon/text.js.map +1 -0
  400. package/dist/src/styles/codes.d.ts +95 -0
  401. package/dist/src/styles/codes.d.ts.map +1 -0
  402. package/dist/src/styles/codes.js +97 -0
  403. package/dist/src/styles/codes.js.map +1 -0
  404. package/dist/src/styles/cyjs/cascade.d.ts +134 -0
  405. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
  406. package/dist/src/styles/cyjs/cascade.js +2252 -0
  407. package/dist/src/styles/cyjs/cascade.js.map +1 -0
  408. package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
  409. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
  410. package/dist/src/styles/cyjs/defaults-table.js +76 -0
  411. package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
  412. package/dist/src/styles/cyjs/emit.d.ts +82 -0
  413. package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
  414. package/dist/src/styles/cyjs/emit.js +790 -0
  415. package/dist/src/styles/cyjs/emit.js.map +1 -0
  416. package/dist/src/styles/cyjs/index.d.ts +13 -0
  417. package/dist/src/styles/cyjs/index.d.ts.map +1 -0
  418. package/dist/src/styles/cyjs/index.js +13 -0
  419. package/dist/src/styles/cyjs/index.js.map +1 -0
  420. package/dist/src/styles/cyjs/live.d.ts +46 -0
  421. package/dist/src/styles/cyjs/live.d.ts.map +1 -0
  422. package/dist/src/styles/cyjs/live.js +108 -0
  423. package/dist/src/styles/cyjs/live.js.map +1 -0
  424. package/dist/src/styles/cyjs/mappers.d.ts +147 -0
  425. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
  426. package/dist/src/styles/cyjs/mappers.js +744 -0
  427. package/dist/src/styles/cyjs/mappers.js.map +1 -0
  428. package/dist/src/styles/cyjs/selector.d.ts +113 -0
  429. package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
  430. package/dist/src/styles/cyjs/selector.js +611 -0
  431. package/dist/src/styles/cyjs/selector.js.map +1 -0
  432. package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
  433. package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
  434. package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
  435. package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
  436. package/dist/src/styles/cytoscape/emit.d.ts +125 -0
  437. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
  438. package/dist/src/styles/cytoscape/emit.js +1025 -0
  439. package/dist/src/styles/cytoscape/emit.js.map +1 -0
  440. package/dist/src/styles/cytoscape/index.d.ts +10 -0
  441. package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
  442. package/dist/src/styles/cytoscape/index.js +10 -0
  443. package/dist/src/styles/cytoscape/index.js.map +1 -0
  444. package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
  445. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
  446. package/dist/src/styles/cytoscape/lexicon.js +603 -0
  447. package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
  448. package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
  449. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
  450. package/dist/src/styles/cytoscape/mappings.js +460 -0
  451. package/dist/src/styles/cytoscape/mappings.js.map +1 -0
  452. package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
  453. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
  454. package/dist/src/styles/cytoscape/resolve.js +381 -0
  455. package/dist/src/styles/cytoscape/resolve.js.map +1 -0
  456. package/dist/src/styles/cytoscape/translate.d.ts +50 -0
  457. package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
  458. package/dist/src/styles/cytoscape/translate.js +156 -0
  459. package/dist/src/styles/cytoscape/translate.js.map +1 -0
  460. package/dist/src/styles/defaults.d.ts +90 -0
  461. package/dist/src/styles/defaults.d.ts.map +1 -0
  462. package/dist/src/styles/defaults.js +414 -0
  463. package/dist/src/styles/defaults.js.map +1 -0
  464. package/dist/src/styles/index.d.ts +15 -0
  465. package/dist/src/styles/index.d.ts.map +1 -0
  466. package/dist/src/styles/index.js +14 -0
  467. package/dist/src/styles/index.js.map +1 -0
  468. package/dist/src/styles/internal.d.ts +17 -0
  469. package/dist/src/styles/internal.d.ts.map +1 -0
  470. package/dist/src/styles/internal.js +16 -0
  471. package/dist/src/styles/internal.js.map +1 -0
  472. package/dist/src/styles/io/approximations.d.ts +24 -0
  473. package/dist/src/styles/io/approximations.d.ts.map +1 -0
  474. package/dist/src/styles/io/approximations.js +51 -0
  475. package/dist/src/styles/io/approximations.js.map +1 -0
  476. package/dist/src/styles/io/block.d.ts +166 -0
  477. package/dist/src/styles/io/block.d.ts.map +1 -0
  478. package/dist/src/styles/io/block.js +930 -0
  479. package/dist/src/styles/io/block.js.map +1 -0
  480. package/dist/src/styles/io/generic.d.ts +88 -0
  481. package/dist/src/styles/io/generic.d.ts.map +1 -0
  482. package/dist/src/styles/io/generic.js +516 -0
  483. package/dist/src/styles/io/generic.js.map +1 -0
  484. package/dist/src/styles/io/index.d.ts +8 -0
  485. package/dist/src/styles/io/index.d.ts.map +1 -0
  486. package/dist/src/styles/io/index.js +7 -0
  487. package/dist/src/styles/io/index.js.map +1 -0
  488. package/dist/src/styles/io/writer.d.ts +80 -0
  489. package/dist/src/styles/io/writer.d.ts.map +1 -0
  490. package/dist/src/styles/io/writer.js +596 -0
  491. package/dist/src/styles/io/writer.js.map +1 -0
  492. package/dist/src/styles/notes.d.ts +47 -0
  493. package/dist/src/styles/notes.d.ts.map +1 -0
  494. package/dist/src/styles/notes.js +140 -0
  495. package/dist/src/styles/notes.js.map +1 -0
  496. package/dist/src/styles/plan/classes.d.ts +31 -0
  497. package/dist/src/styles/plan/classes.d.ts.map +1 -0
  498. package/dist/src/styles/plan/classes.js +139 -0
  499. package/dist/src/styles/plan/classes.js.map +1 -0
  500. package/dist/src/styles/plan/continuous.d.ts +32 -0
  501. package/dist/src/styles/plan/continuous.d.ts.map +1 -0
  502. package/dist/src/styles/plan/continuous.js +165 -0
  503. package/dist/src/styles/plan/continuous.js.map +1 -0
  504. package/dist/src/styles/plan/discrete.d.ts +39 -0
  505. package/dist/src/styles/plan/discrete.d.ts.map +1 -0
  506. package/dist/src/styles/plan/discrete.js +127 -0
  507. package/dist/src/styles/plan/discrete.js.map +1 -0
  508. package/dist/src/styles/plan/families.d.ts +31 -0
  509. package/dist/src/styles/plan/families.d.ts.map +1 -0
  510. package/dist/src/styles/plan/families.js +95 -0
  511. package/dist/src/styles/plan/families.js.map +1 -0
  512. package/dist/src/styles/plan/features.d.ts +58 -0
  513. package/dist/src/styles/plan/features.d.ts.map +1 -0
  514. package/dist/src/styles/plan/features.js +185 -0
  515. package/dist/src/styles/plan/features.js.map +1 -0
  516. package/dist/src/styles/plan/index.d.ts +7 -0
  517. package/dist/src/styles/plan/index.d.ts.map +1 -0
  518. package/dist/src/styles/plan/index.js +7 -0
  519. package/dist/src/styles/plan/index.js.map +1 -0
  520. package/dist/src/styles/plan/plan.d.ts +71 -0
  521. package/dist/src/styles/plan/plan.d.ts.map +1 -0
  522. package/dist/src/styles/plan/plan.js +893 -0
  523. package/dist/src/styles/plan/plan.js.map +1 -0
  524. package/dist/src/styles/plan/resolve.d.ts +137 -0
  525. package/dist/src/styles/plan/resolve.d.ts.map +1 -0
  526. package/dist/src/styles/plan/resolve.js +587 -0
  527. package/dist/src/styles/plan/resolve.js.map +1 -0
  528. package/dist/src/styles/types.d.ts +702 -0
  529. package/dist/src/styles/types.d.ts.map +1 -0
  530. package/dist/src/styles/types.js +10 -0
  531. package/dist/src/styles/types.js.map +1 -0
  532. package/dist/src/styles/vocabulary.d.ts +41 -0
  533. package/dist/src/styles/vocabulary.d.ts.map +1 -0
  534. package/dist/src/styles/vocabulary.js +140 -0
  535. package/dist/src/styles/vocabulary.js.map +1 -0
  536. package/dist/src/types.d.ts +64 -1
  537. package/dist/src/types.d.ts.map +1 -1
  538. package/dist/src/types.js.map +1 -1
  539. package/dist/styles.d.ts +1 -0
  540. package/dist/styles.js +322 -0
  541. package/dist/styles.js.map +1 -0
  542. package/dist/xgmml.js +5 -4
  543. package/dist/xgmml.js.map +1 -1
  544. package/package.json +13 -2
  545. package/src/common/codes.ts +7 -0
  546. package/src/common/escape.ts +5 -2
  547. package/src/common/export.ts +179 -140
  548. package/src/common/input.ts +8 -4
  549. package/src/common/json-elements.ts +169 -38
  550. package/src/common/notes.ts +94 -0
  551. package/src/common/report.ts +41 -1
  552. package/src/common/units.ts +42 -0
  553. package/src/common/xml.ts +45 -5
  554. package/src/formats/cx/exporter.ts +95 -11
  555. package/src/formats/cx/importer.ts +126 -90
  556. package/src/formats/cx/styles.ts +304 -0
  557. package/src/formats/cx2/exporter.ts +234 -77
  558. package/src/formats/cx2/importer.ts +19 -1
  559. package/src/formats/cx2/styles.ts +29 -0
  560. package/src/formats/cys/constants.ts +3 -0
  561. package/src/formats/cys/exporter.ts +246 -60
  562. package/src/formats/cys/importer.ts +125 -9
  563. package/src/formats/cys/session.ts +6 -0
  564. package/src/formats/cys/styles.ts +254 -0
  565. package/src/formats/cys/tables.ts +117 -48
  566. package/src/formats/dot/exporter.ts +262 -126
  567. package/src/formats/dot/importer.ts +111 -20
  568. package/src/formats/dot/index.ts +1 -0
  569. package/src/formats/dot/positions.ts +77 -0
  570. package/src/formats/dot/styles.ts +1741 -0
  571. package/src/formats/gexf/exporter.ts +27 -11
  572. package/src/formats/gexf/importer.ts +308 -158
  573. package/src/formats/gexf/index.ts +10 -0
  574. package/src/formats/gexf/schema.ts +5 -0
  575. package/src/formats/gexf/styles.ts +719 -0
  576. package/src/formats/gml/exporter.ts +33 -14
  577. package/src/formats/gml/importer.ts +4 -0
  578. package/src/formats/gml/index.ts +2 -1
  579. package/src/formats/gml/positions.ts +52 -0
  580. package/src/formats/gml/styles.ts +1248 -0
  581. package/src/formats/gml/syntax.ts +173 -62
  582. package/src/formats/graphml/constants.ts +5 -0
  583. package/src/formats/graphml/exporter.ts +163 -71
  584. package/src/formats/graphml/importer.ts +119 -45
  585. package/src/formats/graphml/index.ts +1 -0
  586. package/src/formats/graphml/styles-plain.ts +236 -0
  587. package/src/formats/graphml/styles-yed.ts +1221 -0
  588. package/src/formats/graphml/styles-yfiles3.ts +573 -0
  589. package/src/formats/graphml/tree.ts +36 -20
  590. package/src/formats/graphml/yfiles.ts +89 -13
  591. package/src/formats/json/exporter.ts +76 -26
  592. package/src/formats/json/importer.ts +541 -322
  593. package/src/formats/json/positions.ts +50 -0
  594. package/src/formats/json/styles.ts +2082 -0
  595. package/src/formats/neo4j/exporter.ts +2 -1
  596. package/src/formats/pajek/exporter.ts +195 -106
  597. package/src/formats/pajek/importer.ts +78 -9
  598. package/src/formats/pajek/index.ts +2 -0
  599. package/src/formats/pajek/styles.ts +685 -0
  600. package/src/formats/pajek/syntax.ts +7 -0
  601. package/src/formats/xgmml/columns.ts +39 -9
  602. package/src/formats/xgmml/constants.ts +3 -0
  603. package/src/formats/xgmml/document.ts +54 -12
  604. package/src/formats/xgmml/emit.ts +11 -6
  605. package/src/formats/xgmml/exporter.ts +32 -13
  606. package/src/formats/xgmml/importer.ts +43 -29
  607. package/src/formats/xgmml/styles.ts +400 -0
  608. package/src/index.ts +16 -0
  609. package/src/positions/codes.ts +32 -0
  610. package/src/positions/convert.ts +123 -0
  611. package/src/positions/extract.ts +619 -0
  612. package/src/positions/index.ts +23 -0
  613. package/src/positions/types.ts +221 -0
  614. package/src/registry.ts +179 -8
  615. package/src/styles/annotations.ts +478 -0
  616. package/src/styles/budget.ts +60 -0
  617. package/src/styles/canon/bends.ts +84 -0
  618. package/src/styles/canon/color-tables.ts +386 -0
  619. package/src/styles/canon/color.ts +624 -0
  620. package/src/styles/canon/enums.ts +211 -0
  621. package/src/styles/canon/graphviz.ts +189 -0
  622. package/src/styles/canon/index.ts +13 -0
  623. package/src/styles/canon/number.ts +152 -0
  624. package/src/styles/canon/site.ts +87 -0
  625. package/src/styles/canon/text.ts +221 -0
  626. package/src/styles/codes.ts +104 -0
  627. package/src/styles/cyjs/cascade.ts +2670 -0
  628. package/src/styles/cyjs/defaults-table.ts +82 -0
  629. package/src/styles/cyjs/emit.ts +951 -0
  630. package/src/styles/cyjs/index.ts +37 -0
  631. package/src/styles/cyjs/live.ts +147 -0
  632. package/src/styles/cyjs/mappers.ts +879 -0
  633. package/src/styles/cyjs/selector.ts +778 -0
  634. package/src/styles/cyjs/stylesheet-text.ts +214 -0
  635. package/src/styles/cytoscape/emit.ts +1264 -0
  636. package/src/styles/cytoscape/index.ts +40 -0
  637. package/src/styles/cytoscape/lexicon.ts +656 -0
  638. package/src/styles/cytoscape/mappings.ts +603 -0
  639. package/src/styles/cytoscape/resolve.ts +521 -0
  640. package/src/styles/cytoscape/translate.ts +237 -0
  641. package/src/styles/defaults.ts +504 -0
  642. package/src/styles/index.ts +57 -0
  643. package/src/styles/internal.ts +17 -0
  644. package/src/styles/io/approximations.ts +47 -0
  645. package/src/styles/io/block.ts +1138 -0
  646. package/src/styles/io/generic.ts +687 -0
  647. package/src/styles/io/index.ts +18 -0
  648. package/src/styles/io/writer.ts +745 -0
  649. package/src/styles/notes.ts +165 -0
  650. package/src/styles/plan/classes.ts +166 -0
  651. package/src/styles/plan/continuous.ts +218 -0
  652. package/src/styles/plan/discrete.ts +165 -0
  653. package/src/styles/plan/families.ts +115 -0
  654. package/src/styles/plan/features.ts +234 -0
  655. package/src/styles/plan/index.ts +7 -0
  656. package/src/styles/plan/plan.ts +1129 -0
  657. package/src/styles/plan/resolve.ts +685 -0
  658. package/src/styles/types.ts +814 -0
  659. package/src/styles/vocabulary.ts +172 -0
  660. package/src/types.ts +76 -1
  661. package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
  662. package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
  663. package/dist/chunks/export-rKLeGQMo.js.map +0 -1
  664. package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
  665. package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
  666. package/dist/chunks/exporter-RVtXVetw.js.map +0 -1
  667. package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
  668. package/dist/chunks/importer-C98dpSH4.js.map +0 -1
  669. package/dist/chunks/importer-D794XUTe.js.map +0 -1
  670. package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
  671. package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
  672. package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
  673. package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
  674. package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
@@ -6,6 +6,11 @@
6
6
  * `z` from the `z` column), `edges`, the `cx2.bypass` columns as `nodeBypasses` / `edgeBypasses`,
7
7
  * the opaque aspects a CX2 import kept (which returns its own style rules) and `status`.
8
8
  *
9
+ * Given styles (`exportGraph(..., { styles })`), `visualProperties` and `visualEditorProperties` are the
10
+ * Cytoscape style of the rules (defaults and mappings), the bypasses are every element whose value the style
11
+ * cannot give, and the style values the rules read are attributes; the `graphty.styles` block, which graph-io
12
+ * hands over as a graph attribute, is written as an aspect of its own (a kept one is written back the same way).
13
+ *
9
14
  * What CX2 cannot hold is announced by check() before anything is written: every edge is
10
15
  * directed (W_CX2_UNDIRECTED_AS_DIRECTED, W_MUTUAL_EXPANDED), node ids are integers (E_ID_CHARSET
11
16
  * unless `sanitizeIds: "mangle"`, which keeps the original in the `graphty:originalId` attribute
@@ -32,8 +37,13 @@ import { type ResolvedExportOptions, resolveExportOptions } from "../../common/o
32
37
  import { plural } from "../../common/plural.js";
33
38
  import { type ExplicitWeights, explicitWeights } from "../../common/weights.js";
34
39
  import { encodeChunks, joinText } from "../../common/writer.js";
40
+ import { cytoscapeCx2Aspects, type CytoscapeEmitted } from "../../styles/cytoscape/emit.js";
41
+ import { STYLE_BLOCK_NAME } from "../../styles/io/block.js";
42
+ import type { ExporterStyleOptions } from "../../styles/io/writer.js";
35
43
  import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
44
+ import { blockAspect, cytoscapeStyledExport, snapshotBlock } from "../cx/styles.js";
36
45
  import { BYPASS_NAMESPACE, CX2_FORMAT, cx2Type, ORIGINAL_ID_ATTRIBUTE } from "./importer.js";
46
+ import { CX2_STYLE_CAPABILITIES } from "./styles.js";
37
47
 
38
48
  /**
39
49
  * The options of the CX2 exporter: the common export options; it has none of its own.
@@ -142,8 +152,12 @@ const SKIPPED_ROLES: ReadonlySet<string> = new Set([
142
152
  "thickness",
143
153
  ]);
144
154
 
155
+ /** The style aspects; written from the styles when styles are given, else the kept ones. */
156
+ const STYLE_ASPECTS: ReadonlySet<string> = new Set(["visualProperties", "visualEditorProperties"]);
157
+
145
158
  /** The aspects the exporter writes itself; an opaque aspect of the same name is not written again. */
146
159
  const CORE_ASPECTS: ReadonlySet<string> = new Set([
160
+ STYLE_BLOCK_NAME,
147
161
  "nodes",
148
162
  "edges",
149
163
  "attributeDeclarations",
@@ -444,7 +458,8 @@ function plan(snapshot: GraphSnapshot, common: ResolvedExportOptions): Plan {
444
458
  const edgeAttrs = planEdgeAttributes(snapshot, weights, note);
445
459
  const graphAttrs = planAttributes(
446
460
  snapshot.graph,
447
- () => false,
461
+ // the graphty.styles block is an aspect of its own
462
+ (c) => c.meta.name === STYLE_BLOCK_NAME,
448
463
  (c) => c.meta.name,
449
464
  ).map((p) => ({ ...p, key: p.name }));
450
465
 
@@ -569,36 +584,16 @@ function attributesOf(plans: readonly AttributePlan[], row: number): Record<stri
569
584
  }
570
585
 
571
586
  /**
572
- * Write the document as text parts.
587
+ * The networkAttributes element and its declarations: the graph attributes, then the snapshot's name and
588
+ * description where no attribute of that name is written.
573
589
  * @param snapshot - the snapshot
574
590
  * @param p - the plan
575
- * @yields the document's text
576
- * @returns nothing
591
+ * @returns the element and the declarations
577
592
  */
578
- function* write(snapshot: GraphSnapshot, p: Plan): Generator<string, void, undefined> {
579
- if (p.fatal !== null) {
580
- throw p.fatal;
581
- }
582
- const { ids } = p;
583
- if (ids === null) {
584
- throw new GraphFormatError("E_INVALID_ID", "node ids cannot be written as CX2 integers", { reason: "charset" });
585
- }
586
- const { src, dst } = snapshot.edgeList();
587
- const edges: number[] = [];
588
- for (let e = 0; e < snapshot.edgeCount; e++) {
589
- if (!p.folding.folded(e)) {
590
- edges.push(e);
591
- }
592
- }
593
-
594
- const nodeDecls = declarations(p.nodeAttrs, true);
595
- if (p.originalIds) {
596
- nodeDecls[ORIGINAL_ID_ATTRIBUTE] = { d: "string" };
597
- }
598
- const edgeDecls = declarations(p.edgeAttrs, true);
599
- if (p.weights.weighted) {
600
- edgeDecls[WEIGHT_ATTRIBUTE] = { d: "double" };
601
- }
593
+ function networkOf(
594
+ snapshot: GraphSnapshot,
595
+ p: Plan,
596
+ ): { network: Record<string, unknown>; networkDecls: Record<string, unknown> } {
602
597
  const networkDecls = declarations(p.graphAttrs, false);
603
598
  const network: Record<string, unknown> = {};
604
599
  for (const a of p.graphAttrs) {
@@ -617,81 +612,155 @@ function* write(snapshot: GraphSnapshot, p: Plan): Generator<string, void, undef
617
612
  networkDecls[key] = { d: "string" };
618
613
  }
619
614
  }
620
- const kept = isRecord(meta.extra.cx2) ? meta.extra.cx2 : {};
615
+ return { network, networkDecls };
616
+ }
617
+
618
+ /**
619
+ * The attributeDeclarations element: the kept declarations of other tables, then the network's, the nodes' and the
620
+ * edges' where there are any.
621
+ * @param p - the plan
622
+ * @param kept - what an import kept in meta.extra.cx2
623
+ * @param networkDecls - the network's declarations
624
+ * @returns the element
625
+ */
626
+ function declarationsElementOf(
627
+ p: Plan,
628
+ kept: Record<string, unknown>,
629
+ networkDecls: Record<string, unknown>,
630
+ ): Record<string, unknown> {
631
+ const nodeDecls = declarations(p.nodeAttrs, true);
632
+ if (p.originalIds) {
633
+ nodeDecls[ORIGINAL_ID_ATTRIBUTE] = { d: "string" };
634
+ }
635
+ const edgeDecls = declarations(p.edgeAttrs, true);
636
+ if (p.weights.weighted) {
637
+ edgeDecls[WEIGHT_ATTRIBUTE] = { d: "double" };
638
+ }
621
639
  const otherDecls = isRecord(kept.declarations) ? kept.declarations : {};
622
- const opaque = meta.sourceFormat === CX2_FORMAT && isRecord(kept.opaque) ? kept.opaque : {};
623
- const declarationsElement: Record<string, unknown> = { ...otherDecls };
640
+ const element: Record<string, unknown> = { ...otherDecls };
624
641
  for (const [key, table] of [
625
642
  ["networkAttributes", networkDecls],
626
643
  ["nodes", nodeDecls],
627
644
  ["edges", edgeDecls],
628
645
  ] as const) {
629
646
  if (Object.keys(table).length > 0) {
630
- declarationsElement[key] = table;
647
+ element[key] = table;
631
648
  }
632
649
  }
633
- const nodeBypassRows = bypassRows(p.nodeBypasses, snapshot.nodeCount);
634
- const edgeBypassRows = bypassRows(p.edgeBypasses, snapshot.edgeCount).filter((e) => !p.folding.folded(e));
635
- const opaqueAspects = Object.entries(opaque).filter(
636
- (entry): entry is [string, unknown[]] => !CORE_ASPECTS.has(entry[0]) && Array.isArray(entry[1]),
637
- );
650
+ return element;
651
+ }
638
652
 
639
- const counts: [string, number][] = [];
640
- const hasDeclarations = Object.keys(declarationsElement).length > 0;
641
- if (hasDeclarations) {
642
- counts.push(["attributeDeclarations", 1]);
653
+ /**
654
+ * One edge element.
655
+ * @param p - the plan
656
+ * @param ids - the written node ids
657
+ * @param src - the source of each edge
658
+ * @param dst - the target of each edge
659
+ * @param e - the edge
660
+ * @returns the element
661
+ */
662
+ function edgeElement(
663
+ p: Plan,
664
+ ids: WrittenIds,
665
+ src: ArrayLike<number>,
666
+ dst: ArrayLike<number>,
667
+ e: number,
668
+ ): Record<string, unknown> {
669
+ const element: Record<string, unknown> = {
670
+ id: p.edgeIds[e],
671
+ s: ids.idAt(src[e]),
672
+ t: ids.idAt(dst[e]),
673
+ };
674
+ let v = attributesOf(p.edgeAttrs, e);
675
+ if (p.weights.isExplicit(e)) {
676
+ const w = p.weights.value(e);
677
+ v ??= {};
678
+ v[WEIGHT_ATTRIBUTE] = Number.isFinite(w) ? w : null;
643
679
  }
644
- if (Object.keys(network).length > 0) {
645
- counts.push(["networkAttributes", 1]);
680
+ if (v !== null) {
681
+ element.v = v;
646
682
  }
647
- counts.push(["nodes", snapshot.nodeCount], ["edges", edges.length]);
648
- if (nodeBypassRows.length > 0) {
649
- counts.push(["nodeBypasses", nodeBypassRows.length]);
683
+ return element;
684
+ }
685
+
686
+ /**
687
+ * The optional aspects of a document that are written: those with elements.
688
+ * @param aspects - each aspect's name and element count
689
+ * @returns the metaData counts
690
+ */
691
+ function presentAspects(aspects: readonly (readonly [string, number])[]): [string, number][] {
692
+ return aspects.filter(([, n]) => n > 0).map(([name, n]) => [name, n]);
693
+ }
694
+
695
+ /**
696
+ * Write the document as text parts.
697
+ * @param snapshot - the snapshot
698
+ * @param p - the plan
699
+ * @param styled - the styles as a Cytoscape style, or null without styles
700
+ * @yields the document's text
701
+ * @returns nothing
702
+ */
703
+ function* write(
704
+ snapshot: GraphSnapshot,
705
+ p: Plan,
706
+ styled: CytoscapeEmitted | null = null,
707
+ ): Generator<string, void, undefined> {
708
+ if (p.fatal !== null) {
709
+ throw p.fatal;
650
710
  }
651
- if (edgeBypassRows.length > 0) {
652
- counts.push(["edgeBypasses", edgeBypassRows.length]);
711
+ const { ids } = p;
712
+ if (ids === null) {
713
+ throw new GraphFormatError("E_INVALID_ID", "node ids cannot be written as CX2 integers", { reason: "charset" });
653
714
  }
654
- for (const [name, elements] of opaqueAspects) {
655
- counts.push([name, elements.length]);
715
+ const edges: number[] = [];
716
+ for (let e = 0; e < snapshot.edgeCount; e++) {
717
+ if (!p.folding.folded(e)) {
718
+ edges.push(e);
719
+ }
656
720
  }
721
+ const { network, networkDecls } = networkOf(snapshot, p);
722
+ const { meta } = snapshot;
723
+ const kept = isRecord(meta.extra.cx2) ? meta.extra.cx2 : {};
724
+ const opaque = meta.sourceFormat === CX2_FORMAT && isRecord(kept.opaque) ? kept.opaque : {};
725
+ const declarationsElement = declarationsElementOf(p, kept, networkDecls);
726
+ const { bypassOf, nodeBypassRows, edgeBypassRows, opaqueAspects } = styleParts(snapshot, p, styled, opaque);
727
+ const hasDeclarations = Object.keys(declarationsElement).length > 0;
728
+ const hasNetwork = Object.keys(network).length > 0;
729
+ const counts: [string, number][] = [
730
+ ...presentAspects([
731
+ ["attributeDeclarations", hasDeclarations ? 1 : 0],
732
+ ["networkAttributes", hasNetwork ? 1 : 0],
733
+ ]),
734
+ ["nodes", snapshot.nodeCount],
735
+ ["edges", edges.length],
736
+ ...presentAspects([
737
+ ["nodeBypasses", nodeBypassRows.length],
738
+ ["edgeBypasses", edgeBypassRows.length],
739
+ ]),
740
+ ...opaqueAspects.map(([name, elements]): [string, number] => [name, elements.length]),
741
+ ];
657
742
 
658
743
  yield '[{"CXVersion":"2.0","hasFragments":false},\n';
659
744
  yield `{"metaData":${stringify(counts.map(([name, elementCount]) => ({ name, elementCount })))}},\n`;
660
745
  if (hasDeclarations) {
661
746
  yield `{"attributeDeclarations":[${stringify(declarationsElement)}]},\n`;
662
747
  }
663
- if (Object.keys(network).length > 0) {
748
+ if (hasNetwork) {
664
749
  yield `{"networkAttributes":[${stringify(network)}]},\n`;
665
750
  }
666
751
  yield* block("nodes", snapshot.nodeCount, (i) => stringify(nodeElement(p, ids, i)));
667
- yield* block("edges", edges.length, (k) => {
668
- const e = edges[k];
669
- const element: Record<string, unknown> = {
670
- id: p.edgeIds[e],
671
- s: ids.idAt(src[e]),
672
- t: ids.idAt(dst[e]),
673
- };
674
- let v = attributesOf(p.edgeAttrs, e);
675
- if (p.weights.isExplicit(e)) {
676
- const w = p.weights.value(e);
677
- v ??= {};
678
- v[WEIGHT_ATTRIBUTE] = Number.isFinite(w) ? w : null;
679
- }
680
- if (v !== null) {
681
- element.v = v;
682
- }
683
- return stringify(element);
684
- });
752
+ const { src, dst } = snapshot.edgeList();
753
+ yield* block("edges", edges.length, (k) => stringify(edgeElement(p, ids, src, dst, edges[k])));
685
754
  if (nodeBypassRows.length > 0) {
686
755
  yield* block("nodeBypasses", nodeBypassRows.length, (k) => {
687
756
  const i = nodeBypassRows[k];
688
- return stringify({ id: ids.idAt(i), v: bypassValues(p.nodeBypasses, i) });
757
+ return stringify({ id: ids.idAt(i), v: bypassOf("node", i) });
689
758
  });
690
759
  }
691
760
  if (edgeBypassRows.length > 0) {
692
761
  yield* block("edgeBypasses", edgeBypassRows.length, (k) => {
693
762
  const e = edgeBypassRows[k];
694
- return stringify({ id: p.edgeIds[e], v: bypassValues(p.edgeBypasses, e) });
763
+ return stringify({ id: p.edgeIds[e], v: bypassOf("edge", e) });
695
764
  });
696
765
  }
697
766
  for (const [name, elements] of opaqueAspects) {
@@ -700,6 +769,74 @@ function* write(snapshot: GraphSnapshot, p: Plan): Generator<string, void, undef
700
769
  yield '{"status":[{"error":"","success":true}]}]\n';
701
770
  }
702
771
 
772
+ /** The bypasses and the extra aspects of a document. */
773
+ interface StyleParts {
774
+ /** An element's bypasses, or null. */
775
+ readonly bypassOf: (target: "node" | "edge", row: number) => Record<string, unknown> | null;
776
+ /** The nodes with bypasses. */
777
+ readonly nodeBypassRows: number[];
778
+ /** The written edges with bypasses. */
779
+ readonly edgeBypassRows: number[];
780
+ /** The aspects written after the bypasses: the kept opaque ones, the style, the `graphty.styles` block. */
781
+ readonly opaqueAspects: [string, unknown[]][];
782
+ }
783
+
784
+ /**
785
+ * The bypasses and the extra aspects of a document. With styles, the bypasses and the style aspects are the
786
+ * styles' own (the bypass columns and style aspects of an import are what the styles were read from); without, the
787
+ * bypass columns and the kept aspects are written back.
788
+ * @param snapshot - the snapshot
789
+ * @param p - the plan
790
+ * @param styled - the styles as a Cytoscape style, or null without styles
791
+ * @param opaque - the opaque aspects a CX2 import kept
792
+ * @returns the parts
793
+ */
794
+ function styleParts(
795
+ snapshot: GraphSnapshot,
796
+ p: Plan,
797
+ styled: CytoscapeEmitted | null,
798
+ opaque: Record<string, unknown>,
799
+ ): StyleParts {
800
+ const bypassOf = (target: "node" | "edge", row: number): Record<string, unknown> | null => {
801
+ if (styled === null) {
802
+ return bypassValues(target === "node" ? p.nodeBypasses : p.edgeBypasses, row);
803
+ }
804
+ const m = styled.bypasses[target][row];
805
+ return m === null || m.size === 0 ? null : Object.fromEntries(m);
806
+ };
807
+ const rowsWith = (target: "node" | "edge", n: number): number[] => {
808
+ if (styled === null) {
809
+ return bypassRows(target === "node" ? p.nodeBypasses : p.edgeBypasses, n);
810
+ }
811
+ const out: number[] = [];
812
+ for (let i = 0; i < n; i++) {
813
+ if (bypassOf(target, i) !== null) {
814
+ out.push(i);
815
+ }
816
+ }
817
+ return out;
818
+ };
819
+ const nodeBypassRows = rowsWith("node", snapshot.nodeCount);
820
+ const edgeBypassRows = rowsWith("edge", snapshot.edgeCount).filter((e) => !p.folding.folded(e));
821
+ const opaqueAspects = Object.entries(opaque).filter(
822
+ (entry): entry is [string, unknown[]] =>
823
+ !CORE_ASPECTS.has(entry[0]) && !(styled !== null && STYLE_ASPECTS.has(entry[0])) && Array.isArray(entry[1]),
824
+ );
825
+ if (styled !== null) {
826
+ const aspects = cytoscapeCx2Aspects(styled.style);
827
+ opaqueAspects.push(
828
+ ["visualProperties", aspects.visualProperties],
829
+ ["visualEditorProperties", aspects.visualEditorProperties],
830
+ );
831
+ }
832
+ const styleBlock = snapshotBlock(snapshot);
833
+ if (styleBlock !== null) {
834
+ opaqueAspects.push([STYLE_BLOCK_NAME, blockAspect(styleBlock)]);
835
+ }
836
+
837
+ return { bypassOf, nodeBypassRows, edgeBypassRows, opaqueAspects };
838
+ }
839
+
703
840
  /**
704
841
  * The text of one aspect block, element by element.
705
842
  * @param aspect - the aspect name
@@ -799,6 +936,7 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
799
936
  format: CX2_FORMAT,
800
937
  options: Object.freeze([]),
801
938
  capabilities: CX2_CAPABILITIES,
939
+ styles: Object.freeze({ capabilities: CX2_STYLE_CAPABILITIES }),
802
940
 
803
941
  /**
804
942
  * Pre-flight: what export() would lose, without writing anything.
@@ -806,8 +944,12 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
806
944
  * @param options - the common options
807
945
  * @returns the notes, empty when the export is exact
808
946
  */
809
- check(snapshot: GraphSnapshot, options?: Cx2ExportOptions): readonly LossNote[] {
810
- return Object.freeze([...plan(snapshot, resolveExportOptions(options)).notes]);
947
+ check(snapshot: GraphSnapshot, options?: Cx2ExportOptions & ExporterStyleOptions): readonly LossNote[] {
948
+ const styled = cytoscapeStyledExport(snapshot, options?.styles, "cx2");
949
+ return Object.freeze([
950
+ ...plan(styled?.snapshot ?? snapshot, resolveExportOptions(options)).notes,
951
+ ...(styled?.notes ?? []),
952
+ ]);
811
953
  },
812
954
 
813
955
  /**
@@ -816,8 +958,8 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
816
958
  * @param options - the common options
817
959
  * @returns the chunks
818
960
  */
819
- export(snapshot: GraphSnapshot, options?: Cx2ExportOptions): AsyncIterable<Uint8Array> {
820
- return encodeChunks(write(snapshot, plan(snapshot, resolveExportOptions(options))));
961
+ export(snapshot: GraphSnapshot, options?: Cx2ExportOptions & ExporterStyleOptions): AsyncIterable<Uint8Array> {
962
+ return encodeChunks(written(snapshot, options));
821
963
  },
822
964
 
823
965
  /**
@@ -826,7 +968,22 @@ export const cx2Exporter: GraphExporter<Cx2ExportOptions> = Object.freeze({
826
968
  * @param options - the common options
827
969
  * @returns the document
828
970
  */
829
- exportToString(snapshot: GraphSnapshot, options?: Cx2ExportOptions): Promise<string> {
830
- return joinText(write(snapshot, plan(snapshot, resolveExportOptions(options))));
971
+ exportToString(snapshot: GraphSnapshot, options?: Cx2ExportOptions & ExporterStyleOptions): Promise<string> {
972
+ return joinText(written(snapshot, options));
831
973
  },
832
974
  });
975
+
976
+ /**
977
+ * The document's text, with the styles when they are given.
978
+ * @param snapshot - the snapshot
979
+ * @param options - the options
980
+ * @returns the text parts
981
+ */
982
+ function written(
983
+ snapshot: GraphSnapshot,
984
+ options: (Cx2ExportOptions & ExporterStyleOptions) | undefined,
985
+ ): Generator<string, void, undefined> {
986
+ const styled = cytoscapeStyledExport(snapshot, options?.styles, "cx2");
987
+ const target = styled?.snapshot ?? snapshot;
988
+ return write(target, plan(target, resolveExportOptions(options)), styled?.styled ?? null);
989
+ }
@@ -16,7 +16,10 @@
16
16
  * `x` / `y` become the position column with y flipped to y-up, `z` the `z` column; per-element
17
17
  * bypasses become one column per visual property (origin namespace "cx2.bypass"); style rules
18
18
  * (`visualProperties`, `visualEditorProperties`) and every opaque aspect are kept verbatim in
19
- * `meta.extra.cx2.opaque` and are not applied (W_STYLES_NOT_IMPORTED, issue #706).
19
+ * `meta.extra.cx2.opaque`. Asked for styles (`importGraph(..., { styles: true })`), the importer reads
20
+ * the style rules and the bypasses (styles.ts), kept for it through the report; otherwise
21
+ * W_STYLES_NOT_IMPORTED. The `graphty.styles` aspect of a file graphty wrote becomes the graph
22
+ * attribute of that name, as in every other format.
20
23
  */
21
24
 
22
25
  import {
@@ -103,7 +106,10 @@ import {
103
106
  import { agree, plural } from "../../common/plural.js";
104
107
  import { ImportReportBuilder } from "../../common/report.js";
105
108
  import { weightFromValue } from "../../common/weights.js";
109
+ import { STYLE_BLOCK_NAME } from "../../styles/io/block.js";
106
110
  import { type CommonImportOptions, type GraphImporter, type ImportInput, type ImportReport } from "../../types.js";
111
+ import { blockOfAspect, type Cx2StyleSource } from "../cx/styles.js";
112
+ import { readCx2Styles } from "./styles.js";
107
113
 
108
114
  /**
109
115
  * The format name.
@@ -2402,6 +2408,7 @@ export const cx2Importer: GraphImporter<Cx2ImportOptions> = Object.freeze({
2402
2408
  options: Object.freeze(["zAs"]),
2403
2409
  extensions: Object.freeze([".cx2"]),
2404
2410
  mimeTypes: Object.freeze(["application/json"]),
2411
+ styles: readCx2Styles,
2405
2412
 
2406
2413
  /**
2407
2414
  * Confidence that the head is CX2: 0.97 when the first member of a top-level array is an
@@ -2434,7 +2441,18 @@ export const cx2Importer: GraphImporter<Cx2ImportOptions> = Object.freeze({
2434
2441
  reportSinkOptions(sink, options, report, true);
2435
2442
  reportUnusedOptions(options, report, USED_OPTIONS);
2436
2443
  const doc = await readDocument(input, report, resolved);
2444
+ // the graphty.styles block of a file graphty wrote: a graph attribute, as in every other format
2445
+ const block = blockOfAspect(doc.opaque.get(STYLE_BLOCK_NAME));
2446
+ doc.opaque.delete(STYLE_BLOCK_NAME);
2437
2447
  new Cx2Reader(sink, report, resolved, zAs, doc).build();
2448
+ if (block !== null) {
2449
+ sink.setGraphValue(STYLE_BLOCK_NAME, block, { dtype: "string", origin: { format: CX2_FORMAT, id: null } });
2450
+ }
2451
+ const kept: Cx2StyleSource = {
2452
+ visualProperties: doc.opaque.get("visualProperties"),
2453
+ visualEditorProperties: doc.opaque.get("visualEditorProperties"),
2454
+ };
2455
+ report.keepForStyles(kept);
2438
2456
  throwIfAborted(resolved.signal);
2439
2457
  return report.finish();
2440
2458
  },
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The styles of CX2 files: the `visualProperties` aspect (defaults, `nodeMapping`, `edgeMapping`), the dependencies
3
+ * in `visualEditorProperties`, and the `nodeBypasses` / `edgeBypasses` columns, resolved the way Cytoscape draws
4
+ * them with Cytoscape desktop's default style beneath. The reading and writing CX version 1 shares are in
5
+ * `../cx/styles.ts`.
6
+ */
7
+
8
+ import type { GraphSnapshot } from "@graphty/graph-format";
9
+
10
+ import { cytoscapeStyleFromCx2 } from "../../styles/cytoscape/mappings.js";
11
+ import { StyleNotes } from "../../styles/notes.js";
12
+ import type { ImporterStyles, StyleReadContext, StyleWriteCapabilities } from "../../styles/types.js";
13
+ import { type Cx2StyleSource, cytoscapeWriteCapabilities, readDeclaredStyles } from "../cx/styles.js";
14
+
15
+ /** What the CX2 writer holds of a graph's styles. */
16
+ export const CX2_STYLE_CAPABILITIES: StyleWriteCapabilities = cytoscapeWriteCapabilities("cx2");
17
+
18
+ /**
19
+ * The styles of an imported CX2 network.
20
+ * @param snapshot - the network
21
+ * @param context - what the import kept, the budget and the cancel signal
22
+ * @returns the styles
23
+ */
24
+ export function readCx2Styles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {
25
+ const notes = new StyleNotes();
26
+ const kept = context.kept as Cx2StyleSource | undefined;
27
+ const style = cytoscapeStyleFromCx2(kept?.visualProperties, kept?.visualEditorProperties, notes);
28
+ return readDeclaredStyles(snapshot, context, style, "cx2.bypass", notes, "cx2");
29
+ }
@@ -142,3 +142,6 @@ export const CYS_ISSUE = Object.freeze({
142
142
  /** `graphName` matches several networks in the session. The import stops. */
143
143
  AMBIGUOUS_GRAPH_NAME: AMBIGUOUS_GRAPH_NAME_CODE,
144
144
  });
145
+
146
+ /** The name prefix of the per-element style value columns graphty writes into a session's tables. */
147
+ export const STYLE_COLUMN_PREFIX = "graphty.style.";