@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
@@ -423,7 +423,8 @@ class ExportPlan {
423
423
  this.fatalEdges = new GraphFormatError("E_DIRECTED", gen.message, { reason: "mixed direction" });
424
424
  }
425
425
  if ((gen.code === LOSS.POSITIONS || gen.code === LOSS.VIZ) && gen.column !== null) {
426
- // written as a plain property (a point for a position); the role is what is lost
426
+ // written as a plain property (a point for a position); the role is what is lost. Deprecated for
427
+ // the style roles (next major): styles reach a file only through the style writer.
427
428
  this.notes.push(
428
429
  Object.freeze({
429
430
  code: gen.code,
@@ -24,7 +24,9 @@ import { agree, plural } from "../../common/plural.js";
24
24
  import { inferTextDtype } from "../../common/text.js";
25
25
  import { explicitWeights } from "../../common/weights.js";
26
26
  import { encodeChunks, joinText } from "../../common/writer.js";
27
+ import type { ExporterStyleOptions } from "../../styles/io/writer.js";
27
28
  import { type CommonExportOptions, type ExportCapabilities, type GraphExporter, type LossNote } from "../../types.js";
29
+ import { PAJEK_STYLE_CAPABILITIES, pajekStyledExport } from "./styles.js";
28
30
  import {
29
31
  encodeCharacterReferences,
30
32
  formatIntervals,
@@ -37,6 +39,9 @@ import {
37
39
  SHAPES,
38
40
  } from "./syntax.js";
39
41
 
42
+ /** What the writer takes: the format's options, the common ones and the styles. */
43
+ type PajekWriteOptions = PajekExportOptions & CommonExportOptions & ExporterStyleOptions;
44
+
40
45
  /**
41
46
  * The format-specific options of the Pajek exporter.
42
47
  * @category Built-in formats
@@ -105,6 +110,8 @@ export const PAJEK_LOSS = Object.freeze({
105
110
  * reads back with that role.
106
111
  */
107
112
  ROLE_ASSUMED: LOSS.ROLE_ASSUMED,
113
+ /** The label column, when a role-less column named `label` is read over it on import. */
114
+ COLUMN_DROPPED: LOSS.COLUMN_DROPPED,
108
115
  /**
109
116
  * With `sanitizeIds: "mangle"`: an original id that reads back as a different type, such as the text "7" as the
110
117
  * number 7.
@@ -392,16 +399,19 @@ function labelNotes(snapshot: GraphSnapshot, nodePlan: readonly PlannedColumn[],
392
399
  plain.length - plain.nullCount,
393
400
  ),
394
401
  );
395
- }
396
- if (carried === 0) {
397
- return;
398
- }
399
- let gained = 0;
400
- for (let i = 0; i < snapshot.nodeCount; i++) {
401
- if (!labels?.isSet(i)) {
402
- gained++;
402
+ // the labels written second on each vertex line are then read over by that parameter
403
+ if (labels !== null && labels !== plain) {
404
+ notes.push(
405
+ note(
406
+ PAJEK_LOSS.COLUMN_DROPPED,
407
+ `node column "${labels.meta.name}" (the labels) reads back replaced by the parameter "${LABEL_COLUMN}"`,
408
+ labels.meta.name,
409
+ labels.length - labels.nullCount,
410
+ ),
411
+ );
403
412
  }
404
413
  }
414
+ const gained = carried === 0 ? 0 : unlabeled(snapshot.nodeCount, labels);
405
415
  if (gained > 0) {
406
416
  notes.push(
407
417
  note(
@@ -414,6 +424,22 @@ function labelNotes(snapshot: GraphSnapshot, nodePlan: readonly PlannedColumn[],
414
424
  }
415
425
  }
416
426
 
427
+ /**
428
+ * How many nodes have no label value.
429
+ * @param nodeCount - the node count
430
+ * @param labels - the label column, or null
431
+ * @returns the count
432
+ */
433
+ function unlabeled(nodeCount: number, labels: Column | null): number {
434
+ let count = 0;
435
+ for (let i = 0; i < nodeCount; i++) {
436
+ if (!labels?.isSet(i)) {
437
+ count++;
438
+ }
439
+ }
440
+ return count;
441
+ }
442
+
417
443
  /**
418
444
  * Whether every set value of a shape column is a Pajek shape keyword.
419
445
  * @param column - the shape column (string or dict)
@@ -689,12 +715,14 @@ function needsZ(column: Column): boolean {
689
715
  * @param options.networkHeader - whether the `*Network` line is written
690
716
  * @param options.name - the name on that line, or null for a bare line
691
717
  * @param options.mangle - whether the original ids are written as `graphty_originalId` parameters
718
+ * @param comment - a comment line written first (the `graphty.styles` block), or null
692
719
  * @yields lines with their terminator
693
720
  * @returns nothing
694
721
  */
695
722
  function* writeParts(
696
723
  snapshot: GraphSnapshot,
697
724
  options: { networkHeader: boolean; name: string | null; mangle: boolean },
725
+ comment: string | null = null,
698
726
  ): Generator<string, void, undefined> {
699
727
  const ids = sanitizeIds(snapshot, CAPABILITIES.idCharset, options.mangle ? "mangle" : "error");
700
728
  const nodePlan = withoutReservedKey(plan(snapshot.nodes, "node", null), options.mangle);
@@ -714,6 +742,9 @@ function* writeParts(
714
742
  }
715
743
  }
716
744
 
745
+ if (comment !== null) {
746
+ yield `${comment}\n`;
747
+ }
717
748
  if (options.networkHeader) {
718
749
  yield options.name === null ? "*Network\n" : `*Network ${options.name}\n`;
719
750
  }
@@ -1008,105 +1039,21 @@ export const pajekExporter: GraphExporter<PajekExportOptions> = Object.freeze({
1008
1039
  format: "pajek",
1009
1040
  options: Object.freeze(["name", "networkHeader"]),
1010
1041
  capabilities: CAPABILITIES,
1042
+ styles: Object.freeze({ capabilities: PAJEK_STYLE_CAPABILITIES }),
1011
1043
 
1012
1044
  /**
1013
- * Pre-flight: the generic capability gaps plus the Pajek-specific ones.
1045
+ * Pre-flight: the generic capability gaps plus the Pajek-specific ones; with styles, also the values written as
1046
+ * the nearest ones Pajek has.
1014
1047
  * @param snapshot - the snapshot
1015
1048
  * @param options - export options
1016
1049
  * @returns the loss notes, empty when the export is exact
1017
1050
  */
1018
- check(snapshot: GraphSnapshot, options?: PajekExportOptions & CommonExportOptions): readonly LossNote[] {
1019
- const resolved = resolveExportOptions(options);
1020
- const { mangle } = resolvePajekOptions(snapshot, options);
1021
- const notes: LossNote[] = [];
1022
- const planned = plan(snapshot.nodes, "node", notes);
1023
- const nodePlan = withoutReservedKey(planned, mangle);
1024
- const edgePlan = plan(snapshot.edges, "edge", notes);
1025
- const ids = sanitizeIds(snapshot, CAPABILITIES.idCharset, mangle ? "mangle" : "error");
1026
- checkIdTexts(snapshot.nodeCount, ids, mangle, notes);
1027
- if (nodePlan.length !== planned.length) {
1028
- const reserved = planned.find((p) => p.slot === "param" && p.column.meta.name === ORIGINAL_ID_KEY);
1029
- if (reserved !== undefined) {
1030
- notes.push(
1031
- note(
1032
- PAJEK_LOSS.KEY_DROPPED,
1033
- `node column "${ORIGINAL_ID_KEY}" is the parameter the exporter writes the original ids under (sanitizeIds "mangle"); it is not written`,
1034
- ORIGINAL_ID_KEY,
1035
- reserved.column.length - reserved.column.nullCount,
1036
- ),
1037
- );
1038
- }
1039
- }
1040
- // columns this exporter handles itself although the generic table says otherwise: the spells
1041
- // list (written as an interval token, or reported above with the spells code), the shape
1042
- // keyword and the relation name (dict columns written as keywords)
1043
- const owned = new Set<string>();
1044
- for (const { column, slot } of [...nodePlan, ...edgePlan]) {
1045
- // a shape written as a parameter is owned too: its note already says the column reads back as string
1046
- if (
1047
- slot === "shape" ||
1048
- slot === "relation" ||
1049
- (slot === "param" && column.meta.domain === "node" && column.meta.name === SHAPE_COLUMN)
1050
- ) {
1051
- owned.add(`${column.meta.domain}:${column.meta.name}`);
1052
- }
1053
- }
1054
- for (const table of [snapshot.nodes, snapshot.edges]) {
1055
- for (const column of table) {
1056
- if (column.meta.role === "spells") {
1057
- owned.add(`${column.meta.domain}:${column.meta.name}`);
1058
- }
1059
- }
1060
- }
1061
- for (const n of checkCapabilities(snapshot, CAPABILITIES, resolved, {
1062
- roles: SLOT_ROLES,
1063
- roleNames: ROLE_NAMES,
1064
- // the label slot is a vertex slot; an edge label is a parameter under its own name
1065
- edgeRoleNames: {},
1066
- })) {
1067
- if (n.column !== null && (n.code === LOSS.LIST || n.code === LOSS.DTYPE)) {
1068
- const domain = n.message.startsWith("node column") ? "node" : "edge";
1069
- if (owned.has(`${domain}:${n.column}`)) {
1070
- continue;
1071
- }
1072
- }
1073
- notes.push(n);
1074
- }
1075
- labelNotes(snapshot, nodePlan, notes);
1076
- for (const column of snapshot.edges) {
1077
- if (column.meta.role === "label") {
1078
- notes.push(
1079
- note(
1080
- LOSS.ROLE,
1081
- `edge column "${column.meta.name}" (label) is written as a plain parameter; Pajek labels vertices only and the role is lost`,
1082
- column.meta.name,
1083
- column.length - column.nullCount,
1084
- ),
1085
- );
1086
- }
1087
- }
1088
- checkCells(nodePlan, "node", notes);
1089
- checkCells(edgePlan, "edge", notes);
1090
- const folding = pairFolding(snapshot, { foldMutual: true });
1091
- if (folding.mutualCount > 0) {
1092
- notes.push(
1093
- note(
1094
- PAJEK_LOSS.MUTUAL_AS_UNDIRECTED,
1095
- `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as undirected edges; the mutual mark is lost`,
1096
- snapshot.edges.byRole("mutual")?.meta.name ?? null,
1097
- folding.mutualCount,
1098
- ),
1099
- );
1051
+ check(snapshot: GraphSnapshot, options?: PajekWriteOptions): readonly LossNote[] {
1052
+ const styled = pajekStyledExport(snapshot, options?.styles);
1053
+ if (styled === null) {
1054
+ return checkPlain(snapshot, options);
1100
1055
  }
1101
- if (Number.isNaN(firstModeOf(snapshot))) {
1102
- notes.push(
1103
- note(
1104
- PAJEK_LOSS.FIRST_MODE_DROPPED,
1105
- "meta.extra.pajek.firstMode is not a count within 0..nodeCount; the two-mode header is not written",
1106
- ),
1107
- );
1108
- }
1109
- return notes;
1056
+ return Object.freeze([...checkPlain(styled.snapshot, withOriginalIds(options)), ...styled.notes]);
1110
1057
  },
1111
1058
 
1112
1059
  /**
@@ -1115,9 +1062,8 @@ export const pajekExporter: GraphExporter<PajekExportOptions> = Object.freeze({
1115
1062
  * @param options - export options
1116
1063
  * @returns the chunks
1117
1064
  */
1118
- export(snapshot: GraphSnapshot, options?: PajekExportOptions & CommonExportOptions): AsyncIterable<Uint8Array> {
1119
- const resolved = resolvePajekOptions(snapshot, options);
1120
- return encodeChunks(writeParts(snapshot, resolved));
1065
+ export(snapshot: GraphSnapshot, options?: PajekWriteOptions): AsyncIterable<Uint8Array> {
1066
+ return encodeChunks(styledParts(snapshot, options));
1121
1067
  },
1122
1068
 
1123
1069
  /**
@@ -1126,8 +1072,151 @@ export const pajekExporter: GraphExporter<PajekExportOptions> = Object.freeze({
1126
1072
  * @param options - export options
1127
1073
  * @returns the document
1128
1074
  */
1129
- exportToString(snapshot: GraphSnapshot, options?: PajekExportOptions & CommonExportOptions): Promise<string> {
1130
- const resolved = resolvePajekOptions(snapshot, options);
1131
- return joinText(writeParts(snapshot, resolved));
1075
+ exportToString(snapshot: GraphSnapshot, options?: PajekWriteOptions): Promise<string> {
1076
+ return joinText(styledParts(snapshot, options));
1132
1077
  },
1133
1078
  });
1079
+
1080
+ /**
1081
+ * The text parts of a Pajek document, with its styles when they are given.
1082
+ * @param snapshot - the snapshot
1083
+ * @param options - export options
1084
+ * @returns the parts
1085
+ */
1086
+ function styledParts(snapshot: GraphSnapshot, options?: PajekWriteOptions): Generator<string, void, undefined> {
1087
+ const styled = pajekStyledExport(snapshot, options?.styles);
1088
+ if (styled === null) {
1089
+ return writeParts(snapshot, resolvePajekOptions(snapshot, options));
1090
+ }
1091
+ return writeParts(styled.snapshot, resolvePajekOptions(styled.snapshot, withOriginalIds(options)), styled.comment);
1092
+ }
1093
+
1094
+ /**
1095
+ * The options of an export with styles: unless `sanitizeIds` is given, the original ids of renumbered vertices are
1096
+ * written too (`"mangle"`), so the file reads back as the same graph and its `graphty.styles` block applies.
1097
+ * @param options - export options
1098
+ * @returns the options to write with
1099
+ */
1100
+ function withOriginalIds(
1101
+ options: (PajekExportOptions & CommonExportOptions) | undefined,
1102
+ ): PajekExportOptions & CommonExportOptions {
1103
+ return options?.sanitizeIds === undefined ? { ...options, sanitizeIds: "mangle" } : options;
1104
+ }
1105
+
1106
+ /**
1107
+ * The columns this exporter handles itself although the generic table says otherwise: the spells list (written as an
1108
+ * interval token, or reported with the spells code), the shape keyword and the relation name (dict columns written as
1109
+ * keywords), and a shape written as a parameter (its own note says the column reads back as string).
1110
+ * @param snapshot - the snapshot
1111
+ * @param planned - the node and edge column plans
1112
+ * @returns the columns, as `<domain>:<name>`
1113
+ */
1114
+ function ownedColumns(snapshot: GraphSnapshot, planned: readonly PlannedColumn[]): Set<string> {
1115
+ const owned = new Set<string>();
1116
+ const key = (column: Column): string => `${column.meta.domain}:${column.meta.name}`;
1117
+ for (const { column, slot } of planned) {
1118
+ const shapeParam = slot === "param" && column.meta.domain === "node" && column.meta.name === SHAPE_COLUMN;
1119
+ if (slot === "shape" || slot === "relation" || shapeParam) {
1120
+ owned.add(key(column));
1121
+ }
1122
+ }
1123
+ for (const column of [...snapshot.nodes, ...snapshot.edges]) {
1124
+ if (column.meta.role === "spells") {
1125
+ owned.add(key(column));
1126
+ }
1127
+ }
1128
+ return owned;
1129
+ }
1130
+
1131
+ /**
1132
+ * The generic capability gaps, without the list and dtype notes of a column Pajek writes in a slot of its own.
1133
+ * @param snapshot - the snapshot
1134
+ * @param resolved - the resolved export options
1135
+ * @param owned - the columns written in a slot of their own, as `<domain>:<name>`
1136
+ * @returns the loss notes
1137
+ */
1138
+ function capabilityNotes(
1139
+ snapshot: GraphSnapshot,
1140
+ resolved: ReturnType<typeof resolveExportOptions>,
1141
+ owned: ReadonlySet<string>,
1142
+ ): LossNote[] {
1143
+ const notes = checkCapabilities(snapshot, CAPABILITIES, resolved, {
1144
+ roles: SLOT_ROLES,
1145
+ roleNames: ROLE_NAMES,
1146
+ // the label slot is a vertex slot; an edge label is a parameter under its own name
1147
+ edgeRoleNames: {},
1148
+ });
1149
+ return notes.filter((n) => {
1150
+ if (n.column === null || (n.code !== LOSS.LIST && n.code !== LOSS.DTYPE)) {
1151
+ return true;
1152
+ }
1153
+ const domain = n.message.startsWith("node column") ? "node" : "edge";
1154
+ return !owned.has(`${domain}:${n.column}`);
1155
+ });
1156
+ }
1157
+
1158
+ /**
1159
+ * Every loss the Pajek text of a snapshot would incur: the generic capability gaps plus the Pajek-specific ones.
1160
+ * @param snapshot - the snapshot
1161
+ * @param options - export options
1162
+ * @returns the loss notes
1163
+ */
1164
+ function checkPlain(snapshot: GraphSnapshot, options?: PajekExportOptions & CommonExportOptions): LossNote[] {
1165
+ const resolved = resolveExportOptions(options);
1166
+ const { mangle } = resolvePajekOptions(snapshot, options);
1167
+ const notes: LossNote[] = [];
1168
+ const planned = plan(snapshot.nodes, "node", notes);
1169
+ const nodePlan = withoutReservedKey(planned, mangle);
1170
+ const edgePlan = plan(snapshot.edges, "edge", notes);
1171
+ const ids = sanitizeIds(snapshot, CAPABILITIES.idCharset, mangle ? "mangle" : "error");
1172
+ checkIdTexts(snapshot.nodeCount, ids, mangle, notes);
1173
+ const reserved =
1174
+ nodePlan.length === planned.length
1175
+ ? undefined
1176
+ : planned.find((p) => p.slot === "param" && p.column.meta.name === ORIGINAL_ID_KEY);
1177
+ if (reserved !== undefined) {
1178
+ notes.push(
1179
+ note(
1180
+ PAJEK_LOSS.KEY_DROPPED,
1181
+ `node column "${ORIGINAL_ID_KEY}" is the parameter the exporter writes the original ids under (sanitizeIds "mangle"); it is not written`,
1182
+ ORIGINAL_ID_KEY,
1183
+ reserved.column.length - reserved.column.nullCount,
1184
+ ),
1185
+ );
1186
+ }
1187
+ const owned = ownedColumns(snapshot, [...nodePlan, ...edgePlan]);
1188
+ notes.push(...capabilityNotes(snapshot, resolved, owned));
1189
+ labelNotes(snapshot, nodePlan, notes);
1190
+ for (const column of [...snapshot.edges].filter((c) => c.meta.role === "label")) {
1191
+ notes.push(
1192
+ note(
1193
+ LOSS.ROLE,
1194
+ `edge column "${column.meta.name}" (label) is written as a plain parameter; Pajek labels vertices only and the role is lost`,
1195
+ column.meta.name,
1196
+ column.length - column.nullCount,
1197
+ ),
1198
+ );
1199
+ }
1200
+ checkCells(nodePlan, "node", notes);
1201
+ checkCells(edgePlan, "edge", notes);
1202
+ const folding = pairFolding(snapshot, { foldMutual: true });
1203
+ if (folding.mutualCount > 0) {
1204
+ notes.push(
1205
+ note(
1206
+ PAJEK_LOSS.MUTUAL_AS_UNDIRECTED,
1207
+ `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as undirected edges; the mutual mark is lost`,
1208
+ snapshot.edges.byRole("mutual")?.meta.name ?? null,
1209
+ folding.mutualCount,
1210
+ ),
1211
+ );
1212
+ }
1213
+ if (Number.isNaN(firstModeOf(snapshot))) {
1214
+ notes.push(
1215
+ note(
1216
+ PAJEK_LOSS.FIRST_MODE_DROPPED,
1217
+ "meta.extra.pajek.firstMode is not a count within 0..nodeCount; the two-mode header is not written",
1218
+ ),
1219
+ );
1220
+ }
1221
+ return notes;
1222
+ }
@@ -68,6 +68,7 @@ import {
68
68
  type ImportInput,
69
69
  type ImportReport,
70
70
  } from "../../types.js";
71
+ import { pajekStyles } from "./styles.js";
71
72
  import {
72
73
  decodeCharacterReferences,
73
74
  isCommentOrBlank,
@@ -78,6 +79,7 @@ import {
78
79
  isVertexNumber,
79
80
  LABEL_COLUMN,
80
81
  ORIGINAL_ID_KEY,
82
+ PAJEK_STYLE_COMMENT,
81
83
  parseIntervals,
82
84
  parseSectionHeader,
83
85
  PARTITION_COLUMN,
@@ -222,6 +224,10 @@ export const PAJEK_ISSUE = Object.freeze({
222
224
  NEGATIVE_LIST_ENTRY: "W_PAJEK_NEGATIVE_LIST_ENTRY",
223
225
  /** An integer beyond 2^53 was stored as the nearest 64-bit float; pass `long: "string"` to keep every digit. */
224
226
  PRECISION: PRECISION_CODE,
227
+ /** A number alone at the end of a row, after its parameters (Pajek writes a trailing `0`); it is ignored. */
228
+ TRAILING_VALUE: "W_PAJEK_TRAILING_VALUE",
229
+ /** A line whose value is `NaN`; the line is kept without a value. */
230
+ NAN_VALUE: "W_PAJEK_NAN_VALUE",
225
231
  });
226
232
 
227
233
  /** The common options the Pajek importer reads (the rest is reported by reportUnusedOptions). */
@@ -251,6 +257,8 @@ const FIRST_VERTEX_VALUES: ReadonlySet<unknown> = new Set([0, 1, "auto"]);
251
257
  /** A numeral that is not a finite number (`1e999`, `NaN`, `Infinity`): never a parameter key. */
252
258
  const NUMERAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
253
259
  const NON_FINITE_WORD = /^[+-]?(?:nan|inf|infinity)$/i;
260
+ /** A line value Pajek writes for a missing value. */
261
+ const NAN_WORD = /^[+-]?nan$/i;
254
262
 
255
263
  const LABEL_DECL: ColumnDecl = {
256
264
  name: LABEL_COLUMN,
@@ -291,7 +299,8 @@ function spellsDecl(): ColumnDecl {
291
299
  }
292
300
 
293
301
  /**
294
- * The position column declaration (design section 5.2: f64 x 3, role position, units "file").
302
+ * The position column declaration (design section 5.2: f64 x 3, role position, units "file"), with
303
+ * its spelling for `extractPositions()`.
295
304
  * @param sourceDims - 2 or 3, the coordinate count of the first vertex line with coordinates
296
305
  * @returns a fresh declaration
297
306
  */
@@ -303,7 +312,9 @@ function positionDecl(sourceDims: number): ColumnDecl {
303
312
  nullable: true,
304
313
  role: "position",
305
314
  origin: { format: "pajek", id: "coordinates" },
306
- extra: { sourceDims, units: "file" },
315
+ // Pajek draws y downward (USAir97.net has Deadhorse, Alaska at y 0.10 and Miami at 0.53),
316
+ // centers depth on 0.5, and NetworkX writes "0.0 0.0" for a node with no position
317
+ extra: { sourceDims, units: "file", yAxis: "down", zOrigin: 0.5, zeroUnplaced: true },
307
318
  };
308
319
  }
309
320
 
@@ -335,6 +346,8 @@ interface RowExtras {
335
346
  readonly values: string[];
336
347
  /** The spells of an interval token, or null. */
337
348
  spells: [number, number][] | null;
349
+ /** A vertex shape keyword written among the parameters (Pajek reads it anywhere), lower-cased, or null. */
350
+ shape: string | null;
338
351
  }
339
352
 
340
353
  /** The section the parser is in. */
@@ -483,6 +496,9 @@ class PajekParser {
483
496
 
484
497
  private readonly edgeParams = new Map<string, TextCellWriter>();
485
498
 
499
+ /** Whether a `% graphty.styles` comment was kept for the style reader. */
500
+ private styleBlockKept = false;
501
+
486
502
  /**
487
503
  * Create the parser for one import call.
488
504
  * @param sink - the sink
@@ -504,6 +520,22 @@ class PajekParser {
504
520
  this.coercer = new IdCoercer(options.ids);
505
521
  }
506
522
 
523
+ /**
524
+ * Keep the first `% graphty.styles <json>` comment for the style reader (a file graphty wrote carries its styles
525
+ * there; Pajek skips comment lines).
526
+ * @param text - a comment or blank line
527
+ */
528
+ private comment(text: string): void {
529
+ if (this.styleBlockKept) {
530
+ return;
531
+ }
532
+ const trimmed = text.trimStart();
533
+ if (trimmed.startsWith(PAJEK_STYLE_COMMENT)) {
534
+ this.styleBlockKept = true;
535
+ this.report.keepForStyles(trimmed.slice(PAJEK_STYLE_COMMENT.length));
536
+ }
537
+ }
538
+
507
539
  /**
508
540
  * Handle one line; every problem of the line is recorded as an issue and the line skipped.
509
541
  * @param text - the line without its terminator
@@ -512,6 +544,7 @@ class PajekParser {
512
544
  */
513
545
  line(text: string, line: number): boolean {
514
546
  if (isCommentOrBlank(text)) {
547
+ this.comment(text);
515
548
  return false;
516
549
  }
517
550
  const afterObjectHeader = this.objectHeader;
@@ -1050,6 +1083,7 @@ class PajekParser {
1050
1083
  i++;
1051
1084
  }
1052
1085
  const extras = this.extras(tokens, i, "node", line);
1086
+ shape = extras.shape ?? shape;
1053
1087
  const restored = this.restoredId(extras);
1054
1088
  this.createNodes();
1055
1089
  // write
@@ -1329,6 +1363,14 @@ class PajekParser {
1329
1363
  if (i < tokens.length && isNumericText(tokens[i])) {
1330
1364
  valueText = tokens[i];
1331
1365
  i++;
1366
+ } else if (i < tokens.length && NAN_WORD.test(tokens[i])) {
1367
+ this.report.warnOnce(
1368
+ "validation-error",
1369
+ PAJEK_ISSUE.NAN_VALUE,
1370
+ `a line value ${JSON.stringify(tokens[i])} is not a number; the line is kept without a value`,
1371
+ { line },
1372
+ );
1373
+ i++;
1332
1374
  }
1333
1375
  const extras = this.extras(tokens, i, "edge", line);
1334
1376
  const { weightFrom } = this.options;
@@ -1607,7 +1649,7 @@ class PajekParser {
1607
1649
  * @returns the parsed extras
1608
1650
  */
1609
1651
  private extras(tokens: readonly string[], start: number, domain: "node" | "edge", line: number): RowExtras {
1610
- const extras: RowExtras = { keys: [], values: [], spells: null };
1652
+ const extras: RowExtras = { keys: [], values: [], spells: null, shape: null };
1611
1653
  const seen = new Set<string>();
1612
1654
  for (let i = start; i < tokens.length;) {
1613
1655
  const token = tokens[i];
@@ -1616,13 +1658,14 @@ class PajekParser {
1616
1658
  i++;
1617
1659
  continue;
1618
1660
  }
1661
+ if (domain === "node" && isShapeKeyword(token)) {
1662
+ extras.shape = token.toLowerCase();
1663
+ i++;
1664
+ continue;
1665
+ }
1619
1666
  if (i + 1 >= tokens.length) {
1620
- this.skip(domain);
1621
- throw new LineError(
1622
- "parse-error",
1623
- domain === "node" ? PAJEK_ISSUE.VERTEX_LINE : PAJEK_ISSUE.LINE,
1624
- `parameter "${token}" has no value`,
1625
- );
1667
+ this.loneLastToken(token, domain, line);
1668
+ break;
1626
1669
  }
1627
1670
  if (seen.has(token)) {
1628
1671
  this.report.warning(
@@ -1640,6 +1683,31 @@ class PajekParser {
1640
1683
  return extras;
1641
1684
  }
1642
1685
 
1686
+ /**
1687
+ * A token alone at the end of a row, with no value after it: a number is ignored (reported once);
1688
+ * anything else is a parameter without its value, which skips the row.
1689
+ * @param token - the token
1690
+ * @param domain - what is skipped when the row is malformed
1691
+ * @param line - the line number
1692
+ */
1693
+ private loneLastToken(token: string, domain: "node" | "edge", line: number): void {
1694
+ if (isNumericText(token)) {
1695
+ this.report.warnOnce(
1696
+ "validation-error",
1697
+ PAJEK_ISSUE.TRAILING_VALUE,
1698
+ `the number ${JSON.stringify(token)} alone at the end of a row is not a parameter; it is ignored`,
1699
+ { line },
1700
+ );
1701
+ return;
1702
+ }
1703
+ this.skip(domain);
1704
+ throw new LineError(
1705
+ "parse-error",
1706
+ domain === "node" ? PAJEK_ISSUE.VERTEX_LINE : PAJEK_ISSUE.LINE,
1707
+ `parameter "${token}" has no value`,
1708
+ );
1709
+ }
1710
+
1643
1711
  /**
1644
1712
  * The spells of a row's interval token; a malformed one skips the row.
1645
1713
  * @param token - the token, starting with "["
@@ -1780,6 +1848,7 @@ export const pajekImporter: GraphImporter<PajekImportOptions> = Object.freeze({
1780
1848
  options: Object.freeze(["firstVertex"]),
1781
1849
  extensions: Object.freeze([".net", ".paj"]),
1782
1850
  mimeTypes: Object.freeze(["text/x-pajek", "text/plain"]),
1851
+ styles: pajekStyles,
1783
1852
 
1784
1853
  /**
1785
1854
  * Confidence that the input is a Pajek network: it starts with `*Vertices` (or `*Network`),
@@ -6,3 +6,5 @@
6
6
 
7
7
  export { PAJEK_LOSS, pajekExporter, type PajekExportOptions } from "./exporter.js";
8
8
  export { PAJEK_ISSUE, pajekImporter, type PajekImportOptions } from "./importer.js";
9
+ export { PAJEK_STYLE_CAPABILITIES } from "./styles.js";
10
+ export { PAJEK_STYLE_COMMENT } from "./syntax.js";