Ajout dialogue interactif pour options d'impression (option 3)
- Ajout fonction show_print_options() avec formulaire zenity - Options: imprimante, recto-verso, copies, couleur, qualité, orientation - Dialogue affiché automatiquement pour action 'Imprimer' sur fichier unique - Support mode local et Docker - Fallback sur options par défaut si dialogue annulé
This commit is contained in:
412
scripts/md_to_print_gui.sh
Executable file
412
scripts/md_to_print_gui.sh
Executable file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user