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,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 & 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>© 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 @@
|
|
|
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"}
|