jekyll-theme-centos 2.52.0.beta.46 → 2.52.0.beta.48

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/_data/base/bits.yml +5 -5
  3. data/_data/base/locales_schema.yml +142 -9
  4. data/_data/base/social.yml +22 -21
  5. data/_data/base/social_schema.yml +10 -6
  6. data/_data/base/sponsors.yml +41 -0
  7. data/_data/base/sponsors_schema.yml +73 -0
  8. data/_includes/base/announcement.html.liquid +2 -0
  9. data/_includes/base/artwork.html.liquid +2 -0
  10. data/_includes/base/bits.html.liquid +2 -0
  11. data/_includes/base/breadcrumb.html.liquid +2 -0
  12. data/_includes/base/breakingnews.html.liquid +2 -0
  13. data/_includes/base/configuration-variables-nested.html.liquid +98 -0
  14. data/_includes/base/configuration-variables.html.liquid +98 -0
  15. data/_includes/base/copyright.html.liquid +3 -1
  16. data/_includes/base/event.html.liquid +2 -0
  17. data/_includes/base/footer.html.liquid +62 -0
  18. data/_includes/base/locales.html.liquid +2 -1
  19. data/_includes/base/navbar.html.liquid +2 -0
  20. data/_includes/base/project.html.liquid +2 -0
  21. data/_includes/base/shortcut.html.liquid +9 -6
  22. data/_includes/base/social.html.liquid +26 -19
  23. data/_includes/base/sponsors-cards.html.liquid +58 -0
  24. data/_includes/base/sponsors-carousel.html.liquid +78 -0
  25. data/_includes/base/title.html.liquid +2 -0
  26. data/_includes/base/toc.html.liquid +2 -0
  27. data/_layouts/base/default.html +5 -51
  28. data/assets/img/base/example-sponsors-design.png +0 -0
  29. data/assets/img/base/example-sponsors-design.svg +226 -0
  30. data/assets/img/base/example-sponsors-logo-1.png +0 -0
  31. data/assets/img/base/example-sponsors-logo-1.svg +120 -0
  32. data/assets/img/base/example-sponsors-logo-2.png +0 -0
  33. data/assets/img/base/example-sponsors-logo-2.svg +116 -0
  34. data/assets/img/base/example-sponsors-logo-3.png +0 -0
  35. data/assets/img/base/example-sponsors-logo-3.svg +123 -0
  36. data/assets/img/base/example-sponsors-logo-4.png +0 -0
  37. data/assets/img/base/example-sponsors-logo-4.svg +116 -0
  38. data/assets/img/base/example-sponsors-logo-5.png +0 -0
  39. data/assets/img/base/example-sponsors-logo-5.svg +116 -0
  40. data/assets/img/base/example-sponsors-logo-6.png +0 -0
  41. data/assets/img/base/example-sponsors-logo-6.svg +116 -0
  42. data/assets/img/base/example-sponsors-logo-7.png +0 -0
  43. data/assets/img/base/example-sponsors-logo-7.svg +116 -0
  44. data/assets/img/base/example-sponsors-logo-8.png +0 -0
  45. data/assets/img/base/example-sponsors-logo-8.svg +110 -0
  46. data/assets/img/base/page-layout-default.png +0 -0
  47. data/assets/img/base/page-layout-default.svg +1291 -965
  48. data/assets/img/base/page-with-announcement.png +0 -0
  49. data/assets/img/base/page-with-announcement.svg +2 -6
  50. data/assets/img/base/page-with-backtotop.png +0 -0
  51. data/assets/img/base/page-with-backtotop.svg +622 -187
  52. data/assets/img/base/page-with-breakingnews.png +0 -0
  53. data/assets/img/base/page-with-breakingnews.svg +2 -42
  54. data/assets/img/base/page-with-copyright.png +0 -0
  55. data/assets/img/base/page-with-copyright.svg +785 -173
  56. data/assets/img/base/page-with-event.png +0 -0
  57. data/assets/img/base/page-with-event.svg +2 -6
  58. data/assets/img/base/page-with-locales.png +0 -0
  59. data/assets/img/base/page-with-locales.svg +614 -619
  60. data/assets/img/base/page-with-navbar.png +0 -0
  61. data/assets/img/base/page-with-navbar.svg +3 -42
  62. data/assets/img/base/page-with-project.png +0 -0
  63. data/assets/img/base/page-with-project.svg +2 -42
  64. data/assets/img/base/page-with-shortcut.png +0 -0
  65. data/assets/img/base/page-with-shortcut.svg +649 -172
  66. data/assets/img/base/page-with-social.png +0 -0
  67. data/assets/img/base/page-with-social.svg +740 -174
  68. data/assets/img/base/page-with-sponsors.png +0 -0
  69. data/assets/img/base/page-with-sponsors.svg +710 -0
  70. data/assets/img/base/page-with-toc.png +0 -0
  71. data/assets/img/base/page-with-toc.svg +3 -42
  72. metadata +30 -3
  73. /data/assets/img/base/{screenshot-example-1200x600.png → screenshot-1200x600.png} +0 -0
  74. /data/assets/img/base/{screenshot-example-1200x600.svg → screenshot-1200x600.svg} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d3c803dbc0eacfc2999709235c94c945b9bf707f9974a5432647bc07357321d
