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,366 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * @module Generators/SwotContent
5
+ * @description Pure functions for building SWOT analysis HTML sections.
6
+ * Generates accessible, CSS-only SWOT matrix visualizations that can be
7
+ * embedded in any article type. Designed for agentic workflows to extend
8
+ * articles with strategic analysis using data from MCP servers or other sources.
9
+ *
10
+ * The SWOT framework covers:
11
+ * - **Strengths**: Internal positive factors
12
+ * - **Weaknesses**: Internal negative factors
13
+ * - **Opportunities**: External positive factors
14
+ * - **Threats**: External negative factors
15
+ *
16
+ * Multi-dimensional extension adds:
17
+ * - **Political, Economic, Social, Legal, Geopolitical** dimension drill-downs
18
+ * - **Stakeholder perspectives** (Citizens, Industry, NGOs, MEPs, Governments, Media)
19
+ * - **Temporal analysis** (short-term, medium-term, long-term)
20
+ * - **Cross-references** linking items to EP documents/votes
21
+ */
22
+ import { escapeHTML, isSafeURL } from '../utils/file-utils.js';
23
+ import { getLocalizedString, SWOT_STRINGS, MULTI_DIMENSIONAL_SWOT_STRINGS, } from '../constants/languages.js';
24
+ // ─── Sub-section builders ────────────────────────────────────────────────────
25
+ /**
26
+ * Build a single SWOT item HTML.
27
+ *
28
+ * @param item - SWOT item with text and optional severity
29
+ * @returns HTML list item string
30
+ */
31
+ function buildSwotItem(item) {
32
+ const severityClass = item.severity ? ` swot-severity-${escapeHTML(item.severity)}` : '';
33
+ const severityBadge = item.severity
34
+ ? ` <span class="swot-severity-badge" role="img" aria-label="${escapeHTML(item.severity)}"></span>`
35
+ : '';
36
+ return `<li class="swot-item${severityClass}">${escapeHTML(item.text)}${severityBadge}</li>`;
37
+ }
38
+ /**
39
+ * Build a single SWOT quadrant HTML.
40
+ *
41
+ * @param quadrantKey - Quadrant identifier (strengths/weaknesses/opportunities/threats)
42
+ * @param items - Items in this quadrant
43
+ * @param label - Localized quadrant heading
44
+ * @param description - Accessible description
45
+ * @returns HTML string for one quadrant
46
+ */
47
+ function buildSwotQuadrant(quadrantKey, items, label, description) {
48
+ const itemsHtml = items.length > 0
49
+ ? items.map((item) => buildSwotItem(item)).join('\n ')
50
+ : '<li class="swot-item swot-empty">—</li>';
51
+ return `<div class="swot-quadrant swot-${escapeHTML(quadrantKey)}" role="region" aria-label="${escapeHTML(label)}">
52
+ <h4 class="swot-quadrant-heading">${escapeHTML(label)}</h4>
53
+ <p class="swot-quadrant-desc">${escapeHTML(description)}</p>
54
+ <ul class="swot-list">
55
+ ${itemsHtml}
56
+ </ul>
57
+ </div>`;
58
+ }
59
+ // ─── Main builder ────────────────────────────────────────────────────────────
60
+ /**
61
+ * Build a complete SWOT analysis section HTML.
62
+ *
63
+ * Generates an accessible CSS Grid-based SWOT matrix that can be embedded
64
+ * in any article type. The visualization is pure HTML/CSS with no JavaScript
65
+ * required, ensuring compatibility with strict CSP policies.
66
+ *
67
+ * Returns an empty string if the analysis is null/undefined or contains
68
+ * no items in any quadrant.
69
+ *
70
+ * @param analysis - SWOT analysis data (null/undefined returns empty string)
71
+ * @param lang - BCP 47 language code for localized headings (defaults to "en")
72
+ * @param heading - Optional custom section heading override
73
+ * @returns HTML section string or empty string
74
+ */
75
+ export function buildSwotSection(analysis, lang = 'en', heading) {
76
+ if (!analysis)
77
+ return '';
78
+ const totalItems = analysis.strengths.length +
79
+ analysis.weaknesses.length +
80
+ analysis.opportunities.length +
81
+ analysis.threats.length;
82
+ if (totalItems === 0)
83
+ return '';
84
+ const strings = getLocalizedString(SWOT_STRINGS, lang);
85
+ const sectionHeading = heading ?? analysis.title ?? strings.sectionHeading;
86
+ const strengthsHtml = buildSwotQuadrant('strengths', analysis.strengths, strings.strengthsLabel, strings.strengthsDesc);
87
+ const weaknessesHtml = buildSwotQuadrant('weaknesses', analysis.weaknesses, strings.weaknessesLabel, strings.weaknessesDesc);
88
+ const opportunitiesHtml = buildSwotQuadrant('opportunities', analysis.opportunities, strings.opportunitiesLabel, strings.opportunitiesDesc);
89
+ const threatsHtml = buildSwotQuadrant('threats', analysis.threats, strings.threatsLabel, strings.threatsDesc);
90
+ return `
91
+ <section class="swot-analysis" role="region" aria-label="${escapeHTML(sectionHeading)}">
92
+ <h2>${escapeHTML(sectionHeading)}</h2>
93
+ <div class="swot-matrix">
94
+ <div class="swot-axis-labels">
95
+ <span class="swot-axis-internal">${escapeHTML(strings.internalLabel)}</span>
96
+ <span class="swot-axis-external">${escapeHTML(strings.externalLabel)}</span>
97
+ </div>
98
+ <div class="swot-grid">
99
+ <div class="swot-row swot-row-positive">
100
+ ${strengthsHtml}
101
+ ${opportunitiesHtml}
102
+ </div>
103
+ <div class="swot-row swot-row-negative">
104
+ ${weaknessesHtml}
105
+ ${threatsHtml}
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </section>`;
110
+ }
111
+ // ─── Multi-dimensional SWOT helpers ─────────────────────────────────────────
112
+ /**
113
+ * Build a compact SWOT matrix grid (without outer section wrapper).
114
+ * Used for embedding inside dimension or temporal detail sections.
115
+ *
116
+ * @param analysis - SWOT analysis data
117
+ * @param strings - Localized SWOT strings
118
+ * @returns HTML string for a compact quadrant grid
119
+ */
120
+ function buildSwotMiniGrid(analysis, strings) {
121
+ const sHtml = buildSwotQuadrant('strengths', analysis.strengths, strings.strengthsLabel, strings.strengthsDesc);
122
+ const wHtml = buildSwotQuadrant('weaknesses', analysis.weaknesses, strings.weaknessesLabel, strings.weaknessesDesc);
123
+ const oHtml = buildSwotQuadrant('opportunities', analysis.opportunities, strings.opportunitiesLabel, strings.opportunitiesDesc);
124
+ const tHtml = buildSwotQuadrant('threats', analysis.threats, strings.threatsLabel, strings.threatsDesc);
125
+ return `<div class="swot-grid swot-mini-grid">
126
+ <div class="swot-row swot-row-positive">${sHtml}${oHtml}</div>
127
+ <div class="swot-row swot-row-negative">${wHtml}${tHtml}</div>
128
+ </div>`;
129
+ }
130
+ /**
131
+ * Map a dimension name to its localized label.
132
+ *
133
+ * @param name - Dimension identifier
134
+ * @param mdStrings - Localized multi-dimensional SWOT strings
135
+ * @returns Localized dimension label
136
+ */
137
+ function getDimensionLabel(name, mdStrings) {
138
+ const map = {
139
+ political: mdStrings.dimensionPolitical,
140
+ economic: mdStrings.dimensionEconomic,
141
+ social: mdStrings.dimensionSocial,
142
+ legal: mdStrings.dimensionLegal,
143
+ geopolitical: mdStrings.dimensionGeopolitical,
144
+ };
145
+ return map[name];
146
+ }
147
+ /**
148
+ * Build the expandable dimension drill-down sections.
149
+ * Each dimension is rendered as an accessible `<details>` disclosure widget.
150
+ *
151
+ * @param dimensions - Array of dimension data
152
+ * @param swotStrings - Localized SWOT strings for quadrant labels
153
+ * @param mdStrings - Localized multi-dimensional SWOT strings
154
+ * @returns HTML string for all dimension sections
155
+ */
156
+ function buildDimensionsDrillDown(dimensions, swotStrings, mdStrings) {
157
+ if (dimensions.length === 0)
158
+ return '';
159
+ const sectionsHtml = dimensions
160
+ .map((dim) => {
161
+ const label = getDimensionLabel(dim.name, mdStrings);
162
+ const miniGrid = buildSwotMiniGrid(dim, swotStrings);
163
+ return `<details class="swot-dimension swot-dimension-${escapeHTML(dim.name)}">
164
+ <summary class="swot-dimension-summary">${escapeHTML(label)}</summary>
165
+ <div class="swot-dimension-content">${miniGrid}</div>
166
+ </details>`;
167
+ })
168
+ .join('\n ');
169
+ return `<div class="swot-dimensions" role="region" aria-label="${escapeHTML(mdStrings.dimensionsLabel)}">
170
+ <h3 class="swot-section-subheading">${escapeHTML(mdStrings.dimensionsLabel)}</h3>
171
+ ${sectionsHtml}
172
+ </div>`;
173
+ }
174
+ /**
175
+ * Map a stakeholder type to its localized label.
176
+ *
177
+ * @param type - Stakeholder type identifier
178
+ * @param mdStrings - Localized multi-dimensional SWOT strings
179
+ * @returns Localized stakeholder label
180
+ */
181
+ function getStakeholderLabel(type, mdStrings) {
182
+ const map = {
183
+ citizen: mdStrings.stakeholderCitizen,
184
+ industry: mdStrings.stakeholderIndustry,
185
+ ngo: mdStrings.stakeholderNgo,
186
+ mep: mdStrings.stakeholderMep,
187
+ government: mdStrings.stakeholderGovernment,
188
+ media: mdStrings.stakeholderMedia,
189
+ };
190
+ return map[type];
191
+ }
192
+ /**
193
+ * Build the stakeholder perspectives section.
194
+ * Each stakeholder view is a collapsible `<details>` widget.
195
+ *
196
+ * @param stakeholderViews - Map of stakeholder type to SWOT analysis
197
+ * @param swotStrings - Localized SWOT strings for quadrant labels
198
+ * @param mdStrings - Localized multi-dimensional SWOT strings
199
+ * @returns HTML string for the stakeholder section, or empty string if none
200
+ */
201
+ function buildStakeholderSection(stakeholderViews, swotStrings, mdStrings) {
202
+ if (!stakeholderViews)
203
+ return '';
204
+ const entries = Object.entries(stakeholderViews);
205
+ const validEntries = entries.filter(([, view]) => {
206
+ const total = view.strengths.length +
207
+ view.weaknesses.length +
208
+ view.opportunities.length +
209
+ view.threats.length;
210
+ return total > 0;
211
+ });
212
+ if (validEntries.length === 0)
213
+ return '';
214
+ const viewsHtml = validEntries
215
+ .map(([type, view]) => {
216
+ const label = getStakeholderLabel(type, mdStrings);
217
+ const miniGrid = buildSwotMiniGrid(view, swotStrings);
218
+ return `<details class="swot-stakeholder swot-stakeholder-${escapeHTML(type)}">
219
+ <summary class="swot-stakeholder-summary">${escapeHTML(label)}</summary>
220
+ <div class="swot-stakeholder-content">${miniGrid}</div>
221
+ </details>`;
222
+ })
223
+ .join('\n ');
224
+ return `<div class="swot-stakeholders" role="region" aria-label="${escapeHTML(mdStrings.stakeholderPerspectivesLabel)}">
225
+ <h3 class="swot-section-subheading">${escapeHTML(mdStrings.stakeholderPerspectivesLabel)}</h3>
226
+ ${viewsHtml}
227
+ </div>`;
228
+ }
229
+ /**
230
+ * Build the temporal analysis section.
231
+ * Short-term and medium-term (and optionally long-term) periods are
232
+ * each rendered as a collapsible `<details>` widget.
233
+ *
234
+ * @param temporal - Temporal SWOT assessment data
235
+ * @param swotStrings - Localized SWOT strings for quadrant labels
236
+ * @param mdStrings - Localized multi-dimensional SWOT strings
237
+ * @returns HTML string for the temporal section, or empty string if not provided
238
+ */
239
+ function buildTemporalSection(temporal, swotStrings, mdStrings) {
240
+ if (!temporal)
241
+ return '';
242
+ const renderPeriod = (analysis, label) => {
243
+ if (!analysis)
244
+ return '';
245
+ const total = analysis.strengths.length +
246
+ analysis.weaknesses.length +
247
+ analysis.opportunities.length +
248
+ analysis.threats.length;
249
+ if (total === 0)
250
+ return '';
251
+ const miniGrid = buildSwotMiniGrid(analysis, swotStrings);
252
+ return `<details class="swot-temporal-period">
253
+ <summary class="swot-temporal-summary">${escapeHTML(label)}</summary>
254
+ <div class="swot-temporal-content">${miniGrid}</div>
255
+ </details>`;
256
+ };
257
+ const shortHtml = renderPeriod(temporal.shortTerm, mdStrings.shortTermLabel);
258
+ const mediumHtml = renderPeriod(temporal.mediumTerm, mdStrings.mediumTermLabel);
259
+ const longHtml = renderPeriod(temporal.longTerm, mdStrings.longTermLabel);
260
+ const combinedHtml = shortHtml + mediumHtml + longHtml;
261
+ if (!combinedHtml)
262
+ return '';
263
+ return `<div class="swot-temporal" role="region" aria-label="${escapeHTML(mdStrings.temporalAnalysisLabel)}">
264
+ <h3 class="swot-section-subheading">${escapeHTML(mdStrings.temporalAnalysisLabel)}</h3>
265
+ ${combinedHtml}
266
+ </div>`;
267
+ }
268
+ /**
269
+ * Build the cross-references section linking SWOT items to EP documents.
270
+ *
271
+ * @param crossReferences - Array of cross-reference data
272
+ * @param mdStrings - Localized multi-dimensional SWOT strings
273
+ * @returns HTML string for the cross-references section, or empty string if empty
274
+ */
275
+ function buildCrossReferencesSection(crossReferences, mdStrings) {
276
+ if (!crossReferences || crossReferences.length === 0)
277
+ return '';
278
+ const refsHtml = crossReferences
279
+ .map((ref) => {
280
+ const urlPart = ref.url && isSafeURL(ref.url)
281
+ ? `<a href="${escapeHTML(ref.url)}" class="swot-ref-link" rel="noopener noreferrer">${escapeHTML(ref.documentId)}</a>`
282
+ : `<span class="swot-ref-id">${escapeHTML(ref.documentId)}</span>`;
283
+ return `<li class="swot-ref-item">
284
+ <span class="swot-ref-evidence">${escapeHTML(mdStrings.evidenceLabel)}: ${escapeHTML(ref.itemText)}</span>
285
+ — ${urlPart}: <cite class="swot-ref-title">${escapeHTML(ref.documentTitle)}</cite>
286
+ </li>`;
287
+ })
288
+ .join('\n ');
289
+ return `<div class="swot-cross-references" role="region" aria-label="${escapeHTML(mdStrings.crossReferencesLabel)}">
290
+ <h3 class="swot-section-subheading">${escapeHTML(mdStrings.crossReferencesLabel)}</h3>
291
+ <ul class="swot-ref-list">${refsHtml}</ul>
292
+ </div>`;
293
+ }
294
+ /**
295
+ * Aggregate all dimension items into a single SwotAnalysis for the primary view.
296
+ *
297
+ * @param dimensions - Array of dimension data
298
+ * @returns Aggregated SwotAnalysis or null if all dimensions are empty
299
+ */
300
+ function aggregateDimensions(dimensions) {
301
+ const strengths = dimensions.flatMap((d) => d.strengths);
302
+ const weaknesses = dimensions.flatMap((d) => d.weaknesses);
303
+ const opportunities = dimensions.flatMap((d) => d.opportunities);
304
+ const threats = dimensions.flatMap((d) => d.threats);
305
+ const total = strengths.length + weaknesses.length + opportunities.length + threats.length;
306
+ if (total === 0)
307
+ return null;
308
+ return { strengths, weaknesses, opportunities, threats };
309
+ }
310
+ // ─── Multi-dimensional SWOT main builder ─────────────────────────────────────
311
+ /**
312
+ * Build a complete multi-dimensional SWOT analysis section HTML.
313
+ *
314
+ * Renders a primary aggregated 4-quadrant SWOT matrix followed by optional:
315
+ * - **Dimension drill-downs** (Political, Economic, Social, Legal, Geopolitical)
316
+ * as CSS-only `<details>` disclosure widgets
317
+ * - **Stakeholder perspectives** (Citizens, Industry, NGOs, MEPs, etc.)
318
+ * as collapsible `<details>` widgets
319
+ * - **Temporal analysis** (short-term, medium-term, long-term)
320
+ * as collapsible `<details>` widgets
321
+ * - **Cross-references** linking SWOT items to specific EP documents/votes
322
+ *
323
+ * All interactivity is CSS-only (no JavaScript), ensuring compatibility
324
+ * with strict CSP policies and WCAG 2.1 AA accessibility requirements.
325
+ *
326
+ * Returns an empty string if the analysis has no dimensions or all
327
+ * dimensions are empty.
328
+ *
329
+ * @param analysis - Multi-dimensional SWOT data (null/undefined returns empty string)
330
+ * @param lang - BCP 47 language code for localized headings (defaults to "en")
331
+ * @param heading - Optional custom section heading override
332
+ * @returns HTML section string or empty string
333
+ */
334
+ export function buildMultiDimensionalSwotSection(analysis, lang = 'en', heading) {
335
+ if (!analysis)
336
+ return '';
337
+ if (analysis.dimensions.length === 0)
338
+ return '';
339
+ const swotStrings = getLocalizedString(SWOT_STRINGS, lang);
340
+ const mdStrings = getLocalizedString(MULTI_DIMENSIONAL_SWOT_STRINGS, lang);
341
+ const sectionHeading = heading ?? analysis.title ?? swotStrings.sectionHeading;
342
+ const aggregated = aggregateDimensions(analysis.dimensions);
343
+ if (!aggregated)
344
+ return '';
345
+ const primaryMatrix = buildSwotMiniGrid(aggregated, swotStrings);
346
+ const dimensionsHtml = buildDimensionsDrillDown(analysis.dimensions, swotStrings, mdStrings);
347
+ const stakeholderHtml = buildStakeholderSection(analysis.stakeholderViews, swotStrings, mdStrings);
348
+ const temporalHtml = buildTemporalSection(analysis.temporal, swotStrings, mdStrings);
349
+ const refsHtml = buildCrossReferencesSection(analysis.crossReferences, mdStrings);
350
+ return `
351
+ <section class="swot-analysis swot-multidimensional" role="region" aria-label="${escapeHTML(sectionHeading)}">
352
+ <h2>${escapeHTML(sectionHeading)}</h2>
353
+ <div class="swot-matrix">
354
+ <div class="swot-axis-labels">
355
+ <span class="swot-axis-internal">${escapeHTML(swotStrings.internalLabel)}</span>
356
+ <span class="swot-axis-external">${escapeHTML(swotStrings.externalLabel)}</span>
357
+ </div>
358
+ ${primaryMatrix}
359
+ </div>
360
+ ${dimensionsHtml}
361
+ ${stakeholderHtml}
362
+ ${temporalHtml}
363
+ ${refsHtml}
364
+ </section>`;
365
+ }
366
+ //# sourceMappingURL=swot-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swot-content.js","sourceRoot":"","sources":["../../src/generators/swot-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { ParliamentEvent, CommitteeMeeting, LegislativeDocument, LegislativeProcedure, ParliamentaryQuestion, WeekAheadData, DateRange, MCPToolResult, LegislativeVelocity, StakeholderImpactSection, PoliticalTemperature } from '../types/index.js';
2
+ /** Placeholder events used when MCP is unavailable or returns no sessions */
3
+ export declare const PLACEHOLDER_EVENTS: ParliamentEvent[];
4
+ /**
5
+ * Parse plenary sessions from a settled MCP result
6
+ *
7
+ * @param settled - Promise.allSettled result
8
+ * @param fallbackDate - Fallback date when session has none
9
+ * @returns Array of parliament events
10
+ */
11
+ export declare function parsePlenarySessions(settled: PromiseSettledResult<MCPToolResult>, fallbackDate: string): ParliamentEvent[];
12
+ /**
13
+ * Parse EP events (hearings, conferences, seminars) from a settled MCP result
14
+ *
15
+ * @param settled - Promise.allSettled result
16
+ * @param fallbackDate - Fallback date when event has none
17
+ * @returns Array of parliament events
18
+ */
19
+ export declare function parseEPEvents(settled: PromiseSettledResult<MCPToolResult>, fallbackDate: string): ParliamentEvent[];
20
+ /**
21
+ * Parse committee meetings from a settled MCP result
22
+ *
23
+ * @param settled - Promise.allSettled result
24
+ * @param fallbackDate - Fallback date when meeting has no date
25
+ * @returns Array of committee meetings
26
+ */
27
+ export declare function parseCommitteeMeetings(settled: PromiseSettledResult<MCPToolResult>, fallbackDate?: string): CommitteeMeeting[];
28
+ /**
29
+ * Parse legislative documents from a settled MCP result
30
+ *
31
+ * @param settled - Promise.allSettled result
32
+ * @returns Array of legislative documents
33
+ */
34
+ export declare function parseLegislativeDocuments(settled: PromiseSettledResult<MCPToolResult>): LegislativeDocument[];
35
+ /**
36
+ * Parse legislative pipeline from a settled MCP result
37
+ *
38
+ * @param settled - Promise.allSettled result
39
+ * @returns Array of legislative procedures
40
+ */
41
+ export declare function parseLegislativePipeline(settled: PromiseSettledResult<MCPToolResult>): LegislativeProcedure[];
42
+ /**
43
+ * Parse parliamentary questions from a settled MCP result
44
+ *
45
+ * @param settled - Promise.allSettled result
46
+ * @returns Array of parliamentary questions
47
+ */
48
+ export declare function parseParliamentaryQuestions(settled: PromiseSettledResult<MCPToolResult>): ParliamentaryQuestion[];
49
+ /**
50
+ * Compute a composite political temperature score (0–100) indicating how
51
+ * contentious or urgent the upcoming parliamentary week is likely to be.
52
+ *
53
+ * The score is derived from the volume and diversity of scheduled events
54
+ * and questions — a pure scoring function with no side effects.
55
+ *
56
+ * @param events - Plenary / parliamentary events for the week
57
+ * @param questions - Parliamentary questions tabled for the week
58
+ * @returns Political temperature score and band
59
+ */
60
+ export declare function computeWeekPoliticalTemperature(events: readonly ParliamentEvent[], questions: readonly ParliamentaryQuestion[]): PoliticalTemperature;
61
+ /**
62
+ * Build a stakeholder impact matrix from scheduled events and legislative
63
+ * documents, assessing which groups are most affected by the agenda.
64
+ *
65
+ * Returns an empty section when no events or documents are available
66
+ * (graceful fallback). This function only constructs raw data; HTML
67
+ * escaping (for example via `escapeHTML()`) must be applied at render
68
+ * time by the caller (e.g. in `renderStakeholderSection()`).
69
+ *
70
+ * @param events - Parliament events for the upcoming week
71
+ * @param docs - Legislative documents expected in the period
72
+ * @param lang - Language code for localized labels (defaults to 'en')
73
+ * @returns Stakeholder impact section with rows
74
+ */
75
+ export declare function buildStakeholderImpactMatrix(events: readonly ParliamentEvent[], docs: readonly LegislativeDocument[], lang?: string): StakeholderImpactSection;
76
+ /**
77
+ * Build article content HTML from week-ahead data
78
+ *
79
+ * @param weekData - Aggregated week-ahead data
80
+ * @param dateRange - Date range for the article
81
+ * @param lang - Language code for editorial strings (default: 'en')
82
+ * @returns HTML content string
83
+ */
84
+ export declare function buildWeekAheadContent(weekData: WeekAheadData, dateRange: DateRange, lang?: string): string;
85
+ /**
86
+ * Build article keywords from week-ahead data
87
+ *
88
+ * @param weekData - Aggregated week-ahead data
89
+ * @returns Array of keyword strings
90
+ */
91
+ export declare function buildKeywords(weekData: WeekAheadData): string[];
92
+ /**
93
+ * Build predictive "What to Watch" analysis section showing legislative
94
+ * procedures and velocity data ordered by bottleneck risk.
95
+ * Returns an empty string when both input arrays are empty or yield no items.
96
+ *
97
+ * @param procedures - Legislative procedures to analyse
98
+ * @param velocities - Legislative velocity data (for example from a separate velocity analysis feed)
99
+ * @param language - BCP 47 language code used as the section lang attribute
100
+ * @returns HTML string for the "What to Watch" section
101
+ */
102
+ export declare function buildWhatToWatchSection(procedures: LegislativeProcedure[], velocities: LegislativeVelocity[], language: string): string;
103
+ //# sourceMappingURL=week-ahead-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"week-ahead-content.d.ts","sourceRoot":"","sources":["../../src/generators/week-ahead-content.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EAExB,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;AAK3B,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAa/C,CAAC;AA6BF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,EAC5C,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAOnB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,EAC5C,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAOnB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,GACpB,gBAAgB,EAAE,CAsBpB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,GAC3C,mBAAmB,EAAE,CAUvB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,GAC3C,oBAAoB,EAAE,CASxB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,GAC3C,qBAAqB,EAAE,CASzB;AAuJD;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,SAAS,EAAE,SAAS,qBAAqB,EAAE,GAC1C,oBAAoB,CAYtB;AAcD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,IAAI,EAAE,SAAS,mBAAmB,EAAE,EACpC,IAAI,GAAE,MAAa,GAClB,wBAAwB,CAsD1B;AA6ED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,SAAS,EACpB,IAAI,SAAO,GACV,MAAM,CAuER;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,EAAE,CAU/D;AAoED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,oBAAoB,EAAE,EAClC,UAAU,EAAE,mBAAmB,EAAE,EACjC,QAAQ,EAAE,MAAM,GACf,MAAM,CAeR"}