euparliamentmonitor 0.8.4

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 (276) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1005 -0
  3. package/SECURITY.md +151 -0
  4. package/package.json +131 -0
  5. package/scripts/constants/committee-indicator-map.d.ts +199 -0
  6. package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
  7. package/scripts/constants/committee-indicator-map.js +1224 -0
  8. package/scripts/constants/committee-indicator-map.js.map +1 -0
  9. package/scripts/constants/config.d.ts +38 -0
  10. package/scripts/constants/config.d.ts.map +1 -0
  11. package/scripts/constants/config.js +66 -0
  12. package/scripts/constants/config.js.map +1 -0
  13. package/scripts/constants/language-articles.d.ts +84 -0
  14. package/scripts/constants/language-articles.d.ts.map +1 -0
  15. package/scripts/constants/language-articles.js +6771 -0
  16. package/scripts/constants/language-articles.js.map +1 -0
  17. package/scripts/constants/language-core.d.ts +38 -0
  18. package/scripts/constants/language-core.d.ts.map +1 -0
  19. package/scripts/constants/language-core.js +90 -0
  20. package/scripts/constants/language-core.js.map +1 -0
  21. package/scripts/constants/language-ui.d.ts +82 -0
  22. package/scripts/constants/language-ui.d.ts.map +1 -0
  23. package/scripts/constants/language-ui.js +889 -0
  24. package/scripts/constants/language-ui.js.map +1 -0
  25. package/scripts/constants/languages.d.ts +14 -0
  26. package/scripts/constants/languages.d.ts.map +1 -0
  27. package/scripts/constants/languages.js +15 -0
  28. package/scripts/constants/languages.js.map +1 -0
  29. package/scripts/generators/analysis-builders.d.ts +266 -0
  30. package/scripts/generators/analysis-builders.d.ts.map +1 -0
  31. package/scripts/generators/analysis-builders.js +2903 -0
  32. package/scripts/generators/analysis-builders.js.map +1 -0
  33. package/scripts/generators/breaking-content.d.ts +45 -0
  34. package/scripts/generators/breaking-content.d.ts.map +1 -0
  35. package/scripts/generators/breaking-content.js +530 -0
  36. package/scripts/generators/breaking-content.js.map +1 -0
  37. package/scripts/generators/committee-helpers.d.ts +54 -0
  38. package/scripts/generators/committee-helpers.d.ts.map +1 -0
  39. package/scripts/generators/committee-helpers.js +154 -0
  40. package/scripts/generators/committee-helpers.js.map +1 -0
  41. package/scripts/generators/dashboard-content.d.ts +95 -0
  42. package/scripts/generators/dashboard-content.d.ts.map +1 -0
  43. package/scripts/generators/dashboard-content.js +630 -0
  44. package/scripts/generators/dashboard-content.js.map +1 -0
  45. package/scripts/generators/deep-analysis-content.d.ts +23 -0
  46. package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
  47. package/scripts/generators/deep-analysis-content.js +831 -0
  48. package/scripts/generators/deep-analysis-content.js.map +1 -0
  49. package/scripts/generators/mindmap-content.d.ts +55 -0
  50. package/scripts/generators/mindmap-content.d.ts.map +1 -0
  51. package/scripts/generators/mindmap-content.js +512 -0
  52. package/scripts/generators/mindmap-content.js.map +1 -0
  53. package/scripts/generators/motions-content.d.ts +50 -0
  54. package/scripts/generators/motions-content.d.ts.map +1 -0
  55. package/scripts/generators/motions-content.js +391 -0
  56. package/scripts/generators/motions-content.js.map +1 -0
  57. package/scripts/generators/news-enhanced.d.ts +14 -0
  58. package/scripts/generators/news-enhanced.d.ts.map +1 -0
  59. package/scripts/generators/news-enhanced.js +169 -0
  60. package/scripts/generators/news-enhanced.js.map +1 -0
  61. package/scripts/generators/news-indexes.d.ts +31 -0
  62. package/scripts/generators/news-indexes.d.ts.map +1 -0
  63. package/scripts/generators/news-indexes.js +410 -0
  64. package/scripts/generators/news-indexes.js.map +1 -0
  65. package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
  66. package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
  67. package/scripts/generators/pipeline/fetch-stage.js +1522 -0
  68. package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
  69. package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
  70. package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
  71. package/scripts/generators/pipeline/generate-stage.js +204 -0
  72. package/scripts/generators/pipeline/generate-stage.js.map +1 -0
  73. package/scripts/generators/pipeline/output-stage.d.ts +48 -0
  74. package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
  75. package/scripts/generators/pipeline/output-stage.js +145 -0
  76. package/scripts/generators/pipeline/output-stage.js.map +1 -0
  77. package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
  78. package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
  79. package/scripts/generators/pipeline/transform-stage.js +111 -0
  80. package/scripts/generators/pipeline/transform-stage.js.map +1 -0
  81. package/scripts/generators/propositions-content.d.ts +29 -0
  82. package/scripts/generators/propositions-content.d.ts.map +1 -0
  83. package/scripts/generators/propositions-content.js +90 -0
  84. package/scripts/generators/propositions-content.js.map +1 -0
  85. package/scripts/generators/sankey-content.d.ts +45 -0
  86. package/scripts/generators/sankey-content.d.ts.map +1 -0
  87. package/scripts/generators/sankey-content.js +227 -0
  88. package/scripts/generators/sankey-content.js.map +1 -0
  89. package/scripts/generators/sitemap.d.ts +66 -0
  90. package/scripts/generators/sitemap.d.ts.map +1 -0
  91. package/scripts/generators/sitemap.js +562 -0
  92. package/scripts/generators/sitemap.js.map +1 -0
  93. package/scripts/generators/strategies/article-strategy.d.ts +146 -0
  94. package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
  95. package/scripts/generators/strategies/article-strategy.js +4 -0
  96. package/scripts/generators/strategies/article-strategy.js.map +1 -0
  97. package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
  98. package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
  99. package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
  100. package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
  101. package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
  102. package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
  103. package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
  104. package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
  105. package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
  106. package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
  107. package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
  108. package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
  109. package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
  110. package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
  111. package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
  112. package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
  113. package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
  114. package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
  115. package/scripts/generators/strategies/motions-strategy.js +215 -0
  116. package/scripts/generators/strategies/motions-strategy.js.map +1 -0
  117. package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
  118. package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
  119. package/scripts/generators/strategies/propositions-strategy.js +257 -0
  120. package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
  121. package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
  122. package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
  123. package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
  124. package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
  125. package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
  126. package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
  127. package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
  128. package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
  129. package/scripts/generators/swot-content.d.ts +42 -0
  130. package/scripts/generators/swot-content.d.ts.map +1 -0
  131. package/scripts/generators/swot-content.js +366 -0
  132. package/scripts/generators/swot-content.js.map +1 -0
  133. package/scripts/generators/week-ahead-content.d.ts +103 -0
  134. package/scripts/generators/week-ahead-content.d.ts.map +1 -0
  135. package/scripts/generators/week-ahead-content.js +610 -0
  136. package/scripts/generators/week-ahead-content.js.map +1 -0
  137. package/scripts/index.d.ts +40 -0
  138. package/scripts/index.d.ts.map +1 -0
  139. package/scripts/index.js +53 -0
  140. package/scripts/index.js.map +1 -0
  141. package/scripts/mcp/ep-mcp-client.d.ts +471 -0
  142. package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
  143. package/scripts/mcp/ep-mcp-client.js +734 -0
  144. package/scripts/mcp/ep-mcp-client.js.map +1 -0
  145. package/scripts/mcp/mcp-connection.d.ts +264 -0
  146. package/scripts/mcp/mcp-connection.d.ts.map +1 -0
  147. package/scripts/mcp/mcp-connection.js +790 -0
  148. package/scripts/mcp/mcp-connection.js.map +1 -0
  149. package/scripts/mcp/mcp-health.d.ts +75 -0
  150. package/scripts/mcp/mcp-health.d.ts.map +1 -0
  151. package/scripts/mcp/mcp-health.js +78 -0
  152. package/scripts/mcp/mcp-health.js.map +1 -0
  153. package/scripts/mcp/mcp-retry.d.ts +94 -0
  154. package/scripts/mcp/mcp-retry.d.ts.map +1 -0
  155. package/scripts/mcp/mcp-retry.js +127 -0
  156. package/scripts/mcp/mcp-retry.js.map +1 -0
  157. package/scripts/mcp/wb-mcp-client.d.ts +38 -0
  158. package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
  159. package/scripts/mcp/wb-mcp-client.js +112 -0
  160. package/scripts/mcp/wb-mcp-client.js.map +1 -0
  161. package/scripts/templates/article-template.d.ts +9 -0
  162. package/scripts/templates/article-template.d.ts.map +1 -0
  163. package/scripts/templates/article-template.js +378 -0
  164. package/scripts/templates/article-template.js.map +1 -0
  165. package/scripts/templates/section-builders.d.ts +28 -0
  166. package/scripts/templates/section-builders.d.ts.map +1 -0
  167. package/scripts/templates/section-builders.js +142 -0
  168. package/scripts/templates/section-builders.js.map +1 -0
  169. package/scripts/types/analysis.d.ts +115 -0
  170. package/scripts/types/analysis.d.ts.map +1 -0
  171. package/scripts/types/analysis.js +4 -0
  172. package/scripts/types/analysis.js.map +1 -0
  173. package/scripts/types/common.d.ts +584 -0
  174. package/scripts/types/common.d.ts.map +1 -0
  175. package/scripts/types/common.js +96 -0
  176. package/scripts/types/common.js.map +1 -0
  177. package/scripts/types/generation.d.ts +104 -0
  178. package/scripts/types/generation.d.ts.map +1 -0
  179. package/scripts/types/generation.js +4 -0
  180. package/scripts/types/generation.js.map +1 -0
  181. package/scripts/types/index.d.ts +24 -0
  182. package/scripts/types/index.d.ts.map +1 -0
  183. package/scripts/types/index.js +16 -0
  184. package/scripts/types/index.js.map +1 -0
  185. package/scripts/types/intelligence.d.ts +129 -0
  186. package/scripts/types/intelligence.d.ts.map +1 -0
  187. package/scripts/types/intelligence.js +4 -0
  188. package/scripts/types/intelligence.js.map +1 -0
  189. package/scripts/types/mcp.d.ts +418 -0
  190. package/scripts/types/mcp.d.ts.map +1 -0
  191. package/scripts/types/mcp.js +4 -0
  192. package/scripts/types/mcp.js.map +1 -0
  193. package/scripts/types/parliament.d.ts +388 -0
  194. package/scripts/types/parliament.d.ts.map +1 -0
  195. package/scripts/types/parliament.js +4 -0
  196. package/scripts/types/parliament.js.map +1 -0
  197. package/scripts/types/quality.d.ts +114 -0
  198. package/scripts/types/quality.d.ts.map +1 -0
  199. package/scripts/types/quality.js +4 -0
  200. package/scripts/types/quality.js.map +1 -0
  201. package/scripts/types/stakeholder.d.ts +88 -0
  202. package/scripts/types/stakeholder.d.ts.map +1 -0
  203. package/scripts/types/stakeholder.js +16 -0
  204. package/scripts/types/stakeholder.js.map +1 -0
  205. package/scripts/types/visualization.d.ts +708 -0
  206. package/scripts/types/visualization.d.ts.map +1 -0
  207. package/scripts/types/visualization.js +4 -0
  208. package/scripts/types/visualization.js.map +1 -0
  209. package/scripts/types/world-bank.d.ts +85 -0
  210. package/scripts/types/world-bank.d.ts.map +1 -0
  211. package/scripts/types/world-bank.js +4 -0
  212. package/scripts/types/world-bank.js.map +1 -0
  213. package/scripts/utils/article-category.d.ts +18 -0
  214. package/scripts/utils/article-category.d.ts.map +1 -0
  215. package/scripts/utils/article-category.js +49 -0
  216. package/scripts/utils/article-category.js.map +1 -0
  217. package/scripts/utils/article-quality-scorer.d.ts +87 -0
  218. package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
  219. package/scripts/utils/article-quality-scorer.js +1048 -0
  220. package/scripts/utils/article-quality-scorer.js.map +1 -0
  221. package/scripts/utils/content-metadata.d.ts +34 -0
  222. package/scripts/utils/content-metadata.d.ts.map +1 -0
  223. package/scripts/utils/content-metadata.js +249 -0
  224. package/scripts/utils/content-metadata.js.map +1 -0
  225. package/scripts/utils/content-validator.d.ts +94 -0
  226. package/scripts/utils/content-validator.d.ts.map +1 -0
  227. package/scripts/utils/content-validator.js +489 -0
  228. package/scripts/utils/content-validator.js.map +1 -0
  229. package/scripts/utils/copy-test-reports.d.ts +9 -0
  230. package/scripts/utils/copy-test-reports.d.ts.map +1 -0
  231. package/scripts/utils/copy-test-reports.js +508 -0
  232. package/scripts/utils/copy-test-reports.js.map +1 -0
  233. package/scripts/utils/file-utils.d.ts +144 -0
  234. package/scripts/utils/file-utils.d.ts.map +1 -0
  235. package/scripts/utils/file-utils.js +374 -0
  236. package/scripts/utils/file-utils.js.map +1 -0
  237. package/scripts/utils/fix-articles.d.ts +27 -0
  238. package/scripts/utils/fix-articles.d.ts.map +1 -0
  239. package/scripts/utils/fix-articles.js +510 -0
  240. package/scripts/utils/fix-articles.js.map +1 -0
  241. package/scripts/utils/generate-docs-index.d.ts +8 -0
  242. package/scripts/utils/generate-docs-index.d.ts.map +1 -0
  243. package/scripts/utils/generate-docs-index.js +275 -0
  244. package/scripts/utils/generate-docs-index.js.map +1 -0
  245. package/scripts/utils/html-sanitize.d.ts +18 -0
  246. package/scripts/utils/html-sanitize.d.ts.map +1 -0
  247. package/scripts/utils/html-sanitize.js +57 -0
  248. package/scripts/utils/html-sanitize.js.map +1 -0
  249. package/scripts/utils/intelligence-analysis.d.ts +173 -0
  250. package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
  251. package/scripts/utils/intelligence-analysis.js +936 -0
  252. package/scripts/utils/intelligence-analysis.js.map +1 -0
  253. package/scripts/utils/intelligence-index.d.ts +126 -0
  254. package/scripts/utils/intelligence-index.d.ts.map +1 -0
  255. package/scripts/utils/intelligence-index.js +731 -0
  256. package/scripts/utils/intelligence-index.js.map +1 -0
  257. package/scripts/utils/metadata-utils.d.ts +14 -0
  258. package/scripts/utils/metadata-utils.d.ts.map +1 -0
  259. package/scripts/utils/metadata-utils.js +18 -0
  260. package/scripts/utils/metadata-utils.js.map +1 -0
  261. package/scripts/utils/news-metadata.d.ts +47 -0
  262. package/scripts/utils/news-metadata.d.ts.map +1 -0
  263. package/scripts/utils/news-metadata.js +259 -0
  264. package/scripts/utils/news-metadata.js.map +1 -0
  265. package/scripts/utils/validate-articles.d.ts +2 -0
  266. package/scripts/utils/validate-articles.d.ts.map +1 -0
  267. package/scripts/utils/validate-articles.js +284 -0
  268. package/scripts/utils/validate-articles.js.map +1 -0
  269. package/scripts/utils/validate-ep-api.d.ts +51 -0
  270. package/scripts/utils/validate-ep-api.d.ts.map +1 -0
  271. package/scripts/utils/validate-ep-api.js +160 -0
  272. package/scripts/utils/validate-ep-api.js.map +1 -0
  273. package/scripts/utils/world-bank-data.d.ts +84 -0
  274. package/scripts/utils/world-bank-data.d.ts.map +1 -0
  275. package/scripts/utils/world-bank-data.js +311 -0
  276. package/scripts/utils/world-bank-data.js.map +1 -0