4
- data.tar.gz: 3736a941bd500bd164dc8d4c839b506a8a8a837f1c090dffb8cce45bb99c0273
3
+ metadata.gz: 6038d25fa442be63264e6ce920e4d294ac2b7551371648390193504ac20ce4d3
4
+ data.tar.gz: 7962476a3a8fed79fcc6c7785fd395b64c86100010b4e8cee412ff65a9c6de60
5
5
  SHA512:
6
- metadata.gz: b4ce312cb37982b118eab77b08553e404174f5bb4d7612d2e05d5e255be61867a014766c0e07bb38998f626f1ae0b6558983f18cc5ce826012a8aae692210a4c
7
- data.tar.gz: e178b82afd6fc9225e206e7f37ff322ee87d249be53ba5db6c44fbcec8006e8fc8954f00955ebb464600398ecfc6ca744512eea43a9e561e04ad64b4753a0925
6
+ metadata.gz: ac274007410865e0ae745f84178a505efcf5fd12f997aa59a57728a5256ca1fd6413da09e2d7d5e9027c09c7df13c059642a6627c22cdae3da1f996e6eb4458f
7
+ data.tar.gz: b2280745be4eebae67bfb9cc2225e86d9f2769ad2debcf86085b1807de5e97af258d8938e367519f1e4aa340b0fba692fbcc7c335c8bed7df59f9b80b1bf9192
data/_data/base/bits.yml CHANGED
@@ -8,7 +8,7 @@
8
8
  Lorem ipsum odor amet, consectetuer adipiscing elit. Varius imperdiet
9
9
  convallis at efficitur in eros. Sagittis morbi scelerisque faucibus
10
10
  conubia consectetur.
11
- screenshot: base/screenshot-example-1600x1200.webp
11
+ screenshot: base/screenshot-1600x1200.webp
12
12
  finale: "Derivatives:"
13
13
  actions:
14
14
  - name: Action 1
@@ -36,7 +36,7 @@
36
36
  description: |
37
37
  Lorem ipsum odor amet, consectetuer adipiscing elit. Varius imperdiet
38
38
  convallis at efficitur in eros. Sagittis morbi scelerisque faucibus
39
- screenshot: base/screenshot-example-1600x1200.webp
39
+ screenshot: base/screenshot-1600x1200.webp
40
40
  image: centos-symbol.svg
41
41
  actions:
42
42
  - name: Action 1
@@ -56,7 +56,7 @@
56
56
  - Upstream card example 1
57
57
  - name: Downstream example 1-2
58
58
  icon: fa-solid fa-arrow-right
59
- screenshot: base/screenshot-example-1600x1200.webp
59
+ screenshot: base/screenshot-1600x1200.webp
60
60
  type: downstream
61
61
  description: |
62
62
  Lorem ipsum odor amet, consectetuer adipiscing elit. Varius imperdiet
@@ -69,7 +69,7 @@
69
69
  icon_position: end
70
70
  link: "#"
71
71
  - name: Downstream example 1-3
72
- screenshot: base/screenshot-example-1600x1200.webp
72
+ screenshot: base/screenshot-1600x1200.webp
73
73
  type: downstream
74
74
  description: |
75
75
  Lorem ipsum odor amet, consectetuer adipiscing elit. Varius imperdiet
@@ -82,7 +82,7 @@
82
82
  icon_position: end
