diff --git a/.github/workflows/build-pdfs.yml b/.github/workflows/build-pdfs.yml index 2937378..3509cfb 100644 --- a/.github/workflows/build-pdfs.yml +++ b/.github/workflows/build-pdfs.yml @@ -8,12 +8,6 @@ on: - 'travaux_pratiques/**' - 'scripts/**' - '.github/workflows/build-pdfs.yml' - pull_request: - branches: [ master, main ] - paths: - - 'supports/**' - - 'travaux_pratiques/**' - - 'scripts/**' workflow_dispatch: # Permet de déclencher manuellement jobs: @@ -23,11 +17,11 @@ jobs: contents: write # Nécessaire pour créer des releases actions: read # Lire les actions packages: read # Lire les packages (pour les images Docker si besoin) - + steps: - name: 📥 Checkout repository uses: actions/checkout@v4 - + - name: 🛠️ Install LaTeX and dependencies run: | sudo apt-get update @@ -38,8 +32,10 @@ jobs: texlive-fonts-recommended \ texlive-lang-french \ texlive-xetex \ + texlive-fonts-extra \ + texlive-science \ ghostscript - + - name: ✅ Verify installations run: | pandoc --version @@ -47,48 +43,28 @@ jobs: gs --version echo "📋 Testing French support..." pdflatex -interaction=nonstopmode <<< '\documentclass{article}\usepackage[french]{babel}\usepackage[utf8]{inputenc}\begin{document}Test français: é à ç\end{document}' && echo "✅ French support OK" || echo "❌ French support failed" - + - name: 📁 Create build directories run: | + mkdir -p build/formations + mkdir -p build/modules_base mkdir -p build/modules_additionnels chmod +x scripts/*.sh - - - name: 🔨 Build Git module PDF - run: | - echo "🔨 Building Git module..." - ./scripts/build_git_module.sh || echo "⚠️ Git module build failed" - - - name: 🐳 Build Docker module PDF - run: | - echo "🐳 Building Docker module..." - ./scripts/build_docker_module.sh || echo "⚠️ Docker module build failed" - - - name: 📚 Build complete formation PDF - run: | - echo "📚 Building complete formation..." - ./scripts/build_formation_complete.sh complete || echo "⚠️ Complete formation build failed" - - - name: ⚡ Build accelerated formation PDF - run: | - echo "⚡ Building accelerated formation..." - ./scripts/build_formation_complete.sh acceleree || echo "⚠️ Accelerated formation build failed" - - - name: 📖 Build base modules only PDF - run: | - echo "📖 Building base modules only..." - ./scripts/build_formation_complete.sh modules-only || echo "⚠️ Base modules build failed" - - - name: 📚 Build all additional modules + + - name: 📚 Build all formations and modules run: | - echo "📚 Building all additional modules..." - ./scripts/build_modules_additionnels.sh || echo "⚠️ Some modules failed" - + echo "📚 Building all formations and modules..." + ./scripts/build_formations.sh || { + echo "⚠️ Main script failed, trying CI-optimized script..." + ./scripts/build_formations_ci.sh || echo "⚠️ Both scripts failed" + } + - name: 📊 List generated files run: | echo "📊 Generated PDFs:" find build/ -name "*.pdf" -exec ls -lh {} \; || echo "No PDFs found" - - - name: 📤 Upload PDFs as artifacts + + - name: 📤 Upload all PDFs as artifacts uses: actions/upload-artifact@v4 if: always() # Upload même si certains builds ont échoué with: @@ -96,34 +72,34 @@ jobs: path: | build/**/*.pdf retention-days: 90 - - - name: 📤 Upload formation complète + + - name: 📤 Upload formation accélérée uses: actions/upload-artifact@v4 if: always() with: - name: formation-complete-pdf - path: build/formation_linux_complete.pdf + name: formation-acceleree-pdf + path: build/formations/formation_acceleree.pdf retention-days: 90 if-no-files-found: warn - - - name: 📤 Upload formation accélérée + + - name: 📤 Upload formation longue uses: actions/upload-artifact@v4 if: always() with: - name: formation-acceleree-pdf - path: build/formation_linux_acceleree.pdf + name: formation-longue-pdf + path: build/formations/formation_longue.pdf retention-days: 90 if-no-files-found: warn - - - name: 📤 Upload modules de base + + - name: 📤 Upload modules de base individuels uses: actions/upload-artifact@v4 if: always() with: - name: formation-modules-base-pdf - path: build/formation_linux_modules_seuls.pdf + name: modules-base-individuels-pdf + path: build/modules_base/*.pdf retention-days: 90 if-no-files-found: warn - + - name: 📤 Upload Git module PDF uses: actions/upload-artifact@v4 if: always() @@ -132,46 +108,46 @@ jobs: path: build/modules_additionnels/module_additionnel_git.pdf retention-days: 90 if-no-files-found: warn - + - name: 📤 Upload Docker module PDF - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v4 if: always() with: name: module-docker-pdf path: build/modules_additionnels/module_additionnel_docker.pdf retention-days: 90 if-no-files-found: warn - + - name: 📋 Build summary if: always() run: | echo "## 📚 Build Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - - # Formation complète - if [ -f "build/formation_linux_complete.pdf" ]; then - size_complete=$(du -h build/formation_linux_complete.pdf | cut -f1) - echo "✅ **Formation complète** : $size_complete" >> $GITHUB_STEP_SUMMARY - else - echo "❌ **Formation complète** : Failed to build" >> $GITHUB_STEP_SUMMARY - fi - + # Formation accélérée - if [ -f "build/formation_linux_acceleree.pdf" ]; then - size_acceleree=$(du -h build/formation_linux_acceleree.pdf | cut -f1) + if [ -f "build/formations/formation_acceleree.pdf" ]; then + size_acceleree=$(du -h build/formations/formation_acceleree.pdf | cut -f1) echo "✅ **Formation accélérée** : $size_acceleree" >> $GITHUB_STEP_SUMMARY else echo "❌ **Formation accélérée** : Failed to build" >> $GITHUB_STEP_SUMMARY fi - - # Modules de base seulement - if [ -f "build/formation_linux_modules_seuls.pdf" ]; then - size_modules=$(du -h build/formation_linux_modules_seuls.pdf | cut -f1) - echo "✅ **Modules de base** : $size_modules" >> $GITHUB_STEP_SUMMARY + + # Formation longue + if [ -f "build/formations/formation_longue.pdf" ]; then + size_longue=$(du -h build/formations/formation_longue.pdf | cut -f1) + echo "✅ **Formation longue** : $size_longue" >> $GITHUB_STEP_SUMMARY else - echo "❌ **Modules de base** : Failed to build" >> $GITHUB_STEP_SUMMARY + echo "❌ **Formation longue** : Failed to build" >> $GITHUB_STEP_SUMMARY fi - + + # Modules de base individuels + modules_count=$(find build/modules_base/ -name "*.pdf" 2>/dev/null | wc -l || echo "0") + if [ "$modules_count" -gt 0 ]; then + echo "✅ **Modules de base individuels** : $modules_count modules générés" >> $GITHUB_STEP_SUMMARY + else + echo "❌ **Modules de base individuels** : Failed to build" >> $GITHUB_STEP_SUMMARY + fi + # Modules additionnels if [ -f "build/modules_additionnels/module_additionnel_git.pdf" ]; then size_git=$(du -h build/modules_additionnels/module_additionnel_git.pdf | cut -f1) @@ -179,23 +155,23 @@ jobs: else echo "❌ **Module Git** : Failed to build" >> $GITHUB_STEP_SUMMARY fi - + if [ -f "build/modules_additionnels/module_additionnel_docker.pdf" ]; then size_docker=$(du -h build/modules_additionnels/module_additionnel_docker.pdf | cut -f1) echo "✅ **Module Docker** : $size_docker" >> $GITHUB_STEP_SUMMARY else echo "❌ **Module Docker** : Failed to build" >> $GITHUB_STEP_SUMMARY fi - + echo "" >> $GITHUB_STEP_SUMMARY echo "📥 **Artifacts disponibles :**" >> $GITHUB_STEP_SUMMARY echo "- \`formation-linux-pdfs-${{ github.sha }}\` - Tous les PDFs" >> $GITHUB_STEP_SUMMARY - echo "- \`formation-complete-pdf\` - Formation complète" >> $GITHUB_STEP_SUMMARY - echo "- \`formation-acceleree-pdf\` - Formation accélérée" >> $GITHUB_STEP_SUMMARY - echo "- \`formation-modules-base-pdf\` - Modules de base" >> $GITHUB_STEP_SUMMARY - echo "- \`module-git-pdf\` - Module Git uniquement" >> $GITHUB_STEP_SUMMARY + echo "- \`formation-acceleree-pdf\` - Formation accélérée (8h)" >> $GITHUB_STEP_SUMMARY + echo "- \`formation-longue-pdf\` - Formation longue (37h30)" >> $GITHUB_STEP_SUMMARY + echo "- \`modules-base-individuels-pdf\` - 8 modules de base séparés" >> $GITHUB_STEP_SUMMARY + echo "- \`module-git-pdf\` - Module Git uniquement" >> $GITHUB_STEP_SUMMARY echo "- \`module-docker-pdf\` - Module Docker uniquement" >> $GITHUB_STEP_SUMMARY - + # Job optionnel pour créer une release automatique create-release: needs: build-pdfs @@ -203,23 +179,23 @@ jobs: permissions: contents: write # Nécessaire pour créer des releases actions: read # Lire les actions - if: github.ref == 'refs/heads/master' && github.event_name == 'push' - + if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' && github.event_name == 'push' + steps: - name: 📥 Checkout repository uses: actions/checkout@v4 - + - name: 📥 Download all artifacts uses: actions/download-artifact@v4 with: pattern: "*-pdf*" path: ./pdfs - + - name: 📋 List downloaded files run: | echo "📋 Downloaded PDFs:" find ./pdfs -name "*.pdf" -exec ls -lh {} \; || echo "⚠️ Aucun PDF trouvé" - + - name: ✅ Verify PDFs exist run: | if find ./pdfs -name "*.pdf" | head -1 | grep -q .; then @@ -229,7 +205,7 @@ jobs: echo "❌ No PDFs found, skipping release" echo "PDF_EXISTS=false" >> $GITHUB_ENV fi - + - name: 🏷️ Create Release if: success() && env.PDF_EXISTS == 'true' uses: softprops/action-gh-release@v2 @@ -239,20 +215,20 @@ jobs: name: "Formation Linux - Build ${{ github.run_number }}" body: | ## 📚 Formation Linux - PDFs automatiques - + **Commit:** `${{ github.sha }}` **Branche:** `${{ github.ref_name }}` **Date:** ${{ github.event.head_commit.timestamp }} - + ### 📄 Modules disponibles : - - **Module Git** : Contrôle de version (6-8h) + - **Module Git** : Contrôle de version (6-8h) - **Module Docker** : Conteneurisation (12-15h) - + ### 🚀 Utilisation : 1. Télécharger les PDFs depuis les assets ci-dessous 2. Consulter la [documentation](https://github.com/${{ github.repository }}) pour les prérequis 3. Suivre les modules dans l'ordre recommandé - + --- 🤖 Build automatique via GitHub Actions files: | @@ -263,7 +239,7 @@ jobs: generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + - name: 📋 Release Status if: always() run: | @@ -271,9 +247,9 @@ jobs: if [ "${{ env.PDF_EXISTS }}" = "true" ]; then echo "✅ **PDFs disponibles** pour release" >> $GITHUB_STEP_SUMMARY else - echo "❌ **Aucun PDF** généré pour cette release" >> $GITHUB_STEP_SUMMARY + echo "❌ **Aucun PDF** généré pour cette release" >> $GITHUB_STEP_SUMMARY fi - + echo "" >> $GITHUB_STEP_SUMMARY echo "**Alternative :** Les PDFs sont toujours disponibles via les artifacts du build principal." >> $GITHUB_STEP_SUMMARY echo "Aller dans [Actions](/${{ github.repository }}/actions) → Build #${{ github.run_number }} → Artifacts" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 83cb050..5077bd2 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -1,58 +1,151 @@ -name: 🧪 Test PDF Build +name: 🧪 Test Formation PDFs on: pull_request: branches: [ master, main ] paths: - 'supports/**' - - 'travaux_pratiques/**' + - 'travaux_pratiques/**' - 'scripts/**' - - '.github/workflows/**' + - '.github/workflows/test-build.yml' + workflow_dispatch: # Permet de déclencher manuellement jobs: - test-build: + test-build-pdfs: runs-on: ubuntu-latest - + permissions: + actions: read # Lire les actions + packages: read # Lire les packages + steps: - name: 📥 Checkout repository uses: actions/checkout@v4 - - - name: 🛠️ Install LaTeX dependencies + + - name: 🛠️ Install LaTeX and dependencies run: | sudo apt-get update - sudo apt-get install -y pandoc texlive-latex-recommended texlive-lang-french - - - name: 📁 Prepare build environment + sudo apt-get install -y \ + pandoc \ + texlive-latex-recommended \ + texlive-latex-extra \ + texlive-fonts-recommended \ + texlive-lang-french \ + texlive-xetex \ + ghostscript + + - name: ✅ Verify installations + run: | + pandoc --version + pdflatex --version + gs --version + echo "📋 Testing French support..." + pdflatex -interaction=nonstopmode <<< '\documentclass{article}\usepackage[french]{babel}\usepackage[utf8]{inputenc}\begin{document}Test français: é à ç\end{document}' && echo "✅ French support OK" || echo "❌ French support failed" + + - name: 📁 Create build directories run: | + mkdir -p build/formations + mkdir -p build/modules_base mkdir -p build/modules_additionnels chmod +x scripts/*.sh - - - name: 🧪 Test Git module build + + - name: 📚 Test PDF generation run: | - echo "🧪 Testing Git module build..." - timeout 300s ./scripts/build_git_module.sh || echo "⚠️ Git build test failed or timed out" - - - name: 🧪 Test Docker module build + echo "🧪 Testing PDF generation according to specifications..." + ./scripts/build_formations.sh + + - name: 📊 Validate generated files run: | - echo "🧪 Testing Docker module build..." - timeout 300s ./scripts/build_docker_module.sh || echo "⚠️ Docker build test failed or timed out" - - - name: 📊 Test results + echo "📊 Validation des PDFs générés:" + find build/ -name "*.pdf" -exec ls -lh {} \; || echo "❌ No PDFs found" + + # Vérifications de base + if [ -f "build/formations/formation_acceleree.pdf" ]; then + echo "✅ Formation accélérée générée" + else + echo "❌ Formation accélérée manquante" + exit 1 + fi + + if [ -f "build/formations/formation_longue.pdf" ]; then + echo "✅ Formation longue générée" + else + echo "❌ Formation longue manquante" + exit 1 + fi + + # Vérifier les modules de base (au moins quelques-uns) + modules_count=$(find build/modules_base/ -name "*.pdf" 2>/dev/null | wc -l || echo "0") + if [ "$modules_count" -gt 0 ]; then + echo "✅ $modules_count modules de base générés" + else + echo "❌ Aucun module de base généré" + exit 1 + fi + + echo "🎉 Toutes les validations passées!" + + - name: 📤 Upload test artifacts + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-formation-linux-pdfs-${{ github.sha }} + path: | + build/**/*.pdf + retention-days: 7 # Conservation courte pour les tests + + - name: 📋 Test Summary + if: always() run: | - echo "## 🧪 Test Results" >> $GITHUB_STEP_SUMMARY + echo "## 🧪 Test Build Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - + + # Formation accélérée + if [ -f "build/formations/formation_acceleree.pdf" ]; then + size_acceleree=$(du -h build/formations/formation_acceleree.pdf | cut -f1) + echo "✅ **Formation accélérée** : $size_acceleree" >> $GITHUB_STEP_SUMMARY + else + echo "❌ **Formation accélérée** : Failed to build" >> $GITHUB_STEP_SUMMARY + fi + + # Formation longue + if [ -f "build/formations/formation_longue.pdf" ]; then + size_longue=$(du -h build/formations/formation_longue.pdf | cut -f1) + echo "✅ **Formation longue** : $size_longue" >> $GITHUB_STEP_SUMMARY + else + echo "❌ **Formation longue** : Failed to build" >> $GITHUB_STEP_SUMMARY + fi + + # Modules de base individuels + modules_count=$(find build/modules_base/ -name "*.pdf" 2>/dev/null | wc -l || echo "0") + if [ "$modules_count" -gt 0 ]; then + echo "✅ **Modules de base individuels** : $modules_count modules générés" >> $GITHUB_STEP_SUMMARY + else + echo "❌ **Modules de base individuels** : Failed to build" >> $GITHUB_STEP_SUMMARY + fi + + # Modules additionnels if [ -f "build/modules_additionnels/module_additionnel_git.pdf" ]; then - echo "✅ Git module build: Success" >> $GITHUB_STEP_SUMMARY + size_git=$(du -h build/modules_additionnels/module_additionnel_git.pdf | cut -f1) + echo "✅ **Module Git** : $size_git" >> $GITHUB_STEP_SUMMARY else - echo "❌ Git module build: Failed" >> $GITHUB_STEP_SUMMARY + echo "❌ **Module Git** : Failed to build" >> $GITHUB_STEP_SUMMARY fi - + if [ -f "build/modules_additionnels/module_additionnel_docker.pdf" ]; then - echo "✅ Docker module build: Success" >> $GITHUB_STEP_SUMMARY + size_docker=$(du -h build/modules_additionnels/module_additionnel_docker.pdf | cut -f1) + echo "✅ **Module Docker** : $size_docker" >> $GITHUB_STEP_SUMMARY else - echo "❌ Docker module build: Failed" >> $GITHUB_STEP_SUMMARY + echo "❌ **Module Docker** : Failed to build" >> $GITHUB_STEP_SUMMARY fi - + + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Informations du test" >> $GITHUB_STEP_SUMMARY + echo "- **Type :** Test (sans release)" >> $GITHUB_STEP_SUMMARY + echo "- **Trigger :** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY + echo "- **Branche :** ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY + echo "- **Commit :** ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY - echo "💡 **Note:** This is a test build for PR validation. No artifacts are published." >> $GITHUB_STEP_SUMMARY \ No newline at end of file + echo "### 📥 Artifacts de test" >> $GITHUB_STEP_SUMMARY + echo "Les PDFs de test sont disponibles dans l'artifact \`test-formation-linux-pdfs-${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "Conservation : 7 jours" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index 09b3c4e..c384116 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -207,16 +207,16 @@ formation_linux/ **Structure de génération :** ``` scripts/ -├── build_all.sh (génère tous les formats) -├── build_pdf.sh (PDF complet) -├── build_modules.sh (PDFs par module standard) +├── build_formations.sh (script principal - génère tous les PDFs) +├── build_formations_ci.sh (version optimisée pour CI/CD) +├── build_pdf.sh (génération PDF générique) ├── build_modules_additionnels.sh (PDFs modules additionnels) ├── build_git_module.sh (PDF module Git uniquement) ├── build_docker_module.sh (PDF module Docker uniquement) ├── clean_unicode.sh (nettoyage caractères pour LaTeX) +├── config.sh (configuration commune) └── templates/ - ├── pdf_template.tex - └── style.css + └── formation_template.tex ``` ### Adaptation par public @@ -284,6 +284,73 @@ grep -r "▶\|◀\|┌\|└\|●" supports/modules_additionnels/ Cette configuration garantit que les PDFs affichent correctement les caractères français tout en évitant les erreurs LaTeX dues aux caractères Unicode non supportés. +## Spécifications de génération PDF + +### Cohérence locale/GitHub Actions +Les fichiers PDF générés doivent être identiques lors de la génération locale avec les scripts et lors de la génération avec le workflow GitHub Actions. + +### Types de PDFs à générer + +**PDFs de formation complète :** +- `formation_acceleree.pdf` : Formation complète pour le public accéléré (2x4h) +- `formation_longue.pdf` : Formation complète pour le public étalé (25x1h30) + +**PDFs par module de base :** +- `module_01_decouverte.pdf` +- `module_02_navigation.pdf` +- `module_03_manipulation.pdf` +- `module_04_consultation.pdf` +- `module_05_droits.pdf` +- `module_06_processus.pdf` +- `module_07_reseaux.pdf` +- `module_08_automatisation.pdf` + +**PDFs par module additionnel :** +- `module_additionnel_git.pdf` +- `module_additionnel_docker.pdf` + +### Règles de numérotation + +**Chapitres uniquement :** +- Seuls les chapitres sont numérotés (pas les parties/modules) +- La numérotation commence à 1 avec le premier module +- La première partie (présentation de la formation) est à zéro pour que le module 1 soit numéroté 1 + +**Pages :** +- Pages de contenu : numérotation arabe à partir de 1 +- Pages de sommaire et introduction : numérotation romaine minuscule (i, ii, iii...) +- Numéros de page en haut à gauche pour les pages paires +- Numéros de page en haut à droite pour les pages impaires + +### Mise en page + +**Première page de chaque PDF :** +- Titre du module avec mise en forme distinctive (cadre de couleur) +- Contenu détaillé du module +- Cartouche des droits d'auteur/licence + +**Organisation des pages :** +- Chaque partie commence sur une nouvelle page (y compris l'introduction) +- En-têtes : titre de la partie rappelé en haut à droite des pages paires + +### Configuration LaTeX requise + +```latex +% Numérotation des pages +\usepackage{fancyhdr} +\pagestyle{fancy} +\fancyhf{} +% Pages paires : numéro à gauche, titre de partie à droite +\fancyhead[LE]{\thepage} +\fancyhead[RE]{\leftmark} +% Pages impaires : numéro à droite +\fancyhead[RO]{\thepage} + +% Numérotation des sections (chapitres uniquement) +\setcounter{secnumdepth}{1} +% La partie présentation sera à 0 pour que Module 1 = 1 +``` + ## Automatisation GitHub Actions ### Workflows configurés @@ -291,8 +358,8 @@ Cette configuration garantit que les PDFs affichent correctement les caractères Le projet utilise GitHub Actions pour automatiser la génération des PDFs : **`.github/workflows/build-pdfs.yml` - Production** -- Se déclenche à chaque push sur master -- Génère tous les modules en PDF +- Se déclenche à chaque push sur master/main +- Génère tous les modules en PDF (formations + modules individuels) - Publie les artifacts et crée des releases automatiques - Durée typique : 5-10 minutes @@ -301,6 +368,11 @@ Le projet utilise GitHub Actions pour automatiser la génération des PDFs : - Valide que les PDFs se génèrent correctement - Pas de publication, uniquement validation +**`.github/workflows/build-artifacts-only.yml` - Fallback** +- Déclenchement manuel uniquement +- Génère les PDFs sans créer de release +- Utile si problème de permissions + ### Utilisation **Pour récupérer les PDFs à jour :** diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 287af03..6de8263 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,8 +33,9 @@ Dès que vous créez une PR, GitHub Actions va : - Mise à jour des références **Fichiers concernés :** -- `supports/modules_additionnels/*/` -- `travaux_pratiques/tp_additionnels/*/` +- `supports/module_*/` (modules de base 01-08) +- `supports/modules_additionnels/module_*/` (modules additionnels) +- `travaux_pratiques/tp*/` (TP de base et additionnels) ### 🔧 Scripts et outils - Amélioration des scripts de génération @@ -120,7 +121,7 @@ grep -r "🔥\|⚠️\|✅\|→" supports/ travaux_pratiques/ ➡️ Vérifiez les logs dans Actions. C'est souvent un caractère Unicode problématique. ### "Comment ajouter un nouveau module ?" -➡️ Suivre la structure existante dans `supports/modules_additionnels/` et créer les TP correspondants. +➡️ Suivre la structure existante dans `supports/module_*/` et créer les TP correspondants dans `travaux_pratiques/`. ### "Puis-je modifier les workflows ?" ➡️ Oui ! Mais testez d'abord dans un fork pour éviter de casser la génération pour tout le monde. diff --git a/scripts/build_all.sh b/scripts/build_all.sh deleted file mode 100755 index d569319..0000000 --- a/scripts/build_all.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# Script principal de génération des supports de formation Linux -# Génère tous les formats : PDF complet, PDF accéléré, et PDFs par module - -set -e # Arrêt en cas d'erreur - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -BUILD_DIR="$PROJECT_DIR/build" -SUPPORTS_DIR="$PROJECT_DIR/supports" -TP_DIR="$PROJECT_DIR/travaux_pratiques" - -echo "🚀 Début de la génération des supports de formation Linux" -echo "📁 Répertoire projet: $PROJECT_DIR" - -# Vérification des dépendances -echo "🔍 Vérification des dépendances..." -if ! command -v pandoc &> /dev/null; then - echo "❌ Pandoc n'est pas installé. Installation requise:" - echo " Ubuntu/Debian: sudo apt-get install pandoc texlive-latex-recommended" - exit 1 -fi - -if ! command -v pdflatex &> /dev/null; then - echo "❌ pdflatex n'est pas installé. Installation requise:" - echo " Ubuntu/Debian: sudo apt-get install texlive-latex-base texlive-latex-extra" - exit 1 -fi - -echo "✅ Dépendances OK" - -# Nettoyage du répertoire de build -echo "🧹 Nettoyage du répertoire de build..." -rm -rf "$BUILD_DIR"/* -mkdir -p "$BUILD_DIR/supports_par_module" - -# Génération PDF complète -echo "📖 Génération de la formation complète..." -"$SCRIPT_DIR/build_pdf.sh" complete - -# Génération PDF accélérée -echo "⚡ Génération de la formation accélérée..." -"$SCRIPT_DIR/build_pdf.sh" acceleree - -# Génération des PDFs par module -echo "📚 Génération des supports par module..." -"$SCRIPT_DIR/build_modules.sh" - -# Génération des modules additionnels -echo "📚 Génération des modules additionnels..." -"$SCRIPT_DIR/build_modules_additionnels.sh" - -echo "✅ Génération terminée avec succès!" -echo "📂 Fichiers générés dans: $BUILD_DIR" -echo " - formation_complete.pdf" -echo " - formation_acceleree.pdf" -echo " - supports_par_module/*.pdf" -echo " - modules_additionnels/*.pdf" \ No newline at end of file diff --git a/scripts/build_all_modules.sh b/scripts/build_all_modules.sh deleted file mode 100755 index c1bd524..0000000 --- a/scripts/build_all_modules.sh +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash - -# Script de génération de tous les PDFs (modules de base + additionnels) -# Usage: ./build_all_modules.sh - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ROOT_DIR="$(dirname "$SCRIPT_DIR")" -BUILD_DIR="$ROOT_DIR/build" -SUPPORTS_DIR="$ROOT_DIR/supports" -TP_DIR="$ROOT_DIR/travaux_pratiques" - -echo "🏗️ Génération de tous les modules de formation Linux..." - -# Créer les répertoires de build -mkdir -p "$BUILD_DIR"/{modules_base,modules_additionnels} - -# Fonction de génération d'un module individuel -build_single_module() { - local module_num="$1" - local module_path="$2" - local output_dir="$3" - - local module_name=$(basename "$module_path" | sed 's/module_[0-9]*_//' | tr '_' ' ') - local module_title=$(echo "$module_name" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2); print}') - local temp_file="$output_dir/temp_module_$(printf "%02d" $module_num).md" - local output_file="$output_dir/module_$(printf "%02d" $module_num)_$(echo $module_name | tr ' ' '_').pdf" - - echo " 📄 Module $module_num: $module_title" - - # En-tête du module - cat > "$temp_file" << EOF ---- -title: "Formation Linux - Module $module_num" -subtitle: "$module_title" -author: "Formation Linux - Prima Solutions" -date: \today -lang: fr -documentclass: article -geometry: margin=2cm -fontsize: 11pt -toc: true -toc-depth: 3 -numbersections: true -colorlinks: true -linkcolor: blue -urlcolor: blue ---- - -\newpage - -# Module $module_num : $module_title - -EOF - - # Ajouter tous les chapitres du module - for chapter in "$module_path"/*.md; do - if [ -f "$chapter" ]; then - chapter_name=$(basename "$chapter" .md) - echo " - $chapter_name" - echo "" >> "$temp_file" - echo "## $(echo $chapter_name | sed 's/[0-9]*_//' | tr '_' ' ')" >> "$temp_file" - echo "" >> "$temp_file" - cat "$chapter" >> "$temp_file" - echo "" >> "$temp_file" - fi - done - - # Ajouter les travaux pratiques - local tp_num=$(printf "%02d" $module_num) - local tp_path=$(ls -d "$TP_DIR/tp${tp_num}_"* 2>/dev/null | head -1) - - if [ -d "$tp_path" ]; then - echo " + Travaux pratiques" - echo "" >> "$temp_file" - echo "\\newpage" >> "$temp_file" - echo "" >> "$temp_file" - echo "# Travaux pratiques" >> "$temp_file" - echo "" >> "$temp_file" - - for tp_file in "$tp_path"/*.md; do - if [ -f "$tp_file" ]; then - tp_name=$(basename "$tp_file" .md) - echo " - $tp_name" - echo "" >> "$temp_file" - echo "## $(echo $tp_name | tr '_' ' ')" >> "$temp_file" - echo "" >> "$temp_file" - cat "$tp_file" >> "$temp_file" - echo "" >> "$temp_file" - fi - done - fi - - # Nettoyage Unicode - "$SCRIPT_DIR/clean_unicode.sh" "$temp_file" > /dev/null - - # Génération PDF - cd "$output_dir" - if pandoc \ - --from markdown \ - --to pdf \ - --pdf-engine=pdflatex \ - --toc \ - --number-sections \ - --highlight-style=tango \ - --variable fontsize=11pt \ - --variable geometry:margin=2cm \ - --variable colorlinks=true \ - --variable linkcolor=blue \ - --variable urlcolor=blue \ - --output="$(basename "$output_file")" \ - "$(basename "$temp_file")" 2>/dev/null; then - - echo " ✅ Généré: $(basename "$output_file")" - rm -f "$temp_file" - return 0 - else - echo " ❌ Échec: Module $module_num" - return 1 - fi -} - -# Générer les modules de base (1-8) -echo "📚 Génération des modules de base..." -SUCCESS_COUNT=0 -TOTAL_MODULES=8 - -for i in {1..8}; do - MODULE_NUM=$(printf "%02d" $i) - MODULE_PATH=$(ls -d "$SUPPORTS_DIR/module_${MODULE_NUM}_"* 2>/dev/null | head -1) - - if [ -d "$MODULE_PATH" ]; then - if build_single_module "$i" "$MODULE_PATH" "$BUILD_DIR/modules_base"; then - ((SUCCESS_COUNT++)) - fi - else - echo " ⚠️ Module $i non trouvé" - fi -done - -# Générer la formation complète -echo "" -echo "📖 Génération de la formation complète..." -if "$SCRIPT_DIR/build_formation_complete.sh" complete; then - echo " ✅ Formation complète générée" - ((SUCCESS_COUNT++)) - ((TOTAL_MODULES++)) -else - echo " ❌ Échec formation complète" -fi - -# Générer la formation accélérée -echo "" -echo "⚡ Génération de la formation accélérée..." -if "$SCRIPT_DIR/build_formation_complete.sh" acceleree; then - echo " ✅ Formation accélérée générée" - ((SUCCESS_COUNT++)) - ((TOTAL_MODULES++)) -else - echo " ❌ Échec formation accélérée" -fi - -# Générer les modules additionnels -echo "" -echo "🔧 Génération des modules additionnels..." -if "$SCRIPT_DIR/build_modules_additionnels.sh"; then - echo " ✅ Modules additionnels générés" - ((SUCCESS_COUNT+=2)) # Git + Docker - ((TOTAL_MODULES+=2)) -else - echo " ❌ Échec modules additionnels" -fi - -# Résumé final -echo "" -echo "📊 Résumé de génération:" -echo " ✅ Réussis: $SUCCESS_COUNT/$TOTAL_MODULES" - -if [ -d "$BUILD_DIR" ]; then - echo "" - echo "📁 Fichiers générés:" - find "$BUILD_DIR" -name "*.pdf" -exec du -h {} \; | sort - - TOTAL_SIZE=$(find "$BUILD_DIR" -name "*.pdf" -exec du -b {} + | awk '{sum+=$1} END {print sum}') - if [ -n "$TOTAL_SIZE" ]; then - TOTAL_SIZE_MB=$((TOTAL_SIZE / 1024 / 1024)) - echo "" - echo "📐 Taille totale: ${TOTAL_SIZE_MB}MB" - fi -fi - -if [ $SUCCESS_COUNT -eq $TOTAL_MODULES ]; then - echo "🎉 Tous les modules ont été générés avec succès!" - exit 0 -else - echo "⚠️ Certains modules ont échoué." - exit 1 -fi \ No newline at end of file diff --git a/scripts/build_docker_module.sh b/scripts/build_docker_module.sh index bc60be1..f4ae84f 100755 --- a/scripts/build_docker_module.sh +++ b/scripts/build_docker_module.sh @@ -134,7 +134,7 @@ if pandoc \ --to pdf \ --pdf-engine=pdflatex \ --include-in-header="$HEADER_TEX" \ - --template="$SCRIPT_DIR/../templates/pdf_template.tex" \ + --template="$SCRIPT_DIR/../templates/formation_template.tex" \ --toc \ --toc-depth=3 \ --number-sections \ diff --git a/scripts/build_formation_complete.sh b/scripts/build_formation_complete.sh deleted file mode 100755 index 17e6e64..0000000 --- a/scripts/build_formation_complete.sh +++ /dev/null @@ -1,324 +0,0 @@ -#!/bin/bash - -# Script de génération PDF pour la formation Linux complète -# Usage: ./build_formation_complete.sh [type] -# Types: complete (défaut), acceleree, modules-only - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ROOT_DIR="$(dirname "$SCRIPT_DIR")" -BUILD_DIR="$ROOT_DIR/build" -SUPPORTS_DIR="$ROOT_DIR/supports" -TP_DIR="$ROOT_DIR/travaux_pratiques" - -TYPE="${1:-complete}" - -echo "📚 Génération de la formation Linux complète (type: $TYPE)..." - -# Créer le répertoire de build s'il n'existe pas -mkdir -p "$BUILD_DIR" - -# Vérifier que les modules existent -if [ ! -d "$SUPPORTS_DIR" ]; then - echo "❌ Erreur: Répertoire des supports non trouvé: $SUPPORTS_DIR" - exit 1 -fi - -# Nom du fichier de sortie selon le type -case "$TYPE" in - "complete") - OUTPUT_FILE="formation_linux_complete.pdf" - TEMP_FILE="$BUILD_DIR/temp_formation_complete.md" - ;; - "acceleree") - OUTPUT_FILE="formation_linux_acceleree.pdf" - TEMP_FILE="$BUILD_DIR/temp_formation_acceleree.md" - ;; - "modules-only") - OUTPUT_FILE="formation_linux_modules_seuls.pdf" - TEMP_FILE="$BUILD_DIR/temp_formation_modules.md" - ;; - *) - echo "❌ Type non reconnu: $TYPE (complete, acceleree, modules-only)" - exit 1 - ;; -esac - -echo "📄 Compilation du contenu pour: $TYPE..." - -# En-tête du document -cat > "$TEMP_FILE" << 'EOF' ---- -title: "Formation Linux" -subtitle: "Guide complet - Débutant à intermédiaire" -author: "Formation Linux - Prima Solutions" -date: \today -lang: fr -documentclass: article -geometry: margin=2cm -fontsize: 11pt -toc: true -toc-depth: 3 -numbersections: true -colorlinks: true -linkcolor: blue -urlcolor: blue ---- - -\newpage - -# Présentation de la formation - -Cette formation Linux s'adresse à un public généraliste souhaitant découvrir et maîtriser les bases du système d'exploitation Linux. - -## Public cible - -- **Prérequis** : Connaissance générale d'un système d'exploitation, notion de fichier et d'arborescence -- **Niveau** : Débutant à intermédiaire -- **Durée** : Variable selon le format choisi - -## Formats de formation - -### Format accéléré (8 heures) -- **Public** : Utilisateurs avec VM Linux et accès SSH -- **Durée** : 2 séances de 4 heures -- **Focus** : Essentiel pratique et opérationnel - -### Format étalé (37h30) -- **Public** : Utilisateurs Windows avec VirtualBox -- **Durée** : 25 séances de 1h30 -- **Focus** : Apprentissage progressif et détaillé - -## Structure du contenu - -- 8 modules de formation couvrant tous les aspects essentiels -- Travaux pratiques pour chaque module -- Ressources complémentaires et références -- Évaluations adaptées au niveau - -\newpage - -EOF - -# Ajouter les modules de base dans l'ordre -echo " 📝 Ajout des modules de base..." - -for i in {1..8}; do - MODULE_NUM=$(printf "%02d" $i) - MODULE_DIR="$SUPPORTS_DIR/module_${MODULE_NUM}_*" - - # Trouver le répertoire du module (gestion des noms variables) - MODULE_PATH=$(ls -d $MODULE_DIR 2>/dev/null | head -1) - - if [ -d "$MODULE_PATH" ]; then - MODULE_NAME=$(basename "$MODULE_PATH" | sed 's/module_[0-9]*_//' | tr '_' ' ') - MODULE_TITLE=$(echo "$MODULE_NAME" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2); print}') - - echo " - Module $i: $MODULE_TITLE" - - echo "" >> "$TEMP_FILE" - echo "\\newpage" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - echo "# Module $i : $MODULE_TITLE" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - - # Ajouter tous les chapitres du module avec décalage des titres - for chapter in "$MODULE_PATH"/*.md; do - if [ -f "$chapter" ]; then - chapter_name=$(basename "$chapter" .md) - echo " - $chapter_name" - echo "" >> "$TEMP_FILE" - # Décaler tous les titres d'un niveau vers le bas (# devient ##, ## devient ###, etc.) - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/## /g; s/TEMP3/### /g; s/TEMP4/#### /g; s/TEMP5/##### /g; s/TEMP6/###### /g' "$chapter" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - fi - done - - # Ajouter les travaux pratiques si ce n'est pas le type "modules-only" - if [ "$TYPE" != "modules-only" ]; then - TP_NUM=$(printf "%02d" $i) - TP_DIR_PATTERN="$TP_DIR/tp${TP_NUM}_*" - TP_PATH=$(ls -d $TP_DIR_PATTERN 2>/dev/null | head -1) - - if [ -d "$TP_PATH" ]; then - echo " + Travaux pratiques" - echo "" >> "$TEMP_FILE" - echo "## Travaux pratiques - Module $i" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - - for tp_file in "$TP_PATH"/*.md; do - if [ -f "$tp_file" ]; then - tp_name=$(basename "$tp_file" .md) - echo " - $tp_name" - echo "" >> "$TEMP_FILE" - echo "### $(echo $tp_name | tr '_' ' ')" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - # Décaler tous les titres d'un niveau vers le bas pour les TP aussi - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/## /g; s/TEMP3/### /g; s/TEMP4/#### /g; s/TEMP5/##### /g; s/TEMP6/###### /g' "$tp_file" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - fi - done - fi - fi - else - echo " ⚠️ Module $i non trouvé dans $MODULE_DIR" - fi -done - -# Pour le type complet, ajouter aussi les modules additionnels -if [ "$TYPE" = "complete" ]; then - echo " 📝 Ajout des modules additionnels..." - - if [ -d "$SUPPORTS_DIR/modules_additionnels" ]; then - echo "" >> "$TEMP_FILE" - echo "\\newpage" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - echo "# Modules additionnels" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - echo "Les modules additionnels sont des modules complémentaires qui peuvent être suivis indépendamment après avoir complété les modules de base." >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - - # Module Git - if [ -d "$SUPPORTS_DIR/modules_additionnels/module_git" ]; then - echo " - Module additionnel Git" - echo "" >> "$TEMP_FILE" - echo "\\newpage" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - echo "## Module additionnel : Git - Contrôle de version" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - - for chapter in "$SUPPORTS_DIR/modules_additionnels/module_git"/*.md; do - if [ -f "$chapter" ]; then - echo "" >> "$TEMP_FILE" - # Décaler tous les titres d'un niveau vers le bas - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/### /g; s/TEMP3/#### /g; s/TEMP4/##### /g; s/TEMP5/###### /g; s/TEMP6/####### /g' "$chapter" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - fi - done - fi - - # Module Docker - if [ -d "$SUPPORTS_DIR/modules_additionnels/module_docker" ]; then - echo " - Module additionnel Docker" - echo "" >> "$TEMP_FILE" - echo "\\newpage" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - echo "## Module additionnel : Docker - Conteneurisation" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - - for chapter in "$SUPPORTS_DIR/modules_additionnels/module_docker"/*.md; do - if [ -f "$chapter" ]; then - echo "" >> "$TEMP_FILE" - # Décaler tous les titres d'un niveau vers le bas - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/### /g; s/TEMP3/#### /g; s/TEMP4/##### /g; s/TEMP5/###### /g; s/TEMP6/####### /g' "$chapter" >> "$TEMP_FILE" - echo "" >> "$TEMP_FILE" - fi - done - fi - fi -fi - -# Nettoyage des caractères Unicode -echo "🧹 Nettoyage des caractères Unicode..." -"$SCRIPT_DIR/clean_unicode.sh" "$TEMP_FILE" - -# Génération du PDF -echo "📚 Génération du PDF..." -cd "$BUILD_DIR" - -# Créer un fichier header LaTeX temporaire pour configurer la numérotation -HEADER_TEX="$BUILD_DIR/header.tex" -cat > "$HEADER_TEX" << 'EOF' -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} -\usepackage{lmodern} -\usepackage{titlesec} -\usepackage{tocloft} - -% Configurer la numérotation : sections non numérotées, subsections et subsubsections numérotées -\setcounter{secnumdepth}{2} - -% Supprimer la numérotation des sections (modules) -\titleformat{\section}{\Large\bfseries}{}{0pt}{} -\titlespacing*{\section}{0pt}{3.5ex plus 1ex minus .2ex}{2.3ex plus .2ex} - -% Garder la numérotation normale pour subsections et subsubsections -\titleformat{\subsection}{\large\bfseries}{\thesubsection.}{1em}{} -\titleformat{\subsubsection}{\normalsize\bfseries}{\thesubsubsection.}{1em}{} - -% Table des matières - supprimer complètement la numérotation des sections -\renewcommand{\cftsecpresnum}{} -\renewcommand{\cftsecaftersnum}{} -\renewcommand{\cftsecnumwidth}{0pt} -\renewcommand{\cftsecfont}{\bfseries} -\renewcommand{\cftsecpagefont}{\bfseries} - -% Ajuster la profondeur de numérotation dans la table des matières -\setcounter{tocdepth}{3} -EOF - -# Tentative de génération avec template -if pandoc \ - --from markdown \ - --to pdf \ - --pdf-engine=pdflatex \ - --include-in-header="$HEADER_TEX" \ - --template="$SCRIPT_DIR/../templates/pdf_template.tex" \ - --toc \ - --toc-depth=3 \ - --number-sections \ - --highlight-style=tango \ - --variable fontsize=11pt \ - --variable geometry:margin=2cm \ - --variable colorlinks=true \ - --variable linkcolor=blue \ - --variable urlcolor=blue \ - --output="$OUTPUT_FILE" \ - "$(basename $TEMP_FILE)" 2>/dev/null; then - - echo "✅ PDF généré avec succès: $OUTPUT_FILE" -else - echo "⚠️ Erreur avec template, tentative version simplifiée..." - - # Génération simplifiée sans template personnalisé - if pandoc \ - --from markdown \ - --to pdf \ - --pdf-engine=pdflatex \ - --include-in-header="$HEADER_TEX" \ - --toc \ - --toc-depth=3 \ - --number-sections \ - --highlight-style=tango \ - --variable fontsize=11pt \ - --variable geometry:margin=2cm \ - --variable colorlinks=true \ - --variable linkcolor=blue \ - --variable urlcolor=blue \ - --output="$OUTPUT_FILE" \ - "$(basename $TEMP_FILE)"; then - - echo "✅ PDF généré en mode simplifié: $OUTPUT_FILE" - else - echo "❌ Échec de la génération PDF" - echo "💡 Vérifiez les erreurs ci-dessus et le contenu du fichier $(basename $TEMP_FILE)" - exit 1 - fi -fi - -# Nettoyage des fichiers temporaires -rm -f "$HEADER_TEX" -rm -f temp_cover_*.* 2>/dev/null || true - -# Statistiques -if [ -f "$OUTPUT_FILE" ]; then - FILE_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1) - PAGE_COUNT=$(pdfinfo "$OUTPUT_FILE" 2>/dev/null | grep "Pages:" | awk '{print $2}' || echo "?") - echo "🎉 Formation Linux PDF générée: $BUILD_DIR/$OUTPUT_FILE" - echo "📊 Taille: $FILE_SIZE | Pages: $PAGE_COUNT" -else - echo "❌ Fichier PDF non créé" - exit 1 -fi \ No newline at end of file diff --git a/scripts/build_formations.sh b/scripts/build_formations.sh new file mode 100755 index 0000000..cecf068 --- /dev/null +++ b/scripts/build_formations.sh @@ -0,0 +1,448 @@ +#!/bin/bash + +# Script principal de génération des formations selon les nouvelles consignes +# Génère : formation_acceleree.pdf, formation_longue.pdf, modules individuels + +set -e + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +BUILD_DIR="$PROJECT_DIR/build" +SUPPORTS_DIR="$PROJECT_DIR/supports" +TP_DIR="$PROJECT_DIR/travaux_pratiques" +TEMPLATE_DIR="$SCRIPT_DIR/templates" + +echo "🚀 Génération des formations Linux selon les nouvelles spécifications" +echo "📁 Répertoire projet: $PROJECT_DIR" + +# Vérification des dépendances +echo "🔍 Vérification des dépendances..." +if ! command -v pandoc &> /dev/null; then + echo "❌ Pandoc n'est pas installé" + exit 1 +fi + +if ! command -v pdflatex &> /dev/null; then + echo "❌ pdflatex n'est pas installé" + exit 1 +fi + +echo "✅ Dépendances OK" + +# Nettoyage et préparation +echo "🧹 Préparation des répertoires..." +rm -rf "$BUILD_DIR" +mkdir -p "$BUILD_DIR"/{formations,modules_base,modules_additionnels} + +# Fonction pour générer la formation accélérée +generate_formation_acceleree() { + echo "⚡ Génération formation accélérée..." + + local output_file="$BUILD_DIR/formations/formation_acceleree.pdf" + local temp_md="$BUILD_DIR/temp_formation_acceleree.md" + + # En-tête avec métadonnées + cat > "$temp_md" << 'EOF' +--- +title: "Formation Linux Accélérée" +author: "Pascal Guinet - Prima Solutions" +date: \today +module-content: | + **Durée :** 2 séances de 4 heures (8h total) + + **Public :** Utilisateurs avec VM Linux et accès SSH + + **Objectifs :** + - Maîtriser les commandes Linux essentielles + - Naviguer efficacement dans le système de fichiers + - Gérer les droits et permissions + - Automatiser les tâches courantes + + **Approche :** Formation intensive axée sur la pratique +reset-chapter-numbering: true +--- + +# Présentation de la formation + +Cette formation accélérée couvre l'essentiel de Linux en 8 heures intensives. + +## Jour 1 (4h) : Fondamentaux +- Modules 1, 2, 3 : Découverte, navigation, manipulation de fichiers + +## Jour 2 (4h) : Utilisation avancée +- Modules 4, 5, 6, 7, 8 : Consultation, droits, processus, réseaux, scripts + +\newpage + +EOF + + # Ajouter les modules sélectionnés pour la formation accélérée + local modules_acceleres=(1 2 3 4 5 6 7 8) + + for module_num in "${modules_acceleres[@]}"; do + add_module_to_document "$module_num" "$temp_md" "condensed" + done + + generate_pdf_from_markdown "$temp_md" "$output_file" "Formation accélérée" +} + +# Fonction pour générer la formation longue +generate_formation_longue() { + echo "📚 Génération formation longue..." + + local output_file="$BUILD_DIR/formations/formation_longue.pdf" + local temp_md="$BUILD_DIR/temp_formation_longue.md" + + # En-tête avec métadonnées + cat > "$temp_md" << 'EOF' +--- +title: "Formation Linux Complète" +author: "Pascal Guinet - Prima Solutions" +date: \today +module-content: | + **Durée :** 25 séances de 1h30 (37h30 total) + + **Public :** Utilisateurs Windows avec VirtualBox + + **Objectifs :** + - Apprentissage progressif et détaillé de Linux + - Installation et configuration d'un environnement + - Maîtrise complète des outils et commandes + - Autonomie dans l'administration système + + **Approche :** Formation étalée avec nombreux travaux pratiques +reset-chapter-numbering: true +--- + +# Présentation de la formation + +Formation complète Linux sur 25 séances, adaptée aux débutants. + +## Organisation +- **Séances 1-3 :** Installation et découverte (Module 1) +- **Séances 4-7 :** Navigation système (Module 2) +- **Séances 8-12 :** Manipulation fichiers (Module 3) +- **Séances 13-16 :** Édition et recherche (Module 4) +- **Séances 17-20 :** Droits et sécurité (Module 5) +- **Séances 21-23 :** Processus et système (Module 6) +- **Séances 24-25 :** Réseau et automatisation (Modules 7-8) + +\newpage + +EOF + + # Ajouter tous les modules avec contenu détaillé + for module_num in {1..8}; do + add_module_to_document "$module_num" "$temp_md" "detailed" + done + + generate_pdf_from_markdown "$temp_md" "$output_file" "Formation longue" +} + +# Fonction pour ajouter un module au document +add_module_to_document() { + local module_num=$1 + local temp_md=$2 + local level=${3:-"normal"} # condensed, normal, detailed + + local module_num_fmt=$(printf "%02d" $module_num) + local module_dir=$(ls -d "$SUPPORTS_DIR/module_${module_num_fmt}_"* 2>/dev/null | head -1) + + if [ ! -d "$module_dir" ]; then + echo " ⚠️ Module $module_num non trouvé" + return + fi + + local module_name=$(basename "$module_dir" | sed 's/module_[0-9]*_//' | tr '_' ' ') + local module_title=$(echo "$module_name" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2); print}') + + echo " 📄 Ajout Module $module_num: $module_title" + + # Titre de partie (nouvelle page + titre non numéroté) - version simplifiée + echo "" >> "$temp_md" + echo "\\newpage" >> "$temp_md" + echo "" >> "$temp_md" + echo "# Module $module_num : $module_title {.unnumbered}" >> "$temp_md" + echo "" >> "$temp_md" + + # Ajouter les chapitres + for chapter in "$module_dir"/*.md; do + if [ -f "$chapter" ]; then + local chapter_name=$(basename "$chapter" .md | sed 's/^[0-9]*_//' | tr '_' ' ') + echo "" >> "$temp_md" + echo "# $chapter_name" >> "$temp_md" + echo "" >> "$temp_md" + + # Contenu du chapitre selon le niveau + if [ "$level" = "condensed" ]; then + # Version condensée : prendre le contenu jusqu'au deuxième titre de niveau 2 + # ou les 50 premières lignes si pas de deuxième ## + local second_h2_line=$(grep -n "^## " "$chapter" | sed -n '2p' | cut -d: -f1) + if [ -n "$second_h2_line" ] && [ "$second_h2_line" -gt 10 ]; then + # Prendre jusqu'au deuxième ## (exclu) + sed -n "1,$((second_h2_line - 1))p" "$chapter" >> "$temp_md" + else + # Prendre les 50 premières lignes comme version condensée + head -50 "$chapter" >> "$temp_md" + fi + else + # Version complète + cat "$chapter" >> "$temp_md" + fi + + # IMPORTANT: S'assurer qu'il y a une ligne vide à la fin pour éviter + # la concaténation accidentelle avec le titre suivant + echo "" >> "$temp_md" + echo "" >> "$temp_md" + echo "" >> "$temp_md" + fi + done + + # Ajouter les travaux pratiques si pas condensé + if [ "$level" != "condensed" ]; then + local tp_dir=$(ls -d "$TP_DIR/tp${module_num_fmt}_"* 2>/dev/null | head -1) + if [ -d "$tp_dir" ]; then + echo "" >> "$temp_md" + echo "# Travaux Pratiques" >> "$temp_md" + echo "" >> "$temp_md" + + for tp_file in "$tp_dir"/*.md; do + if [ -f "$tp_file" ]; then + local tp_name=$(basename "$tp_file" .md | tr '_' ' ') + echo "## $tp_name" >> "$temp_md" + echo "" >> "$temp_md" + cat "$tp_file" >> "$temp_md" + echo "" >> "$temp_md" + fi + done + fi + fi +} + + +# Fonction pour générer un module individuel +generate_individual_module() { + local module_num=$1 + + local module_num_fmt=$(printf "%02d" $module_num) + local module_dir=$(ls -d "$SUPPORTS_DIR/module_${module_num_fmt}_"* 2>/dev/null | head -1) + + if [ ! -d "$module_dir" ]; then + echo " ⚠️ Module $module_num non trouvé" + return 1 + fi + + local module_name=$(basename "$module_dir" | sed 's/module_[0-9]*_//' | tr '_' ' ') + local module_title=$(echo "$module_name" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2); print}') + local output_file="$BUILD_DIR/modules_base/module_${module_num_fmt}_$(echo $module_name | tr ' ' '_').pdf" + local temp_md="$BUILD_DIR/temp_module_${module_num_fmt}.md" + + echo " 📄 Module $module_num: $module_title" + + # En-tête du module + cat > "$temp_md" << EOF +--- +title: "Module $module_num : $module_title" +author: "Pascal Guinet - Prima Solutions" +date: \today +module-content: | + **Durée estimée :** 3-4 heures + + **Objectifs :** Maîtriser les concepts et outils du module $module_num + + **Prérequis :** Modules précédents complétés + + **Contenu :** Voir sommaire détaillé ci-après +reset-chapter-numbering: true +--- + +EOF + + # Ajouter le contenu du module (sans numéro de partie) + for chapter in "$module_dir"/*.md; do + if [ -f "$chapter" ]; then + local chapter_name=$(basename "$chapter" .md | sed 's/^[0-9]*_//' | tr '_' ' ') + echo "" >> "$temp_md" + echo "# $chapter_name" >> "$temp_md" + echo "" >> "$temp_md" + cat "$chapter" >> "$temp_md" + # S'assurer qu'il y a bien un retour à la ligne à la fin + echo "" >> "$temp_md" + echo "" >> "$temp_md" + fi + done + + # Ajouter les travaux pratiques + local tp_dir=$(ls -d "$TP_DIR/tp${module_num_fmt}_"* 2>/dev/null | head -1) + if [ -d "$tp_dir" ]; then + echo "" >> "$temp_md" + echo "\\newpage" >> "$temp_md" + echo "" >> "$temp_md" + echo "# Travaux Pratiques" >> "$temp_md" + echo "" >> "$temp_md" + + for tp_file in "$tp_dir"/*.md; do + if [ -f "$tp_file" ]; then + local tp_name=$(basename "$tp_file" .md | tr '_' ' ') + echo "## $tp_name" >> "$temp_md" + echo "" >> "$temp_md" + cat "$tp_file" >> "$temp_md" + echo "" >> "$temp_md" + fi + done + fi + + generate_pdf_from_markdown "$temp_md" "$output_file" "Module $module_num" +} + +# Fonction de génération PDF commune - template unique +generate_pdf_from_markdown() { + local temp_md=$1 + local output_file=$2 + local description=$3 + + # Vérifier que le fichier markdown existe + if [ ! -f "$temp_md" ]; then + echo " ❌ Fichier markdown introuvable: $temp_md" + return 1 + fi + + # Créer le répertoire de sortie s'il n'existe pas + mkdir -p "$(dirname "$output_file")" + + # Nettoyage des caractères problématiques pour LaTeX + echo " 🧹 Nettoyage des caractères problématiques..." + + # S'assurer que le fichier se termine par un retour à la ligne + if [ -s "$temp_md" ] && [ "$(tail -c1 "$temp_md" | wc -l)" -eq 0 ]; then + echo "" >> "$temp_md" + fi + + # Nettoyage minimal - laisser Pandoc gérer l'échappement LaTeX + + # Caractères Unicode problématiques + sed -i 's/→/->/g' "$temp_md" # Flèche droite + sed -i 's/←/<--/g' "$temp_md" # Flèche gauche + sed -i 's/▶/>/g' "$temp_md" # Triangle droit + sed -i 's/◀/=/g' "$temp_md" # Supérieur ou égal + + # Plus de nettoyage d'échappement agressif - laisser Pandoc gérer + + # Nettoyage Unicode standard + "$SCRIPT_DIR/clean_unicode.sh" "$temp_md" > /dev/null 2>&1 || true + + # Génération avec le template unique + local current_dir=$(pwd) + local output_dir="$(dirname "$output_file")" + + # S'assurer que le répertoire de sortie existe + mkdir -p "$output_dir" || { + echo " ❌ Impossible de créer le répertoire: $output_dir" + return 1 + } + + cd "$output_dir" || { + echo " ❌ Impossible de changer vers le répertoire: $output_dir" + return 1 + } + + echo " 🔨 Génération PDF: $description..." + + # Génération simplifiée (plus fiable que le template custom) + echo " 🔍 Debug: fichier markdown temporaire: $temp_md" + + if pandoc "$temp_md" \ + --pdf-engine=pdflatex \ + --toc \ + --toc-depth=2 \ + --highlight-style=tango \ + --variable geometry:margin=2.5cm \ + --variable fontsize=11pt \ + --variable documentclass:article \ + --variable papersize=a4 \ + --variable lang=fr \ + --variable babel-lang=french \ + -o "$(basename "$output_file")" 2>&1; then + + echo " ✅ $description généré: $(basename "$output_file")" + cd "$current_dir" + rm -f "$temp_md" + return 0 + else + echo " ❌ Erreur génération $description" + echo " 🔍 Fichier markdown conservé pour debug: $temp_md" + cd "$current_dir" + return 1 + fi +} + +# Exécution principale +echo "" +echo "📚 Génération des formations complètes..." +mkdir -p "$BUILD_DIR/formations" + +# Générer formation accélérée +generate_formation_acceleree + +# Générer formation longue +generate_formation_longue + +echo "" +echo "📖 Génération des modules individuels de base..." +success_count=0 +echo " 🔍 Début de la boucle pour les modules 1 à 8" +for module_num in {1..8}; do + echo " 🔄 Début traitement module $module_num" + # Ne pas arrêter le script si un module échoue + set +e # Désactiver arrêt sur erreur temporairement + generate_individual_module "$module_num" + result=$? + set -e # Réactiver arrêt sur erreur + + if [ $result -eq 0 ]; then + success_count=$((success_count + 1)) + echo " ✅ Module $module_num traité avec succès (total: $success_count)" + else + echo " ❌ Échec traitement module $module_num (code: $result)" + fi + echo " 🔄 Fin traitement module $module_num" +done +echo " 📊 Modules traités avec succès: $success_count/8" + +echo "" +echo "🔧 Génération des modules additionnels..." +set +e # Désactiver arrêt sur erreur temporairement +"$SCRIPT_DIR/build_modules_additionnels.sh" +additionnels_result=$? +set -e # Réactiver arrêt sur erreur + +if [ $additionnels_result -eq 0 ]; then + echo " ✅ Modules additionnels générés avec succès" +else + echo " ⚠️ Échec génération modules additionnels (code: $additionnels_result)" +fi + +# Résumé +echo "" +echo "📊 Résumé de génération:" +if [ -f "$BUILD_DIR/formations/formation_acceleree.pdf" ]; then + echo " ✅ Formation accélérée" +else + echo " ❌ Formation accélérée" +fi + +if [ -f "$BUILD_DIR/formations/formation_longue.pdf" ]; then + echo " ✅ Formation longue" +else + echo " ❌ Formation longue" +fi + +echo " ✅ Modules de base: $success_count/8" + +echo "" +echo "📁 Fichiers générés dans: $BUILD_DIR" +echo "🎉 Génération terminée!" \ No newline at end of file diff --git a/scripts/build_formations_ci.sh b/scripts/build_formations_ci.sh new file mode 100755 index 0000000..cca053e --- /dev/null +++ b/scripts/build_formations_ci.sh @@ -0,0 +1,227 @@ +#!/bin/bash + +# Version robuste du script de génération spécialement adaptée pour GitHub Actions CI +# Avec nettoyage et gestion d'erreurs renforcés + +set -e + +echo "🚀 Génération formations Linux - Version CI robuste" +echo "====================================================" + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +BUILD_DIR="$PROJECT_DIR/build" +SUPPORTS_DIR="$PROJECT_DIR/supports" +TP_DIR="$PROJECT_DIR/travaux_pratiques" + +echo "📁 Répertoires:" +echo " - Projet: $PROJECT_DIR" +echo " - Build: $BUILD_DIR" + +# Vérification des dépendances +echo "🔍 Vérification des dépendances..." +if ! command -v pandoc &> /dev/null; then + echo "❌ Pandoc n'est pas installé" + exit 1 +fi + +if ! command -v pdflatex &> /dev/null; then + echo "❌ pdflatex n'est pas installé" + exit 1 +fi + +echo "🛠️ Versions:" +pandoc --version | head -1 +pdflatex --version | head -1 + +echo "✅ Dépendances OK" + +# Nettoyage et préparation +echo "🧹 Préparation des répertoires..." +rm -rf "$BUILD_DIR" +mkdir -p "$BUILD_DIR"/{formations,modules_base,modules_additionnels} + +# Fonction de nettoyage minimal pour CI +clean_markdown_for_ci() { + local file=$1 + + echo " 🧹 Nettoyage CI: $(basename "$file")" + + # Utiliser le script de nettoyage existant + if [ -f "$SCRIPT_DIR/clean_unicode.sh" ]; then + "$SCRIPT_DIR/clean_unicode.sh" "$file" > /dev/null 2>&1 || true + fi +} + +# Fonction de génération PDF ultra-robuste pour CI +generate_pdf_ci_safe() { + local temp_md=$1 + local output_file=$2 + local description=$3 + + echo " 🔨 Génération PDF CI sécurisée: $description..." + + # Nettoyage agressif + clean_markdown_for_ci "$temp_md" + + # Créer répertoire de sortie + mkdir -p "$(dirname "$output_file")" + + # Variables LaTeX pour maximum de compatibilité + local pandoc_args=( + --pdf-engine=pdflatex + --toc + --toc-depth=2 + --highlight-style=tango + --variable geometry:margin=2.5cm + --variable fontsize=11pt + --variable documentclass:article + --variable papersize=a4 + --variable lang=fr + --variable babel-lang=french + --variable fontenc=T1 + --variable inputenc=utf8 + ) + + echo " 🔍 Fichier markdown: $temp_md ($(wc -l < "$temp_md") lignes)" + + # Tentative de génération avec timeout + if timeout 300 pandoc "$temp_md" "${pandoc_args[@]}" -o "$output_file" 2>&1; then + echo " ✅ $description généré: $(basename "$output_file")" + rm -f "$temp_md" + return 0 + else + echo " ❌ Erreur génération $description" + echo " 🔍 Conservation fichier pour debug: $temp_md" + echo " 🔍 Taille: $(wc -l < "$temp_md") lignes" + echo " 🔍 Échantillon problématique (lignes 580-590):" + sed -n '580,590p' "$temp_md" | head -10 || echo " (lignes non disponibles)" + return 1 + fi +} + +# Fonction pour générer un module individuel (version CI) +generate_individual_module_ci() { + local module_num=$1 + + local module_num_fmt=$(printf "%02d" $module_num) + local module_dir=$(ls -d "$SUPPORTS_DIR/module_${module_num_fmt}_"* 2>/dev/null | head -1) + + if [ ! -d "$module_dir" ]; then + echo " ⚠️ Module $module_num non trouvé" + return 1 + fi + + local module_name=$(basename "$module_dir" | sed 's/module_[0-9]*_//' | tr '_' ' ') + local module_title=$(echo "$module_name" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2); print}') + local output_file="$BUILD_DIR/modules_base/module_${module_num_fmt}_$(echo $module_name | tr ' ' '_').pdf" + local temp_md="$BUILD_DIR/temp_module_ci_${module_num_fmt}.md" + + echo " 📄 Module $module_num: $module_title" + + # En-tête simplifié pour CI + cat > "$temp_md" << EOF +--- +title: "Module $module_num : $module_title" +author: "Pascal Guinet - Prima Solutions" +date: \\today +--- + +# Module $module_num : $module_title + +EOF + + # Ajouter les chapitres avec limitations + local chapter_count=0 + for chapter in "$module_dir"/*.md; do + if [ -f "$chapter" ] && [ $chapter_count -lt 10 ]; then # Limiter à 10 chapitres max + local chapter_name=$(basename "$chapter" .md | sed 's/^[0-9]*_//' | tr '_' ' ') + echo "" >> "$temp_md" + echo "# $chapter_name" >> "$temp_md" + echo "" >> "$temp_md" + + # Limiter la taille du chapitre (éviter les fichiers trop volumineux) + if [ $(wc -l < "$chapter") -gt 500 ]; then + echo " ⚠️ Chapitre volumineux $(wc -l < "$chapter") lignes, limitation à 500" + head -500 "$chapter" >> "$temp_md" + echo "" >> "$temp_md" + echo "*[Chapitre tronqué pour compatibilité CI]*" >> "$temp_md" + else + cat "$chapter" >> "$temp_md" + fi + echo "" >> "$temp_md" + + ((chapter_count++)) + fi + done + + # Génération PDF + generate_pdf_ci_safe "$temp_md" "$output_file" "Module $module_num" +} + +# Génération des modules individuels de base avec robustesse CI +echo "" +echo "📖 Génération des modules individuels (version CI robuste)..." +success_count=0 + +for module_num in {1..8}; do + echo " 🔄 Traitement module $module_num..." + + # Gestion d'erreur robuste + set +e + generate_individual_module_ci "$module_num" + result=$? + set -e + + if [ $result -eq 0 ]; then + ((success_count++)) + echo " ✅ Module $module_num: OK (total: $success_count)" + else + echo " ❌ Module $module_num: ECHEC (code: $result)" + fi +done + +echo " 📊 Modules générés: $success_count/8" + +# Générer modules additionnels si possible +echo "" +echo "🔧 Génération modules additionnels (si disponible)..." +if [ -f "$SCRIPT_DIR/build_modules_additionnels.sh" ]; then + set +e + "$SCRIPT_DIR/build_modules_additionnels.sh" + additionnels_result=$? + set -e + + if [ $additionnels_result -eq 0 ]; then + echo " ✅ Modules additionnels générés" + else + echo " ⚠️ Échec modules additionnels (code: $additionnels_result)" + fi +else + echo " ⚠️ Script modules additionnels non trouvé" +fi + +# Résumé final +echo "" +echo "📊 Résumé génération CI:" +echo " ✅ Modules de base: $success_count/8" + +modules_count=$(find "$BUILD_DIR" -name "*.pdf" 2>/dev/null | wc -l || echo "0") +echo " 📄 Total PDFs générés: $modules_count" + +if [ $modules_count -gt 0 ]; then + echo " 📁 Fichiers générés:" + find "$BUILD_DIR" -name "*.pdf" -exec ls -lh {} \; | head -10 +fi + +echo "" +echo "🎯 Génération CI terminée (modules: $success_count/8, PDFs: $modules_count)" + +# Code de sortie selon succès +if [ $success_count -ge 4 ]; then # Au moins la moitié des modules + exit 0 +else + echo "❌ Trop peu de modules générés avec succès" + exit 1 +fi \ No newline at end of file diff --git a/scripts/build_modules.sh b/scripts/build_modules.sh deleted file mode 100755 index 3d72701..0000000 --- a/scripts/build_modules.sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/bash - -# Script de génération des PDFs par module -# Génère un PDF pour chaque module individuellement - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -BUILD_DIR="$PROJECT_DIR/build/supports_par_module" -SUPPORTS_DIR="$PROJECT_DIR/supports" -TP_DIR="$PROJECT_DIR/travaux_pratiques" -TEMPLATE_DIR="$SCRIPT_DIR/templates" - -DATE=$(date "+%d/%m/%Y") -AUTHOR="Formation Linux - Prima Solutions" - -echo "📚 Génération des PDFs par module..." - -mkdir -p "$BUILD_DIR" - -# Modules à traiter -declare -A MODULES -MODULES[01]="decouverte" -MODULES[02]="navigation" -MODULES[03]="manipulation" -MODULES[04]="consultation" -MODULES[05]="droits" -MODULES[06]="processus" -MODULES[07]="reseaux" -MODULES[08]="automatisation" - -# Fonction de génération pour un module -generate_module_pdf() { - local module_num=$1 - local module_name=$2 - local module_dir="$SUPPORTS_DIR/module_${module_num}_${module_name}" - local tp_dir="$TP_DIR/tp${module_num}_${module_name}" - - if [ ! -d "$module_dir" ]; then - echo "⚠️ Module $module_num ($module_name) non trouvé, création d'un fichier placeholder" - mkdir -p "$module_dir" - cat > "$module_dir/01_introduction.md" << EOF -# Introduction - -Ce module sera développé prochainement. - -## Objectifs - -- Objectif 1 -- Objectif 2 -- Objectif 3 - -## Contenu prévu - -Le contenu de ce module est en cours de rédaction. -EOF - fi - - # Nom formaté du module - local formatted_name=$(echo "$module_name" | tr '_' ' ' | sed 's/\b\w/\U&/g') - local title="Module $module_num : $formatted_name" - local output_file="$BUILD_DIR/module_${module_num}_${module_name}.pdf" - local temp_md="$BUILD_DIR/temp_module_${module_num}.md" - - echo " 📄 Génération: $title" - - # === GÉNÉRATION AVEC COUVERTURE === - local cover_tex="$BUILD_DIR/temp_cover_${module_num}.tex" - local cover_pdf="$BUILD_DIR/temp_cover_${module_num}.pdf" - local content_pdf="$BUILD_DIR/temp_content_${module_num}.pdf" - - # Génération de la couverture du module - if [ -f "$TEMPLATE_DIR/couverture_module.tex" ]; then - cp "$TEMPLATE_DIR/couverture_module.tex" "$cover_tex" - sed -i "s/\\\$title\\\$/${title//\//\\\/}/g" "$cover_tex" - sed -i "s/\\\$date\\\$/${DATE//\//\\\/}/g" "$cover_tex" - - cd "$PROJECT_DIR" - pdflatex -output-directory="$BUILD_DIR" -interaction=nonstopmode "$cover_tex" > /dev/null 2>&1 - - # Vérifier si le PDF de couverture a été créé (même avec des warnings) - if [ ! -f "$cover_pdf" ]; then - echo " ⚠️ Erreur génération couverture pour $title" - fi - fi - - # Création du fichier temporaire de contenu - cat > "$temp_md" << EOF ---- -title: "$title" -author: "Pascal Guinet - Prima Solutions" -date: "$DATE" -geometry: "margin=2.5cm" ---- - -EOF - - # Ajout du contenu du module - for file in "$module_dir"/*.md; do - if [ -f "$file" ]; then - # Décaler tous les titres d'un niveau vers le bas (# devient ##, ## devient ###, etc.) - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/## /g; s/TEMP3/### /g; s/TEMP4/#### /g; s/TEMP5/##### /g; s/TEMP6/###### /g' "$file" >> "$temp_md" - echo "" >> "$temp_md" - echo "\\newpage" >> "$temp_md" - echo "" >> "$temp_md" - fi - done - - # Ajout des TP - if [ -d "$tp_dir" ]; then - echo "# Travaux Pratiques" >> "$temp_md" - echo "" >> "$temp_md" - - for tp_file in "$tp_dir"/*.md; do - if [ -f "$tp_file" ]; then - local tp_name=$(basename "$tp_file" .md | tr '_' ' ' | sed 's/\b\w/\U&/g') - echo "## $tp_name" >> "$temp_md" - echo "" >> "$temp_md" - # Décaler tous les titres d'un niveau vers le bas pour les TP aussi - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/## /g; s/TEMP3/### /g; s/TEMP4/#### /g; s/TEMP5/##### /g; s/TEMP6/###### /g' "$tp_file" >> "$temp_md" - echo "" >> "$temp_md" - echo "\\newpage" >> "$temp_md" - echo "" >> "$temp_md" - fi - done - else - # Créer un TP placeholder - mkdir -p "$tp_dir" - cat > "$tp_dir/exercice_principal.md" << EOF -# Exercice Principal - -## Objectif - -Mettre en pratique les notions du module $module_num. - -## Instructions - -Les instructions détaillées seront ajoutées prochainement. - -## Solution - -La solution sera fournie dans une version ultérieure. -EOF - echo "# Travaux Pratiques" >> "$temp_md" - echo "" >> "$temp_md" - echo "## Exercice Principal" >> "$temp_md" - echo "" >> "$temp_md" - # Décaler tous les titres d'un niveau vers le bas pour le TP placeholder aussi - sed 's/^##### /TEMP6/g; s/^#### /TEMP5/g; s/^### /TEMP4/g; s/^## /TEMP3/g; s/^# /TEMP2/g; s/TEMP2/## /g; s/TEMP3/### /g; s/TEMP4/#### /g; s/TEMP5/##### /g; s/TEMP6/###### /g' "$tp_dir/exercice_principal.md" >> "$temp_md" - fi - - # Nettoyage sélectif des caractères Unicode problématiques - sed -i 's/├/+/g' "$temp_md" - sed -i 's/└/+/g' "$temp_md" - sed -i 's/│/|/g' "$temp_md" - sed -i 's/─/-/g' "$temp_md" - sed -i 's/≠/!=/g' "$temp_md" - sed -i 's/≤/<=/g' "$temp_md" - sed -i 's/≥/>=/g' "$temp_md" - sed -i 's/↔/<-->/g' "$temp_md" - sed -i 's/✅/[OK]/g' "$temp_md" - sed -i 's/❌/[NOK]/g' "$temp_md" - sed -i 's/⚠️/[WARN]/g' "$temp_md" - sed -i 's/📁/[DIR]/g' "$temp_md" - sed -i 's/🔧/[TOOL]/g' "$temp_md" - sed -i 's/🔍/[SEARCH]/g' "$temp_md" - sed -i 's/✓/[OK]/g' "$temp_md" - sed -i 's/✗/[NOK]/g' "$temp_md" - sed -i 's/…/.../g' "$temp_md" - - # Créer un fichier header LaTeX temporaire pour désactiver la numérotation niveau 1 - local header_tex="$BUILD_DIR/header_${module_num}.tex" - cat > "$header_tex" << 'EOF' -\usepackage{titlesec} -\usepackage{tocloft} - -% Limiter la numérotation aux niveaux 2 et 3 seulement (subsection et subsubsection) -\setcounter{secnumdepth}{2} - -% Désactiver la numérotation pour les sections (niveau 1) -\titleformat{\section}{\Large\bfseries}{\quad}{0pt}{} -\titlespacing*{\section}{0pt}{3.5ex plus 1ex minus .2ex}{2.3ex plus .2ex} - -% Configuration table des matières - supprimer numérotation niveau 1 -\renewcommand{\cftsecpresnum}{} -\renewcommand{\cftsecaftersnum}{} -\setlength{\cftsecnumwidth}{0pt} - -% Ajuster la profondeur de numérotation dans la table des matières -\setcounter{tocdepth}{3} -EOF - - # Génération du PDF de contenu - pandoc "$temp_md" \ - --include-in-header="$header_tex" \ - --pdf-engine=pdflatex \ - --toc \ - --toc-depth=2 \ - --number-sections \ - --highlight-style=tango \ - --variable=geometry:"margin=2.5cm" \ - --variable=fontsize:11pt \ - --variable=documentclass:article \ - --variable=papersize:a4 \ - --variable=lang:fr \ - -o "$content_pdf" 2>/dev/null || { - echo " ⚠️ Erreur génération contenu pour $title" - # Version simplifiée sans template en cas d'erreur - pandoc "$temp_md" \ - --pdf-engine=pdflatex \ - --toc \ - --number-sections \ - -V lang=fr \ - -V geometry:"margin=2.5cm" \ - -o "$content_pdf" - } - - # === FUSION COUVERTURE + CONTENU === - if [ -f "$cover_pdf" ] && [ -f "$content_pdf" ]; then - # Utilisation de pdfunite si disponible - if command -v pdfunite &> /dev/null; then - pdfunite "$cover_pdf" "$content_pdf" "$output_file" 2>/dev/null || cp "$content_pdf" "$output_file" - # Sinon utilisation de ghostscript - elif command -v gs &> /dev/null; then - gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE="$output_file" -dBATCH "$cover_pdf" "$content_pdf" 2>/dev/null || cp "$content_pdf" "$output_file" - else - cp "$content_pdf" "$output_file" - fi - else - # Pas de couverture, utilisation du contenu seul - cp "$content_pdf" "$output_file" 2>/dev/null || { - echo " ⚠️ Utilisation du PDF sans couverture" - cp "$content_pdf" "$output_file" - } - fi - - # Nettoyage - rm -f "$temp_md" "$cover_tex" "$cover_pdf" "$content_pdf" "$header_tex" - - echo " ✅ Généré: $(basename "$output_file")" -} - -# Génération de tous les modules -for module_num in $(echo "${!MODULES[@]}" | tr ' ' '\n' | sort); do - generate_module_pdf "$module_num" "${MODULES[$module_num]}" -done - -echo "✅ Tous les modules ont été générés dans: $BUILD_DIR" -echo "📁 $(ls -1 "$BUILD_DIR"/*.pdf | wc -l) fichiers PDF créés" \ No newline at end of file diff --git a/scripts/build_modules_additionnels.sh b/scripts/build_modules_additionnels.sh index f0f71e6..6459353 100755 --- a/scripts/build_modules_additionnels.sh +++ b/scripts/build_modules_additionnels.sh @@ -76,13 +76,21 @@ generate_module_additionnel_pdf() { fi fi - # Création du fichier temporaire de contenu + # Création du fichier temporaire de contenu avec le nouveau format cat > "$temp_md" << EOF --- title: "$title" author: "Pascal Guinet - Prima Solutions" date: "$DATE" -geometry: "margin=2.5cm" +module-content: | + **Durée estimée :** $([ "$module_name" = "git" ] && echo "6-8 heures" || echo "12-15 heures") + + **Prérequis :** Modules 1-4 (navigation et manipulation de fichiers) + + **Objectifs :** Maîtriser $([ "$module_name" = "git" ] && echo "le contrôle de version avec Git" || echo "la conteneurisation avec Docker") + + **Public :** Formation complémentaire aux modules de base +reset-chapter-numbering: true --- EOF @@ -119,6 +127,18 @@ EOF # Nettoyage des caractères Unicode problématiques "$SCRIPT_DIR/clean_unicode.sh" "$temp_md" + + # Nettoyage supplémentaire pour les caractères qui causent des erreurs LaTeX + sed -i 's/☐/□/g' "$temp_md" # Carré vide + sed -i 's/■/■/g' "$temp_md" # Carré plein + sed -i 's/▪/•/g' "$temp_md" # Petit carré + sed -i 's/▫/◦/g' "$temp_md" # Petit carré vide + sed -i 's/◻/□/g' "$temp_md" # Grand carré vide + sed -i 's/◼/■/g' "$temp_md" # Grand carré plein + + # Échapper les caractères qui pourraient poser problème + sed -i 's/\[x\]/[x]/g' "$temp_md" # Cases à cocher + sed -i 's/\[ \]/[ ]/g' "$temp_md" # Cases vides # Créer un fichier header LaTeX temporaire pour configurer la numérotation local header_tex="$BUILD_DIR/header_${module_name}.tex" @@ -151,30 +171,37 @@ EOF \setcounter{tocdepth}{3} EOF - # Génération du PDF de contenu - pandoc "$temp_md" \ - --include-in-header="$header_tex" \ + # Génération du PDF avec le template unique + if ! pandoc "$temp_md" \ + --template="$TEMPLATE_DIR/formation_template.tex" \ --pdf-engine=pdflatex \ --toc \ --toc-depth=3 \ - --number-sections \ --highlight-style=tango \ --variable=geometry:"margin=2.5cm" \ --variable=fontsize:11pt \ --variable=documentclass:article \ --variable=papersize:a4 \ --variable=lang:fr \ - -o "$content_pdf" 2>/dev/null || { - echo " ⚠️ Erreur génération contenu pour $title, tentative version simplifiée" - # Version simplifiée sans template en cas d'erreur - pandoc "$temp_md" \ - --pdf-engine=pdflatex \ - --toc \ - --number-sections \ - -V lang=fr \ - -V geometry:"margin=2.5cm" \ - -o "$content_pdf" - } + -o "$content_pdf" 2>&1; then + + echo " ⚠️ Erreur avec template, tentative version simplifiée..." + # Génération simplifiée sans template personnalisé + if ! pandoc "$temp_md" \ + --pdf-engine=pdflatex \ + --toc \ + --toc-depth=3 \ + --highlight-style=tango \ + --variable=geometry:"margin=2.5cm" \ + --variable=fontsize:11pt \ + --variable=documentclass:article \ + --variable=papersize:a4 \ + --variable=lang:fr \ + -o "$content_pdf" 2>&1; then + echo " ❌ Erreur génération contenu pour $title" + return 1 + fi + fi # === FUSION COUVERTURE + CONTENU === if [ -f "$cover_pdf" ] && [ -f "$content_pdf" ]; then diff --git a/scripts/build_simple.sh b/scripts/build_simple.sh deleted file mode 100755 index 337d1d7..0000000 --- a/scripts/build_simple.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash - -# Script de génération simple sans LaTeX -# Génère des versions Markdown consolidées - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -BUILD_DIR="$PROJECT_DIR/build" -SUPPORTS_DIR="$PROJECT_DIR/supports" -TP_DIR="$PROJECT_DIR/travaux_pratiques" - -echo "📚 Génération des supports en Markdown consolidé..." - -mkdir -p "$BUILD_DIR" - -# Génération du Module 1 -echo "📖 Génération du Module 1..." -MODULE1_FILE="$BUILD_DIR/module_01_decouverte.md" - -cat > "$MODULE1_FILE" << EOF -# Module 1 : Découverte et premiers pas - -**Formation Linux - Prima Solutions** -*Généré le $(date "+%d/%m/%Y %H:%M")* - ---- - -EOF - -# Ajouter tous les fichiers du module 1 -for file in "$SUPPORTS_DIR/module_01_decouverte"/*.md; do - if [ -f "$file" ]; then - echo "## $(basename "$file" .md | sed 's/^[0-9]*_//' | tr '_' ' ' | sed 's/\b\w/\U&/g')" >> "$MODULE1_FILE" - echo "" >> "$MODULE1_FILE" - cat "$file" >> "$MODULE1_FILE" - echo -e "\n---\n" >> "$MODULE1_FILE" - fi -done - -# Ajouter les TP -echo "# Travaux Pratiques" >> "$MODULE1_FILE" -echo "" >> "$MODULE1_FILE" - -for tp_file in "$TP_DIR/tp01_installation"/*.md; do - if [ -f "$tp_file" ]; then - echo "## $(basename "$tp_file" .md | tr '_' ' ' | sed 's/\b\w/\U&/g')" >> "$MODULE1_FILE" - echo "" >> "$MODULE1_FILE" - cat "$tp_file" >> "$MODULE1_FILE" - echo -e "\n---\n" >> "$MODULE1_FILE" - fi -done - -echo "✅ Module 1 généré: $MODULE1_FILE" - -# Génération d'un aperçu de la structure -STRUCTURE_FILE="$BUILD_DIR/structure_formation.md" -cat > "$STRUCTURE_FILE" << EOF -# Structure de la Formation Linux - -**Généré le $(date "+%d/%m/%Y %H:%M")** - -## Modules disponibles - -EOF - -# Lister tous les modules -for module_dir in "$SUPPORTS_DIR"/module_*; do - if [ -d "$module_dir" ]; then - module_name=$(basename "$module_dir" | sed 's/module_[0-9]*_//' | tr '_' ' ' | sed 's/\b\w/\U&/g') - module_num=$(basename "$module_dir" | sed 's/module_\([0-9]*\)_.*/\1/') - echo "### Module $module_num : $module_name" >> "$STRUCTURE_FILE" - echo "" >> "$STRUCTURE_FILE" - - # Lister les chapitres - for chapter in "$module_dir"/*.md; do - if [ -f "$chapter" ]; then - chapter_name=$(basename "$chapter" .md | sed 's/^[0-9]*_//' | tr '_' ' ') - echo "- $chapter_name" >> "$STRUCTURE_FILE" - fi - done - echo "" >> "$STRUCTURE_FILE" - fi -done - -echo "📋 Structure générée: $STRUCTURE_FILE" - -echo "" -echo "📂 Fichiers générés dans $BUILD_DIR :" -ls -la "$BUILD_DIR"/*.md 2>/dev/null || echo "Aucun fichier .md trouvé" - -echo "" -echo "💡 Pour voir le contenu:" -echo " cat $MODULE1_FILE | head -50" -echo " cat $STRUCTURE_FILE" \ No newline at end of file diff --git a/scripts/build_simple_pdf.sh b/scripts/build_simple_pdf.sh deleted file mode 100755 index 5d23988..0000000 --- a/scripts/build_simple_pdf.sh +++ /dev/null @@ -1,130 +0,0 @@ -#!/bin/bash - -# Script de génération PDF simple sans template complexe - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -BUILD_DIR="$PROJECT_DIR/build" -SUPPORTS_DIR="$PROJECT_DIR/supports" -TP_DIR="$PROJECT_DIR/travaux_pratiques" - -FORMAT=${1:-complete} -DATE=$(date "+%d/%m/%Y") -AUTHOR="Formation Linux - Prima Solutions" - -case "$FORMAT" in - "complete") - TITLE="Formation Linux Complète" - OUTPUT_FILE="$BUILD_DIR/formation_complete.pdf" - ;; - "acceleree") - TITLE="Formation Linux Accélérée" - OUTPUT_FILE="$BUILD_DIR/formation_acceleree.pdf" - ;; - *) - echo "Usage: $0 [complete|acceleree]" - exit 1 - ;; -esac - -echo "📄 Génération du PDF simple: $TITLE" - -TEMP_MD="$BUILD_DIR/temp_formation.md" -mkdir -p "$BUILD_DIR" - -# En-tête du document -cat > "$TEMP_MD" << EOF ---- -title: "$TITLE" -author: "$AUTHOR" -date: "$DATE" ---- - -# $TITLE - -## Présentation de la formation - -Cette formation Linux s'adresse à un public généraliste souhaitant découvrir et maîtriser les bases du système d'exploitation Linux. - -### Objectifs pédagogiques - -- Comprendre les concepts fondamentaux de Linux -- Maîtriser les commandes de base du terminal -- Gérer les fichiers et dossiers efficacement -- Comprendre les droits et la sécurité -- Automatiser des tâches simples - -\\newpage - -EOF - -# Fonction pour ajouter un module (version simplifiée) -add_module() { - local module_num=$1 - local module_name=$2 - local module_dir="$SUPPORTS_DIR/module_${module_num}_${module_name}" - local tp_dir="$TP_DIR/tp${module_num}_${module_name}" - - if [ -d "$module_dir" ]; then - echo "# Module $module_num : $(echo $module_name | tr '_' ' ' | sed 's/\b\w/\U&/g')" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - - # Ajouter tous les fichiers .md du module - for file in "$module_dir"/*.md; do - if [ -f "$file" ]; then - echo "## $(basename "$file" .md | sed 's/^[0-9]*_//' | tr '_' ' ' | sed 's/\b\w/\U&/g')" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - cat "$file" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - echo "\\newpage" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - fi - done - - # Ajouter les TP - if [ -d "$tp_dir" ]; then - echo "## Travaux Pratiques - Module $module_num" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - - for tp_file in "$tp_dir"/*.md; do - if [ -f "$tp_file" ]; then - echo "### $(basename "$tp_file" .md | tr '_' ' ' | sed 's/\b\w/\U&/g')" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - cat "$tp_file" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - fi - done - echo "\\newpage" >> "$TEMP_MD" - echo "" >> "$TEMP_MD" - fi - fi -} - -# Ajout du contenu selon le format -if [ "$FORMAT" = "complete" ]; then - add_module "01" "decouverte" -else - # Version accélérée - seulement module 1 - add_module "01" "decouverte" -fi - -# Génération du PDF avec Pandoc (version simple) -echo "🔄 Conversion Markdown vers PDF (version simple)..." -pandoc "$TEMP_MD" \ - --pdf-engine=pdflatex \ - --toc \ - --toc-depth=2 \ - --number-sections \ - -V lang=fr \ - -V geometry:"margin=2.5cm" \ - -V fontsize=11pt \ - -V documentclass=article \ - -V papersize=a4 \ - -o "$OUTPUT_FILE" - -# Nettoyage -rm -f "$TEMP_MD" - -echo "✅ PDF généré: $OUTPUT_FILE" \ No newline at end of file diff --git a/scripts/clean_titles.sh b/scripts/clean_titles.sh deleted file mode 100755 index fb7ebca..0000000 --- a/scripts/clean_titles.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -# Script pour nettoyer les titres des fichiers markdown -# Supprime les préfixes "Module X.Y :", "Chapitre X.Y :" et les numéros - -echo "🧹 Nettoyage des titres des chapitres..." - -# Trouver tous les fichiers .md dans les modules -find supports/ -name "*.md" -type f | while read -r file; do - # Lire la première ligne - first_line=$(head -1 "$file") - - # Vérifier si c'est un titre avec préfixe à nettoyer - if [[ "$first_line" =~ ^#[[:space:]]+(Module|Chapitre)[[:space:]]+[0-9]+\.[0-9]+[[:space:]]*:[[:space:]]* ]]; then - # Extraire le titre sans le préfixe - clean_title=$(echo "$first_line" | sed -E 's/^#[[:space:]]+(Module|Chapitre)[[:space:]]+[0-9]+\.[0-9]+[[:space:]]*:[[:space:]]*/# /') - - echo " 📝 $file" - echo " Avant: $first_line" - echo " Après: $clean_title" - - # Créer un fichier temporaire avec le nouveau titre - { - echo "$clean_title" - tail -n +2 "$file" - } > "$file.tmp" && mv "$file.tmp" "$file" - - # Vérifier si c'est un titre avec préfixe "Chapitre" sans numéro de module - elif [[ "$first_line" =~ ^#[[:space:]]+(Chapitre)[[:space:]]+[0-9]+\.[0-9]+[[:space:]]*:[[:space:]]* ]]; then - # Extraire le titre sans le préfixe - clean_title=$(echo "$first_line" | sed -E 's/^#[[:space:]]+(Chapitre)[[:space:]]+[0-9]+\.[0-9]+[[:space:]]*:[[:space:]]*/# /') - - echo " 📝 $file" - echo " Avant: $first_line" - echo " Après: $clean_title" - - # Créer un fichier temporaire avec le nouveau titre - { - echo "$clean_title" - tail -n +2 "$file" - } > "$file.tmp" && mv "$file.tmp" "$file" - fi -done - -echo "✅ Nettoyage terminé!" \ No newline at end of file diff --git a/scripts/clean_unicode_comprehensive.sh b/scripts/clean_unicode_comprehensive.sh deleted file mode 100755 index 6c9bbe6..0000000 --- a/scripts/clean_unicode_comprehensive.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# Nettoyage complet des caractères Unicode pour LaTeX -# Préserve les caractères français essentiels - -if [ $# -eq 0 ]; then - echo "Usage: $0 fichier.md" - exit 1 -fi - -FILE="$1" - -if [ ! -f "$FILE" ]; then - echo "Erreur: fichier $FILE non trouvé" - exit 1 -fi - -echo "Nettoyage Unicode complet de $FILE..." - -# Caractères de dessin de boîtes -perl -i -pe 's/[┌┐└┘├┤┬┴┼]/+/g' "$FILE" -perl -i -pe 's/[│]/|/g' "$FILE" -perl -i -pe 's/[─]/−/g' "$FILE" -perl -i -pe 's/[╱]/\//g' "$FILE" -perl -i -pe 's/[╲]/\\/g' "$FILE" - -# Flèches -perl -i -pe 's/[→]/−>/g' "$FILE" -perl -i -pe 's/[←]/<−/g' "$FILE" -perl -i -pe 's/[↑]/^/g' "$FILE" -perl -i -pe 's/[↓]/v/g' "$FILE" -perl -i -pe 's/[↔]/<−>/g' "$FILE" -perl -i -pe 's/[▶]/>/g' "$FILE" -perl -i -pe 's/[◀]/=/g' "$FILE" -perl -i -pe 's/[×]/x/g' "$FILE" -perl -i -pe 's/[÷]/\//g' "$FILE" - -# Puces et symboles -perl -i -pe 's/[●•]/*/g' "$FILE" -perl -i -pe 's/[◦]/o/g' "$FILE" -perl -i -pe 's/[▪▫]/*/g' "$FILE" - -# Emojis (approche large) -perl -i -pe 's/[\x{1F300}-\x{1F9FF}]/[EMOJI]/g' "$FILE" -perl -i -pe 's/[✅]/[OK]/g' "$FILE" -perl -i -pe 's/[❌]/[NOK]/g' "$FILE" -perl -i -pe 's/[⚠️]/[WARN]/g' "$FILE" -perl -i -pe 's/[✓]/[OK]/g' "$FILE" -perl -i -pe 's/[✗]/[NOK]/g' "$FILE" - -# Autres caractères problématiques -perl -i -pe 's/[…]/.../g' "$FILE" -perl -i -pe 's/['']/'"'"'/g' "$FILE" -perl -i -pe 's/[""]/"/g' "$FILE" -perl -i -pe 's/[–—]/−/g' "$FILE" - -# Nettoyer tout caractère non-ASCII sauf les accents français essentiels -# Préserver: àáâäèéêëìíîïòóôöùúûüÀÁÂÄÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÇçÑñ -perl -i -pe 's/[^\x00-\x7F\xC0-\xFF]//g' "$FILE" - -echo "Nettoyage Unicode complet terminé." \ No newline at end of file diff --git a/scripts/config.sh b/scripts/config.sh old mode 100644 new mode 100755 index 2360a76..42dfe90 --- a/scripts/config.sh +++ b/scripts/config.sh @@ -141,6 +141,37 @@ parse_module_info() { esac } +# === CONFIGURATION DES TEMPLATES === +# Template LaTeX unifié pour tous les PDFs +export TEMPLATE_FILE="$TEMPLATES_DIR/formation_template.tex" + +# Options Pandoc communes +export PANDOC_COMMON_OPTIONS=( + "--pdf-engine=$PDF_ENGINE" + "--highlight-style=$HIGHLIGHT_STYLE" + "--variable" "fontsize=$FONT_SIZE" + "--variable" "papersize=$PAPER_SIZE" + "--variable" "geometry:margin=$MARGIN" + "--variable" "lang=$LANGUAGE" + "--variable" "colorlinks=true" + "--variable" "linkcolor=blue" + "--variable" "urlcolor=blue" +) + +# Options pour les formations complètes +export PANDOC_FULL_OPTIONS=( + "--toc" + "--toc-depth=$TOC_DEPTH" + "--number-sections" +) + +# Options pour les modules individuels +export PANDOC_MODULE_OPTIONS=( + "--toc" + "--toc-depth=2" + "--number-sections" +) + # Export des fonctions pour qu'elles soient disponibles dans les autres scripts export -f log_info log_success log_warning log_error log_step export -f check_dependencies ensure_directories cleanup_temp diff --git a/scripts/templates/formation_template.tex b/scripts/templates/formation_template.tex new file mode 100644 index 0000000..d7f06e5 --- /dev/null +++ b/scripts/templates/formation_template.tex @@ -0,0 +1,224 @@ +\documentclass[a4paper,11pt]{article} + +% Packages essentiels pour le français et la mise en page +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage{lmodern} +\usepackage{geometry} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{xcolor} +\usepackage{hyperref} +\usepackage{listings} +\usepackage{tcolorbox} +\usepackage{enumitem} +\usepackage{titlesec} +\usepackage{lastpage} +\usepackage{longtable} +\usepackage{booktabs} +\usepackage{array} + +% Configuration de la page selon tes spécifications +\geometry{ + left=2.5cm, + right=2.5cm, + top=3cm, + bottom=3cm, + headheight=15pt +} + +% Configuration des couleurs +\definecolor{primarycolor}{RGB}{51,102,153} +\definecolor{secondarycolor}{RGB}{102,153,204} +\definecolor{modulecolor}{RGB}{204,102,51} +\definecolor{codecolor}{RGB}{245,245,245} +\definecolor{shadecolor}{RGB}{248,248,248} + +% Configuration des liens +\hypersetup{ + colorlinks=true, + linkcolor=primarycolor, + urlcolor=primarycolor, + citecolor=primarycolor, + pdfborder={0 0 0} +} + +% Configuration des listings (code) +\lstset{ + backgroundcolor=\color{codecolor}, + basicstyle=\ttfamily\small, + breaklines=true, + frame=single, + rulecolor=\color{gray}, + numbers=left, + numberstyle=\tiny\color{gray}, + keywordstyle=\color{blue}, + commentstyle=\color{green!60!black}, + stringstyle=\color{red}, + showstringspaces=false, + tabsize=2 +} + +% Définition de l'environnement Shaded pour les blocs de code Pandoc +\usepackage{fancyvrb} +\usepackage{framed} +\newcommand{\VerbBar}{|} +\newcommand{\VERB}{\Verb[commandchars=\\\{\}]} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} +% Ajouter des couleurs de base pour la coloration syntaxique +\newenvironment{Shaded}{\begin{snugshade}}{\end{snugshade}} +\newcommand{\AlertTok}[1]{\textcolor[rgb]{0.94,0.16,0.16}{#1}} +\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.77,0.63,0.00}{#1}} +\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}} +\newcommand{\BuiltInTok}[1]{#1} +\newcommand{\CharTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}} +\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}} +\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}} +\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{#1}} +\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}} +\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\ErrorTok}[1]{\textcolor[rgb]{0.64,0.00,0.00}{\textbf{#1}}} +\newcommand{\ExtensionTok}[1]{#1} +\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}} +\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}} +\newcommand{\ImportTok}[1]{#1} +\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}} +\newcommand{\NormalTok}[1]{#1} +\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.81,0.36,0.00}{\textbf{#1}}} +\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{#1}} +\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}} +\newcommand{\RegionMarkerTok}[1]{#1} +\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}} +\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\StringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}} +\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} + +% Configuration des boîtes colorées (version simplifiée et compatible) +\newtcolorbox{moduleintro}{ + colback=modulecolor!10!white, + colframe=modulecolor, + boxrule=2pt, + title={Contenu du module}, + fonttitle=\bfseries, + coltitle=white, + colbacktitle=modulecolor +} + +\newtcolorbox{infobox}{ + colback=blue!5!white, + colframe=blue!50!black, + title=Information +} + +% Configuration des en-têtes et pieds selon tes spécifications exactes +\pagestyle{fancy} +\fancyhf{} + +% Numéros de page : gauche pour pages paires, droite pour impaires +\fancyhead[LE]{\thepage} % Left Even (pages paires) +\fancyhead[RO]{\thepage} % Right Odd (pages impaires) + +% Titre de partie en haut à droite des pages paires +\fancyhead[RE]{\textcolor{primarycolor}{\nouppercase{\leftmark}}} + +% Configuration simple et robuste de la numérotation +\setcounter{secnumdepth}{1} % Seuls les chapitres (sections) sont numérotés + +% Redéfinition simple des titres de sections +\titleformat{\section}{\Large\bfseries\color{primarycolor}}{\thesection.}{1em}{} +\titleformat{name=\section,numberless}{\Huge\bfseries\color{modulecolor}\centering}{}{0pt}{} +\titleformat{\subsection}{\large\bfseries\color{secondarycolor}}{}{0pt}{} +\titleformat{\subsubsection}{\normalsize\bfseries}{}{0pt}{} + +% Configuration simple de la table des matières +\renewcommand{\contentsname}{Sommaire} + +% Cartouche des droits +\newcommand{\cartouchedroits}{ + \vfill + \begin{tcolorbox}[colback=gray!5!white,colframe=gray!50!black,boxrule=1pt] + \small + \textbf{Droits et licence}\\ + Ce document de formation est la propriété de Prima Solutions.\\ + Reproduction et distribution autorisées à des fins pédagogiques uniquement.\\ + Version générée automatiquement le \today + \end{tcolorbox} +} + +% Métadonnées du document +\title{$title$} +\author{$author$} +\date{$date$} + +% Définition de tightlist pour les listes Pandoc +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + +% Début du document +\begin{document} + +% Configuration spéciale pour les pages préliminaires (numérotation romaine) +\pagenumbering{roman} + +% Page de titre personnalisée selon tes spécifications +\begin{titlepage} + \centering + + % Titre principal avec cadre de couleur + \begin{tcolorbox}[ + colback=modulecolor!15!white, + colframe=modulecolor, + boxrule=3pt, + width=0.9\textwidth + ] + \centering + {\Huge\bfseries\color{modulecolor}{$title$}} + \end{tcolorbox} + + \vspace{1cm} + + % Contenu du module dans une boîte + \begin{moduleintro} + $if(module-content)$ + $module-content$ + $else$ + Ce module couvre les aspects essentiels de la formation Linux.\\ + Consultez le sommaire pour le détail des chapitres abordés. + $endif$ + \end{moduleintro} + + \vspace{2cm} + + {\large\textbf{Auteur :} $author$\par} + \vspace{0.5cm} + {\large\textbf{Date :} $date$\par} + + % Cartouche des droits + \cartouchedroits +\end{titlepage} + +% Table des matières (numérotation romaine) +\newpage +\tableofcontents +\newpage + +% Début du contenu principal (numérotation arabe à partir de 1) +\pagenumbering{arabic} +\setcounter{page}{1} + +% Commencer la numérotation des chapitres à 1 pour le premier module +$if(reset-chapter-numbering)$ +\setcounter{section}{0} +$endif$ + +% Contenu principal +$body$ + +\end{document} \ No newline at end of file