@@ -0,0 +1,510 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * @module Utils/FixArticles
5
+ * @description FALLBACK TOOL — Retroactively adds missing language switcher, article-top-nav
6
+ * (back button), site-header, skip-link, reading-progress bar, and site-footer to existing
7
+ * news articles.
8
+ *
9
+ * The primary mechanism for including these elements is the article template
10
+ * (`generateArticleHTML` in `src/templates/article-template.ts`), which already produces
11
+ * all required structural elements. This script is a last-resort recovery tool for
12
+ * patching legacy articles generated before the template was complete.
13
+ *
14
+ * Usage: npx tsx src/utils/fix-articles.ts [--dry-run]
15
+ */
16
+ import fs from 'node:fs';
17
+ import path from 'node:path';
18
+ import { NEWS_DIR, ARTICLE_FILENAME_PATTERN, APP_VERSION } from '../constants/config.js';
19
+ import { ALL_LANGUAGES, LANGUAGE_FLAGS, LANGUAGE_NAMES, BACK_TO_NEWS_LABELS, ARTICLE_NAV_LABELS, SKIP_LINK_TEXTS, HEADER_SUBTITLE_LABELS, FOOTER_ABOUT_HEADING_LABELS, FOOTER_ABOUT_TEXT_LABELS, FOOTER_QUICK_LINKS_LABELS, FOOTER_BUILT_BY_LABELS, FOOTER_LANGUAGES_LABELS, getLocalizedString, } from '../constants/languages.js';
20
+ import { escapeHTML } from './file-utils.js';
21
+ /** CSS class selector for the NEW language switcher nav element (inside header) */
22
+ const LANG_SWITCHER_NEW_CLASS = 'class="site-header__langs"';
23
+ /** CSS class selector for the LEGACY language switcher nav element (standalone) */
24
+ const LANG_SWITCHER_LEGACY_CLASS = 'class="language-switcher"';
25
+ /** CSS class selector for the article top navigation element */
26
+ const ARTICLE_TOP_NAV_CLASS = 'class="article-top-nav"';
27
+ /** CSS class selector for the site header element */
28
+ const SITE_HEADER_CLASS = 'class="site-header"';
29
+ /** CSS class selector for the reading progress bar element */
30
+ const READING_PROGRESS_CLASS = 'class="reading-progress"';
31
+ /** CSS class selector for the site footer element */
32
+ const SITE_FOOTER_CLASS = 'class="site-footer"';
33
+ /**
34
+ * Build the language switcher nav HTML for an article.
35
+ *
36
+ * @param date - Article date (YYYY-MM-DD)
37
+ * @param slug - Article URL slug
38
+ * @param currentLang - Active language code
39
+ * @returns HTML string for the language switcher
40
+ */
41
+ function buildLangSwitcher(date, slug, currentLang) {
42
+ return ALL_LANGUAGES.map((code) => {
43
+ const flag = getLocalizedString(LANGUAGE_FLAGS, code);
44
+ const name = getLocalizedString(LANGUAGE_NAMES, code);
45
+ const active = code === currentLang ? ' active' : '';
46
+ const href = `${date}-${slug}-${code}.html`;
47
+ const safeTitle = escapeHTML(name);
48
+ return `<a href="${href}" class="lang-link${active}" hreflang="${code}" lang="${code}" title="${safeTitle}">${flag} ${code.toUpperCase()}</a>`;
49
+ }).join('\n ');
50
+ }
51
+ /**
52
+ * Build the article-top-nav HTML with a localized back button.
53
+ *
54
+ * @param indexHref - Link to the language-specific index page
55
+ * @param lang - Language code for localized labels
56
+ * @returns HTML string for the article top navigation
57
+ */
58
+ function buildArticleTopNav(indexHref, lang) {
59
+ const backLabel = getLocalizedString(BACK_TO_NEWS_LABELS, lang);
60
+ const articleNavLabel = escapeHTML(getLocalizedString(ARTICLE_NAV_LABELS, lang));
61
+ return `<nav class="article-top-nav" aria-label="${articleNavLabel}">
62
+ <a href="${indexHref}" class="back-to-news">${backLabel}</a>
63
+ </nav>`;
64
+ }
65
+ /**
66
+ * Build the language grid for the article footer.
67
+ *
68
+ * @param currentLang - Active language code
69
+ * @returns HTML string for the language grid
70
+ */
71
+ function buildFooterLanguageGrid(currentLang) {
72
+ return ALL_LANGUAGES.map((code) => {
73
+ const flag = getLocalizedString(LANGUAGE_FLAGS, code);
74
+ const safeName = escapeHTML(getLocalizedString(LANGUAGE_NAMES, code));
75
+ const href = code === 'en' ? '../index.html' : `../index-${code}.html`;
76
+ const active = code === currentLang ? ' class="active"' : '';
77
+ return `<a href="${href}"${active} hreflang="${code}">${flag} ${safeName}</a>`;
78
+ }).join('\n ');
79
+ }
80
+ /**
81
+ * Build the site footer HTML with localized section headings and text.
82
+ *
83
+ * @param lang - Language code for all localized footer content
84
+ * @returns HTML string for the site footer
85
+ */
86
+ function buildSiteFooter(lang) {
87
+ const year = new Date().getFullYear();
88
+ const aboutHeading = escapeHTML(getLocalizedString(FOOTER_ABOUT_HEADING_LABELS, lang));
89
+ const aboutText = escapeHTML(getLocalizedString(FOOTER_ABOUT_TEXT_LABELS, lang));
90
+ const quickLinksHeading = escapeHTML(getLocalizedString(FOOTER_QUICK_LINKS_LABELS, lang));
91
+ const builtByHeading = escapeHTML(getLocalizedString(FOOTER_BUILT_BY_LABELS, lang));
92
+ const languagesHeading = escapeHTML(getLocalizedString(FOOTER_LANGUAGES_LABELS, lang));
93
+ return `<footer class="site-footer" role="contentinfo">
94
+ <div class="footer-content">
95
+ <div class="footer-section">
96
+ <h3>${aboutHeading}</h3>
97
+ <p>${aboutText}</p>
98
+ </div>
99
+ <div class="footer-section">
100
+ <h3>${quickLinksHeading}</h3>
101
+ <ul>
102
+ <li><a href="../index.html">Home</a></li>
103
+ <li><a href="https://github.com/Hack23/euparliamentmonitor">GitHub Repository</a></li>
104
+ <li><a href="https://github.com/Hack23/euparliamentmonitor/blob/main/LICENSE">Apache-2.0 License</a></li>
105
+ <li><a href="https://www.europarl.europa.eu/">European Parliament</a></li>
106
+ </ul>
107
+ </div>
108
+ <div class="footer-section">
109
+ <h3>${builtByHeading}</h3>
110
+ <ul>
111
+ <li><a href="https://hack23.com">hack23.com</a></li>
112
+ <li><a href="https://www.linkedin.com/company/hack23">LinkedIn</a></li>
113
+ <li><a href="https://github.com/Hack23/ISMS-PUBLIC">Security &amp; Privacy Policy</a></li>
114
+ <li><a href="mailto:james@hack23.com">Contact</a></li>
115
+ </ul>
116
+ </div>
117
+ <div class="footer-section">
118
+ <h3>${languagesHeading}</h3>
119
+ <div class="language-grid">
120
+ ${buildFooterLanguageGrid(lang)}
121
+ </div>
122
+ </div>
123
+ </div>
124
+ <div class="footer-bottom">
125
+ <p>&copy; 2008-${year} <a href="https://hack23.com">Hack23 AB</a> (Org.nr 5595347807) | Gothenburg, Sweden</p>
126
+ </div>
127
+ </footer>`;
128
+ }
129
+ /**
130
+ * Inject full structural elements for articles with no site-header (Type A).
131
+ *
132
+ * @param html - Current article HTML
133
+ * @param ctx - Injection context
134
+ * @returns Updated HTML and change description, or null if not applicable
135
+ */
136
+ function injectTypeA(html, ctx) {
137
+ const bodyArticlePattern = /(<body>)\s*\n(\s*<article\s)/;
138
+ if (!bodyArticlePattern.test(html)) {
139
+ return null;
140
+ }
141
+ const injectedBlock = `$1
142
+ <div class="reading-progress" aria-hidden="true"></div>
143
+ <a href="#main" class="skip-link">${ctx.skipLinkText}</a>
144
+
145
+ <header class="site-header" role="banner">
146
+ <div class="site-header__inner">
147
+ <a href="${ctx.indexHref}" class="site-header__brand" aria-label="EU Parliament Monitor">
148
+ <picture class="site-header__logo-picture">
149
+ <source srcset="../images/favicon-96x96.webp" type="image/webp">
150
+ <img class="site-header__logo" src="../images/favicon-96x96.png" alt="" width="96" height="96" aria-hidden="true">
151
+ </picture>
152
+ <span>
153
+ <span class="site-header__title">EU Parliament Monitor</span>
154
+ <span class="site-header__subtitle">${escapeHTML(getLocalizedString(HEADER_SUBTITLE_LABELS, ctx.lang))}</span>
155
+ </span>
156
+ </a>
157
+ <nav class="site-header__langs" role="navigation" aria-label="Language selection">
158
+ ${buildLangSwitcher(ctx.date, ctx.slug, ctx.lang)}
159
+ </nav>
160
+ </div>
161
+ </header>
162
+
163
+ ${buildArticleTopNav(ctx.indexHref, ctx.lang)}
164
+
165
+ <main id="main" class="site-main">
166
+ $2`;
167
+ let result = html.replace(bodyArticlePattern, injectedBlock);
168
+ // Close </main> before </body>
169
+ result = result.replace(/(<\/article>)\s*\n(<\/body>)/, '$1\n </main>\n$2');
170
+ if (!result.includes('</main>')) {
171
+ result = result.replace('</body>', ' </main>\n</body>');
172
+ }
173
+ return {
174
+ html: result,
175
+ change: 'Added reading-progress, skip-link, site-header, language-switcher, article-top-nav, main wrapper',
176
+ };
177
+ }
178
+ /**
179
+ * Inject language switcher and top nav for articles with site-header but missing both (Type B).
180
+ *
181
+ * @param html - Current article HTML
182
+ * @param ctx - Injection context
183
+ * @returns Updated HTML and change description, or null if not applicable
184
+ */
185
+ function injectTypeB(html, ctx) {
186
+ // Try to inject lang switcher inside the header's .site-header__inner
187
+ const innerPattern = /(<\/a>\s*\n\s*<\/div>\s*\n\s*<\/header>)\s*\n(\s*<main\s)/;
188
+ if (!innerPattern.test(html)) {
189
+ // Fallback: inject after header close
190
+ const headerMainPattern = /(<\/header>)\s*\n(\s*<main\s)/;
191
+ if (!headerMainPattern.test(html)) {
192
+ return null;
193
+ }
194
+ const injectedBlock = `$1
195
+
196
+ <nav class="site-header__langs" role="navigation" aria-label="Language selection">
197
+ ${buildLangSwitcher(ctx.date, ctx.slug, ctx.lang)}
198
+ </nav>
199
+
200
+ ${buildArticleTopNav(ctx.indexHref, ctx.lang)}
201
+
202
+ $2`;
203
+ return {
204
+ html: html.replace(headerMainPattern, injectedBlock),
205
+ change: 'Added language switcher and article-top-nav after header',
206
+ };
207
+ }
208
+ const injectedBlock = ` <nav class="site-header__langs" role="navigation" aria-label="Language selection">
209
+ ${buildLangSwitcher(ctx.date, ctx.slug, ctx.lang)}
210
+ </nav>
211
+ </div>
212
+ </header>
213
+
214
+ ${buildArticleTopNav(ctx.indexHref, ctx.lang)}
215
+
216
+ $2`;
217
+ return {
218
+ html: html.replace(/(<\/a>\s*\n\s*)<\/div>\s*\n\s*<\/header>\s*\n(\s*<main\s)/, `$1${injectedBlock}`),
219
+ change: 'Added language switcher and article-top-nav',
220
+ };
221
+ }
222
+ /**
223
+ * Inject article-top-nav for articles that already have language-switcher (Type C).
224
+ *
225
+ * @param html - Current article HTML
226
+ * @param ctx - Injection context
227
+ * @returns Updated HTML and change description, or null if not applicable
228
+ */
229
+ function injectTypeC(html, ctx) {
230
+ if (html.includes(ARTICLE_TOP_NAV_CLASS)) {
231
+ return null;
232
+ }
233
+ // Pattern: closing header tag followed by main element
234
+ const headerMainPattern = /(<\/header>)\s*\n(\s*<main\s)/;
235
+ if (!headerMainPattern.test(html)) {
236
+ return null;
237
+ }
238
+ const injectedBlock = `$1
239
+
240
+ ${buildArticleTopNav(ctx.indexHref, ctx.lang)}
241
+
242
+ $2`;
243
+ return {
244
+ html: html.replace(headerMainPattern, injectedBlock),
245
+ change: 'Added article-top-nav',
246
+ };
247
+ }
248
+ /**
249
+ * Inject reading-progress bar if missing.
250
+ *
251
+ * @param html - Current article HTML
252
+ * @returns Updated HTML and change description, or null if already present
253
+ */
254
+ function injectReadingProgress(html) {
255
+ if (html.includes(READING_PROGRESS_CLASS)) {
256
+ return null;
257
+ }
258
+ const pattern = /(<body>)\s*\n(\s*<a href="#main")/;
259
+ if (!pattern.test(html)) {
260
+ return null;
261
+ }
262
+ return {
263
+ html: html.replace(pattern, '$1\n <div class="reading-progress" aria-hidden="true"></div>\n$2'),
264
+ change: 'Added reading-progress',
265
+ };
266
+ }
267
+ /**
268
+ * Inject site-footer if missing. Inserts before </body>.
269
+ *
270
+ * @param html - Current article HTML
271
+ * @param lang - Language code for the footer language grid
272
+ * @returns Updated HTML and change description, or null if already present
273
+ */
274
+ function injectSiteFooter(html, lang) {
275
+ if (html.includes(SITE_FOOTER_CLASS)) {
276
+ return null;
277
+ }
278
+ const pattern = /(\s*)<\/body>/;
279
+ if (!pattern.test(html)) {
280
+ return null;
281
+ }
282
+ return {
283
+ html: html.replace(pattern, `\n\n ${buildSiteFooter(lang)}\n</body>`),
284
+ change: 'Added site-footer',
285
+ };
286
+ }
287
+ /**
288
+ * Inject a `<meta name="generator">` tag if the article lacks one.
289
+ * Inserts the tag after `<meta name="author" content="EU Parliament Monitor">`.
290
+ *
291
+ * @param html - Current article HTML
292
+ * @returns Updated HTML and change description, or null if already present
293
+ */
294
+ function patchGeneratorMeta(html) {
295
+ if (html.includes('<meta name="generator"')) {
296
+ return null;
297
+ }
298
+ const authorMeta = '<meta name="author" content="EU Parliament Monitor">';
299
+ if (!html.includes(authorMeta)) {
300
+ return null;
301
+ }
302
+ return {
303
+ html: html.replace(authorMeta, `${authorMeta}\n <meta name="generator" content="EU Parliament Monitor v${escapeHTML(APP_VERSION)}">`),
304
+ change: 'Added generator meta tag',
305
+ };
306
+ }
307
+ /**
308
+ * Patch the header subtitle if it contains the English fallback.
309
+ * Safe to call regardless of whether the article was just created or existed before.
310
+ *
311
+ * @param html - Current article HTML
312
+ * @param lang - Language code for the localized subtitle
313
+ * @returns Updated HTML and change description, or null if no change needed
314
+ */
315
+ function patchHeaderSubtitle(html, lang) {
316
+ const englishSubtitle = '<span class="site-header__subtitle">European Parliament Intelligence</span>';
317
+ if (!html.includes(englishSubtitle)) {
318
+ return null;
319
+ }
320
+ const localizedSubtitle = escapeHTML(getLocalizedString(HEADER_SUBTITLE_LABELS, lang));
321
+ return {
322
+ html: html.replace(englishSubtitle, `<span class="site-header__subtitle">${localizedSubtitle}</span>`),
323
+ change: 'Localized header subtitle',
324
+ };
325
+ }
326
+ /** CSS selector fragment used to detect the full footer-content div */
327
+ const FOOTER_CONTENT_CLASS = 'class="footer-content"';
328
+ /** CSS selector fragment used to detect the legacy footer-bottom div */
329
+ const FOOTER_BOTTOM_CLASS = 'class="footer-bottom"';
330
+ /**
331
+ * Upgrade a minimal footer (footer-bottom only) to the full localized footer.
332
+ * Only applies when the footer has the legacy footer-bottom pattern but lacks footer-section content.
333
+ *
334
+ * @param html - Current article HTML
335
+ * @param lang - Language code for localized content
336
+ * @returns Updated HTML and change description, or null if not applicable
337
+ */
338
+ function upgradeMinimalFooter(html, lang) {
339
+ if (!html.includes(SITE_FOOTER_CLASS) ||
340
+ !html.includes(FOOTER_BOTTOM_CLASS) ||
341
+ html.includes(FOOTER_CONTENT_CLASS)) {
342
+ return null;
343
+ }
344
+ const footerPattern = /<footer class="site-footer"[^>]*>[\s\S]*?<\/footer>/;
345
+ if (!footerPattern.test(html)) {
346
+ return null;
347
+ }
348
+ return {
349
+ html: html.replace(footerPattern, buildSiteFooter(lang)),
350
+ change: 'Upgraded minimal footer to full localized footer',
351
+ };
352
+ }
353
+ /**
354
+ * Patch English footer section headings and body text to localized equivalents.
355
+ * Applied after footer-section elements are confirmed present.
356
+ *
357
+ * @param html - Current article HTML
358
+ * @param lang - Language code for localized content
359
+ * @returns Updated HTML and change description, or null if no change needed
360
+ */
361
+ function patchFooterSectionText(html, lang) {
362
+ const englishAboutHeading = '<h3>About EU Parliament Monitor</h3>';
363
+ const englishAboutText = 'European Parliament Intelligence Platform — monitoring political activity with systematic transparency. Powered by European Parliament open data.';
364
+ const englishQuickLinks = '<h3>Quick Links</h3>';
365
+ const englishBuiltBy = '<h3>Built by Hack23 AB</h3>';
366
+ const englishLanguages = '<h3>Languages</h3>';
367
+ const hasEnglishContent = html.includes(englishAboutHeading) ||
368
+ html.includes(englishAboutText) ||
369
+ html.includes(englishQuickLinks) ||
370
+ html.includes(englishBuiltBy) ||
371
+ html.includes(englishLanguages);
372
+ if (!hasEnglishContent) {
373
+ return null;
374
+ }
375
+ const aboutHeading = getLocalizedString(FOOTER_ABOUT_HEADING_LABELS, lang);
376
+ const aboutText = getLocalizedString(FOOTER_ABOUT_TEXT_LABELS, lang);
377
+ const quickLinksHeading = getLocalizedString(FOOTER_QUICK_LINKS_LABELS, lang);
378
+ const builtByHeading = getLocalizedString(FOOTER_BUILT_BY_LABELS, lang);
379
+ const languagesHeading = getLocalizedString(FOOTER_LANGUAGES_LABELS, lang);
380
+ let result = html;
381
+ if (result.includes(englishAboutHeading)) {
382
+ result = result.replace(englishAboutHeading, `<h3>${aboutHeading}</h3>`);
383
+ }
384
+ if (result.includes(englishAboutText)) {
385
+ result = result.replace(englishAboutText, aboutText);
386
+ }
387
+ if (result.includes(englishQuickLinks)) {
388
+ result = result.replace(englishQuickLinks, `<h3>${quickLinksHeading}</h3>`);
389
+ }
390
+ if (result.includes(englishBuiltBy)) {
391
+ result = result.replace(englishBuiltBy, `<h3>${builtByHeading}</h3>`);
392
+ }
393
+ if (result.includes(englishLanguages)) {
394
+ result = result.replace(englishLanguages, `<h3>${languagesHeading}</h3>`);
395
+ }
396
+ return { html: result, change: 'Localized footer section headings and text' };
397
+ }
398
+ /**
399
+ * Apply an injection result if present.
400
+ *
401
+ * @param current - Current HTML content
402
+ * @param injector - Function returning an injection result or null
403
+ * @param changes - Array to append change descriptions to
404
+ * @returns Updated HTML content
405
+ */
406
+ function applyInjection(current, injector, changes) {
407
+ const result = injector();
408
+ if (result) {
409
+ changes.push(result.change);
410
+ return result.html;
411
+ }
412
+ return current;
413
+ }
414
+ /**
415
+ * Fix a single article file by injecting missing structural elements.
416
+ *
417
+ * @param filepath - Absolute path to article HTML file
418
+ * @param dryRun - If true, only report what would change
419
+ * @returns Object with changed flag and description
420
+ */
421
+ export function fixArticle(filepath, dryRun = false) {
422
+ const filename = path.basename(filepath);
423
+ const match = filename.match(ARTICLE_FILENAME_PATTERN);
424
+ if (!match) {
425
+ return { changed: false, description: `Skipped (not matching pattern): ${filename}` };
426
+ }
427
+ const date = match[1];
428
+ const slug = match[2];
429
+ const lang = match[3];
430
+ const indexHref = lang === 'en' ? '../index.html' : `../index-${lang}.html`;
431
+ const skipLinkText = getLocalizedString(SKIP_LINK_TEXTS, lang);
432
+ const headerSubtitle = escapeHTML(getLocalizedString(HEADER_SUBTITLE_LABELS, lang));
433
+ const ctx = { date, slug, lang, indexHref, skipLinkText, headerSubtitle };
434
+ let html = fs.readFileSync(filepath, 'utf-8');
435
+ /** True when article already has the NEW header-integrated language nav */
436
+ const hasNewLangSwitcher = html.includes(LANG_SWITCHER_NEW_CLASS);
437
+ /** True when article has any language switcher (new or legacy) */
438
+ const hasAnyLangSwitcher = hasNewLangSwitcher || html.includes(LANG_SWITCHER_LEGACY_CLASS);
439
+ const changes = [];
440
+ const hasSiteHeader = html.includes(SITE_HEADER_CLASS);
441
+ const hasTopNav = html.includes(ARTICLE_TOP_NAV_CLASS);
442
+ // Type A: Missing everything
443
+ if (!hasSiteHeader && !hasAnyLangSwitcher && !hasTopNav) {
444
+ html = applyInjection(html, () => injectTypeA(html, ctx), changes);
445
+ }
446
+ // Type B: Has site-header but no NEW language-switcher or top-nav
447
+ else if (hasSiteHeader && !hasNewLangSwitcher && !hasTopNav) {
448
+ html = applyInjection(html, () => injectTypeB(html, ctx), changes);
449
+ }
450
+ // Type C: Has NEW language-switcher but no article-top-nav
451
+ else if (hasNewLangSwitcher && !hasTopNav) {
452
+ html = applyInjection(html, () => injectTypeC(html, ctx), changes);
453
+ }
454
+ // Add reading-progress if missing (for types B and C)
455
+ if (html.includes(SITE_HEADER_CLASS)) {
456
+ html = applyInjection(html, () => injectReadingProgress(html), changes);
457
+ }
458
+ // Add site-footer if missing
459
+ html = applyInjection(html, () => injectSiteFooter(html, lang), changes);
460
+ // Upgrade minimal footer (footer-bottom only) to full localized footer
461
+ html = applyInjection(html, () => upgradeMinimalFooter(html, lang), changes);
462
+ // Inject generator meta tag if missing
463
+ html = applyInjection(html, () => patchGeneratorMeta(html), changes);
464
+ // Patch English header subtitle to localized version
465
+ html = applyInjection(html, () => patchHeaderSubtitle(html, lang), changes);
466
+ // Patch English footer section headings and text to localized versions
467
+ html = applyInjection(html, () => patchFooterSectionText(html, lang), changes);
468
+ if (changes.length === 0) {
469
+ return { changed: false, description: `Already complete: ${filename}` };
470
+ }
471
+ if (!dryRun) {
472
+ fs.writeFileSync(filepath, html, 'utf-8');
473
+ }
474
+ return { changed: true, description: `Fixed ${filename}: ${changes.join(', ')}` };
475
+ }
476
+ /**
477
+ * Fix all articles in the news directory.
478
+ *
479
+ * @param dryRun - If true, only report what would change
480
+ * @returns Summary of changes
481
+ */
482
+ export function fixAllArticles(dryRun = false) {
483
+ const files = fs.readdirSync(NEWS_DIR).filter((f) => f.endsWith('.html'));
484
+ const results = [];
485
+ for (const file of files) {
486
+ const filepath = path.join(NEWS_DIR, file);
487
+ const result = fixArticle(filepath, dryRun);
488
+ results.push(result);
489
+ }
490
+ const fixed = results.filter((r) => r.changed).length;
491
+ const skipped = results.filter((r) => !r.changed).length;
492
+ return { total: files.length, fixed, skipped, results };
493
+ }
494
+ // CLI entry point
495
+ if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(import.meta.filename ?? '')) {
496
+ const dryRun = process.argv.includes('--dry-run');
497
+ console.log(`šŸ”§ Fix Articles ${dryRun ? '(DRY RUN)' : ''}`);
498
+ console.log(`šŸ“ Scanning: ${NEWS_DIR}\n`);
499
+ const summary = fixAllArticles(dryRun);
500
+ for (const result of summary.results) {
501
+ if (result.changed) {
502
+ console.log(` āœ… ${result.description}`);
503
+ }
504
+ }
505
+ console.log(`\nšŸ“Š Summary: ${summary.fixed} fixed, ${summary.skipped} skipped, ${summary.total} total`);
506
+ if (dryRun) {
507
+ console.log('\nāš ļø Dry run — no files were modified. Remove --dry-run to apply changes.');
508
+ }
509
+ }
510
+ //# sourceMappingURL=fix-articles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-articles.js","sourceRoot":"","sources":["../../src/utils/fix-articles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generate the documentation index HTML
4
+ *
5
+ * @returns HTML content for the documentation index
6
+ */
7
+ export declare function generateIndexHTML(): string;
8
+ //# sourceMappingURL=generate-docs-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-docs-index.d.ts","sourceRoot":"","sources":["../../src/utils/generate-docs-index.ts"],"names":[],"mappings":";AAkBA;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA0O1C"}