jekyll-open-sdg-plugins 1.2.0.pre.beta6 → 1.4.0.pre.beta1

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.
@@ -87,6 +87,25 @@
87
87
  }
88
88
  ]
89
89
  },
90
+ "contrast_type": {
91
+ "type": "string",
92
+ "title": "Contrast type",
93
+ "description": "The type of high-contrast toggle to use.",
94
+ "enum": ["default", "single", "long"],
95
+ "options": {
96
+ "enum_titles": [
97
+ "Default - two 'A' buttons side-by-side",
98
+ "Single - one 'A' button which toggles on/off",
99
+ "Long - text toggling between 'High contrast' and 'Default contrast'"
100
+ ]
101
+ },
102
+ "links": [
103
+ {
104
+ "rel": "More information on the contrast type setting",
105
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#contrast_type"
106
+ }
107
+ ]
108
+ },
90
109
  "country": {
91
110
  "options": {"collapsed": true},
92
111
  "type": "object",
@@ -113,35 +132,6 @@
113
132
  }
114
133
  ]
115
134
  },
116
- "create_config_forms": {
117
- "options": {"collapsed": true},
118
- "type": "object",
119
- "title": "Create configuration forms",
120
- "description": "This setting can be used to automatically create the configuration form pages.",
121
- "properties": {
122
- "layout": {
123
- "type": "string",
124
- "title": "Layout",
125
- "enum": [
126
- "",
127
- "config-builder"
128
- ],
129
- "options": {
130
- "enum_titles": [
131
- "Do not automatically create config forms",
132
- "config-builder"
133
- ]
134
- },
135
- "description": "The layout to use for the configuration form pages."
136
- }
137
- },
138
- "links": [
139
- {
140
- "rel": "More information on the create config forms setting",
141
- "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#create_config_forms"
142
- }
143
- ]
144
- },
145
135
  "create_goals": {
146
136
  "options": {"collapsed": true},
147
137
  "type": "object",
@@ -167,6 +157,12 @@
167
157
  },
168
158
  "description": "The layout to use for the goal pages."
169
159
  },
160
+ "previous_next_links": {
161
+ "title": "Previous/next links",
162
+ "type": "boolean",
163
+ "description": "This setting can be used to show navigation links to the previous/next goals.",
164
+ "format": "checkbox"
165
+ },
170
166
  "goals": {
171
167
  "options": {"collapsed": true},
172
168
  "type": "array",
@@ -213,6 +209,12 @@
213
209
  ]
214
210
  },
215
211
  "description": "The layout to use for the indicator pages."
212
+ },
213
+ "previous_next_links": {
214
+ "title": "Previous/next links",
215
+ "type": "boolean",
216
+ "description": "This setting can be used to show navigation links to the previous/next indicators.",
217
+ "format": "checkbox"
216
218
  }
217
219
  },
218
220
  "links": [
@@ -306,6 +308,30 @@
306
308
  }
307
309
  ]
308
310
  },
311
+ "data_fields": {
312
+ "options": {"collapsed": true},
313
+ "type": "object",
314
+ "title": "Data fields",
315
+ "description": "Control the names of fields used for special purposes in data.",
316
+ "properties": {
317
+ "units": {
318
+ "type": "string",
319
+ "title": "Units",
320
+ "description": "Field to reserve for units of measurement. Defaults to 'Units'."
321
+ },
322
+ "series": {
323
+ "type": "string",
324
+ "title": "Series",
325
+ "description": "Field to reserve for the SDG series. Defaults to 'Series'."
326
+ }
327
+ },
328
+ "links": [
329
+ {
330
+ "rel": "More information on the data fields setting",
331
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#data_fields"
332
+ }
333
+ ]
334
+ },
309
335
  "date_formats": {
310
336
  "options": {"collapsed": true},
311
337
  "type": "array",
@@ -575,12 +601,40 @@
575
601
  }
576
602
  ]
577
603
  },
