jekyll-open-sdg-plugins 1.8.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jekyll-open-sdg-plugins/backwards_compatibility.rb +5 -33
- data/lib/jekyll-open-sdg-plugins/create_goals.rb +4 -17
- data/lib/jekyll-open-sdg-plugins/create_indicators.rb +9 -28
- data/lib/jekyll-open-sdg-plugins/create_pages.rb +20 -27
- data/lib/jekyll-open-sdg-plugins/fetch_remote_data.rb +29 -88
- data/lib/jekyll-open-sdg-plugins/helpers.rb +61 -14
- data/lib/jekyll-open-sdg-plugins/schema-site-config.json +7 -196
- data/lib/jekyll-open-sdg-plugins/sdg_variables.rb +6 -29
- data/lib/jekyll-open-sdg-plugins/site_configuration.rb +5 -0
- data/lib/jekyll-open-sdg-plugins/translate_date.rb +4 -16
- data/lib/jekyll-open-sdg-plugins/translate_key.rb +28 -2
- data/lib/jekyll-open-sdg-plugins/validate_indicator_config.rb +1 -5
- data/lib/jekyll-open-sdg-plugins/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 223b4a55da18c4e20ce1e07823c71ea9e12a935598dcbefe39eb37c4246f2757
|
4
|
+
data.tar.gz: 377bc37c6b248fd74f7762bfea0d26ca54ec023d5359da05ade3ce4385fdb204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79d8089c8c040c0bd4fdff209e95ffd54adffa8b929dc1f4804a0c0c1a5b471728f73104d784ce50ed94af12f861764706823d01386ed4aa561a4b462dfa719a
|
7
|
+
data.tar.gz: 33fe8ac6009c5807c5036fdc539ec60300548560e4f8d09dd05560cb06e11ea038ea183c18f8e15ff3ed63ed9960999fb2cd4cbeac6ecdc002c0bc5b2bd1c061
|
@@ -25,6 +25,11 @@ module JekyllOpenSdgPlugins
|
|
25
25
|
# as the Open SDG API changes over time.
|
26
26
|
def generate(site)
|
27
27
|
|
28
|
+
# Abort if some configurations from 1.x are still being used.
|
29
|
+
if (site.config.has_key?('metadata_tabs') && site.config['metadata_tabs'].is_a?(Hash))
|
30
|
+
opensdg_error('The metadata_tabs setting is not in the correct format. Please consult the latest documentation: https://open-sdg.readthedocs.io/en/latest/configuration/#metadata_tabs')
|
31
|
+
end
|
32
|
+
|
28
33
|
# Handle legacy treatment of reporting status types.
|
29
34
|
unless (site.config.has_key?('reporting_status') &&
|
30
35
|
site.config['reporting_status'].has_key?('status_types') &&
|
@@ -59,39 +64,6 @@ module JekyllOpenSdgPlugins
|
|
59
64
|
add_translation_keys(goal['statuses'], site)
|
60
65
|
end
|
61
66
|
end
|
62
|
-
|
63
|
-
# Print warnings for settings that are deprecated
|
64
|
-
# and will be removed in version 2.0.0.
|
65
|
-
if !site.config.has_key?('accessible_charts') || !site.config['accessible_charts']
|
66
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the accessible_charts setting will be automatically set to true.')
|
67
|
-
end
|
68
|
-
if !site.config.has_key?('accessible_tabs') || !site.config['accessible_tabs']
|
69
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the accessible_tabs setting will be automatically set to true.')
|
70
|
-
end
|
71
|
-
if !site.config.has_key?('contrast_type') || site.config['contrast_type'] != 'single'
|
72
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the contrast_type setting will be automatically set to "single".')
|
73
|
-
end
|
74
|
-
if site.config.has_key?('create_goals') && site.config['create_goals']['layout'] != 'goal-with-progress'
|
75
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the create_goals.layout setting will be removed, because there will only be a single option for goal layouts. To see a preview, set "bootstrap_5" to "true".')
|
76
|
-
end
|
77
|
-
if !site.config.has_key?('favicons') || site.config['favicons'] != 'favicon.io'
|
78
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the favicons setting will be automatically set to "favicon.io".')
|
79
|
-
end
|
80
|
-
if site.config.has_key?('frontpage_heading') && site.config['frontpage_heading'] != ''
|
81
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the "frontpage_heading" setting will no longer be used.')
|
82
|
-
end
|
83
|
-
if site.config.has_key?('frontpage_instructions') && site.config['frontpage_instructions'] != ''
|
84
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the "frontpage_instructions" setting will no longer be used.')
|
85
|
-
end
|
86
|
-
if site.config.has_key?('header') && site.config['header']['include'] != 'header-menu-left-aligned.html'
|
87
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the "header.include" setting will no longer be used because there will only be a single option for headers. To see what this will look like, set "bootstrap_5" to "true".')
|
88
|
-
end
|
89
|
-
if site.config.has_key?('non_global_metadata') && site.config['non_global_metadata'] != ''
|
90
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the "non_global_metadata" setting will be removed. Please use the "metadata_tabs" setting to control the labels of the metadata tabs.')
|
91
|
-
end
|
92
|
-
if !site.config.has_key?('series_toggle') || !site.config['series_toggle']
|
93
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the "series_toggle" will be automatically set to "true". In order to keep the "false" behavior, please rename your "Series" column to something else.')
|
94
|
-
end
|
95
67
|
end
|
96
68
|
end
|
97
69
|
end
|
@@ -8,20 +8,12 @@ module JekyllOpenSdgPlugins
|
|
8
8
|
|
9
9
|
def generate(site)
|
10
10
|
# If site.create_goals is set, create goals per the metadata.
|
11
|
-
if site.config['languages'] and site.config['create_goals']
|
11
|
+
if site.config['languages'] and site.config['create_goals']
|
12
12
|
# Compile the list of goals.
|
13
13
|
goals = {}
|
14
|
-
# Are we using translated builds?
|
15
14
|
metadata = {}
|
16
|
-
|
17
|
-
|
18
|
-
# language codes. We just use the first language.
|
19
|
-
default_language = site.config['languages'][0]
|
20
|
-
metadata = site.data[default_language]['meta']
|
21
|
-
else
|
22
|
-
# Otherwise the 'meta' data is not underneath any language code.
|
23
|
-
metadata = site.data['meta']
|
24
|
-
end
|
15
|
+
default_language = site.config['languages'][0]
|
16
|
+
metadata = site.data[default_language]['meta']
|
25
17
|
metadata.each do |inid, indicator|
|
26
18
|
if indicator.has_key?('standalone') and indicator['standalone']
|
27
19
|
next
|
@@ -30,7 +22,7 @@ module JekyllOpenSdgPlugins
|
|
30
22
|
goals[goal] = true
|
31
23
|
end
|
32
24
|
# Decide what layout to use for the goal pages.
|
33
|
-
layout =
|
25
|
+
layout = 'goal'
|
34
26
|
# See if we need to "map" any language codes.
|
35
27
|
languages_public = Hash.new
|
36
28
|
if site.config['languages_public']
|
@@ -78,11 +70,6 @@ module JekyllOpenSdgPlugins
|
|
78
70
|
self.data['goal_number'] = goal.to_s
|
79
71
|
self.data['language'] = language
|
80
72
|
self.data['layout'] = layout
|
81
|
-
if site.config['bootstrap_5']
|
82
|
-
self.data['layout'] = 'goal-bootstrap5'
|
83
|
-
end
|
84
|
-
# Backwards compatibility:
|
85
|
-
self.data['sdg_goal'] = self.data['goal_number']
|
86
73
|
end
|
87
74
|
end
|
88
75
|
end
|
@@ -16,9 +16,9 @@ module JekyllOpenSdgPlugins
|
|
16
16
|
|
17
17
|
translations = site.data['translations']
|
18
18
|
# If site.create_indicators is set, create indicators per the metadata.
|
19
|
-
if (language_config and indicator_config
|
19
|
+
if (language_config and indicator_config)
|
20
20
|
# Decide what layout to use for the indicator pages.
|
21
|
-
layout =
|
21
|
+
layout = 'indicator'
|
22
22
|
# See if we need to "map" any language codes.
|
23
23
|
languages_public = Hash.new
|
24
24
|
if site.config['languages_public']
|
@@ -32,14 +32,7 @@ module JekyllOpenSdgPlugins
|
|
32
32
|
language_public = languages_public[language]
|
33
33
|
end
|
34
34
|
metadata = {}
|
35
|
-
|
36
|
-
# If we are using translated builds, the metadata is underneath a
|
37
|
-
# language code.
|
38
|
-
metadata = site.data[language]['meta']
|
39
|
-
else
|
40
|
-
# Otherwise the 'meta' data is not underneath any language code.
|
41
|
-
metadata = site.data['meta']
|
42
|
-
end
|
35
|
+
metadata = site.data[language]['meta']
|
43
36
|
# Loop through the indicators (using metadata as a list).
|
44
37
|
metadata.each do |inid, meta|
|
45
38
|
permalink = inid
|
@@ -61,24 +54,17 @@ module JekyllOpenSdgPlugins
|
|
61
54
|
if do_indicator_config_forms || do_indicator_meta_forms || do_indicator_data_forms
|
62
55
|
|
63
56
|
metadata = {}
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
else
|
68
|
-
default_language = language_config[0]
|
69
|
-
metadata = site.data[default_language]['meta']
|
70
|
-
end
|
57
|
+
|
58
|
+
if site.data.has_key?('untranslated')
|
59
|
+
metadata = site.data['untranslated']['meta']
|
71
60
|
else
|
72
|
-
|
61
|
+
default_language = language_config[0]
|
62
|
+
metadata = site.data[default_language]['meta']
|
73
63
|
end
|
74
64
|
|
75
65
|
metadata_by_language = {}
|
76
66
|
language_config.each do |language|
|
77
|
-
|
78
|
-
metadata_by_language[language] = site.data[language]['meta']
|
79
|
-
else
|
80
|
-
metadata_by_language[language] = site.data['meta']
|
81
|
-
end
|
67
|
+
metadata_by_language[language] = site.data[language]['meta']
|
82
68
|
end
|
83
69
|
|
84
70
|
# Because we have config forms for indicator config or meta/data, we
|
@@ -158,12 +144,7 @@ module JekyllOpenSdgPlugins
|
|
158
144
|
self.data = {}
|
159
145
|
self.data['indicator_number'] = inid.gsub('-', '.')
|
160
146
|
self.data['layout'] = layout
|
161
|
-
if site.config['bootstrap_5']
|
162
|
-
self.data['layout'] = 'indicator-bootstrap5'
|
163
|
-
end
|
164
147
|
self.data['language'] = language
|
165
|
-
# Backwards compatibility:
|
166
|
-
self.data['indicator'] = self.data['indicator_number']
|
167
148
|
end
|
168
149
|
end
|
169
150
|
|
@@ -33,20 +33,11 @@ module JekyllOpenSdgPlugins
|
|
33
33
|
if (site.config['languages'] and site.config['create_pages'])
|
34
34
|
|
35
35
|
default_pages = [
|
36
|
-
{
|
37
|
-
'folder' => '/',
|
38
|
-
'layout' => 'frontpage'
|
39
|
-
},
|
40
36
|
{
|
41
37
|
'folder' => '/reporting-status',
|
42
38
|
'layout' => 'reportingstatus',
|
43
39
|
'title' => 'status.reporting_status',
|
44
40
|
},
|
45
|
-
{
|
46
|
-
'filename' => 'indicators.json',
|
47
|
-
'folder' => '/',
|
48
|
-
'layout' => 'indicator-json',
|
49
|
-
},
|
50
41
|
{
|
51
42
|
'folder' => '/search',
|
52
43
|
'layout' => 'search',
|
@@ -55,21 +46,32 @@ module JekyllOpenSdgPlugins
|
|
55
46
|
]
|
56
47
|
pages = default_pages
|
57
48
|
if (site.config['create_pages'].is_a?(Hash) and site.config['create_pages'].key?('pages'))
|
58
|
-
|
59
|
-
pages = site.config['create_pages']['pages']
|
60
|
-
elsif site.config['create_pages'].is_a?(Array)
|
61
|
-
pages = site.config['create_pages']
|
49
|
+
opensdg_error('The create_pages setting is not in the correct format. Please consult the latest documentation: https://open-sdg.readthedocs.io/en/latest/configuration/#create_pages')
|
62
50
|
end
|
63
|
-
|
64
|
-
|
65
|
-
if page['layout'] == 'frontpage'
|
66
|
-
opensdg_notice('DEPRECATION NOTICE: In Open SDG 2.0.0, the "frontpage" layout will change. To see a preview, set "bootstrap_5" to "true".')
|
67
|
-
end
|
51
|
+
if site.config['create_pages'].is_a?(Array)
|
52
|
+
pages = site.config['create_pages']
|
68
53
|
end
|
69
54
|
|
70
55
|
# Clone pages so that we don't edit the original.
|
71
56
|
pages = pages.clone
|
72
57
|
|
58
|
+
# Automate the frontpage and indicators.json if not already there.
|
59
|
+
frontpage = pages.find { |page| page['folder'] == '/' && page['filename'] == nil }
|
60
|
+
if frontpage == nil || frontpage['layout'] == 'frontpage-alt'
|
61
|
+
pages.push({
|
62
|
+
'folder' => '/',
|
63
|
+
'layout' => 'frontpage',
|
64
|
+
})
|
65
|
+
end
|
66
|
+
indicatorjson = pages.find { |page| page['layout'] == 'indicator-json' }
|
67
|
+
if indicatorjson == nil
|
68
|
+
pages.push({
|
69
|
+
'folder' => '/',
|
70
|
+
'layout' => 'indicator-json',
|
71
|
+
'filename' => 'indicators.json'
|
72
|
+
})
|
73
|
+
end
|
74
|
+
|
73
75
|
# Hardcode the site configuration page if it's not already there.
|
74
76
|
form_settings = site.config['site_config_form']
|
75
77
|
config_page = pages.find { |page| page['layout'] == 'config-builder' }
|
@@ -136,15 +138,6 @@ module JekyllOpenSdgPlugins
|
|
136
138
|
self.data[key] = value
|
137
139
|
end
|
138
140
|
end
|
139
|
-
|
140
|
-
if site.config['bootstrap_5']
|
141
|
-
if page.has_key?('layout') && page['layout'] == 'reportingstatus'
|
142
|
-
self.data['layout'] = 'reportingstatus-bootstrap5'
|
143
|
-
end
|
144
|
-
if page.has_key?('layout') && page['layout'] == 'frontpage'
|
145
|
-
self.data['layout'] = 'frontpage-alt'
|
146
|
-
end
|
147
|
-
end
|
148
141
|
end
|
149
142
|
end
|
150
143
|
end
|
@@ -59,27 +59,6 @@ module JekyllOpenSdgPlugins
|
|
59
59
|
return build
|
60
60
|
end
|
61
61
|
|
62
|
-
# Predict (before data has been fetched) whether the site is using
|
63
|
-
# translated builds or not.
|
64
|
-
def site_uses_translated_builds(path)
|
65
|
-
|
66
|
-
is_remote = opensdg_is_path_remote(path)
|
67
|
-
endpoints = get_endpoints()
|
68
|
-
# For a quick test, we just use 'meta'.
|
69
|
-
meta = endpoints['meta']
|
70
|
-
endpoint = is_remote ? path + '/' + meta : File.join(path, fix_path(meta))
|
71
|
-
|
72
|
-
begin
|
73
|
-
json_file = is_remote ? open(endpoint) : File.open(endpoint)
|
74
|
-
rescue StandardError => e
|
75
|
-
# If we didn't find an untranslated 'meta', we assume translated builds.
|
76
|
-
return true
|
77
|
-
end
|
78
|
-
|
79
|
-
# Other wise assume untranslated builds.
|
80
|
-
return false
|
81
|
-
end
|
82
|
-
|
83
62
|
def generate(site)
|
84
63
|
|
85
64
|
# For below, make sure there is at least an empty hash at
|
@@ -99,85 +78,47 @@ module JekyllOpenSdgPlugins
|
|
99
78
|
is_remote = opensdg_is_path_remote(build_location)
|
100
79
|
|
101
80
|
build_location = is_remote ? build_location : File.join(Dir.pwd, build_location)
|
102
|
-
translated_builds = site_uses_translated_builds(build_location)
|
103
81
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
if
|
114
|
-
|
115
|
-
data_target.deep_merge(data_source)
|
116
|
-
else
|
117
|
-
site.data[language] = data_source
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
# We move the language-specific translations to the
|
122
|
-
# site.data.translations location, where all translations are kept.
|
123
|
-
site.config['languages'].each do |language|
|
124
|
-
translation_target = site.data['translations'][language]
|
125
|
-
translation_source = site.data[language]['translations']
|
126
|
-
if translation_target
|
127
|
-
translation_target.deep_merge(translation_source)
|
82
|
+
# We get a build for each language, and place them in "subfolders"
|
83
|
+
# (so to speak) of site.data.
|
84
|
+
subfolders = site.config['languages'].clone
|
85
|
+
subfolders.append('untranslated')
|
86
|
+
subfolders.each do |language|
|
87
|
+
data_target = site.data[language]
|
88
|
+
translated_build = is_remote ? build_location + '/' + language : File.join(build_location, language)
|
89
|
+
data_source = fetch_build(translated_build)
|
90
|
+
if !data_source.empty?
|
91
|
+
if data_target
|
92
|
+
data_target.deep_merge(data_source)
|
128
93
|
else
|
129
|
-
site.data[
|
94
|
+
site.data[language] = data_source
|
130
95
|
end
|
131
96
|
end
|
132
|
-
# And there are some parts of the build that don't need to be translated
|
133
|
-
# and should be moved to the top level.
|
134
|
-
first_language = site.config['languages'][0]
|
135
|
-
site.data['reporting'] = site.data[first_language]['reporting']
|
136
|
-
site.data['schema'] = site.data[first_language]['schema']
|
137
|
-
site.data['zip'] = site.data[first_language]['zip']
|
138
|
-
else
|
139
|
-
# For untranslated builds, we download one build only, and place it
|
140
|
-
# in the "root" (so to speak) of site.data. Nothing else is needed.
|
141
|
-
target = site.data
|
142
|
-
source = fetch_build(build_location)
|
143
|
-
if !source.empty?
|
144
|
-
target.deep_merge(source)
|
145
|
-
end
|
146
97
|
end
|
147
|
-
|
148
|
-
#
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
source = JSON.load(open(endpoint))
|
157
|
-
if target
|
158
|
-
target.deep_merge(source)
|
159
|
-
else
|
160
|
-
site.data[key] = source
|
161
|
-
end
|
162
|
-
rescue StandardError => e
|
163
|
-
puts e.message
|
164
|
-
abort 'Unable to fetch remote translation from: ' + endpoint
|
165
|
-
end
|
98
|
+
# We move the language-specific translations to the
|
99
|
+
# site.data.translations location, where all translations are kept.
|
100
|
+
site.config['languages'].each do |language|
|
101
|
+
translation_target = site.data['translations'][language]
|
102
|
+
translation_source = site.data[language]['translations']
|
103
|
+
if translation_target
|
104
|
+
translation_target.deep_merge(translation_source)
|
105
|
+
else
|
106
|
+
site.data['translations'][language] = translation_source
|
166
107
|
end
|
167
108
|
end
|
109
|
+
# And there are some parts of the build that don't need to be translated
|
110
|
+
# and should be moved to the top level.
|
111
|
+
first_language = site.config['languages'][0]
|
112
|
+
site.data['reporting'] = site.data[first_language]['reporting']
|
113
|
+
site.data['schema'] = site.data[first_language]['schema']
|
114
|
+
site.data['zip'] = site.data[first_language]['zip']
|
168
115
|
end
|
169
116
|
end
|
170
117
|
|
171
|
-
# This makes sure that the contents of
|
118
|
+
# This makes sure that the contents of any local data build get copied
|
172
119
|
# into the Jekyll build, so that they can be served from the website.
|
173
120
|
Jekyll::Hooks.register :site, :post_write do |site|
|
174
|
-
if site.config['
|
175
|
-
source = File.join(Dir.pwd, site.config['local_data_folder'], '.')
|
176
|
-
destination = site.config['destination']
|
177
|
-
FileUtils.cp_r(source, destination)
|
178
|
-
# Do the same in the case that "remote_data_prefix" is being used for a local
|
179
|
-
# data folder (since "local_data_folder" is deprecated and undocumented).
|
180
|
-
elsif site.config['remote_data_prefix']
|
121
|
+
if site.config['remote_data_prefix']
|
181
122
|
if !opensdg_is_path_remote(site.config['remote_data_prefix'])
|
182
123
|
source = File.join(Dir.pwd, site.config['remote_data_prefix'], '.')
|
183
124
|
destination = site.config['destination']
|
@@ -2,6 +2,56 @@
|
|
2
2
|
|
3
3
|
require "jekyll"
|
4
4
|
|
5
|
+
# Takes a string that might be a textual representation of a
|
6
|
+
# site configuration, such as "baseurl" or "country.name".
|
7
|
+
def opensdg_parse_site_config(key, site)
|
8
|
+
|
9
|
+
# Safety code - abort now if key is nil.
|
10
|
+
if key.nil?
|
11
|
+
return ""
|
12
|
+
end
|
13
|
+
|
14
|
+
# Also make sure it is a string, and other just return it.
|
15
|
+
if not key.is_a? String
|
16
|
+
return key
|
17
|
+
end
|
18
|
+
|
19
|
+
# More safety code - abort now if key is empty.
|
20
|
+
if key.empty?
|
21
|
+
return ""
|
22
|
+
end
|
23
|
+
|
24
|
+
# Keep track of the last thing we drilled to.
|
25
|
+
drilled = site.config
|
26
|
+
|
27
|
+
# Keep track of how many levels we have drilled.
|
28
|
+
levels_drilled = 0
|
29
|
+
levels = key.split('.')
|
30
|
+
|
31
|
+
# Loop through each level.
|
32
|
+
levels.each do |level|
|
33
|
+
|
34
|
+
# If we have drilled down to a scalar value too soon, abort.
|
35
|
+
break if drilled.class != Hash and drilled.class != Jekyll::Configuration
|
36
|
+
|
37
|
+
if drilled.has_key? level
|
38
|
+
# If we find something, continue drilling.
|
39
|
+
drilled = drilled[level]
|
40
|
+
levels_drilled += 1
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
# If we didn't drill the right number of levels, return the
|
46
|
+
# original string.
|
47
|
+
if levels.length != levels_drilled
|
48
|
+
return key
|
49
|
+
end
|
50
|
+
|
51
|
+
# Otherwise we must have drilled all they way.
|
52
|
+
return drilled
|
53
|
+
end
|
54
|
+
|
5
55
|
# Takes a translation key and returns a translated string according to the
|
6
56
|
# language of the current page. Or if none is found, returns the original
|
7
57
|
# key.
|
@@ -49,29 +99,26 @@ def opensdg_translate_key(key, translations, language)
|
|
49
99
|
return key
|
50
100
|
end
|
51
101
|
|
102
|
+
# If the result is still not a string, return the original string.
|
103
|
+
if drilled.class != String
|
104
|
+
return key
|
105
|
+
end
|
106
|
+
|
52
107
|
# Otherwise we must have drilled all they way.
|
53
108
|
return drilled
|
54
109
|
end
|
55
110
|
|
56
|
-
# Takes a site object and decides whether it is using translated builds.
|
57
|
-
def opensdg_translated_builds(site)
|
58
|
-
# Assume the site is using translated builds.
|
59
|
-
translated_builds = true
|
60
|
-
site.config['languages'].each do |language|
|
61
|
-
# If any languages don't have a key in site.data, the site is not using
|
62
|
-
# translated builds.
|
63
|
-
if !site.data.has_key? language
|
64
|
-
translated_builds = false
|
65
|
-
end
|
66
|
-
end
|
67
|
-
return translated_builds
|
68
|
-
end
|
69
|
-
|
70
111
|
# Print a notice during compilation.
|
71
112
|
def opensdg_notice(message)
|
72
113
|
Jekyll.logger.warn message.yellow
|
73
114
|
end
|
74
115
|
|
116
|
+
# Print an error that should halt the build.
|
117
|
+
def opensdg_error(message)
|
118
|
+
Jekyll.logger.error message.red
|
119
|
+
exit 1
|
120
|
+
end
|
121
|
+
|
75
122
|
# Get the public language codes for a site, keyed by the actual language codes.
|
76
123
|
def opensdg_languages_public(site)
|
77
124
|
languages_public = site.config['languages_public']
|
@@ -3,30 +3,6 @@
|
|
3
3
|
"title": "Open SDG site configuration",
|
4
4
|
"description": "This form will produce the site configuration for your Open SDG implementation.",
|
5
5
|
"properties": {
|
6
|
-
"accessible_charts": {
|
7
|
-
"title": "Accessible charts",
|
8
|
-
"type": "boolean",
|
9
|
-
"description": "This setting can be set to `true` to enable chart functionality that is intended to increase accessibility by adding support for screenreaders and keyboard navigation.",
|
10
|
-
"format": "checkbox",
|
11
|
-
"links": [
|
12
|
-
{
|
13
|
-
"rel": "More information on the accessible charts setting",
|
14
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#accessible_charts"
|
15
|
-
}
|
16
|
-
]
|
17
|
-
},
|
18
|
-
"accessible_tabs": {
|
19
|
-
"title": "Accessible tabs",
|
20
|
-
"type": "boolean",
|
21
|
-
"description": "This setting can be set to `true` to enable tab functionality that is compliant with the WAI-ARIA best practices. This adds improved keyboard navigation of the tabs.",
|
22
|
-
"format": "checkbox",
|
23
|
-
"links": [
|
24
|
-
{
|
25
|
-
"rel": "More information on the accessible tabs setting",
|
26
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#accessible_tabs"
|
27
|
-
}
|
28
|
-
]
|
29
|
-
},
|
30
6
|
"analytics": {
|
31
7
|
"options": {"collapsed": true},
|
32
8
|
"type": "object",
|
@@ -56,18 +32,6 @@
|
|
56
32
|
}
|
57
33
|
]
|
58
34
|
},
|
59
|
-
"bootstrap_5": {
|
60
|
-
"title": "Bootstrap 5",
|
61
|
-
"type": "boolean",
|
62
|
-
"description": "This setting can be set to `true` to enable Bootstrap 5. Importantly, this will automatically be set to 'true' in Open SDG 2.0.0.",
|
63
|
-
"format": "checkbox",
|
64
|
-
"links": [
|
65
|
-
{
|
66
|
-
"rel": "More information on the bootstrap_5 setting",
|
67
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#bootstrap_5"
|
68
|
-
}
|
69
|
-
]
|
70
|
-
},
|
71
35
|
"breadcrumbs": {
|
72
36
|
"options": {"collapsed": true},
|
73
37
|
"type": "object",
|
@@ -109,37 +73,6 @@
|
|
109
73
|
}
|
110
74
|
]
|
111
75
|
},
|
112
|
-
"chartjs_3": {
|
113
|
-
"title": "Chart.js 3",
|
114
|
-
"type": "boolean",
|
115
|
-
"description": "This setting can be set to `true` to enable Chart.js 3. Importantly, this will automatically be set to 'true' in Open SDG 2.0.0.",
|
116
|
-
"format": "checkbox",
|
117
|
-
"links": [
|
118
|
-
{
|
119
|
-
"rel": "More information on the chartjs_3 setting",
|
120
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#chartjs_3"
|
121
|
-
}
|
122
|
-
]
|
123
|
-
},
|
124
|
-
"contrast_type": {
|
125
|
-
"type": "string",
|
126
|
-
"title": "Contrast type",
|
127
|
-
"description": "The type of high-contrast toggle to use.",
|
128
|
-
"enum": ["default", "single", "long"],
|
129
|
-
"options": {
|
130
|
-
"enum_titles": [
|
131
|
-
"Default - two 'A' buttons side-by-side",
|
132
|
-
"Single - one 'A' button which toggles on/off",
|
133
|
-
"Long - text toggling between 'High contrast' and 'Default contrast'"
|
134
|
-
]
|
135
|
-
},
|
136
|
-
"links": [
|
137
|
-
{
|
138
|
-
"rel": "More information on the contrast type setting",
|
139
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#contrast_type"
|
140
|
-
}
|
141
|
-
]
|
142
|
-
},
|
143
76
|
"cookie_consent_form": {
|
144
77
|
"options": {"collapsed": true},
|
145
78
|
"type": "object",
|
@@ -192,27 +125,6 @@
|
|
192
125
|
"title": "Create goals",
|
193
126
|
"description": "This setting can be used to automatically create the goal pages.",
|
194
127
|
"properties": {
|
195
|
-
"layout": {
|
196
|
-
"type": "string",
|
197
|
-
"title": "Layout",
|
198
|
-
"enum": [
|
199
|
-
"",
|
200
|
-
"goal",
|
201
|
-
"goal-by-target",
|
202
|
-
"goal-by-target-vertical",
|
203
|
-
"goal-with-progress"
|
204
|
-
],
|
205
|
-
"options": {
|
206
|
-
"enum_titles": [
|
207
|
-
"Do not automatically create goals",
|
208
|
-
"goal",
|
209
|
-
"goal-by-target",
|
210
|
-
"goal-by-target-vertical",
|
211
|
-
"goal-with-progress"
|
212
|
-
]
|
213
|
-
},
|
214
|
-
"description": "The layout to use for the goal pages."
|
215
|
-
},
|
216
128
|
"previous_next_links": {
|
217
129
|
"title": "Previous/next links",
|
218
130
|
"type": "boolean",
|
@@ -251,21 +163,6 @@
|
|
251
163
|
"title": "Create indicators",
|
252
164
|
"description": "This setting can be used to automatically create the indicator pages.",
|
253
165
|
"properties": {
|
254
|
-
"layout": {
|
255
|
-
"type": "string",
|
256
|
-
"title": "Layout",
|
257
|
-
"enum": [
|
258
|
-
"",
|
259
|
-
"indicator"
|
260
|
-
],
|
261
|
-
"options": {
|
262
|
-
"enum_titles": [
|
263
|
-
"Do not automatically create indicators",
|
264
|
-
"indicator"
|
265
|
-
]
|
266
|
-
},
|
267
|
-
"description": "The layout to use for the indicator pages."
|
268
|
-
},
|
269
166
|
"previous_next_links": {
|
270
167
|
"title": "Previous/next links",
|
271
168
|
"type": "boolean",
|
@@ -501,24 +398,6 @@
|
|
501
398
|
}
|
502
399
|
]
|
503
400
|
},
|
504
|
-
"favicons": {
|
505
|
-
"type": "string",
|
506
|
-
"title": "Favicons",
|
507
|
-
"description": "The type of favicons to use.",
|
508
|
-
"enum": ["legacy", "favicon.io"],
|
509
|
-
"options": {
|
510
|
-
"enum_titles": [
|
511
|
-
"Legacy",
|
512
|
-
"Favicon.io (recommended)"
|
513
|
-
]
|
514
|
-
},
|
515
|
-
"links": [
|
516
|
-
{
|
517
|
-
"rel": "More information on the favicons setting",
|
518
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#favicons"
|
519
|
-
}
|
520
|
-
]
|
521
|
-
},
|
522
401
|
"footer_language_toggle": {
|
523
402
|
"type": "string",
|
524
403
|
"title": "Footer language toggle",
|
@@ -609,28 +488,6 @@
|
|
609
488
|
}
|
610
489
|
]
|
611
490
|
},
|
612
|
-
"frontpage_heading": {
|
613
|
-
"type": "string",
|
614
|
-
"title": "Frontpage heading",
|
615
|
-
"description": "This setting can control the heading that appears on the front page. This setting is only used in the frontpage layout.",
|
616
|
-
"links": [
|
617
|
-
{
|
618
|
-
"rel": "More information on the frontpage heading setting",
|
619
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#frontpage_heading"
|
620
|
-
}
|
621
|
-
]
|
622
|
-
},
|
623
|
-
"frontpage_instructions": {
|
624
|
-
"type": "string",
|
625
|
-
"title": "Frontpage instructions",
|
626
|
-
"description": "This setting can control the instructions that appear on the front page. This setting is only used in the frontpage layout.",
|
627
|
-
"links": [
|
628
|
-
{
|
629
|
-
"rel": "More information on the frontpage instructions setting",
|
630
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#frontpage_instructions"
|
631
|
-
}
|
632
|
-
]
|
633
|
-
},
|
634
491
|
"frontpage_introduction_banner": {
|
635
492
|
"options": {"collapsed": true},
|
636
493
|
"type": "object",
|
@@ -713,7 +570,7 @@
|
|
713
570
|
"title": "Graph color set",
|
714
571
|
"description": "This setting can be used to customize the color set used in the charts.",
|
715
572
|
"examples": [],
|
716
|
-
"enum": ["
|
573
|
+
"enum": ["accessible", "classic", "sdg", "goal", "custom"],
|
717
574
|
"links": [
|
718
575
|
{
|
719
576
|
"rel": "More information on the graph color set setting",
|
@@ -762,35 +619,6 @@
|
|
762
619
|
}
|
763
620
|
]
|
764
621
|
},
|
765
|
-
"header": {
|
766
|
-
"options": {"collapsed": true},
|
767
|
-
"type": "object",
|
768
|
-
"title": "Header",
|
769
|
-
"description": "This setting can be used to customise the header.",
|
770
|
-
"properties": {
|
771
|
-
"include": {
|
772
|
-
"type": "string",
|
773
|
-
"title": "Include file",
|
774
|
-
"enum": [
|
775
|
-
"header-default.html",
|
776
|
-
"header-menu-left-aligned.html"
|
777
|
-
],
|
778
|
-
"options": {
|
779
|
-
"enum_titles": [
|
780
|
-
"Default header",
|
781
|
-
"Menu left-aligned"
|
782
|
-
]
|
783
|
-
},
|
784
|
-
"description": "The header style to use on all pages."
|
785
|
-
}
|
786
|
-
},
|
787
|
-
"links": [
|
788
|
-
{
|
789
|
-
"rel": "More information on the header setting",
|
790
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#header"
|
791
|
-
}
|
792
|
-
]
|
793
|
-
},
|
794
622
|
"header_language_toggle": {
|
795
623
|
"type": "string",
|
796
624
|
"title": "Header language toggle",
|
@@ -1074,6 +902,12 @@
|
|
1074
902
|
"title": "Map options",
|
1075
903
|
"description": "Site-wide configuration of map behavior and style.",
|
1076
904
|
"properties": {
|
905
|
+
"disaggregation_controls": {
|
906
|
+
"title": "Disaggregation controls",
|
907
|
+
"type": "boolean",
|
908
|
+
"description": "Whether the map should provide a button and form for changing the displayed disaggregation.",
|
909
|
+
"format": "checkbox"
|
910
|
+
},
|
1077
911
|
"minZoom": {
|
1078
912
|
"title": "Minimum zoom",
|
1079
913
|
"type": "integer",
|
@@ -1275,17 +1109,6 @@
|
|
1275
1109
|
}
|
1276
1110
|
]
|
1277
1111
|
},
|
1278
|
-
"non_global_metadata": {
|
1279
|
-
"type": "string",
|
1280
|
-
"title": "Non-global metadata",
|
1281
|
-
"description": "This setting can be used to control the text of the tab containing non-global metadata.",
|
1282
|
-
"links": [
|
1283
|
-
{
|
1284
|
-
"rel": "More information on the non-global metadata setting",
|
1285
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#non_global_metadata"
|
1286
|
-
}
|
1287
|
-
]
|
1288
|
-
},
|
1289
1112
|
"progress_status": {
|
1290
1113
|
"options": {"collapsed": true},
|
1291
1114
|
"type": "object",
|
@@ -1473,18 +1296,6 @@
|
|
1473
1296
|
}
|
1474
1297
|
]
|
1475
1298
|
},
|
1476
|
-
"series_toggle": {
|
1477
|
-
"title": "Series toggle",
|
1478
|
-
"type": "boolean",
|
1479
|
-
"description": "This setting enables the special treatment of the 'Series' column in the data. If set to true, when an indicator's data includes a 'Series' column, it will be displayed above 'Units' as radio buttons.",
|
1480
|
-
"format": "checkbox",
|
1481
|
-
"links": [
|
1482
|
-
{
|
1483
|
-
"rel": "More information on the series toggle setting",
|
1484
|
-
"href": "https://open-sdg.readthedocs.io/en/latest/configuration/#series_toggle"
|
1485
|
-
}
|
1486
|
-
]
|
1487
|
-
},
|
1488
1299
|
"site_config_form": {
|
1489
1300
|
"options": {"collapsed": true},
|
1490
1301
|
"type": "object",
|
@@ -304,7 +304,7 @@ module JekyllOpenSdgPlugins
|
|
304
304
|
|
305
305
|
# For available indicators, we simply map the "indicators" collection.
|
306
306
|
available_inids = site.collections['indicators'].docs.select { |x| x.data['language'] == default_language }
|
307
|
-
available_inids = available_inids.map { |x| x.data['
|
307
|
+
available_inids = available_inids.map { |x| x.data['indicator_number'] }
|
308
308
|
available_indicators = {}
|
309
309
|
available_targets = {}
|
310
310
|
available_goals = {}
|
@@ -355,20 +355,7 @@ module JekyllOpenSdgPlugins
|
|
355
355
|
# arbitrary (it's because they came from filenames) and could maybe
|
356
356
|
# be changed eventually to dot-delimited for consistency.
|
357
357
|
meta_key = indicator_number.gsub('.', '-')
|
358
|
-
|
359
|
-
# using "translated_builds" or not.
|
360
|
-
if opensdg_translated_builds(site)
|
361
|
-
meta = site.data[language]['meta'][meta_key]
|
362
|
-
else
|
363
|
-
meta = site.data['meta'][meta_key]
|
364
|
-
# Also for untranslated builds, we need to support the "subfolder"
|
365
|
-
# approach for metadata translation. (This is handled at build-time
|
366
|
-
# for translated builds.)
|
367
|
-
if meta.has_key? language
|
368
|
-
meta = meta.merge(meta[language])
|
369
|
-
meta.delete(language)
|
370
|
-
end
|
371
|
-
end
|
358
|
+
meta = site.data[language]['meta'][meta_key]
|
372
359
|
|
373
360
|
is_standalone = (meta.has_key?('standalone') and meta['standalone'])
|
374
361
|
is_placeholder = (meta.has_key?('placeholder') and meta['placeholder'] != '')
|
@@ -489,12 +476,8 @@ module JekyllOpenSdgPlugins
|
|
489
476
|
else
|
490
477
|
doc.data['remote_data_prefix'] = normalize_baseurl(baseurl)
|
491
478
|
end
|
492
|
-
|
493
|
-
|
494
|
-
doc.data['remote_data_prefix'] = File.join(doc.data['remote_data_prefix'], language)
|
495
|
-
else
|
496
|
-
doc.data['remote_data_prefix_untranslated'] = doc.data['remote_data_prefix']
|
497
|
-
end
|
479
|
+
doc.data['remote_data_prefix_untranslated'] = File.join(doc.data['remote_data_prefix'], 'untranslated')
|
480
|
+
doc.data['remote_data_prefix'] = File.join(doc.data['remote_data_prefix'], language)
|
498
481
|
|
499
482
|
# Set the logo for this page.
|
500
483
|
logo = {}
|
@@ -525,11 +508,8 @@ module JekyllOpenSdgPlugins
|
|
525
508
|
# For indicators we also set the current indicator/target/goal.
|
526
509
|
if doc.data.has_key? 'indicator_number'
|
527
510
|
indicator_number = doc.data['indicator_number']
|
528
|
-
elsif doc.data.has_key? 'indicator'
|
529
|
-
# Backwards compatibility.
|
530
|
-
indicator_number = doc.data['indicator']
|
531
511
|
else
|
532
|
-
|
512
|
+
opensdg_error("Error: An indicator does not have 'indicator_number' property.")
|
533
513
|
end
|
534
514
|
# Force the indicator number to be a string.
|
535
515
|
if indicator_number.is_a? Numeric
|
@@ -551,11 +531,8 @@ module JekyllOpenSdgPlugins
|
|
551
531
|
# For goals we also set the current goal.
|
552
532
|
if doc.data.has_key? 'goal_number'
|
553
533
|
goal_number = doc.data['goal_number']
|
554
|
-
elsif doc.data.has_key? 'sdg_goal'
|
555
|
-
# Backwards compatibility.
|
556
|
-
goal_number = doc.data['sdg_goal']
|
557
534
|
else
|
558
|
-
|
535
|
+
opensdg_error("Error: A goal does not have 'goal_number' property.")
|
559
536
|
end
|
560
537
|
# Force the goal number to be a string.
|
561
538
|
if goal_number.is_a? Numeric
|
@@ -41,6 +41,11 @@ module JekyllOpenSdgPlugins
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
# Abort early if some required settings are not there.
|
45
|
+
unless site.config.has_key?('languages') && site.config['languages'].length > 0
|
46
|
+
opensdg_error('The "languages" site configuration must have at least one language. See the documentation here: https://open-sdg.readthedocs.io/en/latest/configuration/#languages')
|
47
|
+
end
|
48
|
+
|
44
49
|
# Hardcode some variables.
|
45
50
|
site.config['disaggregation_status'] = {}
|
46
51
|
site.config['disaggregation_status']['status_types'] = [
|
@@ -26,25 +26,13 @@ module Jekyll
|
|
26
26
|
# language: es
|
27
27
|
# format: "%d de %b de %Y"
|
28
28
|
#
|
29
|
-
# However the following deprecated structure is also supported:
|
30
|
-
#
|
31
|
-
# date_formats:
|
32
|
-
# standard:
|
33
|
-
# en: "%b %d, %Y"
|
34
|
-
# es: "%d de %b de %Y"
|
35
|
-
# etc...
|
36
29
|
date_format = '%b %d, %Y'
|
37
30
|
if config.has_key?('date_formats')
|
38
|
-
|
39
|
-
#
|
40
|
-
|
41
|
-
|
42
|
-
if config['date_formats'].is_a?(Hash) && config['date_formats'].has_key?(format_type)
|
43
|
-
if config['date_formats'][format_type].has_key?(language)
|
44
|
-
date_format = config['date_formats'][format_type][language]
|
45
|
-
end
|
31
|
+
|
32
|
+
# Abort if this setting is using an old format.
|
33
|
+
if config['date_formats'].is_a?(Hash)
|
34
|
+
opensdg_error('The "date_formats" site configuration must be in a list format. See the documentation here: https://open-sdg.readthedocs.io/en/latest/configuration/#date_formats')
|
46
35
|
end
|
47
|
-
# @deprecated end
|
48
36
|
|
49
37
|
# In the current form of data_formats, it is an array of hashes, each
|
50
38
|
# containing "type", "language", and "format" keys.
|
@@ -9,10 +9,36 @@ module Jekyll
|
|
9
9
|
def t(key)
|
10
10
|
|
11
11
|
# Determine the language of the current page.
|
12
|
-
|
12
|
+
site = @context.registers[:site]
|
13
|
+
translations = site.data['translations']
|
13
14
|
language = @context.environments.first["page"]['language']
|
15
|
+
translated = opensdg_translate_key(key, translations, language)
|
16
|
+
# Also look for references to site configuration within the translation,
|
17
|
+
# as "%" parameters.
|
18
|
+
translated = translated.gsub(/%([a-zA-Z0-9_.]+)/) do |match|
|
19
|
+
# Special case for trailing dots.
|
20
|
+
trailing_dot = match.end_with?('.')
|
21
|
+
key_candidate = match.delete_suffix('.').delete_prefix('%')
|
22
|
+
# Check to see if it is a site configuration.
|
23
|
+
translated_word = opensdg_parse_site_config(key_candidate, site)
|
24
|
+
# Check to see if the value of the site config may have been
|
25
|
+
# a translation key itself. But do a safety check to avoid
|
26
|
+
# infinite loops.
|
27
|
+
if translated_word != key
|
28
|
+
translated_word = opensdg_translate_key(translated_word, translations, language)
|
29
|
+
end
|
30
|
+
# Replace the word if something changed.
|
31
|
+
if key_candidate != translated_word
|
32
|
+
match = translated_word
|
33
|
+
# Making sure to add back any trailing dots.
|
34
|
+
if trailing_dot
|
35
|
+
match = match + '.'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
match
|
39
|
+
end
|
14
40
|
|
15
|
-
return
|
41
|
+
return translated
|
16
42
|
end
|
17
43
|
end
|
18
44
|
end
|
@@ -23,11 +23,7 @@ module JekyllOpenSdgPlugins
|
|
23
23
|
language = site.config['languages'][0]
|
24
24
|
end
|
25
25
|
metadata = {}
|
26
|
-
|
27
|
-
metadata = site.data[language]['meta']
|
28
|
-
else
|
29
|
-
metadata = site.data['meta']
|
30
|
-
end
|
26
|
+
metadata = site.data[language]['meta']
|
31
27
|
# Loop through the indicators (using metadata as a list).
|
32
28
|
validation_failed = false
|
33
29
|
metadata.each do |inid, meta|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-open-sdg-plugins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brock Fanning
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|