83
83
  link: "#"
84
84
  - name: Downstream example 1-4
85
- screenshot: base/screenshot-example-1600x1200.webp
85
+ screenshot: base/screenshot-1600x1200.webp
86
86
  type: downstream
87
87
  description: |
88
88
  Lorem ipsum odor amet, consectetuer adipiscing elit. Varius imperdiet
@@ -12,14 +12,147 @@ properties:
12
12
  display the selector and initiate the content localization process. Set
13
13
  to `false` (default) to hide the selector.
14
14
  with_locales_data:
15
- type: array
16
- default: []
15
+ type: object
16
+ default: {}
17
17
  description: >-
18
- An array of ISO 639-1 or ISO 639-2 language codes (e.g., `["en", "es", "fr"]`).
19
- These codes are used to define the list of available languages in the
20
- selector and initiate the pipeline that generates localized pages.
21
- items:
22
- type: string
23
- description: A single language code (e.g., `es` for Spanish).
24
- minItems: 0 # Explicitly allowing an empty array
18
+ Configuration object for the Language Selector component and the
19
+ jekyll-l10n localization pipeline. Accessed in templates as
20
+ `page.with_locales_data`.
21
+ properties:
22
+ locales:
23
+ type: array
24
+ default: []
25
+ description: >-
26
+ List of ISO 639-1 language codes for which localized pages are
27
+ generated (e.g., `["es", "fr", "it"]`). English (`en`) is always
28
+ included automatically by the template and does not need to be listed
29
+ here.
30
+ items:
31
+ type: string
32
+ description: A single ISO 639-1 language code (e.g., `es` for Spanish).
33
+ minItems: 0
34
+ locales_dir:
35
+ type: string
36
+ default: "_locales"
37
+ description: >-
38
+ Directory (relative to the site root) where `.po` translation files
39
+ are stored. Defaults to `_locales`.
40
+ extract_on_build:
41
+ type: boolean
42
+ default: true
43
+ description: >-
44
+ When `true`, the jekyll-l10n plugin extracts translatable strings
45
+ from the generated HTML during the build phase and writes them to
46
+ the `.po` source files in `locales_dir`.
47
+ update_compendium:
48
+ type: boolean
49
+ default: true
50
+ description: >-
51
+ When `true`, the plugin updates the translation compendium file
52
+ with newly extracted strings.
53
+ extraction:
54
+ type: object
55
+ description: Controls which HTML content is extracted for translation.
56
+ properties:
57
+ translatable_attributes:
58
+ type: array
59
+ default: [title, alt, aria-label, placeholder, aria-description]
60
+ description: >-
61
+ HTML attributes whose values are extracted as translatable
62
+ strings in addition to text content.
63
+ items:
64
+ type: string
65
+ exclude_selectors:
66
+ type: array
67
+ default: [script, style, "code.language-plaintext", "pre code"]
68
+ description: >-
69
+ CSS selectors identifying HTML elements whose content is
70
+ excluded from extraction (e.g., code blocks, scripts).
71
+ items:
72
+ type: string
73
+ additionalProperties: false
74
+ logging:
75
+ type: object
76
+ description: Controls logging verbosity during the build.
77
+ properties:
78
+ level:
79
+ type: string
80
+ default: "debug"
81
+ description: >-
82
+ Log level for the localization pipeline. Accepted values:
83
+ `debug`, `info`, `warn`, `error`.
84
+ show_statistics:
85
+ type: boolean
86
+ default: true
87
+ description: >-
88
+ When `true`, prints translation coverage statistics at the
89
+ end of the build.
90
+ debug:
91
+ type: boolean
92
+ default: false
93
+ description: >-
94
+ When `true`, enables verbose debug output from the
95
+ localization pipeline.
96
+ additionalProperties: false
97
+ translation:
98
+ type: object
99
+ description: >-
100
+ Controls how translated strings are applied and configures the
101
+ optional LibreTranslate machine translation backend.
102
+ properties:
103
+ fallback:
104
+ type: string
105
+ default: "english"
106
+ description: >-
107
+ Language name used as fallback when a translation is missing.
108
+ preserve_html:
109
+ type: boolean
110
+ default: true
111
+ description: >-
112
+ When `true`, HTML markup inside translated strings is preserved
113
+ rather than escaped.
114
+ libretranslate_enabled:
115
+ type: boolean
116
+ default: false
117
+ description: >-
118
+ Enables automatic machine translation via a LibreTranslate
119
+ instance for strings without a manual translation.
120
+ libretranslate_api_url:
121
+ type: string
122
+ default: "http://localhost:5000"
123
+ description: >-
124
+ URL of the LibreTranslate API endpoint used for machine
125
+ translation.
126
+ libretranslate_api_key:
127
+ description: >-
128
+ API key for the LibreTranslate instance. Set to `nil` if the
129
+ instance does not require authentication.
130
+ libretranslate_timeout:
131
+ type: integer
132
+ default: 300
133
+ description: >-
134
+ Timeout in seconds for LibreTranslate API requests.
135
+ libretranslate_batch_size:
136
+ type: integer
137
+ default: 50
138
+ description: >-
139
+ Number of strings submitted per LibreTranslate API request.
140
+ libretranslate_retry_attempts:
141
+ type: integer
142
+ default: 3
143
+ description: >-
144
+ Number of retry attempts on a failed LibreTranslate API call.
145
+ libretranslate_retry_delay:
146
+ type: integer
147
+ default: 2
148
+ description: >-
149
+ Delay in seconds between LibreTranslate API retry attempts.
150
+ libretranslate_stop_on_error:
151
+ type: boolean
152
+ default: true
153
+ description: >-
154
+ When `true`, the build stops on an unrecoverable LibreTranslate
155
+ API error rather than continuing with untranslated strings.
156
+ additionalProperties: false
157
+ additionalProperties: false
25
158
  additionalProperties: false
