diff --git a/scripts/md_to_print_gui.sh b/scripts/md_to_print_gui.sh new file mode 100755 index 0000000..ece346d --- /dev/null +++ b/scripts/md_to_print_gui.sh @@ -0,0 +1,412 @@ +#!/bin/bash + +# Wrapper GUI pour MD_to_Print avec support sélection multiple +# Usage: md_to_print_gui.sh --print|--convert|--preview fichier1.md [fichier2.md ...] + +set -euo pipefail + +# Couleurs +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Variables +ACTION="" +USE_DOCKER=false +FILES=() +SCRIPT_DIR="" + +# Fonction de notification +notify() { + local level="$1" + shift + local message="$*" + local icon="" + local urgency="normal" + + case "$level" in + info) + icon="dialog-information" + urgency="low" + ;; + success) + icon="dialog-information" + urgency="normal" + ;; + warning) + icon="dialog-warning" + urgency="normal" + ;; + error) + icon="dialog-error" + urgency="critical" + ;; + esac + + if command -v notify-send &> /dev/null; then + notify-send -u "$urgency" -i "$icon" "MD_to_Print" "$message" 2>/dev/null || true + fi +} + +# Fonction pour afficher le dialogue d'options d'impression +show_print_options() { + if ! command -v zenity &> /dev/null; then + # Fallback si zenity n'est pas disponible + return 1 + fi + + # Récupérer la liste des imprimantes + local printers="Par défaut" + if command -v lpstat &> /dev/null; then + local printer_list=$(lpstat -p 2>/dev/null | grep -E "^printer" | awk '{print $2}' | tr '\n' '|') + if [ -n "$printer_list" ]; then + printers="${printer_list%|}|Par défaut" + fi + fi + + # Dialogue zenity avec formulaire + local result=$(zenity --forms --title "Options d'impression MD_to_Print" \ + --text "Configurez les options d'impression" \ + --add-combo "Imprimante" \ + --combo-values "$printers" \ + --set-value "Par défaut" \ + --add-combo "Recto-verso" \ + --combo-values "none|simplex|duplex" \ + --set-value "none" \ + --add-entry "Nombre de copies (1-10)" \ + --set-value "1" \ + --add-combo "Couleur" \ + --combo-values "Non|Oui" \ + --set-value "Non" \ + --add-combo "Qualité" \ + --combo-values "draft|normal|high" \ + --set-value "normal" \ + --add-combo "Orientation" \ + --combo-values "portrait|landscape" \ + --set-value "portrait" \ + 2>/dev/null) + + if [ $? -ne 0 ] || [ -z "$result" ]; then + return 1 # Utilisateur a annulé + fi + + # Parser les résultats (zenity forms retourne les valeurs séparées par |) + IFS='|' read -r selected_printer duplex_mode copies color quality orientation <<< "$result" + + # Valider et formater les options + PRINT_OPTS=() + + if [ -n "$selected_printer" ] && [ "$selected_printer" != "Par défaut" ] && [ "$selected_printer" != "" ]; then + PRINT_OPTS+=(--printer "$selected_printer") + fi + + if [ -n "$duplex_mode" ] && [ "$duplex_mode" != "none" ]; then + PRINT_OPTS+=(--duplex "$duplex_mode") + fi + + if [ -n "$copies" ] && [[ "$copies" =~ ^[0-9]+$ ]] && [ "$copies" -ge 1 ] && [ "$copies" -le 10 ]; then + PRINT_OPTS+=(--copies "$copies") + fi + + if [ "$color" = "Oui" ]; then + PRINT_OPTS+=(--color) + fi + + if [ -n "$quality" ] && [ "$quality" != "normal" ]; then + PRINT_OPTS+=(--quality "$quality") + fi + + if [ -n "$orientation" ] && [ "$orientation" != "portrait" ]; then + PRINT_OPTS+=(--orientation "$orientation") + fi + + return 0 +} + +# Fonction d'aide +show_help() { + cat << EOF +MD_to_Print - Wrapper GUI + +Usage: $0 --print|--convert|--preview [--docker] fichier1.md [fichier2.md ...] + +OPTIONS: + --print Conversion + Impression (avec dialogue d'options) + --convert Conversion uniquement (sans impression) + --preview Prévisualisation avant impression + --docker Forcer l'utilisation de Docker + --help Afficher cette aide + +EXEMPLES: + $0 --print document.md + $0 --convert fichier1.md fichier2.md + $0 --preview document.md --docker +EOF +} + +# Détection du script principal +detect_script() { + # Chercher md_to_print.sh dans le PATH + if command -v md_to_print.sh &> /dev/null; then + SCRIPT_DIR="$(dirname "$(command -v md_to_print.sh)")" + return 0 + fi + + # Chercher dans le répertoire parent + local current_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + local parent_dir="$(dirname "$current_dir")" + + if [ -f "$parent_dir/md_to_print.sh" ]; then + SCRIPT_DIR="$parent_dir" + return 0 + fi + + return 1 +} + +# Détection automatique Docker vs Local +detect_mode() { + # Si flag --docker explicite + if [ "$USE_DOCKER" = true ]; then + return 0 + fi + + # Vérifier si script local existe + if detect_script; then + USE_DOCKER=false + return 0 + fi + + # Vérifier si Docker est disponible + if command -v docker &> /dev/null; then + if docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" 2>/dev/null | grep -q "md-to-print:latest"; then + USE_DOCKER=true + notify info "Utilisation Docker (dépendances locales non disponibles)" + return 0 + fi + fi + + # Aucune option disponible + return 1 +} + +# Parsing des arguments +while [[ $# -gt 0 ]]; do + case $1 in + --print|--convert|--preview) + ACTION="${1#--}" + shift + ;; + --docker) + USE_DOCKER=true + shift + ;; + --help|-h) + show_help + exit 0 + ;; + -*) + echo "Option inconnue: $1" >&2 + show_help + exit 1 + ;; + *) + if [ -f "$1" ]; then + FILES+=("$1") + else + echo "Fichier introuvable: $1" >&2 + exit 1 + fi + shift + ;; + esac +done + +# Vérification des arguments +if [ -z "$ACTION" ]; then + echo "Erreur: Action non spécifiée (--print, --convert, ou --preview)" >&2 + show_help + exit 1 +fi + +if [ ${#FILES[@]} -eq 0 ]; then + echo "Erreur: Aucun fichier spécifié" >&2 + show_help + exit 1 +fi + +# Filtrer seulement les fichiers markdown +MD_FILES=() +for file in "${FILES[@]}"; do + if [[ "$file" =~ \.(md|markdown)$ ]]; then + MD_FILES+=("$file") + fi +done + +if [ ${#MD_FILES[@]} -eq 0 ]; then + notify error "Aucun fichier Markdown trouvé dans la sélection" + exit 1 +fi + +# Détection du mode d'exécution +if ! detect_mode; then + if command -v zenity &> /dev/null; then + if zenity --question --text "Aucune installation locale trouvée.\n\nInstaller les dépendances localement ou utiliser Docker?" --title "MD_to_Print" --ok-label "Installer" --cancel-label "Docker"; then + if detect_script && [ -f "$SCRIPT_DIR/md_to_print.sh" ]; then + notify info "Installation des dépendances..." + "$SCRIPT_DIR/md_to_print.sh" --install-deps || { + notify error "Échec de l'installation des dépendances" + exit 1 + } + USE_DOCKER=false + else + notify error "Script md_to_print.sh introuvable" + exit 1 + fi + else + USE_DOCKER=true + fi + else + echo "Erreur: Aucune installation trouvée. Installez md_to_print.sh ou Docker." >&2 + exit 1 + fi +fi + +# Confirmation pour plusieurs fichiers +if [ ${#MD_FILES[@]} -gt 1 ]; then + count=${#MD_FILES[@]} + if command -v zenity &> /dev/null; then + if ! zenity --question --text "Traiter $count fichiers?\n\n${MD_FILES[*]}" --title "MD_to_Print" --ok-label "Continuer" --cancel-label "Annuler"; then + exit 0 + fi + else + echo "Traitement de $count fichiers..." + read -p "Continuer? (o/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Oo]$ ]]; then + exit 0 + fi + fi +fi + +# Notification de début +notify info "Traitement de ${#MD_FILES[@]} fichier(s)..." + +# Traitement des fichiers +SUCCESS_COUNT=0 +ERROR_COUNT=0 +ERROR_FILES=() + +for file in "${MD_FILES[@]}"; do + file_name="$(basename "$file")" + notify info "Traitement: $file_name" + + if [ "$USE_DOCKER" = true ]; then + # Utilisation Docker + file_dir="$(dirname "$(realpath "$file")")" + file_base="$(basename "$file")" + output_dir="$HOME/MD_to_print_output" + mkdir -p "$output_dir" + + # Construire les arguments Docker + docker_args=() + if [ "$ACTION" = "convert" ]; then + docker_args+=(--convert-only) + elif [ "$ACTION" = "preview" ]; then + docker_args+=(--preview --keep-pdf) + else + # Pour "print", afficher le dialogue d'options si disponible + if command -v zenity &> /dev/null && [ ${#MD_FILES[@]} -eq 1 ]; then + # Afficher le dialogue d'options pour un seul fichier + if show_print_options; then + docker_args+=("${PRINT_OPTS[@]}") + notify info "Options: ${PRINT_OPTS[*]}" + else + # Utiliser les valeurs par défaut si l'utilisateur annule + notify info "Utilisation des options par défaut" + fi + fi + # On garde le PDF après impression + docker_args+=(--keep-pdf) + fi + + if docker run --rm \ + -v "$file_dir:/workspace/documents:ro" \ + -v "$output_dir:/workspace/output" \ + -v "$HOME/MD_to_print/logs:/workspace/logs" \ + --network host \ + ${DISPLAY:+-e DISPLAY="$DISPLAY" -v /tmp/.X11-unix:/tmp/.X11-unix:ro} \ + ${CUPS_SOCKET:+-v /var/run/cups:/var/run/cups:ro} \ + md-to-print:latest \ + "/workspace/documents/$file_base" \ + "${docker_args[@]}" \ + > /tmp/md_to_print_docker.log 2>&1; then + SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) + notify success "✓ $file_name traité" + else + ERROR_COUNT=$((ERROR_COUNT + 1)) + ERROR_FILES+=("$file_name") + notify error "✗ Erreur: $file_name" + fi + else + # Utilisation locale + script_path="" + if [ -n "$SCRIPT_DIR" ]; then + script_path="$SCRIPT_DIR/md_to_print.sh" + else + script_path="md_to_print.sh" + fi + + cmd_args=("$file") + + case "$ACTION" in + print) + # Pour print, afficher le dialogue d'options si disponible + if command -v zenity &> /dev/null && [ ${#MD_FILES[@]} -eq 1 ]; then + # Afficher le dialogue d'options pour un seul fichier + if show_print_options; then + cmd_args+=("${PRINT_OPTS[@]}") + notify info "Options: ${PRINT_OPTS[*]}" + else + # Utiliser les valeurs par défaut si l'utilisateur annule + notify info "Utilisation des options par défaut" + fi + fi + # On garde le PDF après impression + cmd_args+=(--keep-pdf) + ;; + convert) + # Pour convert, conversion uniquement sans impression + cmd_args+=(--convert-only) + ;; + preview) + cmd_args+=(--preview --keep-pdf) + ;; + esac + + if "$script_path" "${cmd_args[@]}" > /tmp/md_to_print.log 2>&1; then + SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) + notify success "✓ $file_name traité" + else + ERROR_COUNT=$((ERROR_COUNT + 1)) + ERROR_FILES+=("$file_name") + notify error "✗ Erreur: $file_name" + fi + fi +done + +# Résumé final +if [ $ERROR_COUNT -eq 0 ]; then + notify success "Tous les fichiers ont été traités avec succès ($SUCCESS_COUNT fichier(s))" + exit 0 +else + summary="Terminé: $SUCCESS_COUNT succès, $ERROR_COUNT erreur(s)" + if [ ${#ERROR_FILES[@]} -gt 0 ]; then + summary="$summary\n\nErreurs:\n${ERROR_FILES[*]}" + fi + notify error "$summary" + exit 1 +fi +