jekyll-theme-centos 2.52.0.beta.3 → 2.52.0.beta.5

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 (315) hide show
  1. checksums.yaml +4 -4
  2. data/_data/base/announcement_schema.yml +50 -0
  3. data/_data/base/artwork_schema.yml +46 -0
  4. data/_data/base/backtotop_schema.yml +53 -0
  5. data/_data/base/bits.yml +96 -0
  6. data/_data/base/bits_schema.yml +183 -0
  7. data/_data/base/breadcrumb_schema.yml +14 -0
  8. data/_data/base/breakingnews_schema.yml +59 -0
  9. data/_data/base/color.yml +1042 -0
  10. data/_data/base/color_schema.yml +1036 -0
  11. data/_data/base/content.yml +2 -0
  12. data/_data/base/content_schema.yml +26 -0
  13. data/_data/base/converter_link_schema.yml +48 -0
  14. data/_data/base/copyright.yml +12 -0
  15. data/_data/base/copyright_schema.yml +34 -0
  16. data/_data/base/copyvalue_schema.yml +49 -0
  17. data/_data/base/datatable_schema.yml +57 -0
  18. data/_data/base/event_schema.yml +122 -0
  19. data/_data/base/fontawesome_schema.yml +49 -0
  20. data/_data/base/highlight_schema.yml +68 -0
  21. data/_data/base/languages.yml +186 -0
  22. data/_data/base/link_schema.yml +153 -0
  23. data/_data/base/locales_schema.yml +25 -0
  24. data/_data/base/navbar.yml +20 -0
  25. data/_data/base/navbar_schema.yml +121 -0
  26. data/_data/base/navindex_schema.yml +67 -0
  27. data/_data/base/ogp_schema.yml +186 -0
  28. data/_data/base/project.yml +37 -0
  29. data/_data/base/project_schema.yml +120 -0
  30. data/_data/base/shortcut_schema.yml +74 -0
  31. data/_data/base/social.yml +25 -0
  32. data/_data/base/social_schema.yml +53 -0
  33. data/_data/base/title_schema.yml +49 -0
  34. data/_data/base/toc_schema.yml +100 -0
  35. data/_data/download/cards.yml +309 -0
  36. data/_data/download/navbar.yml +11 -0
  37. data/_data/sponsors/carousel.yml +37 -0
  38. data/_data/sponsors/navbar.yml +6 -0
  39. data/_includes/base/announcement.html.liquid +51 -0
  40. data/_includes/base/artwork.html.liquid +49 -0
  41. data/_includes/base/backtotop.html.liquid +51 -0
  42. data/_includes/base/bits.html.liquid +135 -0
  43. data/_includes/base/breadcrumb.html.liquid +37 -0
  44. data/_includes/base/breakingnews.html.liquid +74 -0
  45. data/_includes/base/card.html.liquid +96 -0
  46. data/_includes/base/copyright.html.liquid +56 -0
  47. data/_includes/base/copyvalue.html.liquid +59 -0
  48. data/_includes/base/datatable.html.liquid +64 -0
  49. data/_includes/base/event.html.liquid +89 -0
  50. data/_includes/base/fontawesome.html.liquid +58 -0
  51. data/_includes/base/head.html.liquid +101 -0
  52. data/_includes/base/highlight.html.liquid +65 -0
  53. data/_includes/base/image.html.liquid +42 -0
  54. data/_includes/base/link.html.liquid +139 -0
  55. data/_includes/base/locales.html.liquid +41 -0
  56. data/_includes/base/navbar.html.liquid +106 -0
  57. data/_includes/base/navindex.html.liquid +162 -0
  58. data/_includes/base/ogp.html.liquid +118 -0
  59. data/_includes/base/project.html.liquid +90 -0
  60. data/_includes/base/script.html.liquid +59 -0
  61. data/_includes/base/shortcut.html.liquid +65 -0
  62. data/_includes/base/social.html.liquid +59 -0
  63. data/_includes/base/title.html.liquid +52 -0
  64. data/_includes/base/toc.html.liquid +91 -0
  65. data/_includes/base/toc_generator.html.liquid +189 -0
  66. data/_includes/download/cards-body-commands.html +7 -0
  67. data/_includes/download/cards-body-convert.html +10 -0
  68. data/_includes/download/cards-body-doc.html +9 -0
  69. data/_includes/download/cards-body-documentation.html +11 -0
  70. data/_includes/download/cards-body-eol.html +16 -0
  71. data/_includes/download/cards-body-mirrors.html +8 -0
  72. data/_includes/download/cards-body-screenshot.html +26 -0
  73. data/_includes/download/cards-body-screenshots.html +32 -0
  74. data/_includes/download/cards-body.html +8 -0
  75. data/_includes/download/cards-footer.html +3 -0
  76. data/_includes/download/cards-header-commands.html +8 -0
  77. data/_includes/download/cards-header-convert.html +8 -0
  78. data/_includes/download/cards-header-doc.html +8 -0
  79. data/_includes/download/cards-header-documentation.html +8 -0
  80. data/_includes/download/cards-header-eol.html +8 -0
  81. data/_includes/download/cards-header-mirrors.html +13 -0
  82. data/_includes/download/cards-header-screenshot.html +8 -0
  83. data/_includes/download/cards-header-screenshots.html +8 -0
  84. data/_includes/download/cards-header.html +13 -0
  85. data/_includes/download/cards.html +120 -0
  86. data/_includes/sponsors/cards.html +11 -0
  87. data/_includes/sponsors/carousel.html +24 -0
  88. data/_layouts/base/default.html +117 -0
  89. data/_layouts/download/cards.html +7 -0
  90. data/_layouts/download/default.html +7 -0
  91. data/_layouts/people/default.html +68 -0
  92. data/_sass/base/_customization.scss +251 -0
  93. data/_sass/base/_light-dark.scss +10 -0
  94. data/_sass/base/_maps.scss +104 -0
  95. data/_sass/base/_variables.scss +232 -0
  96. data/_sass/bootstrap/_accordion.scss +153 -0
  97. data/_sass/bootstrap/_alert.scss +68 -0
  98. data/_sass/bootstrap/_badge.scss +38 -0
  99. data/_sass/bootstrap/_breadcrumb.scss +40 -0
  100. data/_sass/bootstrap/_button-group.scss +147 -0
  101. data/_sass/bootstrap/_buttons.scss +216 -0
  102. data/_sass/bootstrap/_card.scss +238 -0
  103. data/_sass/bootstrap/_carousel.scss +226 -0
  104. data/_sass/bootstrap/_close.scss +66 -0
  105. data/_sass/bootstrap/_containers.scss +41 -0
  106. data/_sass/bootstrap/_dropdown.scss +250 -0
  107. data/_sass/bootstrap/_forms.scss +9 -0
  108. data/_sass/bootstrap/_functions.scss +302 -0
  109. data/_sass/bootstrap/_grid.scss +39 -0
  110. data/_sass/bootstrap/_helpers.scss +12 -0
  111. data/_sass/bootstrap/_images.scss +42 -0
  112. data/_sass/bootstrap/_list-group.scss +199 -0
  113. data/_sass/bootstrap/_maps.scss +174 -0
  114. data/_sass/bootstrap/_mixins.scss +42 -0
  115. data/_sass/bootstrap/_modal.scss +240 -0
  116. data/_sass/bootstrap/_nav.scss +197 -0
  117. data/_sass/bootstrap/_navbar.scss +289 -0
  118. data/_sass/bootstrap/_offcanvas.scss +147 -0
  119. data/_sass/bootstrap/_pagination.scss +109 -0
  120. data/_sass/bootstrap/_placeholders.scss +51 -0
  121. data/_sass/bootstrap/_popover.scss +196 -0
  122. data/_sass/bootstrap/_progress.scss +68 -0
  123. data/_sass/bootstrap/_reboot.scss +617 -0
  124. data/_sass/bootstrap/_root.scss +187 -0
  125. data/_sass/bootstrap/_spinners.scss +86 -0
  126. data/_sass/bootstrap/_tables.scss +171 -0
  127. data/_sass/bootstrap/_toasts.scss +73 -0
  128. data/_sass/bootstrap/_tooltip.scss +119 -0
  129. data/_sass/bootstrap/_transitions.scss +27 -0
  130. data/_sass/bootstrap/_type.scss +106 -0
  131. data/_sass/bootstrap/_utilities.scss +806 -0
  132. data/_sass/bootstrap/_variables-dark.scss +102 -0
  133. data/_sass/bootstrap/_variables.scss +1753 -0
  134. data/_sass/bootstrap/bootstrap-grid.scss +62 -0
  135. data/_sass/bootstrap/bootstrap-reboot.scss +10 -0
  136. data/_sass/bootstrap/bootstrap-utilities.scss +19 -0
  137. data/_sass/bootstrap/bootstrap.scss +52 -0
  138. data/_sass/bootstrap/forms/_floating-labels.scss +97 -0
  139. data/_sass/bootstrap/forms/_form-check.scss +189 -0
  140. data/_sass/bootstrap/forms/_form-control.scss +214 -0
  141. data/_sass/bootstrap/forms/_form-range.scss +91 -0
  142. data/_sass/bootstrap/forms/_form-select.scss +80 -0
  143. data/_sass/bootstrap/forms/_form-text.scss +11 -0
  144. data/_sass/bootstrap/forms/_input-group.scss +132 -0
  145. data/_sass/bootstrap/forms/_labels.scss +36 -0
  146. data/_sass/bootstrap/forms/_validation.scss +12 -0
  147. data/_sass/bootstrap/helpers/_clearfix.scss +3 -0
  148. data/_sass/bootstrap/helpers/_color-bg.scss +7 -0
  149. data/_sass/bootstrap/helpers/_colored-links.scss +30 -0
  150. data/_sass/bootstrap/helpers/_focus-ring.scss +5 -0
  151. data/_sass/bootstrap/helpers/_icon-link.scss +25 -0
  152. data/_sass/bootstrap/helpers/_position.scss +36 -0
  153. data/_sass/bootstrap/helpers/_ratio.scss +26 -0
  154. data/_sass/bootstrap/helpers/_stacks.scss +15 -0
  155. data/_sass/bootstrap/helpers/_stretched-link.scss +15 -0
  156. data/_sass/bootstrap/helpers/_text-truncation.scss +7 -0
  157. data/_sass/bootstrap/helpers/_visually-hidden.scss +8 -0
  158. data/_sass/bootstrap/helpers/_vr.scss +8 -0
  159. data/_sass/bootstrap/mixins/_alert.scss +18 -0
  160. data/_sass/bootstrap/mixins/_backdrop.scss +14 -0
  161. data/_sass/bootstrap/mixins/_banner.scss +7 -0
  162. data/_sass/bootstrap/mixins/_border-radius.scss +78 -0
  163. data/_sass/bootstrap/mixins/_box-shadow.scss +24 -0
  164. data/_sass/bootstrap/mixins/_breakpoints.scss +127 -0
  165. data/_sass/bootstrap/mixins/_buttons.scss +70 -0
  166. data/_sass/bootstrap/mixins/_caret.scss +69 -0
  167. data/_sass/bootstrap/mixins/_clearfix.scss +9 -0
  168. data/_sass/bootstrap/mixins/_color-mode.scss +21 -0
  169. data/_sass/bootstrap/mixins/_color-scheme.scss +7 -0
  170. data/_sass/bootstrap/mixins/_container.scss +11 -0
  171. data/_sass/bootstrap/mixins/_deprecate.scss +10 -0
  172. data/_sass/bootstrap/mixins/_forms.scss +163 -0
  173. data/_sass/bootstrap/mixins/_gradients.scss +47 -0
  174. data/_sass/bootstrap/mixins/_grid.scss +151 -0
  175. data/_sass/bootstrap/mixins/_image.scss +16 -0
  176. data/_sass/bootstrap/mixins/_list-group.scss +26 -0
  177. data/_sass/bootstrap/mixins/_lists.scss +7 -0
  178. data/_sass/bootstrap/mixins/_pagination.scss +10 -0
  179. data/_sass/bootstrap/mixins/_reset-text.scss +17 -0
  180. data/_sass/bootstrap/mixins/_resize.scss +6 -0
  181. data/_sass/bootstrap/mixins/_table-variants.scss +24 -0
  182. data/_sass/bootstrap/mixins/_text-truncate.scss +8 -0
  183. data/_sass/bootstrap/mixins/_transition.scss +26 -0
  184. data/_sass/bootstrap/mixins/_utilities.scss +97 -0
  185. data/_sass/bootstrap/mixins/_visually-hidden.scss +38 -0
  186. data/_sass/bootstrap/utilities/_api.scss +47 -0
  187. data/_sass/bootstrap/vendor/_rfs.scss +348 -0
  188. data/assets/css/base/stylesheet.min.scss +35 -0
  189. data/assets/icons/android-chrome-192.png +0 -0
  190. data/assets/icons/android-chrome-512.png +0 -0
  191. data/assets/icons/apple-touch-icon.png +0 -0
  192. data/assets/icons/favicon-16.png +0 -0
  193. data/assets/icons/favicon-32.png +0 -0
  194. data/assets/icons/favicon.ico +0 -0
  195. data/assets/icons/favicon.svg +1 -0
  196. data/assets/img/anaconda-symbolic.svg +1 -0
  197. data/assets/img/anaconda.svg +1 -0
  198. data/assets/img/base/centos-colors.gpl +55 -0
  199. data/assets/img/base/page-layout-default.png +0 -0
  200. data/assets/img/base/page-layout-default.svg +1158 -0
  201. data/assets/img/base/page-with-alert.png +0 -0
  202. data/assets/img/base/page-with-alert.svg +359 -0
  203. data/assets/img/base/page-with-announcement.png +0 -0
  204. data/assets/img/base/page-with-announcement.svg +499 -0
  205. data/assets/img/base/page-with-artwork.png +0 -0
  206. data/assets/img/base/page-with-artwork.svg +368 -0
  207. data/assets/img/base/page-with-backtotop.png +0 -0
  208. data/assets/img/base/page-with-backtotop.svg +275 -0
  209. data/assets/img/base/page-with-bits.png +0 -0
  210. data/assets/img/base/page-with-bits.svg +311 -0
  211. data/assets/img/base/page-with-breadcrumb.png +0 -0
  212. data/assets/img/base/page-with-breadcrumb.svg +676 -0
  213. data/assets/img/base/page-with-breakingnews.png +0 -0
  214. data/assets/img/base/page-with-breakingnews.svg +903 -0
  215. data/assets/img/base/page-with-color.png +0 -0
  216. data/assets/img/base/page-with-color.svg +57 -0
  217. data/assets/img/base/page-with-copyright.png +0 -0
  218. data/assets/img/base/page-with-copyright.svg +233 -0
  219. data/assets/img/base/page-with-copyvalue.png +0 -0
  220. data/assets/img/base/page-with-copyvalue.svg +57 -0
  221. data/assets/img/base/page-with-datatable.png +0 -0
  222. data/assets/img/base/page-with-datatable.svg +857 -0
  223. data/assets/img/base/page-with-event.png +0 -0
  224. data/assets/img/base/page-with-event.svg +522 -0
  225. data/assets/img/base/page-with-fontawesome.png +0 -0
  226. data/assets/img/base/page-with-fontawesome.svg +147 -0
  227. data/assets/img/base/page-with-heading.png +0 -0
  228. data/assets/img/base/page-with-heading.svg +57 -0
  229. data/assets/img/base/page-with-highlight.png +0 -0
  230. data/assets/img/base/page-with-highlight.svg +86 -0
  231. data/assets/img/base/page-with-link.png +0 -0
  232. data/assets/img/base/page-with-link.svg +395 -0
  233. data/assets/img/base/page-with-locales.png +0 -0
  234. data/assets/img/base/page-with-locales.svg +724 -0
  235. data/assets/img/base/page-with-navbar.png +0 -0
  236. data/assets/img/base/page-with-navbar.svg +438 -0
  237. data/assets/img/base/page-with-navindex.png +0 -0
  238. data/assets/img/base/page-with-navindex.svg +279 -0
  239. data/assets/img/base/page-with-ogp.png +0 -0
  240. data/assets/img/base/page-with-ogp.svg +368 -0
  241. data/assets/img/base/page-with-project.png +0 -0
  242. data/assets/img/base/page-with-project.svg +822 -0
  243. data/assets/img/base/page-with-shortcut.png +0 -0
  244. data/assets/img/base/page-with-shortcut.svg +233 -0
  245. data/assets/img/base/page-with-social.png +0 -0
  246. data/assets/img/base/page-with-social.svg +233 -0
  247. data/assets/img/base/page-with-title.png +0 -0
  248. data/assets/img/base/page-with-title.svg +584 -0
  249. data/assets/img/base/page-with-toc.png +0 -0
  250. data/assets/img/base/page-with-toc.svg +438 -0
  251. data/assets/img/base/screenshot-example-1200x600.png +0 -0
  252. data/assets/img/base/screenshot-example-1200x600.svg +114 -0
  253. data/assets/img/centos-dynamicmsg-logo.svg +1 -0
  254. data/assets/img/centos-dynamicmsg-type.svg +1 -0
  255. data/assets/img/centos-dynamicmsg-whitelogo.svg +1 -0
  256. data/assets/img/centos-dynamicmsg-whitetype.svg +1 -0
  257. data/assets/img/centos-gdm-whitelogo.svg +1 -0
  258. data/assets/img/centos-ipa-whiteheader.svg +1 -0
  259. data/assets/img/centos-logo-2bits.svg +1 -0
  260. data/assets/img/centos-logo.svg +1 -0
  261. data/assets/img/centos-message-logo.svg +1 -0
  262. data/assets/img/centos-motif.png +0 -0
  263. data/assets/img/centos-poweredby-logo.svg +1 -0
  264. data/assets/img/centos-social-share.png +0 -0
  265. data/assets/img/centos-symbol-2bits.svg +1 -0
  266. data/assets/img/centos-symbol.svg +1 -0
  267. data/assets/img/centos-type.svg +1 -0
  268. data/assets/img/centos-vertical-logo.svg +1 -0
  269. data/assets/img/centos-vertical-message-logo.svg +1 -0
  270. data/assets/img/centos-whitelogo.svg +1 -0
  271. data/assets/img/download/centos-linux-7-2009-screenshot-n.png +0 -0
  272. data/assets/img/download/centos-stream-8-screenshot-n.png +0 -0
  273. data/assets/img/download/centos-stream-9-screenshot-n.png +0 -0
  274. data/assets/img/download/distribution-release-screenshot-1.png +0 -0
  275. data/assets/img/download/distribution-release-screenshot-2.png +0 -0
  276. data/assets/img/download/distribution-release-screenshot-3.png +0 -0
  277. data/assets/img/download/distribution-release-screenshot-n.png +0 -0
  278. data/assets/img/download/distribution-release-screenshot-n.svg +134 -0
  279. data/assets/img/download/download.svg +421 -0
  280. data/assets/img/download/fig-the-downloads-cards-presentation-template.png +0 -0
  281. data/assets/img/people/page.svg +900 -0
  282. data/assets/img/people/page.webp +0 -0
  283. data/assets/img/people/username.webp +0 -0
  284. data/assets/img/sponsors/screenshot-sponsors-cards-layout.png +0 -0
  285. data/assets/img/sponsors/screenshot-sponsors-cards.png +0 -0
  286. data/assets/img/sponsors/screenshot-sponsors-carousel.png +0 -0
  287. data/assets/img/sponsors/screenshot-sponsors-default-layout.png +0 -0
  288. data/assets/img/sponsors/screenshot-sponsors-logo.png +0 -0
  289. data/assets/img/sponsors/sponsor-logo-1.png +0 -0
  290. data/assets/img/sponsors/sponsor-logo-2.png +0 -0
  291. data/assets/img/sponsors/sponsor-logo-3.png +0 -0
  292. data/assets/img/sponsors/sponsor-logo-4.png +0 -0
  293. data/assets/img/sponsors/sponsor-logo-5.png +0 -0
  294. data/assets/img/sponsors/sponsor-logo-6.png +0 -0
  295. data/assets/img/sponsors/sponsor-logo-7.png +0 -0
  296. data/assets/img/sponsors/sponsor-logo-8.png +0 -0
  297. data/assets/img/sponsors/sponsors-logo.svg +563 -0
  298. data/assets/js/base/backtotop.js +23 -0
  299. data/assets/js/base/copyvalue.js +251 -0
  300. data/assets/js/base/datatable.js +55 -0
  301. data/assets/js/base/highlight.js +6 -0
  302. data/assets/js/base/init-tooltips.js +5 -0
  303. data/assets/js/bootstrap.bundle.js +6312 -0
  304. data/assets/js/bootstrap.bundle.js.map +1 -0
  305. data/assets/js/bootstrap.bundle.min.js +7 -0
  306. data/assets/js/bootstrap.bundle.min.js.map +1 -0
  307. data/assets/js/bootstrap.esm.js +4447 -0
  308. data/assets/js/bootstrap.esm.js.map +1 -0
  309. data/assets/js/bootstrap.esm.min.js +7 -0
  310. data/assets/js/bootstrap.esm.min.js.map +1 -0
  311. data/assets/js/bootstrap.js +4494 -0
  312. data/assets/js/bootstrap.js.map +1 -0
  313. data/assets/js/bootstrap.min.js +7 -0
  314. data/assets/js/bootstrap.min.js.map +1 -0
  315. metadata +314 -1