604
+ "graph_color_headline": {
605
+ "type": "string",
606
+ "format": "color",
607
+ "title": "Graph color for headline",
608
+ "default": "#004466",
609
+ "description": "This setting can be used to customize the color used in the chart 'headlines'.",
610
+ "examples": [],
611
+ "links": [
612
+ {
613
+ "rel": "More information on the graph color headline setting",
614
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#graph_color_headline"
615
+ }
616
+ ]
617
+ },
618
+ "graph_color_headline_high_contrast": {
619
+ "type": "string",
620
+ "format": "color",
621
+ "title": "Graph color for headline - high-contrast",
622
+ "default": "#55a6e5",
623
+ "description": "This setting can be used to customize the color used in the chart 'headlines' in high-contrast mode.",
624
+ "examples": [],
625
+ "links": [
626
+ {
627
+ "rel": "More information on the graph color headline high-contrast setting",
628
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#graph_color_headline_high_contrast"
629
+ }
630
+ ]
631
+ },
578
632
  "graph_color_set": {
579
633
  "type": "string",
580
634
  "title": "Graph color set",
581
635
  "description": "This setting can be used to customize the color set used in the charts.",
582
636
  "examples": [],
583
- "enum": ["default", "sdg", "goal", "custom"],
637
+ "enum": ["default", "accessible", "sdg", "goal", "custom"],
584
638
  "links": [
585
639
  {
586
640
  "rel": "More information on the graph color set setting",
@@ -617,6 +671,47 @@
617
671
  }
618
672
  ]
619
673
  },
674
+ "graph_title_from_series": {
675
+ "title": "Graph title from series",
676
+ "type": "boolean",
677
+ "description": "This setting can be set to `true` to use the selected series for the graph title, whenever possible.",
678
+ "format": "checkbox",
679
+ "links": [
680
+ {
681
+ "rel": "More information on the graph title from series setting",
682
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#graph_title_from_series"
683
+ }
684
+ ]
685
+ },
686
+ "header": {
687
+ "options": {"collapsed": true},
688
+ "type": "object",
689
+ "title": "Header",
690
+ "description": "This setting can be used to customise the header.",
691
+ "properties": {
692
+ "include": {
693
+ "type": "string",
694
+ "title": "Include file",
695
+ "enum": [
696
+ "header-default.html",
697
+ "header-menu-left-aligned.html"
698
+ ],
699
+ "options": {
700
+ "enum_titles": [
701
+ "Default header",
702
+ "Menu left-aligned"
703
+ ]
704
+ },
705
+ "description": "The header style to use on all pages."
706
+ }
707
+ },
708
+ "links": [
709
+ {
710
+ "rel": "More information on the header setting",
711
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#header"
712
+ }
713
+ ]
714
+ },
620
715
  "header_language_toggle": {
621
716
  "type": "string",
622
717
  "title": "Header language toggle",
@@ -648,6 +743,69 @@
648
743
  "description": "Configuration of the indicator configuration form.",
649
744
  "$ref": "#/definitions/config_form_options"
650
745
  },
746
+ "indicator_data_form": {
747
+ "options": {"collapsed": true},
748
+ "type": "object",
749
+ "title": "Indicator data form",
750
+ "description": "Configuration of the indicator data form.",
751
+ "properties": {
752
+ "enabled": {
753
+ "type": "boolean",
754
+ "title": "Enable this type of form",
755
+ "description": "If enabled, the indicator data form will be available.",
756
+ "format": "checkbox"
757
+ },
758
+ "repository_link": {
759
+ "type": "string",
760
+ "title": "Repository link",
761
+ "description": "The URL pattern of the 'Go to repository' link on the configuration page."
762
+ }
763
+ }
764
+ },
765
+ "indicator_metadata_form": {
766
+ "options": {"collapsed": true},
767
+ "type": "object",
768
+ "title": "Indicator metadata form",
769
+ "description": "Configuration of the indicator metadata form.",
770
+ "allOf": [
771
+ { "$ref": "#/definitions/config_form_options" },
772
+ {
773
+ "properties": {
774
+ "language": {
775
+ "type": "string",
776
+ "title": "Language for editing",
777
+ "description": "Choose the language you prefer when editing metadata. This is used to translate the labels of the metadata fields."
778
+ },
779
+ "scopes": {
780
+ "options": {"collapsed": true},
781
+ "type": "array",
782
+ "title": "Metadata scopes",
783
+ "description": "Specify the 'scopes' of metadata to include on the form. Eg: 'national' or 'global'.",
784
+ "items": {
785
+ "type": "string",
786
+ "title": "Scope"
787
+ }
788
+ },
789
+ "exclude_fields": {
790
+ "options": {"collapsed": true},
791
+ "type": "array",
792
+ "title": "Exclude fields",
793
+ "description": "Specify any fields you would like to exclude from the form.",
794
+ "items": {
795
+ "type": "string",
796
+ "title": "Field"
797
+ }
798
+ },
799
+ "translated": {
800
+ "type": "boolean",
801
+ "title": "Display translated contents in the form",
802
+ "description": "This should only be enabled if you are using the 'subfolder' approach for your metadata.",
803
+ "format": "checkbox"
804
+ }
805
+ }
806
+ }
807
+ ]
808
+ },
651
809
  "languages": {
652
810
  "options": {"collapsed": true},
653
811
  "type": "array",
@@ -696,6 +854,41 @@
696
854
  }