@@ -2,24 +2,25 @@
2
2
  #
3
3
  # site.data.base.social - Provides social networks information.
4
4
  #
5
- - name: YouTube
6
- icon: "fab fa-youtube"
7
- link: "https://youtube.com/TheCentOSProject"
8
- - name: Mastodon
9
- icon: "fab fa-mastodon"
10
- link: "https://fosstodon.org/@centos"
11
- - name: Facebook
12
- icon: "fab fa-facebook-f"
13
- link: "https://www.facebook.com/CentOSProject"
14
- - name: LinkedIn
15
- icon: "fab fa-linkedin"
16
- link: "https://www.linkedin.com/company/centos-project/"
17
- - name: x
18
- icon: "fab fa-x-twitter"
19
- link: "https://x.com/centos"
20
- - name: Discourse
21
- icon: "fab fa-discourse"
22
- link: "https://discussion.fedoraproject.org/c/neighbors/centos/"
23
- - name: Reddit
24
- icon: "fab fa-reddit"
25
- link: "https://www.reddit.com/r/CentOS/"
5
+ media:
6
+ - name: YouTube
7
+ icon: "fa-brands fa-youtube"
8
+ link: "https://youtube.com/TheCentOSProject"
9
+ - name: Mastodon
10
+ icon: "fa-brands fa-mastodon"
11
+ link: "https://fosstodon.org/@centos"
12
+ - name: Facebook
13
+ icon: "fa-brands fa-facebook-f"
14
+ link: "https://www.facebook.com/CentOSProject"
15
+ - name: LinkedIn
16
+ icon: "fa-brands fa-linkedin"
17
+ link: "https://www.linkedin.com/company/centos-project/"
18
+ - name: X
19
+ icon: "fa-brands fa-x-twitter"
20
+ link: "https://x.com/centos"
21
+ - name: Discourse
22
+ icon: "fa-brands fa-discourse"
23
+ link: "https://discussion.fedoraproject.org/c/neighbors/centos/"
24
+ - name: Reddit
25
+ icon: "fa-brands fa-reddit"
26
+ link: "https://www.reddit.com/r/CentOS/"
@@ -15,7 +15,15 @@ properties:
15
15
  default: {}
16
16
  description: Configuration object for the social media component.
17
17
  properties:
18
- links:
18
+ preamble:
19
+ type: string
20
+ default: "Follow us:"
21
+ description: "The social media premable. This is, a text introducing the social media buttons."
22
+ preamble_class:
23
+ type: string
24
+ default: "mb-2"
25
+ description: "The social media premable customization classes."
26
+ media:
19
27
  type: array
20
28
  default: []
21
29
  description: A list of objects, where each object defines a single social media link/icon.
