jekyll-theme-zer0 0.10.6 → 0.15.2

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +428 -0
  3. data/README.md +79 -31
  4. data/_data/README.md +419 -17
  5. data/_data/generate_statistics.rb +216 -9
  6. data/_data/generate_statistics.sh +106 -0
  7. data/_data/github-actions-example.yml +210 -0
  8. data/_data/navigation/about.yml +39 -11
  9. data/_data/navigation/docs.yml +53 -23
  10. data/_data/navigation/home.yml +27 -9
  11. data/_data/navigation/main.yml +27 -8
  12. data/_data/navigation/posts.yml +22 -6
  13. data/_data/navigation/quickstart.yml +19 -6
  14. data/_data/posts_organization.yml +153 -0
  15. data/_data/prerequisites.yml +112 -0
  16. data/_data/statistics_config.yml +203 -0
  17. data/_data/ui-text.yml +321 -0
  18. data/_data/update_statistics.sh +126 -0
  19. data/_includes/README.md +2 -0
  20. data/_includes/components/js-cdn.html +4 -1
  21. data/_includes/components/post-card.html +2 -11
  22. data/_includes/components/preview-image.html +32 -0
  23. data/_includes/content/intro.html +9 -10
  24. data/_includes/core/header.html +14 -0
  25. data/_includes/navigation/sidebar-categories.html +20 -9
  26. data/_includes/navigation/sidebar-folders.html +8 -7
  27. data/_includes/navigation/sidebar-right.html +16 -10
  28. data/_layouts/blog.html +15 -45
  29. data/_layouts/category.html +4 -24
  30. data/_layouts/collection.html +2 -12
  31. data/_layouts/default.html +1 -1
  32. data/_layouts/journals.html +2 -12
  33. data/_layouts/notebook.html +296 -0
  34. data/_sass/core/_docs.scss +1 -1
  35. data/_sass/custom.scss +54 -17
  36. data/_sass/notebooks.scss +458 -0
  37. data/assets/images/notebooks/test-notebook_files/test-notebook_4_0.png +0 -0
  38. data/assets/js/sidebar.js +511 -0
  39. data/scripts/README.md +131 -105
  40. data/scripts/analyze-commits.sh +9 -311
  41. data/scripts/bin/build +22 -22
  42. data/scripts/build +7 -111
  43. data/scripts/convert-notebooks.sh +415 -0
  44. data/scripts/features/validate_preview_urls.py +500 -0
  45. data/scripts/fix-markdown-format.sh +8 -262
  46. data/scripts/generate-preview-images.sh +7 -787
  47. data/scripts/install-preview-generator.sh +8 -528
  48. data/scripts/lib/README.md +5 -5
  49. data/scripts/lib/changelog.sh +89 -57
  50. data/scripts/lib/gem.sh +19 -7
  51. data/scripts/release +7 -236
  52. data/scripts/setup.sh +9 -153
  53. data/scripts/test/lib/run_tests.sh +1 -2
  54. data/scripts/test-auto-version.sh +7 -256
  55. data/scripts/test-mermaid.sh +7 -287
  56. data/scripts/test.sh +9 -154
  57. metadata +16 -10
  58. data/scripts/features/preview_generator.py +0 -646
  59. data/scripts/lib/test/run_tests.sh +0 -140
  60. data/scripts/lib/test/test_changelog.sh +0 -87
  61. data/scripts/lib/test/test_gem.sh +0 -68
  62. data/scripts/lib/test/test_git.sh +0 -82
  63. data/scripts/lib/test/test_validation.sh +0 -72
  64. data/scripts/lib/test/test_version.sh +0 -96
  65. data/scripts/version.sh +0 -178
