Compare commits

..

6 Commits

Author SHA1 Message Date
syoul
6285840eb2 Correction conversion Markdown: format explicite et dialogue options impression
- Ajout --from=markdown et --to=pdf pour conversion explicite
- Ajout --standalone pour document complet
- Correction dialogue options impression (suppression --set-value)
- Ajout logs débogage pour diagnostic
- Support preview et print avec dialogue options
- Correction gestion orientation CUPS (pas de conflit PDF/CUPS)
- Suppression fit-to-page problématique
2025-12-25 17:56:21 +01:00
syoul
a840972375 Script helper pour notifications desktop avec libnotify
- Fonction utilitaire pour notifications système
- Support différents niveaux: info, success, error, warning
- Utilisé par md_to_print_gui.sh pour feedback utilisateur
2025-12-25 16:38:49 +01:00
syoul
5a67a0998c Documentation: intégration bureau et utilisation Docker
- Section intégration bureau avec instructions Caja Actions
- Détails sur options d'impression et dialogue interactif
- Guide dépannage pour problèmes courants
- Explications sur temps de build Docker
2025-12-25 16:38:43 +01:00
syoul
210700e4df Intégration bureau MATE/Caja avec actions contextuelles
- Fichiers .desktop pour actions: Imprimer, Convertir, Prévisualiser
- Script install-desktop.sh pour installation automatique
- Support sélection multiple de fichiers
- Compatible Caja Actions (MATE Desktop)
2025-12-25 16:38:42 +01:00
syoul
fbdb0bfe33 Améliorations Docker: dépendances LaTeX et gestion fichiers multiples
- Ajout texlive-xetex et fonts-dejavu pour support Unicode/emoji
- Ajout texlive-latex-recommended pour packages LaTeX complets
- Amélioration docker_run.sh pour gérer plusieurs fichiers MD
- Correction gestion TTY pour exécution non-interactive
2025-12-25 16:38:42 +01:00
syoul
8ff8658ba7 Ajout option --convert-only pour conversion sans impression
- Ajout flag --convert-only / --no-print
- Permet conversion PDF sans impression automatique
- Utile pour intégration bureau et workflows batch
2025-12-25 16:38:41 +01:00
12 changed files with 876 additions and 135 deletions

View File