@@ -30,14 +38,10 @@ properties:
30
38
  description: >-
31
39
  The Font Awesome icon class representing the social network
32
40
  brand (e.g., `fa-brands fa-x-twitter`).
33
- required:
34
- - icon
35
41
  link:
36
42
  type: string
37
43
  format: uri
38
44
  description: The absolute URL to the project's profile on this social network (e.g., `https://www.youtube.com/`).
39
- required:
40
- - link
41
45
  required:
42
46
  - name
43
47
  - icon
@@ -48,6 +52,6 @@ properties:
48
52
  default: ""
49
53
  description: Custom CSS classes applied to the container element wrapping the social media icons list.
50
54
  required:
51
- - links
55
+ - media
52
56
  additionalProperties: false
53
57
  additionalProperties: false
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Sponsors
3
+ icon: "fa-solid fa-hand-holding-heart"
4
+ image_base_path: "/assets/img/base/"
5
+ message: |
6
+ CentOS would not be possible without the support of our sponsors. We would
7
+ like to thank the following product/service for being a CentOS sponsor. If
8
+ you value our work, please consider [becoming a sponsor!](/sponsors)
9
+ members:
10
+ - name: sponsor-1
11
+ country: usa
12
+ image: example-sponsors-logo-1.png
13
+ url: https://www.example.com/sponsor-1
14
+ - name: sponsor-2
15
+ country: usa
16
+ image: example-sponsors-logo-2.png
17
+ url: https://www.example.com/sponsor-2
18
+ - name: sponsor-3
19
+ country: usa
20
+ image: example-sponsors-logo-3.png
21
+ url: https://www.example.com/sponsor-3
22
+ - name: sponsor-4
23
+ country: usa
24
+ image: example-sponsors-logo-4.png
25
+ url: https://www.example.com/sponsor-4
26
+ - name: sponsor-5
27
+ country: usa
28
+ image: example-sponsors-logo-5.png
29
+ url: https://www.example.com/sponsor-5
30
+ - name: sponsor-6
31
+ country: usa
32
+ image: example-sponsors-logo-6.png
33
+ url: https://www.example.com/sponsor-6
34
+ - name: sponsor-7
35
+ country: usa
36
+ image: example-sponsors-logo-7.png
37
+ url: https://www.example.com/sponsor-7
38
+ - name: sponsor-8
39
+ country: usa
40
+ image: example-sponsors-logo-8.png
41
+ url: https://www.example.com/sponsor-8
@@ -0,0 +1,73 @@
1
+ title: Sponsors carousel component configuration
2
+ description: >-
3
+ Schema for configuring the sponsors carousel, which displays sponsor logos
4
+ in a rotating carousel, typically rendered in the footer.
5
+ type: object
6
+ properties:
7
+ with_sponsors:
8
+ type: boolean
9
+ default: false
10
+ description: >-
11
+ Enables or disables the rendering of the sponsors carousel component.
12
+ Set to `true` to display the carousel; set to `false` (default) to hide it.
13
+ with_sponsors_data:
14
+ type: object
15
+ default: {}
16
+ description: Configuration object for the sponsors carousel component.
17
+ properties:
18
+ title:
19
+ type: string
20
+ default: "Sponsors"
21
+ description: The heading displayed above the carousel.
22
+ icon:
23
+ type: string
24
+ default: "fa-solid fa-hand-holding-heart"
25
+ description: Font Awesome icon class shown next to the title.
26
+ message:
27
+ type: string
28
+ default: ""
29
+ description: Introductory text rendered above the carousel, supports Markdown.
30
+ image_base_path:
31
+ type: string
32
+ default: "/assets/img/base/"
33
+ description: >-
34
+ Base path prepended to bare logo filenames when building the image `src`
35
+ attribute. Defaults to `/assets/img/base/`. Set to a different path
36
+ (e.g. `/assets/img/sponsors/`) to store logos elsewhere on the site.
37
+ Ignored when `image` is an absolute URL (`http://` or `https://`).
38
+ members:
39
+ type: array
40
+ default: []
41
+ description: List of sponsor entries to display in the carousel.
42
+ items:
43
+ type: object
44
+ properties:
45
+ name:
46
+ type: string
47
+ description: Display name of the sponsor (used as image alt text).
48
+ country:
49
+ type: string
50
+ description: Country of the sponsor (informational).
51
+ image:
52
+ type: string
53
+ description: >-
54
+ Logo image source. Accepts a bare filename (resolved using
55
+ `image_base_path`, e.g. `logo.png`) or an absolute URL
56
+ (e.g. `https://cdn.example.com/logo.png`, used as-is).
57
+ url:
58
+ type: string
59
+ format: uri
60
+ description: URL to the sponsor's website.
61
+ is_active:
62
+ type: boolean
63
+ default: true
64
+ description: Set to `false` to hide this sponsor without removing the entry.
65
+ required:
66
+ - name
67
+ - image
68
+ - url
69
+ additionalProperties: false
70
+ required:
71
+ - members
72
+ additionalProperties: false
73
+ additionalProperties: false
@@ -27,6 +27,7 @@ Data Source Hierarchy (priority):
27
27
  ================================================================================
