dev: automated commit - 2025-09-06 17:51:28
This commit is contained in:
parent
c84dfa059e
commit
b18f0b1edf
13 changed files with 560 additions and 116 deletions
251
local-bin/.local/bin/font-manager
Executable file
251
local-bin/.local/bin/font-manager
Executable file
|
|
@ -0,0 +1,251 @@
|
|||
#!/bin/bash
|
||||
# ~/.local/bin/font-manager
|
||||
# This script extracts font archives and rebuilds font cache
|
||||
# Enhanced version with better integration and error handling
|
||||
|
||||
FONT_DIR="$HOME/.local/share/fonts"
|
||||
ARCHIVE_DIR="$FONT_DIR/archives"
|
||||
ACTIVE_DIR="$FONT_DIR/active"
|
||||
BACKUP_DIR="$FONT_DIR/backups"
|
||||
LOG_FILE="$HOME/.local/share/font-manager.log"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Logging function
|
||||
log() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Error handling
|
||||
error_exit() {
|
||||
echo -e "${RED}Error: $1${NC}" >&2
|
||||
log "ERROR: $1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Success message
|
||||
success() {
|
||||
echo -e "${GREEN}$1${NC}"
|
||||
log "SUCCESS: $1"
|
||||
}
|
||||
|
||||
# Warning message
|
||||
warning() {
|
||||
echo -e "${YELLOW}Warning: $1${NC}"
|
||||
log "WARNING: $1"
|
||||
}
|
||||
|
||||
# Info message
|
||||
info() {
|
||||
echo -e "${BLUE}$1${NC}"
|
||||
log "INFO: $1"
|
||||
}
|
||||
|
||||
# Initialize directories
|
||||
init_directories() {
|
||||
mkdir -p "$ARCHIVE_DIR" "$ACTIVE_DIR" "$BACKUP_DIR"
|
||||
log "Initialized font directories"
|
||||
}
|
||||
|
||||
# Function to extract a specific font archive
|
||||
extract_font() {
|
||||
local archive="$1"
|
||||
if [ -z "$archive" ]; then
|
||||
error_exit "Archive name required"
|
||||
fi
|
||||
|
||||
if [ ! -f "$ARCHIVE_DIR/$archive.tar.gz" ]; then
|
||||
error_exit "Font archive $archive.tar.gz not found"
|
||||
fi
|
||||
|
||||
# Validate archive integrity
|
||||
if ! tar -tzf "$ARCHIVE_DIR/$archive.tar.gz" >/dev/null 2>&1; then
|
||||
error_exit "Archive $archive.tar.gz is corrupted"
|
||||
fi
|
||||
|
||||
info "Extracting $archive fonts..."
|
||||
tar -xzf "$ARCHIVE_DIR/$archive.tar.gz" -C "$ACTIVE_DIR" || error_exit "Failed to extract $archive"
|
||||
|
||||
# Rebuild font cache
|
||||
rebuild_cache
|
||||
success "$archive fonts are now active"
|
||||
}
|
||||
|
||||
# Function to list available font archives
|
||||
list_fonts() {
|
||||
if [ ! -d "$ARCHIVE_DIR" ] || [ -z "$(ls -A "$ARCHIVE_DIR" 2>/dev/null)" ]; then
|
||||
warning "No font archives found in $ARCHIVE_DIR"
|
||||
return 1
|
||||
fi
|
||||
|
||||
info "Available font archives:"
|
||||
ls -1 "$ARCHIVE_DIR" | sed 's/\.tar\.gz$//' | while read -r font; do
|
||||
echo " • $font"
|
||||
done
|
||||
}
|
||||
|
||||
# Function to rebuild font cache
|
||||
rebuild_cache() {
|
||||
info "Rebuilding font cache..."
|
||||
if fc-cache -f >/dev/null 2>&1; then
|
||||
success "Font cache rebuilt successfully"
|
||||
else
|
||||
error_exit "Failed to rebuild font cache"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to extract all fonts
|
||||
extract_all() {
|
||||
if [ ! -d "$ARCHIVE_DIR" ] || [ -z "$(ls -A "$ARCHIVE_DIR" 2>/dev/null)" ]; then
|
||||
warning "No font archives found to extract"
|
||||
return 1
|
||||
fi
|
||||
|
||||
info "Extracting all font archives..."
|
||||
local count=0
|
||||
for archive in "$ARCHIVE_DIR"/*.tar.gz; do
|
||||
if [ -f "$archive" ]; then
|
||||
local basename=$(basename "$archive" .tar.gz)
|
||||
extract_font "$basename"
|
||||
((count++))
|
||||
fi
|
||||
done
|
||||
success "Extracted $count font archives"
|
||||
}
|
||||
|
||||
# Function to clean active fonts directory
|
||||
clean_fonts() {
|
||||
if [ ! -d "$ACTIVE_DIR" ]; then
|
||||
warning "Active fonts directory does not exist"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create backup before cleaning
|
||||
local backup_name="backup_$(date +%Y%m%d_%H%M%S)"
|
||||
if [ -n "$(find "$ACTIVE_DIR" -type f -name "*.ttf" -o -name "*.otf" 2>/dev/null)" ]; then
|
||||
info "Creating backup: $backup_name"
|
||||
cp -r "$ACTIVE_DIR" "$BACKUP_DIR/$backup_name"
|
||||
fi
|
||||
|
||||
info "Cleaning active fonts directory..."
|
||||
find "$ACTIVE_DIR" -type f \( -name "*.ttf" -o -name "*.otf" \) -delete
|
||||
rebuild_cache
|
||||
success "Active fonts directory cleaned"
|
||||
}
|
||||
|
||||
# Function to restore from backup
|
||||
restore_fonts() {
|
||||
local backup="$1"
|
||||
if [ -z "$backup" ]; then
|
||||
error_exit "Backup name required"
|
||||
fi
|
||||
|
||||
if [ ! -d "$BACKUP_DIR/$backup" ]; then
|
||||
error_exit "Backup $backup not found"
|
||||
fi
|
||||
|
||||
info "Restoring fonts from backup: $backup"
|
||||
cp -r "$BACKUP_DIR/$backup"/* "$ACTIVE_DIR/"
|
||||
rebuild_cache
|
||||
success "Fonts restored from backup: $backup"
|
||||
}
|
||||
|
||||
# Function to list backups
|
||||
list_backups() {
|
||||
if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then
|
||||
warning "No backups found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
info "Available backups:"
|
||||
ls -1 "$BACKUP_DIR" | while read -r backup; do
|
||||
echo " • $backup"
|
||||
done
|
||||
}
|
||||
|
||||
# Function to install font from URL
|
||||
install_from_url() {
|
||||
local url="$1"
|
||||
local name="$2"
|
||||
|
||||
if [ -z "$url" ]; then
|
||||
error_exit "URL required"
|
||||
fi
|
||||
|
||||
if [ -z "$name" ]; then
|
||||
name=$(basename "$url" | sed 's/\.[^.]*$//')
|
||||
fi
|
||||
|
||||
info "Downloading font from: $url"
|
||||
if wget -q "$url" -O "$ARCHIVE_DIR/$name.tar.gz"; then
|
||||
success "Downloaded $name"
|
||||
extract_font "$name"
|
||||
else
|
||||
error_exit "Failed to download font from $url"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main script logic
|
||||
init_directories
|
||||
|
||||
case "$1" in
|
||||
"extract")
|
||||
extract_font "$2"
|
||||
;;
|
||||
"list")
|
||||
list_fonts
|
||||
;;
|
||||
"rebuild")
|
||||
rebuild_cache
|
||||
;;
|
||||
"all")
|
||||
extract_all
|
||||
;;
|
||||
"clean")
|
||||
clean_fonts
|
||||
;;
|
||||
"backup")
|
||||
list_backups
|
||||
;;
|
||||
"restore")
|
||||
restore_fonts "$2"
|
||||
;;
|
||||
"install")
|
||||
install_from_url "$2" "$3"
|
||||
;;
|
||||
"status")
|
||||
info "Font Manager Status:"
|
||||
echo " Archives: $ARCHIVE_DIR"
|
||||
echo " Active: $ACTIVE_DIR"
|
||||
echo " Backups: $BACKUP_DIR"
|
||||
echo " Log: $LOG_FILE"
|
||||
echo ""
|
||||
list_fonts
|
||||
echo ""
|
||||
list_backups
|
||||
;;
|
||||
*)
|
||||
echo "Usage: font-manager [command] [options]"
|
||||
echo ""
|
||||
echo "Commands:"
|
||||
echo " extract [name] Extract specific font archive"
|
||||
echo " list List available font archives"
|
||||
echo " rebuild Rebuild font cache"
|
||||
echo " all Extract all font archives"
|
||||
echo " clean Remove all active fonts (with backup)"
|
||||
echo " backup List available backups"
|
||||
echo " restore [name] Restore fonts from backup"
|
||||
echo " install [url] [name] Install font from URL"
|
||||
echo " status Show current status"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " font-manager extract jetbrains-mono"
|
||||
echo " font-manager install https://github.com/JetBrains/JetBrainsMono/releases/download/v2.304/JetBrainsMono-2.304.zip"
|
||||
echo " font-manager status"
|
||||
;;
|
||||
esac
|
||||
84
local-bin/README.md
Normal file
84
local-bin/README.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# Local Bin Scripts
|
||||
|
||||
This directory contains custom scripts that are installed to `~/.local/bin/` via Stow.
|
||||
|
||||
## Font Manager
|
||||
|
||||
Enhanced font management script with advanced features:
|
||||
|
||||
### Features
|
||||
- **Archive Management**: Extract, list, and manage font archives
|
||||
- **Backup System**: Automatic backups before cleaning
|
||||
- **URL Installation**: Install fonts directly from URLs
|
||||
- **Status Monitoring**: View current font status and logs
|
||||
- **Error Handling**: Comprehensive error checking and logging
|
||||
- **Color Output**: Colored terminal output for better UX
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
# Basic commands
|
||||
font-manager list # List available fonts
|
||||
font-manager extract <name> # Extract specific font
|
||||
font-manager all # Extract all fonts
|
||||
font-manager clean # Clean active fonts (with backup)
|
||||
font-manager status # Show current status
|
||||
|
||||
# Advanced commands
|
||||
font-manager backup # List backups
|
||||
font-manager restore <name> # Restore from backup
|
||||
font-manager install <url> # Install from URL
|
||||
```
|
||||
|
||||
### Zsh Integration
|
||||
|
||||
The following aliases and functions are available:
|
||||
|
||||
```bash
|
||||
# Aliases
|
||||
fm # font-manager
|
||||
fml # font-manager list
|
||||
fms # font-manager status
|
||||
fmc # font-manager clean
|
||||
fma # font-manager all
|
||||
|
||||
# Functions
|
||||
font-switch <name> # Quick font switching
|
||||
font-preview <name> # Font preview
|
||||
```
|
||||
|
||||
### Directory Structure
|
||||
|
||||
```
|
||||
~/.local/share/fonts/
|
||||
├── archives/ # Font archives (.tar.gz)
|
||||
├── active/ # Extracted fonts
|
||||
├── backups/ # Automatic backups
|
||||
└── font-manager.log # Operation log
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
```bash
|
||||
# Switch to JetBrains Mono
|
||||
font-switch jetbrains-mono
|
||||
|
||||
# Install font from GitHub
|
||||
font-manager install https://github.com/JetBrains/JetBrainsMono/releases/download/v2.304/JetBrainsMono-2.304.zip
|
||||
|
||||
# Preview a font
|
||||
font-preview fira-code
|
||||
|
||||
# Check status
|
||||
fms
|
||||
```
|
||||
|
||||
### Installation
|
||||
|
||||
The script is automatically installed via Stow:
|
||||
|
||||
```bash
|
||||
stow local-bin
|
||||
```
|
||||
|
||||
This creates the necessary directory structure and installs the script to `~/.local/bin/font-manager`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue