@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,211 @@
1
+ /**
2
+ * Canonical enumeration values: each dialect's spellings matched against an alias table without regard to case,
3
+ * spaces or underscores. An unknown value of an open enumeration (shapes, border and line styles, arrows) is kept as
4
+ * `other:<raw>` and noted; an unknown value of a closed one (weights, positions) gives no value and is noted.
5
+ */
6
+
7
+ import { STYLE_ISSUE } from "../codes.js";
8
+ import type { StyleDialect } from "../types.js";
9
+ import { type CanonSite, noteAt, scalarText } from "./site.js";
10
+
11
+ /**
12
+ * The enumerations a style value can belong to.
13
+ * @category Styles
14
+ */
15
+ export type StyleEnumKind = "shape" | "borderStyle" | "lineStyle" | "arrow" | "weight" | "position";
16
+
17
+ type Aliases = Readonly<Record<string, readonly string[]>>;
18
+
19
+ const SHAPES: Aliases = {
20
+ ellipse: [
21
+ "ellipse",
22
+ "oval",
23
+ "circle",
24
+ "disc",
25
+ "disk",
26
+ "point",
27
+ "doublecircle",
28
+ "mcircle",
29
+ "dot",
30
+ "sphere",
31
+ "circular",
32
+ ],
33
+ rectangle: [
34
+ "rectangle",
35
+ "rect",
36
+ "box",
37
+ "square",
38
+ "plaintext",
39
+ "plain",
40
+ "record",
41
+ "msquare",
42
+ "box3d",
43
+ "rectangle3d",
44
+ "component",
45
+ "tab",
46
+ "folder",
47
+ "note",
48
+ "underline",
49
+ ],
50
+ "round-rectangle": [
51
+ "round-rectangle",
52
+ "roundrectangle",
53
+ "roundrect",
54
+ "rounded",
55
+ "roundedrectangle",
56
+ "round-rect",
57
+ "mrecord",
58
+ "cut-rectangle",
59
+ "round-tag",
60
+ "bottom-round-rectangle",
61
+ ],
62
+ triangle: ["triangle", "invtriangle", "round-triangle", "tag"],
63
+ diamond: ["diamond", "rhombus", "mdiamond", "round-diamond"],
64
+ pentagon: ["pentagon", "round-pentagon"],
65
+ hexagon: ["hexagon", "hexagon2", "round-hexagon", "concave-hexagon", "septagon", "heptagon", "round-heptagon"],
66
+ octagon: ["octagon", "doubleoctagon", "tripleoctagon", "round-octagon", "octagon2"],
67
+ parallelogram: ["parallelogram", "parallelogram2", "rhomboid", "fat-arrow", "fatarrow"],
68
+ trapezoid: ["trapezoid", "trapezoid2", "invtrapezoid", "trapezium", "round-trapezoid"],
69
+ star: ["star", "star5", "star6", "star8", "polygon"],
70
+ vee: ["vee", "v"],
71
+ none: ["none", "empty", "invis"],
72
+ };
73
+
74
+ const BORDER_STYLES: Aliases = {
75
+ solid: ["solid", "line"],
76
+ dashed: ["dashed", "dash", "equal-dash"],
77
+ dotted: ["dotted", "dot", "dots"],
78
+ "dash-dot": ["dash-dot", "dashdot", "dashed-dotted"],
79
+ double: ["double", "parallel-lines"],
80
+ };
81
+
82
+ const LINE_STYLES: Aliases = {
83
+ solid: ["solid", "line", "continuous", "separate-arrow"],
84
+ dashed: ["dashed", "dash", "dashed-line", "equal-dash"],
85
+ dotted: ["dotted", "dot", "dots", "dotted-line"],
86
+ "dash-dot": ["dash-dot", "dashdot", "dashed-dotted", "dash-dot-dot"],
87
+ "long-dash": ["long-dash", "longdash"],
88
+ double: ["double", "parallel", "parallel-lines"],
89
+ zigzag: ["zigzag"],
90
+ sinewave: ["sinewave", "sine-wave"],
91
+ };
92
+
93
+ const ARROWS: Aliases = {
94
+ none: ["none", "no-arrow", "noarrow", "0"],
95
+ triangle: [
96
+ "triangle",
97
+ "normal",
98
+ "delta",
99
+ "standard",
100
+ "arrow",
101
+ "triangle-backcurve",
102
+ "white-delta-inverted",
103
+ "simple",
104
+ "short",
105
+ "plain",
106
+ "convex",
107
+ "a",
108
+ ],
109
+ "triangle-open": ["triangle-open", "onormal", "empty", "white-delta", "transparent-circle-inverted", "open-delta"],
110
+ vee: ["vee", "open", "chevron", "concave", "triangle-cross", "b"],
111
+ tee: ["tee", "t", "t-shape", "half-bottom", "half-top", "bar"],
112
+ diamond: ["diamond", "white-diamond-inverted"],
113
+ "diamond-open": ["diamond-open", "odiamond", "white-diamond", "ediamond", "open-diamond"],
114
+ circle: ["circle", "dot", "transparent-circle", "white-circle-inverted"],
115
+ "circle-open": ["circle-open", "odot", "white-circle", "open-circle"],
116
+ square: ["square", "box", "skewed-dash"],
117
+ // An X-shaped "cross" (yEd, yFiles) is not a crow's foot: it stays other:cross.
118
+ crow: ["crow", "crows-foot", "crows-foot-many"],
119
+ half: ["half", "half-top-arrow", "half-open", "lnormal", "rnormal", "halfopen"],
120
+ inverted: ["inverted", "inv", "inverted-triangle", "inv-triangle"],
121
+ };
122
+
123
+ const WEIGHTS: Aliases = {
124
+ normal: ["normal", "regular", "plain", "lighter", "100", "200", "300", "400", "500"],
125
+ bold: ["bold", "bolder", "600", "700", "800", "900"],
126
+ };
127
+
128
+ const POSITIONS: Aliases = {
129
+ center: ["center", "centre", "middle", "c"],
130
+ top: ["top", "north", "t"],
131
+ bottom: ["bottom", "south", "b"],
132
+ left: ["left", "west", "l"],
133
+ right: ["right", "east", "r"],
134
+ "top-left": ["top-left", "north-west", "northwest"],
135
+ "top-right": ["top-right", "north-east", "northeast"],
136
+ "bottom-left": ["bottom-left", "south-west", "southwest"],
137
+ "bottom-right": ["bottom-right", "south-east", "southeast"],
138
+ };
139
+
140
+ /** vis-network draws these spellings differently from the common reading. */
141
+ const VIS: Partial<Record<StyleEnumKind, Aliases>> = {
142
+ shape: {
143
+ "round-rectangle": ["box"],
144
+ ellipse: ["dot"],
145
+ triangle: ["triangledown"],
146
+ none: ["text"],
147
+ },
148
+ arrow: { inverted: ["inv-triangle"], square: ["box"] },
149
+ };
150
+
151
+ /** Per-dialect overrides; a dialect not listed reads the common table alone. */
152
+ const OVERRIDES: ReadonlyMap<string, Partial<Record<StyleEnumKind, Aliases>>> = new Map([["vis", VIS]]);
153
+
154
+ const OPEN: ReadonlySet<StyleEnumKind> = new Set<StyleEnumKind>(["shape", "borderStyle", "lineStyle", "arrow"]);
155
+
156
+ /**
157
+ * Builds an alias lookup.
158
+ * @param aliases - canonical value to spellings
159
+ * @returns spelling to canonical value
160
+ */
161
+ function lookup(aliases: Aliases): ReadonlyMap<string, string> {
162
+ const map = new Map<string, string>();
163
+ for (const [value, spellings] of Object.entries(aliases)) {
164
+ for (const spelling of spellings) {
165
+ map.set(spelling, value);
166
+ }
167
+ }
168
+ return map;
169
+ }
170
+
171
+ const COMMON: ReadonlyMap<StyleEnumKind, ReadonlyMap<string, string>> = new Map([
172
+ ["shape", lookup(SHAPES)],
173
+ ["borderStyle", lookup(BORDER_STYLES)],
174
+ ["lineStyle", lookup(LINE_STYLES)],
175
+ ["arrow", lookup(ARROWS)],
176
+ ["weight", lookup(WEIGHTS)],
177
+ ["position", lookup(POSITIONS)],
178
+ ]);
179
+
180
+ const DIALECT: ReadonlyMap<string, ReadonlyMap<StyleEnumKind, ReadonlyMap<string, string>>> = new Map(
181
+ Array.from(OVERRIDES, ([dialect, kinds]) => [
182
+ dialect,
183
+ new Map(Object.entries(kinds).map(([kind, aliases]) => [kind as StyleEnumKind, lookup(aliases)])),
184
+ ]),
185
+ );
186
+
187
+ /**
188
+ * A canonical enumeration value: the dialect's spelling matched without regard to case, with spaces and underscores
189
+ * read as hyphens (Cytoscape's `ROUND_RECTANGLE` is `round-rectangle`). An unknown value is `other:<raw>` for an
190
+ * open enumeration and null for a closed one, noted as `W_STYLE_UNKNOWN_VALUE` either way.
191
+ * @param kind - the enumeration
192
+ * @param raw - the file's value
193
+ * @param dialect - the file's dialect
194
+ * @param site - where it was read
195
+ * @returns the canonical value, or null
196
+ * @category Styles
197
+ */
198
+ export function canonEnum(kind: StyleEnumKind, raw: unknown, dialect: StyleDialect, site: CanonSite): string | null {
199
+ const text = scalarText(raw, site);
200
+ if (text === null) {
201
+ return null;
202
+ }
203
+ const trimmed = text.trim();
204
+ const key = trimmed.toLowerCase().replaceAll(/[\s_]+/g, "-");
205
+ const value = DIALECT.get(dialect)?.get(kind)?.get(key) ?? COMMON.get(kind)?.get(key);
206
+ if (value !== undefined) {
207
+ return value;
208
+ }
209
+ noteAt(site, STYLE_ISSUE.UNKNOWN_VALUE, trimmed);
210
+ return OPEN.has(kind) ? `other:${trimmed}` : null;
211
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Graphviz's own color resolution, measured against `dot` 2.43 with `-Txdot`:
3
+ *
4
+ * - Leading blanks are skipped and trailing ones are not (`"red "` is unknown); names match without regard to case
5
+ * and keep their inner spaces (`Light Grey` is unknown).
6
+ * - `#rrggbb` and `#rrggbbaa` only, with anything after the digits ignored; there is no 3-digit form.
7
+ * - Three numbers starting with a digit or a point (`.5 .5 .5`, `0.5,0.5,0.5`) are hue, saturation and value, each
8
+ * clamped to 0..1 and truncated to a byte; a fourth number and anything after it are ignored. A leading sign makes
9
+ * the value a name, so `-0.5 0.5 0.5` is unknown.
10
+ * - `/scheme/name` names a scheme for one value and `//name` means the object's scheme; scheme names ignore case. A
11
+ * scheme other than `x11` is searched INSTEAD of X11: `colorscheme=blues9` makes `red` unknown, and an unknown
12
+ * scheme knows no names at all.
13
+ * - `transparent`, `none` and `invis` are `#fffffe` with alpha 0, whatever the scheme.
14
+ * - An unknown color is drawn BLACK.
15
+ * - A color list (`red:blue`, `red;0.3:blue`): an outline or a font color draws the text before the first `:` as one
16
+ * color, so `red:blue` is red and `red;0.3:blue` is black (`red;0.3` is not a color). A fill draws a gradient and
17
+ * an edge draws one line per color; both start with the first entry's color, its `;fraction` dropped. A value
18
+ * with a `;` and no `:` is not a list: it is one unknown color, drawn black.
19
+ */
20
+
21
+ import { BREWER_SCHEMES, CSS_COLORS, X11_COLORS } from "./color-tables.js";
22
+
23
+ /**
24
+ * How Graphviz draws a color value, which decides how a color list is read.
25
+ * @category Styles
26
+ */
27
+ export type GraphvizColorUse = "line" | "fill" | "edge";
28
+
29
+ /**
30
+ * A resolved Graphviz color, with how it was read.
31
+ * @category Styles
32
+ */
33
+ export interface GraphvizColor {
34
+ /** `#rrggbb`. */
35
+ readonly hex: string;
36
+ /** 0..1. */
37
+ readonly alpha: number;
38
+ /** The value did not resolve, so Graphviz draws black. */
39
+ readonly unknown: boolean;
40
+ /** The value is a list read as its first color: a gradient for a fill, parallel lines for an edge. */
41
+ readonly list: "gradient" | "lines" | null;
42
+ }
43
+
44
+ const TRANSPARENT = new Set(["transparent", "none", "invis"]);
45
+ const HSV_PART = /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
46
+
47
+ /**
48
+ * A byte as two hex digits.
49
+ * @param v - 0..255
50
+ * @returns two lowercase hex digits
51
+ */
52
+ function hex2(v: number): string {
53
+ return v.toString(16).padStart(2, "0");
54
+ }
55
+
56
+ /**
57
+ * Graphviz's HSV to RGB, channels truncated to bytes.
58
+ * @param h - hue 0..1
59
+ * @param s - saturation 0..1
60
+ * @param v - value 0..1
61
+ * @returns `#rrggbb`
62
+ */
63
+ function hsvHex(h: number, s: number, v: number): string {
64
+ const i = Math.floor(h * 6);
65
+ const f = h * 6 - i;
66
+ const p = v * (1 - s);
67
+ const q = v * (1 - f * s);
68
+ const t = v * (1 - (1 - f) * s);
69
+ const rgb = [
70
+ [v, t, p],
71
+ [q, v, p],
72
+ [p, v, t],
73
+ [p, q, v],
74
+ [t, p, v],
75
+ [v, p, q],
76
+ ][i % 6];
77
+ return `#${rgb.map((c) => hex2(Math.trunc(c * 255))).join("")}`;
78
+ }
79
+
80
+ /**
81
+ * Resolves one Graphviz color (no list), or null when Graphviz does not know it.
82
+ * @param text - the color, leading blanks already skipped
83
+ * @param scheme - the object's color scheme, lowercase, `x11` when unset
84
+ * @returns hex and alpha, or null
85
+ */
86
+ function resolveOne(text: string, scheme: string): { hex: string; alpha: number } | null {
87
+ if (text.startsWith("#")) {
88
+ const m = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{1,2})?/.exec(text);
89
+ if (m === null) {
90
+ return null;
91
+ }
92
+ return {
93
+ hex: `#${m[1]}${m[2]}${m[3]}`.toLowerCase(),
94
+ alpha: m[4] === undefined ? 1 : Number.parseInt(m[4], 16) / 255,
95
+ };
96
+ }
97
+ const hsv = /^[.\d]/.test(text) ? hsvColor(text) : null;
98
+ if (hsv !== null) {
99
+ return { hex: hsv, alpha: 1 };
100
+ }
101
+ const named = schemedName(text.toLowerCase(), scheme);
102
+ if (named === null) {
103
+ return null;
104
+ }
105
+ if (TRANSPARENT.has(named.name)) {
106
+ return { hex: "#fffffe", alpha: 0 };
107
+ }
108
+ const hex = schemeColor(named.name, named.scheme);
109
+ return hex === undefined ? null : { hex, alpha: 1 };
110
+ }
111
+
112
+ /**
113
+ * An HSV color: three numbers 0..1 separated by blanks or commas, clamped.
114
+ * @param text - the color
115
+ * @returns `#rrggbb`, or null when it is not one
116
+ */
117
+ function hsvColor(text: string): string | null {
118
+ const parts = text.split(/[ ,]+/);
119
+ if (parts.length < 3 || !parts.slice(0, 3).every((p) => HSV_PART.test(p))) {
120
+ return null;
121
+ }
122
+ const [h, s, v] = parts.slice(0, 3).map((p) => Math.min(1, Math.max(0, Number(p))));
123
+ return hsvHex(h, s, v);
124
+ }
125
+
126
+ /**
127
+ * A color name and the scheme it is looked up in: `/scheme/name` names its own scheme, `//name` the object's.
128
+ * @param name - the name, lowercase
129
+ * @param scheme - the object's color scheme
130
+ * @returns the name and scheme, or null for a malformed `/scheme/name`
131
+ */
132
+ function schemedName(name: string, scheme: string): { name: string; scheme: string } | null {
133
+ if (!name.startsWith("/")) {
134
+ return { name, scheme };
135
+ }
136
+ const slash = name.indexOf("/", 1);
137
+ if (slash < 0) {
138
+ return null;
139
+ }
140
+ const prefix = name.slice(1, slash);
141
+ return { name: name.slice(slash + 1), scheme: prefix === "" ? scheme : prefix };
142
+ }
143
+
144
+ /**
145
+ * A color in a scheme: X11's or SVG's names, or a Brewer scheme's colors by their 1-based index.
146
+ * @param name - the name or index
147
+ * @param scheme - the scheme
148
+ * @returns `#rrggbb`, or undefined when the scheme has no such color
149
+ */
150
+ function schemeColor(name: string, scheme: string): string | undefined {
151
+ if (scheme === "x11") {
152
+ return X11_COLORS.get(name);
153
+ }
154
+ if (scheme === "svg") {
155
+ return CSS_COLORS.get(name);
156
+ }
157
+ const colors = BREWER_SCHEMES.get(scheme);
158
+ const index = /^\d{1,3}$/.test(name) ? Number(name) : 0;
159
+ return colors !== undefined && index >= 1 ? colors[index - 1] : undefined;
160
+ }
161
+
162
+ /**
163
+ * Resolves a Graphviz color value the way Graphviz draws it for a use; an unknown color is black.
164
+ * @param raw - the value, at most 256 characters
165
+ * @param scheme - the object's `colorscheme`, or null
166
+ * @param use - an outline or font color (`line`), a fill, or an edge's line color
167
+ * @returns the color and how it was read
168
+ * @category Styles
169
+ */
170
+ export function graphvizColor(raw: string, scheme: string | null, use: GraphvizColorUse): GraphvizColor {
171
+ let text = raw.replace(/^[ \t\r\n]+/, "");
172
+ let list: GraphvizColor["list"] = null;
173
+ const colon = text.indexOf(":");
174
+ if (colon >= 0) {
175
+ text = text.slice(0, colon);
176
+ if (use !== "line") {
177
+ const semi = text.indexOf(";");
178
+ if (semi >= 0) {
179
+ text = text.slice(0, semi);
180
+ }
181
+ list = use === "fill" ? "gradient" : "lines";
182
+ }
183
+ }
184
+ const sc = scheme === null || scheme.trim() === "" ? "x11" : scheme.toLowerCase();
185
+ const resolved = text === "" ? null : resolveOne(text, sc);
186
+ return resolved === null
187
+ ? { hex: "#000000", alpha: 1, unknown: true, list }
188
+ : { hex: resolved.hex, alpha: resolved.alpha, unknown: false, list };
189
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Canonical style values: every reader turns a file's raw value into one spelling per property before anything
3
+ * compares values. Colors are `#rrggbb` with the alpha moved to an opacity, numbers have 6 significant digits,
4
+ * enumerations come from the neutral vocabulary, and text is what the tool draws.
5
+ */
6
+
7
+ export * from "./bends.js";
8
+ export * from "./color.js";
9
+ export * from "./enums.js";
10
+ export { type GraphvizColor, graphvizColor, type GraphvizColorUse } from "./graphviz.js";
11
+ export * from "./number.js";
12
+ export { type CanonSite, MAX_STYLE_VALUE_LENGTH } from "./site.js";
13
+ export * from "./text.js";
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Canonical numbers, lengths, opacities and booleans: 6 significant digits, never negative, never NaN or Infinity.
3
+ */
4
+
5
+ import { STYLE_ISSUE } from "../codes.js";
6
+ import type { StyleDialect } from "../types.js";
7
+ import { type CanonSite, noteAt, scalarText, spendAt } from "./site.js";
8
+
9
+ /**
10
+ * The largest length or factor a file may give; a larger one is noted as `W_STYLE_BAD_VALUE` and gives no value.
11
+ * @category Styles
12
+ */
13
+ export const MAX_STYLE_NUMBER = 1e6;
14
+
15
+ /**
16
+ * Points per inch: DOT gives node sizes in inches, and a canonical length is in points (pixels at 72 dpi).
17
+ * @category Styles
18
+ */
19
+ export const DOT_POINTS_PER_INCH = 72;
20
+
21
+ /** One way to read a decimal number, so a long run of digits fails or passes in one pass. */
22
+ const DECIMAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
23
+
24
+ /**
25
+ * A number at 6 significant digits, with `-0` as `0`.
26
+ * @param value - a finite number
27
+ * @returns the canonical number
28
+ * @category Styles
29
+ */
30
+ export function num6(value: number): number {
31
+ return Number(value.toPrecision(6)) + 0;
32
+ }
33
+
34
+ /**
35
+ * A finite number from a number or a decimal string, or null with a note.
36
+ * @param raw - the file's value
37
+ * @param site - where it was read
38
+ * @returns the number, or null
39
+ */
40
+ function finite(raw: unknown, site: CanonSite): number | null {
41
+ if (typeof raw === "boolean") {
42
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);
43
+ return null;
44
+ }
45
+ const text = scalarText(raw, site);
46
+ if (text === null) {
47
+ return null;
48
+ }
49
+ const trimmed = text.trim();
50
+ let value = Number.NaN;
51
+ if (typeof raw === "number") {
52
+ value = raw;
53
+ } else if (DECIMAL.test(trimmed)) {
54
+ value = Number(trimmed);
55
+ }
56
+ if (!Number.isFinite(value)) {
57
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, text);
58
+ return null;
59
+ }
60
+ return value;
61
+ }
62
+
63
+ /**
64
+ * A length or factor: a finite number at least 0 and at most `MAX_STYLE_NUMBER` after multiplying by `factor`, at 6
65
+ * significant digits. Anything else is null with a `W_STYLE_BAD_VALUE` note.
66
+ * @param raw - the file's value: a number or a decimal string
67
+ * @param site - where it was read
68
+ * @param factor - multiplies the value first (`DOT_POINTS_PER_INCH` for DOT sizes); defaults to 1
69
+ * @returns the canonical number, or null
70
+ * @category Styles
71
+ */
72
+ export function canonNumber(raw: unknown, site: CanonSite, factor = 1): number | null {
73
+ const value = finite(raw, site);
74
+ if (value === null) {
75
+ return null;
76
+ }
77
+ const scaled = value * factor;
78
+ if (!(scaled >= 0 && scaled <= MAX_STYLE_NUMBER)) {
79
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw === "string" ? raw : String(raw));
80
+ return null;
81
+ }
82
+ return num6(scaled);
83
+ }
84
+
85
+ /**
86
+ * An opacity from 0 to 1. Cytoscape desktop states opacities from 0 to 255 and is divided by 255; every other
87
+ * dialect states 0 to 1. A value outside the dialect's range is null with a `W_STYLE_BAD_VALUE` note.
88
+ * @param raw - the file's value
89
+ * @param dialect - the file's dialect
90
+ * @param site - where it was read
91
+ * @returns the canonical opacity, or null
92
+ * @category Styles
93
+ */
94
+ export function canonOpacity(raw: unknown, dialect: StyleDialect, site: CanonSite): number | null {
95
+ const value = finite(raw, site);
96
+ if (value === null) {
97
+ return null;
98
+ }
99
+ const top = dialect === "cytoscape" ? 255 : 1;
100
+ if (!(value >= 0 && value <= top)) {
101
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw === "string" ? raw : String(raw));
102
+ return null;
103
+ }
104
+ return num6(value / top);
105
+ }
106
+
107
+ /** Boolean spellings, lowercase. */
108
+ const BOOLEANS: ReadonlyMap<string, boolean> = new Map([
109
+ ["true", true],
110
+ ["yes", true],
111
+ ["on", true],
112
+ ["1", true],
113
+ ["false", false],
114
+ ["no", false],
115
+ ["off", false],
116
+ ["0", false],
117
+ ]);
118
+
119
+ /**
120
+ * A boolean from `true`/`false`, `yes`/`no`, `on`/`off` or `1`/`0` in any case; anything else is null with a note.
121
+ * @param raw - the file's value
122
+ * @param site - where it was read
123
+ * @returns the boolean, or null
124
+ * @category Styles
125
+ */
126
+ export function canonBoolean(raw: unknown, site: CanonSite): boolean | null {
127
+ if (typeof raw === "boolean") {
128
+ spendAt(site, 1);
129
+ return raw;
130
+ }
131
+ const text = scalarText(raw, site);
132
+ if (text === null) {
133
+ return null;
134
+ }
135
+ const value = BOOLEANS.get(text.trim().toLowerCase());
136
+ if (value === undefined) {
137
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, text);
138
+ return null;
139
+ }
140
+ return value;
141
+ }
142
+
143
+ /**
144
+ * The unit of a dialect's lengths: GEXF and Pajek give size factors relative to their tool's normal size, every
145
+ * other dialect gives pixels (after DOT's inches are converted).
146
+ * @param dialect - the file's dialect
147
+ * @returns `"relative"` or `"px"`
148
+ * @category Styles
149
+ */
150
+ export function styleLengthUnit(dialect: StyleDialect): "px" | "relative" {
151
+ return dialect === "gexf" || dialect === "dvips" ? "relative" : "px";
152
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Where a raw value came from, so a canonicalizer can note a problem against the right target, property and element
3
+ * and spend the work it costs from the extraction's one budget.
4
+ */
5
+
6
+ import { STYLE_ISSUE } from "../codes.js";
7
+ import type { StyleNotes } from "../notes.js";
8
+ import type { StyleNoteCode, StyleTarget, StyleWorkBudget } from "../types.js";
9
+
10
+ /**
11
+ * A number, color, enumeration or mapper expression longer than this many characters is not parsed: it is noted as
12
+ * `W_STYLE_VALUE_TOO_LONG` and gives no value. Text is copied whatever its length.
13
+ * @category Styles
14
+ */
15
+ export const MAX_STYLE_VALUE_LENGTH = 256;
16
+
17
+ /**
18
+ * Where a raw value is read: the notes it reports to, the target and property it is for, the element it belongs to
19
+ * and the budget its work is spent from.
20
+ * @category Styles
21
+ */
22
+ export interface CanonSite {
23
+ /** Where problems are noted. */
24
+ readonly notes: StyleNotes;
25
+ /** Nodes, edges or the graph. */
26
+ readonly target: StyleTarget | "graph";
27
+ /** The neutral property the value is for. */
28
+ readonly property: string;
29
+ /** The element the value belongs to, by index; absent for a rule's value. */
30
+ readonly element?: number;
31
+ /** The work budget; each value spends one operation plus one per character it reads. */
32
+ readonly budget?: StyleWorkBudget;
33
+ }
34
+
35
+ /**
36
+ * Notes a problem with a value at its site.
37
+ * @param site - where the value was read
38
+ * @param code - the condition
39
+ * @param sample - the offending value
40
+ */
41
+ export function noteAt(site: CanonSite, code: StyleNoteCode, sample: unknown): void {
42
+ site.notes.add(code, site.target, site.property, { sample, element: site.element });
43
+ }
44
+
45
+ /**
46
+ * Spends operations from the site's budget; graph values count as node work.
47
+ * @param site - where the value was read
48
+ * @param operations - the work
49
+ */
50
+ export function spendAt(site: CanonSite, operations: number): void {
51
+ site.budget?.spend(site.target === "graph" ? "node" : site.target, operations);
52
+ }
53
+
54
+ /**
55
+ * The text of a raw scalar, untrimmed, after the length limit: null for an absent value (no note), and null with a
56
+ * note for a value that is empty, too long, not finite or not a scalar. Spends at most 257 operations.
57
+ * @param raw - the file's value
58
+ * @param site - where it was read
59
+ * @returns the value's text, or null
60
+ */
61
+ export function scalarText(raw: unknown, site: CanonSite): string | null {
62
+ spendAt(site, 1);
63
+ if (raw === null || raw === undefined) {
64
+ return null;
65
+ }
66
+ if (typeof raw === "number") {
67
+ if (Number.isFinite(raw)) {
68
+ return String(raw);
69
+ }
70
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, String(raw));
71
+ return null;
72
+ }
73
+ if (typeof raw !== "string") {
74
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw);
75
+ return null;
76
+ }
77
+ if (raw.length > MAX_STYLE_VALUE_LENGTH) {
78
+ noteAt(site, STYLE_ISSUE.VALUE_TOO_LONG, `${raw.length} characters`);
79
+ return null;
80
+ }
81
+ spendAt(site, raw.length);
82
+ if (raw.trim() === "") {
83
+ noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);
84
+ return null;
85
+ }
86
+ return raw;
87
+ }