@@ -0,0 +1,65 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Highlight.js Code Syntax Highlighting Component
4
+ Purpose: Loads Highlight.js library CSS and JavaScript from CDN with
5
+ copy-to-clipboard functionality for code blocks.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - CDN-based library: Highlight.js from cdnjs
10
+ - Copy plugin: additional plugin for code clipboard functionality
11
+ - Format switching: separate head (CSS) and script (JS) includes
12
+ - Automatic initialization: on document load
13
+ - Configurable theme: different color schemes available
14
+ - 190+ languages supported
15
+
16
+ Optional Inputs:
17
+ - type: "head" for CSS, "script" for JavaScript
18
+ - theme: Syntax highlighting theme (default: "default")
19
+ - version: Highlight.js version (e.g., "11.9.0")
20
+ - data: Highlight.js configuration object
21
+
22
+ Data Source Hierarchy (priority):
23
+ 1. include.data
24
+ 2. page.with_highlight_data
25
+ 3. site.data.highlight
26
+ 4. site.data.base.highlight
27
+ ================================================================================
28
+ {% endcomment %}
29
+
30
+ {%- assign highlight = include.data | default: page.with_highlight_data | default: site.data.highlight | default: site.data.base.highlight %}
31
+
32
+ {%- assign highlight_theme = highlight.theme | default: site.data.base.highlight_schema.properties.with_highlight_data.properties.theme.default %}
33
+ {%- assign highlight_version = highlight.version | default: site.data.base.highlight_schema.properties.with_highlight_data.properties.version.default %}
34
+ {%- assign copy_icon_svg = highlight.copy_button_icons.copy.svg | default: site.data.base.highlight_schema.properties.with_highlight_data.properties.copy_button_icons.properties.copy.properties.svg.default %}
35
+ {%- assign success_icon_svg = highlight.copy_button_icons.success.svg | default: site.data.base.highlight_schema.properties.with_highlight_data.properties.copy_button_icons.properties.success.properties.svg.default %}
36
+
37
+ {%- capture html_highlight_head %}
38
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/{{ highlight_version }}/styles/{{ highlight_theme | replace_first: 'base16-', 'base16/' | default: 'default' }}.min.css" />
39
+ <link rel="stylesheet" href="https://unpkg.com/highlightjs-copy@1.0.6/dist/highlightjs-copy.min.css" />
40
+ <!-- Highlight.js Copy Button Icon Customization (from schema) -->
41
+ <style>
42
+ .hljs-copy-button:not([data-copied="true"])::before {
43
+ mask: url('data:image/svg+xml;utf-8,{{ copy_icon_svg }}');
44
+ }
45
+ .hljs-copy-button[data-copied='true']::after {
46
+ background-image: url('data:image/svg+xml;utf-8,{{ success_icon_svg }}');
47
+ }
48
+ </style>
49
+ {%- endcapture %}
50
+
51
+ {%- capture html_highlight_script %}
52
+ <!-- Highlight.js Library and Copy Plugin -->
53
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/{{ highlight_version }}/highlight.min.js"></script>
54
+ <script src="https://unpkg.com/highlightjs-copy@1.0.6/dist/highlightjs-copy.min.js"></script>
55
+ <!-- Initialize Highlight.js -->
56
+ <script src="{{ site.baseurl }}/assets/js/base/highlight.min.js"></script>
57
+ {%- endcapture %}
58
+
59
+ {%- assign type = include.type %}
60
+ {%- case type %}
61
+ {%- when "head" %}
62
+ {{ html_highlight_head }}
63
+ {%- when "script" %}
64
+ {{ html_highlight_script }}
65
+ {%- endcase %}
@@ -0,0 +1,42 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Figure Image Component
4
+ Purpose: Renders responsive images in semantic HTML figure elements
5
+ with optional links and captions.
6
+ ================================================================================
7
+
8
+ Required Inputs:
9
+ - file: Image filename (relative to /assets/img/)
10
+ - alt: Alt text for accessibility
11
+
12
+ Optional Inputs:
13
+ - link: URL to wrap image in a link
14
+ - caption: Caption text for <figcaption>
15
+ - extraclasses: Additional CSS classes for image element
16
+
17
+ Features:
18
+ - Semantic HTML with <figure> and <figcaption> elements
19
+ - Responsive images with img-fluid Bootstrap class
20
+ - Figure ID generated from alt text (slugified)
21
+ - Lazy loading enabled by default
22
+ ================================================================================
23
+ {% endcomment %}
24
+
25
+ {% if include.alt %}
26
+ {% assign figid = include.alt %}
27
+ {% else %}
28
+ {% assign figid = include.file %}
29
+ {% endif %}
30
+
31
+ <figure id="fig-{{ figid | slugify }}" class="figure">
32
+ {% if include.link %}
33
+ <a href="{{ include.link }}">
34
+ <img loading="lazy" src="{{ site.baseurl }}/assets/img/{{ include.file }}" class="figure-img img-fluid rounded{% if include.extraclasses %} {{ include.extraclasses }}{% endif %}" alt="{{ include.alt }}"/>
35
+ </a>
36
+ {% else %}
37
+ <img loading="lazy" src="{{ site.baseurl }}/assets/img/{{ include.file }}" class="figure-img img-fluid rounded{% if include.extraclasses %} {{ include.extraclasses }}{% endif %}" alt="{{ include.alt }}"/>
38
+ {% endif %}
39
+ {% if include.caption %}
40
+ <figcaption class="figure-caption text-center">{{ include.caption }}</figcaption>
41
+ {% endif %}
42
+ </figure>
@@ -0,0 +1,139 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Link Component
4
+ Purpose: Renders HTML anchor tags with icons, styling, and accessibility.
5
+ Handles internal/external links and anchor navigation.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Flexible link resolution for internal and external URLs
10
+ - Optional icon integration with positioning control
11
+ - Customizable styling through color schemes or CSS classes
12
+ - Built-in accessibility support via ARIA attributes
13
+ - Anchor generation from link name when no URL provided
14
+
15
+ Required Inputs:
16
+ - name: Display text for the link
17
+
18
+ Optional Inputs:
19
+ - link: URL (internal/external). Omit to generate anchor from name.
20
+ - target: Link target (default: unset). Use '_blank' for new window.
21
+ - color: Color scheme (default: 'primary')
22
+ - icon: Icon class (Font Awesome or similar)
23
+ - icon_position: Icon placement: 'start' (default) or 'end'
24
+ - class: Custom CSS classes to override default styling
25
+ - aria_label: Accessible label for screen readers
26
+ - role: ARIA role attribute
27
+
28
+ Security & External Links:
29
+ - target="_blank" automatically adds rel="noopener noreferrer"
30
+ - External cross-domain links with target="_blank" auto-display
31
+ fa-solid fa-external-link icon (unless manually overridden)
32
+ - See: examples/jekyll/layouts/default/components/link.md
33
+ ================================================================================
34
+ {% endcomment %}
35
+
36
+ {%- capture html_link -%}
37
+ {%- comment %} === Data source selection === {% endcomment %}
38
+ {%- assign link = include.link | default: nil %}
39
+ {%- assign name = include.name | default: nil %}
40
+ {%- assign target = include.target | default: nil %}
41
+ {%- assign color = include.color | default: "primary" %}
42
+ {%- assign role = include.role | default: nil %}
43
+ {%- assign icon = include.icon | default: nil %}
44
+ {%- assign icon_position = include.icon_position | default: "start" %}
45
+ {%- assign class = include.class | default: nil %}
46
+ {%- assign aria_label = include.aria_label | default: nil %}
47
+ {%- assign data_bs_toggle = include.data_bs_toggle | default: nil %}
48
+ {%- assign data_bs_title = include.data_bs_title | default: nil %}
49
+ {%- assign data_bs_placement = include.data_bs_placement | default: nil %}
50
+ {%- assign anchor = nil %}
51
+ {%- assign rel_attr = nil %}
52
+ {%- assign is_external_link = false %}
53
+ {%- assign auto_icon = nil %}
54
+
55
+ {%- comment %} === Data processing === {% endcomment %}
56
+ {%- if link != nil -%}
57
+ {%- if link contains "https://" or link contains "http://" -%}
58
+ {%- assign href_value = link %}
59
+ {%- assign is_external_link = true %}
60
+ {%- else -%}
61
+ {%- assign href_value = site.baseurl | append: link %}
62
+ {%- endif -%}
63
+ {%- else -%}
64
+ {%- assign href_value = site.baseurl %}
65
+ {%- assign anchor = name | strip | replace: ' ', '-' | downcase %}
66
+ {%- endif -%}
67
+
68
+ {%- comment %} === External link icon handling === {% endcomment %}
69
+ {%- if is_external_link and target == "_blank" and icon == nil -%}
70
+ {%- comment %} Extract domain from link URL (remove protocol) {% endcomment %}
71
+ {%- assign link_domain = link | replace: "https://", "" | replace: "http://", "" %}
72
+ {%- assign link_domain = link_domain | split: "/" | first %}
73
+ {%- assign link_domain = link_domain | split: "?" | first %}
74
+ {%- assign link_domain = link_domain | split: "#" | first %}
75
+ {%- assign link_domain = link_domain | downcase %}
76
+
77
+ {%- comment %} Extract domain from site.url (remove protocol) {% endcomment %}
78
+ {%- assign site_domain = site.url | default: site.baseurl | replace: "https://", "" | replace: "http://", "" %}
79
+ {%- assign site_domain = site_domain | split: "/" | first %}
80
+ {%- assign site_domain = site_domain | split: "?" | first %}
81
+ {%- assign site_domain = site_domain | split: "#" | first %}
82
+ {%- assign site_domain = site_domain | downcase %}
83
+
84
+ {%- comment %} If domains don't match, add external link icon {% endcomment %}
85
+ {%- if link_domain != site_domain -%}
86
+ {%- assign auto_icon = "fa-solid fa-external-link" %}
87
+ {%- assign icon_position = "end" %}
88
+ {%- endif -%}
89
+ {%- endif -%}
90
+
91
+ {%- if class != nil -%}
92
+ {%- assign link_class = class %}
93
+ {%- else -%}
94
+ {%- assign link_class = "link-" | append: color %}
95
+ {%- assign link_class = link_class | append: " link-offset-3 link-offset-3-hover link-underline-" %}
96
+ {%- assign link_class = link_class | append: color %}
97
+ {%- assign link_class = link_class | append: " link-underline-opacity-0 link-underline-opacity-100-hover" %}
98
+ {%- endif -%}
99
+
100
+ {%- comment %} --- Security attributes for external links --- {% endcomment %}
101
+ {%- if target == "_blank" -%}
102
+ {%- assign rel_attr = "noopener noreferrer" %}
103
+ {%- endif -%}
104
+
105
+ {%- comment %} --- Link name with optional icon --- {% endcomment %}
106
+ {%- comment %} Use manual icon if provided, otherwise use auto_icon if set {% endcomment %}
107
+ {%- assign final_icon = icon | default: auto_icon %}
108
+ {%- capture link_name -%}
109
+ {%- if final_icon != nil -%}
110
+ {%- if name != nil and icon_position == "end" -%}
111
+ {{ name }}<i class="{{ final_icon }} ms-1"></i>
112
+ {%- elsif name != nil and icon_position == "start" -%}
113
+ <i class="{{ final_icon }} me-1"></i>{{ name }}
114
+ {%- else -%}
115
+ <i class="{{ final_icon }}"></i>
116
+ {%- endif -%}
117
+ {%- else -%}
118
+ {{ name }}
119
+ {%- endif -%}
120
+ {%- endcapture -%}
121
+
122
+ {%- comment %} --- HTML: Anchor tag with attributes --- {% endcomment %}
123
+ <a
124
+ href="{{ href_value }}{% if anchor != nil %}#{{ anchor }}{% endif %}"
125
+ class="{{ link_class }}"
126
+ {%- if target != nil %} target="{{ target }}"{% endif %}
127
+ {%- if rel_attr != nil %} rel="{{ rel_attr }}"{% endif %}
128
+ {%- if role != nil %} role="{{ role }}"{% endif %}
129
+ {%- if aria_label != nil %} aria-label="{{ aria_label }}"{% endif %}
130
+ {%- if data_bs_toggle != nil %} data-bs-toggle="{{ data_bs_toggle }}"{% endif %}
131
+ {%- if data_bs_title != nil %} data-bs-title="{{ data_bs_title }}"{% endif %}
132
+ {%- if data_bs_placement != nil %} data-bs-placement="{{ data_bs_placement }}"{% endif %}>
133
+ {{- link_name | strip_newlines | strip -}}
134
+ </a>
135
+ {%- endcapture -%}
136
+
137
+ {%- if page.with_link -%}
138
+ {{- html_link }}
139
+ {%- endif -%}
@@ -0,0 +1,41 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Language Selector (Locales Dropdown)
4
+ Purpose: Renders dropdown menu for language/locale selection. Generates links
5
+ to same page in different language versions.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Bootstrap dropdown: consistent UI pattern
10
+ - Language lookup: uses site.data.base.languages mapping
11
+ - URL construction: locale prefix + page URL
12
+ - Current language: defaults to English
13
+ - Icon: language globe icon from Font Awesome
14
+
15
+ Required Inputs:
16
+ - [array]: List of locale codes (e.g., ["es", "fr", "de"])
17
+
18
+ Optional Inputs:
19
+ - data: Locales array (overrides all fallbacks)
20
+
21
+ Data Source Hierarchy (priority):
22
+ 1. include.data
23
+ 2. page.with_locales_data
24
+ 3. site.data.locales
25
+ 4. site.data.base.locales
26
+ ================================================================================
27
+ {% endcomment %}
28
+
29
+ {%- assign locales = include.data | default: page.with_locales_data | default: site.data.locales | default: site.data.base.locales %}
30
+
31
+ {%- comment %} === Presentation === {% endcomment %}
32
+ <div class="dropdown">
33
+ <button class="btn btn-sm btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-label="Languages">
34
+ <i class="fa-solid fa-language"></i> {{ site.data.base.languages["en"] }}
35
+ </button>
36
+ <ul class="dropdown-menu">
37
+ {% for locale in locales %}
38
+ <li><a class="dropdown-item" href="{{ site.baseurl }}/{{ locale }}{{ page.url }}">{{ site.data.base.languages[locale] }}</a></li>
39
+ {% endfor %}
40
+ </ul>
41
+ </div>
@@ -0,0 +1,106 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Navigation Bar Component
4
+ Purpose: Renders fixed-top navigation bar with branding, responsive toggle,
5
+ and hierarchical menu items with dropdown support.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Fixed top positioning: always visible during scroll
10
+ - Responsive hamburger menu: collapses on mobile
11
+ - Dropdown menus: multi-level navigation
12
+ - Brand image and manifestation text support
13
+ - Filtered navitems by visible_on='navbar'
14
+
15
+ Required Inputs:
16
+ - brand_image: Logo image filename
17
+ - navitems: Array of navigation items
18
+
19
+ Optional Inputs:
20
+ - brand_image_class, brand_image_height: Logo styling
21
+ - brand_manifestation: Tagline/subtitle text
22
+ - class: Container CSS classes
23
+ - navitems[].menu: Submenu array for dropdowns
24
+
25
+ Data Source Hierarchy (priority):
26
+ 1. include.data
27
+ 2. page.with_navbar_data
28
+ 3. site.data.navbar
29
+ 4. site.data.base.navbar
30
+ ================================================================================
31
+ {% endcomment %}
32
+
33
+ {%- assign navbar = include.data | default: page.with_navbar_data | default: site.data.navbar | default: site.data.base.navbar %}
34
+ {%- assign schema = site.data.base.navbar_schema.properties["with_navbar_data"].properties %}
35
+
36
+ {%- assign navbar_class = navbar.class | default: schema.class.default %}
37
+ {%- assign navbar_brand_image = navbar.brand_image | default: schema.brand_image.default %}
38
+ {%- assign navbar_brand_image_class = navbar.brand_image_class | default: schema.brand_image_class.default %}
39
+ {%- assign navbar_brand_image_height = navbar.brand_image_height | default: schema.brand_image_height.default %}
40
+ {%- assign navbar_brand_manifestation = navbar.brand_manifestation | default: schema.brand_manifestation.default %}
41
+ {%- assign navbar_brand_manifestation_class = navbar.brand_manifestation_class | default: schema.brand_manifestation_class.default %}
42
+ {%- assign navbar_navitems = navbar.navitems | where: "visible_on", "navbar" | default: schema.navitems.default %}
43
+
44
+ <nav class="navbar bg-dark fixed-top navbar-expand-lg shadow{% if navbar_class != "" %} {{ navbar_class }}{% endif %}" aria-label="{{ include.arialable | default: 'navbar'}}" data-bs-theme="dark">
45
+ <div class="container">
46
+
47
+ {%- if navbar_brand_image != "" %}
48
+ <a class="navbar-brand" href="{{ site.baseurl }}/">
49
+
50
+ <img
51
+ class="d-inline-block align-text-middle me-2{% if navbar_brand_image_class != "" %} {{ navbar_brand_image_class }}{% endif %}"
52
+ src="{{ site.baseurl }}/assets/img/{{ navbar_brand_image }}"
53
+ height="{{ navbar_brand_image_height }}"
54
+ alt="{{ site.title }}" />
55
+
56
+ {%- if navbar_brand_manifestation != "" %}
57
+ <span class="d-inline-block align-text-middle fs-6 border-start border-1 border-light opacity-75 ps-3{% if navbar_brand_manifestation_class != "" %} {{ navbar_brand_manifestation_class }}{% endif %}">{{ navbar_brand_manifestation }}</span>
58
+ {%- endif %}
59
+
60
+ </a>
61
+ {%- endif %}
62
+
63
+ {% if navbar_navitems.size > 0 %}
64
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarContent" aria-controls="navbarContent" aria-expanded="false" aria-label="Toggle navigation">
65
+ <span class="navbar-toggler-icon"></span>
66
+ </button>
67
+
68
+ <div class="collapse navbar-collapse" id="navbarContent">
69
+ <ul class="navbar-nav ms-auto">
70
+ {%- for navitem in navbar_navitems %}
71
+ {%- if navitem.menu.size == 0 %}
72
+ <li class="nav-item">
73
+ {%- include base/link.html.liquid
74
+ class = "nav-link"
75
+ name = navitem.name
76
+ link = navitem.link
77
+ role = "presentation"
78
+ icon = navitem.icon
79
+ %}
80
+ </li>
81
+ {%- else %}
82
+ <li class="nav-item dropdown">
83
+ <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown-{{ forloop.index }}" role="button" data-bs-toggle="dropdown" aria-expanded="false">
84
+ <i class="{{ navitem.icon }} me-1"></i>{{ navitem.name }}
85
+ </a>
86
+ <ul class="dropdown-menu dropdown-menu-dark shadow">
87
+ {%- for dropdownitem in navitem.menu %}
88
+ <li>
89
+ {%- include base/link.html.liquid
90
+ class = "dropdown-item"
91
+ name = dropdownitem.name
92
+ link = dropdownitem.link
93
+ role = "presentation"
94
+ %}
95
+ </li>
96
+ {%- endfor %}
97
+ </ul>
98
+ </li>
99
+ {%- endif %}
100
+ {%- endfor %}
101
+ </ul>
102
+ </div>
103
+ {% endif %}
104
+
105
+ </div>
106
+ </nav>
@@ -0,0 +1,162 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Navigation Index Component
4
+ Purpose: Renders a collection of pages or components in multiple display formats.
5
+ Provides flexible list/card/table views for indexes and inventories.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Multi-format output: card, text, list, table, component_table (default: list)
10
+ - Filters out current page from results (prevents self-linking)
11
+ - Reusable link component for consistent styling
12
+ - Optional filename display using page name (with .md stripped)
13
+ - Component table with status indicators from site.defaults
14
+ - DataTables integration for searchable/sortable table output
15
+
16
+ Required Inputs:
17
+ - data: Array of page or component objects to display
18
+
19
+ Optional Inputs:
20
+ - format: Output format: 'card' | 'text' | 'list' | 'table' | 'component_table'
21
+ - show_page_filename: Display page filename instead of title (true/false)
22
+
23
+ Data Object Properties:
24
+ - name, title, url, title_lead: Common properties
25
+ - component.name: Component identifier (for component_table format)
26
+ ================================================================================
27
+ {% endcomment %}
28
+
29
+ {% assign data = include.data | default: nil %}
30
+ {% assign format = include.format | default: "list" %}
31
+
32
+ {% capture card %}
33
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
34
+ <div class="row g-3 mb-3 pt-1">
35
+ {%- for item in data %}
36
+ {%- if item.title != page.title %}
37
+ <div class="col-12 col-md-6">
38
+ <div class="p-3 pb-1 bg-light border rounded">
39
+ <div class="h5">
40
+ {%- if show_page_filename == "true" %}
41
+ {%- assign item_name = item.name | remove: '.md' %}
42
+ {%- include base/link.html.liquid name=item_name link=item.url %}
43
+ {%- else %}
44
+ {%- include base/link.html.liquid name=item.title link=item.url %}
45
+ {%- endif %}
46
+ </div>
47
+ {%- if item.title_lead %}
48
+ <p class="mb-3">{{ item.title_lead }}</p>
49
+ {%- endif %}
50
+ </div>
51
+ </div>
52
+ {%- endif %}
53
+ {%- endfor %}
54
+ </div>
55
+ {%- endcapture %}
56
+
57
+ {%- capture text %}
58
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
59
+ <div class="row g-3 mb-3 pt-1">
60
+ {%- for item in data %}
61
+ {%- if item.title != page.title %}
62
+ <div class="col-12 col-md-6">
63
+ {%- if show_page_filename == "true" %}
64
+ {%- assign item_name = item.name | remove: '.md' %}
65
+ {%- include base/link.html.liquid name=item_name link=item.url %}
66
+ {%- else %}
67
+ {%- include base/link.html.liquid name=item.title link=item.url %}
68
+ {%- endif %}
69
+ </div>
70
+ {%- endif %}
71
+ {%- endfor %}
72
+ </div>
73
+ {%- endcapture %}
74
+
75
+ {%- capture list %}
76
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
77
+ <ul>
78
+ {%- for item in data %}
79
+ {%- if item.title != page.title %}
80
+ {%- if show_page_filename == "true" %}
81
+ {%- assign item_name = item.name | remove: '.md' %}
82
+ <li>{% include base/link.html.liquid name=item_name link=item.url %}{% if item.title_lead != nil %} &mdash; {{ item.title_lead }}{% endif %}</li>
83
+ {%- else %}
84
+ <li>{% include base/link.html.liquid name=item.title link=item.url %}{% if item.title_lead != nil %} &mdash; {{ item.title_lead }}{% endif %}</li>
85
+ {%- endif %}
86
+ {%- endif %}
87
+ {%- endfor %}
88
+ </ul>
89
+ {%- endcapture %}
90
+
91
+ {% capture table %}
92
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
93
+ <table class="table dataTable">
94
+ <thead class="table-light">
95
+ <tr>
96
+ <th>Name</th>
97
+ <th>Description</th>
98
+ </tr>
99
+ </thead>
100
+ <tbody>
101
+ {%- for item in data %}
102
+ <tr>
103
+ {%- if item.title != page.title %}
104
+ {%- if show_page_filename == "true" %}
105
+ {%- assign item_name = item.name | remove: '.md' %}
106
+ <td>{% include base/link.html.liquid name=item_name link=item.url %}</td>
107
+ {%- else %}
108
+ <td>{% include base/link.html.liquid name=item.title link=item.url %}</td>
109
+ {%- endif %}
110
+ {%- endif %}
111
+ <td>{{ item.title_lead }}</td>
112
+ </tr>
113
+ {%- endfor %}
114
+ </tbody>
115
+ </table>
116
+ {%- endcapture %}
117
+
118
+ {% capture component_table %}
119
+ <table class="table dataTable">
120
+ <thead class="table-light">
121
+ <tr>
122
+ <th>Name</th>
123
+ <th>Status</th>
124
+ <th>Description</th>
125
+ </tr>
126
+ </thead>
127
+ <tbody>
128
+ {%- for item in data %}
129
+ {% comment %} Get component status from site configuration file {% endcomment %}
130
+ {%- assign status_name = "with_" | append: item.component.name %}
131
+ {%- assign status = site.defaults[0].values[status_name] %}
132
+ {% comment %} Render component status {% endcomment %}
133
+ {%- if status == true %}
134
+ {%- assign status_icon = '<span data-bs-toggle="tooltip" data-bs-title="This component is enabled globally and can be used on all site pages. It can be disabled either globally or at a page level."><i class="fa-solid fa-circle-check text-success"></i> Enabled</span>' %}
135
+ {%- elsif status == false %}
136
+ {%- assign status_icon = '<span data-bs-toggle="tooltip" data-bs-title="This component is disabled globally and cannot be used in site pages. It can be enabled either globally or at a page level."><i class="fa-solid fa-circle-minus text-danger"></i> Disabled</span>' %}
137
+ {%- else %}
138
+ {%- assign status_icon = '<span data-bs-toggle="tooltip" data-bs-title="This component is enabled globally and can be used on all site pages. It cannot be disabled."><i class="fa-solid fa-circle-dot text-warning"></i> Internal</span>' %}
139
+ {%- endif %}
140
+ {% comment %} Render table rows {% endcomment %}
141
+ <tr>
142
+ <td>{% include base/link.html.liquid name=item.component.name link=item.url %}</td>
143
+ <td class="text-nowrap">{{ status_icon }}</td>
144
+ <td>{{ item.title_lead }}</td>
145
+ </tr>
146
+ {%- endfor %}
147
+ </tbody>
148
+ </table>
149
+ {% endcapture %}
150
+
151
+ {% case format %}
152
+ {% when "card" %}
153
+ {{ card }}
154
+ {% when "text" %}
155
+ {{ text }}
156
+ {% when "table" %}
157
+ {{ table }}
158
+ {% when "component_table" %}
159
+ {{ component_table }}
160
+ {% else %}
161
+ {{ list }}
162
+ {% endcase %}
@@ -0,0 +1,118 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Open Graph & Twitter Meta Tags Component
4
+ Purpose: Renders meta tags for Open Graph (OG) and Twitter Card protocols.
5
+ Enables proper social media previews when sharing on social platforms.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Dual-protocol support: Open Graph (OG) and Twitter Card meta tags
10
+ - Hierarchical fallback system for meta tag values
11
+ - Per-property customization via page front matter
12
+ - Conditional rendering of protocol-specific attributes
13
+ - Image metadata with security URL and dimensions for OG
14
+
15
+ Required Inputs:
16
+ - page.title: Page title for social sharing preview
17
+ - site.url: Full site URL (for absolute URLs)
18
+ - site.baseurl: Base URL path prefix
19
+
20
+ Optional Inputs:
21
+ - page.ogp.og.*, page.ogp.twitter.*: OG/Twitter property overrides
22
+ - page.excerpt, page.title_lead: Fallback for description
23
+ - site.description: Site-level description fallback
24
+
25
+ Data Source Hierarchy:
26
+ - page.ogp values always take precedence
27
+ - Default image: /assets/img/centos-social-share.png
28
+ - Default image alt: "The CentOS Project"
29
+ ================================================================================
30
+ {% endcomment %}
31
+
32
+ {%- assign ogp = include.data | default: page.with_ogp_data | default: site.data.ogp | default: site.data.base.ogp %}
33
+
34
+ {%- comment %} === Presentation === {% endcomment %}
35
+ {%- comment %} --- Defaults --- {% endcomment %}
36
+ {%- assign ogp_og_type = ogp.og.type %}
37
+
38
+ {%- comment %} --- Common attributes for both `og` and `twitter` properties --- {% endcomment %}
39
+ {%- assign properties = "og,twitter" | split: "," %}
40
+ {%- for property in properties %}
41
+
42
+ {%- comment %} --- Title --- {% endcomment %}
43
+ {%- if page.ogp[property].title == nil %}
44
+ <meta property="{{ property }}:title" content="{{ page.title }}" />
45
+ {%- else %}
46
+ {%- endif %}
47
+
48
+ {%- comment %} --- URL --- {% endcomment %}
49
+ {%- if page.ogp[property].url == nil %}
50
+ <meta property="{{ property }}:url" content="{{ site.url }}{{ site.baseurl }}{{ page.url }}" />
51
+ {%- endif %}
52
+
53
+ {%- comment %} --- Description --- {% endcomment %}
54
+ {%- if page.ogp[property].description == nil %}
55
+ {%- if page.excrept %}
56
+ <meta property="{{ property }}:description" content="{{ site.excrept }}" />
57
+ {%- elsif page.title_lead %}
58
+ <meta property="{{ property }}:description" content="{{ page.title_lead }}" />
59
+ {%- else %}
60
+ <meta property="{{ property }}:description" content="{{ site.description }}" />
61
+ {%- endif %}
62
+ {%- endif %}
63
+
64
+ {%- comment %} --- Image --- {% endcomment %}
65
+ {%- if page.ogp[property].image == nil %}
66
+ <meta property="{{ property }}:image" content="{{ site.url }}{{ site.baseurl }}/assets/img/centos-social-share.png" />
67
+ {%- if property == "og" %}
68
+ <meta property="{{ property }}:image:secure_url" content="{{ site.url }}{{ site.baseurl }}/assets/img/centos-social-share.png" />
69
+ <meta property="{{ property }}:image:type" content="image/png" />
70
+ <meta property="{{ property }}:image:width" content="1200" />
71
+ <meta property="{{ property }}:image:height" content="630" />
72
+ {%- endif %}
73
+ {%- endif %}
74
+
75
+ {%- comment %} --- Image alternative text --- {% endcomment %}
76
+ {%- if page.ogp[property].image.alt == nil %}
77
+ <meta property="{{ property }}:image:alt" content="The CentOS Project" />
78
+ {%- endif %}
79
+
80
+ {%- comment %} --- Override common attributes in both `og` and `twitter` properties --- {% endcomment %}
81
+ {%- if property[0] == "og" %}
82
+ {%- for attribute in property[1] %}
83
+ {%- if attribute[0] == "image" or attribute[0] == "audio" or attribute[0] == "video" %}
84
+ {%- for item in attribute[1] %}
85
+ <meta property="{{ property[0] }}:{{ attribute[0] }}:{{ item[0] }}" content="{{ item[1] }}" />
86
+ {%- endfor %}
87
+ {%- else %}
88
+ <meta property="{{ property[0] }}:{{ attribute[0] }}" content="{{ attribute[1] }}" />
89
+ {%- endif %}
90
+ {%- endfor %}
91
+ {%- elsif property[0] == "twitter" %}
92
+ {%- for attribute in property[1] %}
93
+ {%- if attribute[0] == "image" or attribute[0] == "site" or attribute[0] == "creator" %}
94
+ {%- for item in attribute[1] %}
95
+ <meta property="{{ property[0] }}:{{ attribute[0] }}:{{ item[0] }}" content="{{ item[1] }}" />
96
+ {%- endfor %}
97
+ {%- else %}
98
+ <meta property="{{ property[0] }}:{{ attribute[0] }}" content="{{ attribute[1] }}" />
99
+ {%- endif %}
100
+ {%- endfor %}
101
+ {%- endif %}
102
+ {%- endfor %}
103
+
104
+ {%- comment %} --- Specific attributes for `og` property --- {% endcomment %}
105
+ {%- if ogp_og_type == nil %}
106
+ <meta property="og:type" content="website" />
107
+ {%- endif %}
108
+
109
+ {%- comment %} --- Specific attributes for `twitter` property --- {% endcomment %}
110
+ {%- if page.ogp.twitter.card == nil %}
111
+ <meta property="twitter:card" content="summary_large_image" />
112
+ {%- endif %}
113
+ {%- if page.ogp.twitter.site.id == nil %}
114
+ <meta property="twitter:site:id" content="@CentOS" />
115
+ {%- endif %}
116
+ {%- if page.ogp.twitter.creator.id == nil %}
117
+ <meta property="twitter:creator:id" content="@CentOS" />
118
+ {%- endif %}