697
855
  ]
698
856
  },
857
+ "logos": {
858
+ "options": {"collapsed": true},
859
+ "type": "array",
860
+ "title": "Logos",
861
+ "description": "This setting can be used to control the main logo (or logos).",
862
+ "items": {
863
+ "type": "object",
864
+ "title": "Logo",
865
+ "properties": {
866
+ "language": {
867
+ "type": "string",
868
+ "title": "Language",
869
+ "description": "The language on which this logo displays. Leave blank to show on all."
870
+ },
871
+ "src": {
872
+ "type": "string",
873
+ "minLength": 1,
874
+ "title": "Image file",
875
+ "description": "The image file (path or URL) for this logo"
876
+ },
877
+ "alt": {
878
+ "type": "string",
879
+ "minLength": 1,
880
+ "title": "Alt text",
881
+ "description": "The alt text for this logo"
882
+ }
883
+ }
884
+ },
885
+ "links": [
886
+ {
887
+ "rel": "More information on the logos setting",
888
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#logos"
889
+ }
890
+ ]
891
+ },
699
892
  "map_layers": {
700
893
  "options": {"collapsed": true},
701
894
  "type": "array",
@@ -855,7 +1048,23 @@
855
1048
  "title": "Main menu",
856
1049
  "description": "The links to display in the main menu.",
857
1050
  "items": {
858
- "$ref": "#/definitions/menu_item"
1051
+ "title": "Menu item",
1052
+ "allOf": [
1053
+ { "$ref": "#/definitions/menu_item" },
1054
+ {
1055
+ "properties": {
1056
+ "dropdown": {
1057
+ "title": "Dropdown menu",
1058
+ "type": "array",
1059
+ "description": "Enter menu items here to turn this into a dropdown.",
1060
+ "items": {
1061
+ "$ref": "#/definitions/menu_item",
1062
+ "title": "Dropdown menu item"
1063
+ }
1064
+ }
1065
+ }
1066
+ }
1067
+ ]
859
1068
  },
860
1069
  "links": [
861
1070
  {
@@ -946,8 +1155,8 @@
946
1155
  "remote_data_prefix": {
947
1156
  "type": "string",
948
1157
  "minLength": 1,
949
- "title": "Remote data repository URL",
950
- "description": "Specify the URL of your published data repository.",
1158
+ "title": "Remote data prefix",
1159
+ "description": "Specify the URL of the 'data service' that is generated from your data repository.",
951
1160
  "links": [
952
1161
  {
953
1162
  "rel": "More information on the remote data prefix setting",
@@ -980,6 +1189,28 @@
980
1189
  }
981
1190
  ]
982
1191
  },
1192
+ "repository_url_data": {
1193
+ "type": "string",
1194
+ "title": "Repository URL - Data",
1195
+ "description": "The URL of your data repository, eg: https://github.com/my-github-org/data",
1196
+ "links": [
1197
+ {
1198
+ "rel": "More information on the data repository URL setting",
1199
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#repository_url_data"
1200
+ }
1201
+ ]
1202
+ },
1203
+ "repository_url_site": {
1204
+ "type": "string",
1205
+ "title": "Repository URL - Site",
1206
+ "description": "The URL of your site repository, eg: https://github.com/my-github-org/site",
1207
+ "links": [
1208
+ {
1209
+ "rel": "More information on the site repository URL setting",
1210
+ "href": "https://open-sdg.readthedocs.io/en/latest/configuration/#repository_url_site"
1211
+ }
1212
+ ]
1213
+ },
983
1214
  "search_index_boost": {
984
1215
  "options": {"collapsed": true},
985
1216
  "type": "array",
@@ -1166,6 +1397,12 @@
1166
1397
  "config_form_options": {
1167
1398
  "type": "object",
1168
1399
  "properties": {
1400
+ "enabled": {
1401
+ "type": "boolean",
1402
+ "title": "Enable this type of form",
1403
+ "description": "If enabled, this type of configuration form will be available.",
1404
+ "format": "checkbox"
1405
+ },
1169
1406
  "dropdowns": {
1170
1407
  "type": "array",
1171
1408
  "title": "Dropdown lists",
@@ -1199,6 +1436,16 @@
1199
1436
  }
1200
1437
  }
1201
1438
  }
1439
+ },
1440
+ "repository_link": {
1441
+ "type": "string",
1442
+ "title": "Repository link",
1443
+ "description": "The URL pattern of the 'Go to repository' link on the configuration page."
1444
+ },
1445
+ "translation_link": {
1446
+ "type": "string",
1447
+ "title": "Translation link",
1448
+ "description": "The URL pattern for all 'Go to translation' links on the configuration page."
1202
1449
  }
1203
1450
  }
1204
1451
  }
@@ -15,7 +15,11 @@ module JekyllOpenSdgPlugins
15
15
  # Get a target number from an indicator number.
16
16
  def get_target_number(indicator_number)
17
17
  parts = indicator_number.split('.')
18
- parts[0] + '.' + parts[1]
18
+ if parts.length() < 2
19
+ indicator_number
20
+ else
21
+ parts[0] + '.' + parts[1]
22
+ end
19
23
  end
20
24
 
21
25
  # Is this string numeric?
@@ -43,10 +47,28 @@ module JekyllOpenSdgPlugins
43
47
  sort_order
44
48
  end
45
49
 
50
+ # Get previous item from an array, or loop to the end.
51
+ def get_previous_item(list, index)
52
+ decremented = index - 1
53
+ if decremented < 0
54
+ decremented = list.length() - 1
55
+ end
56
+ list[decremented]
57
+ end
58
+
59
+ # Get next item from an array, or loop to the beginning.
60
+ def get_next_item(list, index)
61
+ incremented = index + 1
62
+ if incremented >= list.length()
63
+ incremented = 0
64
+ end
65
+ list[incremented]
66
+ end
67
+
46
68
  # The Jekyll baseurl is user-configured, and can be inconsistent. This
47
69
  # ensure it is consistent in whether it starts/ends with a slash.
48
70
  def normalize_baseurl(baseurl)
49
- if baseurl == ''
71
+ if baseurl == '' || baseurl.nil?
50
72
  baseurl = '/'
51
73
  end
52
74
  if !baseurl.start_with? '/'
@@ -170,7 +192,7 @@ module JekyllOpenSdgPlugins
170
192
  goal_image_base = site.config['goal_image_base']
171
193
  end
172
194
  goal_image_extension = 'png'
173
- if site.config.has_key? 'goal_image_extension'
195
+ if site.config.has_key?('goal_image_extension') && site.config['goal_image_extension'] != ''
174
196
  goal_image_extension = site.config['goal_image_extension']
175
197
  end
176
198
 
@@ -209,6 +231,7 @@ module JekyllOpenSdgPlugins
209
231
  goal_number = get_goal_number(indicator_number)
210
232
  target_number = get_target_number(indicator_number)
211
233
  is_global_indicator = global_inids.index(indicator_number) != nil
234
+
212
235
  # To get the name of global stuff, we can use predicable translation
213
236
  # keys from the SDG Translations project. Eg: global_goals.1-title
214
237
  goal_translation_key = 'global_goals.' + goal_number
@@ -253,8 +276,10 @@ module JekyllOpenSdgPlugins
253
276
  end
254
277
  end
255
278
 
279
+ is_standalone = (meta.has_key?('standalone') and meta['standalone'])
280
+
256
281
  # Set the goal for this language, once only.
257
- if already_added[language].index(goal_number) == nil
282
+ if !is_standalone && already_added[language].index(goal_number) == nil
258
283
  already_added[language].push(goal_number)
259
284
  available_goal = {
260
285
  'number' => goal_number,
@@ -269,7 +294,7 @@ module JekyllOpenSdgPlugins
269
294
  available_goals[language].push(available_goal)
270
295
  end
271
296
  # Set the target for this language, once only.
272
- if already_added[language].index(target_number) == nil
297
+ if !is_standalone && already_added[language].index(target_number) == nil
273
298
  already_added[language].push(target_number)
274
299
  available_target = {
275
300
  'number' => target_number,
@@ -293,12 +318,21 @@ module JekyllOpenSdgPlugins
293
318
  else
294
319
  indicator_name = meta['indicator_name']
295
320
  end
321
+ indicator_path = indicator_number
322
+ if is_standalone && meta.has_key?('permalink') && meta['permalink'] != ''
323
+ indicator_path = meta['permalink']
324
+ end
325
+ indicator_sort = get_sort_order(indicator_number)
326
+ if meta.has_key?('sort') && meta['sort'] != ''
327
+ # Allow metadata 'sort' field to override the default sort.
328
+ indicator_sort = meta['sort']
329
+ end
296
330
  available_indicator = {
297
331
  'number' => indicator_number,
298
332
  'slug' => indicator_number.gsub('.', '-'),
299
333
  'name' => opensdg_translate_key(indicator_name, translations, language),
300
- 'url' => get_url(baseurl, language, indicator_number, languages, languages_public),
301
- 'sort' => get_sort_order(indicator_number),
334
+ 'url' => get_url(baseurl, language, indicator_path, languages, languages_public),
335
+ 'sort' => indicator_sort,
302
336
  'goal_number' => goal_number,
303
337
  'target_number' => target_number,
304
338
  'global' => global_indicator,
@@ -353,8 +387,36 @@ module JekyllOpenSdgPlugins
353
387
  doc.data['remote_data_prefix'] = normalize_baseurl(baseurl)
354
388
  end
355
389
  if opensdg_translated_builds(site)
390
+ doc.data['remote_data_prefix_untranslated'] = File.join(doc.data['remote_data_prefix'], 'untranslated')
356
391
  doc.data['remote_data_prefix'] = File.join(doc.data['remote_data_prefix'], language)
392
+ else
393
+ doc.data['remote_data_prefix_untranslated'] = doc.data['remote_data_prefix']
394
+ end
395
+
396
+ # Set the logo for this page.
397
+ logo = {}
398
+ match = false
399
+ if site.config.has_key?('logos') && site.config['logos'].length > 0
400
+ match = site.config['logos'].find{ |item| item['language'] == language }
401
+ unless match
402
+ match = site.config['logos'].find{ |item| item.fetch('language', '') == '' }
403
+ end
357
404
  end
405
+ if match
406
+ src = match['src']
407
+ unless src.start_with?('http')
408
+ src = normalize_baseurl(baseurl) + src
409
+ end
410
+ logo['src'] = src
411
+ logo['alt'] = opensdg_translate_key(match['alt'], translations, language)
412
+ else
413
+ logo['src'] = normalize_baseurl(baseurl) + 'assets/img/SDG_logo.png'
414
+ alt_text = opensdg_translate_key('general.sdg', translations, language)
415
+ alt_text += ' - '
416
+ alt_text += opensdg_translate_key('header.tag_line', translations, language)
417
+ logo['alt'] = alt_text
418
+ end
419
+ doc.data['logo'] = logo
358
420
 
359
421
  if collection == 'indicators'
360
422
  # For indicators we also set the current indicator/target/goal.
@@ -374,7 +436,11 @@ module JekyllOpenSdgPlugins
374
436
  target_number = get_target_number(indicator_number)
375
437
  doc.data['goal'] = available_goals[language].find {|x| x['number'] == goal_number}
376
438
  doc.data['target'] = available_targets[language].find {|x| x['number'] == target_number}
377
- doc.data['indicator'] = available_indicators[language].find {|x| x['number'] == indicator_number}
439
+ indicator_index = available_indicators[language].find_index {|x| x['number'] == indicator_number}
440
+ doc.data['indicator'] = available_indicators[language][indicator_index]
441
+ doc.data['next'] = get_next_item(available_indicators[language], indicator_index)
442
+ doc.data['previous'] = get_previous_item(available_indicators[language], indicator_index)
443
+
378
444
  elsif collection == 'goals'
379
445
  # For goals we also set the current goal.
380
446
  if doc.data.has_key? 'goal_number'
@@ -389,7 +455,10 @@ module JekyllOpenSdgPlugins
389
455
  if goal_number.is_a? Numeric
390
456
  goal_number = goal_number.to_s
391
457
  end
392
- doc.data['goal'] = available_goals[language].find {|x| x['number'] == goal_number}
458
+ goal_index = available_goals[language].find_index {|x| x['number'] == goal_number}
459
+ doc.data['goal'] = available_goals[language][goal_index]
460
+ doc.data['next'] = get_next_item(available_goals[language], goal_index)
461
+ doc.data['previous'] = get_previous_item(available_goals[language], goal_index)
393
462
  end
394
463
  end
395
464
  end