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