@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,685 @@
1
+ /**
2
+ * The reference semantics of a file's styles: which value each element gets for one property. Walk the rules from
3
+ * the top; the first rule whose predicate matches and that gives the property a non-null value wins. A passthrough
4
+ * over a null, a discrete key absent from its table and a continuous mapping over a missing or non-numeric value give
5
+ * no value, so the walk continues downward.
6
+ */
7
+
8
+ import type { GraphSnapshot } from "@graphty/graph-format";
9
+
10
+ import { formatF32 } from "../../common/format.js";
11
+ import { canonEnum } from "../canon/enums.js";
12
+ import { canonBoolean, canonNumber, canonOpacity } from "../canon/number.js";
13
+ import type { CanonSite } from "../canon/site.js";
14
+ import { canonText } from "../canon/text.js";
15
+ import { StyleNotes } from "../notes.js";
16
+ import type {
17
+ ColumnRef,
18
+ ContinuousPoint,
19
+ ExtractedStyles,
20
+ Mapping,
21
+ Predicate,
22
+ Scalar,
23
+ StyleColumn,
24
+ StyleFeature,
25
+ StyleProperty,
26
+ StyleRule,
27
+ StyleTarget,
28
+ StyleValue,
29
+ StyleWorkBudget,
30
+ } from "../types.js";
31
+ import { STYLE_PROPERTIES } from "../vocabulary.js";
32
+
33
+ /** Predicates nested deeper than this match nothing: a file never makes the resolver recurse without bound. */
34
+ const MAX_PREDICATE_DEPTH = 32;
35
+ /** The most values an `in` predicate may hold in a short predicate. */
36
+ const MAX_PREDICATE_TERMS = 8;
37
+ const HEX6 = /^#[0-9a-f]{6}$/;
38
+
39
+ /**
40
+ * Where the per-element values a rule reads come from.
41
+ */
42
+ interface RefSource {
43
+ /** The number of elements. */
44
+ readonly n: number;
45
+ /**
46
+ * The values of a column, by element index, or null when nothing holds it.
47
+ * @param ref - the column
48
+ * @returns the values, or null
49
+ */
50
+ column(ref: ColumnRef): ArrayLike<unknown> | null;
51
+ }
52
+
53
+ /**
54
+ * The cache key of a column reference.
55
+ * @param ref - the column
56
+ * @returns a key unique per column
57
+ */
58
+ function refKey(ref: ColumnRef): string {
59
+ if ("style" in ref) {
60
+ return `style:${ref.style}`;
61
+ }
62
+ if ("computed" in ref) {
63
+ return `computed:${ref.computed}`;
64
+ }
65
+ return `data:${(ref as { data: string }).data}`;
66
+ }
67
+
68
+ /**
69
+ * A cell of a snapshot column as a plain value: 64-bit integers as numbers, typed-array items as arrays, unset as
70
+ * null.
71
+ * @param v - the value the table returns
72
+ * @returns the plain value
73
+ */
74
+ export function plainCell(v: unknown): unknown {
75
+ if (v === undefined || v === null) {
76
+ return null;
77
+ }
78
+ if (typeof v === "bigint") {
79
+ return Number(v);
80
+ }
81
+ if (ArrayBuffer.isView(v)) {
82
+ return Array.from(v as unknown as ArrayLike<number>);
83
+ }
84
+ return v;
85
+ }
86
+
87
+ /**
88
+ * One cell of a data column as a plain value; a 32-bit float as its shortest decimal, so a value gives the same style
89
+ * value whether a file kept it as a 32-bit or a 64-bit number.
90
+ * @param table - the node or edge table
91
+ * @param name - the column
92
+ * @param i - the element
93
+ * @returns the value
94
+ */
95
+ export function dataCell(table: GraphSnapshot["nodes"], name: string, i: number): unknown {
96
+ const v = plainCell(table.value(name, i));
97
+ return typeof v === "number" && table.get(name)?.dtype === "f32" ? Number(formatF32(v)) : v;
98
+ }
99
+
100
+ /**
101
+ * The degree arrays of a snapshot as plain numbers.
102
+ * @param snapshot - the graph
103
+ * @param which - which degree
104
+ * @returns the degree of every node
105
+ */
106
+ export function degreeValues(snapshot: GraphSnapshot, which: "degree" | "indegree" | "outdegree"): number[] {
107
+ let arr: ArrayLike<number>;
108
+ if (which === "degree") {
109
+ arr = snapshot.degree();
110
+ } else if (which === "indegree") {
111
+ arr = snapshot.inDegree();
112
+ } else {
113
+ arr = snapshot.outDegree();
114
+ }
115
+ return Array.from(arr);
116
+ }
117
+
118
+ /**
119
+ * A reference source over a target's style columns, its features and, when given, the snapshot itself.
120
+ * @param target - nodes or edges
121
+ * @param n - the element count
122
+ * @param columns - the style columns
123
+ * @param features - candidate features (used for data and computed columns when no snapshot is given)
124
+ * @param snapshot - the graph, read for data and computed columns when given
125
+ * @returns the source
126
+ */
127
+ export function refSource(
128
+ target: StyleTarget,
129
+ n: number,
130
+ columns: ReadonlyMap<string, StyleColumn>,
131
+ features: readonly StyleFeature[],
132
+ snapshot?: GraphSnapshot,
133
+ ): RefSource {
134
+ const cache = new Map<string, ArrayLike<unknown> | null>();
135
+ const byKey = new Map<string, StyleFeature>();
136
+ for (const f of features) {
137
+ byKey.set(refKey(f.ref), f);
138
+ }
139
+ return {
140
+ n,
141
+ column(ref: ColumnRef): ArrayLike<unknown> | null {
142
+ if ("style" in ref) {
143
+ return columns.get(ref.style) ?? null;
144
+ }
145
+ const k = refKey(ref);
146
+ if (cache.has(k)) {
147
+ return cache.get(k) ?? null;
148
+ }
149
+ const out =
150
+ snapshot === undefined ? (byKey.get(k)?.values ?? null) : snapshotColumn(snapshot, target, n, ref);
151
+ cache.set(k, out);
152
+ return out;
153
+ },
154
+ };
155
+ }
156
+
157
+ /**
158
+ * A data or computed column read from the graph.
159
+ * @param snapshot - the graph
160
+ * @param target - nodes or edges
161
+ * @param n - the element count
162
+ * @param ref - the column, not a style column
163
+ * @returns the values, or null when the graph has no such column (a degree of an edge)
164
+ */
165
+ function snapshotColumn(
166
+ snapshot: GraphSnapshot,
167
+ target: StyleTarget,
168
+ n: number,
169
+ ref: Exclude<ColumnRef, { style: string }>,
170
+ ): ArrayLike<unknown> | null {
171
+ if ("computed" in ref) {
172
+ return target === "node" ? degreeValues(snapshot, ref.computed) : null;
173
+ }
174
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
175
+ return table.has(ref.data) ? Array.from({ length: n }, (_, i) => dataCell(table, ref.data, i)) : null;
176
+ }
177
+
178
+ /**
179
+ * One element's value of a column.
180
+ * @param src - the reference source
181
+ * @param ref - the column
182
+ * @param i - the element
183
+ * @returns the value, or null
184
+ */
185
+ function readRef(src: RefSource, ref: ColumnRef, i: number): unknown {
186
+ const col = src.column(ref);
187
+ if (col === null) {
188
+ return null;
189
+ }
190
+ return col[i] ?? null;
191
+ }
192
+
193
+ /**
194
+ * Whether a predicate is short: `all`, `has`, `not has`, `eq` or `in` with at most 8 values, combined with at most
195
+ * one `and` of at most 8 terms.
196
+ * @param where - the predicate
197
+ * @returns true when it is short
198
+ */
199
+ export function isShortPredicate(where: Predicate): boolean {
200
+ if ("and" in where) {
201
+ if (!Array.isArray(where.and) || where.and.length === 0) {
202
+ return false;
203
+ }
204
+ let terms = 0;
205
+ for (const p of where.and as Predicate[]) {
206
+ const t = atomTerms(p);
207
+ if (t === 0) {
208
+ return false;
209
+ }
210
+ terms += t;
211
+ }
212
+ return terms <= MAX_PREDICATE_TERMS;
213
+ }
214
+ return atomTerms(where) > 0;
215
+ }
216
+
217
+ /**
218
+ * The terms of a short atom, or 0 when the predicate is not one.
219
+ * @param p - the predicate
220
+ * @returns its term count, or 0
221
+ */
222
+ function atomTerms(p: Predicate): number {
223
+ if ("all" in p) {
224
+ return p.all ? 1 : 0;
225
+ }
226
+ if ("has" in p) {
227
+ return 1;
228
+ }
229
+ if ("not" in p) {
230
+ // `not` over a degree test stays a predicate, so it follows later edits.
231
+ return "has" in p.not || "computed" in refOfTest(p.not) ? atomTerms(p.not) : 0;
232
+ }
233
+ if ("eq" in p) {
234
+ return 1;
235
+ }
236
+ if ("in" in p) {
237
+ const n = Array.isArray(p.in[1]) ? p.in[1].length : 0;
238
+ return n >= 1 && n <= MAX_PREDICATE_TERMS ? n : 0;
239
+ }
240
+ return 0;
241
+ }
242
+
243
+ /**
244
+ * The column an `eq` or `in` test reads, or an empty reference for any other predicate.
245
+ * @param p - the predicate
246
+ * @returns the column reference
247
+ */
248
+ function refOfTest(p: Predicate): ColumnRef | Record<string, never> {
249
+ if ("eq" in p) {
250
+ return p.eq[0];
251
+ }
252
+ if ("in" in p) {
253
+ return p.in[0];
254
+ }
255
+ return {};
256
+ }
257
+
258
+ /**
259
+ * Whether a column value equals a predicate's scalar. A boolean also equals the 1 or 0 and the "true" or "false" (any
260
+ * case) of a format that has no booleans (GML writes them as 1 and 0), so a rule over a boolean column still selects
261
+ * the same elements after such a file is read back.
262
+ * @param v - the element's value
263
+ * @param k - the scalar
264
+ * @returns true when equal
265
+ */
266
+ function scalarEq(v: unknown, k: Scalar): boolean {
267
+ if (v === k) {
268
+ return v !== null && v !== undefined;
269
+ }
270
+ if (typeof k === "boolean") {
271
+ return boolEq(k, v);
272
+ }
273
+ return typeof v === "boolean" && boolEq(v, k);
274
+ }
275
+
276
+ /**
277
+ * Whether a value is a boolean's 1 or 0, or its "true" or "false" in any case.
278
+ * @param b - the boolean
279
+ * @param other - the value
280
+ * @returns true when equal
281
+ */
282
+ function boolEq(b: boolean, other: unknown): boolean {
283
+ return other === (b ? 1 : 0) || (typeof other === "string" && other.toLowerCase() === String(b));
284
+ }
285
+
286
+ /**
287
+ * Whether a predicate matches an element. Unknown predicate kinds and predicates nested deeper than 32 match nothing.
288
+ * @param where - the predicate
289
+ * @param src - the reference source
290
+ * @param i - the element
291
+ * @param depth - the current nesting depth
292
+ * @returns true when the predicate matches
293
+ */
294
+ export function matches(where: Predicate, src: RefSource, i: number, depth = 0): boolean {
295
+ if (depth > MAX_PREDICATE_DEPTH) {
296
+ return false;
297
+ }
298
+ if ("all" in where) {
299
+ return where.all;
300
+ }
301
+ if ("has" in where) {
302
+ const v = readRef(src, where.has, i);
303
+ return v !== null && v !== false;
304
+ }
305
+ if ("eq" in where) {
306
+ return scalarEq(readRef(src, where.eq[0], i), where.eq[1]);
307
+ }
308
+ if ("in" in where) {
309
+ const v = readRef(src, where.in[0], i);
310
+ return where.in[1].some((k) => scalarEq(v, k));
311
+ }
312
+ if ("and" in where) {
313
+ return where.and.every((p) => matches(p, src, i, depth + 1));
314
+ }
315
+ if ("or" in where) {
316
+ return where.or.some((p) => matches(p, src, i, depth + 1));
317
+ }
318
+ if ("not" in where) {
319
+ return !matches(where.not, src, i, depth + 1);
320
+ }
321
+ return false;
322
+ }
323
+
324
+ const ENUM_KINDS: ReadonlySet<string> = new Set(["shape", "borderStyle", "lineStyle", "arrow", "weight", "position"]);
325
+
326
+ /**
327
+ * How a passthrough reads a raw value as a property's canonical value (CSS spelling for colors).
328
+ * @param target - nodes or edges
329
+ * @param property - the property
330
+ * @returns the reader: a canonical value or null
331
+ */
332
+ export function canonicalFor(target: StyleTarget, property: string): (raw: unknown) => StyleValue | null {
333
+ const kind = STYLE_PROPERTIES[target].get(property);
334
+ const site: CanonSite = { notes: new StyleNotes(), target, property };
335
+ if (kind === undefined) {
336
+ return (raw) => (typeof raw === "string" || typeof raw === "number" || typeof raw === "boolean" ? raw : null);
337
+ }
338
+ switch (kind) {
339
+ case "color":
340
+ // only an already canonical color: a CSS function or a name may parse differently elsewhere
341
+ return (raw) => (typeof raw === "string" && /^#[0-9a-fA-F]{6}$/.test(raw) ? raw.toLowerCase() : null);
342
+ case "number":
343
+ return (raw) => canonNumber(raw, site);
344
+ case "opacity":
345
+ return (raw) => canonOpacity(raw, "css", site);
346
+ case "boolean":
347
+ return (raw) => canonBoolean(raw, site);
348
+ case "text":
349
+ return (raw) => canonText(raw, site);
350
+ default:
351
+ if (!ENUM_KINDS.has(kind)) {
352
+ return () => null;
353
+ }
354
+ return (raw) =>
355
+ typeof raw === "string" && raw.startsWith("other:") ? raw : canonEnum(kind, raw, "css", site);
356
+ }
357
+ }
358
+
359
+ const LOOKUPS = new WeakMap<object, (value: unknown) => number>();
360
+ const DECIMAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
361
+
362
+ /**
363
+ * A number from a number or a decimal string.
364
+ * @param v - the value
365
+ * @returns the number, or null
366
+ */
367
+ export function numberOf(v: unknown): number | null {
368
+ if (typeof v === "number") {
369
+ return Number.isFinite(v) ? v : null;
370
+ }
371
+ if (typeof v === "string" && v.length <= 64 && DECIMAL.test(v.trim())) {
372
+ return Number(v.trim());
373
+ }
374
+ return null;
375
+ }
376
+
377
+ /**
378
+ * The lookup of a discrete table: keys compared by their text (numbers numerically, booleans without case), a list
379
+ * value matched by its first item that has an entry. Built once per table through hash indexes.
380
+ * @param table - the table
381
+ * @returns the index of the matching entry, or -1
382
+ */
383
+ export function discreteLookup(table: readonly (readonly [Scalar, StyleValue])[]): (value: unknown) => number {
384
+ const cached = LOOKUPS.get(table);
385
+ if (cached !== undefined) {
386
+ return cached;
387
+ }
388
+ const byStr = new Map<string, number>();
389
+ const byNum = new Map<number, number>();
390
+ const byBool = new Map<string, number>();
391
+ table.forEach(([k], j) => {
392
+ if (k === null || typeof k === "object") {
393
+ return;
394
+ }
395
+ const ks = String(k);
396
+ if (!byStr.has(ks)) {
397
+ byStr.set(ks, j);
398
+ }
399
+ const kn = numberOf(k);
400
+ if (kn !== null && !byNum.has(kn)) {
401
+ byNum.set(kn, j);
402
+ }
403
+ const kb = ks.toLowerCase();
404
+ if ((kb === "true" || kb === "false") && !byBool.has(kb)) {
405
+ byBool.set(kb, j);
406
+ }
407
+ });
408
+ const one = (value: unknown): number => {
409
+ if (typeof value === "number") {
410
+ return byNum.get(value) ?? -1;
411
+ }
412
+ if (typeof value === "boolean") {
413
+ return byBool.get(String(value)) ?? -1;
414
+ }
415
+ if (typeof value === "string") {
416
+ return byStr.get(value) ?? -1;
417
+ }
418
+ return -1;
419
+ };
420
+ const f = (value: unknown): number => {
421
+ if (Array.isArray(value)) {
422
+ for (const v of value) {
423
+ const j = one(v);
424
+ if (j >= 0) {
425
+ return j;
426
+ }
427
+ }
428
+ return -1;
429
+ }
430
+ return one(value);
431
+ };
432
+ LOOKUPS.set(table, f);
433
+ return f;
434
+ }
435
+
436
+ /**
437
+ * Two hex digits.
438
+ * @param v - a channel 0..255
439
+ * @returns its hex
440
+ */
441
+ function hex2(v: number): string {
442
+ return Math.min(255, Math.max(0, Math.round(v)))
443
+ .toString(16)
444
+ .padStart(2, "0");
445
+ }
446
+
447
+ /**
448
+ * A number at 6 significant digits.
449
+ * @param x - the number
450
+ * @returns the rounded number
451
+ */
452
+ function num6(x: number): number {
453
+ return Number(x.toPrecision(6)) + 0;
454
+ }
455
+
456
+ /**
457
+ * Interpolates two values: numbers linearly at 6 significant digits, colors per sRGB channel; anything else steps at
458
+ * the right end.
459
+ * @param a - the left value
460
+ * @param b - the right value
461
+ * @param t - 0..1
462
+ * @returns the value
463
+ */
464
+ export function interpolate(a: StyleValue, b: StyleValue, t: number): StyleValue {
465
+ if (typeof a === "number" && typeof b === "number") {
466
+ return num6(a + (b - a) * t);
467
+ }
468
+ if (typeof a === "string" && typeof b === "string" && HEX6.test(a) && HEX6.test(b)) {
469
+ let out = "#";
470
+ for (const k of [1, 3, 5]) {
471
+ const ca = Number.parseInt(a.slice(k, k + 2), 16);
472
+ const cb = Number.parseInt(b.slice(k, k + 2), 16);
473
+ out += hex2(ca + (cb - ca) * t);
474
+ }
475
+ return out;
476
+ }
477
+ return t < 1 ? a : b;
478
+ }
479
+
480
+ /**
481
+ * Evaluates a continuous mapping at x.
482
+ * @param points - the points, in increasing `at`
483
+ * @param x - the input
484
+ * @returns the value, or null for a missing or non-finite input
485
+ */
486
+ export function evalContinuous(points: readonly ContinuousPoint[], x: number | null): StyleValue | null {
487
+ if (x === null || !Number.isFinite(x) || points.length === 0) {
488
+ return null;
489
+ }
490
+ if (x < points[0].at) {
491
+ return points[0].below;
492
+ }
493
+ for (let i = 0; i < points.length; i++) {
494
+ const p = points[i];
495
+ if (x === p.at) {
496
+ return p.value;
497
+ }
498
+ const q = points.at(i + 1);
499
+ if (q === undefined) {
500
+ return p.above;
501
+ }
502
+ if (x < q.at) {
503
+ return interpolate(p.above, q.below, (x - p.at) / (q.at - p.at));
504
+ }
505
+ }
506
+ return null;
507
+ }
508
+
509
+ /**
510
+ * The value one mapping gives one element.
511
+ * @param m - the mapping
512
+ * @param canon - the property's passthrough reader
513
+ * @param src - the reference source
514
+ * @param i - the element
515
+ * @returns the value, or null when the mapping gives none
516
+ */
517
+ function evalMapping(
518
+ m: Mapping,
519
+ canon: (raw: unknown) => StyleValue | null,
520
+ src: RefSource,
521
+ i: number,
522
+ ): StyleValue | null {
523
+ const v = readRef(src, m.by, i);
524
+ if (v === null || v === undefined) {
525
+ return null;
526
+ }
527
+ switch (m.kind) {
528
+ case "passthrough":
529
+ if (Array.isArray(v)) {
530
+ return null;
531
+ }
532
+ // a style column already holds canonical values; a data column is read as the property's value
533
+ if ("style" in m.by) {
534
+ return typeof v === "string" || typeof v === "number" || typeof v === "boolean" ? v : null;
535
+ }
536
+ return canon(v);
537
+ case "discrete": {
538
+ const j = discreteLookup(m.table)(v);
539
+ return j < 0 ? null : m.table[j][1];
540
+ }
541
+ case "continuous":
542
+ return Array.isArray(v) ? null : evalContinuous(m.points, numberOf(v));
543
+ default:
544
+ return null;
545
+ }
546
+ }
547
+
548
+ /**
549
+ * A rule's constant value of a property: its own member only, so a property named like a built-in object member
550
+ * (`constructor`, `toString`) is never found on the prototype.
551
+ * @param rule - the rule
552
+ * @param property - the property
553
+ * @returns the value, or undefined
554
+ */
555
+ function setOf(rule: StyleRule, property: string): StyleValue | undefined {
556
+ const set: Readonly<Record<string, StyleValue | undefined>> = rule.set ?? {};
557
+ return Object.hasOwn(set, property) ? set[property] : undefined;
558
+ }
559
+
560
+ /**
561
+ * A rule's mapping of a property: its own member only.
562
+ * @param rule - the rule
563
+ * @param property - the property
564
+ * @returns the mapping, or undefined
565
+ */
566
+ function mapOf(rule: StyleRule, property: string): Mapping | undefined {
567
+ const map: Readonly<Record<string, Mapping | undefined>> = rule.map ?? {};
568
+ return Object.hasOwn(map, property) ? map[property] : undefined;
569
+ }
570
+
571
+ /**
572
+ * Resolves one property for every element over a rule list.
573
+ * @param rules - the rules, bottom to top (other targets are skipped)
574
+ * @param target - nodes or edges
575
+ * @param property - the property
576
+ * @param src - the reference source
577
+ * @param budget - spent once per rule visited, when given
578
+ * @returns each element's value, or null where no rule gives one
579
+ */
580
+ export function resolveRules(
581
+ rules: readonly StyleRule[],
582
+ target: StyleTarget,
583
+ property: string,
584
+ src: RefSource,
585
+ budget?: StyleWorkBudget,
586
+ ): (StyleValue | null)[] {
587
+ // the rules that write the property, top first
588
+ const writers = rules
589
+ .filter(
590
+ (rule) =>
591
+ rule.target === target && (setOf(rule, property) !== undefined || mapOf(rule, property) !== undefined),
592
+ )
593
+ .reverse();
594
+ const canon = canonicalFor(target, property);
595
+ const out = new Array<StyleValue | null>(src.n).fill(null);
596
+ let visits = 0;
597
+ for (let i = 0; i < src.n; i++) {
598
+ for (const rule of writers) {
599
+ visits++;
600
+ const v = ruleValue(rule, property, canon, src, i);
601
+ if (v !== null) {
602
+ out[i] = v;
603
+ break;
604
+ }
605
+ }
606
+ }
607
+ budget?.spend(target, visits + src.n);
608
+ return out;
609
+ }
610
+
611
+ /**
612
+ * The value one rule gives an element, or null when it selects the element but gives no value, or does not select it.
613
+ * @param rule - the rule
614
+ * @param property - the property
615
+ * @param canon - the property's canonicalizer
616
+ * @param src - the reference source
617
+ * @param i - the element
618
+ * @returns the value, or null
619
+ */
620
+ function ruleValue(
621
+ rule: StyleRule,
622
+ property: string,
623
+ canon: ReturnType<typeof canonicalFor>,
624
+ src: RefSource,
625
+ i: number,
626
+ ): StyleValue | null {
627
+ if (!matches(rule.where, src, i)) {
628
+ return null;
629
+ }
630
+ const set = setOf(rule, property);
631
+ if (set !== undefined) {
632
+ return set;
633
+ }
634
+ const mapping = mapOf(rule, property);
635
+ return mapping === undefined ? null : evalMapping(mapping, canon, src, i);
636
+ }
637
+
638
+ /**
639
+ * Every element's value of one property under a file's styles: the reference semantics of the format.
640
+ * @param extracted - the styles
641
+ * @param target - nodes or edges
642
+ * @param property - the property
643
+ * @param snapshot - the graph; when given, data columns and degrees are read from it (so a degree mapping follows
644
+ * the graph), otherwise from `extracted.features`
645
+ * @returns each element's value, or null where the file gives none
646
+ * @category Styles
647
+ */
648
+ export function resolveStyles(
649
+ extracted: ExtractedStyles,
650
+ target: StyleTarget,
651
+ property: StyleProperty,
652
+ snapshot?: GraphSnapshot,
653
+ ): readonly (StyleValue | null)[] {
654
+ let n = extracted.fingerprint[target === "node" ? "nodes" : "edges"];
655
+ if (snapshot !== undefined) {
656
+ n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
657
+ }
658
+ const src = refSource(target, n, extracted.columns[target], extracted.features[target], snapshot);
659
+ return resolveRules(extracted.styles.rules, target, property, src);
660
+ }
661
+
662
+ /**
663
+ * Whether two values agree within the rounding a writing tool does: 2 of 255 per color channel, or 1e-5 relative for
664
+ * numbers.
665
+ * @param a - one value
666
+ * @param b - the other
667
+ * @returns true when equal or within the rounding
668
+ */
669
+ export function within(a: StyleValue | null, b: StyleValue | null): boolean {
670
+ if (a === b) {
671
+ return true;
672
+ }
673
+ if (typeof a === "number" && typeof b === "number") {
674
+ return Math.abs(a - b) <= 1e-5 * Math.max(Math.abs(a), Math.abs(b), 1e-9);
675
+ }
676
+ if (typeof a === "string" && typeof b === "string" && HEX6.test(a) && HEX6.test(b)) {
677
+ for (const k of [1, 3, 5]) {
678
+ if (Math.abs(Number.parseInt(a.slice(k, k + 2), 16) - Number.parseInt(b.slice(k, k + 2), 16)) > 2) {
679
+ return false;
680
+ }
681
+ }
682
+ return true;
683
+ }
684
+ return false;
685
+ }