@@ -0,0 +1,203 @@
1
+ # Configuration for content statistics generation
2
+ # This file defines the mappings and categories used to analyze posts
3
+ # Used by: _data/generate_statistics.rb
4
+ # Purpose: Configurable keyword mappings for content analysis
5
+
6
+ # Focus area mappings - maps keywords to focus areas
7
+ focus_areas:
8
+ "AI & Machine Learning":
9
+ - ai
10
+ - ml
11
+ - machine-learning
12
+ - artificial-intelligence
13
+ - ai-assisted
14
+ - gpt
15
+ - chatgpt
16
+ - neural
17
+ - automation
18
+ - aipd
19
+
20
+ "Web Development":
21
+ - web
22
+ - javascript
23
+ - html
24
+ - css
25
+ - react
26
+ - angular
27
+ - django
28
+ - flask
29
+ - jekyll
30
+ - frontend
31
+ - backend
32
+ - fullstack
33
+ - api
34
+ - rest
35
+ - bootstrap
36
+
37
+ "DevOps & Infrastructure":
38
+ - devops
39
+ - docker
40
+ - kubernetes
41
+ - ci/cd
42
+ - deployment
43
+ - infrastructure
44
+ - containers
45
+ - orchestration
46
+ - pipeline
47
+ - github-actions
48
+ - travis
49
+ - netlify
50
+
51
+ "System Administration":
52
+ - linux
53
+ - windows
54
+ - macos
55
+ - server
56
+ - admin
57
+ - system
58
+ - dual-boot
59
+ - installation
60
+ - configuration
61
+
62
+ "Programming & Scripting":
63
+ - programming
64
+ - scripting
65
+ - python
66
+ - bash
67
+ - shell
68
+ - coding
69
+ - development
70
+ - refactoring
71
+ - architecture
72
+ - ruby
73
+ - typescript
74
+
75
+ "Data & Analytics":
76
+ - data
77
+ - database
78
+ - analytics
79
+ - scraping
80
+ - analysis
81
+ - processing
82
+ - statistics
83
+
84
+ "Tools & Development Environment":
85
+ - tools
86
+ - vscode
87
+ - editor
88
+ - environment
89
+ - productivity
90
+ - extension
91
+ - workflow
92
+
93
+ "Documentation & Content":
94
+ - documentation
95
+ - docs
96
+ - tutorial
97
+ - guide
98
+ - how-to
99
+ - mermaid
100
+ - diagram
101
+
102
+ "Creative & Experimental":
103
+ - creative
104
+ - experimental
105
+ - art
106
+ - music
107
+ - fiction
108
+ - storytelling
109
+ - themes
110
+
111
+ # Skill level mappings
112
+ skill_levels:
113
+ beginner:
114
+ - beginner
115
+ - intro
116
+ - introduction
117
+ - getting-started
118
+ - basics
119
+ - fundamentals
120
+ - first
121
+ - setup
122
+ - quickstart
123
+
124
+ intermediate:
125
+ - intermediate
126
+ - advanced-beginner
127
+ - practical
128
+ - hands-on
129
+ - implementation
130
+ - building
131
+
132
+ advanced:
133
+ - advanced
134
+ - deep-dive
135
+ - optimization
136
+ - performance
137
+ - architecture
138
+ - complex
139
+ - sophisticated
140
+
141
+ expert:
142
+ - expert
143
+ - research
144
+ - cutting-edge
145
+ - innovation
146
+ - meta
147
+ - engine
148
+ - evolution
149
+
150
+ # Content type mappings
151
+ content_types:
152
+ "Tutorial":
153
+ - tutorial
154
+ - guide
155
+ - how-to
156
+ - step-by-step
157
+ - walkthrough
158
+ - setup
159
+
160
+ "Article":
161
+ - article
162
+ - analysis
163
+ - insights
164
+ - deep-dive
165
+ - discussion
166
+ - overview
167
+
168
+ "Journal Entry":
169
+ - journal
170
+ - learning-journey
171
+ - diary
172
+ - chronicle
173
+ - post
174
+
175
+ "Documentation":
176
+ - documentation
177
+ - reference
178
+ - api
179
+ - manual
180
+ - specification
181
+
182
+ "News/Update":
183
+ - news
184
+ - update
185
+ - announcement
186
+ - release
187
+ - changelog
188
+
189
+ # Display preferences for statistics
190
+ display:
191
+ # Maximum items to show in top lists
192
+ max_categories: 10
193
+ max_tags: 15
194
+ max_authors: 5
195
+
196
+ # Whether to show percentages
197
+ show_percentages: true
198
+
199
+ # Minimum count to display an item
200
+ min_count_threshold: 1
201
+
202
+ # Highlight threshold for "popular" items
203
+ popular_threshold: 5
data/_data/ui-text.yml ADDED
@@ -0,0 +1,321 @@
1
+ # User interface text and labels
2
+ # Used by: Various includes and layouts throughout the theme
3
+ # Purpose: Multilingual UI strings for internationalization (i18n)
4
+
5
+ # English (default)
6
+ # -----------------
7
+ en: &DEFAULT_EN
8
+ skip_links : "Skip links"
9
+ skip_primary_nav : "Skip to primary navigation"
10
+ skip_content : "Skip to content"
11
+ skip_footer : "Skip to footer"
12
+ page : "Page"
13
+ pagination_previous : "Previous"
14
+ pagination_next : "Next"
15
+ breadcrumb_home_label : "Home"
16
+ breadcrumb_separator : "/"
17
+ menu_label : "Toggle menu"
18
+ search_label : "Toggle search"
19
+ toc_label : "On this page"
20
+ ext_link_label : "Direct link"
21
+ less_than : "less than"
22
+ minute_read : "minute read"
23
+ share_on_label : "Share on"
24
+ meta_label :
25
+ tags_label : "Tags:"
26
+ categories_label : "Categories:"
27
+ date_label : "Updated:"
28
+ author_label : "Author:"
29
+ comments_label : "Leave a comment"
30
+ comments_title : "Comments"
31
+ more_label : "Learn more"
32
+ related_label : "You may also enjoy"
33
+ follow_label : "Follow:"
34
+ feed_label : "Feed"
35
+ powered_by : "Powered by"
36
+ website_label : "Website"
37
+ email_label : "Email"
38
+ recent_posts : "Recent posts"
39
+ undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
40
+ comment_form_info : "Your email address will not be published. Required fields are marked"
41
+ comment_form_comment_label : "Comment"
42
+ comment_form_md_info : "Markdown is supported."
43
+ comment_form_name_label : "Name"
44
+ comment_form_email_label : "Email address"
45
+ comment_form_website_label : "Website (optional)"
46
+ comment_btn_submit : "Submit comment"
47
+ comment_btn_submitted : "Submitted"
48
+ comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
49
+ comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
50
+ loading_label : "Loading..."
51
+ search_label_text : "Enter your search term..."
52
+ search_placeholder_text : "Enter your search term..."
53
+ search_algolia_no_results : "No results"
54
+ results_found : "Result(s) found"
55
+ back_to_top : "Back to top"
56
+ # Statistics labels
57
+ stats_total_posts : "Total Posts"
58
+ stats_total_pages : "Total Pages"
59
+ stats_categories : "Categories"
60
+ stats_tags : "Tags"
61
+ stats_last_updated : "Last Updated"
62
+ stats_overview : "Overview"
63
+ stats_content_breakdown : "Content Breakdown"
64
+ # Theme-specific labels
65
+ theme_toggle : "Toggle theme"
66
+ dark_mode : "Dark mode"
67
+ light_mode : "Light mode"
68
+ view_source : "View source"
69
+ edit_page : "Edit this page"
70
+ report_issue : "Report an issue"
71
+
72
+ en-US:
73
+ <<: *DEFAULT_EN
74
+ en-CA:
75
+ <<: *DEFAULT_EN
76
+ en-GB:
77
+ <<: *DEFAULT_EN
78
+ en-AU:
79
+ <<: *DEFAULT_EN
80
+
81
+ # Spanish
82
+ # -------
83
+ es: &DEFAULT_ES
84
+ skip_links : "Saltar enlaces"
85
+ skip_primary_nav : "Saltar a navegaciÃŗn principal"
86
+ skip_content : "Saltar a contenido"
87
+ skip_footer : "Saltar a pie"
88
+ page : "PÃĄgina"
89
+ pagination_previous : "Anterior"
90
+ pagination_next : "Siguiente"
91
+ breadcrumb_home_label : "Inicio"
92
+ breadcrumb_separator : "/"
93
+ menu_label : "Alternar menÃē"
94
+ search_label : "Alternar bÃēsqueda"
95
+ toc_label : "En esta pÃĄgina"
96
+ ext_link_label : "Enlace directo"
97
+ less_than : "menos de"
98
+ minute_read : "minuto(s) de lectura"
99
+ share_on_label : "Compartir en"
100
+ meta_label :
101
+ tags_label : "Etiquetas:"
102
+ categories_label : "Categorías:"
103
+ date_label : "Actualizado:"
104
+ author_label : "Autor:"
105
+ comments_label : "Deja un comentario"
106
+ comments_title : "Comentarios"
107
+ more_label : "Ver mÃĄs"
108
+ related_label : "Puede que tambiÊn te interese"
109
+ follow_label : "Seguir:"
110
+ feed_label : "Feed"
111
+ powered_by : "Funciona con"
112
+ website_label : "Sitio web"
113
+ email_label : "Correo electrÃŗnico"
114
+ recent_posts : "Entradas recientes"
115
+ undefined_wpm : "El parÃĄmetro words_per_minute (palabras por minuto) no estÃĄ definido en _config.yml"
116
+ comment_form_info : "Tu direcciÃŗn de correo electrÃŗnico no se publicarÃĄ. Los campos obligatorios estÃĄn marcados"
117
+ comment_form_comment_label : "Comentario"
118
+ comment_form_md_info : "Puedes utilizar Markdown"
119
+ comment_form_name_label : "Nombre"
120
+ comment_form_email_label : "DirecciÃŗn de correo electrÃŗnico"
121
+ comment_form_website_label : "Sitio web (opcional)"
122
+ comment_btn_submit : "Enviar comentario"
123
+ comment_btn_submitted : "Enviado"
124
+ comment_success_msg : "ÂĄGracias por tu comentario! Se mostrarÃĄ en el sitio una vez que haya sido aprobado."
125
+ comment_error_msg : "Lo sentimos, ha habido un error con tu envío. Por favor, asegÃērate de que todos los campos obligatorios se han completado e intÊntalo de nuevo."
126
+ loading_label : "Cargando..."
127
+ search_label_text : "Introduce tu tÊrmino de bÃēsqueda..."
128
+ search_placeholder_text : "Introduce tu tÊrmino de bÃēsqueda..."
129
+ search_algolia_no_results : "Sin resultados"
130
+ results_found : "Resultado(s) encontrado(s)"
131
+ back_to_top : "Volver arriba"
132
+ # Statistics labels
133
+ stats_total_posts : "Total de Publicaciones"
134
+ stats_total_pages : "Total de PÃĄginas"
135
+ stats_categories : "Categorías"
136
+ stats_tags : "Etiquetas"
137
+ stats_last_updated : "Última ActualizaciÃŗn"
138
+ stats_overview : "Resumen"
139
+ stats_content_breakdown : "Desglose de Contenido"
140
+ # Theme-specific labels
141
+ theme_toggle : "Cambiar tema"
142
+ dark_mode : "Modo oscuro"
143
+ light_mode : "Modo claro"
144
+ view_source : "Ver cÃŗdigo fuente"
145
+ edit_page : "Editar esta pÃĄgina"
146
+ report_issue : "Reportar un problema"
147
+
148
+ es-ES:
149
+ <<: *DEFAULT_ES
150
+ es-MX:
151
+ <<: *DEFAULT_ES
152
+
153
+ # French
154
+ # ------
155
+ fr: &DEFAULT_FR
156
+ skip_links : "Liens de saut"
157
+ skip_primary_nav : "Aller à la navigation principale"
158
+ skip_content : "Aller au contenu"
159
+ skip_footer : "Aller au pied de page"
160
+ page : "Page"
161
+ pagination_previous : "PrÊcÊdent"
162
+ pagination_next : "Suivant"
163
+ breadcrumb_home_label : "Accueil"
164
+ breadcrumb_separator : "/"
165
+ menu_label : "Basculer le menu"
166
+ search_label : "Basculer la recherche"
167
+ toc_label : "Sur cette page"
168
+ ext_link_label : "Lien direct"
169
+ less_than : "moins de"
170
+ minute_read : "minute(s) de lecture"
171
+ share_on_label : "Partager sur"
172
+ meta_label :
173
+ tags_label : "Tags :"
174
+ categories_label : "CatÊgories :"
175
+ date_label : "Mis à jour :"
176
+ author_label : "Auteur :"
177
+ comments_label : "Laisser un commentaire"
178
+ comments_title : "Commentaires"
179
+ more_label : "En savoir plus"
180
+ related_label : "Vous pourriez aussi aimer"
181
+ follow_label : "Suivre :"
182
+ feed_label : "Flux"
183
+ powered_by : "PropulsÊ par"
184
+ website_label : "Site web"
185
+ email_label : "Email"
186
+ recent_posts : "Articles rÊcents"
187
+ back_to_top : "Retour en haut"
188
+ # Statistics labels
189
+ stats_total_posts : "Total des Publications"
190
+ stats_total_pages : "Total des Pages"
191
+ stats_categories : "CatÊgories"
192
+ stats_tags : "Tags"
193
+ stats_last_updated : "Dernière Mise à Jour"
194
+ stats_overview : "Aperçu"
195
+ stats_content_breakdown : "RÊpartition du Contenu"
196
+ # Theme-specific labels
197
+ theme_toggle : "Changer de thème"
198
+ dark_mode : "Mode sombre"
199
+ light_mode : "Mode clair"
200
+ view_source : "Voir la source"
201
+ edit_page : "Modifier cette page"
202
+ report_issue : "Signaler un problème"
203
+
204
+ fr-FR:
205
+ <<: *DEFAULT_FR
206
+ fr-CA:
207
+ <<: *DEFAULT_FR
208
+
209
+ # German
210
+ # ------
211
+ de: &DEFAULT_DE
212
+ skip_links : "Links Ãŧberspringen"
213
+ skip_primary_nav : "Zur Hauptnavigation springen"
214
+ skip_content : "Zum Inhalt springen"
215
+ skip_footer : "Zur Fußzeile springen"
216
+ page : "Seite"
217
+ pagination_previous : "ZurÃŧck"
218
+ pagination_next : "Weiter"
219
+ breadcrumb_home_label : "Startseite"
220
+ breadcrumb_separator : "/"
221
+ menu_label : "MenÃŧ umschalten"
222
+ search_label : "Suche umschalten"
223
+ toc_label : "Auf dieser Seite"
224
+ ext_link_label : "Direktlink"
225
+ less_than : "weniger als"
226
+ minute_read : "Minute(n) Lesezeit"
227
+ share_on_label : "Teilen auf"
228
+ meta_label :
229
+ tags_label : "Tags:"
230
+ categories_label : "Kategorien:"
231
+ date_label : "Aktualisiert:"
232
+ author_label : "Autor:"
233
+ comments_label : "Einen Kommentar hinterlassen"
234
+ comments_title : "Kommentare"
235
+ more_label : "Mehr erfahren"
236
+ related_label : "Das kÃļnnte Sie auch interessieren"
237
+ follow_label : "Folgen:"
238
+ feed_label : "Feed"
239
+ powered_by : "Betrieben mit"
240
+ website_label : "Webseite"
241
+ email_label : "E-Mail"
242
+ recent_posts : "Neueste Beiträge"
243
+ back_to_top : "Nach oben"
244
+ # Statistics labels
245
+ stats_total_posts : "Gesamte Beiträge"
246
+ stats_total_pages : "Gesamte Seiten"
247
+ stats_categories : "Kategorien"
248
+ stats_tags : "Tags"
249
+ stats_last_updated : "Zuletzt Aktualisiert"
250
+ stats_overview : "Übersicht"
251
+ stats_content_breakdown : "InhaltsaufschlÃŧsselung"
252
+ # Theme-specific labels
253
+ theme_toggle : "Thema wechseln"
254
+ dark_mode : "Dunkler Modus"
255
+ light_mode : "Heller Modus"
256
+ view_source : "Quelle ansehen"
257
+ edit_page : "Diese Seite bearbeiten"
258
+ report_issue : "Ein Problem melden"
259
+
260
+ de-DE:
261
+ <<: *DEFAULT_DE
262
+ de-AT:
263
+ <<: *DEFAULT_DE
264
+ de-CH:
265
+ <<: *DEFAULT_DE
266
+
267
+ # Arabic
268
+ # ------
269
+ ar: &DEFAULT_AR
270
+ skip_links : "ØĒØŽØˇŲŠ Ø§Ų„ØąŲˆØ§Ø¨Øˇ"
271
+ skip_primary_nav : "Ø§Ų†ØĒŲ‚Ų„ ØĨŲ„Ų‰ Ø§Ų„ØĒŲ†Ų‚Ų„ Ø§Ų„ØąØĻŲŠØŗŲŠ"
272
+ skip_content : "Ø§Ų†ØĒŲ‚Ų„ ØĨŲ„Ų‰ Ø§Ų„Ų…Ø­ØĒŲˆŲ‰"
273
+ skip_footer : "Ø§Ų†ØĒŲ‚Ų„ ØĨŲ„Ų‰ Ø§Ų„ØĒØ°ŲŠŲŠŲ„"
274
+ page : "ØĩŲØ­ØŠ"
275
+ pagination_previous : "Ø§Ų„ØŗØ§Ø¨Ų‚"
276
+ pagination_next : "Ø§Ų„ØĒØ§Ų„ŲŠ"
277
+ breadcrumb_home_label : "Ø§Ų„ØąØĻŲŠØŗŲŠØŠ"
278
+ breadcrumb_separator : "/"
279
+ menu_label : "ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„Ų‚Ø§ØĻŲ…ØŠ"
280
+ search_label : "ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„Ø¨Ø­ØĢ"
281
+ toc_label : "؁؊ Ų‡Ø°Ų‡ Ø§Ų„ØĩŲØ­ØŠ"
282
+ ext_link_label : "ØąØ§Ø¨Øˇ Ų…Ø¨Ø§Ø´Øą"
283
+ less_than : "ØŖŲ‚Ų„ Ų…Ų†"
284
+ minute_read : "Ø¯Ų‚ŲŠŲ‚ØŠ Ų„Ų„Ų‚ØąØ§ØĄØŠ"
285
+ share_on_label : "Ų…Ø´Ø§ØąŲƒØŠ ØšŲ„Ų‰"
286
+ meta_label :
287
+ tags_label : "Ø§Ų„ŲˆØŗŲˆŲ…:"
288
+ categories_label : "Ø§Ų„ØŖŲ‚ØŗØ§Ų…:"
289
+ date_label : "ØĒØ§ØąŲŠØŽ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ:"
290
+ author_label : "Ø§Ų„ŲƒØ§ØĒب:"
291
+ comments_label : "اØĒØąŲƒ ØĒØšŲ„ŲŠŲ‚Ø§Ų‹"
292
+ comments_title : "Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ"
293
+ more_label : "Ø§Ų‚ØąØŖ Ø§Ų„Ų…Ø˛ŲŠØ¯"
294
+ related_label : "Ų‚Ø¯ ŲŠØšØŦØ¨Ųƒ ØŖŲŠØļØ§Ų‹"
295
+ follow_label : "ØĒØ§Ø¨ØšŲ†Ø§:"
296
+ feed_label : "Ø§Ų„ØŽŲ„Ø§ØĩØŠ"
297
+ powered_by : "ŲŠØšŲ…Ų„ Ø¨ŲˆØ§ØŗØˇØŠ"
298
+ website_label : "Ø§Ų„Ų…ŲˆŲ‚Øš"
299
+ email_label : "Ø§Ų„Ø¨ØąŲŠØ¯ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ"
300
+ recent_posts : "Ø§Ų„Ų…Ų†Ø´ŲˆØąØ§ØĒ Ø§Ų„ØŖØŽŲŠØąØŠ"
301
+ back_to_top : "Ø§Ų„ØšŲˆØ¯ØŠ Ų„Ų„ØŖØšŲ„Ų‰"
302
+ # Statistics labels
303
+ stats_total_posts : "ØĨØŦŲ…Ø§Ų„ŲŠ Ø§Ų„Ų…Ų†Ø´ŲˆØąØ§ØĒ"
304
+ stats_total_pages : "ØĨØŦŲ…Ø§Ų„ŲŠ Ø§Ų„ØĩŲØ­Ø§ØĒ"
305
+ stats_categories : "Ø§Ų„ØŖŲ‚ØŗØ§Ų…"
306
+ stats_tags : "Ø§Ų„ŲˆØŗŲˆŲ…"
307
+ stats_last_updated : "ØĸØŽØą ØĒØ­Ø¯ŲŠØĢ"
308
+ stats_overview : "Ų†Ø¸ØąØŠ ØšØ§Ų…ØŠ"
309
+ stats_content_breakdown : "ØĒ؁ØĩŲŠŲ„ Ø§Ų„Ų…Ø­ØĒŲˆŲ‰"
310
+ # Theme-specific labels
311
+ theme_toggle : "ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„Ų…Ø¸Ų‡Øą"
312
+ dark_mode : "Ø§Ų„ŲˆØļØš Ø§Ų„Ø¯Ø§ŲƒŲ†"
313
+ light_mode : "Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­"
314
+ view_source : "ØšØąØļ Ø§Ų„Ų…ØĩØ¯Øą"
315
+ edit_page : "ØĒØ­ØąŲŠØą Ų‡Ø°Ų‡ Ø§Ų„ØĩŲØ­ØŠ"
316
+ report_issue : "Ø§Ų„ØĨØ¨Ų„Ø§Øē ØšŲ† Ų…Ø´ŲƒŲ„ØŠ"
317
+
318
+ ar-SA:
319
+ <<: *DEFAULT_AR
320
+ ar-EG:
321
+ <<: *DEFAULT_AR
@@ -0,0 +1,126 @@
1
+ #!/bin/bash
2
+
3
+ # Automated Content Statistics Update Script
4
+ # Used by: CI/CD pipelines for automatic statistics updates
5
+ # Purpose: Update statistics and optionally commit changes
6
+
7
+ set -euo pipefail
8
+
9
+ # Configuration
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
12
+ STATS_FILE="$SCRIPT_DIR/content_statistics.yml"
13
+
14
+ # Colors for output (if terminal supports it)
15
+ if [[ -t 1 ]]; then
16
+ RED='\033[0;31m'
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ BLUE='\033[0;34m'
20
+ NC='\033[0m'
21
+ else
22
+ RED=''
23
+ GREEN=''
24
+ YELLOW=''
25
+ BLUE=''
26
+ NC=''
27
+ fi
28
+
29
+ echo -e "${BLUE}🤖 Automated Content Statistics Update${NC}"
30
+ echo "========================================"
31
+
32
+ # Check if this is a CI environment
33
+ if [[ "${CI:-false}" == "true" ]]; then
34
+ echo -e "${YELLOW}🔧 Running in CI environment${NC}"
35
+ # Set git user for automated commits
36
+ git config --global user.name "Content Statistics Bot"
37
+ git config --global user.email "bot@zer0-mistakes.dev"
38
+ fi
39
+
40
+ # Store current statistics hash if file exists
41
+ CURRENT_HASH=""
42
+ if [[ -f "$STATS_FILE" ]]; then
43
+ if command -v sha256sum &> /dev/null; then
44
+ CURRENT_HASH=$(sha256sum "$STATS_FILE" | cut -d' ' -f1)
45
+ elif command -v shasum &> /dev/null; then
46
+ CURRENT_HASH=$(shasum -a 256 "$STATS_FILE" | cut -d' ' -f1)
47
+ fi
48
+ fi
49
+
50
+ # Generate new statistics
51
+ echo -e "${YELLOW}🔄 Generating updated statistics...${NC}"
52
+ if bash "$SCRIPT_DIR/generate_statistics.sh"; then
53
+ echo -e "${GREEN}✅ Statistics generated successfully${NC}"
54
+ else
55
+ echo -e "${RED}❌ Failed to generate statistics${NC}"
56
+ exit 1
57
+ fi
58
+
59
+ # Check if statistics have changed
60
+ NEW_HASH=""
61
+ if [[ -f "$STATS_FILE" ]]; then
62
+ if command -v sha256sum &> /dev/null; then
63
+ NEW_HASH=$(sha256sum "$STATS_FILE" | cut -d' ' -f1)
64
+ elif command -v shasum &> /dev/null; then
65
+ NEW_HASH=$(shasum -a 256 "$STATS_FILE" | cut -d' ' -f1)
66
+ fi
67
+ fi
68
+
69
+ if [[ "$CURRENT_HASH" == "$NEW_HASH" ]]; then
70
+ echo -e "${BLUE}â„šī¸ No changes detected in content statistics${NC}"
71
+ echo "Statistics are up to date."
72
+ exit 0
73
+ fi
74
+
75
+ echo -e "${GREEN}📊 Content statistics have been updated${NC}"
76
+
77
+ # If running in CI, commit the changes
78
+ if [[ "${CI:-false}" == "true" ]]; then
79
+ echo -e "${YELLOW}📝 Committing updated statistics...${NC}"
80
+
81
+ cd "$PROJECT_ROOT"
82
+
83
+ # Add the updated statistics file
84
+ git add "$STATS_FILE"
85
+
86
+ # Check if there are changes to commit
87
+ if git diff --staged --quiet; then
88
+ echo -e "${BLUE}â„šī¸ No changes to commit${NC}"
89
+ else
90
+ # Create commit message with timestamp
91
+ TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
92
+
93
+ # Try to get stats from yq, fallback to N/A
94
+ TOTAL_POSTS="N/A"
95
+ PUBLISHED="N/A"
96
+ CATEGORIES="N/A"
97
+
98
+ if command -v yq &> /dev/null; then
99
+ TOTAL_POSTS=$(yq '.overview.total_posts' "$STATS_FILE" 2>/dev/null || echo "N/A")
100
+ PUBLISHED=$(yq '.overview.published' "$STATS_FILE" 2>/dev/null || echo "N/A")
101
+ CATEGORIES=$(yq '.overview.total_categories' "$STATS_FILE" 2>/dev/null || echo "N/A")
102
+ fi
103
+
104
+ COMMIT_MSG="🤖 Auto-update content statistics - $TIMESTAMP
105
+
106
+ - Total posts analyzed: $TOTAL_POSTS
107
+ - Published posts: $PUBLISHED
108
+ - Categories tracked: $CATEGORIES
109
+
110
+ [skip ci]"
111
+
112
+ git commit -m "$COMMIT_MSG"
113
+ echo -e "${GREEN}✅ Statistics committed successfully${NC}"
114
+
115
+ # Push if configured
116
+ if [[ "${AUTO_PUSH:-false}" == "true" ]]; then
117
+ echo -e "${YELLOW}🚀 Pushing changes...${NC}"
118
+ git push origin HEAD
119
+ echo -e "${GREEN}✅ Changes pushed to repository${NC}"
120
+ fi
121
+ fi
122
+ fi
123
+
124
+ echo ""
125
+ echo "=========================="
126
+ echo -e "${GREEN}🎉 Statistics update complete!${NC}"
data/_includes/README.md CHANGED
@@ -46,6 +46,8 @@ Reusable UI components and widgets:
46
46
  - `zer0-env-var.html` - Environment variable configuration