28
28
  {%- endcomment %}
29
29
 
30
+ {%- if page.with_announcement and page.with_announcement_data.size > 0 -%}
30
31
  {%- assign announcements = include.data | default: page.with_announcement_data | default: site.data.announcement | default: site.data.base.announcement %}
31
32
 
32
33
  {%- comment %} === Presentation === {% endcomment %}
@@ -49,3 +50,4 @@ Data Source Hierarchy (priority):
49
50
  <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
50
51
  </div>
51
52
  {%- endfor %}
53
+ {%- endif -%}
@@ -29,6 +29,7 @@ Data Source Hierarchy (priority):
29
29
  ================================================================================
30
30
  {% endcomment %}
31
31
 
32
+ {%- if page.with_artwork -%}
32
33
  {%- assign artwork = include.data | default: page.with_artwork_data | default: site.data.artwork | default: site.data.base.artwork %}
33
34
 
34
35
  {%- comment %} === Presentation === {% endcomment %}
@@ -47,3 +48,4 @@ Data Source Hierarchy (priority):
47
48
  <img src="{{ site.baseurl }}{{ artwork_image }}" class="{{ artwork_image_class }}" alt="{{ artwork_alt }}" />
48
49
  {% endif %}
49
50
  </div>
51
+ {%- endif -%}
@@ -40,6 +40,7 @@ Component Layout:
40
40
  ================================================================================
41
41
  {% endcomment %}
42
42
 
43
+ {%- if page.with_bits -%}
43
44
  {%- assign bits = include.data | default: page.with_bits_data | default: site.data.bits | default: site.data.base.bits %}
44
45
 
45
46
  {%- comment %} === Presentation === {% endcomment %}
@@ -133,3 +134,4 @@ Component Layout:
133
134
 
134
135
  </div>
135
136
  {% endfor %}
137
+ {%- endif -%}
@@ -24,6 +24,7 @@ Data Sources:
24
24
  ================================================================================
25
25
  {% endcomment %}
26
26
 
27
+ {%- if page.with_breadcrumb -%}
27
28
  {%- comment %} Use original_url if available (without locale), otherwise use full url {%- endcomment %}
28
29
  {%- assign breadcrumb_url = page.original_url | default: page.url %}
29
30
 
@@ -56,3 +57,4 @@ Data Sources:
56
57
  {%- endfor %}
57
58
  </ol>
58
59
  </nav>
60
+ {%- endif -%}
@@ -29,6 +29,7 @@ Data Source Hierarchy (priority):
29
29
  ================================================================================
30
30
  {% endcomment %}
31
31
 
32
+ {%- if page.with_breakingnews and page.with_breakingnews_data.size > 0 -%}
32
33
  {%- assign breakingnews = include.data | default: page.with_breakingnews_data | default: site.data.breakingnews | default: site.data.base.breakingnews %}
33
34
 
34
35
  {%- comment %} === Presentation === {% endcomment %}
@@ -72,3 +73,4 @@ Data Source Hierarchy (priority):
72
73
  </div>
73
74
  {% endfor %}
74
75
  </div>
