#!/bin/bash #Script : zettlr_install.sh #Apps : MRDEVS TOOLS #Description : Instala Zettlr Markdown Editor con soporte multiplataforma #Author : Cortana Rosero One #Generated : Created by Claude Code (claude-3-7-sonnet-20250219) #Created : 2025/04/04 12:00:00 #Modified : 2025/04/04 12:00:00 #Version : 1.3.1 #Use Notes : Ejecutar sin parámetros para instalación interactiva # -u para desinstalar #============================================================================== # Derechos de Autor 2025 Mauro Rosero P. #============================================================================== # Este programa es software libre: usted puede redistribuirlo y/o modificarlo # bajo los términos de la Licencia Pública Affero General de GNU tal como # lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, # o (a su elección) cualquier versión posterior. # # Este programa se distribuye con la esperanza de que sea útil, # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de # COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la # Licencia Pública Affero General de GNU para obtener más detalles. # # Debería haber recibido una copia de la Licencia Pública Affero General # junto con este programa. Si no la recibió, consulte . # Configuración inicial SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BIN_BASE="bin" BIN_LIBS="lib" BIN_MESG="msg" BIN_LANG="head.es" BIN_CFGS="config" # Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto if [ -f "$SCRIPT_DIR/$BIN_CFGS/devspath.dat" ]; then DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat") else DEVSPATH="devs" fi # Cargar bibliotecas comunes if [ -f "$SCRIPT_DIR/$BIN_LIBS/base.lib" ]; then source "$SCRIPT_DIR/$BIN_LIBS/base.lib" else echo "Error: No se encontró la biblioteca base.lib" exit 1 fi # Cargar mensajes en español if [ -f "$SCRIPT_DIR/$BIN_MESG/$BIN_LANG" ]; then source "$SCRIPT_DIR/$BIN_MESG/$BIN_LANG" else echo "Error: No se encontraron los archivos de mensajes" exit 1 fi # Verificar si se está solicitando la desinstalación UNINSTALL=0 if [ "$1" = "-u" ]; then UNINSTALL=1 fi # Definir la versión y URLs ZETTLR_VERSION="3.0.3" GITHUB_API_URL="https://api.github.com/repos/Zettlr/Zettlr/releases/latest" # Función para obtener la última versión de Zettlr desde GitHub get_latest_version() { if command -v curl &>/dev/null; then ZETTLR_LATEST_VERSION=$(curl -s $GITHUB_API_URL | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | cut -c 2-) if [ -n "$ZETTLR_LATEST_VERSION" ]; then ZETTLR_VERSION=$ZETTLR_LATEST_VERSION fi fi echo "Versión a instalar: $ZETTLR_VERSION" } # Función para detectar el sistema operativo detect_os() { if [ -f /etc/os-release ]; then . /etc/os-release OS=$NAME VER=$VERSION_ID elif [ -f /etc/lsb-release ]; then . /etc/lsb-release OS=$DISTRIB_ID VER=$DISTRIB_RELEASE elif [ -f /etc/debian_version ]; then OS="Debian" VER=$(cat /etc/debian_version) elif [ -f /etc/redhat-release ]; then OS=$(cat /etc/redhat-release | cut -d ' ' -f 1) VER=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+') elif [ "$(uname)" == "Darwin" ]; then OS="macOS" VER=$(sw_vers -productVersion) elif [ "$(uname)" == "FreeBSD" ]; then OS="FreeBSD" VER=$(uname -r) else OS="Unknown" VER="Unknown" fi echo "$OS" } # Función para obtener la arquitectura del sistema get_arch() { ARCH=$(uname -m) # Normalizar la arquitectura if [ "$ARCH" = "x86_64" ]; then ARCH="amd64" elif [[ "$ARCH" == "arm"* ]] || [ "$ARCH" = "aarch64" ]; then ARCH="arm64" else ARCH="i386" fi echo $ARCH } # Función para instalar Zettlr en sistemas basados en Debian/Ubuntu install_zettlr_debian() { local arch=$(get_arch) echo -e "\n${head_info}: Instalando dependencias necesarias..." sudo apt update sudo apt install -y wget echo -e "\n${head_info}: Descargando Zettlr versión $ZETTLR_VERSION para $arch..." if [ "$arch" = "amd64" ]; then wget -O /tmp/zettlr.deb "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}-amd64.deb" elif [ "$arch" = "arm64" ]; then wget -O /tmp/zettlr.deb "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}-arm64.deb" else echo -e "\n${head_error}: Arquitectura $arch no soportada para Zettlr." return 1 fi echo -e "\n${head_info}: Instalando Zettlr..." sudo apt install -y /tmp/zettlr.deb rm -f /tmp/zettlr.deb # Verificar la instalación if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ] || [ -f /opt/Zettlr/zettlr ]; then echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." return 0 else echo -e "\n${head_error}: No se pudo instalar Zettlr." return 1 fi } # Función para desinstalar Zettlr en sistemas basados en Debian/Ubuntu uninstall_zettlr_debian() { echo -e "\n${head_info}: Desinstalando Zettlr..." sudo apt remove --purge -y zettlr sudo apt autoremove -y # Eliminar archivos de configuración residuales echo -e "\n${head_info}: Limpiando archivos de configuración..." rm -rf ~/.config/Zettlr echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." return 0 } # Función para instalar Zettlr en sistemas basados en Red Hat install_zettlr_redhat() { local arch=$(get_arch) echo -e "\n${head_info}: Instalando dependencias necesarias..." sudo dnf check-update sudo dnf install -y wget echo -e "\n${head_info}: Descargando Zettlr versión $ZETTLR_VERSION para $arch..." if [ "$arch" = "amd64" ]; then wget -O /tmp/zettlr.rpm "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}.x86_64.rpm" elif [ "$arch" = "arm64" ]; then wget -O /tmp/zettlr.rpm "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}.arm64.rpm" else echo -e "\n${head_error}: Arquitectura $arch no soportada para Zettlr." return 1 fi echo -e "\n${head_info}: Instalando Zettlr..." sudo dnf install -y /tmp/zettlr.rpm rm -f /tmp/zettlr.rpm # Verificar la instalación if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ] || [ -f /opt/Zettlr/zettlr ]; then echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." return 0 else echo -e "\n${head_error}: No se pudo instalar Zettlr." return 1 fi } # Función para desinstalar Zettlr en sistemas basados en Red Hat uninstall_zettlr_redhat() { echo -e "\n${head_info}: Desinstalando Zettlr..." sudo dnf remove -y zettlr # Eliminar archivos de configuración residuales echo -e "\n${head_info}: Limpiando archivos de configuración..." rm -rf ~/.config/Zettlr echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." return 0 } # Función para instalar Zettlr en Arch Linux install_zettlr_arch() { echo -e "\n${head_info}: Actualizando repositorios..." sudo pacman -Sy echo -e "\n${head_info}: Instalando dependencias necesarias..." sudo pacman -S --needed --noconfirm base-devel git # Verificar si yay está instalado if ! command -v yay &>/dev/null; then echo -e "\n${head_info}: Instalando yay (AUR helper)..." TMP_DIR=$(mktemp -d) cd "$TMP_DIR" git clone https://aur.archlinux.org/yay.git cd yay makepkg -si --noconfirm cd rm -rf "$TMP_DIR" fi echo -e "\n${head_info}: Instalando Zettlr desde AUR..." yay -S --noconfirm zettlr-bin # Verificar la instalación if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ]; then echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." return 0 else echo -e "\n${head_error}: No se pudo instalar Zettlr." return 1 fi } # Función para desinstalar Zettlr en Arch Linux uninstall_zettlr_arch() { echo -e "\n${head_info}: Desinstalando Zettlr..." if pacman -Qi zettlr-bin &>/dev/null; then sudo pacman -R --noconfirm zettlr-bin elif pacman -Qi zettlr &>/dev/null; then sudo pacman -R --noconfirm zettlr fi # Eliminar archivos de configuración residuales echo -e "\n${head_info}: Limpiando archivos de configuración..." rm -rf ~/.config/Zettlr echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." return 0 } # Función para instalar Zettlr en macOS install_zettlr_macos() { echo -e "\n${head_info}: Verificando si Homebrew está instalado..." if ! command -v brew &>/dev/null; then echo -e "\n${head_info}: Instalando Homebrew..." /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" fi echo -e "\n${head_info}: Instalando Zettlr mediante Homebrew..." brew install --cask zettlr # Verificar la instalación if [ -d "/Applications/Zettlr.app" ]; then echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." return 0 else echo -e "\n${head_error}: No se pudo instalar Zettlr." return 1 fi } # Función para desinstalar Zettlr en macOS uninstall_zettlr_macos() { echo -e "\n${head_info}: Desinstalando Zettlr..." if command -v brew &>/dev/null; then brew uninstall --cask zettlr fi # Eliminar la aplicación manualmente si brew no funcionó if [ -d "/Applications/Zettlr.app" ]; then rm -rf "/Applications/Zettlr.app" fi # Eliminar archivos de configuración rm -rf ~/Library/Application\ Support/Zettlr echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." return 0 } # Función para instalar Zettlr en FreeBSD install_zettlr_freebsd() { echo -e "\n${head_info}: FreeBSD no tiene soporte oficial para Zettlr." echo -e "${head_info}: Se puede intentar utilizar la versión AppImage o la instalación manual." local arch=$(get_arch) if [ "$arch" = "amd64" ]; then echo -e "\n${head_info}: Descargando AppImage de Zettlr..." fetch -o /tmp/Zettlr.AppImage "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}-x86_64.AppImage" chmod +x /tmp/Zettlr.AppImage mkdir -p "$HOME/Applications" mv /tmp/Zettlr.AppImage "$HOME/Applications/" echo -e "\n${head_info}: Creando enlace simbólico..." mkdir -p "$HOME/bin" ln -sf "$HOME/Applications/Zettlr.AppImage" "$HOME/bin/zettlr" echo -e "\n${head_success}: Zettlr ha sido instalado en $HOME/Applications/Zettlr.AppImage" echo -e "${head_info}: Para ejecutar Zettlr, use: $HOME/bin/zettlr" return 0 else echo -e "\n${head_error}: Arquitectura $arch no soportada para Zettlr en FreeBSD." return 1 fi } # Función para desinstalar Zettlr en FreeBSD uninstall_zettlr_freebsd() { echo -e "\n${head_info}: Desinstalando Zettlr..." # Eliminar AppImage if [ -f "$HOME/Applications/Zettlr.AppImage" ]; then rm -f "$HOME/Applications/Zettlr.AppImage" fi # Eliminar enlace simbólico if [ -L "$HOME/bin/zettlr" ]; then rm -f "$HOME/bin/zettlr" fi # Eliminar archivos de configuración rm -rf "$HOME/.config/Zettlr" echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." return 0 } # Función principal para instalar Zettlr install_zettlr() { local os=$(detect_os) local result=0 # Obtener la última versión disponible get_latest_version echo -e "\n${head_info}: Sistema operativo detectado: ${os}" # Instalar según el sistema operativo case "$os" in *"Ubuntu"*|*"Debian"*|*"Linux Mint"*|*"Pop!_OS"*|*"elementary OS"*) install_zettlr_debian result=$? ;; *"Fedora"*|*"Red Hat"*|*"CentOS"*|*"Rocky"*|*"AlmaLinux"*|*"Oracle Linux"*) install_zettlr_redhat result=$? ;; *"Arch"*|*"Manjaro"*|*"EndeavourOS"*|*"Garuda"*) install_zettlr_arch result=$? ;; *"macOS"*) install_zettlr_macos result=$? ;; *"FreeBSD"*) install_zettlr_freebsd result=$? ;; *) echo -e "\n${head_error}: ${os_nofound}" return 1 ;; esac # Si la instalación fue exitosa, mostrar información adicional if [ $result -eq 0 ]; then echo -e "\n${head_info}: Información de Zettlr:" echo -e " - Zettlr es un editor Markdown moderno con enfoque académico" echo -e " - Incluye características como editor Markdown WYSIWYG, soporte para Zettelkasten" echo -e " - Integración con Pandoc y LaTeX para exportación de documentos" echo -e " - Soporta Markdown, Citas, Referencias y más" echo -e " - Sitio web oficial: https://www.zettlr.com/" fi return $result } # Función principal para desinstalar Zettlr uninstall_zettlr() { local os=$(detect_os) local result=0 echo -e "\n${head_info}: Sistema operativo detectado: ${os}" # Mostrar diálogo de confirmación if command -v dialog &>/dev/null; then dialog --title "${head_delete} Zettlr" --yesno "¿Está seguro que desea ${head_delete} Zettlr Markdown Editor?" 8 60 if [ $? -ne 0 ]; then echo -e "\n${head_info}: ${head_op_error}" return 0 fi else read -p "¿Está seguro que desea ${head_delete} Zettlr Markdown Editor? (s/n): " CONFIRM if [[ ! "$CONFIRM" =~ ^[Ss]$ ]]; then echo -e "\n${head_info}: ${head_op_error}" return 0 fi fi # Desinstalar según el sistema operativo case "$os" in *"Ubuntu"*|*"Debian"*|*"Linux Mint"*|*"Pop!_OS"*|*"elementary OS"*) uninstall_zettlr_debian result=$? ;; *"Fedora"*|*"Red Hat"*|*"CentOS"*|*"Rocky"*|*"AlmaLinux"*|*"Oracle Linux"*) uninstall_zettlr_redhat result=$? ;; *"Arch"*|*"Manjaro"*|*"EndeavourOS"*|*"Garuda"*) uninstall_zettlr_arch result=$? ;; *"macOS"*) uninstall_zettlr_macos result=$? ;; *"FreeBSD"*) uninstall_zettlr_freebsd result=$? ;; *) echo -e "\n${head_error}: ${os_nofound}" return 1 ;; esac return $result } # Mostrar encabezado echo -e "\n=== ${head_installing} Zettlr Markdown Editor (${head_version} $ZETTLR_VERSION) ===" # Verificar si Zettlr ya está instalado ZETTLR_INSTALLED=0 if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ] || [ -f /opt/Zettlr/zettlr ] || [ -d "/Applications/Zettlr.app" ]; then ZETTLR_INSTALLED=1 echo -e "\n${head_info}: Zettlr ya está instalado en el sistema." fi # Determinar acción a realizar if [ $UNINSTALL -eq 1 ]; then # Desinstalar si está instalado if [ $ZETTLR_INSTALLED -eq 1 ]; then uninstall_zettlr else echo -e "\n${head_info}: Zettlr no está instalado. Nada que desinstalar." fi else # Instalar o reinstalar if [ $ZETTLR_INSTALLED -eq 1 ]; then # Preguntar si desea reinstalar if command -v dialog &>/dev/null; then dialog --title "Reinstalar Zettlr" --yesno "Zettlr ${head_version} ya está instalado. ¿Desea reinstalarlo?" 8 60 if [ $? -eq 0 ]; then uninstall_zettlr && install_zettlr fi else read -p "Zettlr ${head_version} ya está instalado. ¿Desea reinstalarlo? (s/n): " REINSTALL if [[ "$REINSTALL" =~ ^[Ss]$ ]]; then uninstall_zettlr && install_zettlr fi fi else # Preguntar si desea instalar if command -v dialog &>/dev/null; then dialog --title "Instalar Zettlr" --yesno "¿Desea instalar Zettlr Markdown Editor?" 8 60 if [ $? -eq 0 ]; then install_zettlr else echo -e "\n${head_info}: ${head_op_error}" fi else read -p "¿Desea instalar Zettlr Markdown Editor? (s/n): " CONFIRM if [[ "$CONFIRM" =~ ^[Ss]$ ]]; then install_zettlr else echo -e "\n${head_info}: ${head_op_error}" fi fi fi fi echo -e "\n=== ${head_success}: ${head_exit} ==="