| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- #!/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
|