@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
+ * Pajek styles: each vertex's shape keyword and drawing parameters (`ic`, `bc`, `bw`, `x_fact`, `y_fact`, `lc`, `fos`)
3
+ * and each line's `c`, `w` and `p`, read the way Pajek draws them, with Pajek's stated defaults beneath (an ellipse,
4
+ * black solid lines, an arrow at the target of every arc). Colors are Pajek's: the dvips names, `GrayNN`,
5
+ * `RGBrrggbb`, `RGB(r,g,b)` and the CMYK forms. `x_fact` and `y_fact` are factors of Pajek's normal vertex size, so the
6
+ * lengths are relative.
7
+ *
8
+ * Writing: the same parameters from what graphty draws, leaving out what Pajek draws by default; a color that is a
9
+ * dvips name is written by name, any other as `RGBrrggbb`, so colors are exact. The `graphty.styles` block, with the
10
+ * per-element values its rules read inside it (Pajek has no other place for them), is one comment line,
11
+ * `% graphty.styles <json>`, which Pajek skips and graph-io reads back.
12
+ */
13
+
14
+ import type { GraphSnapshot } from "@graphty/graph-format";
15
+
16
+ import { canonColor, colorOpacity } from "../../styles/canon/color.js";
17
+ import { DVIPS_COLORS } from "../../styles/canon/color-tables.js";
18
+ import { canonEnum } from "../../styles/canon/enums.js";
19
+ import { canonNumber } from "../../styles/canon/number.js";
20
+ import type { CanonSite } from "../../styles/canon/site.js";
21
+ import { canonText } from "../../styles/canon/text.js";
22
+ import { StyleApproximations } from "../../styles/io/approximations.js";
23
+ import { blockStyles, parseStyleBlock, styleBlockLosses, writeStyleBlock } from "../../styles/io/block.js";
24
+ import type { ExporterStyleInput } from "../../styles/io/writer.js";
25
+ import { StyleNotes } from "../../styles/notes.js";
26
+ import { styleFingerprint } from "../../styles/plan/features.js";
27
+ import { plainCell, resolveStyles } from "../../styles/plan/resolve.js";
28
+ import type {
29
+ ImporterStyles,
30
+ StyleColumn,
31
+ StyleReadContext,
32
+ StyleRule,
33
+ StyleTarget,
34
+ StyleValue,
35
+ StyleWriteCapabilities,
36
+ } from "../../styles/types.js";
37
+ import type { LossNote } from "../../types.js";
38
+ import { type ValueColumns, valueColumns } from "../graphml/styles-yed.js";
39
+ import { LABEL_COLUMN, PAJEK_STYLE_COMMENT, SHAPE_COLUMN } from "./syntax.js";
40
+
41
+ /**
42
+ * What the Pajek writer holds natively: the vertex label, the vertex shape keyword and drawing parameters, the line
43
+ * parameters, and the arrows Pajek draws on arcs. The `graphty.styles` block is a comment line the writer places itself.
44
+ * @category Built-in formats
45
+ */
46
+ export const PAJEK_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({
47
+ node: Object.freeze([
48
+ "label",
49
+ "fill",
50
+ "fillOpacity",
51
+ "opacity",
52
+ "borderColor",
53
+ "borderWidth",
54
+ "shape",
55
+ "width",
56
+ "height",
57
+ "labelColor",
58
+ "labelSize",
59
+ ] as const),
60
+ edge: Object.freeze(["color", "opacity", "width", "lineStyle", "sourceArrow", "targetArrow"] as const),
61
+ block: "native",
62
+ });
63
+
64
+ /**
65
+ * Pajek's default vertex size, in the units of a border width `bw`: `x_fact` and `y_fact` are factors of it, so a
66
+ * border width is read as a factor of it too (`bw 1`, Pajek's default, is a fifth of a normal vertex).
67
+ */
68
+ const VERTEX_SIZE = 5;
69
+
70
+ /** The vertex parameters read as styles. */
71
+ const NODE_KEYS: readonly string[] = ["ic", "bc", "bw", "x_fact", "y_fact", "lc", "fos"];
72
+
73
+ /** The line parameters read as styles. */
74
+ const EDGE_KEYS: readonly string[] = ["c", "w", "p"];
75
+
76
+ /** The style column marking arcs, which Pajek draws with an arrow at the target. */
77
+ const DIRECTED_KEY = "directed";
78
+
79
+ /** The properties the reader reads, per target: what a file graphty wrote can bring back from its block. */
80
+ const READ: Readonly<Record<StyleTarget, readonly string[]>> = {
81
+ node: [
82
+ "label",
83
+ "shape",
84
+ "fill",
85
+ "fillOpacity",
86
+ "borderColor",
87
+ "borderWidth",
88
+ "width",
89
+ "height",
90
+ "labelColor",
91
+ "labelSize",
92
+ ],
93
+ edge: ["color", "opacity", "width", "lineStyle"],
94
+ };
95
+
96
+ /** A parameter's value on one element, or null. */
97
+ type Param = (key: string) => unknown;
98
+
99
+ /** Receives one canonical value. */
100
+ type Put = (property: string, value: StyleValue | null) => void;
101
+
102
+ /** The site of a property's value. */
103
+ type At = (property: string) => CanonSite;
104
+
105
+ /**
106
+ * Reads a Pajek color and its alpha.
107
+ * @param raw - the parameter's value, or null
108
+ * @param property - the color property
109
+ * @param opacity - its opacity property, or null
110
+ * @param put - receives the values
111
+ * @param at - the sites
112
+ */
113
+ function readColor(raw: unknown, property: string, opacity: string | null, put: Put, at: At): void {
114
+ if (raw === null) {
115
+ return;
116
+ }
117
+ const c = canonColor(raw, "dvips", at(property));
118
+ if (c === null) {
119
+ return;
120
+ }
121
+ put(property, c.color);
122
+ const alpha = colorOpacity(c, null, at(property), opacity !== null);
123
+ if (opacity !== null) {
124
+ put(opacity, alpha);
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Reads a length or factor.
130
+ * @param raw - the parameter's value, or null
131
+ * @param property - the property
132
+ * @param put - receives the value
133
+ * @param at - the sites
134
+ */
135
+ function readNumber(raw: unknown, property: string, put: Put, at: At): void {
136
+ if (raw !== null) {
137
+ put(property, canonNumber(raw, at(property)));
138
+ }
139
+ }
140
+
141
+ /**
142
+ * One vertex's style: its label, which Pajek draws beside it, and its shape keyword and drawing parameters.
143
+ * @param get - the vertex's parameters
144
+ * @param put - receives the values
145
+ * @param at - the sites
146
+ */
147
+ function readVertex(get: Param, put: Put, at: At): void {
148
+ // an empty label draws nothing
149
+ const label = get(LABEL_COLUMN);
150
+ if (label !== null && label !== "") {
151
+ put("label", canonText(label, at("label")));
152
+ }
153
+ const shape = get(SHAPE_COLUMN);
154
+ if (shape !== null) {
155
+ put("shape", canonEnum("shape", shape, "dvips", at("shape")));
156
+ }
157
+ readColor(get("ic"), "fill", "fillOpacity", put, at);
158
+ readColor(get("bc"), "borderColor", null, put, at);
159
+ const bw = get("bw");
160
+ if (bw !== null) {
161
+ const width = canonNumber(bw, at("borderWidth"));
162
+ put("borderWidth", width === null ? null : width / VERTEX_SIZE);
163
+ }
164
+ readNumber(get("x_fact"), "width", put, at);
165
+ readNumber(get("y_fact"), "height", put, at);
166
+ readColor(get("lc"), "labelColor", null, put, at);
167
+ readNumber(get("fos"), "labelSize", put, at);
168
+ }
169
+
170
+ /**
171
+ * One line's style: its color, width and pattern.
172
+ * @param get - the line's parameters
173
+ * @param put - receives the values
174
+ * @param at - the sites
175
+ */
176
+ function readLine(get: Param, put: Put, at: At): void {
177
+ readColor(get("c"), "color", "opacity", put, at);
178
+ readNumber(get("w"), "width", put, at);
179
+ const p = get("p");
180
+ if (p !== null) {
181
+ put("lineStyle", canonEnum("lineStyle", p, "dvips", at("lineStyle")));
182
+ }
183
+ }
184
+
185
+ /**
186
+ * A table's parameter getter for one element: the cell, or null when the table has no such column or no value.
187
+ * @param table - the node or edge table
188
+ * @param i - the element
189
+ * @returns the getter
190
+ */
191
+ function cells(table: GraphSnapshot["nodes"], i: number): Param {
192
+ return (key) => (table.has(key) ? plainCell(table.value(key, i)) : null);
193
+ }
194
+
195
+ /**
196
+ * Whether each edge is an arc (directed).
197
+ * @param snapshot - the graph
198
+ * @returns one flag per edge
199
+ */
200
+ function directedEdges(snapshot: GraphSnapshot): boolean[] {
201
+ const out = new Array<boolean>(snapshot.edgeCount).fill(snapshot.directed);
202
+ const col = snapshot.directed ? snapshot.edges.byRole("directed") : null;
203
+ if (col !== null) {
204
+ for (let e = 0; e < snapshot.edgeCount; e++) {
205
+ out[e] = plainCell(col.value(e)) !== false;
206
+ }
207
+ }
208
+ return out;
209
+ }
210
+
211
+ /**
212
+ * The columns of a table that hold styles.
213
+ * @param table - the node or edge table
214
+ * @param keys - the style parameters of that table
215
+ * @returns the column names present
216
+ */
217
+ function styleColumns(table: GraphSnapshot["nodes"], keys: readonly string[]): string[] {
218
+ return keys.filter((k) => table.has(k));
219
+ }
220
+
221
+ /**
222
+ * The styles of a Pajek file, read the way Pajek draws them, with Pajek's stated defaults beneath: a labeled ellipse
223
+ * with a black border, black solid lines, and an arrow at the target of every arc. A file graphty wrote gives back its `graphty.styles` block.
224
+ * @param snapshot - the graph the import built
225
+ * @param context - the work budget and the block text the import kept
226
+ * @returns the styles
227
+ */
228
+ export function pajekStyles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {
229
+ const notes = new StyleNotes();
230
+ const read = (target: StyleTarget): ValueColumns => {
231
+ const table = target === "node" ? snapshot.nodes : snapshot.edges;
232
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
233
+ const out = valueColumns(n);
234
+ for (let i = 0; i < n; i++) {
235
+ context.budget.spend(target, 1);
236
+ const at: At = (property) => ({ notes, target, property, element: i, budget: context.budget });
237
+ (target === "node" ? readVertex : readLine)(
238
+ cells(table, i),
239
+ (property, value) => {
240
+ out.put(i, property, value);
241
+ },
242
+ at,
243
+ );
244
+ }
245
+ return out.values;
246
+ };
247
+ const node = read("node");
248
+ const edge = read("edge");
249
+ const block = typeof context.kept === "string" ? context.kept : null;
250
+ if (block !== null) {
251
+ exactFromBlock(snapshot, block, { node, edge });
252
+ }
253
+ // Pajek's default that is a rule: an arc has an arrow at its target, an edge none
254
+ const rules: StyleRule[] = [];
255
+ const columns = new Map<string, StyleColumn>();
256
+ const directed = directedEdges(snapshot);
257
+ if (directed.some(Boolean)) {
258
+ columns.set(
259
+ DIRECTED_KEY,
260
+ directed.map((d) => (d ? true : null)),
261
+ );
262
+ rules.push({
263
+ id: "edge.tool.arrow",
264
+ target: "edge",
265
+ role: "group",
266
+ origin: "tool",
267
+ where: { has: { style: DIRECTED_KEY } },
268
+ set: { targetArrow: "triangle" },
269
+ });
270
+ }
271
+ return {
272
+ canonical: true,
273
+ dialect: "dvips",
274
+ tool: "pajek",
275
+ units: "relative",
276
+ node: { values: node },
277
+ edge: { values: edge, rules, columns },
278
+ notes: notes.list(),
279
+ block,
280
+ readFrom: {
281
+ node: styleColumns(snapshot.nodes, [SHAPE_COLUMN, ...NODE_KEYS]),
282
+ edge: styleColumns(snapshot.edges, EDGE_KEYS),
283
+ },
284
+ };
285
+ }
286
+
287
+ // ============================================================ writing
288
+
289
+ /** One element's value of a property. */
290
+ type Get = (property: string) => StyleValue | null;
291
+
292
+ /** Records a value written as the nearest one Pajek has. */
293
+ type Approximate = (property: string, value: StyleValue) => void;
294
+
295
+ /** A parameter's written value. */
296
+ type Written = string | number;
297
+
298
+ /** Pajek's shape keywords for graphty's shapes; a shape not listed is written as its nearest. */
299
+ const SHAPES: ReadonlyMap<string, string> = new Map([
300
+ ["ellipse", "ellipse"],
301
+ ["rectangle", "box"],
302
+ ["diamond", "diamond"],
303
+ ["triangle", "triangle"],
304
+ ["none", "empty"],
305
+ ["other:cross", "cross"],
306
+ ["other:house", "house"],
307
+ ["other:man", "man"],
308
+ ["other:woman", "woman"],
309
+ ]);
310
+
311
+ /** The nearest Pajek shape of a shape Pajek does not have. */
312
+ const NEAREST_SHAPES: ReadonlyMap<string, string> = new Map([
313
+ ["round-rectangle", "box"],
314
+ ["parallelogram", "box"],
315
+ ["trapezoid", "box"],
316
+ ["vee", "triangle"],
317
+ ]);
318
+
319
+ /** The dvips name of each color that has one: a color with a name is written by it. */
320
+ const DVIPS_NAMES: ReadonlyMap<string, string> = new Map(
321
+ [...DVIPS_COLORS].reverse().map(([name, hex]) => [hex, name] as const),
322
+ );
323
+
324
+ /**
325
+ * A color as Pajek writes it: its dvips name when it has one, else `RGBrrggbb`; both are exact.
326
+ * @param color - a canonical `#rrggbb`
327
+ * @returns the text
328
+ */
329
+ function pajekColorText(color: string): string {
330
+ return DVIPS_NAMES.get(color) ?? `RGB${color.slice(1).toUpperCase()}`;
331
+ }
332
+
333
+ /**
334
+ * Notes each opacity below 1: Pajek draws every color opaque.
335
+ * @param get - the element's values
336
+ * @param properties - its opacity properties
337
+ * @param approximate - records approximations
338
+ */
339
+ function opaque(get: Get, properties: readonly string[], approximate: Approximate): void {
340
+ for (const property of properties) {
341
+ const v = get(property);
342
+ if (v !== null && v !== 1) {
343
+ approximate(property, v);
344
+ }
345
+ }
346
+ }
347
+
348
+ /**
349
+ * A vertex's Pajek shape keyword: its own, else the nearest one (noted), else Pajek's ellipse.
350
+ * @param get - the vertex's values
351
+ * @param approximate - records approximations
352
+ * @returns the keyword
353
+ */
354
+ function shapeKeyword(get: Get, approximate: Approximate): string {
355
+ const shape = get("shape");
356
+ if (typeof shape !== "string") {
357
+ return "ellipse";
358
+ }
359
+ const keyword = SHAPES.get(shape);
360
+ if (keyword !== undefined) {
361
+ return keyword;
362
+ }
363
+ approximate("shape", shape);
364
+ return NEAREST_SHAPES.get(shape) ?? "ellipse";
365
+ }
366
+
367
+ /**
368
+ * A vertex's parameters from its values, leaving out the ellipse and the black border 1 wide Pajek draws by default.
369
+ * @param get - the vertex's values
370
+ * @param approximate - records approximations
371
+ * @returns the parameters, the shape keyword under `shape`
372
+ */
373
+ function vertexParams(get: Get, approximate: Approximate): Map<string, Written> {
374
+ const out = new Map<string, Written>();
375
+ opaque(get, ["fillOpacity", "opacity"], approximate);
376
+ const keyword = shapeKeyword(get, approximate);
377
+ if (keyword !== "ellipse") {
378
+ out.set(SHAPE_COLUMN, keyword);
379
+ }
380
+ const colors = [
381
+ ["fill", "ic"],
382
+ ["borderColor", "bc"],
383
+ ["labelColor", "lc"],
384
+ ] as const;
385
+ const numbers = [
386
+ ["width", "x_fact"],
387
+ ["height", "y_fact"],
388
+ ["labelSize", "fos"],
389
+ ] as const;
390
+ for (const [property, key] of colors) {
391
+ const v = get(property);
392
+ if (typeof v === "string" && !(property === "borderColor" && v === "#000000")) {
393
+ out.set(key, pajekColorText(v));
394
+ }
395
+ }
396
+ for (const [property, key] of numbers) {
397
+ const v = get(property);
398
+ if (typeof v === "number") {
399
+ out.set(key, v);
400
+ }
401
+ }
402
+ const bw = get("borderWidth");
403
+ if (typeof bw === "number") {
404
+ const written = Number((bw * VERTEX_SIZE).toPrecision(15));
405
+ if (written === 1) {
406
+ out.delete("bw");
407
+ } else {
408
+ out.set("bw", written);
409
+ }
410
+ }
411
+ return out;
412
+ }
413
+
414
+ /**
415
+ * A line's parameters from its values, leaving out Pajek's black solid line. Arrows are Pajek's own: an arc has one
416
+ * at its target and an edge none, so any other arrow is noted.
417
+ * @param get - the line's values
418
+ * @param directed - whether the line is an arc
419
+ * @param approximate - records approximations
420
+ * @returns the parameters
421
+ */
422
+ function lineParams(get: Get, directed: boolean, approximate: Approximate): Map<string, Written> {
423
+ const out = new Map<string, Written>();
424
+ opaque(get, ["opacity"], approximate);
425
+ const color = get("color");
426
+ if (typeof color === "string" && color !== "#000000") {
427
+ out.set("c", pajekColorText(color));
428
+ }
429
+ const width = get("width");
430
+ if (typeof width === "number") {
431
+ out.set("w", width);
432
+ }
433
+ const lineStyle = get("lineStyle");
434
+ if (typeof lineStyle === "string" && lineStyle !== "solid" && pajekDots(lineStyle, approximate)) {
435
+ out.set("p", "Dots");
436
+ }
437
+ const target = get("targetArrow");
438
+ if (target !== null && target !== (directed ? "triangle" : "none")) {
439
+ approximate("targetArrow", target);
440
+ }
441
+ const source = get("sourceArrow");
442
+ if (source !== null && source !== "none") {
443
+ approximate("sourceArrow", source);
444
+ }
445
+ return out;
446
+ }
447
+
448
+ /**
449
+ * Whether a line other than a solid one is written as Pajek's Dots: Pajek draws Solid and Dots only; a dashed kind is
450
+ * nearest to Dots, any other line to Solid.
451
+ * @param lineStyle - the line style
452
+ * @param approximate - records approximations
453
+ * @returns true for Dots
454
+ */
455
+ function pajekDots(lineStyle: string, approximate: Approximate): boolean {
456
+ if (lineStyle === "dotted") {
457
+ return true;
458
+ }
459
+ approximate("lineStyle", lineStyle);
460
+ return lineStyle === "dashed" || lineStyle === "dash-dot" || lineStyle === "long-dash";
461
+ }
462
+
463
+ /**
464
+ * Each element's values of the properties the writer writes, as a getter per element.
465
+ * @param picture - each element's value of a property
466
+ * @param target - nodes or edges
467
+ * @returns the getter
468
+ */
469
+ function getter(
470
+ picture: (target: StyleTarget, property: string) => readonly (StyleValue | null)[],
471
+ target: StyleTarget,
472
+ ): (i: number) => Get {
473
+ const columns = new Map<string, readonly (StyleValue | null)[]>();
474
+ for (const p of PAJEK_STYLE_CAPABILITIES[target]) {
475
+ columns.set(p, picture(target, p));
476
+ }
477
+ return (i) => (property) => columns.get(property)?.[i] ?? null;
478
+ }
479
+
480
+ /**
481
+ * For a file graphty wrote: where a value read from the parameters is what the writer writes for the block's own
482
+ * value (a hexagon written as an ellipse, a dashed line as Dots), the block's exact value is the truth, so a re-import
483
+ * gives back the same rules; a value another program changed since stays the truth.
484
+ * @param snapshot - the graph
485
+ * @param text - the block's text
486
+ * @param read - the values read, changed in place
487
+ * @param read.node - the node values
488
+ * @param read.edge - the edge values
489
+ */
490
+ function exactFromBlock(
491
+ snapshot: GraphSnapshot,
492
+ text: string,
493
+ read: { readonly node: ValueColumns; readonly edge: ValueColumns },
494
+ ): void {
495
+ const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
496
+ const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "pajek") : null;
497
+ if (ex === null) {
498
+ return;
499
+ }
500
+ const notes = new StyleNotes();
501
+ const directed = directedEdges(snapshot);
502
+ for (const target of ["node", "edge"] as const) {
503
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
504
+ const get = getter((t, p) => resolveStyles(ex, t, p as never, snapshot), target);
505
+ const values = read[target];
506
+ for (let i = 0; i < n; i++) {
507
+ const want = get(i);
508
+ const back = writtenAndReadBack(target, want, directed[i], notes);
509
+ for (const property of READ[target]) {
510
+ const native = values[property]?.[i] ?? null;
511
+ const w = want(property);
512
+ if (w !== null && native !== w && native === (back.get(property) ?? null)) {
513
+ values[property] ??= new Array<StyleValue | null>(n).fill(null);
514
+ values[property][i] = w;
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
520
+
521
+ /**
522
+ * An element's values written as the writer writes them and read back as the reader reads them.
523
+ * @param target - nodes or edges
524
+ * @param want - its values
525
+ * @param directed - for a line, whether it is an arc
526
+ * @param notes - a scratch for the notes the round trip makes
527
+ * @returns the values read back, by property
528
+ */
529
+ function writtenAndReadBack(
530
+ target: StyleTarget,
531
+ want: Get,
532
+ directed: boolean,
533
+ notes: StyleNotes,
534
+ ): Map<string, StyleValue> {
535
+ const ignore: Approximate = () => undefined;
536
+ const params = target === "node" ? vertexParams(want, ignore) : lineParams(want, directed, ignore);
537
+ const back = new Map<string, StyleValue>();
538
+ const label = target === "node" ? want("label") : null;
539
+ if (typeof label === "string") {
540
+ params.set(LABEL_COLUMN, pajekLabelText(label));
541
+ }
542
+ (target === "node" ? readVertex : readLine)(
543
+ (key) => params.get(key) ?? null,
544
+ (property, value) => {
545
+ if (value !== null) {
546
+ back.set(property, value);
547
+ }
548
+ },
549
+ (property) => ({ notes, target, property }),
550
+ );
551
+ return back;
552
+ }
553
+
554
+ /** A Pajek export with styles worked out. */
555
+ interface PajekStyledExport {
556
+ /** The graph to write: the shape keyword and parameters written from the styles. */
557
+ readonly snapshot: GraphSnapshot;
558
+ /** The comment line carrying the `graphty.styles` block, without its line end. */
559
+ readonly comment: string;
560
+ /** W_STYLE_APPROXIMATED for every value written as the nearest one Pajek has. */
561
+ readonly notes: readonly LossNote[];
562
+ }
563
+
564
+ /**
565
+ * Works out a Pajek export with styles: every vertex's shape keyword and drawing parameters and every line's `c`, `w`
566
+ * and `p` from what graphty draws, in place of every such parameter it had, and the `graphty.styles` block, with the
567
+ * per-element values its rules read inside it, as a comment line.
568
+ * @param snapshot - the graph handed to the exporter
569
+ * @param input - the styles, or undefined when none are written
570
+ * @returns the styled export, or null without styles
571
+ */
572
+ export function pajekStyledExport(
573
+ snapshot: GraphSnapshot,
574
+ input: ExporterStyleInput | undefined,
575
+ ): PajekStyledExport | null {
576
+ if (input === undefined) {
577
+ return null;
578
+ }
579
+ const approximated = new StyleApproximations();
580
+ const out = snapshot.withColumns();
581
+ const directed = directedEdges(snapshot);
582
+ for (const target of ["node", "edge"] as const) {
583
+ const table = target === "node" ? out.nodes : out.edges;
584
+ const approximate: Approximate = (property, value) => {
585
+ approximated.add(target, property, value);
586
+ };
587
+ const get = getter((t, p) => input.picture(t, p as never), target);
588
+ const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
589
+ const params = (i: number): Map<string, Written> =>
590
+ target === "node" ? vertexParams(get(i), approximate) : lineParams(get(i), directed[i], approximate);
591
+ replaceParamColumns(
592
+ table,
593
+ target === "node" ? [SHAPE_COLUMN, ...NODE_KEYS] : EDGE_KEYS,
594
+ paramColumns(n, params),
595
+ );
596
+ }
597
+ out.nodes.set(
598
+ LABEL_COLUMN,
599
+ drawnLabels(input, snapshot.nodeCount, approximated),
600
+ { dtype: "string", role: "label" },
601
+ {
602
+ replaceRole: true,
603
+ },
604
+ );
605
+ const notes = approximated.notes("Pajek");
606
+ const block = writeStyleBlock(input.rules, { inlineColumns: true, snapshot });
607
+ notes.push(...styleBlockLosses(block, input.rules.styles.rules.length, "size"));
608
+ return { snapshot: out, comment: PAJEK_STYLE_COMMENT + block, notes };
609
+ }
610
+
611
+ /**
612
+ * Each vertex's label as graphty draws it; a vertex graphty draws without one gets an empty label, which Pajek draws
613
+ * as nothing (with no label, Pajek writes and draws the vertex's id).
614
+ * @param input - the styles
615
+ * @param n - the vertex count
616
+ * @param approximated - records approximations
617
+ * @returns the labels
618
+ */
619
+ function drawnLabels(input: ExporterStyleInput, n: number, approximated: StyleApproximations): string[] {
620
+ const drawn = input.picture("node", "label");
621
+ const out = new Array<string>(n).fill("");
622
+ for (let i = 0; i < n; i++) {
623
+ const v = drawn[i] ?? null;
624
+ if (typeof v === "string") {
625
+ out[i] = pajekLabelText(v);
626
+ if (out[i] !== v) {
627
+ approximated.add("node", "label", v);
628
+ }
629
+ }
630
+ }
631
+ return out;
632
+ }
633
+
634
+ /**
635
+ * A label as Pajek can write it: a line break becomes a space and a double quote a single one, which Pajek's labels
636
+ * cannot hold.
637
+ * @param label - the label graphty draws
638
+ * @returns the text written
639
+ */
640
+ function pajekLabelText(label: string): string {
641
+ return label.replaceAll(/\r\n|[\r\n]/g, " ").replaceAll('"', "'");
642
+ }
643
+
644
+ /**
645
+ * Replaces every drawing parameter column of a table with the ones written from the styles.
646
+ * @param table - the node or edge columns, changed in place
647
+ * @param keys - every drawing parameter key of the target
648
+ * @param columns - the written columns, by key
649
+ */
650
+ function replaceParamColumns(
651
+ table: ReturnType<GraphSnapshot["withColumns"]>["nodes"],
652
+ keys: readonly string[],
653
+ columns: Map<string, (Written | null)[]>,
654
+ ): void {
655
+ for (const key of keys) {
656
+ if (table.has(key)) {
657
+ table.remove(key);
658
+ }
659
+ }
660
+ for (const [key, col] of columns) {
661
+ const numeric = col.every((v) => v === null || typeof v === "number");
662
+ table.set(key, col, { dtype: numeric ? "f64" : "string" });
663
+ }
664
+ }
665
+
666
+ /**
667
+ * Every element's parameters, as columns.
668
+ * @param n - the element count
669
+ * @param params - an element's parameters
670
+ * @returns the columns, by parameter key
671
+ */
672
+ function paramColumns(n: number, params: (i: number) => Map<string, Written>): Map<string, (Written | null)[]> {
673
+ const columns = new Map<string, (Written | null)[]>();
674
+ for (let i = 0; i < n; i++) {
675
+ for (const [key, value] of params(i)) {
676
+ let col = columns.get(key);
677
+ if (col === undefined) {
678
+ col = new Array<Written | null>(n).fill(null);
679
+ columns.set(key, col);
680
+ }
681
+ col[i] = value;
682
+ }
683
+ }
684
+ return columns;
685
+ }
@@ -110,6 +110,13 @@ type SectionKind =
110
110
  */
111
111
  export const ORIGINAL_ID_KEY = "graphty_originalId";
112
112
 
113
+ /**
114
+ * How a file graphty wrote carries its `graphty.styles` block: a comment line starting with this text, then the
115
+ * block's JSON. Pajek skips comment lines; graph-io reads the block back.
116
+ * @category Built-in formats
117
+ */
118
+ export const PAJEK_STYLE_COMMENT = "% graphty.styles ";
119
+
113
120
  /**
114
121
  * A parsed section header line.
115
122
  * @category Plugin helpers