font-manager 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #!/usr/bin/env bash
  2. # ~/.local/bin/font-manager
  3. # This script extracts font archives and rebuilds font cache
  4. # Enhanced version with better integration and error handling
  5. FONT_DIR="$HOME/.local/share/fonts"
  6. ARCHIVE_DIR="$FONT_DIR/archives"
  7. ACTIVE_DIR="$FONT_DIR/active"
  8. BACKUP_DIR="$FONT_DIR/backups"
  9. LOG_FILE="$HOME/.local/share/font-manager.log"
  10. # Colors for output
  11. RED='\033[0;31m'
  12. GREEN='\033[0;32m'
  13. YELLOW='\033[1;33m'
  14. BLUE='\033[0;34m'
  15. NC='\033[0m' # No Color
  16. # Logging function
  17. log() {
  18. echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
  19. }
  20. # Error handling
  21. error_exit() {
  22. echo -e "${RED}Error: $1${NC}" >&2
  23. log "ERROR: $1"
  24. exit 1
  25. }
  26. # Success message
  27. success() {
  28. echo -e "${GREEN}$1${NC}"
  29. log "SUCCESS: $1"
  30. }
  31. # Warning message
  32. warning() {
  33. echo -e "${YELLOW}Warning: $1${NC}"
  34. log "WARNING: $1"
  35. }
  36. # Info message
  37. info() {
  38. echo -e "${BLUE}$1${NC}"
  39. log "INFO: $1"
  40. }
  41. # Initialize directories
  42. init_directories() {
  43. mkdir -p "$ARCHIVE_DIR" "$ACTIVE_DIR" "$BACKUP_DIR"
  44. log "Initialized font directories"
  45. }
  46. # Function to extract a specific font archive
  47. extract_font() {
  48. local archive="$1"
  49. if [ -z "$archive" ]; then
  50. error_exit "Archive name required"
  51. fi
  52. if [ ! -f "$ARCHIVE_DIR/$archive.tar.gz" ]; then
  53. error_exit "Font archive $archive.tar.gz not found"
  54. fi
  55. # Validate archive integrity
  56. if ! tar -tzf "$ARCHIVE_DIR/$archive.tar.gz" >/dev/null 2>&1; then
  57. error_exit "Archive $archive.tar.gz is corrupted"
  58. fi
  59. info "Extracting $archive fonts..."
  60. tar -xzf "$ARCHIVE_DIR/$archive.tar.gz" -C "$ACTIVE_DIR" || error_exit "Failed to extract $archive"
  61. # Rebuild font cache
  62. rebuild_cache
  63. success "$archive fonts are now active"
  64. }
  65. # Function to list available font archives
  66. list_fonts() {
  67. if [ ! -d "$ARCHIVE_DIR" ] || [ -z "$(ls -A "$ARCHIVE_DIR" 2>/dev/null)" ]; then
  68. warning "No font archives found in $ARCHIVE_DIR"
  69. return 1
  70. fi
  71. info "Available font archives:"
  72. ls -1 "$ARCHIVE_DIR" | sed 's/\.tar\.gz$//' | while read -r font; do
  73. echo " • $font"
  74. done
  75. }
  76. # Function to rebuild font cache
  77. rebuild_cache() {
  78. info "Rebuilding font cache..."
  79. if fc-cache -f >/dev/null 2>&1; then
  80. success "Font cache rebuilt successfully"
  81. else
  82. error_exit "Failed to rebuild font cache"
  83. fi
  84. }
  85. # Function to extract all fonts
  86. extract_all() {
  87. if [ ! -d "$ARCHIVE_DIR" ] || [ -z "$(ls -A "$ARCHIVE_DIR" 2>/dev/null)" ]; then
  88. warning "No font archives found to extract"
  89. return 1
  90. fi
  91. info "Extracting all font archives..."
  92. local count=0
  93. for archive in "$ARCHIVE_DIR"/*.tar.gz; do
  94. if [ -f "$archive" ]; then
  95. local basename=$(basename "$archive" .tar.gz)
  96. extract_font "$basename"
  97. ((count++))
  98. fi
  99. done
  100. success "Extracted $count font archives"
  101. }
  102. # Function to clean active fonts directory
  103. clean_fonts() {
  104. if [ ! -d "$ACTIVE_DIR" ]; then
  105. warning "Active fonts directory does not exist"
  106. return 1
  107. fi
  108. # Create backup before cleaning
  109. local backup_name="backup_$(date +%Y%m%d_%H%M%S)"
  110. if [ -n "$(find "$ACTIVE_DIR" -type f -name "*.ttf" -o -name "*.otf" 2>/dev/null)" ]; then
  111. info "Creating backup: $backup_name"
  112. cp -r "$ACTIVE_DIR" "$BACKUP_DIR/$backup_name"
  113. fi
  114. info "Cleaning active fonts directory..."
  115. find "$ACTIVE_DIR" -type f \( -name "*.ttf" -o -name "*.otf" \) -delete
  116. rebuild_cache
  117. success "Active fonts directory cleaned"
  118. }
  119. # Function to restore from backup
  120. restore_fonts() {
  121. local backup="$1"
  122. if [ -z "$backup" ]; then
  123. error_exit "Backup name required"
  124. fi
  125. if [ ! -d "$BACKUP_DIR/$backup" ]; then
  126. error_exit "Backup $backup not found"
  127. fi
  128. info "Restoring fonts from backup: $backup"
  129. cp -r "$BACKUP_DIR/$backup"/* "$ACTIVE_DIR/"
  130. rebuild_cache
  131. success "Fonts restored from backup: $backup"
  132. }
  133. # Function to list backups
  134. list_backups() {
  135. if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then
  136. warning "No backups found"
  137. return 1
  138. fi
  139. info "Available backups:"
  140. ls -1 "$BACKUP_DIR" | while read -r backup; do
  141. echo " • $backup"
  142. done
  143. }
  144. # Function to install font from URL
  145. install_from_url() {
  146. local url="$1"
  147. local name="$2"
  148. if [ -z "$url" ]; then
  149. error_exit "URL required"
  150. fi
  151. if [ -z "$name" ]; then
  152. name=$(basename "$url" | sed 's/\.[^.]*$//')
  153. fi
  154. info "Downloading font from: $url"
  155. if wget -q "$url" -O "$ARCHIVE_DIR/$name.tar.gz"; then
  156. success "Downloaded $name"
  157. extract_font "$name"
  158. else
  159. error_exit "Failed to download font from $url"
  160. fi
  161. }
  162. # Main script logic
  163. init_directories
  164. case "$1" in
  165. "extract")
  166. extract_font "$2"
  167. ;;
  168. "list")
  169. list_fonts
  170. ;;
  171. "rebuild")
  172. rebuild_cache
  173. ;;
  174. "all")
  175. extract_all
  176. ;;
  177. "clean")
  178. clean_fonts
  179. ;;
  180. "backup")
  181. list_backups
  182. ;;
  183. "restore")
  184. restore_fonts "$2"
  185. ;;
  186. "install")
  187. install_from_url "$2" "$3"
  188. ;;
  189. "status")
  190. info "Font Manager Status:"
  191. echo " Archives: $ARCHIVE_DIR"
  192. echo " Active: $ACTIVE_DIR"
  193. echo " Backups: $BACKUP_DIR"
  194. echo " Log: $LOG_FILE"
  195. echo ""
  196. list_fonts
  197. echo ""
  198. list_backups
  199. ;;
  200. *)
  201. echo "Usage: font-manager [command] [options]"
  202. echo ""
  203. echo "Commands:"
  204. echo " extract [name] Extract specific font archive"
  205. echo " list List available font archives"
  206. echo " rebuild Rebuild font cache"
  207. echo " all Extract all font archives"
  208. echo " clean Remove all active fonts (with backup)"
  209. echo " backup List available backups"
  210. echo " restore [name] Restore fonts from backup"
  211. echo " install [url] [name] Install font from URL"
  212. echo " status Show current status"
  213. echo ""
  214. echo "Examples:"
  215. echo " font-manager extract jetbrains-mono"
  216. echo " font-manager install https://github.com/JetBrains/JetBrainsMono/releases/download/v2.304/JetBrainsMono-2.304.zip"
  217. echo " font-manager status"
  218. ;;
  219. esac