#!/bin/bash # ============================================================================== # LAUNCHER.SH - Обработка файлов для Node.js (Linux) # Использует: Node.js + strip-comments для безопасной очистки # Поддерживает: .js, .css, .ejs # ============================================================================== # --- Пути --- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DEV_DIR="$SCRIPT_DIR/!DEV" INPUT_DIR="$DEV_DIR/input" OUTPUT_DIR="$DEV_DIR/output" COMBINED_FILE="$OUTPUT_DIR/Combined_All_Files.txt" CLEANER_SCRIPT="$SCRIPT_DIR/cleaner.js" # --- Настройки --- REMOVE_COMMENTS=true SUPPORTED_EXTS=("js" "css" "ejs") # --- Цвета --- C_CYAN='\033[0;36m'; C_YELLOW='\033[0;33m'; C_GREEN='\033[0;32m' C_RED='\033[0;31m'; C_WHITE='\033[0;37m'; C_GRAY='\033[0;90m' C_MAGENTA='\033[0;35m'; C_RESET='\033[0m' # --- Проверка зависимостей --- check_deps() { if ! command -v node &>/dev/null; then echo -e "${C_RED}[ERR] Node.js не установлен!${C_RESET}"; return 1 fi if [[ ! -f "$CLEANER_SCRIPT" ]]; then echo -e "${C_RED}[ERR] Не найден: cleaner.js${C_RESET}"; return 1 fi return 0 } # --- Создание папок --- setup_folders() { if [[ ! -d "$DEV_DIR" ]]; then mkdir -p "$INPUT_DIR" "$OUTPUT_DIR" echo -e "${C_GREEN}[OK] Папка !DEV создана${C_RESET}" else [[ ! -d "$INPUT_DIR" ]] && mkdir -p "$INPUT_DIR" [[ ! -d "$OUTPUT_DIR" ]] && mkdir -p "$OUTPUT_DIR" fi } # --- Очистка комментариев --- clean_all_comments() { echo -e "${C_CYAN}=== ОЧИСТКА КОММЕНТАРИЕВ (.js/.css/.ejs) ===${C_RESET}" echo -e "${C_GRAY}Режим: $([ "$REMOVE_COMMENTS" = true ] && echo "ВКЛ" || echo "ВЫКЛ")${C_RESET}" [[ "$REMOVE_COMMENTS" = false ]] && { echo -e "${C_YELLOW}Очистка отключена${C_RESET}\n"; return 0; } check_deps || return 1 [[ ! -d "$INPUT_DIR" ]] && { echo -e "${C_RED}[ERR] Папка не найдена${C_RESET}"; return 1; } node "$CLEANER_SCRIPT" dir "$INPUT_DIR" echo -e "${C_GREEN}✅ Очистка завершена${C_RESET}\n" } # --- Конвертация в .txt --- convert_to_txt() { echo -e "${C_CYAN}=== КОНВЕРТАЦИЯ В .TXT ===${C_RESET}\n" [[ ! -d "$INPUT_DIR" ]] && { echo -e "${C_RED}[ERR] Папка не найдена${C_RESET}"; return 1; } local count=0 while IFS= read -r -d '' file; do ext="${file##*.}" if [[ " ${SUPPORTED_EXTS[*]} " =~ " $ext " ]] && [[ "$ext" != "txt" ]]; then newname="${file%.*}.txt" mv "$file" "$newname" && { echo -e "${C_GREEN}[OK] $(basename "$file")${C_RESET}"; ((count++)); } fi done < <(find "$INPUT_DIR" -type f -print0 2>/dev/null) echo -e "${C_WHITE}Конвертировано: $count${C_RESET}\n" } # --- Объединение файлов --- combine_files() { echo -e "${C_CYAN}=== ОБЪЕДИНЕНИЕ ФАЙЛОВ ===${C_RESET}\n" [[ ! -d "$INPUT_DIR" ]] && { echo -e "${C_RED}[ERR] Папка не найдена${C_RESET}"; return 1; } mapfile -t txt_files < <(find "$INPUT_DIR" -type f -name "*.txt" 2>/dev/null | sort) local file_count=${#txt_files[@]} [[ $file_count -eq 0 ]] && { echo -e "${C_RED}[ERR] Нет .txt файлов${C_RESET}"; return 1; } echo -e "${C_WHITE}Найдено: $file_count${C_RESET}\n" mkdir -p "$OUTPUT_DIR" { echo "ОБЪЕДИНЁННЫЙ ФАЙЛ (Node.js)" echo "Создан: $(date '+%Y-%m-%d %H:%M:%S')" echo "Источник: $INPUT_DIR" echo "Файлов: $file_count" echo "Комментарии: $([ "$REMOVE_COMMENTS" = true ] && echo "УДАЛЕНЫ" || echo "ОСТАВЛЕНЫ")" echo "" } > "$COMBINED_FILE" for file in "${txt_files[@]}"; do echo "================================================================================" >> "$COMBINED_FILE" echo "ФАЙЛ: $file" >> "$COMBINED_FILE" echo "================================================================================" >> "$COMBINED_FILE" grep -v '^[[:space:]]*$' "$file" >> "$COMBINED_FILE" 2>/dev/null echo -e "\n" >> "$COMBINED_FILE" echo -e "${C_GREEN}[OK] $(basename "$file")${C_RESET}" done if [[ -f "$COMBINED_FILE" ]]; then local size=$(du -h "$COMBINED_FILE" | cut -f1) echo -e "\n${C_GREEN}[OK] Создан: $COMBINED_FILE ($size)${C_RESET}" fi echo "" } # --- Меню и утилиты --- toggle_comments() { echo -e "${C_CYAN}=== НАСТРОЙКА ===${C_RESET}\n" REMOVE_COMMENTS=$([ "$REMOVE_COMMENTS" = true ] && echo false || echo true) echo -e "${C_YELLOW}Очистка: $([ "$REMOVE_COMMENTS" = true ] && echo "ВКЛ" || echo "ВЫКЛ")${C_RESET}\n" } clean_all() { echo -e "${C_RED}=== СБРОС ПРОЕКТА ===${C_RESET}\n" [[ -d "$DEV_DIR" ]] && { rm -rf "$DEV_DIR"; echo -e "${C_GREEN}[OK] !DEV удалена${C_RESET}"; } setup_folders; echo -e "${C_GREEN}[OK] Структура восстановлена${C_RESET}\n" } open_folder() { if [[ -d "$DEV_DIR" ]]; then (xdg-open "$DEV_DIR" 2>/dev/null || open "$DEV_DIR" 2>/dev/null || echo "Откройте: $DEV_DIR") & echo -e "${C_GREEN}[OK] Открыта !DEV${C_RESET}" else echo -e "${C_RED}[ERR] !DEV не найдена${C_RESET}" fi echo "" } show_structure() { echo -e "${C_CYAN}=== СТРУКТУРА ===${C_RESET}\n" echo -e "${C_WHITE}Корень: $SCRIPT_DIR${C_RESET}" if [[ -d "$DEV_DIR" ]]; then echo -e "${C_YELLOW}!DEV/${C_RESET}" echo -e " ${C_GREEN}input/ ($(find "$INPUT_DIR" -type f 2>/dev/null | wc -l) файлов)${C_RESET}" echo -e " ${C_GREEN}output/ ($(find "$OUTPUT_DIR" -type f 2>/dev/null | wc -l) файлов)${C_RESET}" fi echo -e "${C_CYAN}Поддержка: ${SUPPORTED_EXTS[*]}${C_RESET}" echo -e "${C_WHITE}Очистка: $([ "$REMOVE_COMMENTS" = true ] && echo -e "${C_GREEN}ВКЛ" || echo -e "${C_RED}ВЫКЛ")${C_RESET}\n" } show_header() { clear echo -e "${C_CYAN}==================================================${C_RESET}" echo -e "${C_CYAN} ОБРАБОТКА ФАЙЛОВ (Node.js + Bash)${C_RESET}" echo -e "${C_CYAN}==================================================${C_RESET}" echo -e "${C_GRAY}Скрипт: $SCRIPT_DIR/launcher.sh${C_RESET}\n" } show_menu() { echo -e "${C_YELLOW}Действия:${C_RESET}" echo -e "1. ${C_MAGENTA}[ОЧИСТКА] Удалить комментарии (.js/.css/.ejs)${C_RESET}" echo -e "2. ${C_CYAN}[КОНВЕРТ] Конвертировать в .txt${C_RESET}" echo -e "3. ${C_CYAN}[ОБЪЕДИН] Объединить .txt в один файл${C_RESET}" echo -e "4. ${C_GREEN}[ВСЁ] Очистка → Конвертация → Объединение${C_RESET}" echo -e "5. ${C_WHITE}[НАСТР] Переключить очистку$([ "$REMOVE_COMMENTS" = true ] && echo " [ВКЛ]" || echo " [ВЫКЛ]")${C_RESET}" echo -e "6. ${C_MAGENTA}[ПАПКА] Открыть !DEV${C_RESET}" echo -e "7. ${C_WHITE}[ИНФО] Показать структуру${C_RESET}" echo -e "8. ${C_RED}[СБРОС] Полная очистка${C_RESET}" echo -e "0. ${C_RED}[ВЫХОД] Завершить${C_RESET}\n" } wait_for_user() { echo ""; read -p "Нажмите Enter для возврата..." < /dev/tty; } # ============================================================================== # === ЗАПУСК === # ============================================================================== setup_folders while true; do show_header; show_menu read -p "Выберите (0-8): " choice echo "" case $choice in 1) clean_all_comments; wait_for_user ;; 2) convert_to_txt; wait_for_user ;; 3) combine_files; wait_for_user ;; 4) clean_all_comments; convert_to_txt; combine_files; wait_for_user ;; 5) toggle_comments; wait_for_user ;; 6) open_folder; wait_for_user ;; 7) show_structure; wait_for_user ;; 8) clean_all; wait_for_user ;; 0) echo -e "${C_YELLOW}Выход...${C_RESET}"; exit 0 ;; *) echo -e "${C_RED}Неверный выбор!${C_RESET}"; sleep 2 ;; esac done