jekyll-open-sdg-plugins 1.2.0.pre.beta6 → 1.4.0.pre.beta1
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.rb +1 -0
- data/lib/jekyll-open-sdg-plugins/create_goals.rb +3 -0
- data/lib/jekyll-open-sdg-plugins/create_indicators.rb +135 -19
- data/lib/jekyll-open-sdg-plugins/create_pages.rb +20 -5
- data/lib/jekyll-open-sdg-plugins/fetch_remote_data.rb +3 -2
- data/lib/jekyll-open-sdg-plugins/metadata_schema_to_config.rb +72 -0
- data/lib/jekyll-open-sdg-plugins/schema-indicator-config.json +226 -152
- data/lib/jekyll-open-sdg-plugins/schema-site-config.json +280 -33
- data/lib/jekyll-open-sdg-plugins/sdg_variables.rb +78 -9
- data/lib/jekyll-open-sdg-plugins/site_configuration.rb +9 -0
- data/lib/jekyll-open-sdg-plugins/translate_date.rb +25 -1
- data/lib/jekyll-open-sdg-plugins/version.rb +1 -1
- data/tests/_config.yml +10 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ba22fd994d04edb16b31b864db8b6538e2a996cfbf98c16f0eaee128fa8117c
|
4
|
+
data.tar.gz: 70d64a4098ecc895aac3f8690617bf34c019b743cff279734cf81b71c015d5de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9440c732b7ecb4ea1cbe223abd96288ffbbc647c4e4ab102009a3887643dfa6f0270c6171cbb7636e816385865ceebee7f840dfb09e454c0d38968779b9d720
|
7
|
+
data.tar.gz: 920503070bad04e792f6ec01815236a50edc5a5556f611da5640d867416eb0dd5bbcb52dfde684db521af5156f59490ce84ff64b234c2d6b0103b5b9ef038858
|
@@ -11,6 +11,7 @@ require_relative "jekyll-open-sdg-plugins/create_pages"
|
|
11
11
|
require_relative "jekyll-open-sdg-plugins/sdg_variables"
|
12
12
|
require_relative "jekyll-open-sdg-plugins/search_index"
|
13
13
|
require_relative "jekyll-open-sdg-plugins/validate_indicator_config"
|
14
|
+
require_relative "jekyll-open-sdg-plugins/metadata_schema_to_config"
|
14
15
|
|
15
16
|
module JekyllOpenSdgPlugins
|
16
17
|
end
|
@@ -7,17 +7,52 @@ module JekyllOpenSdgPlugins
|
|
7
7
|
priority :normal
|
8
8
|
|
9
9
|
def generate(site)
|
10
|
+
# Some references to clean up the code below.
|
11
|
+
language_config = site.config['languages']
|
12
|
+
indicator_config = site.config['create_indicators']
|
13
|
+
form_settings_config = site.config['indicator_config_form']
|
14
|
+
form_settings_meta = site.config['indicator_metadata_form']
|
15
|
+
form_settings_data = site.config['indicator_data_form']
|
16
|
+
|
17
|
+
# Special treatment of repository_link settings: prefix them
|
18
|
+
# with the repository_url_data site config if needed.
|
19
|
+
repo_url = site.config['repository_url_data']
|
20
|
+
if repo_url && repo_url != '' && repo_url.start_with?('http')
|
21
|
+
if form_settings_config != nil && form_settings_config && form_settings_config['enabled']
|
22
|
+
if form_settings_config['repository_link'] && form_settings_config['repository_link'] != ''
|
23
|
+
unless form_settings_config['repository_link'].start_with?('http')
|
24
|
+
form_settings_config['repository_link'] = repo_url + form_settings_config['repository_link']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
if form_settings_meta != nil && form_settings_meta && form_settings_meta['enabled']
|
29
|
+
if form_settings_meta['repository_link'] && form_settings_meta['repository_link'] != ''
|
30
|
+
unless form_settings_meta['repository_link'].start_with?('http')
|
31
|
+
form_settings_meta['repository_link'] = repo_url + form_settings_meta['repository_link']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
if form_settings_data != nil && form_settings_data && form_settings_data['enabled']
|
36
|
+
if form_settings_data['repository_link'] && form_settings_data['repository_link'] != ''
|
37
|
+
unless form_settings_data['repository_link'].start_with?('http')
|
38
|
+
form_settings_data['repository_link'] = repo_url + form_settings_data['repository_link']
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
translations = site.data['translations']
|
10
45
|
# If site.create_indicators is set, create indicators per the metadata.
|
11
|
-
if
|
46
|
+
if (language_config and indicator_config and indicator_config.key?('layout') and indicator_config['layout'] != '')
|
12
47
|
# Decide what layout to use for the indicator pages.
|
13
|
-
layout =
|
48
|
+
layout = indicator_config['layout']
|
14
49
|
# See if we need to "map" any language codes.
|
15
50
|
languages_public = Hash.new
|
16
51
|
if site.config['languages_public']
|
17
52
|
languages_public = opensdg_languages_public(site)
|
18
53
|
end
|
19
54
|
# Loop through the languages.
|
20
|
-
|
55
|
+
language_config.each_with_index do |language, index|
|
21
56
|
# Get the "public language" (for URLs) which may be different.
|
22
57
|
language_public = language
|
23
58
|
if languages_public[language]
|
@@ -34,41 +69,102 @@ module JekyllOpenSdgPlugins
|
|
34
69
|
end
|
35
70
|
# Loop through the indicators (using metadata as a list).
|
36
71
|
metadata.each do |inid, meta|
|
72
|
+
permalink = inid
|
73
|
+
if (meta.has_key?('permalink') and meta['permalink'] != '')
|
74
|
+
permalink = meta['permalink']
|
75
|
+
end
|
37
76
|
# Add the language subfolder for all except the default (first) language.
|
38
|
-
dir = index == 0 ?
|
77
|
+
dir = index == 0 ? permalink : File.join(language_public, permalink)
|
78
|
+
|
39
79
|
# Create the indicator page.
|
40
80
|
site.collections['indicators'].docs << IndicatorPage.new(site, site.source, dir, inid, language, layout)
|
41
81
|
end
|
42
82
|
end
|
43
|
-
# Create the indicator configuration pages.
|
44
|
-
|
83
|
+
# Create the indicator settings configuration/metadata/data pages.
|
84
|
+
do_indicator_config_forms = form_settings_config && form_settings_config['enabled']
|
85
|
+
do_indicator_meta_forms = form_settings_meta && form_settings_meta['enabled']
|
86
|
+
do_indicator_data_forms = form_settings_data && form_settings_data['enabled']
|
87
|
+
use_translated_metadata = form_settings_meta && form_settings_meta['translated']
|
88
|
+
if do_indicator_config_forms || do_indicator_meta_forms || do_indicator_data_forms
|
89
|
+
|
45
90
|
metadata = {}
|
46
|
-
layout = site.config['create_config_forms']['layout']
|
47
91
|
if opensdg_translated_builds(site)
|
48
92
|
if site.data.has_key?('untranslated')
|
49
93
|
metadata = site.data['untranslated']['meta']
|
50
94
|
else
|
51
|
-
default_language =
|
95
|
+
default_language = language_config[0]
|
52
96
|
metadata = site.data[default_language]['meta']
|
53
97
|
end
|
54
98
|
else
|
55
99
|
metadata = site.data['meta']
|
56
100
|
end
|
101
|
+
|
102
|
+
metadata_by_language = {}
|
103
|
+
language_config.each do |language|
|
104
|
+
if opensdg_translated_builds(site)
|
105
|
+
metadata_by_language[language] = site.data[language]['meta']
|
106
|
+
else
|
107
|
+
metadata_by_language[language] = site.data['meta']
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Because we have config forms for indicator config or meta/data, we
|
112
|
+
# take over the meta/data_edit_url and configuration_edit_url settings
|
113
|
+
# here with simple relative links.
|
114
|
+
if do_indicator_config_forms
|
115
|
+
site.config['configuration_edit_url'] = 'config'
|
116
|
+
end
|
117
|
+
|
118
|
+
if do_indicator_meta_forms
|
119
|
+
site.config['metadata_edit_url'] = 'metadata'
|
120
|
+
end
|
121
|
+
|
122
|
+
if do_indicator_data_forms
|
123
|
+
site.config['data_edit_url'] = 'data'
|
124
|
+
end
|
125
|
+
|
57
126
|
# Loop through the indicators (using metadata as a list).
|
58
127
|
if !metadata.empty?
|
59
128
|
# Loop through the languages.
|
60
|
-
|
129
|
+
language_config.each_with_index do |language, index|
|
61
130
|
# Get the "public language" (for URLs) which may be different.
|
62
131
|
language_public = language
|
63
132
|
if languages_public[language]
|
64
133
|
language_public = languages_public[language]
|
65
134
|
end
|
66
135
|
metadata.each do |inid, meta|
|
67
|
-
|
136
|
+
permalink = inid
|
137
|
+
if (meta.has_key?('permalink') and meta['permalink'] != '')
|
138
|
+
permalink = meta['permalink']
|
139
|
+
end
|
140
|
+
dir_base = File.join(permalink)
|
68
141
|
if index != 0
|
69
|
-
|
142
|
+
dir_base = File.join(language_public, permalink)
|
143
|
+
end
|
144
|
+
|
145
|
+
if do_indicator_config_forms
|
146
|
+
dir = File.join(dir_base, 'config')
|
147
|
+
title = opensdg_translate_key('indicator.edit_configuration', translations, language)
|
148
|
+
config_type = 'indicator'
|
149
|
+
site.collections['pages'].docs << IndicatorConfigPage.new(site, site.source, dir, inid, language, meta, title, config_type, form_settings_config)
|
150
|
+
end
|
151
|
+
|
152
|
+
if do_indicator_meta_forms
|
153
|
+
metadata_to_use = meta
|
154
|
+
if use_translated_metadata
|
155
|
+
metadata_to_use = metadata_by_language[language][inid]
|
156
|
+
end
|
157
|
+
dir = File.join(dir_base, 'metadata')
|
158
|
+
title = opensdg_translate_key('indicator.edit_metadata', translations, language)
|
159
|
+
config_type = 'metadata'
|
160
|
+
site.collections['pages'].docs << IndicatorConfigPage.new(site, site.source, dir, inid, language, metadata_to_use, title, config_type, form_settings_meta)
|
161
|
+
end
|
162
|
+
|
163
|
+
if do_indicator_data_forms
|
164
|
+
dir = File.join(dir_base, 'data')
|
165
|
+
title = opensdg_translate_key('indicator.edit_data', translations, language)
|
166
|
+
site.collections['pages'].docs << IndicatorDataPage.new(site, site.source, dir, inid, language, title, form_settings_data)
|
70
167
|
end
|
71
|
-
site.collections['pages'].docs << IndicatorConfigPage.new(site, site.source, dir, inid, language, meta, layout)
|
72
168
|
end
|
73
169
|
end
|
74
170
|
end
|
@@ -77,7 +173,7 @@ module JekyllOpenSdgPlugins
|
|
77
173
|
end
|
78
174
|
end
|
79
175
|
|
80
|
-
# A Page subclass used in the `CreateIndicators` class.
|
176
|
+
# A Page subclass used in the `CreateIndicators` class for the indicators.
|
81
177
|
class IndicatorPage < Jekyll::Page
|
82
178
|
def initialize(site, base, dir, inid, language, layout)
|
83
179
|
@site = site
|
@@ -95,9 +191,9 @@ module JekyllOpenSdgPlugins
|
|
95
191
|
end
|
96
192
|
end
|
97
193
|
|
98
|
-
# A Page subclass used in the `CreateIndicators` class.
|
194
|
+
# A Page subclass used in the `CreateIndicators` class for the indicator config forms.
|
99
195
|
class IndicatorConfigPage < Jekyll::Page
|
100
|
-
def initialize(site, base, dir, inid, language, meta,
|
196
|
+
def initialize(site, base, dir, inid, language, meta, title, config_type, form_settings)
|
101
197
|
@site = site
|
102
198
|
@base = base
|
103
199
|
@dir = dir
|
@@ -106,12 +202,32 @@ module JekyllOpenSdgPlugins
|
|
106
202
|
self.process(@name)
|
107
203
|
self.data = {}
|
108
204
|
self.data['language'] = language
|
109
|
-
self.data['indicator_number'] = inid
|
110
|
-
self.data['config_type'] =
|
111
|
-
self.data['layout'] =
|
205
|
+
self.data['indicator_number'] = inid
|
206
|
+
self.data['config_type'] = config_type
|
207
|
+
self.data['layout'] = 'config-builder'
|
112
208
|
self.data['meta'] = meta
|
113
|
-
self.data['title'] =
|
209
|
+
self.data['title'] = title + ': ' + inid.gsub('-', '.')
|
114
210
|
self.data['config_filename'] = inid + '.yml'
|
211
|
+
self.data['form_settings'] = form_settings
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
# A Page subclass used in the `CreateIndicators` class for the indicator data forms.
|
216
|
+
class IndicatorDataPage < Jekyll::Page
|
217
|
+
def initialize(site, base, dir, inid, language, title, form_settings)
|
218
|
+
@site = site
|
219
|
+
@base = base
|
220
|
+
@dir = dir
|
221
|
+
@name = 'index.html'
|
222
|
+
|
223
|
+
self.process(@name)
|
224
|
+
self.data = {}
|
225
|
+
self.data['language'] = language
|
226
|
+
self.data['indicator_number'] = inid
|
227
|
+
self.data['layout'] = 'data-editor'
|
228
|
+
self.data['title'] = title + ': ' + inid.gsub('-', '.')
|
229
|
+
self.data['config_filename'] = 'indicator_' + inid
|
230
|
+
self.data['form_settings'] = form_settings
|
115
231
|
end
|
116
232
|
end
|
117
233
|
end
|
@@ -30,7 +30,7 @@ module JekyllOpenSdgPlugins
|
|
30
30
|
# To use the default 4 pages, simply put:
|
31
31
|
#
|
32
32
|
# create_pages: true
|
33
|
-
if site.config['languages'] and site.config['create_pages']
|
33
|
+
if (site.config['languages'] and site.config['create_pages'])
|
34
34
|
|
35
35
|
default_pages = [
|
36
36
|
{
|
@@ -54,7 +54,7 @@ module JekyllOpenSdgPlugins
|
|
54
54
|
}
|
55
55
|
]
|
56
56
|
pages = default_pages
|
57
|
-
if site.config['create_pages'].is_a?(Hash) and site.config['create_pages'].key?('pages')
|
57
|
+
if (site.config['create_pages'].is_a?(Hash) and site.config['create_pages'].key?('pages'))
|
58
58
|
# Backwards compatability to support the deprecated "pages" key.
|
59
59
|
pages = site.config['create_pages']['pages']
|
60
60
|
elsif site.config['create_pages'].is_a?(Array)
|
@@ -65,18 +65,33 @@ module JekyllOpenSdgPlugins
|
|
65
65
|
pages = pages.clone
|
66
66
|
|
67
67
|
# Hardcode the site configuration page if it's not already there.
|
68
|
+
form_settings = site.config['site_config_form']
|
68
69
|
config_page = pages.find { |page| page['layout'] == 'config-builder' }
|
69
70
|
if config_page == nil
|
70
|
-
if
|
71
|
+
if form_settings && form_settings['enabled']
|
71
72
|
pages.push({
|
72
73
|
'folder' => '/config',
|
73
|
-
'layout' =>
|
74
|
+
'layout' => 'config-builder',
|
74
75
|
'title' => 'Open SDG site configuration',
|
75
76
|
'config_type' => 'site',
|
76
|
-
'config_filename' => 'site_config.yml'
|
77
|
+
'config_filename' => 'site_config.yml',
|
77
78
|
})
|
78
79
|
end
|
79
80
|
end
|
81
|
+
# Make sure the form settings are set.
|
82
|
+
config_page = pages.find { |page| page['layout'] == 'config-builder' }
|
83
|
+
if config_page != nil && form_settings && form_settings['enabled']
|
84
|
+
# Special treatment of repository_link.
|
85
|
+
if form_settings['repository_link'] && form_settings['repository_link'] != ''
|
86
|
+
unless form_settings['repository_link'].start_with?('http')
|
87
|
+
repo_url = site.config['repository_url_site']
|
88
|
+
if repo_url && repo_url != '' && repo_url.start_with?('http')
|
89
|
+
form_settings['repository_link'] = repo_url + form_settings['repository_link']
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
config_page['form_settings'] = form_settings
|
94
|
+
end
|
80
95
|
|
81
96
|
# See if we need to "map" any language codes.
|
82
97
|
languages_public = Hash.new
|
@@ -25,7 +25,8 @@ module JekyllOpenSdgPlugins
|
|
25
25
|
'disaggregation' => 'stats/disaggregation.json',
|
26
26
|
'translations' => 'translations/translations.json',
|
27
27
|
'zip' => 'zip/all_indicators.json',
|
28
|
-
'indicator_downloads' => 'downloads/indicator-downloads.json'
|
28
|
+
'indicator_downloads' => 'downloads/indicator-downloads.json',
|
29
|
+
'data_packages' => 'data-packages/all.json',
|
29
30
|
}
|
30
31
|
end
|
31
32
|
|
@@ -43,7 +44,7 @@ module JekyllOpenSdgPlugins
|
|
43
44
|
rescue StandardError => e
|
44
45
|
# For backwards compatibility, forego the exception in some cases.
|
45
46
|
abort_build = true
|
46
|
-
if ['translations', 'indicator_downloads', 'disaggregation'].include? key
|
47
|
+
if ['translations', 'indicator_downloads', 'disaggregation', 'data_packages'].include? key
|
47
48
|
abort_build = false
|
48
49
|
elsif endpoint.include? '/untranslated/'
|
49
50
|
abort_build = false
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require "jekyll"
|
2
|
+
require_relative "helpers"
|
3
|
+
|
4
|
+
module JekyllOpenSdgPlugins
|
5
|
+
class MetadataSchemaToConfig < Jekyll::Generator
|
6
|
+
safe true
|
7
|
+
priority :lowest
|
8
|
+
|
9
|
+
def generate(site)
|
10
|
+
|
11
|
+
# Convert the metadata schema from the internal format into JSONSchema so
|
12
|
+
# it can be used to create config forms.
|
13
|
+
|
14
|
+
language_config = site.config['languages']
|
15
|
+
form_settings = site.config['indicator_metadata_form']
|
16
|
+
t = site.data['translations']
|
17
|
+
lang = language_config[0]
|
18
|
+
|
19
|
+
if form_settings && form_settings['enabled']
|
20
|
+
scopes = ['national', 'global']
|
21
|
+
if form_settings && form_settings.has_key?('scopes')
|
22
|
+
if form_settings['scopes'].kind_of?(Array) && form_settings['scopes'].length() > 0
|
23
|
+
scopes = form_settings['scopes']
|
24
|
+
end
|
25
|
+
end
|
26
|
+
exclude_fields = []
|
27
|
+
if form_settings && form_settings.has_key?('exclude_fields')
|
28
|
+
if form_settings['exclude_fields'].kind_of?(Array) && form_settings['exclude_fields'].length() > 0
|
29
|
+
exclude_fields = form_settings['exclude_fields']
|
30
|
+
end
|
31
|
+
end
|
32
|
+
if form_settings && form_settings.has_key?('language') && form_settings['language'] != ''
|
33
|
+
lang = form_settings['language']
|
34
|
+
end
|
35
|
+
|
36
|
+
schema = {
|
37
|
+
"type" => "object",
|
38
|
+
"title" => opensdg_translate_key('indicator.edit_metadata', t, lang),
|
39
|
+
"properties" => {},
|
40
|
+
}
|
41
|
+
|
42
|
+
site.data['schema'].each do |field|
|
43
|
+
field_name = field['name']
|
44
|
+
field_scope = field['field']['scope']
|
45
|
+
next unless scopes.include?(field_scope)
|
46
|
+
next if exclude_fields.include?(field_name)
|
47
|
+
|
48
|
+
to_translate = field_name
|
49
|
+
if field['field'].has_key?('translation_key')
|
50
|
+
to_translate = field['field']['translation_key']
|
51
|
+
elsif t[lang].has_key?('metadata_fields') && t[lang]['metadata_fields'].has_key?(field_name)
|
52
|
+
to_translate = 'metadata_fields.' + field_name
|
53
|
+
elsif field['field'].has_key?('label')
|
54
|
+
to_translate = field['field']['label']
|
55
|
+
end
|
56
|
+
field_label = opensdg_translate_key(to_translate, t, lang)
|
57
|
+
|
58
|
+
schema['properties'][field_name] = {
|
59
|
+
"type" => "string",
|
60
|
+
"format" => "markdown",
|
61
|
+
"title" => field_label,
|
62
|
+
"description" => 'Scope: ' + field_scope + ', Field: ' + field_name,
|
63
|
+
}
|
64
|
+
schema['additionalProperties'] = true
|
65
|
+
end
|
66
|
+
|
67
|
+
# Regardless place the schema in site data so it can be used in Jekyll templates.
|
68
|
+
site.data['schema-indicator-metadata'] = schema
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -3,6 +3,17 @@
|
|
3
3
|
"title": "Open SDG indicator configuration",
|
4
4
|
"description": "This form will produce an indicator's configuration for your Open SDG implementation.",
|
5
5
|
"properties": {
|
6
|
+
"composite_breakdown_label": {
|
7
|
+
"type": "string",
|
8
|
+
"title": "Composite breakdown label",
|
9
|
+
"description": "Used as a label for the COMPOSITE_BREAKDOWN column, if it appears in the indicator data.",
|
10
|
+
"links": [
|
11
|
+
{
|
12
|
+
"rel": "More information on the composite breakdown label setting",
|
13
|
+
"href": "https://open-sdg.readthedocs.io/en/latest/metadata-format/#composite-breakdown-label"
|
14
|
+
}
|
15
|
+
]
|
16
|
+
},
|
6
17
|
"computation_units": {
|
7
18
|
"type": "string",
|
8
19
|
"title": "Unit of measurement",
|
@@ -207,142 +218,131 @@
|
|
207
218
|
"items": {
|
208
219
|
"type": "object",
|
209
220
|
"title": "Graph annotation",
|
210
|
-
"
|
211
|
-
"
|
212
|
-
|
213
|
-
"title": "Preset",
|
214
|
-
"enum": ["target_line"],
|
215
|
-
"description": "A preset bundle of configurations."
|
216
|
-
},
|
217
|
-
"value": {
|
218
|
-
"type": "number",
|
219
|
-
"minimum": 0,
|
220
|
-
"title": "Value",
|
221
|
-
"description": "The value at which to draw the line. For horizontal lines, this number corresponds to your actual data. For vertical lines, this number should be between 0 (the left side of the chart) and the number of years minus 1 (the right side of the chart)."
|
222
|
-
},
|
223
|
-
"endValue": {
|
224
|
-
"type": "number",
|
225
|
-
"title": "End value",
|
226
|
-
"description": "Optionally add a different ending value for the line."
|
227
|
-
},
|
228
|
-
"description": {
|
229
|
-
"type": "string",
|
230
|
-
"title": "Description",
|
231
|
-
"description": "A description of the annotation to be read by screenreaders."
|
232
|
-
},
|
233
|
-
"unit": {
|
234
|
-
"type": "string",
|
235
|
-
"title": "Unit",
|
236
|
-
"description": "The unit of measurement the annotation displays on."
|
237
|
-
},
|
238
|
-
"series": {
|
239
|
-
"type": "string",
|
240
|
-
"title": "Series",
|
241
|
-
"description": "The series the annotation displays on."
|
242
|
-
},
|
243
|
-
"mode": {
|
244
|
-
"type": "string",
|
245
|
-
"title": "Mode",
|
246
|
-
"description": "Whether the line will be vertical or horizontal.",
|
247
|
-
"enum": ["horizontal", "vertical"]
|
248
|
-
},
|
249
|
-
"borderColor": {
|
250
|
-
"type": "string",
|
251
|
-
"format": "color",
|
252
|
-
"title": "Line color",
|
253
|
-
"description": "The color of the line.",
|
254
|
-
"links": [
|
255
|
-
{
|
256
|
-
"rel": "More information on the border color setting",
|
257
|
-
"href": "https://github.com/chartjs/chartjs-plugin-annotation/blob/master/README.md"
|
258
|
-
}
|
259
|
-
]
|
260
|
-
},
|
261
|
-
"borderDash": {
|
262
|
-
"type": "string",
|
263
|
-
"title": "Line dash type",
|
264
|
-
"description": "The type of line dash.",
|
265
|
-
"links": [
|
266
|
-
{
|
267
|
-
"rel": "More information on the line dash setting",
|
268
|
-
"href": "https://github.com/chartjs/chartjs-plugin-annotation/blob/master/README.md"
|
269
|
-
}
|
270
|
-
]
|
271
|
-
},
|
272
|
-
"label": {
|
273
|
-
"type": "object",
|
274
|
-
"title": "Label",
|
275
|
-
"description": "A text label for the annotation.",
|
221
|
+
"allOf": [
|
222
|
+
{ "$ref": "#/definitions/series_unit_constraint" },
|
223
|
+
{
|
276
224
|
"properties": {
|
277
|
-
"
|
278
|
-
"type": "
|
279
|
-
"
|
280
|
-
"
|
281
|
-
"
|
282
|
-
"top",
|
283
|
-
"bottom",
|
284
|
-
"left",
|
285
|
-
"right",
|
286
|
-
"center"
|
287
|
-
]
|
225
|
+
"value": {
|
226
|
+
"type": "number",
|
227
|
+
"minimum": 0,
|
228
|
+
"title": "Value",
|
229
|
+
"description": "The value at which to draw the line. For horizontal lines, this number corresponds to your actual data. For vertical lines, this number should be between 0 (the left side of the chart) and the number of years minus 1 (the right side of the chart)."
|
288
230
|
},
|
289
|
-
"
|
290
|
-
"type": "
|
291
|
-
"
|
292
|
-
"
|
293
|
-
"description": "Text of the line label."
|
231
|
+
"endValue": {
|
232
|
+
"type": "number",
|
233
|
+
"title": "End value",
|
234
|
+
"description": "Optionally add a different ending value for the line."
|
294
235
|
},
|
295
|
-
"
|
236
|
+
"description": {
|
296
237
|
"type": "string",
|
297
|
-
"
|
298
|
-
"
|
299
|
-
"description": "Color for the label text."
|
238
|
+
"title": "Description",
|
239
|
+
"description": "A description of the annotation to be read by screenreaders."
|
300
240
|
},
|
301
|
-
"
|
241
|
+
"mode": {
|
302
242
|
"type": "string",
|
303
|
-
"
|
304
|
-
"
|
305
|
-
"
|
306
|
-
|
307
|
-
}
|
308
|
-
}
|
309
|
-
},
|
310
|
-
"highContrast": {
|
311
|
-
"type": "object",
|
312
|
-
"title": "High contrast options",
|
313
|
-
"description": "High-contrast overrides of certain color.",
|
314
|
-
"properties": {
|
243
|
+
"title": "Mode",
|
244
|
+
"description": "Whether the line will be vertical or horizontal.",
|
245
|
+
"enum": ["horizontal", "vertical"]
|
246
|
+
},
|
315
247
|
"borderColor": {
|
316
248
|
"type": "string",
|
317
249
|
"format": "color",
|
318
|
-
"
|
319
|
-
"
|
320
|
-
"
|
250
|
+
"title": "Line color",
|
251
|
+
"description": "The color of the line.",
|
252
|
+
"links": [
|
253
|
+
{
|
254
|
+
"rel": "More information on the border color setting",
|
255
|
+
"href": "https://github.com/chartjs/chartjs-plugin-annotation/blob/master/README.md"
|
256
|
+
}
|
257
|
+
]
|
258
|
+
},
|
259
|
+
"borderDash": {
|
260
|
+
"type": "string",
|
261
|
+
"title": "Line dash type",
|
262
|
+
"description": "The type of line dash.",
|
263
|
+
"links": [
|
264
|
+
{
|
265
|
+
"rel": "More information on the line dash setting",
|
266
|
+
"href": "https://github.com/chartjs/chartjs-plugin-annotation/blob/master/README.md"
|
267
|
+
}
|
268
|
+
]
|
321
269
|
},
|
322
270
|
"label": {
|
323
271
|
"type": "object",
|
324
|
-
"title": "
|
325
|
-
"description": "
|
272
|
+
"title": "Label",
|
273
|
+
"description": "A text label for the annotation.",
|
326
274
|
"properties": {
|
275
|
+
"position": {
|
276
|
+
"type": "string",
|
277
|
+
"title": "Position",
|
278
|
+
"description": "Placement of the label along the line.",
|
279
|
+
"enum": [
|
280
|
+
"top",
|
281
|
+
"bottom",
|
282
|
+
"left",
|
283
|
+
"right",
|
284
|
+
"center"
|
285
|
+
]
|
286
|
+
},
|
287
|
+
"content": {
|
288
|
+
"type": "string",
|
289
|
+
"minLength": 1,
|
290
|
+
"title": "Content",
|
291
|
+
"description": "Text of the line label."
|
292
|
+
},
|
327
293
|
"fontColor": {
|
328
294
|
"type": "string",
|
329
295
|
"format": "color",
|
330
|
-
"
|
331
|
-
"
|
332
|
-
"description": "Color for the label text in high-contrast mode."
|
296
|
+
"title": "Label color",
|
297
|
+
"description": "Color for the label text."
|
333
298
|
},
|
334
299
|
"backgroundColor": {
|
335
300
|
"type": "string",
|
336
301
|
"format": "color",
|
337
|
-
"default": "#
|
338
|
-
"title": "
|
339
|
-
"description": "Background color for the label text
|
302
|
+
"default": "#FFFFFFF",
|
303
|
+
"title": "Background color",
|
304
|
+
"description": "Background color for the label text."
|
305
|
+
}
|
306
|
+
}
|
307
|
+
},
|
308
|
+
"highContrast": {
|
309
|
+
"type": "object",
|
310
|
+
"title": "High contrast options",
|
311
|
+
"description": "High-contrast overrides of certain color.",
|
312
|
+
"properties": {
|
313
|
+
"borderColor": {
|
314
|
+
"type": "string",
|
315
|
+
"format": "color",
|
316
|
+
"default": "#FFFFFF",
|
317
|
+
"title": "High-contrast line color",
|
318
|
+
"description": "The color of the line in high-contrast mode."
|
319
|
+
},
|
320
|
+
"label": {
|
321
|
+
"type": "object",
|
322
|
+
"title": "High contrast label",
|
323
|
+
"description": "High-contrast version of the label.",
|
324
|
+
"properties": {
|
325
|
+
"fontColor": {
|
326
|
+
"type": "string",
|
327
|
+
"format": "color",
|
328
|
+
"default": "#FFFFFF",
|
329
|
+
"title": "High-contrast label color",
|
330
|
+
"description": "Color for the label text in high-contrast mode."
|
331
|
+
},
|
332
|
+
"backgroundColor": {
|
333
|
+
"type": "string",
|
334
|
+
"format": "color",
|
335
|
+
"default": "#000000",
|
336
|
+
"title": "High-contrast background color",
|
337
|
+
"description": "Background color for the label text in high-contrast mode."
|
338
|
+
}
|
339
|
+
}
|
340
340
|
}
|
341
341
|
}
|
342
342
|
}
|
343
343
|
}
|
344
344
|
}
|
345
|
-
|
345
|
+
]
|
346
346
|
},
|
347
347
|
"links": [
|
348
348
|
{
|
@@ -359,30 +359,25 @@
|
|
359
359
|
"items": {
|
360
360
|
"type": "object",
|
361
361
|
"title": "Graph limit",
|
362
|
-
"
|
363
|
-
"
|
364
|
-
|
365
|
-
"
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
},
|
380
|
-
"series": {
|
381
|
-
"type": "string",
|
382
|
-
"title": "Series",
|
383
|
-
"description": "The series the limits apply to."
|
362
|
+
"allOf": [
|
363
|
+
{ "$ref": "#/definitions/series_unit_constraint" },
|
364
|
+
{
|
365
|
+
"properties": {
|
366
|
+
"minimum": {
|
367
|
+
"type": "number",
|
368
|
+
"minimum": 0,
|
369
|
+
"title": "Minimum",
|
370
|
+
"description": "Minimum value for the y axis."
|
371
|
+
},
|
372
|
+
"maximum": {
|
373
|
+
"type": "number",
|
374
|
+
"minimum": 0,
|
375
|
+
"title": "Maximum",
|
376
|
+
"description": "Maximum value for the y axis."
|
377
|
+
}
|
378
|
+
}
|
384
379
|
}
|
385
|
-
|
380
|
+
]
|
386
381
|
},
|
387
382
|
"links": [
|
388
383
|
{
|
@@ -421,24 +416,19 @@
|
|
421
416
|
"items": {
|
422
417
|
"type": "object",
|
423
418
|
"title": "Graph title",
|
424
|
-
"
|
425
|
-
"
|
426
|
-
|
427
|
-
"
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
},
|
436
|
-
"series": {
|
437
|
-
"type": "string",
|
438
|
-
"title": "Series",
|
439
|
-
"description": "The series the title applies to."
|
419
|
+
"allOf": [
|
420
|
+
{ "$ref": "#/definitions/series_unit_constraint" },
|
421
|
+
{
|
422
|
+
"properties": {
|
423
|
+
"title": {
|
424
|
+
"type": "string",
|
425
|
+
"minLength": 1,
|
426
|
+
"title": "Title",
|
427
|
+
"description": "The graph title."
|
428
|
+
}
|
429
|
+
}
|
440
430
|
}
|
441
|
-
|
431
|
+
]
|
442
432
|
}
|
443
433
|
},
|
444
434
|
"graph_type": {
|
@@ -453,6 +443,17 @@
|
|
453
443
|
}
|
454
444
|
]
|
455
445
|
},
|
446
|
+
"indicator_available": {
|
447
|
+
"type": "string",
|
448
|
+
"title": "Indicator available",
|
449
|
+
"description": "An optional sub-title for the indicator, which displays below the indicator name. Intended for cases where the available data is slightly different than the indicator name.",
|
450
|
+
"links": [
|
451
|
+
{
|
452
|
+
"rel": "More information on the indicator available setting",
|
453
|
+
"href": "https://open-sdg.readthedocs.io/en/latest/metadata-format/#recommended-special-fields"
|
454
|
+
}
|
455
|
+
]
|
456
|
+
},
|
456
457
|
"indicator_name": {
|
457
458
|
"type": "string",
|
458
459
|
"title": "Indicator name",
|
@@ -492,6 +493,39 @@
|
|
492
493
|
"title": "Page content",
|
493
494
|
"description": "Content which displays in the main content area of the indicator page."
|
494
495
|
},
|
496
|
+
"permalink": {
|
497
|
+
"type": "string",
|
498
|
+
"title": "Permalink",
|
499
|
+
"description": "Overrides the normal path of the indicator page. Not recommended, execpt for 'standalone' indicators.",
|
500
|
+
"links": [
|
501
|
+
{
|
502
|
+
"rel": "More information the permalink setting",
|
503
|
+
"href": "https://open-sdg.readthedocs.io/en/latest/metadata-format/#standalone-indicators"
|
504
|
+
}
|
505
|
+
]
|
506
|
+
},
|
507
|
+
"precision": {
|
508
|
+
"options": {"collapsed": true},
|
509
|
+
"type": "array",
|
510
|
+
"title": "Precision rules",
|
511
|
+
"description": "Control the number of decimal places for data in this indicator.",
|
512
|
+
"items": {
|
513
|
+
"type": "object",
|
514
|
+
"title": "Precision rule",
|
515
|
+
"allOf": [
|
516
|
+
{ "$ref": "#/definitions/series_unit_constraint" },
|
517
|
+
{
|
518
|
+
"properties": {
|
519
|
+
"decimals": {
|
520
|
+
"type": "number",
|
521
|
+
"title": "Decimals",
|
522
|
+
"description": "The number of decimal places"
|
523
|
+
}
|
524
|
+
}
|
525
|
+
}
|
526
|
+
]
|
527
|
+
}
|
528
|
+
},
|
495
529
|
"reporting_status": {
|
496
530
|
"type": "string",
|
497
531
|
"title": "Reporting status",
|
@@ -504,6 +538,29 @@
|
|
504
538
|
}
|
505
539
|
]
|
506
540
|
},
|
541
|
+
"sort": {
|
542
|
+
"type": "string",
|
543
|
+
"title": "Sort order",
|
544
|
+
"description": "Override the default order in which this indicator is displayed in lists. This can be left blank, and it will be automatically determined.",
|
545
|
+
"links": [
|
546
|
+
{
|
547
|
+
"rel": "More information on the sort setting",
|
548
|
+
"href": "https://open-sdg.readthedocs.io/en/latest/metadata-format/#sorting-in-lists"
|
549
|
+
}
|
550
|
+
]
|
551
|
+
},
|
552
|
+
"standalone": {
|
553
|
+
"title": "Standalone indicator",
|
554
|
+
"type": "boolean",
|
555
|
+
"description": "Whether the indicator is standalone (separate from the SDGs) or not.",
|
556
|
+
"format": "checkbox",
|
557
|
+
"links": [
|
558
|
+
{
|
559
|
+
"rel": "More information the standalone setting",
|
560
|
+
"href": "https://open-sdg.readthedocs.io/en/latest/metadata-format/#standalone-indicators"
|
561
|
+
}
|
562
|
+
]
|
563
|
+
},
|
507
564
|
"tags": {
|
508
565
|
"options": {"collapsed": true},
|
509
566
|
"type": "array",
|
@@ -521,5 +578,22 @@
|
|
521
578
|
]
|
522
579
|
}
|
523
580
|
},
|
524
|
-
"additionalProperties": true
|
581
|
+
"additionalProperties": true,
|
582
|
+
"definitions": {
|
583
|
+
"series_unit_constraint": {
|
584
|
+
"type": "object",
|
585
|
+
"properties": {
|
586
|
+
"series": {
|
587
|
+
"type": "string",
|
588
|
+
"title": "Series",
|
589
|
+
"description": "Limit to this particular series"
|
590
|
+
},
|
591
|
+
"unit": {
|
592
|
+
"type": "string",
|
593
|
+
"title": "Unit",
|
594
|
+
"description": "Limit to this particular unit"
|
595
|
+
}
|
596
|
+
}
|
597
|
+
}
|
598
|
+
}
|
525
599
|
}
|