jekyll-theme-zer0 0.21.0 → 0.22.0
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 +74 -0
- data/README.md +86 -46
- data/_data/authors.yml +12 -3
- data/_data/features.yml +1 -1
- data/_data/glossary.yml +101 -0
- data/_data/navigation/docs.yml +12 -0
- data/_data/navigation/home.yml +2 -2
- data/_data/navigation/main.yml +2 -8
- data/_data/prompts.yml +184 -0
- data/_includes/components/author-eeat.html +133 -0
- data/_includes/components/cookie-consent.html +9 -9
- data/_includes/components/dev-shortcuts.html +36 -27
- data/_includes/components/env-detect.html +14 -0
- data/_includes/components/env-switcher.html +38 -16
- data/_includes/components/halfmoon.html +31 -20
- data/_includes/components/info-section.html +4 -3
- data/_includes/components/js-cdn.html +8 -15
- data/_includes/components/mermaid.html +13 -9
- data/_includes/components/powered-by.html +5 -3
- data/_includes/content/intro.html +64 -4
- data/_includes/content/jsonld-faq.html +47 -0
- data/_includes/content/jsonld-software.html +121 -0
- data/_includes/content/sitemap.html +2 -2
- data/_includes/core/branding.html +9 -7
- data/_includes/core/footer.html +12 -9
- data/_includes/core/head.html +17 -14
- data/_includes/core/header.html +33 -21
- data/_includes/navigation/navbar.html +130 -124
- data/_includes/navigation/sidebar-left.html +3 -3
- data/_includes/navigation/sidebar-right.html +4 -8
- data/_includes/search-data.json +1 -2
- data/_layouts/landing.html +8 -3
- data/_layouts/root.html +4 -4
- data/_layouts/sitemap-collection.html +20 -10
- data/_sass/core/_docs-layout.scss +756 -0
- data/_sass/core/_navbar.scss +522 -69
- data/_sass/core/_offcanvas-panels.scss +48 -0
- data/_sass/core/_syntax.scss +1 -51
- data/_sass/core/_theme.scss +2 -249
- data/_sass/core/_variables.scss +1 -54
- data/_sass/core/code-copy.scss +6 -6
- data/_sass/custom.scss +119 -133
- data/_sass/theme/_color-modes.scss +3 -0
- data/_sass/theme/_css-variables.scss +29 -0
- data/_sass/theme/_wizard-mode.scss +31 -0
- data/assets/css/custom.css +5 -120
- data/assets/css/main.scss +6 -2
- data/assets/css/stats.css +3 -0
- data/assets/css/theme-npm-entry.scss +6 -0
- data/assets/css/vendor/.gitkeep +0 -0
- data/assets/images/authors/bamr87.png +0 -0
- data/assets/js/auto-hide-nav.js +71 -20
- data/assets/js/color-modes.js +8 -2
- data/assets/js/halfmoon.js +8 -2
- data/assets/js/myScript.js +4 -12
- data/assets/js/navigation.js +174 -19
- data/assets/js/search-modal.js +50 -7
- data/assets/vendor/bootstrap/css/bootstrap.min.css +5 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +6 -0
- data/assets/vendor/bootstrap-icons/font/bootstrap-icons.css +2018 -0
- data/assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
- data/assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
- data/assets/vendor/font-awesome/css/all.min.css +9 -0
- data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
- data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
- data/assets/vendor/github-calendar/github-calendar-responsive.css +231 -0
- data/assets/vendor/github-calendar/github-calendar.min.js +240 -0
- data/assets/vendor/jquery/jquery-3.7.1.min.js +2 -0
- data/assets/vendor/mathjax/es5/adaptors/liteDOM.js +1 -0
- data/assets/vendor/mathjax/es5/core.js +1 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff +0 -0
- data/assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Zero.woff +0 -0
- data/assets/vendor/mathjax/es5/startup.js +1 -0
- data/assets/vendor/mathjax/es5/tex-mml-chtml.js +1 -0
- data/assets/vendor/mermaid/mermaid.min.js +2029 -0
- data/scripts/bin/build +12 -2
- data/scripts/lib/common.sh +55 -0
- data/scripts/lib/gem.sh +7 -0
- data/scripts/lib/validation.sh +9 -1
- data/scripts/lib/version.sh +41 -0
- data/scripts/test/integration/mermaid +1 -1
- data/scripts/vendor-install.sh +196 -0
- metadata +62 -3
- data/_sass/core/_docs.scss +0 -3219
data/scripts/bin/build
CHANGED
|
@@ -83,7 +83,17 @@ main() {
|
|
|
83
83
|
success "Environment validated"
|
|
84
84
|
echo ""
|
|
85
85
|
|
|
86
|
-
# Step 2:
|
|
86
|
+
# Step 2: Vendor assets (optional refresh before packaging)
|
|
87
|
+
step "Vendor assets..."
|
|
88
|
+
local vendor_script="$SCRIPT_DIR/../vendor-install.sh"
|
|
89
|
+
if [[ -f "$vendor_script" ]]; then
|
|
90
|
+
bash "$vendor_script" || warn "vendor-install.sh exited non-zero; continuing build"
|
|
91
|
+
else
|
|
92
|
+
warn "vendor-install.sh not found, skipping"
|
|
93
|
+
fi
|
|
94
|
+
echo ""
|
|
95
|
+
|
|
96
|
+
# Step 3: Get current version
|
|
87
97
|
step "Reading version..."
|
|
88
98
|
local version
|
|
89
99
|
version=$(get_current_version)
|
|
@@ -91,7 +101,7 @@ main() {
|
|
|
91
101
|
info "Gem file: jekyll-theme-zer0-${version}.gem"
|
|
92
102
|
echo ""
|
|
93
103
|
|
|
94
|
-
# Step
|
|
104
|
+
# Step 4: Build gem
|
|
95
105
|
build_gem "$version"
|
|
96
106
|
echo ""
|
|
97
107
|
|
data/scripts/lib/common.sh
CHANGED
|
@@ -108,6 +108,60 @@ require_file() {
|
|
|
108
108
|
debug "Found required file: $file"
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
# Load simple KEY=VALUE pairs from an env file
|
|
112
|
+
load_env_file() {
|
|
113
|
+
local env_file="$1"
|
|
114
|
+
|
|
115
|
+
if [[ ! -f "$env_file" ]]; then
|
|
116
|
+
return 0
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
debug "Loading environment from $env_file"
|
|
120
|
+
|
|
121
|
+
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
122
|
+
# Trim leading whitespace for easier parsing.
|
|
123
|
+
line="${line#"${line%%[![:space:]]*}"}"
|
|
124
|
+
|
|
125
|
+
[[ -z "$line" ]] && continue
|
|
126
|
+
[[ "$line" == \#* ]] && continue
|
|
127
|
+
[[ "$line" != *=* ]] && continue
|
|
128
|
+
|
|
129
|
+
local key="${line%%=*}"
|
|
130
|
+
local value="${line#*=}"
|
|
131
|
+
|
|
132
|
+
# Trim whitespace around key/value.
|
|
133
|
+
key="${key#"${key%%[![:space:]]*}"}"
|
|
134
|
+
key="${key%"${key##*[![:space:]]}"}"
|
|
135
|
+
value="${value#"${value%%[![:space:]]*}"}"
|
|
136
|
+
value="${value%"${value##*[![:space:]]}"}"
|
|
137
|
+
|
|
138
|
+
# Only export valid shell identifiers.
|
|
139
|
+
[[ "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]] || continue
|
|
140
|
+
|
|
141
|
+
# Remove surrounding single/double quotes if present.
|
|
142
|
+
if [[ "$value" =~ ^\".*\"$ ]]; then
|
|
143
|
+
value="${value:1:${#value}-2}"
|
|
144
|
+
elif [[ "$value" =~ ^\'.*\'$ ]]; then
|
|
145
|
+
value="${value:1:${#value}-2}"
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
export "$key=$value"
|
|
149
|
+
done < "$env_file"
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Prefer API-key auth from environment for RubyGems publish operations.
|
|
153
|
+
prepare_rubygems_api_key() {
|
|
154
|
+
local repo_root
|
|
155
|
+
repo_root="$(get_repo_root)"
|
|
156
|
+
|
|
157
|
+
load_env_file "$repo_root/.env"
|
|
158
|
+
|
|
159
|
+
if [[ -z "${GEM_HOST_API_KEY:-}" ]] && [[ -n "${RUBY_API_KEY:-}" ]]; then
|
|
160
|
+
export GEM_HOST_API_KEY="$RUBY_API_KEY"
|
|
161
|
+
debug "Mapped RUBY_API_KEY to GEM_HOST_API_KEY for RubyGems publishing"
|
|
162
|
+
fi
|
|
163
|
+
}
|
|
164
|
+
|
|
111
165
|
# Get script directory
|
|
112
166
|
get_script_dir() {
|
|
113
167
|
local script_path="${BASH_SOURCE[0]}"
|
|
@@ -150,5 +204,6 @@ print_summary() {
|
|
|
150
204
|
export -f log info step success warn error debug
|
|
151
205
|
export -f confirm dry_run_exec
|
|
152
206
|
export -f command_exists require_command require_file
|
|
207
|
+
export -f load_env_file prepare_rubygems_api_key
|
|
153
208
|
export -f get_script_dir get_repo_root
|
|
154
209
|
export -f print_header print_summary
|
data/scripts/lib/gem.sh
CHANGED
|
@@ -101,6 +101,13 @@ publish_gem() {
|
|
|
101
101
|
if [[ ! -f "$gem_file" ]]; then
|
|
102
102
|
error "Gem file not found: $gem_file (run build first)"
|
|
103
103
|
fi
|
|
104
|
+
|
|
105
|
+
# Load API-key auth from environment or .env before publish.
|
|
106
|
+
prepare_rubygems_api_key
|
|
107
|
+
|
|
108
|
+
if [[ -z "${GEM_HOST_API_KEY:-}" ]] && [[ ! -f ~/.gem/credentials ]]; then
|
|
109
|
+
error "RubyGems authentication missing. Set GEM_HOST_API_KEY (or RUBY_API_KEY in .env) or run 'gem signin'."
|
|
110
|
+
fi
|
|
104
111
|
|
|
105
112
|
# Check if version already exists
|
|
106
113
|
if gem_version_exists "$version"; then
|
data/scripts/lib/validation.sh
CHANGED
|
@@ -69,9 +69,17 @@ validate_rubygems_auth() {
|
|
|
69
69
|
fi
|
|
70
70
|
|
|
71
71
|
debug "Validating RubyGems authentication..."
|
|
72
|
+
|
|
73
|
+
# Load API key from environment or .env when available.
|
|
74
|
+
prepare_rubygems_api_key
|
|
75
|
+
|
|
76
|
+
if [[ -n "${GEM_HOST_API_KEY:-}" ]]; then
|
|
77
|
+
debug "✓ RubyGems API key available via GEM_HOST_API_KEY"
|
|
78
|
+
return 0
|
|
79
|
+
fi
|
|
72
80
|
|
|
73
81
|
if [[ ! -f ~/.gem/credentials ]]; then
|
|
74
|
-
error "
|
|
82
|
+
error "RubyGems authentication missing. Set GEM_HOST_API_KEY (or RUBY_API_KEY in .env) or run 'gem signin'."
|
|
75
83
|
fi
|
|
76
84
|
|
|
77
85
|
debug "✓ RubyGems authentication present"
|
data/scripts/lib/version.sh
CHANGED
|
@@ -165,6 +165,45 @@ update_gemfile_lock() {
|
|
|
165
165
|
fi
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
+
# Update version references in README.md (front matter, stats table, footer badge)
|
|
169
|
+
update_readme() {
|
|
170
|
+
local new_version="$1"
|
|
171
|
+
local readme_file="README.md"
|
|
172
|
+
|
|
173
|
+
if [[ ! -f "$readme_file" ]]; then
|
|
174
|
+
debug "README.md not found, skipping"
|
|
175
|
+
return 0
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
debug "Updating version references in $readme_file..."
|
|
179
|
+
|
|
180
|
+
if [[ "$DRY_RUN" == "true" ]]; then
|
|
181
|
+
info "[DRY RUN] Would update version references in $readme_file"
|
|
182
|
+
return 0
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
local today
|
|
186
|
+
today=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
|
|
187
|
+
|
|
188
|
+
# Update all version patterns in a single sed pass
|
|
189
|
+
sed -i.tmp \
|
|
190
|
+
-e "s/^version: .*/version: $new_version/" \
|
|
191
|
+
-e "s/^lastmod: .*/lastmod: $today/" \
|
|
192
|
+
-e "s/| \*\*Current Version\*\* | [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*/| **Current Version** | $new_version/" \
|
|
193
|
+
-e "s/\*\*v[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\*\*/**v${new_version}**/" \
|
|
194
|
+
"$readme_file"
|
|
195
|
+
rm -f "${readme_file}.tmp"
|
|
196
|
+
|
|
197
|
+
# Log which references were updated for visibility
|
|
198
|
+
if grep -q "^version: $new_version" "$readme_file"; then
|
|
199
|
+
debug "✓ Front matter version updated"
|
|
200
|
+
else
|
|
201
|
+
debug "⚠ Front matter version pattern not found"
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
debug "✓ Updated $readme_file"
|
|
205
|
+
}
|
|
206
|
+
|
|
168
207
|
# Update version in all files
|
|
169
208
|
update_version_files() {
|
|
170
209
|
local new_version="$1"
|
|
@@ -176,6 +215,7 @@ update_version_files() {
|
|
|
176
215
|
update_version_rb "$new_version"
|
|
177
216
|
update_package_json "$new_version"
|
|
178
217
|
update_gemfile_lock "$new_version"
|
|
218
|
+
update_readme "$new_version"
|
|
179
219
|
|
|
180
220
|
success "Version files updated to $new_version"
|
|
181
221
|
}
|
|
@@ -207,6 +247,7 @@ export -f calculate_new_version
|
|
|
207
247
|
export -f update_version_rb
|
|
208
248
|
export -f update_package_json
|
|
209
249
|
export -f update_gemfile_lock
|
|
250
|
+
export -f update_readme
|
|
210
251
|
export -f update_version_files
|
|
211
252
|
export -f version_less_than
|
|
212
253
|
export -f get_version_from_tag
|
|
@@ -181,7 +181,7 @@ main() {
|
|
|
181
181
|
# Mermaid include file tests
|
|
182
182
|
log_info "Testing Mermaid include file..."
|
|
183
183
|
|
|
184
|
-
test_file_content "_includes/components/mermaid.html" "mermaid
|
|
184
|
+
test_file_content "_includes/components/mermaid.html" "site.mermaid.src" "Mermaid script from _config (local vendor path)"
|
|
185
185
|
test_file_content "_includes/components/mermaid.html" "mermaid.initialize" "Mermaid initialization script"
|
|
186
186
|
test_file_content "_includes/components/mermaid.html" "forest" "Forest theme configured"
|
|
187
187
|
test_file_content "_includes/components/mermaid.html" "FontAwesome" "FontAwesome support included"
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Vendor asset installer for zer0-mistakes Jekyll theme
|
|
4
|
+
# Downloads third-party JS/CSS libraries defined in vendor-manifest.json
|
|
5
|
+
#
|
|
6
|
+
# Usage: ./scripts/vendor-install.sh [--force] [--verbose] [--dry-run]
|
|
7
|
+
#
|
|
8
|
+
# Prerequisites: curl, jq, shasum (or sha256sum)
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
# Resolve paths
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
15
|
+
MANIFEST="$PROJECT_ROOT/vendor-manifest.json"
|
|
16
|
+
|
|
17
|
+
# Source common library if available
|
|
18
|
+
if [[ -f "$SCRIPT_DIR/lib/common.sh" ]]; then
|
|
19
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
20
|
+
else
|
|
21
|
+
# Minimal fallback logging (for CI environments without lib/common.sh)
|
|
22
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
|
|
23
|
+
BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'
|
|
24
|
+
log() { echo -e "${GREEN}[LOG]${NC} $1"; }
|
|
25
|
+
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
26
|
+
step() { echo -e "${CYAN}[STEP]${NC} $1"; }
|
|
27
|
+
success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|
28
|
+
warn() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
|
29
|
+
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }
|
|
30
|
+
DRY_RUN=${DRY_RUN:-false}
|
|
31
|
+
VERBOSE=${VERBOSE:-false}
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# Script-specific flags
|
|
35
|
+
FORCE=${FORCE:-false}
|
|
36
|
+
|
|
37
|
+
show_usage() {
|
|
38
|
+
cat << 'EOF'
|
|
39
|
+
📦 Vendor Asset Installer for zer0-mistakes
|
|
40
|
+
|
|
41
|
+
USAGE:
|
|
42
|
+
./scripts/vendor-install.sh [OPTIONS]
|
|
43
|
+
|
|
44
|
+
DESCRIPTION:
|
|
45
|
+
Downloads third-party libraries defined in vendor-manifest.json
|
|
46
|
+
into assets/vendor/. Verifies integrity via SHA-256 checksums.
|
|
47
|
+
Idempotent: skips files that already exist with matching checksums.
|
|
48
|
+
|
|
49
|
+
OPTIONS:
|
|
50
|
+
--force Re-download all files even if they exist
|
|
51
|
+
--dry-run Show what would be downloaded without downloading
|
|
52
|
+
--verbose Show detailed output
|
|
53
|
+
--help, -h Show this help message
|
|
54
|
+
|
|
55
|
+
EXAMPLES:
|
|
56
|
+
./scripts/vendor-install.sh # Install vendor assets
|
|
57
|
+
./scripts/vendor-install.sh --force # Re-download everything
|
|
58
|
+
./scripts/vendor-install.sh --dry-run # Preview downloads
|
|
59
|
+
EOF
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# Parse arguments
|
|
63
|
+
while [[ $# -gt 0 ]]; do
|
|
64
|
+
case $1 in
|
|
65
|
+
--force) FORCE=true; shift ;;
|
|
66
|
+
--dry-run) DRY_RUN=true; shift ;;
|
|
67
|
+
--verbose) VERBOSE=true; shift ;;
|
|
68
|
+
--help|-h) show_usage; exit 0 ;;
|
|
69
|
+
*) error "Unknown option: $1 (use --help for usage)" ;;
|
|
70
|
+
esac
|
|
71
|
+
done
|
|
72
|
+
|
|
73
|
+
# Detect checksum command
|
|
74
|
+
if command -v sha256sum &>/dev/null; then
|
|
75
|
+
SHA_CMD="sha256sum"
|
|
76
|
+
elif command -v shasum &>/dev/null; then
|
|
77
|
+
SHA_CMD="shasum -a 256"
|
|
78
|
+
else
|
|
79
|
+
error "Neither sha256sum nor shasum found. Install coreutils."
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Verify file checksum; returns 0 if match, 1 if mismatch
|
|
83
|
+
verify_checksum() {
|
|
84
|
+
local file="$1"
|
|
85
|
+
local expected="$2"
|
|
86
|
+
[[ -z "$expected" ]] && return 0 # no checksum to verify
|
|
87
|
+
local actual
|
|
88
|
+
actual=$($SHA_CMD "$file" | cut -d' ' -f1)
|
|
89
|
+
[[ "$actual" == "$expected" ]]
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Main
|
|
93
|
+
main() {
|
|
94
|
+
step "Vendor Asset Installer"
|
|
95
|
+
|
|
96
|
+
# Validate prerequisites
|
|
97
|
+
command -v curl &>/dev/null || error "curl is required but not found"
|
|
98
|
+
command -v jq &>/dev/null || error "jq is required but not found"
|
|
99
|
+
[[ -f "$MANIFEST" ]] || error "Manifest not found: $MANIFEST"
|
|
100
|
+
|
|
101
|
+
local lib_count
|
|
102
|
+
lib_count=$(jq '.libraries | length' "$MANIFEST")
|
|
103
|
+
info "Manifest: $lib_count libraries"
|
|
104
|
+
|
|
105
|
+
local total_files=0 downloaded=0 skipped=0 failed=0
|
|
106
|
+
|
|
107
|
+
for i in $(seq 0 $((lib_count - 1))); do
|
|
108
|
+
local lib_name lib_version file_count
|
|
109
|
+
lib_name=$(jq -r ".libraries[$i].name" "$MANIFEST")
|
|
110
|
+
lib_version=$(jq -r ".libraries[$i].version" "$MANIFEST")
|
|
111
|
+
file_count=$(jq ".libraries[$i].files | length" "$MANIFEST")
|
|
112
|
+
|
|
113
|
+
step "[$((i+1))/$lib_count] $lib_name v$lib_version ($file_count files)"
|
|
114
|
+
|
|
115
|
+
for j in $(seq 0 $((file_count - 1))); do
|
|
116
|
+
local url dest sha256
|
|
117
|
+
url=$(jq -r ".libraries[$i].files[$j].url" "$MANIFEST")
|
|
118
|
+
dest=$(jq -r ".libraries[$i].files[$j].dest" "$MANIFEST")
|
|
119
|
+
sha256=$(jq -r ".libraries[$i].files[$j].sha256 // empty" "$MANIFEST")
|
|
120
|
+
|
|
121
|
+
local dest_path="$PROJECT_ROOT/$dest"
|
|
122
|
+
total_files=$((total_files + 1))
|
|
123
|
+
|
|
124
|
+
# Check if file exists and checksum matches (skip unless --force)
|
|
125
|
+
if [[ "$FORCE" != "true" && -f "$dest_path" ]]; then
|
|
126
|
+
if [[ -n "$sha256" ]] && verify_checksum "$dest_path" "$sha256"; then
|
|
127
|
+
[[ "$VERBOSE" == "true" ]] && info " ✓ $dest (cached)"
|
|
128
|
+
skipped=$((skipped + 1))
|
|
129
|
+
continue
|
|
130
|
+
elif [[ -z "$sha256" ]]; then
|
|
131
|
+
[[ "$VERBOSE" == "true" ]] && info " ✓ $dest (exists, no checksum)"
|
|
132
|
+
skipped=$((skipped + 1))
|
|
133
|
+
continue
|
|
134
|
+
else
|
|
135
|
+
warn " ✗ $dest checksum mismatch, re-downloading"
|
|
136
|
+
fi
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
if [[ "$DRY_RUN" == "true" ]]; then
|
|
140
|
+
info " → would download: $dest"
|
|
141
|
+
downloaded=$((downloaded + 1))
|
|
142
|
+
continue
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# Create directory and download
|
|
146
|
+
mkdir -p "$(dirname "$dest_path")"
|
|
147
|
+
if curl -fsSL --retry 3 --retry-delay 2 -o "$dest_path" "$url"; then
|
|
148
|
+
# Verify checksum after download
|
|
149
|
+
if [[ -n "$sha256" ]]; then
|
|
150
|
+
if verify_checksum "$dest_path" "$sha256"; then
|
|
151
|
+
[[ "$VERBOSE" == "true" ]] && info " ✓ $dest (downloaded, verified)"
|
|
152
|
+
else
|
|
153
|
+
warn " ✗ $dest checksum mismatch after download!"
|
|
154
|
+
rm -f "$dest_path"
|
|
155
|
+
failed=$((failed + 1))
|
|
156
|
+
continue
|
|
157
|
+
fi
|
|
158
|
+
else
|
|
159
|
+
[[ "$VERBOSE" == "true" ]] && info " ✓ $dest (downloaded)"
|
|
160
|
+
fi
|
|
161
|
+
downloaded=$((downloaded + 1))
|
|
162
|
+
else
|
|
163
|
+
warn " ✗ Failed to download: $url"
|
|
164
|
+
failed=$((failed + 1))
|
|
165
|
+
fi
|
|
166
|
+
done
|
|
167
|
+
done
|
|
168
|
+
|
|
169
|
+
echo ""
|
|
170
|
+
if [[ "$DRY_RUN" == "true" ]]; then
|
|
171
|
+
info "Dry run complete: $downloaded would download, $skipped cached, $failed errors"
|
|
172
|
+
else
|
|
173
|
+
success "Vendor install complete: $downloaded downloaded, $skipped cached, $failed errors (total: $total_files)"
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
[[ $failed -gt 0 ]] && exit 1
|
|
177
|
+
|
|
178
|
+
# Mermaid: copy prebuilt dist from npm (avoids jsDelivr curl in the manifest).
|
|
179
|
+
if [[ "$DRY_RUN" != "true" ]]; then
|
|
180
|
+
copy_mermaid_from_npm() {
|
|
181
|
+
local src="$PROJECT_ROOT/node_modules/mermaid/dist/mermaid.min.js"
|
|
182
|
+
local dest="$PROJECT_ROOT/assets/vendor/mermaid/mermaid.min.js"
|
|
183
|
+
if [[ ! -f "$src" ]]; then
|
|
184
|
+
warn "Mermaid: node_modules/mermaid not found — run: npm install && npm run vendor:mermaid"
|
|
185
|
+
return 0
|
|
186
|
+
fi
|
|
187
|
+
mkdir -p "$(dirname "$dest")"
|
|
188
|
+
cp "$src" "$dest"
|
|
189
|
+
success "Mermaid: copied from npm package to assets/vendor/mermaid/mermaid.min.js"
|
|
190
|
+
}
|
|
191
|
+
copy_mermaid_from_npm
|
|
192
|
+
fi
|
|
193
|
+
return 0
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
main "$@"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jekyll-theme-zer0
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.22.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Amr Abdel
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-04-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jekyll
|
|
@@ -84,6 +84,7 @@ files:
|
|
|
84
84
|
- _data/generate_statistics.rb
|
|
85
85
|
- _data/generate_statistics.sh
|
|
86
86
|
- _data/github-actions-example.yml
|
|
87
|
+
- _data/glossary.yml
|
|
87
88
|
- _data/navigation/README.md
|
|
88
89
|
- _data/navigation/about.yml
|
|
89
90
|
- _data/navigation/docs.yml
|
|
@@ -93,6 +94,7 @@ files:
|
|
|
93
94
|
- _data/navigation/quickstart.yml
|
|
94
95
|
- _data/posts_organization.yml
|
|
95
96
|
- _data/prerequisites.yml
|
|
97
|
+
- _data/prompts.yml
|
|
96
98
|
- _data/statistics_config.yml
|
|
97
99
|
- _data/ui-text.yml
|
|
98
100
|
- _data/update_statistics.sh
|
|
@@ -102,8 +104,10 @@ files:
|
|
|
102
104
|
- _includes/analytics/google-tag-manager-head.html
|
|
103
105
|
- _includes/analytics/posthog.html
|
|
104
106
|
- _includes/components/author-card.html
|
|
107
|
+
- _includes/components/author-eeat.html
|
|
105
108
|
- _includes/components/cookie-consent.html
|
|
106
109
|
- _includes/components/dev-shortcuts.html
|
|
110
|
+
- _includes/components/env-detect.html
|
|
107
111
|
- _includes/components/env-switcher.html
|
|
108
112
|
- _includes/components/halfmoon.html
|
|
109
113
|
- _includes/components/info-section.html
|
|
@@ -121,6 +125,8 @@ files:
|
|
|
121
125
|
- _includes/components/zer0-env-var.html
|
|
122
126
|
- _includes/content/giscus.html
|
|
123
127
|
- _includes/content/intro.html
|
|
128
|
+
- _includes/content/jsonld-faq.html
|
|
129
|
+
- _includes/content/jsonld-software.html
|
|
124
130
|
- _includes/content/seo.html
|
|
125
131
|
- _includes/content/sitemap.html
|
|
126
132
|
- _includes/content/toc.html
|
|
@@ -166,22 +172,29 @@ files:
|
|
|
166
172
|
- _layouts/tag.html
|
|
167
173
|
- _plugins/preview_image_generator.rb
|
|
168
174
|
- _plugins/theme_version.rb
|
|
169
|
-
- _sass/core/_docs.scss
|
|
175
|
+
- _sass/core/_docs-layout.scss
|
|
170
176
|
- _sass/core/_nav-tree.scss
|
|
171
177
|
- _sass/core/_navbar.scss
|
|
178
|
+
- _sass/core/_offcanvas-panels.scss
|
|
172
179
|
- _sass/core/_syntax.scss
|
|
173
180
|
- _sass/core/_theme.scss
|
|
174
181
|
- _sass/core/_variables.scss
|
|
175
182
|
- _sass/core/code-copy.scss
|
|
176
183
|
- _sass/custom.scss
|
|
177
184
|
- _sass/notebooks.scss
|
|
185
|
+
- _sass/theme/_color-modes.scss
|
|
186
|
+
- _sass/theme/_css-variables.scss
|
|
187
|
+
- _sass/theme/_wizard-mode.scss
|
|
178
188
|
- assets/.DS_Store
|
|
179
189
|
- assets/css/custom.css
|
|
180
190
|
- assets/css/main.scss
|
|
181
191
|
- assets/css/stats.css
|
|
192
|
+
- assets/css/theme-npm-entry.scss
|
|
193
|
+
- assets/css/vendor/.gitkeep
|
|
182
194
|
- assets/data/notebooks/sales_data.csv
|
|
183
195
|
- assets/data/notebooks/survey_responses.csv
|
|
184
196
|
- assets/data/notebooks/weather_data.csv
|
|
197
|
+
- assets/images/authors/bamr87.png
|
|
185
198
|
- assets/images/favicon_gpt_computer_retro.png
|
|
186
199
|
- assets/images/gravatar-small.png
|
|
187
200
|
- assets/images/gravatar.png
|
|
@@ -234,6 +247,51 @@ files:
|
|
|
234
247
|
- assets/js/side-bar-folders.js
|
|
235
248
|
- assets/js/ui-enhancements.js
|
|
236
249
|
- assets/particles.json
|
|
250
|
+
- assets/vendor/bootstrap-icons/font/bootstrap-icons.css
|
|
251
|
+
- assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff
|
|
252
|
+
- assets/vendor/bootstrap-icons/font/fonts/bootstrap-icons.woff2
|
|
253
|
+
- assets/vendor/bootstrap/css/bootstrap.min.css
|
|
254
|
+
- assets/vendor/bootstrap/js/bootstrap.bundle.min.js
|
|
255
|
+
- assets/vendor/font-awesome/css/all.min.css
|
|
256
|
+
- assets/vendor/font-awesome/webfonts/fa-brands-400.ttf
|
|
257
|
+
- assets/vendor/font-awesome/webfonts/fa-brands-400.woff2
|
|
258
|
+
- assets/vendor/font-awesome/webfonts/fa-regular-400.ttf
|
|
259
|
+
- assets/vendor/font-awesome/webfonts/fa-regular-400.woff2
|
|
260
|
+
- assets/vendor/font-awesome/webfonts/fa-solid-900.ttf
|
|
261
|
+
- assets/vendor/font-awesome/webfonts/fa-solid-900.woff2
|
|
262
|
+
- assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf
|
|
263
|
+
- assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2
|
|
264
|
+
- assets/vendor/github-calendar/github-calendar-responsive.css
|
|
265
|
+
- assets/vendor/github-calendar/github-calendar.min.js
|
|
266
|
+
- assets/vendor/jquery/jquery-3.7.1.min.js
|
|
267
|
+
- assets/vendor/mathjax/es5/adaptors/liteDOM.js
|
|
268
|
+
- assets/vendor/mathjax/es5/core.js
|
|
269
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff
|
|
270
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff
|
|
271
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff
|
|
272
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff
|
|
273
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff
|
|
274
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff
|
|
275
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff
|
|
276
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff
|
|
277
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff
|
|
278
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff
|
|
279
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Math-Regular.woff
|
|
280
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff
|
|
281
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff
|
|
282
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff
|
|
283
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff
|
|
284
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff
|
|
285
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff
|
|
286
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff
|
|
287
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff
|
|
288
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff
|
|
289
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff
|
|
290
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff
|
|
291
|
+
- assets/vendor/mathjax/es5/output/chtml/fonts/woff-v2/MathJax_Zero.woff
|
|
292
|
+
- assets/vendor/mathjax/es5/startup.js
|
|
293
|
+
- assets/vendor/mathjax/es5/tex-mml-chtml.js
|
|
294
|
+
- assets/vendor/mermaid/mermaid.min.js
|
|
237
295
|
- scripts/README.md
|
|
238
296
|
- scripts/analyze-commits.sh
|
|
239
297
|
- scripts/bin/build
|
|
@@ -281,6 +339,7 @@ files:
|
|
|
281
339
|
- scripts/utils/analyze-commits
|
|
282
340
|
- scripts/utils/fix-markdown
|
|
283
341
|
- scripts/utils/setup
|
|
342
|
+
- scripts/vendor-install.sh
|
|
284
343
|
homepage: https://github.com/bamr87/zer0-mistakes
|
|
285
344
|
licenses:
|
|
286
345
|
- MIT
|