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.
- package/LICENSE +201 -0
- package/README.md +1005 -0
- package/SECURITY.md +151 -0
- package/package.json +131 -0
- package/scripts/constants/committee-indicator-map.d.ts +199 -0
- package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
- package/scripts/constants/committee-indicator-map.js +1224 -0
- package/scripts/constants/committee-indicator-map.js.map +1 -0
- package/scripts/constants/config.d.ts +38 -0
- package/scripts/constants/config.d.ts.map +1 -0
- package/scripts/constants/config.js +66 -0
- package/scripts/constants/config.js.map +1 -0
- package/scripts/constants/language-articles.d.ts +84 -0
- package/scripts/constants/language-articles.d.ts.map +1 -0
- package/scripts/constants/language-articles.js +6771 -0
- package/scripts/constants/language-articles.js.map +1 -0
- package/scripts/constants/language-core.d.ts +38 -0
- package/scripts/constants/language-core.d.ts.map +1 -0
- package/scripts/constants/language-core.js +90 -0
- package/scripts/constants/language-core.js.map +1 -0
- package/scripts/constants/language-ui.d.ts +82 -0
- package/scripts/constants/language-ui.d.ts.map +1 -0
- package/scripts/constants/language-ui.js +889 -0
- package/scripts/constants/language-ui.js.map +1 -0
- package/scripts/constants/languages.d.ts +14 -0
- package/scripts/constants/languages.d.ts.map +1 -0
- package/scripts/constants/languages.js +15 -0
- package/scripts/constants/languages.js.map +1 -0
- package/scripts/generators/analysis-builders.d.ts +266 -0
- package/scripts/generators/analysis-builders.d.ts.map +1 -0
- package/scripts/generators/analysis-builders.js +2903 -0
- package/scripts/generators/analysis-builders.js.map +1 -0
- package/scripts/generators/breaking-content.d.ts +45 -0
- package/scripts/generators/breaking-content.d.ts.map +1 -0
- package/scripts/generators/breaking-content.js +530 -0
- package/scripts/generators/breaking-content.js.map +1 -0
- package/scripts/generators/committee-helpers.d.ts +54 -0
- package/scripts/generators/committee-helpers.d.ts.map +1 -0
- package/scripts/generators/committee-helpers.js +154 -0
- package/scripts/generators/committee-helpers.js.map +1 -0
- package/scripts/generators/dashboard-content.d.ts +95 -0
- package/scripts/generators/dashboard-content.d.ts.map +1 -0
- package/scripts/generators/dashboard-content.js +630 -0
- package/scripts/generators/dashboard-content.js.map +1 -0
- package/scripts/generators/deep-analysis-content.d.ts +23 -0
- package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
- package/scripts/generators/deep-analysis-content.js +831 -0
- package/scripts/generators/deep-analysis-content.js.map +1 -0
- package/scripts/generators/mindmap-content.d.ts +55 -0
- package/scripts/generators/mindmap-content.d.ts.map +1 -0
- package/scripts/generators/mindmap-content.js +512 -0
- package/scripts/generators/mindmap-content.js.map +1 -0
- package/scripts/generators/motions-content.d.ts +50 -0
- package/scripts/generators/motions-content.d.ts.map +1 -0
- package/scripts/generators/motions-content.js +391 -0
- package/scripts/generators/motions-content.js.map +1 -0
- package/scripts/generators/news-enhanced.d.ts +14 -0
- package/scripts/generators/news-enhanced.d.ts.map +1 -0
- package/scripts/generators/news-enhanced.js +169 -0
- package/scripts/generators/news-enhanced.js.map +1 -0
- package/scripts/generators/news-indexes.d.ts +31 -0
- package/scripts/generators/news-indexes.d.ts.map +1 -0
- package/scripts/generators/news-indexes.js +410 -0
- package/scripts/generators/news-indexes.js.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.js +1522 -0
- package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
- package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
- package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/generate-stage.js +204 -0
- package/scripts/generators/pipeline/generate-stage.js.map +1 -0
- package/scripts/generators/pipeline/output-stage.d.ts +48 -0
- package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/output-stage.js +145 -0
- package/scripts/generators/pipeline/output-stage.js.map +1 -0
- package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
- package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/transform-stage.js +111 -0
- package/scripts/generators/pipeline/transform-stage.js.map +1 -0
- package/scripts/generators/propositions-content.d.ts +29 -0
- package/scripts/generators/propositions-content.d.ts.map +1 -0
- package/scripts/generators/propositions-content.js +90 -0
- package/scripts/generators/propositions-content.js.map +1 -0
- package/scripts/generators/sankey-content.d.ts +45 -0
- package/scripts/generators/sankey-content.d.ts.map +1 -0
- package/scripts/generators/sankey-content.js +227 -0
- package/scripts/generators/sankey-content.js.map +1 -0
- package/scripts/generators/sitemap.d.ts +66 -0
- package/scripts/generators/sitemap.d.ts.map +1 -0
- package/scripts/generators/sitemap.js +562 -0
- package/scripts/generators/sitemap.js.map +1 -0
- package/scripts/generators/strategies/article-strategy.d.ts +146 -0
- package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/article-strategy.js +4 -0
- package/scripts/generators/strategies/article-strategy.js.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
- package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
- package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
- package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
- package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
- package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
- package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/motions-strategy.js +215 -0
- package/scripts/generators/strategies/motions-strategy.js.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.js +257 -0
- package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
- package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
- package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
- package/scripts/generators/swot-content.d.ts +42 -0
- package/scripts/generators/swot-content.d.ts.map +1 -0
- package/scripts/generators/swot-content.js +366 -0
- package/scripts/generators/swot-content.js.map +1 -0
- package/scripts/generators/week-ahead-content.d.ts +103 -0
- package/scripts/generators/week-ahead-content.d.ts.map +1 -0
- package/scripts/generators/week-ahead-content.js +610 -0
- package/scripts/generators/week-ahead-content.js.map +1 -0
- package/scripts/index.d.ts +40 -0
- package/scripts/index.d.ts.map +1 -0
- package/scripts/index.js +53 -0
- package/scripts/index.js.map +1 -0
- package/scripts/mcp/ep-mcp-client.d.ts +471 -0
- package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/ep-mcp-client.js +734 -0
- package/scripts/mcp/ep-mcp-client.js.map +1 -0
- package/scripts/mcp/mcp-connection.d.ts +264 -0
- package/scripts/mcp/mcp-connection.d.ts.map +1 -0
- package/scripts/mcp/mcp-connection.js +790 -0
- package/scripts/mcp/mcp-connection.js.map +1 -0
- package/scripts/mcp/mcp-health.d.ts +75 -0
- package/scripts/mcp/mcp-health.d.ts.map +1 -0
- package/scripts/mcp/mcp-health.js +78 -0
- package/scripts/mcp/mcp-health.js.map +1 -0
- package/scripts/mcp/mcp-retry.d.ts +94 -0
- package/scripts/mcp/mcp-retry.d.ts.map +1 -0
- package/scripts/mcp/mcp-retry.js +127 -0
- package/scripts/mcp/mcp-retry.js.map +1 -0
- package/scripts/mcp/wb-mcp-client.d.ts +38 -0
- package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/wb-mcp-client.js +112 -0
- package/scripts/mcp/wb-mcp-client.js.map +1 -0
- package/scripts/templates/article-template.d.ts +9 -0
- package/scripts/templates/article-template.d.ts.map +1 -0
- package/scripts/templates/article-template.js +378 -0
- package/scripts/templates/article-template.js.map +1 -0
- package/scripts/templates/section-builders.d.ts +28 -0
- package/scripts/templates/section-builders.d.ts.map +1 -0
- package/scripts/templates/section-builders.js +142 -0
- package/scripts/templates/section-builders.js.map +1 -0
- package/scripts/types/analysis.d.ts +115 -0
- package/scripts/types/analysis.d.ts.map +1 -0
- package/scripts/types/analysis.js +4 -0
- package/scripts/types/analysis.js.map +1 -0
- package/scripts/types/common.d.ts +584 -0
- package/scripts/types/common.d.ts.map +1 -0
- package/scripts/types/common.js +96 -0
- package/scripts/types/common.js.map +1 -0
- package/scripts/types/generation.d.ts +104 -0
- package/scripts/types/generation.d.ts.map +1 -0
- package/scripts/types/generation.js +4 -0
- package/scripts/types/generation.js.map +1 -0
- package/scripts/types/index.d.ts +24 -0
- package/scripts/types/index.d.ts.map +1 -0
- package/scripts/types/index.js +16 -0
- package/scripts/types/index.js.map +1 -0
- package/scripts/types/intelligence.d.ts +129 -0
- package/scripts/types/intelligence.d.ts.map +1 -0
- package/scripts/types/intelligence.js +4 -0
- package/scripts/types/intelligence.js.map +1 -0
- package/scripts/types/mcp.d.ts +418 -0
- package/scripts/types/mcp.d.ts.map +1 -0
- package/scripts/types/mcp.js +4 -0
- package/scripts/types/mcp.js.map +1 -0
- package/scripts/types/parliament.d.ts +388 -0
- package/scripts/types/parliament.d.ts.map +1 -0
- package/scripts/types/parliament.js +4 -0
- package/scripts/types/parliament.js.map +1 -0
- package/scripts/types/quality.d.ts +114 -0
- package/scripts/types/quality.d.ts.map +1 -0
- package/scripts/types/quality.js +4 -0
- package/scripts/types/quality.js.map +1 -0
- package/scripts/types/stakeholder.d.ts +88 -0
- package/scripts/types/stakeholder.d.ts.map +1 -0
- package/scripts/types/stakeholder.js +16 -0
- package/scripts/types/stakeholder.js.map +1 -0
- package/scripts/types/visualization.d.ts +708 -0
- package/scripts/types/visualization.d.ts.map +1 -0
- package/scripts/types/visualization.js +4 -0
- package/scripts/types/visualization.js.map +1 -0
- package/scripts/types/world-bank.d.ts +85 -0
- package/scripts/types/world-bank.d.ts.map +1 -0
- package/scripts/types/world-bank.js +4 -0
- package/scripts/types/world-bank.js.map +1 -0
- package/scripts/utils/article-category.d.ts +18 -0
- package/scripts/utils/article-category.d.ts.map +1 -0
- package/scripts/utils/article-category.js +49 -0
- package/scripts/utils/article-category.js.map +1 -0
- package/scripts/utils/article-quality-scorer.d.ts +87 -0
- package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
- package/scripts/utils/article-quality-scorer.js +1048 -0
- package/scripts/utils/article-quality-scorer.js.map +1 -0
- package/scripts/utils/content-metadata.d.ts +34 -0
- package/scripts/utils/content-metadata.d.ts.map +1 -0
- package/scripts/utils/content-metadata.js +249 -0
- package/scripts/utils/content-metadata.js.map +1 -0
- package/scripts/utils/content-validator.d.ts +94 -0
- package/scripts/utils/content-validator.d.ts.map +1 -0
- package/scripts/utils/content-validator.js +489 -0
- package/scripts/utils/content-validator.js.map +1 -0
- package/scripts/utils/copy-test-reports.d.ts +9 -0
- package/scripts/utils/copy-test-reports.d.ts.map +1 -0
- package/scripts/utils/copy-test-reports.js +508 -0
- package/scripts/utils/copy-test-reports.js.map +1 -0
- package/scripts/utils/file-utils.d.ts +144 -0
- package/scripts/utils/file-utils.d.ts.map +1 -0
- package/scripts/utils/file-utils.js +374 -0
- package/scripts/utils/file-utils.js.map +1 -0
- package/scripts/utils/fix-articles.d.ts +27 -0
- package/scripts/utils/fix-articles.d.ts.map +1 -0
- package/scripts/utils/fix-articles.js +510 -0
- package/scripts/utils/fix-articles.js.map +1 -0
- package/scripts/utils/generate-docs-index.d.ts +8 -0
- package/scripts/utils/generate-docs-index.d.ts.map +1 -0
- package/scripts/utils/generate-docs-index.js +275 -0
- package/scripts/utils/generate-docs-index.js.map +1 -0
- package/scripts/utils/html-sanitize.d.ts +18 -0
- package/scripts/utils/html-sanitize.d.ts.map +1 -0
- package/scripts/utils/html-sanitize.js +57 -0
- package/scripts/utils/html-sanitize.js.map +1 -0
- package/scripts/utils/intelligence-analysis.d.ts +173 -0
- package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
- package/scripts/utils/intelligence-analysis.js +936 -0
- package/scripts/utils/intelligence-analysis.js.map +1 -0
- package/scripts/utils/intelligence-index.d.ts +126 -0
- package/scripts/utils/intelligence-index.d.ts.map +1 -0
- package/scripts/utils/intelligence-index.js +731 -0
- package/scripts/utils/intelligence-index.js.map +1 -0
- package/scripts/utils/metadata-utils.d.ts +14 -0
- package/scripts/utils/metadata-utils.d.ts.map +1 -0
- package/scripts/utils/metadata-utils.js +18 -0
- package/scripts/utils/metadata-utils.js.map +1 -0
- package/scripts/utils/news-metadata.d.ts +47 -0
- package/scripts/utils/news-metadata.d.ts.map +1 -0
- package/scripts/utils/news-metadata.js +259 -0
- package/scripts/utils/news-metadata.js.map +1 -0
- package/scripts/utils/validate-articles.d.ts +2 -0
- package/scripts/utils/validate-articles.d.ts.map +1 -0
- package/scripts/utils/validate-articles.js +284 -0
- package/scripts/utils/validate-articles.js.map +1 -0
- package/scripts/utils/validate-ep-api.d.ts +51 -0
- package/scripts/utils/validate-ep-api.d.ts.map +1 -0
- package/scripts/utils/validate-ep-api.js +160 -0
- package/scripts/utils/validate-ep-api.js.map +1 -0
- package/scripts/utils/world-bank-data.d.ts +84 -0
- package/scripts/utils/world-bank-data.d.ts.map +1 -0
- package/scripts/utils/world-bank-data.js +311 -0
- 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"}
|