2025-12-21 19:02:19 +01:00
|
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
# Install Zeal - Offline Documentation Browser
|
|
|
|
|
|
# Downloads official documentation for: C, C++, JavaScript, TypeScript, Python
|
|
|
|
|
|
#
|
|
|
|
|
|
# Zeal is a free, open source (GPL) offline documentation browser
|
|
|
|
|
|
# Similar to Dash for macOS, uses compatible docsets
|
|
|
|
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
|
|
# Colors for output
|
|
|
|
|
|
RED='\033[0;31m'
|
|
|
|
|
|
GREEN='\033[0;32m'
|
|
|
|
|
|
YELLOW='\033[1;33m'
|
|
|
|
|
|
BLUE='\033[0;34m'
|
|
|
|
|
|
NC='\033[0m'
|
|
|
|
|
|
|
|
|
|
|
|
success() { echo -e "${GREEN}✓ $1${NC}"; }
|
|
|
|
|
|
warn() { echo -e "${YELLOW}⚠ $1${NC}"; }
|
|
|
|
|
|
error() { echo -e "${RED}✗ $1${NC}"; }
|
|
|
|
|
|
info() { echo -e "${BLUE}ℹ $1${NC}"; }
|
|
|
|
|
|
|
|
|
|
|
|
echo "=============================================="
|
|
|
|
|
|
echo " Offline Documentation Installer"
|
|
|
|
|
|
echo " Languages: C, C++, JavaScript, TypeScript, Python"
|
|
|
|
|
|
echo "=============================================="
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# Detect package manager and install Zeal
|
|
|
|
|
|
install_zeal() {
|
2026-02-20 01:17:53 +01:00
|
|
|
|
if command -v zeal &>/dev/null; then
|
|
|
|
|
|
success "Zeal is already installed"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "Installing Zeal offline documentation browser..."
|
|
|
|
|
|
|
|
|
|
|
|
if command -v pacman &>/dev/null; then
|
|
|
|
|
|
# Arch Linux
|
|
|
|
|
|
sudo pacman -S --noconfirm zeal
|
|
|
|
|
|
elif command -v apt &>/dev/null; then
|
|
|
|
|
|
# Debian/Ubuntu
|
|
|
|
|
|
sudo apt update
|
|
|
|
|
|
sudo apt install -y zeal
|
|
|
|
|
|
elif command -v dnf &>/dev/null; then
|
|
|
|
|
|
# Fedora
|
|
|
|
|
|
sudo dnf install -y zeal
|
|
|
|
|
|
elif command -v zypper &>/dev/null; then
|
|
|
|
|
|
# openSUSE
|
|
|
|
|
|
sudo zypper install -y zeal
|
|
|
|
|
|
elif command -v flatpak &>/dev/null; then
|
|
|
|
|
|
# Flatpak fallback
|
|
|
|
|
|
flatpak install -y flathub org.zealdocs.Zeal
|
|
|
|
|
|
else
|
|
|
|
|
|
error "Could not detect package manager. Please install Zeal manually:"
|
|
|
|
|
|
echo " https://zealdocs.org/download.html"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
success "Zeal installed successfully"
|
2025-12-21 19:02:19 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Get Zeal docsets directory
|
|
|
|
|
|
get_docsets_dir() {
|
2026-02-20 01:17:53 +01:00
|
|
|
|
local docsets_dir
|
|
|
|
|
|
|
|
|
|
|
|
# Check if using Flatpak
|
|
|
|
|
|
if command -v flatpak &>/dev/null && flatpak list | grep -q "org.zealdocs.Zeal"; then
|
|
|
|
|
|
docsets_dir="$HOME/.var/app/org.zealdocs.Zeal/data/Zeal/Zeal/docsets"
|
|
|
|
|
|
else
|
|
|
|
|
|
# Standard installation
|
|
|
|
|
|
docsets_dir="$HOME/.local/share/Zeal/Zeal/docsets"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
mkdir -p "$docsets_dir"
|
|
|
|
|
|
echo "$docsets_dir"
|
2025-12-21 19:02:19 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Download a docset from Zeal feeds
|
|
|
|
|
|
download_docset() {
|
2026-02-20 01:17:53 +01:00
|
|
|
|
local name="$1"
|
|
|
|
|
|
local docsets_dir="$2"
|
|
|
|
|
|
|
|
|
|
|
|
# Check if already installed
|
|
|
|
|
|
if [ -d "$docsets_dir/${name}.docset" ]; then
|
|
|
|
|
|
warn "$name docset already installed"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
info "Downloading $name documentation..."
|
|
|
|
|
|
|
|
|
|
|
|
# Use Zeal's built-in feed system via CLI or direct download
|
|
|
|
|
|
# Zeal stores docsets in .docset directories
|
|
|
|
|
|
|
|
|
|
|
|
# Try to get from dash-user-contributions or official feeds
|
|
|
|
|
|
local download_url=""
|
|
|
|
|
|
|
|
|
|
|
|
case "$name" in
|
|
|
|
|
|
"C")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/C.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"C++")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/C%2B%2B.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"JavaScript")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/JavaScript.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"TypeScript")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/TypeScript.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"Python_3")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/Python_3.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"Python_2")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/Python_2.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"Bash")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/Bash.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"HTML")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/HTML.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"CSS")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/CSS.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"NodeJS")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/NodeJS.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
"React")
|
|
|
|
|
|
download_url="http://kapeli.com/feeds/React.tgz"
|
|
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
warn "Unknown docset: $name"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
|
|
# Download and extract
|
|
|
|
|
|
local temp_file
|
|
|
|
|
|
temp_file=$(mktemp)
|
|
|
|
|
|
|
|
|
|
|
|
echo " URL: $download_url"
|
|
|
|
|
|
if curl -fL --progress-bar "$download_url" -o "$temp_file"; then
|
|
|
|
|
|
echo " Extracting to $docsets_dir..."
|
|
|
|
|
|
tar -xzf "$temp_file" -C "$docsets_dir"
|
|
|
|
|
|
rm -f "$temp_file"
|
|
|
|
|
|
success "$name documentation downloaded"
|
|
|
|
|
|
else
|
|
|
|
|
|
rm -f "$temp_file"
|
|
|
|
|
|
warn "Failed to download $name - you can install it from Zeal's UI"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
2025-12-21 19:02:19 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Main installation
|
|
|
|
|
|
main() {
|
2026-02-20 01:17:53 +01:00
|
|
|
|
# Step 1: Install Zeal
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "=== Step 1: Installing Zeal ==="
|
|
|
|
|
|
install_zeal || exit 1
|
|
|
|
|
|
|
|
|
|
|
|
# Step 2: Get docsets directory
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "=== Step 2: Preparing docsets directory ==="
|
|
|
|
|
|
local docsets_dir
|
|
|
|
|
|
docsets_dir=$(get_docsets_dir)
|
|
|
|
|
|
success "Docsets directory: $docsets_dir"
|
|
|
|
|
|
|
|
|
|
|
|
# Step 3: Download requested docsets
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "=== Step 3: Downloading Documentation ==="
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
# Core requested languages
|
|
|
|
|
|
local docsets=("C" "C++" "JavaScript" "TypeScript" "Python_3")
|
|
|
|
|
|
|
|
|
|
|
|
# Optional extras (comment out if not needed)
|
|
|
|
|
|
local extras=("Bash" "HTML" "CSS" "NodeJS")
|
|
|
|
|
|
|
|
|
|
|
|
# Download core docsets
|
|
|
|
|
|
for docset in "${docsets[@]}"; do
|
|
|
|
|
|
download_docset "$docset" "$docsets_dir"
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
# Ask about extras
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
read -r -p "Install additional docsets (Bash, HTML, CSS, NodeJS)? [Y/n] " response
|
|
|
|
|
|
if [[ ! $response =~ ^[Nn]$ ]]; then
|
|
|
|
|
|
for docset in "${extras[@]}"; do
|
|
|
|
|
|
download_docset "$docset" "$docsets_dir"
|
|
|
|
|
|
done
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Summary
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "=============================================="
|
|
|
|
|
|
echo " Installation Complete!"
|
|
|
|
|
|
echo "=============================================="
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "Installed documentation:"
|
|
|
|
|
|
for f in "$docsets_dir"/*.docset; do
|
|
|
|
|
|
if [[ -d $f ]]; then
|
|
|
|
|
|
echo " ✓ $(basename "$f" .docset)"
|
|
|
|
|
|
fi
|
|
|
|
|
|
done
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "Usage:"
|
|
|
|
|
|
echo " Launch Zeal from your application menu, or run: zeal"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "To download additional docsets:"
|
|
|
|
|
|
echo " 1. Open Zeal"
|
|
|
|
|
|
echo " 2. Go to Tools → Docsets"
|
|
|
|
|
|
echo " 3. Click 'Available' tab and download what you need"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "Keyboard shortcut tip:"
|
|
|
|
|
|
echo " Set a global hotkey in Zeal → Preferences → Global Shortcuts"
|
|
|
|
|
|
echo " (e.g., Alt+Space for quick documentation lookup)"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "=============================================="
|
|
|
|
|
|
|
|
|
|
|
|
# Offer to launch Zeal
|
|
|
|
|
|
read -r -p "Launch Zeal now? [y/N] " response
|
|
|
|
|
|
if [[ $response =~ ^[Yy]$ ]]; then
|
|
|
|
|
|
nohup zeal &>/dev/null &
|
|
|
|
|
|
success "Zeal launched"
|
|
|
|
|
|
fi
|
2025-12-21 19:02:19 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
main "$@"
|