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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +428 -0
- data/README.md +79 -31
- data/_data/README.md +419 -17
- data/_data/generate_statistics.rb +216 -9
- data/_data/generate_statistics.sh +106 -0
- data/_data/github-actions-example.yml +210 -0
- data/_data/navigation/about.yml +39 -11
- data/_data/navigation/docs.yml +53 -23
- data/_data/navigation/home.yml +27 -9
- data/_data/navigation/main.yml +27 -8
- data/_data/navigation/posts.yml +22 -6
- data/_data/navigation/quickstart.yml +19 -6
- data/_data/posts_organization.yml +153 -0
- data/_data/prerequisites.yml +112 -0
- data/_data/statistics_config.yml +203 -0
- data/_data/ui-text.yml +321 -0
- data/_data/update_statistics.sh +126 -0
- data/_includes/README.md +2 -0
- data/_includes/components/js-cdn.html +4 -1
- data/_includes/components/post-card.html +2 -11
- data/_includes/components/preview-image.html +32 -0
- data/_includes/content/intro.html +9 -10
- data/_includes/core/header.html +14 -0
- data/_includes/navigation/sidebar-categories.html +20 -9
- data/_includes/navigation/sidebar-folders.html +8 -7
- data/_includes/navigation/sidebar-right.html +16 -10
- data/_layouts/blog.html +15 -45
- data/_layouts/category.html +4 -24
- data/_layouts/collection.html +2 -12
- data/_layouts/default.html +1 -1
- data/_layouts/journals.html +2 -12
- data/_layouts/notebook.html +296 -0
- data/_sass/core/_docs.scss +1 -1
- data/_sass/custom.scss +54 -17
- data/_sass/notebooks.scss +458 -0
- data/assets/images/notebooks/test-notebook_files/test-notebook_4_0.png +0 -0
- data/assets/js/sidebar.js +511 -0
- data/scripts/README.md +131 -105
- data/scripts/analyze-commits.sh +9 -311
- data/scripts/bin/build +22 -22
- data/scripts/build +7 -111
- data/scripts/convert-notebooks.sh +415 -0
- data/scripts/features/validate_preview_urls.py +500 -0
- data/scripts/fix-markdown-format.sh +8 -262
- data/scripts/generate-preview-images.sh +7 -787
- data/scripts/install-preview-generator.sh +8 -528
- data/scripts/lib/README.md +5 -5
- data/scripts/lib/changelog.sh +89 -57
- data/scripts/lib/gem.sh +19 -7
- data/scripts/release +7 -236
- data/scripts/setup.sh +9 -153
- data/scripts/test/lib/run_tests.sh +1 -2
- data/scripts/test-auto-version.sh +7 -256
- data/scripts/test-mermaid.sh +7 -287
- data/scripts/test.sh +9 -154
- metadata +16 -10
- data/scripts/features/preview_generator.py +0 -646
- data/scripts/lib/test/run_tests.sh +0 -140
- data/scripts/lib/test/test_changelog.sh +0 -87
- data/scripts/lib/test/test_gem.sh +0 -68
- data/scripts/lib/test/test_git.sh +0 -82
- data/scripts/lib/test/test_validation.sh +0 -72
- data/scripts/lib/test/test_version.sh +0 -96
- 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
|
-
{%
|
|
82
|
-
|
|
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
|
|