riksdagsmonitor 0.8.23 → 0.8.24

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 (546) hide show
  1. package/README.md +53 -1
  2. package/dist/lib/dashboards/party-dashboard.js +2 -1
  3. package/dist/lib/dashboards/party-dashboard.js.map +1 -1
  4. package/dist/lib/dashboards/risk-dashboard.js +2 -1
  5. package/dist/lib/dashboards/risk-dashboard.js.map +1 -1
  6. package/dist/lib/shared/index.d.ts +0 -1
  7. package/dist/lib/shared/index.d.ts.map +1 -1
  8. package/dist/lib/shared/index.js +3 -1
  9. package/dist/lib/shared/index.js.map +1 -1
  10. package/dist/lib/shared/register-globals.d.ts +1 -1
  11. package/dist/lib/shared/register-globals.d.ts.map +1 -1
  12. package/dist/lib/shared/register-globals.js +7 -1
  13. package/dist/lib/shared/register-globals.js.map +1 -1
  14. package/package.json +53 -21
  15. package/dist/scripts/analysis-reader.d.ts +0 -241
  16. package/dist/scripts/analysis-reader.d.ts.map +0 -1
  17. package/dist/scripts/analysis-reader.js +0 -531
  18. package/dist/scripts/analysis-reader.js.map +0 -1
  19. package/dist/scripts/article-quality-enhancer.d.ts +0 -148
  20. package/dist/scripts/article-quality-enhancer.d.ts.map +0 -1
  21. package/dist/scripts/article-quality-enhancer.js +0 -430
  22. package/dist/scripts/article-quality-enhancer.js.map +0 -1
  23. package/dist/scripts/article-template/constants.d.ts +0 -104
  24. package/dist/scripts/article-template/constants.d.ts.map +0 -1
  25. package/dist/scripts/article-template/constants.js +0 -225
  26. package/dist/scripts/article-template/constants.js.map +0 -1
  27. package/dist/scripts/article-template/helpers.d.ts +0 -83
  28. package/dist/scripts/article-template/helpers.d.ts.map +0 -1
  29. package/dist/scripts/article-template/helpers.js +0 -236
  30. package/dist/scripts/article-template/helpers.js.map +0 -1
  31. package/dist/scripts/article-template/index.d.ts +0 -39
  32. package/dist/scripts/article-template/index.d.ts.map +0 -1
  33. package/dist/scripts/article-template/index.js +0 -37
  34. package/dist/scripts/article-template/index.js.map +0 -1
  35. package/dist/scripts/article-template/registry.d.ts +0 -64
  36. package/dist/scripts/article-template/registry.d.ts.map +0 -1
  37. package/dist/scripts/article-template/registry.js +0 -405
  38. package/dist/scripts/article-template/registry.js.map +0 -1
  39. package/dist/scripts/article-template/template.d.ts +0 -18
  40. package/dist/scripts/article-template/template.d.ts.map +0 -1
  41. package/dist/scripts/article-template/template.js +0 -359
  42. package/dist/scripts/article-template/template.js.map +0 -1
  43. package/dist/scripts/article-template/types.d.ts +0 -90
  44. package/dist/scripts/article-template/types.d.ts.map +0 -1
  45. package/dist/scripts/article-template/types.js +0 -96
  46. package/dist/scripts/article-template/types.js.map +0 -1
  47. package/dist/scripts/article-template.d.ts +0 -18
  48. package/dist/scripts/article-template.d.ts.map +0 -1
  49. package/dist/scripts/article-template.js +0 -18
  50. package/dist/scripts/article-template.js.map +0 -1
  51. package/dist/scripts/catalog-downloaded-data.d.ts +0 -66
  52. package/dist/scripts/catalog-downloaded-data.d.ts.map +0 -1
  53. package/dist/scripts/catalog-downloaded-data.js +0 -239
  54. package/dist/scripts/catalog-downloaded-data.js.map +0 -1
  55. package/dist/scripts/check-cia-schema-updates.d.ts +0 -186
  56. package/dist/scripts/check-cia-schema-updates.d.ts.map +0 -1
  57. package/dist/scripts/check-cia-schema-updates.js +0 -363
  58. package/dist/scripts/check-cia-schema-updates.js.map +0 -1
  59. package/dist/scripts/data-transformers/calendar.d.ts +0 -16
  60. package/dist/scripts/data-transformers/calendar.d.ts.map +0 -1
  61. package/dist/scripts/data-transformers/calendar.js +0 -137
  62. package/dist/scripts/data-transformers/calendar.js.map +0 -1
  63. package/dist/scripts/data-transformers/constants/committee-names.d.ts +0 -15
  64. package/dist/scripts/data-transformers/constants/committee-names.d.ts.map +0 -1
  65. package/dist/scripts/data-transformers/constants/committee-names.js +0 -30
  66. package/dist/scripts/data-transformers/constants/committee-names.js.map +0 -1
  67. package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts +0 -11
  68. package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts.map +0 -1
  69. package/dist/scripts/data-transformers/constants/content-labels-part1.js +0 -900
  70. package/dist/scripts/data-transformers/constants/content-labels-part1.js.map +0 -1
  71. package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts +0 -11
  72. package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts.map +0 -1
  73. package/dist/scripts/data-transformers/constants/content-labels-part2.js +0 -900
  74. package/dist/scripts/data-transformers/constants/content-labels-part2.js.map +0 -1
  75. package/dist/scripts/data-transformers/constants/content-labels.d.ts +0 -13
  76. package/dist/scripts/data-transformers/constants/content-labels.d.ts.map +0 -1
  77. package/dist/scripts/data-transformers/constants/content-labels.js +0 -18
  78. package/dist/scripts/data-transformers/constants/content-labels.js.map +0 -1
  79. package/dist/scripts/data-transformers/constants/index.d.ts +0 -15
  80. package/dist/scripts/data-transformers/constants/index.d.ts.map +0 -1
  81. package/dist/scripts/data-transformers/constants/index.js +0 -15
  82. package/dist/scripts/data-transformers/constants/index.js.map +0 -1
  83. package/dist/scripts/data-transformers/constants/locale-map.d.ts +0 -13
  84. package/dist/scripts/data-transformers/constants/locale-map.d.ts.map +0 -1
  85. package/dist/scripts/data-transformers/constants/locale-map.js +0 -17
  86. package/dist/scripts/data-transformers/constants/locale-map.js.map +0 -1
  87. package/dist/scripts/data-transformers/constants.d.ts +0 -14
  88. package/dist/scripts/data-transformers/constants.d.ts.map +0 -1
  89. package/dist/scripts/data-transformers/constants.js +0 -14
  90. package/dist/scripts/data-transformers/constants.js.map +0 -1
  91. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts +0 -64
  92. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts.map +0 -1
  93. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js +0 -805
  94. package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js.map +0 -1
  95. package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts +0 -50
  96. package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts.map +0 -1
  97. package/dist/scripts/data-transformers/content-generators/cia-overview-section.js +0 -310
  98. package/dist/scripts/data-transformers/content-generators/cia-overview-section.js.map +0 -1
  99. package/dist/scripts/data-transformers/content-generators/committee.d.ts +0 -12
  100. package/dist/scripts/data-transformers/content-generators/committee.d.ts.map +0 -1
  101. package/dist/scripts/data-transformers/content-generators/committee.js +0 -247
  102. package/dist/scripts/data-transformers/content-generators/committee.js.map +0 -1
  103. package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts +0 -124
  104. package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts.map +0 -1
  105. package/dist/scripts/data-transformers/content-generators/dashboard-section.js +0 -564
  106. package/dist/scripts/data-transformers/content-generators/dashboard-section.js.map +0 -1
  107. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts +0 -82
  108. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts.map +0 -1
  109. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js +0 -321
  110. package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js.map +0 -1
  111. package/dist/scripts/data-transformers/content-generators/generic.d.ts +0 -12
  112. package/dist/scripts/data-transformers/content-generators/generic.d.ts.map +0 -1
  113. package/dist/scripts/data-transformers/content-generators/generic.js +0 -295
  114. package/dist/scripts/data-transformers/content-generators/generic.js.map +0 -1
  115. package/dist/scripts/data-transformers/content-generators/index.d.ts +0 -84
  116. package/dist/scripts/data-transformers/content-generators/index.d.ts.map +0 -1
  117. package/dist/scripts/data-transformers/content-generators/index.js +0 -47
  118. package/dist/scripts/data-transformers/content-generators/index.js.map +0 -1
  119. package/dist/scripts/data-transformers/content-generators/interpellations.d.ts +0 -12
  120. package/dist/scripts/data-transformers/content-generators/interpellations.d.ts.map +0 -1
  121. package/dist/scripts/data-transformers/content-generators/interpellations.js +0 -124
  122. package/dist/scripts/data-transformers/content-generators/interpellations.js.map +0 -1
  123. package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts +0 -137
  124. package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts.map +0 -1
  125. package/dist/scripts/data-transformers/content-generators/mindmap-section.js +0 -286
  126. package/dist/scripts/data-transformers/content-generators/mindmap-section.js.map +0 -1
  127. package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts +0 -17
  128. package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts.map +0 -1
  129. package/dist/scripts/data-transformers/content-generators/month-ahead.js +0 -212
  130. package/dist/scripts/data-transformers/content-generators/month-ahead.js.map +0 -1
  131. package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts +0 -17
  132. package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts.map +0 -1
  133. package/dist/scripts/data-transformers/content-generators/monthly-review.js +0 -173
  134. package/dist/scripts/data-transformers/content-generators/monthly-review.js.map +0 -1
  135. package/dist/scripts/data-transformers/content-generators/motions.d.ts +0 -12
  136. package/dist/scripts/data-transformers/content-generators/motions.d.ts.map +0 -1
  137. package/dist/scripts/data-transformers/content-generators/motions.js +0 -158
  138. package/dist/scripts/data-transformers/content-generators/motions.js.map +0 -1
  139. package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts +0 -62
  140. package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts.map +0 -1
  141. package/dist/scripts/data-transformers/content-generators/newsworthiness.js +0 -254
  142. package/dist/scripts/data-transformers/content-generators/newsworthiness.js.map +0 -1
  143. package/dist/scripts/data-transformers/content-generators/propositions.d.ts +0 -12
  144. package/dist/scripts/data-transformers/content-generators/propositions.d.ts.map +0 -1
  145. package/dist/scripts/data-transformers/content-generators/propositions.js +0 -263
  146. package/dist/scripts/data-transformers/content-generators/propositions.js.map +0 -1
  147. package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts +0 -92
  148. package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts.map +0 -1
  149. package/dist/scripts/data-transformers/content-generators/sankey-section.js +0 -257
  150. package/dist/scripts/data-transformers/content-generators/sankey-section.js.map +0 -1
  151. package/dist/scripts/data-transformers/content-generators/shared.d.ts +0 -139
  152. package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +0 -1
  153. package/dist/scripts/data-transformers/content-generators/shared.js +0 -935
  154. package/dist/scripts/data-transformers/content-generators/shared.js.map +0 -1
  155. package/dist/scripts/data-transformers/content-generators/swot-section.d.ts +0 -50
  156. package/dist/scripts/data-transformers/content-generators/swot-section.d.ts.map +0 -1
  157. package/dist/scripts/data-transformers/content-generators/swot-section.js +0 -177
  158. package/dist/scripts/data-transformers/content-generators/swot-section.js.map +0 -1
  159. package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts +0 -12
  160. package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts.map +0 -1
  161. package/dist/scripts/data-transformers/content-generators/week-ahead.js +0 -332
  162. package/dist/scripts/data-transformers/content-generators/week-ahead.js.map +0 -1
  163. package/dist/scripts/data-transformers/content-generators.d.ts +0 -15
  164. package/dist/scripts/data-transformers/content-generators.d.ts.map +0 -1
  165. package/dist/scripts/data-transformers/content-generators.js +0 -14
  166. package/dist/scripts/data-transformers/content-generators.js.map +0 -1
  167. package/dist/scripts/data-transformers/document-analysis.d.ts +0 -58
  168. package/dist/scripts/data-transformers/document-analysis.d.ts.map +0 -1
  169. package/dist/scripts/data-transformers/document-analysis.js +0 -396
  170. package/dist/scripts/data-transformers/document-analysis.js.map +0 -1
  171. package/dist/scripts/data-transformers/helpers.d.ts +0 -144
  172. package/dist/scripts/data-transformers/helpers.d.ts.map +0 -1
  173. package/dist/scripts/data-transformers/helpers.js +0 -408
  174. package/dist/scripts/data-transformers/helpers.js.map +0 -1
  175. package/dist/scripts/data-transformers/index.d.ts +0 -45
  176. package/dist/scripts/data-transformers/index.d.ts.map +0 -1
  177. package/dist/scripts/data-transformers/index.js +0 -66
  178. package/dist/scripts/data-transformers/index.js.map +0 -1
  179. package/dist/scripts/data-transformers/metadata.d.ts +0 -42
  180. package/dist/scripts/data-transformers/metadata.d.ts.map +0 -1
  181. package/dist/scripts/data-transformers/metadata.js +0 -385
  182. package/dist/scripts/data-transformers/metadata.js.map +0 -1
  183. package/dist/scripts/data-transformers/policy-analysis.d.ts +0 -105
  184. package/dist/scripts/data-transformers/policy-analysis.d.ts.map +0 -1
  185. package/dist/scripts/data-transformers/policy-analysis.js +0 -686
  186. package/dist/scripts/data-transformers/policy-analysis.js.map +0 -1
  187. package/dist/scripts/data-transformers/risk-analysis.d.ts +0 -104
  188. package/dist/scripts/data-transformers/risk-analysis.d.ts.map +0 -1
  189. package/dist/scripts/data-transformers/risk-analysis.js +0 -279
  190. package/dist/scripts/data-transformers/risk-analysis.js.map +0 -1
  191. package/dist/scripts/data-transformers/types.d.ts +0 -260
  192. package/dist/scripts/data-transformers/types.d.ts.map +0 -1
  193. package/dist/scripts/data-transformers/types.js +0 -11
  194. package/dist/scripts/data-transformers/types.js.map +0 -1
  195. package/dist/scripts/data-transformers.d.ts +0 -23
  196. package/dist/scripts/data-transformers.d.ts.map +0 -1
  197. package/dist/scripts/data-transformers.js +0 -35
  198. package/dist/scripts/data-transformers.js.map +0 -1
  199. package/dist/scripts/deep-inspection/index.d.ts +0 -55
  200. package/dist/scripts/deep-inspection/index.d.ts.map +0 -1
  201. package/dist/scripts/deep-inspection/index.js +0 -66
  202. package/dist/scripts/deep-inspection/index.js.map +0 -1
  203. package/dist/scripts/detect-swedish-leakage.d.ts +0 -69
  204. package/dist/scripts/detect-swedish-leakage.d.ts.map +0 -1
  205. package/dist/scripts/detect-swedish-leakage.js +0 -417
  206. package/dist/scripts/detect-swedish-leakage.js.map +0 -1
  207. package/dist/scripts/editorial-framework.d.ts +0 -121
  208. package/dist/scripts/editorial-framework.d.ts.map +0 -1
  209. package/dist/scripts/editorial-framework.js +0 -364
  210. package/dist/scripts/editorial-framework.js.map +0 -1
  211. package/dist/scripts/editorial-pillars.d.ts +0 -43
  212. package/dist/scripts/editorial-pillars.d.ts.map +0 -1
  213. package/dist/scripts/editorial-pillars.js +0 -215
  214. package/dist/scripts/editorial-pillars.js.map +0 -1
  215. package/dist/scripts/extract-news-metadata.d.ts +0 -12
  216. package/dist/scripts/extract-news-metadata.d.ts.map +0 -1
  217. package/dist/scripts/extract-news-metadata.js +0 -107
  218. package/dist/scripts/extract-news-metadata.js.map +0 -1
  219. package/dist/scripts/extract-vocabulary.d.ts +0 -15
  220. package/dist/scripts/extract-vocabulary.d.ts.map +0 -1
  221. package/dist/scripts/extract-vocabulary.js +0 -255
  222. package/dist/scripts/extract-vocabulary.js.map +0 -1
  223. package/dist/scripts/fix-article-navigation.d.ts +0 -37
  224. package/dist/scripts/fix-article-navigation.d.ts.map +0 -1
  225. package/dist/scripts/fix-article-navigation.js +0 -198
  226. package/dist/scripts/fix-article-navigation.js.map +0 -1
  227. package/dist/scripts/fix-keywords-localization.d.ts +0 -18
  228. package/dist/scripts/fix-keywords-localization.d.ts.map +0 -1
  229. package/dist/scripts/fix-keywords-localization.js +0 -270
  230. package/dist/scripts/fix-keywords-localization.js.map +0 -1
  231. package/dist/scripts/fix-old-articles-branding.d.ts +0 -17
  232. package/dist/scripts/fix-old-articles-branding.d.ts.map +0 -1
  233. package/dist/scripts/fix-old-articles-branding.js +0 -229
  234. package/dist/scripts/fix-old-articles-branding.js.map +0 -1
  235. package/dist/scripts/generate-news-backport.d.ts +0 -16
  236. package/dist/scripts/generate-news-backport.d.ts.map +0 -1
  237. package/dist/scripts/generate-news-backport.js +0 -379
  238. package/dist/scripts/generate-news-backport.js.map +0 -1
  239. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts +0 -141
  240. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts.map +0 -1
  241. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js +0 -546
  242. package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js.map +0 -1
  243. package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts +0 -59
  244. package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts.map +0 -1
  245. package/dist/scripts/generate-news-enhanced/analysis-cache.js +0 -116
  246. package/dist/scripts/generate-news-enhanced/analysis-cache.js.map +0 -1
  247. package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts +0 -58
  248. package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts.map +0 -1
  249. package/dist/scripts/generate-news-enhanced/analysis-labels.js +0 -144
  250. package/dist/scripts/generate-news-enhanced/analysis-labels.js.map +0 -1
  251. package/dist/scripts/generate-news-enhanced/config.d.ts +0 -58
  252. package/dist/scripts/generate-news-enhanced/config.d.ts.map +0 -1
  253. package/dist/scripts/generate-news-enhanced/config.js +0 -286
  254. package/dist/scripts/generate-news-enhanced/config.js.map +0 -1
  255. package/dist/scripts/generate-news-enhanced/generators.d.ts +0 -119
  256. package/dist/scripts/generate-news-enhanced/generators.d.ts.map +0 -1
  257. package/dist/scripts/generate-news-enhanced/generators.js +0 -2131
  258. package/dist/scripts/generate-news-enhanced/generators.js.map +0 -1
  259. package/dist/scripts/generate-news-enhanced/helpers.d.ts +0 -122
  260. package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +0 -1
  261. package/dist/scripts/generate-news-enhanced/helpers.js +0 -468
  262. package/dist/scripts/generate-news-enhanced/helpers.js.map +0 -1
  263. package/dist/scripts/generate-news-enhanced/index.d.ts +0 -19
  264. package/dist/scripts/generate-news-enhanced/index.d.ts.map +0 -1
  265. package/dist/scripts/generate-news-enhanced/index.js +0 -221
  266. package/dist/scripts/generate-news-enhanced/index.js.map +0 -1
  267. package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +0 -46
  268. package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +0 -1
  269. package/dist/scripts/generate-news-enhanced/swot-analyzer.js +0 -1227
  270. package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +0 -1
  271. package/dist/scripts/generate-news-enhanced/types.d.ts +0 -34
  272. package/dist/scripts/generate-news-enhanced/types.d.ts.map +0 -1
  273. package/dist/scripts/generate-news-enhanced/types.js +0 -9
  274. package/dist/scripts/generate-news-enhanced/types.js.map +0 -1
  275. package/dist/scripts/generate-news-enhanced.d.ts +0 -25
  276. package/dist/scripts/generate-news-enhanced.d.ts.map +0 -1
  277. package/dist/scripts/generate-news-enhanced.js +0 -37
  278. package/dist/scripts/generate-news-enhanced.js.map +0 -1
  279. package/dist/scripts/generate-news-indexes/constants.d.ts +0 -20
  280. package/dist/scripts/generate-news-indexes/constants.d.ts.map +0 -1
  281. package/dist/scripts/generate-news-indexes/constants.js +0 -308
  282. package/dist/scripts/generate-news-indexes/constants.js.map +0 -1
  283. package/dist/scripts/generate-news-indexes/helpers.d.ts +0 -73
  284. package/dist/scripts/generate-news-indexes/helpers.d.ts.map +0 -1
  285. package/dist/scripts/generate-news-indexes/helpers.js +0 -352
  286. package/dist/scripts/generate-news-indexes/helpers.js.map +0 -1
  287. package/dist/scripts/generate-news-indexes/index.d.ts +0 -20
  288. package/dist/scripts/generate-news-indexes/index.d.ts.map +0 -1
  289. package/dist/scripts/generate-news-indexes/index.js +0 -75
  290. package/dist/scripts/generate-news-indexes/index.js.map +0 -1
  291. package/dist/scripts/generate-news-indexes/template.d.ts +0 -25
  292. package/dist/scripts/generate-news-indexes/template.d.ts.map +0 -1
  293. package/dist/scripts/generate-news-indexes/template.js +0 -644
  294. package/dist/scripts/generate-news-indexes/template.js.map +0 -1
  295. package/dist/scripts/generate-news-indexes/types.d.ts +0 -96
  296. package/dist/scripts/generate-news-indexes/types.d.ts.map +0 -1
  297. package/dist/scripts/generate-news-indexes/types.js +0 -9
  298. package/dist/scripts/generate-news-indexes/types.js.map +0 -1
  299. package/dist/scripts/generate-news-indexes.d.ts +0 -20
  300. package/dist/scripts/generate-news-indexes.d.ts.map +0 -1
  301. package/dist/scripts/generate-news-indexes.js +0 -19
  302. package/dist/scripts/generate-news-indexes.js.map +0 -1
  303. package/dist/scripts/generate-rss.d.ts +0 -48
  304. package/dist/scripts/generate-rss.d.ts.map +0 -1
  305. package/dist/scripts/generate-rss.js +0 -299
  306. package/dist/scripts/generate-rss.js.map +0 -1
  307. package/dist/scripts/generate-sitemap-html.d.ts +0 -79
  308. package/dist/scripts/generate-sitemap-html.d.ts.map +0 -1
  309. package/dist/scripts/generate-sitemap-html.js +0 -878
  310. package/dist/scripts/generate-sitemap-html.js.map +0 -1
  311. package/dist/scripts/generate-sitemap.d.ts +0 -23
  312. package/dist/scripts/generate-sitemap.d.ts.map +0 -1
  313. package/dist/scripts/generate-sitemap.js +0 -476
  314. package/dist/scripts/generate-sitemap.js.map +0 -1
  315. package/dist/scripts/generate-types-from-cia-schemas.d.ts +0 -176
  316. package/dist/scripts/generate-types-from-cia-schemas.d.ts.map +0 -1
  317. package/dist/scripts/generate-types-from-cia-schemas.js +0 -318
  318. package/dist/scripts/generate-types-from-cia-schemas.js.map +0 -1
  319. package/dist/scripts/government-role-validator.d.ts +0 -65
  320. package/dist/scripts/government-role-validator.d.ts.map +0 -1
  321. package/dist/scripts/government-role-validator.js +0 -217
  322. package/dist/scripts/government-role-validator.js.map +0 -1
  323. package/dist/scripts/html-utils.d.ts +0 -17
  324. package/dist/scripts/html-utils.d.ts.map +0 -1
  325. package/dist/scripts/html-utils.js +0 -29
  326. package/dist/scripts/html-utils.js.map +0 -1
  327. package/dist/scripts/load-cia-stats.d.ts +0 -89
  328. package/dist/scripts/load-cia-stats.d.ts.map +0 -1
  329. package/dist/scripts/load-cia-stats.js +0 -400
  330. package/dist/scripts/load-cia-stats.js.map +0 -1
  331. package/dist/scripts/mcp-client/client.d.ts +0 -73
  332. package/dist/scripts/mcp-client/client.d.ts.map +0 -1
  333. package/dist/scripts/mcp-client/client.js +0 -526
  334. package/dist/scripts/mcp-client/client.js.map +0 -1
  335. package/dist/scripts/mcp-client/document-types.d.ts +0 -23
  336. package/dist/scripts/mcp-client/document-types.d.ts.map +0 -1
  337. package/dist/scripts/mcp-client/document-types.js +0 -62
  338. package/dist/scripts/mcp-client/document-types.js.map +0 -1
  339. package/dist/scripts/mcp-client/index.d.ts +0 -34
  340. package/dist/scripts/mcp-client/index.d.ts.map +0 -1
  341. package/dist/scripts/mcp-client/index.js +0 -67
  342. package/dist/scripts/mcp-client/index.js.map +0 -1
  343. package/dist/scripts/mcp-client/transport.d.ts +0 -32
  344. package/dist/scripts/mcp-client/transport.d.ts.map +0 -1
  345. package/dist/scripts/mcp-client/transport.js +0 -102
  346. package/dist/scripts/mcp-client/transport.js.map +0 -1
  347. package/dist/scripts/mcp-client.d.ts +0 -18
  348. package/dist/scripts/mcp-client.d.ts.map +0 -1
  349. package/dist/scripts/mcp-client.js +0 -18
  350. package/dist/scripts/mcp-client.js.map +0 -1
  351. package/dist/scripts/mcp-query-cli.d.ts +0 -25
  352. package/dist/scripts/mcp-query-cli.d.ts.map +0 -1
  353. package/dist/scripts/mcp-query-cli.js +0 -66
  354. package/dist/scripts/mcp-query-cli.js.map +0 -1
  355. package/dist/scripts/news-types/breaking-news.d.ts +0 -178
  356. package/dist/scripts/news-types/breaking-news.d.ts.map +0 -1
  357. package/dist/scripts/news-types/breaking-news.js +0 -432
  358. package/dist/scripts/news-types/breaking-news.js.map +0 -1
  359. package/dist/scripts/news-types/committee-reports.d.ts +0 -212
  360. package/dist/scripts/news-types/committee-reports.d.ts.map +0 -1
  361. package/dist/scripts/news-types/committee-reports.js +0 -404
  362. package/dist/scripts/news-types/committee-reports.js.map +0 -1
  363. package/dist/scripts/news-types/month-ahead.d.ts +0 -71
  364. package/dist/scripts/news-types/month-ahead.d.ts.map +0 -1
  365. package/dist/scripts/news-types/month-ahead.js +0 -392
  366. package/dist/scripts/news-types/month-ahead.js.map +0 -1
  367. package/dist/scripts/news-types/monthly-review.d.ts +0 -61
  368. package/dist/scripts/news-types/monthly-review.d.ts.map +0 -1
  369. package/dist/scripts/news-types/monthly-review.js +0 -417
  370. package/dist/scripts/news-types/monthly-review.js.map +0 -1
  371. package/dist/scripts/news-types/motions.d.ts +0 -214
  372. package/dist/scripts/news-types/motions.d.ts.map +0 -1
  373. package/dist/scripts/news-types/motions.js +0 -447
  374. package/dist/scripts/news-types/motions.js.map +0 -1
  375. package/dist/scripts/news-types/propositions.d.ts +0 -204
  376. package/dist/scripts/news-types/propositions.d.ts.map +0 -1
  377. package/dist/scripts/news-types/propositions.js +0 -401
  378. package/dist/scripts/news-types/propositions.js.map +0 -1
  379. package/dist/scripts/news-types/week-ahead.d.ts +0 -231
  380. package/dist/scripts/news-types/week-ahead.d.ts.map +0 -1
  381. package/dist/scripts/news-types/week-ahead.js +0 -441
  382. package/dist/scripts/news-types/week-ahead.js.map +0 -1
  383. package/dist/scripts/news-types/weekly-review/analysis.d.ts +0 -47
  384. package/dist/scripts/news-types/weekly-review/analysis.d.ts.map +0 -1
  385. package/dist/scripts/news-types/weekly-review/analysis.js +0 -276
  386. package/dist/scripts/news-types/weekly-review/analysis.js.map +0 -1
  387. package/dist/scripts/news-types/weekly-review/data-loader.d.ts +0 -51
  388. package/dist/scripts/news-types/weekly-review/data-loader.d.ts.map +0 -1
  389. package/dist/scripts/news-types/weekly-review/data-loader.js +0 -298
  390. package/dist/scripts/news-types/weekly-review/data-loader.js.map +0 -1
  391. package/dist/scripts/news-types/weekly-review/generator.d.ts +0 -18
  392. package/dist/scripts/news-types/weekly-review/generator.d.ts.map +0 -1
  393. package/dist/scripts/news-types/weekly-review/generator.js +0 -284
  394. package/dist/scripts/news-types/weekly-review/generator.js.map +0 -1
  395. package/dist/scripts/news-types/weekly-review/index.d.ts +0 -20
  396. package/dist/scripts/news-types/weekly-review/index.d.ts.map +0 -1
  397. package/dist/scripts/news-types/weekly-review/index.js +0 -23
  398. package/dist/scripts/news-types/weekly-review/index.js.map +0 -1
  399. package/dist/scripts/news-types/weekly-review/types.d.ts +0 -72
  400. package/dist/scripts/news-types/weekly-review/types.d.ts.map +0 -1
  401. package/dist/scripts/news-types/weekly-review/types.js +0 -20
  402. package/dist/scripts/news-types/weekly-review/types.js.map +0 -1
  403. package/dist/scripts/news-types/weekly-review/validation.d.ts +0 -10
  404. package/dist/scripts/news-types/weekly-review/validation.d.ts.map +0 -1
  405. package/dist/scripts/news-types/weekly-review/validation.js +0 -95
  406. package/dist/scripts/news-types/weekly-review/validation.js.map +0 -1
  407. package/dist/scripts/news-types/weekly-review.d.ts +0 -15
  408. package/dist/scripts/news-types/weekly-review.d.ts.map +0 -1
  409. package/dist/scripts/news-types/weekly-review.js +0 -14
  410. package/dist/scripts/news-types/weekly-review.js.map +0 -1
  411. package/dist/scripts/party-variants.d.ts +0 -23
  412. package/dist/scripts/party-variants.d.ts.map +0 -1
  413. package/dist/scripts/party-variants.js +0 -50
  414. package/dist/scripts/party-variants.js.map +0 -1
  415. package/dist/scripts/pipeline/index.d.ts +0 -19
  416. package/dist/scripts/pipeline/index.d.ts.map +0 -1
  417. package/dist/scripts/pipeline/index.js +0 -17
  418. package/dist/scripts/pipeline/index.js.map +0 -1
  419. package/dist/scripts/pipeline/orchestrator.d.ts +0 -56
  420. package/dist/scripts/pipeline/orchestrator.d.ts.map +0 -1
  421. package/dist/scripts/pipeline/orchestrator.js +0 -147
  422. package/dist/scripts/pipeline/orchestrator.js.map +0 -1
  423. package/dist/scripts/pipeline/types.d.ts +0 -117
  424. package/dist/scripts/pipeline/types.d.ts.map +0 -1
  425. package/dist/scripts/pipeline/types.js +0 -13
  426. package/dist/scripts/pipeline/types.js.map +0 -1
  427. package/dist/scripts/pipeline/validation.d.ts +0 -66
  428. package/dist/scripts/pipeline/validation.d.ts.map +0 -1
  429. package/dist/scripts/pipeline/validation.js +0 -129
  430. package/dist/scripts/pipeline/validation.js.map +0 -1
  431. package/dist/scripts/populate-analysis-data.d.ts +0 -41
  432. package/dist/scripts/populate-analysis-data.d.ts.map +0 -1
  433. package/dist/scripts/populate-analysis-data.js +0 -255
  434. package/dist/scripts/populate-analysis-data.js.map +0 -1
  435. package/dist/scripts/pre-article-analysis/data-downloader.d.ts +0 -80
  436. package/dist/scripts/pre-article-analysis/data-downloader.d.ts.map +0 -1
  437. package/dist/scripts/pre-article-analysis/data-downloader.js +0 -230
  438. package/dist/scripts/pre-article-analysis/data-downloader.js.map +0 -1
  439. package/dist/scripts/pre-article-analysis/data-persistence.d.ts +0 -141
  440. package/dist/scripts/pre-article-analysis/data-persistence.d.ts.map +0 -1
  441. package/dist/scripts/pre-article-analysis/data-persistence.js +0 -345
  442. package/dist/scripts/pre-article-analysis/data-persistence.js.map +0 -1
  443. package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +0 -158
  444. package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +0 -1
  445. package/dist/scripts/pre-article-analysis/markdown-serializer.js +0 -648
  446. package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +0 -1
  447. package/dist/scripts/pre-article-analysis/pdf-converter.d.ts +0 -58
  448. package/dist/scripts/pre-article-analysis/pdf-converter.d.ts.map +0 -1
  449. package/dist/scripts/pre-article-analysis/pdf-converter.js +0 -142
  450. package/dist/scripts/pre-article-analysis/pdf-converter.js.map +0 -1
  451. package/dist/scripts/pre-article-analysis.d.ts +0 -42
  452. package/dist/scripts/pre-article-analysis.d.ts.map +0 -1
  453. package/dist/scripts/pre-article-analysis.js +0 -642
  454. package/dist/scripts/pre-article-analysis.js.map +0 -1
  455. package/dist/scripts/scb-client.d.ts +0 -104
  456. package/dist/scripts/scb-client.d.ts.map +0 -1
  457. package/dist/scripts/scb-client.js +0 -286
  458. package/dist/scripts/scb-client.js.map +0 -1
  459. package/dist/scripts/scb-context.d.ts +0 -88
  460. package/dist/scripts/scb-context.d.ts.map +0 -1
  461. package/dist/scripts/scb-context.js +0 -307
  462. package/dist/scripts/scb-context.js.map +0 -1
  463. package/dist/scripts/shared/version.d.ts +0 -9
  464. package/dist/scripts/shared/version.d.ts.map +0 -1
  465. package/dist/scripts/shared/version.js +0 -28
  466. package/dist/scripts/shared/version.js.map +0 -1
  467. package/dist/scripts/statistical-claims-detector.d.ts +0 -119
  468. package/dist/scripts/statistical-claims-detector.d.ts.map +0 -1
  469. package/dist/scripts/statistical-claims-detector.js +0 -391
  470. package/dist/scripts/statistical-claims-detector.js.map +0 -1
  471. package/dist/scripts/sync-cia-schemas.d.ts +0 -52
  472. package/dist/scripts/sync-cia-schemas.d.ts.map +0 -1
  473. package/dist/scripts/sync-cia-schemas.js +0 -195
  474. package/dist/scripts/sync-cia-schemas.js.map +0 -1
  475. package/dist/scripts/translation-dictionary.d.ts +0 -45
  476. package/dist/scripts/translation-dictionary.d.ts.map +0 -1
  477. package/dist/scripts/translation-dictionary.js +0 -3642
  478. package/dist/scripts/translation-dictionary.js.map +0 -1
  479. package/dist/scripts/types/article.d.ts +0 -392
  480. package/dist/scripts/types/article.d.ts.map +0 -1
  481. package/dist/scripts/types/article.js +0 -6
  482. package/dist/scripts/types/article.js.map +0 -1
  483. package/dist/scripts/types/content.d.ts +0 -167
  484. package/dist/scripts/types/content.d.ts.map +0 -1
  485. package/dist/scripts/types/content.js +0 -6
  486. package/dist/scripts/types/content.js.map +0 -1
  487. package/dist/scripts/types/editorial.d.ts +0 -17
  488. package/dist/scripts/types/editorial.d.ts.map +0 -1
  489. package/dist/scripts/types/editorial.js +0 -6
  490. package/dist/scripts/types/editorial.js.map +0 -1
  491. package/dist/scripts/types/language.d.ts +0 -7
  492. package/dist/scripts/types/language.d.ts.map +0 -1
  493. package/dist/scripts/types/language.js +0 -6
  494. package/dist/scripts/types/language.js.map +0 -1
  495. package/dist/scripts/types/mcp.d.ts +0 -117
  496. package/dist/scripts/types/mcp.d.ts.map +0 -1
  497. package/dist/scripts/types/mcp.js +0 -6
  498. package/dist/scripts/types/mcp.js.map +0 -1
  499. package/dist/scripts/types/party.d.ts +0 -9
  500. package/dist/scripts/types/party.d.ts.map +0 -1
  501. package/dist/scripts/types/party.js +0 -6
  502. package/dist/scripts/types/party.js.map +0 -1
  503. package/dist/scripts/types/validation.d.ts +0 -136
  504. package/dist/scripts/types/validation.d.ts.map +0 -1
  505. package/dist/scripts/types/validation.js +0 -6
  506. package/dist/scripts/types/validation.js.map +0 -1
  507. package/dist/scripts/types/workflow.d.ts +0 -78
  508. package/dist/scripts/types/workflow.d.ts.map +0 -1
  509. package/dist/scripts/types/workflow.js +0 -6
  510. package/dist/scripts/types/workflow.js.map +0 -1
  511. package/dist/scripts/update-stats-from-cia.d.ts +0 -44
  512. package/dist/scripts/update-stats-from-cia.d.ts.map +0 -1
  513. package/dist/scripts/update-stats-from-cia.js +0 -310
  514. package/dist/scripts/update-stats-from-cia.js.map +0 -1
  515. package/dist/scripts/validate-against-cia-schemas.d.ts +0 -126
  516. package/dist/scripts/validate-against-cia-schemas.d.ts.map +0 -1
  517. package/dist/scripts/validate-against-cia-schemas.js +0 -299
  518. package/dist/scripts/validate-against-cia-schemas.js.map +0 -1
  519. package/dist/scripts/validate-cross-references.d.ts +0 -49
  520. package/dist/scripts/validate-cross-references.d.ts.map +0 -1
  521. package/dist/scripts/validate-cross-references.js +0 -183
  522. package/dist/scripts/validate-cross-references.js.map +0 -1
  523. package/dist/scripts/validate-file-ownership.d.ts +0 -68
  524. package/dist/scripts/validate-file-ownership.d.ts.map +0 -1
  525. package/dist/scripts/validate-file-ownership.js +0 -135
  526. package/dist/scripts/validate-file-ownership.js.map +0 -1
  527. package/dist/scripts/validate-news-translations.d.ts +0 -27
  528. package/dist/scripts/validate-news-translations.d.ts.map +0 -1
  529. package/dist/scripts/validate-news-translations.js +0 -258
  530. package/dist/scripts/validate-news-translations.js.map +0 -1
  531. package/dist/scripts/validate-translations.d.ts +0 -162
  532. package/dist/scripts/validate-translations.d.ts.map +0 -1
  533. package/dist/scripts/validate-translations.js +0 -378
  534. package/dist/scripts/validate-translations.js.map +0 -1
  535. package/dist/scripts/workflow-state-coordinator.d.ts +0 -354
  536. package/dist/scripts/workflow-state-coordinator.d.ts.map +0 -1
  537. package/dist/scripts/workflow-state-coordinator.js +0 -876
  538. package/dist/scripts/workflow-state-coordinator.js.map +0 -1
  539. package/dist/scripts/world-bank-client.d.ts +0 -122
  540. package/dist/scripts/world-bank-client.d.ts.map +0 -1
  541. package/dist/scripts/world-bank-client.js +0 -192
  542. package/dist/scripts/world-bank-client.js.map +0 -1
  543. package/dist/scripts/world-bank-context.d.ts +0 -88
  544. package/dist/scripts/world-bank-context.d.ts.map +0 -1
  545. package/dist/scripts/world-bank-context.js +0 -331
  546. package/dist/scripts/world-bank-context.js.map +0 -1
