jekyll-theme-centos 2.52.0.beta.4 → 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,251 @@
1
+ // Copy Value Component
2
+ // Provides copy-to-clipboard functionality with visual feedback
3
+ // Safely handles escaped and unescaped values, HTML entities, and special characters
4
+ // ARMORED IMPLEMENTATION: Handles any value passed via data-copy-value attribute
5
+
6
+ class CopyButtonHandler {
7
+ constructor(button, config = {}) {
8
+ this.button = button;
9
+ this.originalTitle = this.button.getAttribute('data-bs-title') || this.button.getAttribute('aria-label') || this.button.getAttribute('title');
10
+ this.originalSvgHTML = this.button.innerHTML;
11
+ this.resetDelay = config.resetDelay || 2000;
12
+ this.checkmarkPath = config.checkmarkPath || 'M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z';
13
+ this.checkmarkViewbox = config.checkmarkViewbox || '0 0 448 512';
14
+ this.successMessage = config.successMessage || 'Copied!';
15
+
16
+ this.button.addEventListener('click', (e) => this.handleClick(e));
17
+ }
18
+
19
+ handleClick(e) {
20
+ e.preventDefault();
21
+
22
+ // ARMOR: Retrieve the attribute value (may be escaped or unescaped)
23
+ let rawValue = this.button.getAttribute('data-copy-value');
24
+
25
+ // ARMOR: If attribute appears truncated or incomplete, try HTML extraction fallback
26
+ const appearsTruncated = !rawValue ||
27
+ rawValue.endsWith('=') ||
28
+ rawValue.match(/^[a-zA-Z-]+$/) ||
29
+ (rawValue.length < 5 && rawValue.includes(' '));
30
+
31
+ if (appearsTruncated) {
32
+ const extractedValue = this.extractDataCopyValueFromHTML();
33
+ if (extractedValue && extractedValue.length > (rawValue?.length || 0)) {
34
+ rawValue = extractedValue;
35
+ }
36
+ }
37
+
38
+ // Defensive check: ensure we have a value to copy
39
+ if (!rawValue) {
40
+ console.warn('No copy value found in data-copy-value attribute', this.button);
41
+ return;
42
+ }
43
+
44
+ // ARMOR: Auto-detect and handle both escaped and unescaped values
45
+ const finalValue = this.normalizeAttributeValue(rawValue);
46
+
47
+ const svg = this.button.querySelector('svg');
48
+
49
+ if (!svg) {
50
+ console.error('Icon SVG not found in button', this.button);
51
+ return;
52
+ }
53
+
54
+ // ARMOR: Use trim() to remove accidental whitespace
55
+ navigator.clipboard.writeText(finalValue.trim())
56
+ .then(() => this.showSuccess(svg))
57
+ .catch((err) => {
58
+ console.error('Failed to copy value:', finalValue, 'Error:', err);
59
+ });
60
+ }
61
+
62
+ extractDataCopyValueFromHTML() {
63
+ // ARMOR: Extract data-copy-value from raw HTML string
64
+ try {
65
+ const outerHTML = this.button.outerHTML;
66
+
67
+ const patterns = [
68
+ /data-copy-value="([^"]*)"/,
69
+ /data-copy-value='([^']*)'/,
70
+ /data-copy-value="((?:[^"\\]|\\.*)*)"/,
71
+ /data-copy-value="([^"]*(?:&quot;[^"]*)*?)"/,
72
+ /data-copy-value=["']?([^"\s>]+?)["'\s>]/,
73
+ /data-copy-value="([^"]*(?:[^"]*?)?)"/,
74
+ ];
75
+
76
+ for (const pattern of patterns) {
77
+ const match = outerHTML.match(pattern);
78
+ if (match && match[1] && match[1].length > 0) {
79
+ if (!match[1].startsWith('data-') && !match[1].startsWith('class') && !match[1].startsWith('id')) {
80
+ return match[1];
81
+ }
82
+ }
83
+ }
84
+
85
+ const attrIndex = outerHTML.indexOf('data-copy-value');
86
+ if (attrIndex !== -1) {
87
+ const afterAttr = outerHTML.substring(attrIndex + 15).trim();
88
+
89
+ if (afterAttr.startsWith('=')) {
90
+ const afterEquals = afterAttr.substring(1).trim();
91
+ const quoteChar = afterEquals[0];
92
+
93
+ if (quoteChar === '"' || quoteChar === "'") {
94
+ let endIndex = 1;
95
+ let escaped = false;
96
+
97
+ for (; endIndex < afterEquals.length; endIndex++) {
98
+ const char = afterEquals[endIndex];
99
+
100
+ if (escaped) {
101
+ escaped = false;
102
+ continue;
103
+ }
104
+
105
+ if (char === '\\') {
106
+ escaped = true;
107
+ continue;
108
+ }
109
+
110
+ if (char === quoteChar) {
111
+ return afterEquals.substring(1, endIndex);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
117
+
118
+ return null;
119
+ } catch (err) {
120
+ console.warn('Failed to extract data-copy-value from HTML:', err);
121
+ return null;
122
+ }
123
+ }
124
+
125
+ normalizeAttributeValue(text) {
126
+ // ARMOR: Smart normalization for escaped and unescaped values
127
+ if (!text) {
128
+ return text;
129
+ }
130
+
131
+ const hasHTMLEntities = /&(?:quot|apos|amp|lt|gt|#34|#39|#47|#60|#62|#x22|#x27|#x2[Ff]|#x3[Cc]|#x3[Ee]);/.test(text);
132
+
133
+ if (hasHTMLEntities) {
134
+ return this.decodeHTMLEntities(text);
135
+ }
136
+
137
+ const hasUnescapedQuotes = /"(?![>\s])|'(?![>\s])/.test(text.trim());
138
+ const hasUnescapedSpecialChars = /[<>]/.test(text);
139
+
140
+ if (hasUnescapedQuotes || hasUnescapedSpecialChars) {
141
+ return text;
142
+ }
143
+
144
+ return text;
145
+ }
146
+
147
+ decodeHTMLEntities(text) {
148
+ // ARMOR: Comprehensively decode HTML entities
149
+ const textarea = document.createElement('textarea');
150
+ textarea.innerHTML = text;
151
+ let decoded = textarea.value;
152
+
153
+ decoded = decoded
154
+ .replace(/&quot;/gi, '"')
155
+ .replace(/&#34;/gi, '"')
156
+ .replace(/&#x22;/gi, '"')
157
+ .replace(/&#39;/gi, "'")
158
+ .replace(/&apos;/gi, "'")
159
+ .replace(/&#x27;/gi, "'")
160
+ .replace(/&#x2[Ff];/g, '/')
161
+ .replace(/&#47;/g, '/')
162
+ .replace(/&lt;/gi, '<')
163
+ .replace(/&#60;/gi, '<')
164
+ .replace(/&#x3[Cc];/g, '<')
165
+ .replace(/&gt;/gi, '>')
166
+ .replace(/&#62;/gi, '>')
167
+ .replace(/&#x3[Ee];/g, '>')
168
+ .replace(/&amp;/gi, '&');
169
+
170
+ return decoded;
171
+ }
172
+
173
+ showSuccess(svg) {
174
+ this.changeToCheckmark(svg);
175
+ this.updateTooltip(this.successMessage);
176
+ setTimeout(() => this.reset(svg), this.resetDelay);
177
+ }
178
+
179
+ changeToCheckmark(svg) {
180
+ const path = svg.querySelector('path');
181
+ if (path) {
182
+ svg.setAttribute('viewBox', this.checkmarkViewbox);
183
+ path.setAttribute('d', this.checkmarkPath);
184
+ }
185
+ }
186
+
187
+ updateTooltip(message) {
188
+ if (!message || typeof message !== 'string') {
189
+ console.warn('Invalid tooltip message:', message);
190
+ return;
191
+ }
192
+
193
+ this.button.setAttribute('data-bs-title', message);
194
+
195
+ try {
196
+ const tooltip = bootstrap.Tooltip.getInstance(this.button);
197
+ if (tooltip) {
198
+ tooltip._config.title = message;
199
+ tooltip.update();
200
+ tooltip.show();
201
+ }
202
+ } catch (err) {
203
+ console.warn('Bootstrap Tooltip unavailable or error updating tooltip:', err);
204
+ }
205
+ }
206
+
207
+ reset(svg) {
208
+ this.button.innerHTML = this.originalSvgHTML;
209
+ this.updateTooltip(this.originalTitle);
210
+
211
+ try {
212
+ const tooltip = bootstrap.Tooltip.getInstance(this.button);
213
+ if (tooltip) {
214
+ tooltip.hide();
215
+ }
216
+ } catch (err) {
217
+ console.warn('Bootstrap Tooltip unavailable or error hiding tooltip:', err);
218
+ }
219
+ }
220
+ }
221
+
222
+ // Initialize all copy buttons when DOM is ready
223
+ document.addEventListener('DOMContentLoaded', function() {
224
+ // Get configuration from script's data attributes
225
+ const scriptElement = document.getElementById('centos-copyvalue');
226
+ const config = {};
227
+
228
+ if (scriptElement) {
229
+ if (scriptElement.dataset.resetDelay) {
230
+ config.resetDelay = parseInt(scriptElement.dataset.resetDelay, 10);
231
+ }
232
+ if (scriptElement.dataset.checkmarkPath) {
233
+ config.checkmarkPath = scriptElement.dataset.checkmarkPath;
234
+ }
235
+ if (scriptElement.dataset.checkmarkViewbox) {
236
+ config.checkmarkViewbox = scriptElement.dataset.checkmarkViewbox;
237
+ }
238
+ if (scriptElement.dataset.successMessage) {
239
+ config.successMessage = scriptElement.dataset.successMessage;
240
+ }
241
+ }
242
+
243
+ const copyButtons = document.querySelectorAll('.copy-btn');
244
+ copyButtons.forEach(button => {
245
+ try {
246
+ new CopyButtonHandler(button, config);
247
+ } catch (err) {
248
+ console.error('Failed to initialize copy button:', button, 'Error:', err);
249
+ }
250
+ });
251
+ });
@@ -0,0 +1,55 @@
1
+ // DataTables Initialization
2
+ // Reads configuration from data attributes on this script tag
3
+ // Applied via datatable.html.liquid template with data attributes
4
+
5
+ (function() {
6
+ // Find this script tag and extract its configuration
7
+ const scriptTag = document.getElementById('centos-datatable');
8
+
9
+ if (!scriptTag) {
10
+ console.warn('DataTables: script tag with id "centos-datatable" not found');
11
+ return;
12
+ }
13
+
14
+ // Read configuration from data attributes
15
+ const pageLength = parseInt(scriptTag.dataset.pageLength || 10);
16
+ const lengthMenuStr = scriptTag.dataset.lengthMenu || '[10,25,50,100]';
17
+
18
+ // Parse length menu array (stored as JSON string in data attribute)
19
+ let lengthMenu = [10, 25, 50, 100];
20
+ try {
21
+ lengthMenu = JSON.parse(lengthMenuStr);
22
+ } catch (e) {
23
+ console.warn('DataTables: Invalid lengthMenu format, using default:', e);
24
+ }
25
+
26
+ // Initialize on document ready
27
+ $(document).ready(function() {
28
+ // Target ALL tables that have the 'dataTable' class
29
+ const dataTableElements = $('table.dataTable');
30
+
31
+ if (dataTableElements.length > 0) {
32
+ // Initialize DataTables for ALL targeted tables found on the page
33
+ dataTableElements.each(function() {
34
+ const tableElement = $(this);
35
+
36
+ // Get the number of rows in the table body
37
+ const rowCount = tableElement.find('tbody tr').length;
38
+
39
+ // Determine if searching should be enabled (only if > 10 rows)
40
+ const enabledCondition = (rowCount > 10);
41
+
42
+ // Initialize DataTable with configuration
43
+ tableElement.DataTable({
44
+ responsive: true,
45
+ paging: enabledCondition,
46
+ info: enabledCondition,
47
+ order: [[0, 'asc']], // Order by first column
48
+ searching: enabledCondition,
49
+ pageLength: pageLength,
50
+ lengthMenu: lengthMenu
51
+ });
52
+ });
53
+ }
54
+ });
55
+ })();
@@ -0,0 +1,6 @@
1
+ // Highlight.js Initialization
2
+ // Initializes syntax highlighting on all code blocks with 'hljs' class
3
+ // Enables copy-to-clipboard functionality via highlightjs-copy plugin
4
+ document.querySelectorAll('.content code').forEach(el => el.classList.add('hljs'));
5
+ hljs.addPlugin(new CopyButtonPlugin());
6
+ hljs.highlightAll();
@@ -0,0 +1,5 @@
1
+ // Bootstrap Tooltip Initialization
2
+ // Initializes all Bootstrap tooltips on the page
3
+ // Data attributes are NOT needed - this is a global initialization
4
+ const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
5
+ const tooltipList = [...tooltipTriggerList].map((tooltipTriggerEl) => new bootstrap.Tooltip(tooltipTriggerEl));