76
+ {%- endif -%}
@@ -0,0 +1,98 @@
1
+ {% comment %}
2
+ Generates one separate table and then triggers subsequent recursion to produce
3
+ others. Requires two distinct loops for valid HTML structure.
4
+ {% endcomment %}
5
+
6
+ {% assign current_properties = include.properties %}
7
+ {% assign parent_name = include.parent_name %}
8
+ {% assign current_level = include.level | plus: 0 %}
9
+ {% assign type_desc = include.type_desc %}
10
+
11
+ {% assign col_name = include.col_name | default: "Name" %}
12
+ {% assign col_type = include.col_type | default: "Type" %}
13
+ {% assign col_default = include.col_default | default: "Default" %}
14
+ {% assign col_description = include.col_description | default: "Description" %}
15
+
16
+ {% assign columns = include.columns %}
17
+
18
+ {% if current_properties %}
19
+
20
+ {% comment %} 1. Calculate the property count for THIS specific set of data using | size. {% endcomment %}
21
+ {% assign current_property_count = current_properties | size %}
22
+
23
+ {% comment %} 2. Determine CSS classes and ID for THIS table {% endcomment %}
24
+ {% assign table_classes = "table dataTable" %}
25
+ {% assign table_id = parent_name | slugify | append: '-nested-' | append: current_level %}
26
+
27
+ {% comment %} 3. Render the current nested table (Loop 1: Rendering) {% endcomment %}
28
+ <p class="my-3">The <code>{{ parent_name }}</code> variable is a {{ type_desc }} with the following properties:</p>
29
+
30
+ <table id="{{ table_id }}" class="{{ table_classes }}">
31
+ <thead class="table-light">
32
+ <tr>
33
+ <th scope="col">{{ col_name }}</th>
34
+ {% if columns %}
35
+ {% for col in columns %}<th scope="col">{{ col.label }}</th>{% endfor %}
36
+ {% else %}
37
+ <th scope="col">{{ col_type }}</th>
38
+ <th scope="col">{{ col_default }}</th>
39
+ <th scope="col">{{ col_description }}</th>
40
+ {% endif %}
41
+ </tr>
42
+ </thead>
43
+ <tbody>
44
+ {% for property in current_properties -%}
45
+ {% assign prop_key = property[0] %}
46
+ {% assign prop_details = property[1] %}
47
+ {% assign default_value = prop_details.default | default: "—" %}
48
+
49
+ <tr>
50
+ <td>{{ prop_key }}</td>
51
+ {% if columns %}
52
+ {% for col in columns %}<td>{{ prop_details[col.key] | strip_newlines | markdownify | default: "—" }}</td>{% endfor %}
53
+ {% else %}
54
+ <td>{{ prop_details.type | strip_newlines | markdownify | default: "—" }}</td>
55
+ <td>{{ default_value | strip_newlines | markdownify | default: "—" }}</td>
56
+ <td>{{ prop_details.description | strip_newlines | markdownify | default: "—" }}</td>
57
+ {% endif %}
58
+ </tr>
59
+ {% endfor -%}
60
+ </tbody>
61
+ </table>
62
+
63
+ {% comment %} 4. Run recursion check (Loop 2: Initiation, must run AFTER </table>) {% endcomment %}
64
+ {% for property in current_properties %}
65
+ {% assign prop_key = property[0] %}
66
+ {% assign prop_details = property[1] %}
67
+
68
+ {% assign nested_properties = nil %}
69
+
70
+ {% comment %} Check if the current property requires further recursion {% endcomment %}
71
+ {% if prop_details.type == "object" and prop_details.properties %}
72
+ {% assign nested_properties = prop_details.properties %}
73
+ {% assign next_type_desc = "dictionary (map)" %}
74
+ {% elsif prop_details.type == "array" and prop_details.items.properties %}
75
+ {% assign nested_properties = prop_details.items.properties %}
76
+ {% assign next_type_desc = "list of dictionaries" %}
77
+ {% endif %}
78
+
79
+ {% if nested_properties %}
80
+ {% comment %} Found deeper nesting: Call the next level {% endcomment %}
81
+ {% assign next_parent_name = include.parent_name | append: "." | append: prop_key %}
82
+ {% assign next_level_val = current_level | plus: 1 %}
83
+
84
+ {% include base/configuration-variables-nested.html.liquid
85
+ properties=nested_properties
86
+ parent_name=next_parent_name
87
+ type_desc=next_type_desc
88
+ level=next_level_val
89
+ col_name=col_name
90
+ col_type=col_type
91
+ col_default=col_default
92
+ col_description=col_description
93
+ columns=columns
94
+ %}
95
+ {% endif %}
96
+ {% endfor %}
97
+
98
+ {% endif %}