Compare commits

..

4 Commits

Author SHA1 Message Date
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
10 changed files with 689 additions and 99 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"]

171
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 |
@@ -194,19 +331,27 @@ verbose=false
```
MD_to_print/
├── md_to_print.sh # Script principal
├── config.example.conf # Fichier de configuration exemple
├── Dockerfile # Configuration Docker
├── docker-compose.yml # Configuration Docker Compose
├── docker_run.sh # Wrapper Docker
├── Makefile # Commandes Make
├── .dockerignore # Fichiers à exclure du build Docker
├── .gitignore # Fichiers à ignorer dans Git
├── README.md # Documentation (ce fichier)
├── CHANGELOG.md # Historique des versions
├── documents/ # Fichiers Markdown sources
├── output/ # PDFs générés
└── logs/ # Fichiers de logs
├── md_to_print.sh # Script principal
├── config.example.conf # Fichier de configuration exemple
├── Dockerfile # Configuration Docker
├── 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)
├── CHANGELOG.md # Historique des versions
├── documents/ # Fichiers Markdown sources
├── output/ # PDFs générés
└── logs/ # Fichiers de logs
```
## Exemples d'utilisation

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=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
show_help
exit 0
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,25 +85,13 @@ if ! command -v docker &> /dev/null; then
exit 1
fi
# Vérifier que le fichier existe
if [ ! -f "$MD_FILE" ]; then
echo -e "${RED}Erreur: Le fichier '$MD_FILE' n'existe pas${NC}"
exit 2
fi
# Obtenir le chemin absolu du fichier
MD_FILE_ABS="$(realpath "$MD_FILE")"
MD_DIR="$(dirname "$MD_FILE_ABS")"
MD_NAME="$(basename "$MD_FILE_ABS")"
# Vérifier que le fichier est dans le répertoire documents ou un sous-répertoire
if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then
echo -e "${YELLOW}Attention: Le fichier n'est pas dans le répertoire documents/${NC}"
echo -e "${BLUE}Le fichier sera accessible via le montage du répertoire parent${NC}"
MD_REL_PATH="$(realpath --relative-to="$SCRIPT_DIR" "$MD_FILE_ABS")"
MD_DIR="$SCRIPT_DIR"
MD_NAME="$MD_REL_PATH"
fi
# 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"
@@ -82,49 +103,116 @@ if ! docker images md-to-print:latest --format "{{.Repository}}:{{.Tag}}" | grep
docker build -t md-to-print:latest .
fi
# Construire la commande Docker
DOCKER_CMD=(
docker run
--rm
-it
-v "$SCRIPT_DIR/documents:/workspace/documents:ro"
-v "$SCRIPT_DIR/output:/workspace/output"
-v "$SCRIPT_DIR/logs:/workspace/logs"
--network host
)
# Ajouter le support X11 si DISPLAY est défini (pour prévisualisation)
if [ -n "${DISPLAY:-}" ]; then
DOCKER_CMD+=(
-e DISPLAY="$DISPLAY"
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
# 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")"
MD_DIR="$(dirname "$MD_FILE_ABS")"
MD_NAME="$(basename "$MD_FILE_ABS")"
# Vérifier que le fichier est dans le répertoire documents ou un sous-répertoire
if [[ ! "$MD_DIR" =~ ^"$SCRIPT_DIR"/documents ]]; then
echo -e "${YELLOW}Attention: Le fichier n'est pas dans le répertoire documents/${NC}"
echo -e "${BLUE}Le fichier sera accessible via le montage du répertoire parent${NC}"
MD_REL_PATH="$(realpath --relative-to="$SCRIPT_DIR" "$MD_FILE_ABS")"
MD_DIR="$SCRIPT_DIR"
MD_NAME="$MD_REL_PATH"
fi
# 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
# 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
)
fi
# 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"
--network host
)
# Ajouter le support X11 si DISPLAY est défini (pour prévisualisation)
if [ -n "${DISPLAY:-}" ]; then
DOCKER_CMD+=(
-e DISPLAY="$DISPLAY"
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
)
fi
# Ajouter l'accès CUPS si disponible
if [ -d "/var/run/cups" ]; then
DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro)
fi
DOCKER_CMD+=(md-to-print:latest)
# 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
for opt in "${FILE_OPTIONS[@]}"; do
DOCKER_CMD+=("$opt")
done
# Exécuter
echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}"
echo ""
if ! "${DOCKER_CMD[@]}"; then
echo -e "${RED}Erreur lors du traitement de $MD_FILE${NC}"
return 1
fi
return 0
}
# Ajouter l'accès CUPS si disponible
if [ -d "/var/run/cups" ]; then
DOCKER_CMD+=(-v /var/run/cups:/var/run/cups:ro)
fi
DOCKER_CMD+=(md-to-print:latest)
# Ajouter le fichier markdown et les options
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")
# 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
# Exécuter
echo -e "${GREEN}Exécution dans Docker...${NC}"
echo -e "${BLUE}Commande: ${DOCKER_CMD[*]}${NC}"
echo ""
exec "${DOCKER_CMD[@]}"
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"
@@ -629,28 +636,32 @@ case "$DUPLEX" in
;;
esac
# Impression
log INFO "=== Impression ==="
log INFO "Options:"
log INFO " - Copies: $COPIES"
log INFO " - Taille: $SIZE"
log INFO " - Orientation: $ORIENTATION"
log INFO " - Qualité: $QUALITY"
log INFO " - Couleur: $([ "$COLOR" = true ] && echo "Oui" || echo "Non")"
log INFO " - Recto-verso: $DUPLEX"
[ -n "$PAGES" ] && log INFO " - Pages: $PAGES"
[ -n "$PRINTER" ] && log INFO " - Imprimante: $PRINTER"
# Impression (sauf si --convert-only)
if [ "$CONVERT_ONLY" = false ]; then
log INFO "=== Impression ==="
log INFO "Options:"
log INFO " - Copies: $COPIES"
log INFO " - Taille: $SIZE"
log INFO " - Orientation: $ORIENTATION"
log INFO " - Qualité: $QUALITY"
log INFO " - Couleur: $([ "$COLOR" = true ] && echo "Oui" || echo "Non")"
log INFO " - Recto-verso: $DUPLEX"
[ -n "$PAGES" ] && log INFO " - Pages: $PAGES"
[ -n "$PRINTER" ] && log INFO " - Imprimante: $PRINTER"
log DEBUG "Exécution: lp ${LP_OPTS[*]} $PDF_FILE"
log DEBUG "Exécution: lp ${LP_OPTS[*]} $PDF_FILE"
if ! lp "${LP_OPTS[@]}" "$PDF_FILE" 2>&1 | while IFS= read -r line; do log DEBUG "$line"; done; then
log ERROR "Erreur lors de l'impression"
log INFO "Le fichier PDF a été conservé: $PDF_FILE"
exit $EXIT_PRINT_ERROR
if ! lp "${LP_OPTS[@]}" "$PDF_FILE" 2>&1 | while IFS= read -r line; do log DEBUG "$line"; done; then
log ERROR "Erreur lors de l'impression"
log INFO "Le fichier PDF a été conservé: $PDF_FILE"
exit $EXIT_PRINT_ERROR
fi
log INFO "Impression lancée avec succès!"
else
log INFO "Mode conversion uniquement (pas d'impression)"
fi
log INFO "Impression lancée avec succès!"
# Gestion du fichier PDF
if [ "$KEEP_PDF" = false ]; then
read -p "Supprimer le fichier PDF temporaire? (o/N): " -n 1 -r