47
47
  - `svg.html` - SVG icon definitions
48
48
  - `js-cdn.html` - CDN JavaScript libraries
49
+ - `preview-image.html` - Consistent preview image rendering with lazy loading
50
+ - `post-card.html` - Reusable post card component for listings
49
51
 
50
52
  ### `content/`
51
53
 
@@ -26,4 +26,7 @@
26
26
  <!-- Bootstrap 5.3.3 Bundle (includes Popper.js) -->
27
27
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
28
28
  integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
29
- crossorigin="anonymous"></script>
29
+ crossorigin="anonymous"></script>
30
+
31
+ <!-- Sidebar Navigation Enhancements - Deferred for performance -->
32
+ <script defer src="{{ '/assets/js/sidebar.js' | relative_url }}"></script>
@@ -78,17 +78,8 @@
78
78
 
79
79
  <!-- Preview Image -->
80
80
  <a href="{{ include.post.url | relative_url }}" class="text-decoration-none">
81
- {% if include.post.preview %}
82
- <img src="{{ site.baseurl }}/{{ site.public_folder }}/{{ include.post.preview }}"
83
- class="card-img-top"
84
- alt="Preview image for {{ include.post.title }}"
85
- loading="lazy">
86
- {% else %}
87
- <img src="{{ site.baseurl }}/{{ site.public_folder }}/{{ site.teaser }}"
88
- class="card-img-top"
89
- alt="Default preview image"
90
- loading="lazy">
91
- {% endif %}
81
+ {% assign card_img = include.post.preview | default: site.teaser %}
82
+ {% include components/preview-image.html src=card_img alt=include.post.title class="card-img-top" %}
92
83
  </a>
93
84
  </div>
94
85