@@ -1,107 +0,0 @@
1
- /**
2
- * Extract News Article Metadata to JSON Database
3
- *
4
- * Parses all news article HTML files and extracts Schema.org JSON-LD
5
- * metadata into a single data/news-articles.json file.
6
- *
7
- * Usage: node --experimental-strip-types scripts/extract-news-metadata.ts
8
- *
9
- * @module scripts/extract-news-metadata
10
- */
11
- import { readFileSync, writeFileSync, readdirSync, mkdirSync } from 'fs';
12
- import { join, dirname, relative, sep } from 'path';
13
- import { fileURLToPath } from 'url';
14
- const __filename = fileURLToPath(import.meta.url);
15
- const __dirname = dirname(__filename);
16
- const ROOT = join(__dirname, '..');
17
- function collectNewsFiles(dir) {
18
- const result = [];
19
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
20
- if (entry.isDirectory()) {
21
- result.push(...collectNewsFiles(join(dir, entry.name)));
22
- }
23
- else if (entry.name.endsWith('.html') && !entry.name.startsWith('index')) {
24
- result.push(join(dir, entry.name));
25
- }
26
- }
27
- return result;
28
- }
29
- function extractMetadata() {
30
- const newsDir = join(ROOT, 'news');
31
- const allFilePaths = collectNewsFiles(newsDir);
32
- const files = allFilePaths.map((fp) => relative(newsDir, fp).split(sep).join('/'));
33
- const articles = [];
34
- for (const file of files) {
35
- const content = readFileSync(join(newsDir, file), 'utf-8');
36
- // Extract JSON-LD blocks
37
- const jsonLdRegex = /<script type="application\/ld\+json">([\s\S]*?)<\/script>/g;
38
- let match;
39
- let articleData = null;
40
- while ((match = jsonLdRegex.exec(content)) !== null) {
41
- try {
42
- const parsed = JSON.parse(match[1]);
43
- if (parsed['@type'] === 'NewsArticle') {
44
- articleData = parsed;
45
- break;
46
- }
47
- }
48
- catch {
49
- // Skip malformed JSON-LD
50
- }
51
- }
52
- if (!articleData) {
53
- console.warn(`WARN: No NewsArticle JSON-LD in ${file}`);
54
- continue;
55
- }
56
- // Extract Open Graph image
57
- const ogImageMatch = content.match(/property="og:image" content="([^"]+)"/);
58
- const ogImage = ogImageMatch?.[1] ?? '';
59
- // Extract language from filename
60
- const langMatch = file.match(/-([a-z]{2})\.html$/);
61
- const lang = langMatch?.[1] ?? 'en';
62
- // Extract slug (filename without language suffix)
63
- const slug = file.replace(/-[a-z]{2}\.html$/, '');
64
- articles.push({
65
- slug,
66
- file,
67
- lang,
68
- headline: articleData.headline ?? '',
69
- description: articleData.description ?? '',
70
- datePublished: articleData.datePublished ?? '',
71
- dateModified: articleData.dateModified ?? '',
72
- articleSection: articleData.articleSection ?? '',
73
- wordCount: articleData.wordCount || (() => {
74
- const stripped = content.replace(/<[^>]+>/g, ' ');
75
- return stripped.split(/\s+/).filter((w) => w.length > 0).length;
76
- })(),
77
- inLanguage: articleData.inLanguage ?? lang,
78
- keywords: articleData.keywords ?? '',
79
- image: ogImage,
80
- url: articleData.mainEntityOfPage?.['@id'] ?? '',
81
- });
82
- }
83
- // Sort by date descending, then by language
84
- articles.sort((a, b) => {
85
- const dateCompare = b.datePublished.localeCompare(a.datePublished);
86
- if (dateCompare !== 0)
87
- return dateCompare;
88
- return a.lang.localeCompare(b.lang);
89
- });
90
- const db = {
91
- version: '1.0.0',
92
- generatedAt: new Date().toISOString(),
93
- totalArticles: articles.length,
94
- uniqueSlugs: [...new Set(articles.map((a) => a.slug))].length,
95
- languages: [...new Set(articles.map((a) => a.lang))].sort(),
96
- articles,
97
- };
98
- mkdirSync(join(ROOT, 'data'), { recursive: true });
99
- writeFileSync(join(ROOT, 'data', 'news-articles.json'), JSON.stringify(db, null, 2));
100
- console.log('Generated data/news-articles.json:');
101
- console.log(' Total articles:', db.totalArticles);
102
- console.log(' Unique slugs:', db.uniqueSlugs);
103
- console.log(' Languages:', db.languages.join(', '));
104
- console.log(' File size:', (JSON.stringify(db).length / 1024).toFixed(1), 'KB');
105
- }
106
- extractMetadata();
107
- //# sourceMappingURL=extract-news-metadata.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-news-metadata.js","sourceRoot":"","sources":["../../scripts/extract-news-metadata.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * @module Intelligence/Terminology
3
- * @category Intelligence Operations / Supporting Infrastructure
4
- * @name Vocabulary Extraction - Political Terminology Pattern Analysis
5
- *
6
- * @description
7
- * Advanced terminology extraction system analyzing translated news articles across
8
- * all 14 supported languages to identify and catalog political terminology patterns.
9
- *
10
- * @author Hack23 AB (Linguistic Intelligence Team)
11
- * @license Apache-2.0
12
- * @version 2.5.0
13
- */
14
- export {};
15
- //# sourceMappingURL=extract-vocabulary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-vocabulary.d.ts","sourceRoot":"","sources":["../../scripts/extract-vocabulary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,255 +0,0 @@
1
- /**
2
- * @module Intelligence/Terminology
3
- * @category Intelligence Operations / Supporting Infrastructure
4
- * @name Vocabulary Extraction - Political Terminology Pattern Analysis
5
- *
6
- * @description
7
- * Advanced terminology extraction system analyzing translated news articles across
8
- * all 14 supported languages to identify and catalog political terminology patterns.
9
- *
10
- * @author Hack23 AB (Linguistic Intelligence Team)
11
- * @license Apache-2.0
12
- * @version 2.5.0
13
- */
14
- import { readFileSync, readdirSync } from 'fs';
15
- import { basename, join } from 'path';
16
- // ---------------------------------------------------------------------------
17
- // Types
18
- // ---------------------------------------------------------------------------
19
- /** Map of language codes to language names */
20
- const LANGUAGES = {
21
- en: 'English', sv: 'Swedish', da: 'Danish', no: 'Norwegian', fi: 'Finnish',
22
- de: 'German', fr: 'French', es: 'Spanish', nl: 'Dutch',
23
- ar: 'Arabic', he: 'Hebrew', ja: 'Japanese', ko: 'Korean', zh: 'Chinese',
24
- };
25
- // Track skipped files for warning summary
26
- const skippedFiles = [];
27
- // ---------------------------------------------------------------------------
28
- // Term extraction
29
- // ---------------------------------------------------------------------------
30
- /**
31
- * Extract political terms from HTML content using structure-based approach.
32
- */
33
- function extractTerms(content, _lang) {
34
- const terms = {};
35
- // Extract titles (main political terminology)
36
- const h3Pattern = /<h3>(.*?)<\/h3>/g;
37
- const h3Matches = [];
38
- let h3Match;
39
- while ((h3Match = h3Pattern.exec(content)) !== null) {
40
- const cleanText = h3Match[1].replace(/<[^>]+>/g, '').trim();
41
- if (cleanText)
42
- h3Matches.push(cleanText);
43
- }
44
- terms.titles = h3Matches.slice(0, 10);
45
- // Extract "What to Watch" heading (any language) - structure-based
46
- const h2Pattern = /<h2[^>]*>([^<]+)<\/h2>/g;
47
- const h2Matches = [];
48
- let h2Match;
49
- while ((h2Match = h2Pattern.exec(content)) !== null) {
50
- const text = h2Match[1].trim();
51
- if (text.length > 5 && text.length < 100) {
52
- h2Matches.push(text);
53
- }
54
- }
55
- if (h2Matches.length > 0) {
56
- terms.watchLabel = h2Matches[0];
57
- }
58
- // Extract structured labels from <strong>…:</strong> (language-agnostic)
59
- const strongLabelPattern = /<strong>\s*([^:<]+?)\s*:\s*<\/strong>/g;
60
- const strongLabels = [];
61
- let strongMatch;
62
- while ((strongMatch = strongLabelPattern.exec(content)) !== null) {
63
- const label = strongMatch[1].trim();
64
- if (label.length > 0 && label.length < 50) {
65
- strongLabels.push(label);
66
- }
67
- }
68
- if (strongLabels[0])
69
- terms.committeeLabel = strongLabels[0];
70
- if (strongLabels[1])
71
- terms.documentLabel = strongLabels[1];
72
- // Extract article type from title
73
- const titleMatch = content.match(/<h1>([^<]+)<\/h1>/);
74
- if (titleMatch)
75
- terms.mainTitle = titleMatch[1].trim();
76
- return terms;
77
- }
78
- // ---------------------------------------------------------------------------
79
- // Article analysis
80
- // ---------------------------------------------------------------------------
81
- /**
82
- * Analyze all news articles.
83
- */
84
- function analyzeArticles(directory = 'news', datePrefix = null) {
85
- const results = {};
86
- for (const lang of Object.keys(LANGUAGES)) {
87
- results[lang] = {
88
- language: LANGUAGES[lang],
89
- code: lang,
90
- samples: [],
91
- };
92
- }
93
- try {
94
- const files = readdirSync(directory).filter((f) => {
95
- if (!f.endsWith('.html'))
96
- return false;
97
- if (datePrefix && !f.includes(datePrefix))
98
- return false;
99
- return true;
100
- });
101
- console.log(`\nScanning ${files.length} HTML files in ${directory}/`);
102
- if (datePrefix) {
103
- console.log(`Filtering by date prefix: "${datePrefix}"\n`);
104
- }
105
- for (const file of files) {
106
- const match = file.match(/-([a-z]{2})\.html$/);
107
- if (!match) {
108
- skippedFiles.push({ file, reason: 'No language code in filename' });
109
- continue;
110
- }
111
- const lang = match[1];
112
- if (!results[lang]) {
113
- skippedFiles.push({ file, reason: `Unknown language code: ${lang}` });
114
- continue;
115
- }
116
- try {
117
- const content = readFileSync(join(directory, file), 'utf-8');
118
- const terms = extractTerms(content, lang);
119
- // Determine article type
120
- let articleType = 'general';
121
- if (file.includes('committee'))
122
- articleType = 'committee-reports';
123
- else if (file.includes('proposition'))
124
- articleType = 'propositions';
125
- else if (file.includes('motion'))
126
- articleType = 'motions';
127
- else if (file.includes('evening'))
128
- articleType = 'evening-analysis';
129
- else if (file.includes('week-ahead'))
130
- articleType = 'week-ahead';
131
- results[lang].samples.push({
132
- file: basename(file),
133
- type: articleType,
134
- terms,
135
- });
136
- }
137
- catch (error) {
138
- skippedFiles.push({ file, reason: `Read error: ${error.message}` });
139
- }
140
- }
141
- }
142
- catch (error) {
143
- console.error(`Error reading directory: ${error.message}`);
144
- process.exit(1);
145
- }
146
- return results;
147
- }
148
- // ---------------------------------------------------------------------------
149
- // Report
150
- // ---------------------------------------------------------------------------
151
- /**
152
- * Generate vocabulary report.
153
- */
154
- function generateReport(results) {
155
- console.log('\n========================================');
156
- console.log('Political Vocabulary Analysis Report');
157
- console.log('========================================\n');
158
- for (const [code, data] of Object.entries(results)) {
159
- if (data.samples.length === 0)
160
- continue;
161
- console.log(`\n## ${data.language} (${code.toUpperCase()})`);
162
- console.log(`Samples analyzed: ${data.samples.length}`);
163
- // Collect unique labels
164
- const watchLabels = new Set();
165
- const committeeLabels = new Set();
166
- const documentLabels = new Set();
167
- const _mainTitles = new Set();
168
- for (const sample of data.samples) {
169
- if (sample.terms.watchLabel)
170
- watchLabels.add(sample.terms.watchLabel);
171
- if (sample.terms.committeeLabel)
172
- committeeLabels.add(sample.terms.committeeLabel);
173
- if (sample.terms.documentLabel)
174
- documentLabels.add(sample.terms.documentLabel);
175
- if (sample.terms.mainTitle)
176
- _mainTitles.add(sample.terms.mainTitle);
177
- }
178
- if (watchLabels.size > 0)
179
- console.log(` "What to Watch": ${Array.from(watchLabels).join(', ')}`);
180
- if (committeeLabels.size > 0)
181
- console.log(` "Committee": ${Array.from(committeeLabels).join(', ')}`);
182
- if (documentLabels.size > 0)
183
- console.log(` "Document": ${Array.from(documentLabels).join(', ')}`);
184
- // Show sample titles from any articles (prioritize committee reports)
185
- const committeeReports = data.samples.filter((s) => s.type === 'committee-reports');
186
- const sampleWithTitles = committeeReports.find((s) => s.terms.titles && s.terms.titles.length > 0) ||
187
- data.samples.find((s) => s.terms.titles && s.terms.titles.length > 0);
188
- if (sampleWithTitles && sampleWithTitles.terms.titles && sampleWithTitles.terms.titles.length > 0) {
189
- console.log(` Sample titles: ${sampleWithTitles.terms.titles.slice(0, 3).join(', ')}`);
190
- }
191
- }
192
- // Warning summary
193
- if (skippedFiles.length > 0) {
194
- console.log('\n\n⚠️ WARNING: Skipped Files Summary');
195
- console.log('=====================================');
196
- console.log(`Total skipped: ${skippedFiles.length}\n`);
197
- // Group by reason
198
- const byReason = {};
199
- for (const { file, reason } of skippedFiles) {
200
- if (!byReason[reason])
201
- byReason[reason] = [];
202
- byReason[reason].push(file);
203
- }
204
- for (const [reason, files] of Object.entries(byReason)) {
205
- console.log(`${reason}: ${files.length} file(s)`);
206
- if (files.length <= 5) {
207
- files.forEach((f) => console.log(` - ${f}`));
208
- }
209
- else {
210
- files.slice(0, 3).forEach((f) => console.log(` - ${f}`));
211
- console.log(` ... and ${files.length - 3} more`);
212
- }
213
- console.log();
214
- }
215
- }
216
- console.log('\n========================================');
217
- console.log('Analysis complete!');
218
- console.log('========================================\n');
219
- }
220
- // ---------------------------------------------------------------------------
221
- // CLI
222
- // ---------------------------------------------------------------------------
223
- const args = process.argv.slice(2);
224
- let datePrefix = null;
225
- let directory = 'news';
226
- for (let i = 0; i < args.length; i++) {
227
- if (args[i] === '--date-prefix' && args[i + 1]) {
228
- datePrefix = args[i + 1];
229
- i++;
230
- }
231
- else if (args[i] === '--directory' && args[i + 1]) {
232
- directory = args[i + 1];
233
- i++;
234
- }
235
- else if (args[i] === '--help' || args[i] === '-h') {
236
- console.log(`
237
- Usage: node scripts/extract-vocabulary.js [options]
238
-
239
- Options:
240
- --date-prefix <prefix> Filter files by date prefix (e.g., "2026-02-")
241
- --directory <path> Directory to scan (default: "news")
242
- --help, -h Show this help message
243
-
244
- Examples:
245
- node scripts/extract-vocabulary.js
246
- node scripts/extract-vocabulary.js --date-prefix 2026-02-
247
- node scripts/extract-vocabulary.js --directory news --date-prefix 2026-03-
248
- `);
249
- process.exit(0);
250
- }
251
- }
252
- // Run analysis
253
- const results = analyzeArticles(directory, datePrefix);
254
- generateReport(results);
255
- //# sourceMappingURL=extract-vocabulary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-vocabulary.js","sourceRoot":"","sources":["../../scripts/extract-vocabulary.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- #!/usr/bin/env -S npx tsx
2
- /**
3
- * Fix Article Navigation: Language Switcher + Back-to-News Top Nav
4
- *
5
- * This script ensures ALL news articles have:
6
- * 1. A language switcher nav (14 languages) after <body>
7
- * 2. An article-top-nav div with a localized back-to-news link before the article
8
- *
9
- * It auto-discovers all articles in the news/ directory and processes them
10
- * idempotently — safe to run multiple times.
11
- *
12
- * Usage:
13
- * npx tsx scripts/fix-article-navigation.ts
14
- * npx tsx scripts/fix-article-navigation.ts --dry-run
15
- *
16
- * @author Hack23 AB
17
- * @license Apache-2.0
18
- */
19
- import type { Language } from './types/language.js';
20
- export interface ProcessResult {
21
- addedSwitcher: boolean;
22
- addedTopnav: boolean;
23
- fixedTopnav: boolean;
24
- }
25
- /**
26
- * Transform article HTML string: ensures language-switcher and article-top-nav
27
- * with a back-to-news link are present. Idempotent — safe to call multiple times.
28
- *
29
- * @param content Original HTML string
30
- * @param baseSlug Article base slug without directory prefix (e.g. "2026-01-01-article")
31
- * @param lang Language code for this variant
32
- * @returns Updated HTML string and flags indicating what changed
33
- */
34
- export declare function transformContent(content: string, baseSlug: string, lang: Language): {
35
- content: string;
36
- } & ProcessResult;
37
- //# sourceMappingURL=fix-article-navigation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fix-article-navigation.d.ts","sourceRoot":"","sources":["../../scripts/fix-article-navigation.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AA8BpD,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CA6ErC"}
@@ -1,198 +0,0 @@
1
- #!/usr/bin/env -S npx tsx
2
- /**
3
- * Fix Article Navigation: Language Switcher + Back-to-News Top Nav
4
- *
5
- * This script ensures ALL news articles have:
6
- * 1. A language switcher nav (14 languages) after <body>
7
- * 2. An article-top-nav div with a localized back-to-news link before the article
8
- *
9
- * It auto-discovers all articles in the news/ directory and processes them
10
- * idempotently — safe to run multiple times.
11
- *
12
- * Usage:
13
- * npx tsx scripts/fix-article-navigation.ts
14
- * npx tsx scripts/fix-article-navigation.ts --dry-run
15
- *
16
- * @author Hack23 AB
17
- * @license Apache-2.0
18
- */
19
- import fs from 'fs';
20
- import path from 'path';
21
- import { fileURLToPath } from 'url';
22
- import { ALL_LANG_CODES, FOOTER_LABELS } from './article-template/constants.js';
23
- import { getNewsIndexFilename, generateArticleLanguageSwitcher } from './article-template/helpers.js';
24
- // ── Helpers ───────────────────────────────────────────────────────────────
25
- function extractLang(filename) {
26
- const name = filename.replace(/\.html$/, '');
27
- for (const lang of ALL_LANG_CODES) {
28
- if (name.endsWith(`-${lang}`))
29
- return lang;
30
- }
31
- return null;
32
- }
33
- function extractBase(filename) {
34
- const name = filename.replace(/\.html$/, '');
35
- for (const lang of ALL_LANG_CODES) {
36
- if (name.endsWith(`-${lang}`))
37
- return name.slice(0, -(lang.length + 1));
38
- }
39
- return null;
40
- }
41
- function generateTopNav(lang) {
42
- const label = FOOTER_LABELS[lang].backToNews;
43
- const index = getNewsIndexFilename(lang);
44
- return `\n<div class="article-top-nav">\n <a href="${index}" class="back-to-news">\n ← ${label}\n </a>\n</div>\n`;
45
- }
46
- /**
47
- * Transform article HTML string: ensures language-switcher and article-top-nav
48
- * with a back-to-news link are present. Idempotent — safe to call multiple times.
49
- *
50
- * @param content Original HTML string
51
- * @param baseSlug Article base slug without directory prefix (e.g. "2026-01-01-article")
52
- * @param lang Language code for this variant
53
- * @returns Updated HTML string and flags indicating what changed
54
- */
55
- export function transformContent(content, baseSlug, lang) {
56
- let result = content;
57
- let addedSwitcher = false;
58
- let addedTopnav = false;
59
- let fixedTopnav = false;
60
- // ── 1. Language switcher ──────────────────────────────────────────
61
- const hasSwitcher = result.includes('language-switcher');
62
- if (!hasSwitcher) {
63
- const switcherHtml = generateArticleLanguageSwitcher(baseSlug, lang);
64
- // Prefer inserting AFTER the skip-link so it remains the first focusable element.
65
- const skipLinkPattern = /(<a[^>]*class="skip-link"[^>]*>[\s\S]*?<\/a>)/;
66
- if (skipLinkPattern.test(result)) {
67
- result = result.replace(skipLinkPattern, `$1\n${switcherHtml}`);
68
- }
69
- else {
70
- result = result.replace(/(<body[^>]*>)/, `$1\n${switcherHtml}`);
71
- }
72
- addedSwitcher = true;
73
- }
74
- else {
75
- // Update existing switcher to have all 14 languages.
76
- // Use [^\S\n]* (spaces/tabs, not newlines) to consume any indentation before <nav>,
77
- // so the replacement string's own leading spaces don't accumulate on repeated runs.
78
- const newSwitcher = generateArticleLanguageSwitcher(baseSlug, lang);
79
- result = result.replace(/[^\S\n]*<nav class="language-switcher"[^>]*>[\s\S]*?<\/nav>/, newSwitcher);
80
- }
81
- // ── 2. article-top-nav ────────────────────────────────────────────
82
- const hasTopnav = result.includes('article-top-nav');
83
- // If top-nav exists but is missing back-to-news link, replace it
84
- if (hasTopnav) {
85
- const topNavHasBackLink = /<div class="article-top-nav">[\s\S]*?class="back-to-news"[\s\S]*?<\/div>/.test(result);
86
- if (!topNavHasBackLink) {
87
- result = result.replace(/<div class="article-top-nav">[\s\S]*?<\/div>/, generateTopNav(lang).trim());
88
- fixedTopnav = true;
89
- }
90
- }
91
- if (!hasTopnav) {
92
- const topNavHtml = generateTopNav(lang);
93
- let inserted = false;
94
- // Pattern A: insert after closing </nav> of language-switcher, before article/div.news-article
95
- // Note: the article/div tag may have attributes before class= (e.g. id="main-content")
96
- // and may carry additional classes (e.g. "news-article article-type-propositions")
97
- if (result.includes('</nav>')) {
98
- const navPattern = /((<\/nav>)([\s]*)(<(?:article|div)\b[^>]*?\bclass="(?:news-article(?:\s[^"]*)?|container)"))/s;
99
- const match = navPattern.exec(result);
100
- if (match) {
101
- const endOfNav = match.index + match[2].length;
102
- const whitespace = match[3];
103
- const articleTag = match[4];
104
- const afterFull = result.slice(match.index + match[0].length);
105
- result = result.slice(0, endOfNav) + topNavHtml + whitespace + articleTag + afterFull;
106
- inserted = true;
107
- }
108
- }
109
- // Pattern B: insert directly before <article/div with class="news-article ..." or "container">
110
- // Allows arbitrary attributes (e.g. id="main-content") before class=
111
- if (!inserted) {
112
- const articlePattern = /(<(?:article|div)\b[^>]*?\bclass="(?:news-article(?:\s[^"]*)?|container)")/;
113
- const match = articlePattern.exec(result);
114
- if (match) {
115
- result = result.slice(0, match.index) + topNavHtml + '\n' + result.slice(match.index);
116
- inserted = true;
117
- }
118
- }
119
- if (inserted)
120
- addedTopnav = true;
121
- }
122
- return { content: result, addedSwitcher, addedTopnav, fixedTopnav };
123
- }
124
- function processArticle(filepath, baseSlug, lang, dryRun) {
125
- const original = fs.readFileSync(filepath, 'utf-8');
126
- const { content, addedSwitcher, addedTopnav, fixedTopnav } = transformContent(original, baseSlug, lang);
127
- // ── Write if changed ──────────────────────────────────────────────
128
- if (content !== original && !dryRun) {
129
- fs.writeFileSync(filepath, content, 'utf-8');
130
- }
131
- return { addedSwitcher, addedTopnav, fixedTopnav };
132
- }
133
- function discoverArticles(newsDir) {
134
- const articles = {};
135
- const files = fs.readdirSync(newsDir).sort();
136
- for (const name of files) {
137
- if (!name.endsWith('.html') || name.startsWith('index'))
138
- continue;
139
- const lang = extractLang(name);
140
- const base = extractBase(name);
141
- if (lang && base) {
142
- if (!articles[base])
143
- articles[base] = {};
144
- articles[base][lang] = path.join(newsDir, name);
145
- }
146
- }
147
- return articles;
148
- }
149
- function main() {
150
- const dryRun = process.argv.includes('--dry-run');
151
- if (dryRun) {
152
- console.log('=== DRY RUN — no files will be modified ===\n');
153
- }
154
- const scriptDir = path.dirname(fileURLToPath(import.meta.url));
155
- const newsDir = path.resolve(scriptDir, '..', 'news');
156
- if (!fs.existsSync(newsDir)) {
157
- console.error(`ERROR: news directory not found at ${newsDir}`);
158
- process.exit(1);
159
- }
160
- console.log('=== Fix Article Navigation ===');
161
- console.log(`News directory: ${newsDir}\n`);
162
- const articles = discoverArticles(newsDir);
163
- const slugs = Object.keys(articles).sort();
164
- console.log(`Discovered ${slugs.length} unique article slugs\n`);
165
- let total = 0;
166
- let switchersAdded = 0;
167
- let topnavsAdded = 0;
168
- let topnavsFixed = 0;
169
- for (const baseSlug of slugs) {
170
- const langFiles = articles[baseSlug];
171
- for (const lang of ALL_LANG_CODES) {
172
- const filepath = langFiles[lang];
173
- if (!filepath)
174
- continue;
175
- total++;
176
- const { addedSwitcher, addedTopnav, fixedTopnav } = processArticle(filepath, baseSlug, lang, dryRun);
177
- if (addedSwitcher)
178
- switchersAdded++;
179
- if (addedTopnav)
180
- topnavsAdded++;
181
- if (fixedTopnav)
182
- topnavsFixed++;
183
- }
184
- }
185
- console.log('=== Summary ===');
186
- console.log(`Total files processed: ${total}`);
187
- console.log(`Language switchers added: ${switchersAdded}`);
188
- console.log(`Top nav (article-top-nav) added: ${topnavsAdded}`);
189
- console.log(`Top nav fixed (missing back-to-news link): ${topnavsFixed}`);
190
- if (dryRun) {
191
- console.log('\n(Dry run — no files were modified)');
192
- }
193
- console.log('\n✓ Done!');
194
- }
195
- if (import.meta.url === `file://${process.argv[1]}`) {
196
- main();
197
- }
198
- //# sourceMappingURL=fix-article-navigation.js.map