From 884df671a1bd744d3bc004cd8a6f2b5838d24b7b Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Mon, 11 May 2026 10:17:53 +0200 Subject: feat: initial commit — Apache autoindex theme with matrix rain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gen_web_hook.sh: generates _header.html/_footer.html per repo/category/package dir - .assets/matrix-rain.js: danix2-engine matrix rain, header-scoped (65% width, right-aligned) - Category headers include gradient accent pill with category name - htaccess: autoindex config, MIME types, cache headers, IndexIgnore .assets - vhost.conf: Apache VirtualHost template (values masked for public repo) - CLAUDE.md: repo architecture docs Co-Authored-By: Claude Sonnet 4.6 --- gen_web_hook.sh | 342 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100644 gen_web_hook.sh (limited to 'gen_web_hook.sh') diff --git a/gen_web_hook.sh b/gen_web_hook.sh new file mode 100644 index 0000000..050b89d --- /dev/null +++ b/gen_web_hook.sh @@ -0,0 +1,342 @@ +#!/bin/bash +# gen_web_hook.sh — generates static HTML header/footer files for the +# Apache autoindex listing of the danix Slackware package repository. +# +# Can be called standalone or from slackrepo's HOOK_FINISH. +# Usage: gen_web_hook.sh [/path/to/pkgrepo] +# +# If no argument is given, uses $SR_PKGREPO if set, otherwise /repo. + +set -euo pipefail + +PKGREPO="${1:-${SR_PKGREPO:-/repo}}" + +log() { echo "gen_web_hook: $*"; } +warn() { echo "gen_web_hook: WARNING: $*" >&2; } + +if [ ! -d "$PKGREPO" ]; then + warn "PKGREPO '$PKGREPO' not found." + exit 1 +fi + +log "Generating static web files in $PKGREPO ..." + +# ── HTML escape ─────────────────────────────────────────────────────────────── +html_escape() { + local s="$1" + s="${s//&/&}" + s="${s///>}" + s="${s//\"/"}" + printf '%s' "$s" +} + +# ── Shared CSS ──────────────────────────────────────────────────────────────── +CSS='' + +# ── Shared footer signature ─────────────────────────────────────────────────── +footer_sig() { + cat << 'EOF' +
+ +
+ + +EOF +} + +# ── Generate root _footer.html (last-updated + signature) ──────────────────── +generate_root_footer() { + local last_updated='unknown' + if [ -f "$PKGREPO/ChangeLog.txt" ]; then + last_updated=$(grep -m1 -E '^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)' "$PKGREPO/ChangeLog.txt" || echo 'unknown') + fi + + { + cat << EOF + +
+ +
+ + +EOF + } > "$PKGREPO/_footer.html" + log "Written: $PKGREPO/_footer.html" +} + +# ── Generate per-package _footer.html ──────────────────────────────────────── +generate_package_footer() { + local pkg_dir="$1" + local pkg_name + pkg_name=$(basename "$pkg_dir") + + local txt_file + txt_file=$(find "$pkg_dir" -maxdepth 1 -name '*.txt' | head -1) + + if [ -z "$txt_file" ]; then + # No .txt file — minimal footer + { echo ''; footer_sig; } > "$pkg_dir/_footer.html" + return + fi + + # Parse .txt + local title='' homepage='' body_lines=() + while IFS= read -r line; do + # Strip "pkgname:" or "pkgname: " prefix + local text + text=$(echo "$line" | sed 's/^[^:]*: \?//') + # Skip lines that were just "pkgname:" with nothing after + [[ "$line" == *: ]] && text='' + if [[ "$text" == Homepage:* ]]; then + homepage="${text#Homepage: }" + continue + fi + if [ -z "$title" ]; then + [ -n "$text" ] && title="$text" + else + [ -n "$text" ] && body_lines+=("$text") + fi + done < "$txt_file" + + # Parse .meta for sizes + local meta_file size_c='' size_u='' + meta_file=$(find "$pkg_dir" -maxdepth 1 -name '*.meta' | head -1) + if [ -n "$meta_file" ]; then + size_c=$(grep 'PACKAGE SIZE (compressed):' "$meta_file" | sed 's/.*: *//') + size_u=$(grep 'PACKAGE SIZE (uncompressed):' "$meta_file" | sed 's/.*: *//') + fi + + { + echo '' + echo '
' + echo '
' + echo ' Package description' + echo " $(html_escape "$pkg_name")" + echo '
' + echo '
' + echo "

$(html_escape "$title")

" + for bline in "${body_lines[@]}"; do + echo "

$(html_escape "$bline")

" + done + echo '
' + + if [ -n "$size_c" ] || [ -n "$size_u" ]; then + echo '
' + [ -n "$size_c" ] && echo " Size (compressed): $(html_escape "$size_c")" + [ -n "$size_u" ] && echo " Size (uncompressed): $(html_escape "$size_u")" + echo '
' + fi + + if [ -n "$homepage" ]; then + echo " " + fi + + echo '
' + footer_sig + } > "$pkg_dir/_footer.html" + + log "Written: $pkg_dir/_footer.html" +} + +# ── Write _header.html to a given directory ─────────────────────────────────── +write_header() { + local dir="$1" + cat > "$dir/_header.html" << EOF + + + + + + danix Slackware Repository + + + + ${CSS} + + + +
+EOF + log "Written: $dir/_header.html" +} + +# ── Write _header.html for a category directory (includes pill) ─────────────── +write_category_header() { + local dir="$1" + local cat_name + cat_name=$(basename "$dir") + cat > "$dir/_header.html" << EOF + + + + + + danix Slackware Repository + + + + ${CSS} + + + +
+EOF + log "Written: $dir/_header.html" +} + +# ── Generate category _footer.html (just the signature) ────────────────────── +generate_category_footer() { + local cat_dir="$1" + { echo '
'; footer_sig; } > "$cat_dir/_footer.html" + log "Written: $cat_dir/_footer.html" +} + +# ── Main ────────────────────────────────────────────────────────────────────── +write_header "$PKGREPO" +generate_root_footer + +for category in "$PKGREPO"/*/; do + [ -d "$category" ] || continue + write_category_header "$category" + generate_category_footer "$category" + for pkg in "$category"*/; do + [ -d "$pkg" ] || continue + write_header "$pkg" + generate_package_footer "$pkg" + done +done + +log "Done." -- cgit v1.2.3