riksdagsmonitor 0.8.23 → 0.8.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -1
- package/dist/lib/dashboards/party-dashboard.js +2 -1
- package/dist/lib/dashboards/party-dashboard.js.map +1 -1
- package/dist/lib/dashboards/risk-dashboard.js +2 -1
- package/dist/lib/dashboards/risk-dashboard.js.map +1 -1
- package/dist/lib/shared/index.d.ts +0 -1
- package/dist/lib/shared/index.d.ts.map +1 -1
- package/dist/lib/shared/index.js +3 -1
- package/dist/lib/shared/index.js.map +1 -1
- package/dist/lib/shared/register-globals.d.ts +1 -1
- package/dist/lib/shared/register-globals.d.ts.map +1 -1
- package/dist/lib/shared/register-globals.js +7 -1
- package/dist/lib/shared/register-globals.js.map +1 -1
- package/package.json +53 -21
- package/dist/scripts/analysis-reader.d.ts +0 -241
- package/dist/scripts/analysis-reader.d.ts.map +0 -1
- package/dist/scripts/analysis-reader.js +0 -531
- package/dist/scripts/analysis-reader.js.map +0 -1
- package/dist/scripts/article-quality-enhancer.d.ts +0 -148
- package/dist/scripts/article-quality-enhancer.d.ts.map +0 -1
- package/dist/scripts/article-quality-enhancer.js +0 -430
- package/dist/scripts/article-quality-enhancer.js.map +0 -1
- package/dist/scripts/article-template/constants.d.ts +0 -104
- package/dist/scripts/article-template/constants.d.ts.map +0 -1
- package/dist/scripts/article-template/constants.js +0 -225
- package/dist/scripts/article-template/constants.js.map +0 -1
- package/dist/scripts/article-template/helpers.d.ts +0 -83
- package/dist/scripts/article-template/helpers.d.ts.map +0 -1
- package/dist/scripts/article-template/helpers.js +0 -236
- package/dist/scripts/article-template/helpers.js.map +0 -1
- package/dist/scripts/article-template/index.d.ts +0 -39
- package/dist/scripts/article-template/index.d.ts.map +0 -1
- package/dist/scripts/article-template/index.js +0 -37
- package/dist/scripts/article-template/index.js.map +0 -1
- package/dist/scripts/article-template/registry.d.ts +0 -64
- package/dist/scripts/article-template/registry.d.ts.map +0 -1
- package/dist/scripts/article-template/registry.js +0 -405
- package/dist/scripts/article-template/registry.js.map +0 -1
- package/dist/scripts/article-template/template.d.ts +0 -18
- package/dist/scripts/article-template/template.d.ts.map +0 -1
- package/dist/scripts/article-template/template.js +0 -359
- package/dist/scripts/article-template/template.js.map +0 -1
- package/dist/scripts/article-template/types.d.ts +0 -90
- package/dist/scripts/article-template/types.d.ts.map +0 -1
- package/dist/scripts/article-template/types.js +0 -96
- package/dist/scripts/article-template/types.js.map +0 -1
- package/dist/scripts/article-template.d.ts +0 -18
- package/dist/scripts/article-template.d.ts.map +0 -1
- package/dist/scripts/article-template.js +0 -18
- package/dist/scripts/article-template.js.map +0 -1
- package/dist/scripts/catalog-downloaded-data.d.ts +0 -66
- package/dist/scripts/catalog-downloaded-data.d.ts.map +0 -1
- package/dist/scripts/catalog-downloaded-data.js +0 -239
- package/dist/scripts/catalog-downloaded-data.js.map +0 -1
- package/dist/scripts/check-cia-schema-updates.d.ts +0 -186
- package/dist/scripts/check-cia-schema-updates.d.ts.map +0 -1
- package/dist/scripts/check-cia-schema-updates.js +0 -363
- package/dist/scripts/check-cia-schema-updates.js.map +0 -1
- package/dist/scripts/data-transformers/calendar.d.ts +0 -16
- package/dist/scripts/data-transformers/calendar.d.ts.map +0 -1
- package/dist/scripts/data-transformers/calendar.js +0 -137
- package/dist/scripts/data-transformers/calendar.js.map +0 -1
- package/dist/scripts/data-transformers/constants/committee-names.d.ts +0 -15
- package/dist/scripts/data-transformers/constants/committee-names.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/committee-names.js +0 -30
- package/dist/scripts/data-transformers/constants/committee-names.js.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts +0 -11
- package/dist/scripts/data-transformers/constants/content-labels-part1.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part1.js +0 -900
- package/dist/scripts/data-transformers/constants/content-labels-part1.js.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts +0 -11
- package/dist/scripts/data-transformers/constants/content-labels-part2.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels-part2.js +0 -900
- package/dist/scripts/data-transformers/constants/content-labels-part2.js.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels.d.ts +0 -13
- package/dist/scripts/data-transformers/constants/content-labels.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/content-labels.js +0 -18
- package/dist/scripts/data-transformers/constants/content-labels.js.map +0 -1
- package/dist/scripts/data-transformers/constants/index.d.ts +0 -15
- package/dist/scripts/data-transformers/constants/index.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/index.js +0 -15
- package/dist/scripts/data-transformers/constants/index.js.map +0 -1
- package/dist/scripts/data-transformers/constants/locale-map.d.ts +0 -13
- package/dist/scripts/data-transformers/constants/locale-map.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants/locale-map.js +0 -17
- package/dist/scripts/data-transformers/constants/locale-map.js.map +0 -1
- package/dist/scripts/data-transformers/constants.d.ts +0 -14
- package/dist/scripts/data-transformers/constants.d.ts.map +0 -1
- package/dist/scripts/data-transformers/constants.js +0 -14
- package/dist/scripts/data-transformers/constants.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts +0 -64
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js +0 -805
- package/dist/scripts/data-transformers/content-generators/ai-mindmap-analyzer.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts +0 -50
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.js +0 -310
- package/dist/scripts/data-transformers/content-generators/cia-overview-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/committee.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/committee.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/committee.js +0 -247
- package/dist/scripts/data-transformers/content-generators/committee.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts +0 -124
- package/dist/scripts/data-transformers/content-generators/dashboard-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/dashboard-section.js +0 -564
- package/dist/scripts/data-transformers/content-generators/dashboard-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts +0 -82
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js +0 -321
- package/dist/scripts/data-transformers/content-generators/economic-dashboard-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/generic.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/generic.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/generic.js +0 -295
- package/dist/scripts/data-transformers/content-generators/generic.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/index.d.ts +0 -84
- package/dist/scripts/data-transformers/content-generators/index.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/index.js +0 -47
- package/dist/scripts/data-transformers/content-generators/index.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/interpellations.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/interpellations.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/interpellations.js +0 -124
- package/dist/scripts/data-transformers/content-generators/interpellations.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts +0 -137
- package/dist/scripts/data-transformers/content-generators/mindmap-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/mindmap-section.js +0 -286
- package/dist/scripts/data-transformers/content-generators/mindmap-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts +0 -17
- package/dist/scripts/data-transformers/content-generators/month-ahead.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/month-ahead.js +0 -212
- package/dist/scripts/data-transformers/content-generators/month-ahead.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts +0 -17
- package/dist/scripts/data-transformers/content-generators/monthly-review.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/monthly-review.js +0 -173
- package/dist/scripts/data-transformers/content-generators/monthly-review.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/motions.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/motions.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/motions.js +0 -158
- package/dist/scripts/data-transformers/content-generators/motions.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts +0 -62
- package/dist/scripts/data-transformers/content-generators/newsworthiness.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/newsworthiness.js +0 -254
- package/dist/scripts/data-transformers/content-generators/newsworthiness.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/propositions.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/propositions.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/propositions.js +0 -263
- package/dist/scripts/data-transformers/content-generators/propositions.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts +0 -92
- package/dist/scripts/data-transformers/content-generators/sankey-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/sankey-section.js +0 -257
- package/dist/scripts/data-transformers/content-generators/sankey-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/shared.d.ts +0 -139
- package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/shared.js +0 -935
- package/dist/scripts/data-transformers/content-generators/shared.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/swot-section.d.ts +0 -50
- package/dist/scripts/data-transformers/content-generators/swot-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/swot-section.js +0 -177
- package/dist/scripts/data-transformers/content-generators/swot-section.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts +0 -12
- package/dist/scripts/data-transformers/content-generators/week-ahead.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/week-ahead.js +0 -332
- package/dist/scripts/data-transformers/content-generators/week-ahead.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators.d.ts +0 -15
- package/dist/scripts/data-transformers/content-generators.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators.js +0 -14
- package/dist/scripts/data-transformers/content-generators.js.map +0 -1
- package/dist/scripts/data-transformers/document-analysis.d.ts +0 -58
- package/dist/scripts/data-transformers/document-analysis.d.ts.map +0 -1
- package/dist/scripts/data-transformers/document-analysis.js +0 -396
- package/dist/scripts/data-transformers/document-analysis.js.map +0 -1
- package/dist/scripts/data-transformers/helpers.d.ts +0 -144
- package/dist/scripts/data-transformers/helpers.d.ts.map +0 -1
- package/dist/scripts/data-transformers/helpers.js +0 -408
- package/dist/scripts/data-transformers/helpers.js.map +0 -1
- package/dist/scripts/data-transformers/index.d.ts +0 -45
- package/dist/scripts/data-transformers/index.d.ts.map +0 -1
- package/dist/scripts/data-transformers/index.js +0 -66
- package/dist/scripts/data-transformers/index.js.map +0 -1
- package/dist/scripts/data-transformers/metadata.d.ts +0 -42
- package/dist/scripts/data-transformers/metadata.d.ts.map +0 -1
- package/dist/scripts/data-transformers/metadata.js +0 -385
- package/dist/scripts/data-transformers/metadata.js.map +0 -1
- package/dist/scripts/data-transformers/policy-analysis.d.ts +0 -105
- package/dist/scripts/data-transformers/policy-analysis.d.ts.map +0 -1
- package/dist/scripts/data-transformers/policy-analysis.js +0 -686
- package/dist/scripts/data-transformers/policy-analysis.js.map +0 -1
- package/dist/scripts/data-transformers/risk-analysis.d.ts +0 -104
- package/dist/scripts/data-transformers/risk-analysis.d.ts.map +0 -1
- package/dist/scripts/data-transformers/risk-analysis.js +0 -279
- package/dist/scripts/data-transformers/risk-analysis.js.map +0 -1
- package/dist/scripts/data-transformers/types.d.ts +0 -260
- package/dist/scripts/data-transformers/types.d.ts.map +0 -1
- package/dist/scripts/data-transformers/types.js +0 -11
- package/dist/scripts/data-transformers/types.js.map +0 -1
- package/dist/scripts/data-transformers.d.ts +0 -23
- package/dist/scripts/data-transformers.d.ts.map +0 -1
- package/dist/scripts/data-transformers.js +0 -35
- package/dist/scripts/data-transformers.js.map +0 -1
- package/dist/scripts/deep-inspection/index.d.ts +0 -55
- package/dist/scripts/deep-inspection/index.d.ts.map +0 -1
- package/dist/scripts/deep-inspection/index.js +0 -66
- package/dist/scripts/deep-inspection/index.js.map +0 -1
- package/dist/scripts/detect-swedish-leakage.d.ts +0 -69
- package/dist/scripts/detect-swedish-leakage.d.ts.map +0 -1
- package/dist/scripts/detect-swedish-leakage.js +0 -417
- package/dist/scripts/detect-swedish-leakage.js.map +0 -1
- package/dist/scripts/editorial-framework.d.ts +0 -121
- package/dist/scripts/editorial-framework.d.ts.map +0 -1
- package/dist/scripts/editorial-framework.js +0 -364
- package/dist/scripts/editorial-framework.js.map +0 -1
- package/dist/scripts/editorial-pillars.d.ts +0 -43
- package/dist/scripts/editorial-pillars.d.ts.map +0 -1
- package/dist/scripts/editorial-pillars.js +0 -215
- package/dist/scripts/editorial-pillars.js.map +0 -1
- package/dist/scripts/extract-news-metadata.d.ts +0 -12
- package/dist/scripts/extract-news-metadata.d.ts.map +0 -1
- package/dist/scripts/extract-news-metadata.js +0 -107
- package/dist/scripts/extract-news-metadata.js.map +0 -1
- package/dist/scripts/extract-vocabulary.d.ts +0 -15
- package/dist/scripts/extract-vocabulary.d.ts.map +0 -1
- package/dist/scripts/extract-vocabulary.js +0 -255
- package/dist/scripts/extract-vocabulary.js.map +0 -1
- package/dist/scripts/fix-article-navigation.d.ts +0 -37
- package/dist/scripts/fix-article-navigation.d.ts.map +0 -1
- package/dist/scripts/fix-article-navigation.js +0 -198
- package/dist/scripts/fix-article-navigation.js.map +0 -1
- package/dist/scripts/fix-keywords-localization.d.ts +0 -18
- package/dist/scripts/fix-keywords-localization.d.ts.map +0 -1
- package/dist/scripts/fix-keywords-localization.js +0 -270
- package/dist/scripts/fix-keywords-localization.js.map +0 -1
- package/dist/scripts/fix-old-articles-branding.d.ts +0 -17
- package/dist/scripts/fix-old-articles-branding.d.ts.map +0 -1
- package/dist/scripts/fix-old-articles-branding.js +0 -229
- package/dist/scripts/fix-old-articles-branding.js.map +0 -1
- package/dist/scripts/generate-news-backport.d.ts +0 -16
- package/dist/scripts/generate-news-backport.d.ts.map +0 -1
- package/dist/scripts/generate-news-backport.js +0 -379
- package/dist/scripts/generate-news-backport.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts +0 -141
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js +0 -546
- package/dist/scripts/generate-news-enhanced/ai-analysis-pipeline.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts +0 -59
- package/dist/scripts/generate-news-enhanced/analysis-cache.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-cache.js +0 -116
- package/dist/scripts/generate-news-enhanced/analysis-cache.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts +0 -58
- package/dist/scripts/generate-news-enhanced/analysis-labels.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/analysis-labels.js +0 -144
- package/dist/scripts/generate-news-enhanced/analysis-labels.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/config.d.ts +0 -58
- package/dist/scripts/generate-news-enhanced/config.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/config.js +0 -286
- package/dist/scripts/generate-news-enhanced/config.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/generators.d.ts +0 -119
- package/dist/scripts/generate-news-enhanced/generators.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/generators.js +0 -2131
- package/dist/scripts/generate-news-enhanced/generators.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/helpers.d.ts +0 -122
- package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/helpers.js +0 -468
- package/dist/scripts/generate-news-enhanced/helpers.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/index.d.ts +0 -19
- package/dist/scripts/generate-news-enhanced/index.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/index.js +0 -221
- package/dist/scripts/generate-news-enhanced/index.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +0 -46
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js +0 -1227
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +0 -1
- package/dist/scripts/generate-news-enhanced/types.d.ts +0 -34
- package/dist/scripts/generate-news-enhanced/types.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced/types.js +0 -9
- package/dist/scripts/generate-news-enhanced/types.js.map +0 -1
- package/dist/scripts/generate-news-enhanced.d.ts +0 -25
- package/dist/scripts/generate-news-enhanced.d.ts.map +0 -1
- package/dist/scripts/generate-news-enhanced.js +0 -37
- package/dist/scripts/generate-news-enhanced.js.map +0 -1
- package/dist/scripts/generate-news-indexes/constants.d.ts +0 -20
- package/dist/scripts/generate-news-indexes/constants.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/constants.js +0 -308
- package/dist/scripts/generate-news-indexes/constants.js.map +0 -1
- package/dist/scripts/generate-news-indexes/helpers.d.ts +0 -73
- package/dist/scripts/generate-news-indexes/helpers.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/helpers.js +0 -352
- package/dist/scripts/generate-news-indexes/helpers.js.map +0 -1
- package/dist/scripts/generate-news-indexes/index.d.ts +0 -20
- package/dist/scripts/generate-news-indexes/index.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/index.js +0 -75
- package/dist/scripts/generate-news-indexes/index.js.map +0 -1
- package/dist/scripts/generate-news-indexes/template.d.ts +0 -25
- package/dist/scripts/generate-news-indexes/template.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/template.js +0 -644
- package/dist/scripts/generate-news-indexes/template.js.map +0 -1
- package/dist/scripts/generate-news-indexes/types.d.ts +0 -96
- package/dist/scripts/generate-news-indexes/types.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes/types.js +0 -9
- package/dist/scripts/generate-news-indexes/types.js.map +0 -1
- package/dist/scripts/generate-news-indexes.d.ts +0 -20
- package/dist/scripts/generate-news-indexes.d.ts.map +0 -1
- package/dist/scripts/generate-news-indexes.js +0 -19
- package/dist/scripts/generate-news-indexes.js.map +0 -1
- package/dist/scripts/generate-rss.d.ts +0 -48
- package/dist/scripts/generate-rss.d.ts.map +0 -1
- package/dist/scripts/generate-rss.js +0 -299
- package/dist/scripts/generate-rss.js.map +0 -1
- package/dist/scripts/generate-sitemap-html.d.ts +0 -79
- package/dist/scripts/generate-sitemap-html.d.ts.map +0 -1
- package/dist/scripts/generate-sitemap-html.js +0 -878
- package/dist/scripts/generate-sitemap-html.js.map +0 -1
- package/dist/scripts/generate-sitemap.d.ts +0 -23
- package/dist/scripts/generate-sitemap.d.ts.map +0 -1
- package/dist/scripts/generate-sitemap.js +0 -476
- package/dist/scripts/generate-sitemap.js.map +0 -1
- package/dist/scripts/generate-types-from-cia-schemas.d.ts +0 -176
- package/dist/scripts/generate-types-from-cia-schemas.d.ts.map +0 -1
- package/dist/scripts/generate-types-from-cia-schemas.js +0 -318
- package/dist/scripts/generate-types-from-cia-schemas.js.map +0 -1
- package/dist/scripts/government-role-validator.d.ts +0 -65
- package/dist/scripts/government-role-validator.d.ts.map +0 -1
- package/dist/scripts/government-role-validator.js +0 -217
- package/dist/scripts/government-role-validator.js.map +0 -1
- package/dist/scripts/html-utils.d.ts +0 -17
- package/dist/scripts/html-utils.d.ts.map +0 -1
- package/dist/scripts/html-utils.js +0 -29
- package/dist/scripts/html-utils.js.map +0 -1
- package/dist/scripts/load-cia-stats.d.ts +0 -89
- package/dist/scripts/load-cia-stats.d.ts.map +0 -1
- package/dist/scripts/load-cia-stats.js +0 -400
- package/dist/scripts/load-cia-stats.js.map +0 -1
- package/dist/scripts/mcp-client/client.d.ts +0 -73
- package/dist/scripts/mcp-client/client.d.ts.map +0 -1
- package/dist/scripts/mcp-client/client.js +0 -526
- package/dist/scripts/mcp-client/client.js.map +0 -1
- package/dist/scripts/mcp-client/document-types.d.ts +0 -23
- package/dist/scripts/mcp-client/document-types.d.ts.map +0 -1
- package/dist/scripts/mcp-client/document-types.js +0 -62
- package/dist/scripts/mcp-client/document-types.js.map +0 -1
- package/dist/scripts/mcp-client/index.d.ts +0 -34
- package/dist/scripts/mcp-client/index.d.ts.map +0 -1
- package/dist/scripts/mcp-client/index.js +0 -67
- package/dist/scripts/mcp-client/index.js.map +0 -1
- package/dist/scripts/mcp-client/transport.d.ts +0 -32
- package/dist/scripts/mcp-client/transport.d.ts.map +0 -1
- package/dist/scripts/mcp-client/transport.js +0 -102
- package/dist/scripts/mcp-client/transport.js.map +0 -1
- package/dist/scripts/mcp-client.d.ts +0 -18
- package/dist/scripts/mcp-client.d.ts.map +0 -1
- package/dist/scripts/mcp-client.js +0 -18
- package/dist/scripts/mcp-client.js.map +0 -1
- package/dist/scripts/mcp-query-cli.d.ts +0 -25
- package/dist/scripts/mcp-query-cli.d.ts.map +0 -1
- package/dist/scripts/mcp-query-cli.js +0 -66
- package/dist/scripts/mcp-query-cli.js.map +0 -1
- package/dist/scripts/news-types/breaking-news.d.ts +0 -178
- package/dist/scripts/news-types/breaking-news.d.ts.map +0 -1
- package/dist/scripts/news-types/breaking-news.js +0 -432
- package/dist/scripts/news-types/breaking-news.js.map +0 -1
- package/dist/scripts/news-types/committee-reports.d.ts +0 -212
- package/dist/scripts/news-types/committee-reports.d.ts.map +0 -1
- package/dist/scripts/news-types/committee-reports.js +0 -404
- package/dist/scripts/news-types/committee-reports.js.map +0 -1
- package/dist/scripts/news-types/month-ahead.d.ts +0 -71
- package/dist/scripts/news-types/month-ahead.d.ts.map +0 -1
- package/dist/scripts/news-types/month-ahead.js +0 -392
- package/dist/scripts/news-types/month-ahead.js.map +0 -1
- package/dist/scripts/news-types/monthly-review.d.ts +0 -61
- package/dist/scripts/news-types/monthly-review.d.ts.map +0 -1
- package/dist/scripts/news-types/monthly-review.js +0 -417
- package/dist/scripts/news-types/monthly-review.js.map +0 -1
- package/dist/scripts/news-types/motions.d.ts +0 -214
- package/dist/scripts/news-types/motions.d.ts.map +0 -1
- package/dist/scripts/news-types/motions.js +0 -447
- package/dist/scripts/news-types/motions.js.map +0 -1
- package/dist/scripts/news-types/propositions.d.ts +0 -204
- package/dist/scripts/news-types/propositions.d.ts.map +0 -1
- package/dist/scripts/news-types/propositions.js +0 -401
- package/dist/scripts/news-types/propositions.js.map +0 -1
- package/dist/scripts/news-types/week-ahead.d.ts +0 -231
- package/dist/scripts/news-types/week-ahead.d.ts.map +0 -1
- package/dist/scripts/news-types/week-ahead.js +0 -441
- package/dist/scripts/news-types/week-ahead.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/analysis.d.ts +0 -47
- package/dist/scripts/news-types/weekly-review/analysis.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/analysis.js +0 -276
- package/dist/scripts/news-types/weekly-review/analysis.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/data-loader.d.ts +0 -51
- package/dist/scripts/news-types/weekly-review/data-loader.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/data-loader.js +0 -298
- package/dist/scripts/news-types/weekly-review/data-loader.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/generator.d.ts +0 -18
- package/dist/scripts/news-types/weekly-review/generator.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/generator.js +0 -284
- package/dist/scripts/news-types/weekly-review/generator.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/index.d.ts +0 -20
- package/dist/scripts/news-types/weekly-review/index.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/index.js +0 -23
- package/dist/scripts/news-types/weekly-review/index.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/types.d.ts +0 -72
- package/dist/scripts/news-types/weekly-review/types.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/types.js +0 -20
- package/dist/scripts/news-types/weekly-review/types.js.map +0 -1
- package/dist/scripts/news-types/weekly-review/validation.d.ts +0 -10
- package/dist/scripts/news-types/weekly-review/validation.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review/validation.js +0 -95
- package/dist/scripts/news-types/weekly-review/validation.js.map +0 -1
- package/dist/scripts/news-types/weekly-review.d.ts +0 -15
- package/dist/scripts/news-types/weekly-review.d.ts.map +0 -1
- package/dist/scripts/news-types/weekly-review.js +0 -14
- package/dist/scripts/news-types/weekly-review.js.map +0 -1
- package/dist/scripts/party-variants.d.ts +0 -23
- package/dist/scripts/party-variants.d.ts.map +0 -1
- package/dist/scripts/party-variants.js +0 -50
- package/dist/scripts/party-variants.js.map +0 -1
- package/dist/scripts/pipeline/index.d.ts +0 -19
- package/dist/scripts/pipeline/index.d.ts.map +0 -1
- package/dist/scripts/pipeline/index.js +0 -17
- package/dist/scripts/pipeline/index.js.map +0 -1
- package/dist/scripts/pipeline/orchestrator.d.ts +0 -56
- package/dist/scripts/pipeline/orchestrator.d.ts.map +0 -1
- package/dist/scripts/pipeline/orchestrator.js +0 -147
- package/dist/scripts/pipeline/orchestrator.js.map +0 -1
- package/dist/scripts/pipeline/types.d.ts +0 -117
- package/dist/scripts/pipeline/types.d.ts.map +0 -1
- package/dist/scripts/pipeline/types.js +0 -13
- package/dist/scripts/pipeline/types.js.map +0 -1
- package/dist/scripts/pipeline/validation.d.ts +0 -66
- package/dist/scripts/pipeline/validation.d.ts.map +0 -1
- package/dist/scripts/pipeline/validation.js +0 -129
- package/dist/scripts/pipeline/validation.js.map +0 -1
- package/dist/scripts/populate-analysis-data.d.ts +0 -41
- package/dist/scripts/populate-analysis-data.d.ts.map +0 -1
- package/dist/scripts/populate-analysis-data.js +0 -255
- package/dist/scripts/populate-analysis-data.js.map +0 -1
- package/dist/scripts/pre-article-analysis/data-downloader.d.ts +0 -80
- package/dist/scripts/pre-article-analysis/data-downloader.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/data-downloader.js +0 -230
- package/dist/scripts/pre-article-analysis/data-downloader.js.map +0 -1
- package/dist/scripts/pre-article-analysis/data-persistence.d.ts +0 -141
- package/dist/scripts/pre-article-analysis/data-persistence.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/data-persistence.js +0 -345
- package/dist/scripts/pre-article-analysis/data-persistence.js.map +0 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +0 -158
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.js +0 -648
- package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +0 -1
- package/dist/scripts/pre-article-analysis/pdf-converter.d.ts +0 -58
- package/dist/scripts/pre-article-analysis/pdf-converter.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis/pdf-converter.js +0 -142
- package/dist/scripts/pre-article-analysis/pdf-converter.js.map +0 -1
- package/dist/scripts/pre-article-analysis.d.ts +0 -42
- package/dist/scripts/pre-article-analysis.d.ts.map +0 -1
- package/dist/scripts/pre-article-analysis.js +0 -642
- package/dist/scripts/pre-article-analysis.js.map +0 -1
- package/dist/scripts/scb-client.d.ts +0 -104
- package/dist/scripts/scb-client.d.ts.map +0 -1
- package/dist/scripts/scb-client.js +0 -286
- package/dist/scripts/scb-client.js.map +0 -1
- package/dist/scripts/scb-context.d.ts +0 -88
- package/dist/scripts/scb-context.d.ts.map +0 -1
- package/dist/scripts/scb-context.js +0 -307
- package/dist/scripts/scb-context.js.map +0 -1
- package/dist/scripts/shared/version.d.ts +0 -9
- package/dist/scripts/shared/version.d.ts.map +0 -1
- package/dist/scripts/shared/version.js +0 -28
- package/dist/scripts/shared/version.js.map +0 -1
- package/dist/scripts/statistical-claims-detector.d.ts +0 -119
- package/dist/scripts/statistical-claims-detector.d.ts.map +0 -1
- package/dist/scripts/statistical-claims-detector.js +0 -391
- package/dist/scripts/statistical-claims-detector.js.map +0 -1
- package/dist/scripts/sync-cia-schemas.d.ts +0 -52
- package/dist/scripts/sync-cia-schemas.d.ts.map +0 -1
- package/dist/scripts/sync-cia-schemas.js +0 -195
- package/dist/scripts/sync-cia-schemas.js.map +0 -1
- package/dist/scripts/translation-dictionary.d.ts +0 -45
- package/dist/scripts/translation-dictionary.d.ts.map +0 -1
- package/dist/scripts/translation-dictionary.js +0 -3642
- package/dist/scripts/translation-dictionary.js.map +0 -1
- package/dist/scripts/types/article.d.ts +0 -392
- package/dist/scripts/types/article.d.ts.map +0 -1
- package/dist/scripts/types/article.js +0 -6
- package/dist/scripts/types/article.js.map +0 -1
- package/dist/scripts/types/content.d.ts +0 -167
- package/dist/scripts/types/content.d.ts.map +0 -1
- package/dist/scripts/types/content.js +0 -6
- package/dist/scripts/types/content.js.map +0 -1
- package/dist/scripts/types/editorial.d.ts +0 -17
- package/dist/scripts/types/editorial.d.ts.map +0 -1
- package/dist/scripts/types/editorial.js +0 -6
- package/dist/scripts/types/editorial.js.map +0 -1
- package/dist/scripts/types/language.d.ts +0 -7
- package/dist/scripts/types/language.d.ts.map +0 -1
- package/dist/scripts/types/language.js +0 -6
- package/dist/scripts/types/language.js.map +0 -1
- package/dist/scripts/types/mcp.d.ts +0 -117
- package/dist/scripts/types/mcp.d.ts.map +0 -1
- package/dist/scripts/types/mcp.js +0 -6
- package/dist/scripts/types/mcp.js.map +0 -1
- package/dist/scripts/types/party.d.ts +0 -9
- package/dist/scripts/types/party.d.ts.map +0 -1
- package/dist/scripts/types/party.js +0 -6
- package/dist/scripts/types/party.js.map +0 -1
- package/dist/scripts/types/validation.d.ts +0 -136
- package/dist/scripts/types/validation.d.ts.map +0 -1
- package/dist/scripts/types/validation.js +0 -6
- package/dist/scripts/types/validation.js.map +0 -1
- package/dist/scripts/types/workflow.d.ts +0 -78
- package/dist/scripts/types/workflow.d.ts.map +0 -1
- package/dist/scripts/types/workflow.js +0 -6
- package/dist/scripts/types/workflow.js.map +0 -1
- package/dist/scripts/update-stats-from-cia.d.ts +0 -44
- package/dist/scripts/update-stats-from-cia.d.ts.map +0 -1
- package/dist/scripts/update-stats-from-cia.js +0 -310
- package/dist/scripts/update-stats-from-cia.js.map +0 -1
- package/dist/scripts/validate-against-cia-schemas.d.ts +0 -126
- package/dist/scripts/validate-against-cia-schemas.d.ts.map +0 -1
- package/dist/scripts/validate-against-cia-schemas.js +0 -299
- package/dist/scripts/validate-against-cia-schemas.js.map +0 -1
- package/dist/scripts/validate-cross-references.d.ts +0 -49
- package/dist/scripts/validate-cross-references.d.ts.map +0 -1
- package/dist/scripts/validate-cross-references.js +0 -183
- package/dist/scripts/validate-cross-references.js.map +0 -1
- package/dist/scripts/validate-file-ownership.d.ts +0 -68
- package/dist/scripts/validate-file-ownership.d.ts.map +0 -1
- package/dist/scripts/validate-file-ownership.js +0 -135
- package/dist/scripts/validate-file-ownership.js.map +0 -1
- package/dist/scripts/validate-news-translations.d.ts +0 -27
- package/dist/scripts/validate-news-translations.d.ts.map +0 -1
- package/dist/scripts/validate-news-translations.js +0 -258
- package/dist/scripts/validate-news-translations.js.map +0 -1
- package/dist/scripts/validate-translations.d.ts +0 -162
- package/dist/scripts/validate-translations.d.ts.map +0 -1
- package/dist/scripts/validate-translations.js +0 -378
- package/dist/scripts/validate-translations.js.map +0 -1
- package/dist/scripts/workflow-state-coordinator.d.ts +0 -354
- package/dist/scripts/workflow-state-coordinator.d.ts.map +0 -1
- package/dist/scripts/workflow-state-coordinator.js +0 -876
- package/dist/scripts/workflow-state-coordinator.js.map +0 -1
- package/dist/scripts/world-bank-client.d.ts +0 -122
- package/dist/scripts/world-bank-client.d.ts.map +0 -1
- package/dist/scripts/world-bank-client.js +0 -192
- package/dist/scripts/world-bank-client.js.map +0 -1
- package/dist/scripts/world-bank-context.d.ts +0 -88
- package/dist/scripts/world-bank-context.d.ts.map +0 -1
- package/dist/scripts/world-bank-context.js +0 -331
- package/dist/scripts/world-bank-context.js.map +0 -1
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module data-transformers/content-generators/propositions
|
|
3
|
-
* @description Generator for "propositions" article content. Renders government propositions
|
|
4
|
-
* with policy significance, grouped by committee where applicable.
|
|
5
|
-
*
|
|
6
|
-
* @author Hack23 AB
|
|
7
|
-
* @license Apache-2.0
|
|
8
|
-
*/
|
|
9
|
-
import { escapeHtml } from '../../html-utils.js';
|
|
10
|
-
import { getPillarTransition } from '../../editorial-pillars.js';
|
|
11
|
-
import { L, svSpan, sanitizeUrl, getCommitteeName, generateEnhancedSummary, formatDocumentDate, } from '../helpers.js';
|
|
12
|
-
import { detectPolicyDomains, generateDeepPolicyAnalysis } from '../policy-analysis.js';
|
|
13
|
-
import { groupPropositionsByCommittee, } from '../document-analysis.js';
|
|
14
|
-
import { generateDeepAnalysisSection, analyzeDocumentsForContent } from './shared.js';
|
|
15
|
-
export function generatePropositionsContent(data, lang) {
|
|
16
|
-
const propositions = data.propositions || [];
|
|
17
|
-
let content = `<h2>${L(lang, 'govProps')}</h2>\n`;
|
|
18
|
-
if (propositions.length === 0) {
|
|
19
|
-
content += `<p>${L(lang, 'noProps')}</p>\n`;
|
|
20
|
-
return content;
|
|
21
|
-
}
|
|
22
|
-
// Analytical lede paragraph
|
|
23
|
-
const breakdownFn = L(lang, 'propsBreakdown');
|
|
24
|
-
const breakdownText = typeof breakdownFn === 'function'
|
|
25
|
-
? breakdownFn(propositions.length)
|
|
26
|
-
: `${propositions.length} new government propositions submitted.`;
|
|
27
|
-
content += `<p class="article-lede">${escapeHtml(String(breakdownText))}</p>\n`;
|
|
28
|
-
// Legislative pipeline section
|
|
29
|
-
content += `\n <h2>${L(lang, 'legislativePipeline')}</h2>\n`;
|
|
30
|
-
// Group propositions by committee; multi-committee → h3 committee + h4 prop, single → h3 prop
|
|
31
|
-
const byCommitteeGroup = groupPropositionsByCommittee(propositions);
|
|
32
|
-
const multiCommittee = byCommitteeGroup.size > 1;
|
|
33
|
-
byCommitteeGroup.forEach((committeeProps, committeeKey) => {
|
|
34
|
-
if (multiCommittee) {
|
|
35
|
-
const committeeLabel = committeeKey
|
|
36
|
-
? escapeHtml(getCommitteeName(committeeKey, lang))
|
|
37
|
-
: escapeHtml(String(L(lang, 'otherCommittee')));
|
|
38
|
-
content += ` <h3>${committeeLabel}</h3>\n`;
|
|
39
|
-
}
|
|
40
|
-
const headingTag = multiCommittee ? 'h4' : 'h3';
|
|
41
|
-
committeeProps.forEach(prop => {
|
|
42
|
-
const titleText = prop.titel || prop.title || '';
|
|
43
|
-
const escapedTitle = escapeHtml(titleText);
|
|
44
|
-
const titleHtml = (prop.titel && !prop.title)
|
|
45
|
-
? svSpan(escapedTitle, lang)
|
|
46
|
-
: escapedTitle;
|
|
47
|
-
const docName = escapeHtml(prop.dokumentnamn || prop.dok_id || titleText);
|
|
48
|
-
// Use enhanced summary based on metadata
|
|
49
|
-
const summaryText = generateEnhancedSummary(prop, 'proposition', lang);
|
|
50
|
-
const isFromAPI = prop.summary || prop.notis;
|
|
51
|
-
const propDefaultVal = L(lang, 'propDefault');
|
|
52
|
-
const summaryHtml = (prop.titel && !prop.title && isFromAPI && summaryText !== propDefaultVal)
|
|
53
|
-
? svSpan(escapeHtml(summaryText), lang)
|
|
54
|
-
: escapeHtml(summaryText);
|
|
55
|
-
// Show "Referred to" inline only in single-committee view (committee heading covers it otherwise)
|
|
56
|
-
const referredCommittee = prop.organ || prop.committee;
|
|
57
|
-
const referredLine = (!multiCommittee && referredCommittee)
|
|
58
|
-
? `<br><strong>${L(lang, 'referredTo')}:</strong> ${escapeHtml(getCommitteeName(referredCommittee, lang))}`
|
|
59
|
-
: '';
|
|
60
|
-
const propSigVal = L(lang, 'propSignificance');
|
|
61
|
-
const readFullVal = L(lang, 'readFullProp');
|
|
62
|
-
const whyItMattersVal = L(lang, 'whyItMatters');
|
|
63
|
-
const dateHtml = formatDocumentDate(prop, lang);
|
|
64
|
-
content += `
|
|
65
|
-
<div class="proposition-entry">
|
|
66
|
-
<${headingTag}>${titleHtml}</${headingTag}>${dateHtml ? `\n <p>${dateHtml}</p>` : ''}
|
|
67
|
-
<p>${escapeHtml(String(propSigVal))} ${summaryHtml}${referredLine}</p>
|
|
68
|
-
<p><strong>${escapeHtml(String(whyItMattersVal))}:</strong> ${generateDeepPolicyAnalysis(prop, lang, 'prop')}</p>
|
|
69
|
-
<p><a href="${sanitizeUrl(prop.url)}" class="document-link" rel="noopener noreferrer">${escapeHtml(String(readFullVal))}: ${docName}</a></p>
|
|
70
|
-
</div>
|
|
71
|
-
`;
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
// Policy implications section
|
|
75
|
-
content += `\n <h2>${L(lang, 'policyImplications')}</h2>\n`;
|
|
76
|
-
content += ` <div class="context-box">\n`;
|
|
77
|
-
// Count unique policy domains across all propositions for accurate "N policy domains" text
|
|
78
|
-
const allPropDomains = new Set();
|
|
79
|
-
propositions.forEach(p => detectPolicyDomains(p, lang).forEach(d => allPropDomains.add(d)));
|
|
80
|
-
const domainCount = allPropDomains.size;
|
|
81
|
-
// Group by referred committee for government priority signal (separate from domain count)
|
|
82
|
-
const byCommittee = {};
|
|
83
|
-
propositions.forEach(p => {
|
|
84
|
-
const c = p.organ || p.committee || 'unknown';
|
|
85
|
-
byCommittee[c] = (byCommittee[c] || 0) + 1;
|
|
86
|
-
});
|
|
87
|
-
const implicationFn = L(lang, 'policyImplicationsContext');
|
|
88
|
-
const implication = typeof implicationFn === 'function'
|
|
89
|
-
? implicationFn(propositions.length, domainCount)
|
|
90
|
-
: `These ${propositions.length} propositions touch on ${domainCount} policy domains.`;
|
|
91
|
-
content += ` <p>${escapeHtml(String(implication))}</p>\n`;
|
|
92
|
-
// Government priority signal: identify the committee receiving the most propositions
|
|
93
|
-
const sortedCommittees = Object.entries(byCommittee)
|
|
94
|
-
.filter(([c]) => c !== 'unknown')
|
|
95
|
-
.sort(([, a], [, b]) => b - a);
|
|
96
|
-
if (sortedCommittees.length > 0) {
|
|
97
|
-
const [topCommittee, topCount] = sortedCommittees[0];
|
|
98
|
-
const topName = getCommitteeName(topCommittee, lang);
|
|
99
|
-
const priorityTemplates = {
|
|
100
|
-
sv: (n, c) => `${n} tar emot ${c} av propositionerna – ett tecken på att detta är ett centralt prioriterat område för regeringen denna session.`,
|
|
101
|
-
da: (n, c) => `${n} modtager ${c} af lovforslagene — et klart signal om regeringsprioritet.`,
|
|
102
|
-
no: (n, c) => `${n} mottar ${c} av proposisjonene — et sterkt signal om regjeringsprioritet.`,
|
|
103
|
-
fi: (n, c) => `${n} vastaanottaa ${c} esityksistä — vahva merkki hallituksen painopistealueesta.`,
|
|
104
|
-
de: (n, c) => `${n} erhält ${c} der Vorlagen — ein starkes Signal für die Regierungspriorität in diesem Bereich.`,
|
|
105
|
-
fr: (n, c) => `${n} reçoit ${c} des propositions — un signal fort de priorité gouvernementale.`,
|
|
106
|
-
es: (n, c) => `${n} recibe ${c} de las proposiciones — una señal clara de prioridad gubernamental.`,
|
|
107
|
-
nl: (n, c) => `${n} ontvangt ${c} van de voorstellen — een sterk signaal van overheidsprioriteit.`,
|
|
108
|
-
ar: (n, c) => `${n} يستقبل ${c} من المقترحات — إشارة قوية لأولوية حكومية.`,
|
|
109
|
-
he: (n, c) => `${n} מקבל ${c} מההצעות — אות חזק לעדיפות ממשלתית.`,
|
|
110
|
-
ja: (n, c) => `${n}は${c}件の提案を受け取り、政府の重点分野であることを示しています。`,
|
|
111
|
-
ko: (n, c) => `${n}이(가) ${c}건의 법안을 받아 정부 우선순위를 강하게 나타냅니다.`,
|
|
112
|
-
zh: (n, c) => `${n}收到${c}项提案——强烈表明这是政府本期的优先领域。`,
|
|
113
|
-
};
|
|
114
|
-
const priorityTpl = priorityTemplates[lang];
|
|
115
|
-
const priorityNote = priorityTpl
|
|
116
|
-
? priorityTpl(escapeHtml(topName), topCount)
|
|
117
|
-
: `${escapeHtml(topName)} receives ${topCount} of the propositions — a strong signal of government priority in this policy area this session.`;
|
|
118
|
-
content += ` <p>${priorityNote}</p>\n`;
|
|
119
|
-
}
|
|
120
|
-
content += ` </div>\n`;
|
|
121
|
-
// Narrative bridge to analytical outlook (inter-pillar transition)
|
|
122
|
-
const propTransition = getPillarTransition(lang, 'pulseToWatch');
|
|
123
|
-
if (propTransition) {
|
|
124
|
-
content += ` <p class="pillar-transition">${escapeHtml(propTransition)}</p>\n`;
|
|
125
|
-
}
|
|
126
|
-
// Deep Analysis section (5W framework + document analysis framework)
|
|
127
|
-
if (propositions.length >= 2) {
|
|
128
|
-
const { frameworkAnalysis, perspectiveAnalysis } = analyzeDocumentsForContent(propositions, lang, data.ciaContext);
|
|
129
|
-
content += generateDeepAnalysisSection({
|
|
130
|
-
documents: propositions,
|
|
131
|
-
lang,
|
|
132
|
-
cia: data.ciaContext,
|
|
133
|
-
articleType: 'propositions',
|
|
134
|
-
frameworkAnalysis,
|
|
135
|
-
perspectiveAnalysis,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
// ── Key takeaways: synthesize propositions batch ──────────────────────────
|
|
139
|
-
content += `\n <h2>${L(lang, 'keyTakeaways')}</h2>\n`;
|
|
140
|
-
content += ` <div class="context-box">\n <ul>\n`;
|
|
141
|
-
// Propositions batch overview
|
|
142
|
-
const committeeCountProp = Object.keys(byCommittee).filter(c => c !== 'unknown').length;
|
|
143
|
-
const propOverviewTemplates = {
|
|
144
|
-
sv: (p, c) => `${p} propositioner har hänvisats till ${c} utskott, vilket visar bredden i regeringens lagstiftningsambitioner.`,
|
|
145
|
-
da: (p, c) => `${p} lovforslag er henvist til ${c} udvalg, hvilket viser bredden i regeringens lovgivningsmæssige ambitioner.`,
|
|
146
|
-
no: (p, c) => `${p} proposisjoner er henvist til ${c} komiteer, noe som viser bredden i regjeringens lovgivningsmessige ambisjoner.`,
|
|
147
|
-
fi: (p, c) => `${p} esitystä on viitattu ${c} valiokuntaan, mikä kuvastaa hallituksen lainsäädännöllisten tavoitteiden laajuutta.`,
|
|
148
|
-
de: (p, c) => `${p} Vorlagen wurden an ${c} Ausschüsse verwiesen, was die Breite der Gesetzgebungsambitionen der Regierung zeigt.`,
|
|
149
|
-
fr: (p, c) => `${p} propositions ont été renvoyées à ${c} commissions, montrant l'ampleur des ambitions législatives du gouvernement.`,
|
|
150
|
-
es: (p, c) => `${p} proposiciones han sido remitidas a ${c} comités, mostrando la amplitud de las ambiciones legislativas del gobierno.`,
|
|
151
|
-
nl: (p, c) => `${p} voorstellen zijn verwezen naar ${c} commissies, wat de breedte van de wetgevende ambities van de regering toont.`,
|
|
152
|
-
ar: (p, c) => `تمت إحالة ${p} مقترحات إلى ${c} لجان، مما يُظهر نطاق الطموحات التشريعية الحكومية.`,
|
|
153
|
-
he: (p, c) => `${p} הצעות הופנו ל-${c} ועדות, המראות את רוחב השאיפות החקיקתיות של הממשלה.`,
|
|
154
|
-
ja: (p, c) => `${p}件の法案が${c}の委員会に付託され、政府の幅広い立法野心を示しています。`,
|
|
155
|
-
ko: (p, c) => `${p}건의 법안이 ${c}개 위원회에 회부되어 정부의 광범위한 입법 야심을 나타냅니다.`,
|
|
156
|
-
zh: (p, c) => `${p}项提案已交付${c}个委员会审议,显示政府广泛的立法雄心。`,
|
|
157
|
-
};
|
|
158
|
-
const propOverTpl = propOverviewTemplates[lang];
|
|
159
|
-
const propOverview = propOverTpl
|
|
160
|
-
? propOverTpl(propositions.length, committeeCountProp)
|
|
161
|
-
: `${propositions.length} propositions have been referred to ${committeeCountProp} committees, showing the breadth of the government's legislative ambitions.`;
|
|
162
|
-
content += ` <li>${escapeHtml(propOverview)}</li>\n`;
|
|
163
|
-
// Policy domain cross-analysis
|
|
164
|
-
if (allPropDomains.size > 0) {
|
|
165
|
-
const domainListProp = Array.from(allPropDomains).slice(0, 3).join(', ');
|
|
166
|
-
const propDomainTemplates = {
|
|
167
|
-
sv: d => `Propositionerna berör ${d} — ett mönster som avslöjar regeringens politikprioriteringar.`,
|
|
168
|
-
da: d => `Lovforslagene berører ${d} — et mønster der afdækker regeringens politiske prioriteringer.`,
|
|
169
|
-
no: d => `Proposisjonene berører ${d} — et mønster som avslører regjeringens politiske prioriteringer.`,
|
|
170
|
-
fi: d => `Esitykset kattavat ${d} — malli, joka paljastaa hallituksen poliittiset prioriteetit.`,
|
|
171
|
-
de: d => `Die Vorlagen betreffen ${d} — ein Muster, das die politischen Prioritäten der Regierung offenbart.`,
|
|
172
|
-
fr: d => `Les propositions touchent ${d} — un schéma révélant les priorités politiques du gouvernement.`,
|
|
173
|
-
es: d => `Las proposiciones abarcan ${d} — un patrón que revela las prioridades políticas del gobierno.`,
|
|
174
|
-
nl: d => `De voorstellen raken ${d} — een patroon dat de politieke prioriteiten van de regering onthult.`,
|
|
175
|
-
ar: d => `تمس المقترحات ${d} — نمط يكشف عن الأولويات السياسية للحكومة.`,
|
|
176
|
-
he: d => `ההצעות נוגעות ב${d} — תבנית החושפת את סדרי העדיפויות הפוליטיים של הממשלה.`,
|
|
177
|
-
ja: d => `法案は${d}に及び、政府の政策優先事項を明らかにしています。`,
|
|
178
|
-
ko: d => `법안은 ${d}에 걸쳐 있으며, 정부의 정책 우선순위를 드러냅니다.`,
|
|
179
|
-
zh: d => `提案涉及${d}——揭示了政府的政策优先事项。`,
|
|
180
|
-
};
|
|
181
|
-
const propDomTpl = propDomainTemplates[lang];
|
|
182
|
-
const propDomainAnalysis = propDomTpl
|
|
183
|
-
? propDomTpl(escapeHtml(domainListProp))
|
|
184
|
-
: `Propositions span ${escapeHtml(domainListProp)} — a pattern revealing the government's policy priorities.`;
|
|
185
|
-
content += ` <li>${propDomainAnalysis}</li>\n`;
|
|
186
|
-
}
|
|
187
|
-
content += ` </ul>\n </div>\n`;
|
|
188
|
-
// Display limits for enrichment sections
|
|
189
|
-
const MAX_DISPLAY_ITEMS = 3;
|
|
190
|
-
const MAX_SPEECH_PREVIEW_LENGTH = 200;
|
|
191
|
-
// ── Policy Substance section (from search_dokument_fulltext) ─────────────
|
|
192
|
-
const fullTextResults = data.fullTextResults;
|
|
193
|
-
if (fullTextResults && fullTextResults.length > 0) {
|
|
194
|
-
const policySubstanceHeadings = {
|
|
195
|
-
en: 'Policy Substance', sv: 'Politikinnehåll', da: 'Politisk indhold',
|
|
196
|
-
no: 'Politisk innhold', fi: 'Politiikan sisältö', de: 'Politischer Inhalt',
|
|
197
|
-
fr: 'Contenu politique', es: 'Contenido de la política', nl: 'Beleidsinhoud',
|
|
198
|
-
ar: 'مضمون السياسة', he: 'תוכן המדיניות', ja: '政策の内容', ko: '정책 내용', zh: '政策内容',
|
|
199
|
-
};
|
|
200
|
-
const psHeading = policySubstanceHeadings[lang] ?? policySubstanceHeadings['en'];
|
|
201
|
-
content += `\n <h2>${escapeHtml(psHeading)}</h2>\n`;
|
|
202
|
-
content += ` <div class="policy-substance">\n`;
|
|
203
|
-
for (const doc of fullTextResults.slice(0, MAX_DISPLAY_ITEMS)) {
|
|
204
|
-
const docTitle = escapeHtml(String(doc['titel'] ?? doc['title'] ?? ''));
|
|
205
|
-
const docSummary = escapeHtml(String(doc['summary'] ?? doc['notis'] ?? ''));
|
|
206
|
-
if (docTitle) {
|
|
207
|
-
content += ` <div class="fulltext-result"><strong>${docTitle}</strong>`;
|
|
208
|
-
if (docSummary)
|
|
209
|
-
content += `<p>${docSummary}</p>`;
|
|
210
|
-
content += `</div>\n`;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
content += ` </div>\n`;
|
|
214
|
-
}
|
|
215
|
-
// ── Department Impact section (from analyze_g0v_by_department) ───────────
|
|
216
|
-
const departmentAnalysis = data.departmentAnalysis;
|
|
217
|
-
const departments = departmentAnalysis
|
|
218
|
-
? (departmentAnalysis['departments'] ?? departmentAnalysis['dokument'] ?? [])
|
|
219
|
-
: [];
|
|
220
|
-
if (departments.length > 0) {
|
|
221
|
-
const departmentImpactHeadings = {
|
|
222
|
-
en: 'Department Impact', sv: 'Departementets påverkan', da: 'Ministerielt ansvar',
|
|
223
|
-
no: 'Departementspåvirkning', fi: 'Ministeriön vaikutus', de: 'Ressortverantwortung',
|
|
224
|
-
fr: 'Impact ministériel', es: 'Impacto ministerial', nl: 'Ministeriële impact',
|
|
225
|
-
ar: 'تأثير الوزارة', he: 'השפעת המשרד', ja: '省庁への影響', ko: '부처 영향', zh: '部门影响',
|
|
226
|
-
};
|
|
227
|
-
const diHeading = departmentImpactHeadings[lang] ?? departmentImpactHeadings['en'];
|
|
228
|
-
content += `\n <h2>${escapeHtml(diHeading)}</h2>\n`;
|
|
229
|
-
content += ` <div class="department-impact"><ul>\n`;
|
|
230
|
-
for (const dept of departments.slice(0, MAX_DISPLAY_ITEMS)) {
|
|
231
|
-
const deptName = escapeHtml(String(dept['departement'] ?? dept['name'] ?? dept['namn'] ?? ''));
|
|
232
|
-
const deptCount = Number(dept['count'] ?? dept['antal'] ?? 0);
|
|
233
|
-
if (deptName) {
|
|
234
|
-
content += ` <li>${deptName}${deptCount > 0 ? ` (${deptCount})` : ''}</li>\n`;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
content += ` </ul></div>\n`;
|
|
238
|
-
}
|
|
239
|
-
// ── Parliamentary Debate section (from search_anforanden) ─────────────────
|
|
240
|
-
const speechDebates = data.speechDebates;
|
|
241
|
-
if (speechDebates && speechDebates.length > 0) {
|
|
242
|
-
const parliamentaryDebateHeadings = {
|
|
243
|
-
en: 'Parliamentary Debate', sv: 'Parlamentarisk debatt', da: 'Parlamentarisk debat',
|
|
244
|
-
no: 'Parlamentarisk debatt', fi: 'Parlamentaarinen keskustelu', de: 'Parlamentarische Debatte',
|
|
245
|
-
fr: 'Débat parlementaire', es: 'Debate parlamentario', nl: 'Parlementair debat',
|
|
246
|
-
ar: 'النقاش البرلماني', he: 'דיון פרלמנטרי', ja: '議会討論', ko: '의회 토론', zh: '议会辩论',
|
|
247
|
-
};
|
|
248
|
-
const pdHeading = parliamentaryDebateHeadings[lang] ?? parliamentaryDebateHeadings['en'];
|
|
249
|
-
content += `\n <h2>${escapeHtml(pdHeading)}</h2>\n`;
|
|
250
|
-
content += ` <div class="debate-context">\n`;
|
|
251
|
-
for (const speech of speechDebates.slice(0, MAX_DISPLAY_ITEMS)) {
|
|
252
|
-
const speaker = escapeHtml(String(speech['talare'] ?? speech['speaker'] ?? ''));
|
|
253
|
-
const party = escapeHtml(String(speech['parti'] ?? speech['party'] ?? ''));
|
|
254
|
-
const text = escapeHtml(String(speech['anforandetext'] ?? speech['text'] ?? '').substring(0, MAX_SPEECH_PREVIEW_LENGTH));
|
|
255
|
-
if (speaker && text) {
|
|
256
|
-
content += ` <blockquote><p>${text}…</p><footer>— ${speaker}${party ? ` (${party})` : ''}</footer></blockquote>\n`;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
content += ` </div>\n`;
|
|
260
|
-
}
|
|
261
|
-
return content;
|
|
262
|
-
}
|
|
263
|
-
//# sourceMappingURL=propositions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"propositions.js","sourceRoot":"","sources":["../../../../scripts/data-transformers/content-generators/propositions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module data-transformers/content-generators/sankey-section
|
|
3
|
-
* @description Generates a Sankey (flow) chart as inline SVG — no JavaScript,
|
|
4
|
-
* no third-party libraries required.
|
|
5
|
-
*
|
|
6
|
-
* A Sankey diagram visualises quantities flowing from source nodes to target
|
|
7
|
-
* nodes. Node heights and flow-path widths are proportional to the values,
|
|
8
|
-
* making it easy to see dominant flows at a glance.
|
|
9
|
-
*
|
|
10
|
-
* Typical usage in deep-inspection articles:
|
|
11
|
-
* - Parliamentary flow: initiating party → document type → legislative outcome
|
|
12
|
-
* - Policy flow: policy domain → committee → outcome (passed/rejected/pending)
|
|
13
|
-
* - Budget flow: government programme → ministry → spending category
|
|
14
|
-
* - Data source flow: CIA / World Bank / SCB indicator → policy area → article insight
|
|
15
|
-
*
|
|
16
|
-
* Agentic workflows append the returned `TemplateSection` to `ArticleData.sections`.
|
|
17
|
-
*
|
|
18
|
-
* @author Hack23 AB
|
|
19
|
-
* @license Apache-2.0
|
|
20
|
-
*/
|
|
21
|
-
import type { Language } from '../../types/language.js';
|
|
22
|
-
import type { TemplateSection } from '../../types/article.js';
|
|
23
|
-
/** Pre-defined semantic color categories for Sankey nodes */
|
|
24
|
-
export type SankeyNodeColor = 'cyan' | 'magenta' | 'yellow' | 'green' | 'purple' | 'orange' | 'blue' | 'red';
|
|
25
|
-
/** A node in the Sankey diagram */
|
|
26
|
-
export interface SankeyNode {
|
|
27
|
-
/** Unique identifier (used in flows to reference source/target) */
|
|
28
|
-
id: string;
|
|
29
|
-
/** Display label */
|
|
30
|
-
label: string;
|
|
31
|
-
/** Semantic color */
|
|
32
|
-
color: SankeyNodeColor;
|
|
33
|
-
}
|
|
34
|
-
/** A directed flow between two nodes */
|
|
35
|
-
export interface SankeyFlow {
|
|
36
|
-
/** Source node id */
|
|
37
|
-
source: string;
|
|
38
|
-
/** Target node id */
|
|
39
|
-
target: string;
|
|
40
|
-
/** Flow magnitude (relative — all values scaled to fit the SVG height) */
|
|
41
|
-
value: number;
|
|
42
|
-
/** Optional label shown on the flow path */
|
|
43
|
-
label?: string;
|
|
44
|
-
}
|
|
45
|
-
/** Options for the Sankey section generator */
|
|
46
|
-
export interface SankeySectionOptions {
|
|
47
|
-
/** Array of nodes (must have at least two: one source, one target) */
|
|
48
|
-
nodes: SankeyNode[];
|
|
49
|
-
/** Array of directed flows between nodes */
|
|
50
|
-
flows: SankeyFlow[];
|
|
51
|
-
/** Target language for labels */
|
|
52
|
-
lang: Language | string;
|
|
53
|
-
/** Optional section title override */
|
|
54
|
-
title?: string;
|
|
55
|
-
/** Optional narrative summary */
|
|
56
|
-
summary?: string;
|
|
57
|
-
/** SVG canvas height in px (default: 340) */
|
|
58
|
-
svgHeight?: number;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Generate a color-coded Sankey flow chart as inline SVG.
|
|
62
|
-
*
|
|
63
|
-
* Returns a `TemplateSection` with an embedded responsive SVG. No client-side
|
|
64
|
-
* JavaScript is required. An accessible `<table>` with `sr-only` class is
|
|
65
|
-
* included as a fallback for screen readers and search engines.
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* ```ts
|
|
69
|
-
* const section = generateSankeySection({
|
|
70
|
-
* lang: 'en',
|
|
71
|
-
* nodes: [
|
|
72
|
-
* { id: 'gov', label: 'Government', color: 'cyan' },
|
|
73
|
-
* { id: 'opp', label: 'Opposition', color: 'magenta' },
|
|
74
|
-
* { id: 'prop', label: 'Propositions', color: 'orange' },
|
|
75
|
-
* { id: 'mot', label: 'Motions', color: 'purple' },
|
|
76
|
-
* { id: 'passed', label: 'Passed', color: 'green' },
|
|
77
|
-
* { id: 'rejected', label: 'Rejected/Shelved', color: 'red' },
|
|
78
|
-
* ],
|
|
79
|
-
* flows: [
|
|
80
|
-
* { source: 'gov', target: 'prop', value: 12, label: '2024 props' },
|
|
81
|
-
* { source: 'opp', target: 'mot', value: 35, label: '2024 mots' },
|
|
82
|
-
* { source: 'prop', target: 'passed', value: 10 },
|
|
83
|
-
* { source: 'prop', target: 'rejected', value: 2 },
|
|
84
|
-
* { source: 'mot', target: 'passed', value: 5 },
|
|
85
|
-
* { source: 'mot', target: 'rejected', value: 30 },
|
|
86
|
-
* ],
|
|
87
|
-
* });
|
|
88
|
-
* articleData.sections = [...(articleData.sections ?? []), section];
|
|
89
|
-
* ```
|
|
90
|
-
*/
|
|
91
|
-
export declare function generateSankeySection(opts: SankeySectionOptions): TemplateSection;
|
|
92
|
-
//# sourceMappingURL=sankey-section.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sankey-section.d.ts","sourceRoot":"","sources":["../../../../scripts/data-transformers/content-generators/sankey-section.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,KAAK,CAAC;AAEV,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,4CAA4C;IAC5C,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,iCAAiC;IACjC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,eAAe,CAmCjF"}
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module data-transformers/content-generators/sankey-section
|
|
3
|
-
* @description Generates a Sankey (flow) chart as inline SVG — no JavaScript,
|
|
4
|
-
* no third-party libraries required.
|
|
5
|
-
*
|
|
6
|
-
* A Sankey diagram visualises quantities flowing from source nodes to target
|
|
7
|
-
* nodes. Node heights and flow-path widths are proportional to the values,
|
|
8
|
-
* making it easy to see dominant flows at a glance.
|
|
9
|
-
*
|
|
10
|
-
* Typical usage in deep-inspection articles:
|
|
11
|
-
* - Parliamentary flow: initiating party → document type → legislative outcome
|
|
12
|
-
* - Policy flow: policy domain → committee → outcome (passed/rejected/pending)
|
|
13
|
-
* - Budget flow: government programme → ministry → spending category
|
|
14
|
-
* - Data source flow: CIA / World Bank / SCB indicator → policy area → article insight
|
|
15
|
-
*
|
|
16
|
-
* Agentic workflows append the returned `TemplateSection` to `ArticleData.sections`.
|
|
17
|
-
*
|
|
18
|
-
* @author Hack23 AB
|
|
19
|
-
* @license Apache-2.0
|
|
20
|
-
*/
|
|
21
|
-
import { escapeHtml } from '../../html-utils.js';
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
// Color palette (cyberpunk theme)
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
const NODE_COLORS = {
|
|
26
|
-
cyan: { fill: '#003344', stroke: '#00d9ff', text: '#00d9ff' },
|
|
27
|
-
magenta: { fill: '#330011', stroke: '#ff006e', text: '#ff006e' },
|
|
28
|
-
yellow: { fill: '#332200', stroke: '#ffbe0b', text: '#ffbe0b' },
|
|
29
|
-
green: { fill: '#003300', stroke: '#83cf39', text: '#83cf39' },
|
|
30
|
-
purple: { fill: '#1a0033', stroke: '#9d4edd', text: '#9d4edd' },
|
|
31
|
-
orange: { fill: '#331500', stroke: '#f77f00', text: '#f77f00' },
|
|
32
|
-
blue: { fill: '#001133', stroke: '#4895ef', text: '#4895ef' },
|
|
33
|
-
red: { fill: '#330000', stroke: '#e63946', text: '#e63946' },
|
|
34
|
-
};
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Section title labels (14 languages)
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
const SECTION_TITLES = {
|
|
39
|
-
en: 'Policy Flow (Sankey)',
|
|
40
|
-
sv: 'Politikflöde (Sankey)',
|
|
41
|
-
da: 'Politikflow (Sankey)',
|
|
42
|
-
no: 'Politikkflyt (Sankey)',
|
|
43
|
-
fi: 'Politiikkavirta (Sankey)',
|
|
44
|
-
de: 'Politikfluss (Sankey)',
|
|
45
|
-
fr: 'Flux de politique (Sankey)',
|
|
46
|
-
es: 'Flujo de política (Sankey)',
|
|
47
|
-
nl: 'Beleidsflow (Sankey)',
|
|
48
|
-
ar: 'تدفق السياسات (سانكي)',
|
|
49
|
-
he: 'זרימת מדיניות (סנקי)',
|
|
50
|
-
ja: '政策フロー (Sankey)',
|
|
51
|
-
ko: '정책 흐름 (Sankey)',
|
|
52
|
-
zh: '政策流向图 (Sankey)',
|
|
53
|
-
};
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
// SVG layout engine
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
const SVG_WIDTH = 600;
|
|
58
|
-
const NODE_WIDTH = 22;
|
|
59
|
-
const NODE_GAP = 14; // gap between nodes on the same column
|
|
60
|
-
const COL_LEFT = 20; // x-position of source column
|
|
61
|
-
const COL_RIGHT = SVG_WIDTH - NODE_WIDTH - 20; // x-position of target column
|
|
62
|
-
/** Scale a bezier cubic SVG path between two columns */
|
|
63
|
-
function buildBezierPath(x1, y1, x2, y2, h) {
|
|
64
|
-
const mx = (x1 + x2) / 2;
|
|
65
|
-
return [
|
|
66
|
-
`M${x1},${y1}`,
|
|
67
|
-
`C${mx},${y1} ${mx},${y2} ${x2},${y2}`,
|
|
68
|
-
`L${x2},${y2 + h}`,
|
|
69
|
-
`C${mx},${y2 + h} ${mx},${y1 + h} ${x1},${y1 + h}`,
|
|
70
|
-
'Z',
|
|
71
|
-
].join(' ');
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Compute SVG layout for the Sankey diagram.
|
|
75
|
-
* Returns an array of SVG element strings.
|
|
76
|
-
*/
|
|
77
|
-
function layoutSankey(nodes, flows, svgHeight) {
|
|
78
|
-
// --- Determine source vs target sets ---
|
|
79
|
-
const sourceIds = new Set(flows.map(f => f.source));
|
|
80
|
-
const targetIds = new Set(flows.map(f => f.target));
|
|
81
|
-
// --- Compute total flow value per node ---
|
|
82
|
-
const valuePer = {};
|
|
83
|
-
for (const f of flows) {
|
|
84
|
-
valuePer[f.source] = (valuePer[f.source] ?? 0) + f.value;
|
|
85
|
-
valuePer[f.target] = (valuePer[f.target] ?? 0) + f.value;
|
|
86
|
-
}
|
|
87
|
-
const totalValue = Object.values(valuePer).reduce((a, b) => a + b, 0) || 1;
|
|
88
|
-
// --- Scale factor: map node totalValue to SVG height ---
|
|
89
|
-
const usableHeight = svgHeight - 40; // top/bottom margin
|
|
90
|
-
const scaleFactor = usableHeight / (totalValue / 2 + (nodes.length - 1) * NODE_GAP);
|
|
91
|
-
// --- Separate source-only vs target-only vs both ---
|
|
92
|
-
const srcOnlyNodes = nodes.filter(n => sourceIds.has(n.id) && !targetIds.has(n.id));
|
|
93
|
-
const tgtOnlyNodes = nodes.filter(n => targetIds.has(n.id) && !sourceIds.has(n.id));
|
|
94
|
-
const bothNodes = nodes.filter(n => sourceIds.has(n.id) && targetIds.has(n.id));
|
|
95
|
-
// Nodes that appear only as targets go to right column;
|
|
96
|
-
// nodes that appear only as sources go to left column;
|
|
97
|
-
// nodes in both go to left column (they drive flows to the right).
|
|
98
|
-
const leftNodes = [...srcOnlyNodes, ...bothNodes];
|
|
99
|
-
const rightNodes = [...tgtOnlyNodes];
|
|
100
|
-
/** Place a set of nodes vertically, returning LayoutNode array */
|
|
101
|
-
function placeNodes(nds) {
|
|
102
|
-
const result = [];
|
|
103
|
-
let yOffset = 20;
|
|
104
|
-
for (const n of nds) {
|
|
105
|
-
const total = valuePer[n.id] ?? 0;
|
|
106
|
-
const height = Math.max(18, Math.round(total * scaleFactor));
|
|
107
|
-
result.push({
|
|
108
|
-
...n,
|
|
109
|
-
totalValue: total,
|
|
110
|
-
y: yOffset,
|
|
111
|
-
height,
|
|
112
|
-
isSource: sourceIds.has(n.id),
|
|
113
|
-
isTarget: targetIds.has(n.id),
|
|
114
|
-
srcOffset: 0,
|
|
115
|
-
tgtOffset: 0,
|
|
116
|
-
color: n.color,
|
|
117
|
-
});
|
|
118
|
-
yOffset += height + NODE_GAP;
|
|
119
|
-
}
|
|
120
|
-
return result;
|
|
121
|
-
}
|
|
122
|
-
const leftLayout = placeNodes(leftNodes);
|
|
123
|
-
const rightLayout = placeNodes(rightNodes);
|
|
124
|
-
const allLayout = [...leftLayout, ...rightLayout];
|
|
125
|
-
const layoutMap = new Map(allLayout.map(n => [n.id, n]));
|
|
126
|
-
// --- Build flow paths ---
|
|
127
|
-
const svgElements = [];
|
|
128
|
-
// Render nodes first (behind flows)
|
|
129
|
-
for (const ln of allLayout) {
|
|
130
|
-
const palette = NODE_COLORS[ln.color] ?? NODE_COLORS.cyan;
|
|
131
|
-
const isLeft = leftLayout.some(l => l.id === ln.id);
|
|
132
|
-
const xPos = isLeft ? COL_LEFT : COL_RIGHT;
|
|
133
|
-
const labelX = isLeft ? xPos + NODE_WIDTH + 6 : xPos - 6;
|
|
134
|
-
const textAnchor = isLeft ? 'start' : 'end';
|
|
135
|
-
svgElements.push(`<rect x="${xPos}" y="${ln.y}" width="${NODE_WIDTH}" height="${ln.height}"
|
|
136
|
-
fill="${palette.fill}" stroke="${palette.stroke}" stroke-width="2" rx="3"/>`, `<text x="${labelX}" y="${ln.y + ln.height / 2}" text-anchor="${textAnchor}" dominant-baseline="middle"
|
|
137
|
-
font-size="11" fill="${palette.text}" font-family="monospace">${escapeHtml(ln.label)}</text>`);
|
|
138
|
-
}
|
|
139
|
-
// Render flow paths (on top of node labels but behind we'll keep z-order via SVG)
|
|
140
|
-
for (const flow of flows) {
|
|
141
|
-
const srcNode = layoutMap.get(flow.source);
|
|
142
|
-
const tgtNode = layoutMap.get(flow.target);
|
|
143
|
-
if (!srcNode || !tgtNode)
|
|
144
|
-
continue;
|
|
145
|
-
const srcPalette = NODE_COLORS[srcNode.color] ?? NODE_COLORS.cyan;
|
|
146
|
-
const tgtVal = valuePer[tgtNode.id] ?? 1;
|
|
147
|
-
const scaledH = Math.max(4, Math.round((flow.value / Math.max(tgtVal, valuePer[srcNode.id] ?? 1)) * (srcNode.height + tgtNode.height) / 2));
|
|
148
|
-
const srcIsLeft = leftLayout.some(l => l.id === srcNode.id);
|
|
149
|
-
const tgtIsLeft = leftLayout.some(l => l.id === tgtNode.id);
|
|
150
|
-
const x1 = srcIsLeft ? COL_LEFT + NODE_WIDTH : COL_RIGHT;
|
|
151
|
-
const x2 = tgtIsLeft ? COL_LEFT : COL_RIGHT + NODE_WIDTH;
|
|
152
|
-
const y1 = srcNode.y + srcNode.srcOffset;
|
|
153
|
-
const y2 = tgtNode.y + tgtNode.tgtOffset;
|
|
154
|
-
srcNode.srcOffset += scaledH + 2;
|
|
155
|
-
tgtNode.tgtOffset += scaledH + 2;
|
|
156
|
-
const pathD = buildBezierPath(x1, y1, x2, y2, scaledH);
|
|
157
|
-
svgElements.push(`<path d="${pathD}" fill="${srcPalette.stroke}44" stroke="${srcPalette.stroke}" stroke-width="0.5" opacity="0.8"/>`);
|
|
158
|
-
// Mid-label
|
|
159
|
-
if (flow.label) {
|
|
160
|
-
const midX = SVG_WIDTH / 2;
|
|
161
|
-
const midY = (y1 + y2) / 2 + scaledH / 2;
|
|
162
|
-
svgElements.push(`<text x="${midX}" y="${midY}" text-anchor="middle" dominant-baseline="middle"
|
|
163
|
-
font-size="9" fill="#cccccc" font-family="monospace">${escapeHtml(flow.label)}</text>`);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return svgElements;
|
|
167
|
-
}
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
// Accessible table fallback
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
|
-
function renderFallbackTable(nodes, flows) {
|
|
172
|
-
const sourceLabel = 'Source';
|
|
173
|
-
const targetLabel = 'Target';
|
|
174
|
-
const valueLabel = 'Value';
|
|
175
|
-
const rows = flows.map(f => {
|
|
176
|
-
const srcNode = nodes.find(n => n.id === f.source);
|
|
177
|
-
const tgtNode = nodes.find(n => n.id === f.target);
|
|
178
|
-
return ` <tr>
|
|
179
|
-
<td>${escapeHtml(srcNode?.label ?? f.source)}</td>
|
|
180
|
-
<td>${escapeHtml(tgtNode?.label ?? f.target)}</td>
|
|
181
|
-
<td>${f.value}</td>
|
|
182
|
-
${f.label ? `<td>${escapeHtml(f.label)}</td>` : '<td></td>'}
|
|
183
|
-
</tr>`;
|
|
184
|
-
}).join('\n');
|
|
185
|
-
return `<table class="sankey-fallback-table sr-only" aria-label="Sankey data">
|
|
186
|
-
<caption>Flow data</caption>
|
|
187
|
-
<thead><tr><th>${sourceLabel}</th><th>${targetLabel}</th><th>${valueLabel}</th><th>Note</th></tr></thead>
|
|
188
|
-
<tbody>
|
|
189
|
-
${rows}
|
|
190
|
-
</tbody>
|
|
191
|
-
</table>`;
|
|
192
|
-
}
|
|
193
|
-
// ---------------------------------------------------------------------------
|
|
194
|
-
// Public API
|
|
195
|
-
// ---------------------------------------------------------------------------
|
|
196
|
-
/**
|
|
197
|
-
* Generate a color-coded Sankey flow chart as inline SVG.
|
|
198
|
-
*
|
|
199
|
-
* Returns a `TemplateSection` with an embedded responsive SVG. No client-side
|
|
200
|
-
* JavaScript is required. An accessible `<table>` with `sr-only` class is
|
|
201
|
-
* included as a fallback for screen readers and search engines.
|
|
202
|
-
*
|
|
203
|
-
* @example
|
|
204
|
-
* ```ts
|
|
205
|
-
* const section = generateSankeySection({
|
|
206
|
-
* lang: 'en',
|
|
207
|
-
* nodes: [
|
|
208
|
-
* { id: 'gov', label: 'Government', color: 'cyan' },
|
|
209
|
-
* { id: 'opp', label: 'Opposition', color: 'magenta' },
|
|
210
|
-
* { id: 'prop', label: 'Propositions', color: 'orange' },
|
|
211
|
-
* { id: 'mot', label: 'Motions', color: 'purple' },
|
|
212
|
-
* { id: 'passed', label: 'Passed', color: 'green' },
|
|
213
|
-
* { id: 'rejected', label: 'Rejected/Shelved', color: 'red' },
|
|
214
|
-
* ],
|
|
215
|
-
* flows: [
|
|
216
|
-
* { source: 'gov', target: 'prop', value: 12, label: '2024 props' },
|
|
217
|
-
* { source: 'opp', target: 'mot', value: 35, label: '2024 mots' },
|
|
218
|
-
* { source: 'prop', target: 'passed', value: 10 },
|
|
219
|
-
* { source: 'prop', target: 'rejected', value: 2 },
|
|
220
|
-
* { source: 'mot', target: 'passed', value: 5 },
|
|
221
|
-
* { source: 'mot', target: 'rejected', value: 30 },
|
|
222
|
-
* ],
|
|
223
|
-
* });
|
|
224
|
-
* articleData.sections = [...(articleData.sections ?? []), section];
|
|
225
|
-
* ```
|
|
226
|
-
*/
|
|
227
|
-
export function generateSankeySection(opts) {
|
|
228
|
-
const { nodes, flows, lang } = opts;
|
|
229
|
-
const svgHeight = opts.svgHeight ?? 340;
|
|
230
|
-
const titleText = opts.title?.trim() || SECTION_TITLES[lang] || SECTION_TITLES.en;
|
|
231
|
-
const summaryBlock = opts.summary?.trim()
|
|
232
|
-
? ` <p class="sankey-summary">${escapeHtml(opts.summary.trim())}</p>\n`
|
|
233
|
-
: '';
|
|
234
|
-
// Generate SVG elements
|
|
235
|
-
const svgElements = layoutSankey(nodes, flows, svgHeight);
|
|
236
|
-
const svgContent = svgElements.join('\n ');
|
|
237
|
-
const fallbackTable = renderFallbackTable(nodes, flows);
|
|
238
|
-
const html = `<section class="sankey-section" aria-label="${escapeHtml(titleText)}">
|
|
239
|
-
<h2>${escapeHtml(titleText)}</h2>
|
|
240
|
-
${summaryBlock} <div class="sankey-chart-wrapper">
|
|
241
|
-
<svg viewBox="0 0 ${SVG_WIDTH} ${svgHeight}" xmlns="http://www.w3.org/2000/svg"
|
|
242
|
-
role="img" aria-label="${escapeHtml(titleText)}"
|
|
243
|
-
style="width:100%;height:auto;max-width:${SVG_WIDTH}px;display:block;">
|
|
244
|
-
<title>${escapeHtml(titleText)}</title>
|
|
245
|
-
<rect width="${SVG_WIDTH}" height="${svgHeight}" fill="#0a0e27" rx="8"/>
|
|
246
|
-
${svgContent}
|
|
247
|
-
</svg>
|
|
248
|
-
</div>
|
|
249
|
-
${fallbackTable}
|
|
250
|
-
</section>`;
|
|
251
|
-
return {
|
|
252
|
-
id: 'sankey-section',
|
|
253
|
-
html,
|
|
254
|
-
className: 'sankey-section-wrapper',
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
//# sourceMappingURL=sankey-section.js.map
|