@@ -47,3 +47,5 @@ docker_run.sh
# Fichiers de test
documents/test.md
# Documents sources (pour éviter de les copier dans l'image)
documents/*.md

View File

@@ -12,6 +12,7 @@ ENV DEBIAN_FRONTEND=noninteractive \
LC_ALL=fr_FR.UTF-8
# Installation des dépendances système et locales
# Optimisation: combiner toutes les installations en une seule couche
RUN apt-get update && \
apt-get install -y --no-install-recommends \
locales \
@@ -22,17 +23,20 @@ RUN apt-get update && \
texlive-latex-base \
texlive-xetex \
texlive-fonts-recommended \
texlive-latex-recommended \
texlive-latex-extra \
texlive-fonts-extra \
texlive-lang-french \
fonts-dejavu \
lmodern \
cups \
cups-client \
evince \
curl \
ca-certificates \
make \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Création d'un utilisateur non-root pour sécurité
RUN useradd -m -u 1000 -s /bin/bash mdprint && \
@@ -55,4 +59,3 @@ USER mdprint
# Point d'entrée
ENTRYPOINT ["/usr/local/bin/md_to_print.sh"]
CMD ["--help"]

145
README.md
View File

@@ -13,6 +13,7 @@ Application CLI complète pour convertir des fichiers Markdown en PDF et les imp
- **Gestion d'erreurs** complète avec codes de retour appropriés
- **Système de logging** détaillé avec niveaux (DEBUG, INFO, WARN, ERROR)
- **Interface en ligne de commande** avec options complètes
- **Intégration bureau** : Menu contextuel MATE/Caja avec sélection multiple
## Installation
@@ -42,6 +43,14 @@ make install
### Installation avec Docker
**Note importante sur le temps de construction :**
La première construction de l'image Docker peut prendre **5-10 minutes** car elle doit télécharger et installer les packages TeX Live (plusieurs centaines de MB). C'est normal et nécessaire pour la conversion PDF. Les constructions suivantes seront beaucoup plus rapides grâce au cache Docker.
**Pour accélérer la construction :**
- Utilisez le cache Docker : ne reconstruisez que si nécessaire
- Utilisez `docker build --cache-from md-to-print:latest` pour réutiliser le cache
- Une fois construite, l'image est réutilisable indéfiniment
1. Construire l'image Docker:
```bash
make build
@@ -133,6 +142,134 @@ make shell
make clean
```
## Utilisation de bureau (MATE/Caja)
MD_to_Print peut être intégré dans votre environnement de bureau MATE pour une utilisation via le menu contextuel (clic droit).
### Installation de l'intégration bureau
**IMPORTANT :** Caja nécessite l'extension **caja-actions** pour afficher les actions dans le menu contextuel.
1. **Installer caja-actions** (requis):
```bash
sudo apt-get install caja-actions
```
2. **Installation automatique** (recommandée):
```bash
cd MD_to_print
./desktop/install-desktop.sh
```
3. **Configuration Caja Actions** (important):
```bash
# Ouvrir l'outil de configuration
caja-actions-config-tool
```
Dans l'outil de configuration :
- Allez dans **Édition > Préférences**
- Onglet **Préférences d'exécution**
- **Désactivez** l'option "Créer un menu racine 'Caja-Actions'"
- Cela permet aux actions d'apparaître directement dans le menu contextuel
4. **Redémarrer Caja** pour voir les nouvelles actions:
```bash
caja -q
```
### Utilisation depuis le menu contextuel
Une fois installé, les actions suivantes sont disponibles dans le menu contextuel (clic droit) sur les fichiers `.md`:
- **"Imprimer avec MD_to_Print"** : Conversion + Impression directe
- **"Convertir en PDF (MD_to_Print)"** : Conversion uniquement, sans impression
- **"Prévisualiser avant impression"** : Conversion + Prévisualisation + Impression optionnelle
### Fonctionnalités
-**Sélection multiple** : Traitez plusieurs fichiers en une seule fois
-**Notifications de bureau** : Feedback visuel pour chaque étape
-**Détection automatique** : Utilise l'installation locale ou Docker selon disponibilité
-**Gestion d'erreurs** : Messages clairs en cas de problème
-**Confirmation** : Dialogue de confirmation pour traitement multiple
### Exemples d'utilisation
**Sélection unique :**
1. Clic droit sur `document.md`
2. Sélectionner "Imprimer avec MD_to_Print"
3. Le fichier est converti et imprimé automatiquement
**Sélection multiple :**
1. Sélectionner plusieurs fichiers `.md` (Ctrl+Clic)
2. Clic droit → "Convertir en PDF (MD_to_Print)"
3. Confirmer le traitement multiple
4. Tous les fichiers sont convertis séquentiellement avec notifications
### Désinstallation
Pour désinstaller l'intégration bureau:
```bash
./desktop/install-desktop.sh --uninstall
```
### Dépendances bureau
**Critique :**
- `caja-actions` : Extension Caja pour les actions personnalisées (REQUIS)
**Optionnelles :**
- `zenity` ou `yad` : Dialogues graphiques
- `libnotify-bin` : Notifications (`notify-send`)
- `caja` : Gestionnaire de fichiers MATE (déjà installé)
Installation des dépendances:
```bash
sudo apt-get install caja-actions zenity libnotify-bin
```
### Dépannage menu contextuel
**Les actions n'apparaissent pas dans le menu :**
```bash
# 1. Vérifier que caja-actions est installé (CRITIQUE)
dpkg -l | grep caja-actions
# Si absent: sudo apt-get install caja-actions
# 2. Vérifier que les fichiers .desktop sont installés
ls ~/.local/share/caja/actions/md-to-print-*.desktop
# 3. Ouvrir l'outil de configuration Caja Actions
caja-actions-config-tool
# Vérifier que les actions sont présentes et activées
# Dans Préférences: désactiver "Créer un menu racine Caja-Actions"
# 4. Vérifier que les scripts sont dans le PATH
which md_to_print_gui.sh
# 5. Redémarrer Caja
caja -q
```
**Erreur "md_to_print_gui.sh: command not found" :**
```bash
# Vérifier l'installation
./desktop/install-desktop.sh
# Vérifier que ~/.local/bin est dans le PATH
echo $PATH | grep -q ".local/bin" || echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
```
**Notifications ne s'affichent pas :**
```bash
# Vérifier que libnotify est installé
dpkg -l | grep libnotify-bin
# Tester manuellement
notify-send "Test" "Les notifications fonctionnent"
```
## Options disponibles
| Option | Description | Défaut |
@@ -200,6 +337,14 @@ MD_to_print/
├── docker-compose.yml # Configuration Docker Compose
├── docker_run.sh # Wrapper Docker
├── Makefile # Commandes Make
├── desktop/ # Intégration bureau
│ ├── md-to-print-print.desktop # Action "Imprimer"
│ ├── md-to-print-convert.desktop # Action "Convertir"
│ ├── md-to-print-preview.desktop # Action "Prévisualiser"
│ └── install-desktop.sh # Script d'installation
├── scripts/ # Scripts utilitaires
│ ├── md_to_print_gui.sh # Wrapper GUI
│ └── md_to_print_notify.sh # Script notifications
├── .dockerignore # Fichiers à exclure du build Docker
├── .gitignore # Fichiers à ignorer dans Git
├── README.md # Documentation (ce fichier)

61
desktop/fix-caja-actions.sh Executable file
View File

@@ -0,0 +1,61 @@
#!/bin/bash
# Script pour forcer le rechargement des actions Caja
echo "=== Diagnostic et correction des actions Caja ==="
echo ""
# Vérifier que les fichiers existent
echo "1. Vérification des fichiers .desktop..."
if ls ~/.local/share/caja/actions/md-to-print-*.desktop > /dev/null 2>&1; then
echo " ✓ Fichiers .desktop trouvés"
ls -1 ~/.local/share/caja/actions/md-to-print-*.desktop
else
echo " ✗ Aucun fichier .desktop trouvé"
exit 1
fi
echo ""
echo "2. Vérification du format..."
for file in ~/.local/share/caja/actions/md-to-print-*.desktop; do
if grep -q "X-Action-Profile" "$file" && grep -q "Enabled=true" "$file"; then
echo "$(basename $file) - Format correct"
else
echo "$(basename $file) - Format incorrect"
fi
done
echo ""
echo "3. Vérification des scripts..."
if command -v md_to_print_gui.sh > /dev/null; then
echo " ✓ md_to_print_gui.sh trouvé: $(which md_to_print_gui.sh)"
else
echo " ✗ md_to_print_gui.sh non trouvé dans PATH"
echo " Installation nécessaire: ./desktop/install-desktop.sh"
fi
echo ""
echo "4. Redémarrage de Caja..."
killall caja 2>/dev/null
sleep 2
caja > /dev/null 2>&1 &
sleep 2
echo " ✓ Caja redémarré"
echo ""
echo "=== Instructions ==="
echo ""
echo "1. Ouvrez caja-actions-config-tool:"
echo " caja-actions-config-tool"
echo ""
echo "2. Dans l'outil, vérifiez que les actions MD_to_Print sont présentes"
echo " Si elles ne sont pas là, utilisez Fichier > Importer > Desktop files"
echo " et sélectionnez: ~/.local/share/caja/actions/md-to-print-*.desktop"
echo ""
echo "3. Assurez-vous que les actions sont activées (cochez la case 'Enabled')"
echo ""
echo "4. Dans Édition > Préférences > Préférences d'exécution:"
echo " Désactivez 'Créer un menu racine Caja-Actions'"
echo ""
echo "5. Testez avec un clic droit sur un fichier .md"

229
desktop/install-desktop.sh Executable file
View File

@@ -0,0 +1,229 @@
#!/bin/bash
# Script d'installation pour l'intégration bureau MD_to_Print
# Usage: ./install-desktop.sh [--uninstall]
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
CAJA_ACTIONS_DIR="$HOME/.local/share/caja/actions"
LOCAL_BIN_DIR="$HOME/.local/bin"
SYSTEM_BIN_DIR="/usr/local/bin"
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Fonction d'aide
show_help() {
cat << EOF
Installation de l'intégration bureau MD_to_Print
Usage: $0 [OPTIONS]
OPTIONS:
--uninstall Désinstaller l'intégration bureau
--system Installer dans /usr/local/bin (nécessite sudo)
--help Afficher cette aide
Par défaut, installe dans ~/.local/bin (pas besoin de sudo)
EOF
}
# Fonction de notification
notify() {
local level="$1"
shift
local message="$*"
if command -v notify-send &> /dev/null; then
case "$level" in
info) notify-send -i "dialog-information" "MD_to_Print" "$message" 2>/dev/null || true ;;
success) notify-send -i "dialog-information" "MD_to_Print" "$message" 2>/dev/null || true ;;
error) notify-send -i "dialog-error" "MD_to_Print" "$message" 2>/dev/null || true ;;
esac
fi
echo -e "${GREEN}$message${NC}"
}
# Vérification des dépendances
check_dependencies() {
local missing=()
local critical_missing=()
# Dépendance critique : caja-actions
if ! command -v caja-actions-config-tool &> /dev/null && ! dpkg -l | grep -q "caja-actions"; then
critical_missing+=("caja-actions")
fi
if ! command -v notify-send &> /dev/null; then
missing+=("libnotify-bin")
fi
if ! command -v zenity &> /dev/null && ! command -v yad &> /dev/null; then
missing+=("zenity")
fi
if [ ${#critical_missing[@]} -gt 0 ]; then
echo -e "${RED}Dépendance CRITIQUE manquante: ${critical_missing[*]}${NC}"
echo -e "${YELLOW}Sans caja-actions, les actions ne pourront pas apparaître dans le menu contextuel.${NC}"
echo -e "${BLUE}Installation: sudo apt-get install caja-actions${NC}"
echo ""
read -p "Installer caja-actions maintenant? (o/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Oo]$ ]]; then
if sudo apt-get install -y caja-actions; then
echo -e "${GREEN}caja-actions installé avec succès${NC}"
else
echo -e "${RED}Échec de l'installation de caja-actions${NC}"
return 1
fi
else
echo -e "${YELLOW}Installation de caja-actions annulée. Les actions ne fonctionneront pas.${NC}"
return 1
fi
fi
if [ ${#missing[@]} -gt 0 ]; then
echo -e "${YELLOW}Dépendances optionnelles manquantes: ${missing[*]}${NC}"
echo -e "${BLUE}Installation: sudo apt-get install ${missing[*]}${NC}"
return 1
fi
return 0
}
# Installation
install() {
local INSTALL_BIN_DIR="$LOCAL_BIN_DIR"
local USE_SUDO=false
# Vérifier option --system
if [ "${1:-}" = "--system" ]; then
INSTALL_BIN_DIR="$SYSTEM_BIN_DIR"
USE_SUDO=true
if [ "$EUID" -ne 0 ] && ! sudo -n true 2>/dev/null; then
echo -e "${RED}Erreur: --system nécessite les privilèges sudo${NC}"
exit 1
fi
fi
echo -e "${BLUE}=== Installation de l'intégration bureau MD_to_Print ===${NC}"
# Vérifier les dépendances
if ! check_dependencies; then
if ! command -v caja-actions-config-tool &> /dev/null && ! dpkg -l | grep -q "caja-actions"; then
echo -e "${RED}Installation annulée: caja-actions est requis${NC}"
exit 1
fi
echo -e "${YELLOW}Certaines dépendances optionnelles sont manquantes, mais l'installation continue...${NC}"
fi
# Créer les répertoires nécessaires
mkdir -p "$CAJA_ACTIONS_DIR"
mkdir -p "$INSTALL_BIN_DIR"
# Copier les fichiers .desktop
echo -e "${BLUE}Installation des actions Caja...${NC}"
cp "$SCRIPT_DIR"/*.desktop "$CAJA_ACTIONS_DIR/" 2>/dev/null || {
echo -e "${RED}Erreur: Impossible de copier les fichiers .desktop${NC}"
exit 1
}
# Installer les scripts
echo -e "${BLUE}Installation des scripts...${NC}"
if [ "$USE_SUDO" = true ]; then
sudo cp "$PROJECT_DIR/scripts/md_to_print_gui.sh" "$INSTALL_BIN_DIR/"
sudo cp "$PROJECT_DIR/scripts/md_to_print_notify.sh" "$INSTALL_BIN_DIR/"
sudo chmod +x "$INSTALL_BIN_DIR/md_to_print_gui.sh"
sudo chmod +x "$INSTALL_BIN_DIR/md_to_print_notify.sh"
else
cp "$PROJECT_DIR/scripts/md_to_print_gui.sh" "$INSTALL_BIN_DIR/"
cp "$PROJECT_DIR/scripts/md_to_print_notify.sh" "$INSTALL_BIN_DIR/"
chmod +x "$INSTALL_BIN_DIR/md_to_print_gui.sh"
chmod +x "$INSTALL_BIN_DIR/md_to_print_notify.sh"
fi
# Vérifier que les scripts sont dans le PATH
if [[ ":$PATH:" != *":$INSTALL_BIN_DIR:"* ]] && [ "$INSTALL_BIN_DIR" = "$LOCAL_BIN_DIR" ]; then
echo -e "${YELLOW}Attention: $INSTALL_BIN_DIR n'est pas dans votre PATH${NC}"
echo -e "${BLUE}Ajoutez cette ligne à votre ~/.bashrc ou ~/.profile:${NC}"
echo -e "${GREEN}export PATH=\"\$HOME/.local/bin:\$PATH\"${NC}"
fi
# Vérifier que md_to_print.sh est accessible
if ! command -v md_to_print.sh &> /dev/null && [ ! -f "$PROJECT_DIR/md_to_print.sh" ]; then
echo -e "${YELLOW}Attention: md_to_print.sh non trouvé${NC}"
echo -e "${BLUE}Assurez-vous que md_to_print.sh est installé ou que Docker est configuré${NC}"
fi
notify success "Installation terminée avec succès!"
echo -e "${GREEN}=== Installation terminée ===${NC}"
echo ""
echo -e "${BLUE}IMPORTANT: Configuration Caja Actions${NC}"
echo -e "${YELLOW}1. Ouvrez l'outil de configuration:${NC}"
echo -e "${GREEN} caja-actions-config-tool${NC}"
echo ""
echo -e "${YELLOW}2. Dans les préférences (Édition > Préférences), désactivez:${NC}"
echo -e "${GREEN} 'Créer un menu racine Caja-Actions'${NC}"
echo -e "${YELLOW} (pour que les actions apparaissent directement dans le menu)${NC}"
echo ""
echo -e "${BLUE}3. Redémarrez Caja:${NC}"
echo -e "${GREEN} caja -q${NC}"
echo ""
echo -e "${BLUE}Les actions suivantes sont maintenant disponibles:${NC}"
echo -e " - Imprimer avec MD_to_Print"
echo -e " - Convertir en PDF (MD_to_Print)"
echo -e " - Prévisualiser avant impression"
}
# Désinstallation
uninstall() {
echo -e "${BLUE}=== Désinstallation de l'intégration bureau MD_to_Print ===${NC}"
# Supprimer les fichiers .desktop
if [ -d "$CAJA_ACTIONS_DIR" ]; then
echo -e "${BLUE}Suppression des actions Caja...${NC}"
rm -f "$CAJA_ACTIONS_DIR"/md-to-print-*.desktop
fi
# Supprimer les scripts
echo -e "${BLUE}Suppression des scripts...${NC}"
if [ -f "$LOCAL_BIN_DIR/md_to_print_gui.sh" ]; then
rm -f "$LOCAL_BIN_DIR/md_to_print_gui.sh"
fi
if [ -f "$LOCAL_BIN_DIR/md_to_print_notify.sh" ]; then
rm -f "$LOCAL_BIN_DIR/md_to_print_notify.sh"
fi
if [ -f "$SYSTEM_BIN_DIR/md_to_print_gui.sh" ]; then
if [ "$EUID" -eq 0 ] || sudo -n true 2>/dev/null; then
sudo rm -f "$SYSTEM_BIN_DIR/md_to_print_gui.sh"
sudo rm -f "$SYSTEM_BIN_DIR/md_to_print_notify.sh"
else
echo -e "${YELLOW}Les scripts système nécessitent sudo pour être supprimés${NC}"
fi
fi
notify success "Désinstallation terminée"
echo -e "${GREEN}=== Désinstallation terminée ===${NC}"
echo -e "${BLUE}Redémarrez Caja: caja -q${NC}"
}
# Parsing des arguments
if [ "${1:-}" = "--uninstall" ]; then
uninstall
elif [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then
show_help
else
install "$@"
fi

View File

@@ -0,0 +1,17 @@
[Desktop Entry]
Type=Action
Icon=application-pdf
ToolbarLabel=Convertir en PDF (MD_to_Print)
ToolbarLabel[fr]=Convertir en PDF (MD_to_Print)
Name=Convertir en PDF (MD_to_Print)
Name[fr]=Convertir en PDF (MD_to_Print)
Profiles=profile-zero;
TargetContext=true
Enabled=true
[X-Action-Profile profile-zero]
Exec=md_to_print_gui.sh --convert %F
MimeTypes=text/markdown;text/x-markdown;
MatchPattern=*.md;*.markdown;*.mkd;
Name=Default profile
Name[fr]=Profil par défaut

View File

@@ -0,0 +1,17 @@
[Desktop Entry]
Type=Action
Icon=document-preview
ToolbarLabel=Prévisualiser avant impression
ToolbarLabel[fr]=Prévisualiser avant impression
Name=Prévisualiser avant impression
Name[fr]=Prévisualiser avant impression
Profiles=profile-zero;
TargetContext=true
Enabled=true
[X-Action-Profile profile-zero]
Exec=md_to_print_gui.sh --preview %F
MimeTypes=text/markdown;text/x-markdown;
MatchPattern=*.md;*.markdown;*.mkd;
Name=Default profile
Name[fr]=Profil par défaut

View File

@@ -0,0 +1,17 @@
[Desktop Entry]
Type=Action
Icon=printer
ToolbarLabel=Imprimer avec MD_to_Print
ToolbarLabel[fr]=Imprimer avec MD_to_Print
Name=Imprimer avec MD_to_Print
Name[fr]=Imprimer avec MD_to_Print
Profiles=profile-zero;
TargetContext=true
Enabled=true
[X-Action-Profile profile-zero]
Exec=sh -c 'DISPLAY="${DISPLAY:-:0}" md_to_print_gui.sh --print %F'
MimeTypes=text/markdown;text/x-markdown;
MatchPattern=*.md;*.markdown;*.mkd;
Name=Default profile
Name[fr]=Profil par défaut

View File

@@ -2,11 +2,11 @@
# Wrapper pour exécuter le script MD_to_Print dans Docker
# Usage: ./docker_run.sh fichier.md [options...]
# ./docker_run.sh fichier1.md fichier2.md [options...]
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MD_FILE="${1:-}"
# Couleurs
RED='\033[0;31m'
@@ -21,17 +21,20 @@ show_help() {
Wrapper Docker pour MD_to_Print
Usage: $0 fichier.md [options...]
$0 fichier1.md fichier2.md [options...]
Ce script simplifie l'exécution de MD_to_Print dans Docker en gérant:
- Les chemins absolus des fichiers
- Le montage des volumes
- Le passage des arguments
- La gestion des erreurs Docker
- Le traitement de plusieurs fichiers en boucle
EXEMPLES:
$0 documents/rapport.md --preview
$0 documents/rapport.md --printer HP_LaserJet --copies 2
$0 documents/rapport.md --config config.conf --verbose
$0 documents/*.md --keep-pdf --verbose
$0 documents/fichier1.md documents/fichier2.md --keep-pdf
OPTIONS:
Toutes les options de md_to_print.sh sont supportées.
@@ -40,10 +43,40 @@ OPTIONS:
EOF
}
# Collecter les fichiers markdown et les options
MD_FILES=()
OPTIONS=()
PROCESSING_FILES=true
for arg in "$@"; do
if [ "$PROCESSING_FILES" = true ]; then
# Vérifier si c'est une option (commence par -)
if [[ "$arg" =~ ^- ]]; then
PROCESSING_FILES=false
OPTIONS+=("$arg")
# Vérifier si c'est un fichier markdown
elif [[ "$arg" =~ \.(md|markdown)$ ]] || [ -f "$arg" ]; then
MD_FILES+=("$arg")
else
# Argument ambigu, arrêter la collecte de fichiers
PROCESSING_FILES=false
OPTIONS+=("$arg")
fi
else
OPTIONS+=("$arg")
fi
done
# Vérification des arguments
if [ -z "$MD_FILE" ] || [ "$MD_FILE" = "-h" ] || [ "$MD_FILE" = "--help" ]; then
if [ ${#MD_FILES[@]} -eq 0 ]; then
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ] || [ -z "${1:-}" ]; then
show_help
exit 0
else
echo -e "${RED}Erreur: Aucun fichier markdown spécifié${NC}"
show_help
exit 1
fi
fi
# Vérifier que Docker est disponible
@@ -52,11 +85,31 @@ if ! command -v docker &> /dev/null; then
exit 1
fi
# Vérifier que le fichier existe
# Vérifier que tous les fichiers existent
for MD_FILE in "${MD_FILES[@]}"; do
if [ ! -f "$MD_FILE" ]; then
echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}"
exit 2
fi
done
# Créer les répertoires nécessaires
mkdir -p "$SCRIPT_DIR/documents" "$SCRIPT_DIR/output" "$SCRIPT_DIR/logs"
# Vérifier si l'image Docker existe
if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep -q "md-to-print:latest"; then
echo -e "${YELLOW}Image Docker non trouvée. Construction de l'image...${NC}"
cd "$SCRIPT_DIR"
docker build -t md-to-print:latest .
fi
# Fonction pour traiter un fichier
process_file() {
local MD_FILE="$1"
shift
local FILE_OPTIONS=("$@")
echo -e "${GREEN}=== Traitement de: $MD_FILE ===${NC}"
# Obtenir le chemin absolu du fichier
MD_FILE_ABS="$(realpath "$MD_FILE")"
@@ -72,21 +125,36 @@ if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then
MD_NAME="$MD_REL_PATH"
fi
# Créer les répertoires nécessaires
mkdir -p "$SCRIPT_DIR/documents" "$SCRIPT_DIR/output" "$SCRIPT_DIR/logs"
# Déterminer si on a besoin d'un TTY interactif (prévisualisation ou un seul fichier)
NEED_TTY=false
for opt in "${FILE_OPTIONS[@]}"; do
if [ "$opt" = "--preview" ] || [ "$opt" = "-p" ]; then
NEED_TTY=true
break
fi
done
# Vérifier si l'image Docker existe
if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep -q "md-to-print:latest"; then
echo -e "${YELLOW}Image Docker non trouvée. Construction de l'image...${NC}"
cd "$SCRIPT_DIR"
docker build -t md-to-print:latest .
# Si un seul fichier et TTY disponible, utiliser mode interactif
if [ ${#MD_FILES[@]} -eq 1 ] && [ -t 0 ] && [ "$NEED_TTY" = true ]; then
DOCKER_TTY_FLAGS="-it"
elif [ -t 0 ]; then
DOCKER_TTY_FLAGS="-i"
else
DOCKER_TTY_FLAGS=""
fi
# Construire la commande Docker
DOCKER_CMD=(
docker run
--rm
-it
)
# Ajouter les flags TTY si nécessaire
if [ -n "$DOCKER_TTY_FLAGS" ]; then
DOCKER_CMD+=($DOCKER_TTY_FLAGS)
fi
DOCKER_CMD+=(
-v "$SCRIPT_DIR/documents:/workspace/documents:ro"
-v "$SCRIPT_DIR/output:/workspace/output"
-v "$SCRIPT_DIR/logs:/workspace/logs"
@@ -108,23 +176,43 @@ fi
DOCKER_CMD+=(md-to-print:latest)
# Ajouter le fichier markdown et les options
# Ajouter le fichier markdown
if [[ "$MD_DIR" == "$SCRIPT_DIR" ]]; then
DOCKER_CMD+=("/workspace/$MD_NAME")
else
DOCKER_CMD+=("/workspace/documents/$MD_NAME")
fi
# Ajouter les options restantes
shift
for arg in "$@"; do
DOCKER_CMD+=("$arg")
# Ajouter les options
for opt in "${FILE_OPTIONS[@]}"; do
DOCKER_CMD+=("$opt")
done
# Exécuter
echo -e "${GREEN}Exécution dans Docker...${NC}"
echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}"
echo ""
exec "${DOCKER_CMD[@]}"
if ! "${DOCKER_CMD[@]}"; then
echo -e "${RED}Erreur lors du traitement de $MD_FILE${NC}"
return 1
fi
return 0
}
# Traiter tous les fichiers
EXIT_CODE=0
for MD_FILE in "${MD_FILES[@]}"; do
if ! process_file "$MD_FILE" "${OPTIONS[@]}"; then
EXIT_CODE=1
fi
echo ""
done
if [ $EXIT_CODE -eq 0 ]; then
echo -e "${GREEN}=== Tous les fichiers ont été traités avec succès ===${NC}"
else
echo -e "${YELLOW}=== Certains fichiers ont échoué ===${NC}"
fi
exit $EXIT_CODE

View File

@@ -40,6 +40,7 @@ COLOR=false
DUPLEX="none"
INSTALL_DEPS=false
KEEP_PDF=false
CONVERT_ONLY=false
CONFIG_FILE=""
VERBOSE=false
LOG_FILE=""
@@ -99,6 +100,7 @@ OPTIONS:
-d, --duplex MODE Mode recto-verso: none, simplex, duplex (défaut: none)
-i, --install-deps Installer les dépendances automatiquement
-k, --keep-pdf Conserver le fichier PDF après impression
--convert-only, --no-print Conversion uniquement (sans impression)
--config FILE Fichier de configuration
-v, --verbose Mode verbeux (logging DEBUG)
-l, --log FILE Fichier de log
@@ -410,6 +412,11 @@ while [[ $# -gt 0 ]]; do
KEEP_PDF=true
shift
;;
--convert-only|--no-print)
CONVERT_ONLY=true
KEEP_PDF=true
shift
;;
--config)
if [ -z "${2:-}" ]; then
log ERROR "Option --config nécessite un argument"
@@ -528,8 +535,11 @@ fi
PANDOC_OPTS=(
"$MD_FILE"
--from=markdown # Format d'entrée explicite (Markdown)
--to=pdf # Format de sortie explicite (PDF)
-o "$PDF_FILE"
--pdf-engine="$PDF_ENGINE"
--standalone # Document complet avec métadonnées
-V geometry:margin=2cm
-V fontsize=11pt
-V documentclass=article
@@ -544,9 +554,11 @@ if [ "$PDF_ENGINE" = "xelatex" ]; then
)
fi
if [ "$ORIENTATION" = "landscape" ]; then
PANDOC_OPTS+=(-V geometry:landscape)
fi
# Ne pas forcer l'orientation dans le PDF - laisser CUPS gérer l'orientation lors de l'impression
# Cela évite les conflits de mise en page
# if [ "$ORIENTATION" = "landscape" ]; then
# PANDOC_OPTS+=(-V geometry:landscape)
# fi
log DEBUG "Exécution: pandoc ${PANDOC_OPTS[*]}"
@@ -593,12 +605,17 @@ if [ -n "$PAGES" ]; then
LP_OPTS+=(-o page-ranges="$PAGES")
fi
# Appliquer l'orientation via CUPS (le PDF reste en portrait)
# Utiliser les valeurs standard IPP pour l'orientation
if [ "$ORIENTATION" = "landscape" ]; then
LP_OPTS+=(-o orientation-requested=4)
fi
LP_OPTS+=(-o media="$SIZE")
# Ne pas utiliser fit-to-page car cela peut causer des problèmes de mise en page
# Le PDF est déjà correctement dimensionné
case "$QUALITY" in
draft)
LP_OPTS+=(-o print-quality=3)
@@ -629,7 +646,8 @@ case "$DUPLEX" in
;;
esac
# Impression
# Impression (sauf si --convert-only)
if [ "$CONVERT_ONLY" = false ]; then
log INFO "=== Impression ==="
log INFO "Options:"
log INFO " - Copies: $COPIES"
@@ -650,6 +668,9 @@ if ! lp "${LP_OPTS[@]}" "$PDF_FILE" 2>&1 | while IFS= read -r line; do log DEBUG
fi
log INFO "Impression lancée avec succès!"
else
log INFO "Mode conversion uniquement (pas d'impression)"
fi
# Gestion du fichier PDF
if [ "$KEEP_PDF" = false ]; then

View File

@@ -66,37 +66,60 @@ show_print_options() {
fi
fi
# Dialogue zenity avec formulaire
local result=$(zenity --forms --title "Options d'impression MD_to_Print" \
# Dialogue zenity avec formulaire (forcer DISPLAY et mode synchrone)
echo "DEBUG show_print_options: Tentative d'affichage avec DISPLAY=${DISPLAY}" >> /tmp/md_to_print_debug.log
local result
# Utiliser dbus-launch si nécessaire pour les applications GUI depuis un contexte non-GUI
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] && command -v dbus-launch &> /dev/null; then
eval $(dbus-launch --sh-syntax)
fi
result=$(DISPLAY="${DISPLAY}" 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)
2>&1)
if [ $? -ne 0 ] || [ -z "$result" ]; then
return 1 # Utilisateur a annulé
local zenity_exit=$?
echo "DEBUG show_print_options: zenity_exit=$zenity_exit, result=$result" >> /tmp/md_to_print_debug.log
# Code 1 = utilisateur a annulé (normal)
# Code 0 = OK
# Autre = erreur
if [ $zenity_exit -eq 1 ]; then
# Utilisateur a annulé
echo "DEBUG: Utilisateur a annulé le dialogue" >> /tmp/md_to_print_debug.log
return 1
elif [ $zenity_exit -ne 0 ]; then
# Erreur d'exécution
echo "Erreur zenity (code $zenity_exit): $result" >> /tmp/md_to_print_zenity_error.log
echo "DEBUG: Erreur zenity (code $zenity_exit): $result" >> /tmp/md_to_print_debug.log
return 1
fi
if [ -z "$result" ]; then
echo "DEBUG: Résultat vide" >> /tmp/md_to_print_debug.log
return 1 # Pas de résultat
fi
echo "DEBUG: Dialogue réussi, résultat: $result" >> /tmp/md_to_print_debug.log
# 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=()
# Valider et formater les options (déclarer comme globale)
declare -ga PRINT_OPTS=()
if [ -n "$selected_printer" ] && [ "$selected_printer" != "Par défaut" ] && [ "$selected_printer" != "" ]; then
PRINT_OPTS+=(--printer "$selected_printer")
@@ -291,6 +314,45 @@ if [ ${#MD_FILES[@]} -gt 1 ]; then
fi
fi
# Afficher le dialogue d'options d'impression AVANT le traitement si action print et un seul fichier
# (doit être fait depuis l'hôte, pas dans Docker)
PRINT_OPTS=()
# S'assurer que DISPLAY est défini (nécessaire quand appelé depuis Caja Actions)
if [ -z "${DISPLAY:-}" ]; then
# Essayer de trouver DISPLAY depuis l'environnement utilisateur
if [ -f "$HOME/.Xauthority" ] && [ -S "/tmp/.X11-unix/X0" ]; then
export DISPLAY=":0"
elif [ -S "/tmp/.X11-unix/X0" ]; then
export DISPLAY=":0"
fi
# Dernière tentative : utiliser la valeur par défaut
if [ -z "${DISPLAY:-}" ]; then
export DISPLAY=":0"
fi
fi
# Logs de débogage
echo "DEBUG: ACTION=$ACTION" >> /tmp/md_to_print_debug.log
echo "DEBUG: DISPLAY=${DISPLAY:-}" >> /tmp/md_to_print_debug.log
echo "DEBUG: zenity disponible: $(command -v zenity 2>&1)" >> /tmp/md_to_print_debug.log
echo "DEBUG: Nombre de fichiers: ${#MD_FILES[@]}" >> /tmp/md_to_print_debug.log
# Afficher le dialogue d'options pour print ET preview (si un seul fichier)
if [ \( "$ACTION" = "print" -o "$ACTION" = "preview" \) ] && command -v zenity &> /dev/null && [ ${#MD_FILES[@]} -eq 1 ]; then
echo "DEBUG: Conditions remplies, tentative d'affichage du dialogue" >> /tmp/md_to_print_debug.log
# Toujours essayer d'afficher le dialogue pour print et preview
if show_print_options; then
echo "DEBUG: Dialogue OK, options: ${PRINT_OPTS[*]}" >> /tmp/md_to_print_debug.log
notify info "Options sélectionnées: ${PRINT_OPTS[*]}"
else
echo "DEBUG: Dialogue échoué ou annulé" >> /tmp/md_to_print_debug.log
notify info "Utilisation des options par défaut"
fi
else
echo "DEBUG: Conditions non remplies - ACTION=$ACTION, zenity=$(command -v zenity), fichiers=${#MD_FILES[@]}" >> /tmp/md_to_print_debug.log
fi
# Notification de début
notify info "Traitement de ${#MD_FILES[@]} fichier(s)..."
@@ -315,18 +377,15 @@ for file in "${MD_FILES[@]}"; do
if [ "$ACTION" = "convert" ]; then
docker_args+=(--convert-only)
elif [ "$ACTION" = "preview" ]; then
# Pour "preview", utiliser les options déjà récupérées avant la boucle
if [ ${#PRINT_OPTS[@]} -gt 0 ]; then
docker_args+=("${PRINT_OPTS[@]}")
fi
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
# Pour "print", utiliser les options déjà récupérées avant la boucle
if [ ${#PRINT_OPTS[@]} -gt 0 ]; 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)
@@ -344,6 +403,21 @@ for file in "${MD_FILES[@]}"; do
"${docker_args[@]}" \
> /tmp/md_to_print_docker.log 2>&1; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
# Pour preview, ouvrir le PDF depuis l'hôte après conversion
if [ "$ACTION" = "preview" ]; then
pdf_file="$output_dir/${file_base%.*}.pdf"
if [ -f "$pdf_file" ]; then
if command -v evince &> /dev/null; then
evince "$pdf_file" 2>/dev/null &
elif command -v xdg-open &> /dev/null; then
xdg-open "$pdf_file" 2>/dev/null &
else
notify warn "Aucun visualiseur PDF trouvé pour prévisualisation"
fi
fi
fi
notify success "$file_name traité"
else
ERROR_COUNT=$((ERROR_COUNT + 1))
@@ -363,16 +437,9 @@ for file in "${MD_FILES[@]}"; do
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
# Pour print, utiliser les options déjà récupérées avant la boucle
if [ ${#PRINT_OPTS[@]} -gt 0 ]; 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)
@@ -382,12 +449,40 @@ for file in "${MD_FILES[@]}"; do
cmd_args+=(--convert-only)
;;
preview)
# Pour preview, utiliser les options déjà récupérées avant la boucle
if [ ${#PRINT_OPTS[@]} -gt 0 ]; then
cmd_args+=("${PRINT_OPTS[@]}")
fi
cmd_args+=(--preview --keep-pdf)
;;
esac
if "$script_path" "${cmd_args[@]}" > /tmp/md_to_print.log 2>&1; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
# Pour preview, ouvrir le PDF depuis l'hôte après conversion
if [ "$ACTION" = "preview" ]; then
# Chercher le PDF dans le répertoire de sortie
pdf_file=""
if [ -f "${file%.*}.pdf" ]; then
pdf_file="${file%.*}.pdf"
elif [ -f "$HOME/MD_to_print_output/$(basename "${file%.*}.pdf")" ]; then
pdf_file="$HOME/MD_to_print_output/$(basename "${file%.*}.pdf")"
elif [ -f "./output/$(basename "${file%.*}.pdf")" ]; then
pdf_file="./output/$(basename "${file%.*}.pdf")"
fi
if [ -n "$pdf_file" ] && [ -f "$pdf_file" ]; then
if command -v evince &> /dev/null; then
evince "$pdf_file" 2>/dev/null &
elif command -v xdg-open &> /dev/null; then
xdg-open "$pdf_file" 2>/dev/null &
else
notify warn "Aucun visualiseur PDF trouvé pour prévisualisation"
fi
fi
fi
notify success "$file_name traité"
else
ERROR_COUNT=$((ERROR_COUNT + 1))

46
scripts/md_to_print_notify.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/bash
# Script utilitaire pour les notifications MD_to_Print
# Usage: md_to_print_notify.sh [level] [message]
set -euo pipefail
LEVEL="${1:-info}"
MESSAGE="${2:-}"
ICON=""
URGENCY="normal"
case "$LEVEL" in
info|INFO)
ICON="dialog-information"
URGENCY="low"
;;
success|SUCCESS)
ICON="dialog-information"
URGENCY="normal"
;;
warning|WARN)
ICON="dialog-warning"
URGENCY="normal"
;;
error|ERROR)
ICON="dialog-error"
URGENCY="critical"
;;
*)
ICON="dialog-information"
URGENCY="normal"
;;
esac
if [ -z "$MESSAGE" ]; then
echo "Usage: $0 [level] [message]"
exit 1
fi
if command -v notify-send &> /dev/null; then
notify-send -u "$URGENCY" -i "$ICON" "MD_to_Print" "$MESSAGE" 2>/dev/null || true
else
echo "[$LEVEL] $MESSAGE" >&2
fi