Communitygithub.com

Windy-X211/pptx

Créer, éditer et analyser des présentations PowerPoint (.pptx). Activez cette compétence lorsque l'utilisateur dit « faire un PPT », « faire une présentation », « générer des diapositives », « mise en page PPT », « modifier PPT », « lire PPT », « analyser PPT » ou mentionne « pptx », « presentation », « slides », « diapositives ». Couvre l'ensemble du processus : création à partir de zéro (pptxgenjs), édition basée sur un modèle (dépaquetage/édition/empaquetage OOXML), et QA du contenu et de la mise en page.

Qu'est-ce que pptx ?

Cette compétence permet la création, l'édition et l'analyse complètes de présentations PowerPoint (.pptx) via une interface de ligne de commande et des scripts Python/Node.js. Elle prend en charge deux workflows principaux : la création à partir de zéro en utilisant la bibliothèque pptxgenjs, et l'édition basée sur un modèle via le dépaquetage OOXML, la manipulation du contenu, et le réempaquetage. La compétence intègre des contrôles de qualité obligatoires : une validation de mise en page (validate_layout.py) pour détecter les débordements et les diapositives vides, et une analyse de contenu avec markitdown pour vérifier l'exactitude du texte. Elle fonctionne sur tous les systèmes d'exploitation (macOS, Windows, Linux) avec Python et Node.js. La compétence comprend une étape de planification pré-génération obligatoire avec sortie de plan de conception, génération d'actifs externes (via matplotlib, Mermaid, ou recherche d'images), et une convention de nommage stricte des images incluant les dimensions. Une extension de la compétence fournit des conseils détaillés pour la conception de diapositives, la disposition sécurisée, et la prévention des débordements. La compétence garantit une cohérence des couleurs dans tous les actifs générés et suit des chemins d'exécution étape par étape avec vérification des dépendances à la demande.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Windy-X211/AgentCluster-Market/tree/HEAD/skills/pptx

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Exécution étape par étape et dépendances

  1. Suivez l'ordre de travail de cette compétence. Avant qu'une étape n'utilise une bibliothèque, un outil en ligne de commande, un runtime ou une police, vérifiez uniquement les dépendances requises par cette étape ; ne supposez pas qu'elles sont installées.
  2. Réutilisez les dépendances disponibles. Si l'une d'elles est manquante, installez uniquement cette dépendance en utilisant le système d'exploitation actuel et un gestionnaire de paquets disponible, puis vérifiez-la et réessayez l'étape initiale. N'installez pas toute la liste des dépendances à l'avance.
  3. Utilisez l'environnement Python actif (python -m pip install <paquet>, ou le python correspondant) ; créez un environnement virtuel local à la tâche si nécessaire. Installez les bibliothèques Node.js dans le projet de la tâche (npm install <paquet>) afin que le script puisse les résoudre. Pour les outils système et les polices, utilisez le gestionnaire de paquets du système d'exploitation disponible (par exemple, Homebrew sur macOS, apt sur Debian/Ubuntu, ou winget sur Windows).
  4. Suivez le flux d'autorisation de l'hôte lorsque l'installation nécessite une approbation. Si le gestionnaire de paquets ou l'autorisation requise est indisponible, ou si l'installation/téléchargement échoue, signalez la dépendance manquante et l'étape affectée ; ne réessayez pas indéfiniment et ne prétendez pas que l'étape a réussi. Continuez les étapes indépendantes lorsque cela est possible.
  5. Conservez le flux de travail original et les vérifications de qualité. Vérifiez les polices uniquement lorsque le rendu les nécessite. Les étapes utilisant uniquement du texte, des outils intégrés ou du HTML autonome ne nécessitent aucune installation de paquet ; l'accès à un outil externe ou l'authentification doivent être gérés via l'hôte, et non via un gestionnaire de paquets.

Conventions de chemin et d'environnement d'exécution (à lire avant d'exécuter des commandes)

  • Commande Python : Sur cette machine, utilisez python (sur Windows, python3 n'existe généralement pas). Toutes les commandes ci-dessous utilisent python de manière uniforme.
  • Chemin des scripts : Les scripts de cette compétence se trouvent dans AppData/skills/pptx/scripts/ (relativement à la racine du projet). Les commandes de script dans les sections suivantes et dans editing.md / pptxgenjs.md sont écrites comme des chemins relatifs absolus à ce répertoire de base et peuvent être exécutées directement depuis la racine du projet.
  • Répertoire de travail : Les commandes supposent que le répertoire de travail actuel est la racine du projet. Si le répertoire de travail est différent (par exemple, default_workdir modifié vers un autre répertoire), remplacez AppData/skills/pptx par le chemin absolu du répertoire de la compétence.
  • Node.js : Avant d'exécuter npm/node (nécessaire pour pptxgenjs), ajoutez le répertoire Node.js au PATH conformément aux règles du projet.

Compétence PPTX

Référence rapide

TâcheGuide
Lire/analyser le contenupython -m markitdown presentation.pptx
Modifier ou créer à partir d'un modèleLisez editing.md — QA : validate_layout.py + markitdown
Créer à partir de zéro1. Planifier le contenu → 2. Pré-générer les actifs → 3. Lire pptxgenjs.md
Prévenir les débordements par conceptionLisez pptxgenjs.md
Générer un système de designpython AppData/skills/pptx/scripts/design/search.py "<sujet>" --design-system
Correction post-générationpython AppData/skills/pptx/scripts/fix_pptx.py output.pptx
QA de mise en page (critique en premier)python AppData/skills/pptx/scripts/validate_layout.py presentation.pptx

Lecture du contenu

# Extraction de texte
python -m markitdown presentation.pptx

# XML brut
python AppData/skills/pptx/scripts/unpack.py presentation.pptx unpacked/

Workflow d'édition

Lisez editing.md pour les détails complets.

  1. Analysez le modèle avec markitdown
  2. Dépaquetez + vérification de la couche de style + plan d'alignement Thème et Style
  3. Manipulez les diapositives → modifiez le contenu → nettoyez → empaquetez
  4. ⚠️ QA de mise en page (étape obligatoire) : python AppData/skills/pptx/scripts/validate_layout.py output.pptx --slides <numéros_des_diapositives_modifiées>
  5. ⚠️ QA de contenu (obligatoire) : python -m markitdown output.pptx

Création à partir de zéro

Lisez pptxgenjs.md pour les détails complets.

Utilisez cette approche lorsqu'aucun modèle ou présentation de référence n'est disponible.

Structure de diapositives requise (uniquement pour création à partir de zéro)

Lorsque vous créez une présentation à partir de zéro, vous DEVEZ suivre cette structure :

  1. Diapositive 1 : Page de couverture
  2. Diapositive 2 : Table des matières (ordre du jour)
  3. Diapositive 3 et suivantes : Sections de contenu dans l'ordre exact indiqué sur la diapositive 2
  4. Dernière diapositive : Page de clôture / remerciements

Ne sautez pas la diapositive de table des matières. Ne placez pas de diapositives de contenu avant la table des matières.

⚠️ Aucune diapositive vierge autorisée

Chaque diapositive DOIT contenir au moins un élément visible (addText, addShape, addImage, addChart ou addTable) à l'intérieur de la diapositive. Une diapositive avec uniquement une couleur d'arrière-plan et aucun élément de contenu est un défaut de génération.

Causes courantes des diapositives vierges :

  • Oublier d'ajouter du contenu aux diapositives de séparation de section / de transition
  • Troncature du jeton en cours de génération laissant certaines diapositives vides
  • Supposer que la disposition ou le masque de diapositive remplira automatiquement le contenu (ce ne sera pas le cas — pptxgenjs crée des dispositions minimales sans formes héritées)

Si vous destinez une diapositive à être un séparateur de section, vous DEVEZ ajouter explicitement des éléments — par exemple, un grand numéro de section, un texte de titre et/ou des formes décoratives.


⚠️ OBLIGATOIRE : Planification avant génération

Avant d'écrire du code, vous DEVEZ effectuer ces étapes de planification :

⚡ Chemin rapide pour les demandes simples : Lorsque l'utilisateur demande un jeu de diapositives court/simple (≤ 6 pages, sujet unique, sans diagrammes complexes), sautez la sortie de planification formelle et passez directement à l'étape 3 (écrire le code) en utilisant la structure standard Couverture + TdM + (N-3) Contenu + Clôture. Chemin rapide = pas de plan verbeux dans le corps de votre réponse, construisez et exécutez simplement le script.

Étape 1 : Sortir le plan de conception du contenu

Présentez un plan structuré couvrant :

  1. Thème et style généraux

    • Choix de la palette de couleurs (référencez la section « Idées de conception »)
    • Appariement typographique
    • Motif visuel à décliner sur toutes les diapositives
  2. Plan diapositive par diapositive

    Diapositive 1 : Couverture - Type de disposition, éléments clés
    Diapositive 2 : Table des matières - Liste ordonnée des sections
    Diapositive 3 : [Section 1 de la TdM] - Type de disposition, éléments clés, plan d'informations (si visuel)
    ...
    Diapositive N : Clôture / Remerciements - Type de disposition, éléments clés
    ...
    
  3. Inventaire des éléments visuels

    • Listez toutes les images, icônes, graphiques et diagrammes nécessaires
    • Marquez chacun comme : [Intégré] (formes/graphiques pptxgenjs) ou [Externe] (nécessite une pré-génération)

Exemple de sortie de planification :

## Plan de présentation

**Thème :** Palette Ocean Gradient (065A82, 1C7293, 21295C)
**Polices :** Georgia (titres) + Calibri (corps)
**Motif :** Cartes arrondies avec bordure d'accentuation à gauche

### Diapositives :
1. Diapositive de couverture - Titre centré, fond dégradé
2. Table des matières - Vue d'ensemble / Architecture / Métriques / Chronologie
3. [Section 1 de la TdM] - Type de disposition, éléments clés, plan d'informations (si visuel)
...
n. Remerciements - Déclaration de clôture + contact

⚠️ Après avoir sorti votre plan, passez IMMÉDIATEMENT à l'étape 2 et à l'étape 3. Ne replanifiez pas, ne reformulez pas le même plan avec des variations mineures. Sortez le plan UNE FOIS, puis commencez à écrire le code pptxgenjs.

Étape 2 : Pré-générer les actifs externes

Pour les figures marquées [Externe], générez-les AVANT d'écrire le code pptxgenjs.

⚠️ CRITIQUE : Cohérence des couleurs

Tous les diagrammes et graphiques générés DOIVENT utiliser la même palette de couleurs que la présentation. Définissez les couleurs en haut de votre script de génération en fonction de votre thème choisi.

Option A : Formes/Graphiques natifs en premier (DÉFAUT OBLIGATOIRE)

TOUS les diagrammes d'architecture, organigrammes, diagrammes de processus, organigrammes hiérarchiques et diagrammes de relations DOIVENT être construits avec les formes natives de pptxgenjs (RECTANGLE, OVALE, LIGNE, connecteurs + addText). Voir pptxgenjs.md « Building Diagrams with Native Shapes » pour les modèles et exemples.

  • Utilisez une diapositive modèle solide (processus, comparaison, 2 colonnes, grille d'icônes) lorsqu'elle correspond
  • Utilisez les formes natives pptxgenjs (boîtes/flèches/lignes + texte) pour les flux, architectures et hiérarchies
  • Utilisez les graphiques pptxgenjs pour les graphiques de données simples (barres, secteurs, lignes, etc.)

Ne recourez à matplotlib que pour les graphiques statistiques complexes (heatmaps, nuages de points, boîtes à moustaches) que les graphiques pptxgenjs ne peuvent pas gérer. Ne recourez à Mermaid que lorsque le diagramme est trop complexe pour les formes natives ET implique de nombreuses liaisons croisées.

Option B : Graphiques Matplotlib/Python

Définissez la palette de couleurs au début pour correspondre à votre thème PPT :

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# ============================================================
# PALETTE DE COULEURS - Correspond à votre thème PPT
# ============================================================
# Exemple : Thème « Ocean Gradient »
COULEURS = {
    'primary': '#065A82',
    'secondary': '#1C7293',
    'accent': '#21295C',
    'background': '#F0F7FA',
    'text': '#21295C',
    'light': '#E8F4F8',
}

# Cycle de couleurs pour plusieurs séries de données
CYCLE_COULEURS = [COULEURS['primary'], COULEURS['secondary'], COULEURS['accent'], '#4A90A4', '#2D5A6B']

# Appliquer le thème globalement
plt.rcParams.update({
    'axes.prop_cycle': plt.cycler(color=CYCLE_COULEURS),
    'axes.facecolor': 'none',
    'axes.edgecolor': COULEURS['text'],
    'axes.labelcolor': COULEURS['text'],
    'text.color': COULEURS['text'],
    'xtick.color': COULEURS['text'],
    'ytick.color': COULEURS['text'],
    'figure.facecolor': 'none',
    'font.family': 'sans-serif',
    'font.size': 12,
})
# ============================================================

# Créer un graphique avec les couleurs du thème
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
bars = ax.bar(['T1', 'T2', 'T3', 'T4'], [25, 40, 35, 50],
              color=[COULEURS['primary'], COULEURS['secondary'], COULEURS['primary'], COULEURS['secondary']],
              edgecolor=COULEURS['accent'], linewidth=1.5)
ax.set_title('Revenu trimestriel', fontsize=16, fontweight='bold', color=COULEURS['text'])
ax.set_ylabel('Revenu (M$)', color=COULEURS['text'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
largeur_px, hauteur_px = int(8 * 150), int(5 * 150)
plt.savefig(f'graphique_{largeur_px}x{hauteur_px}.png', dpi=150, transparent=True)
plt.close()

Modèles de palette matplotlib :

# Midnight Executive (Exécutif Minuit)
COULEURS = {'primary': '#1E2761', 'secondary': '#CADCFC', 'accent': '#FFFFFF', 'text': '#1E2761'}

# Forest & Moss (Forêt et Mousse)
COULEURS = {'primary': '#2C5F2D', 'secondary': '#97BC62', 'accent': '#F5F5F5', 'text': '#2C5F2D'}

# Coral Energy (Énergie Corail)
COULEURS = {'primary': '#F96167', 'secondary': '#F9E795', 'accent': '#2F3C7E', 'text': '#2F3C7E'}

# Warm Terracotta (Terre Cuite Chaude)
COULEURS = {'primary': '#B85042', 'secondary': '#E7E8D1', 'accent': '#A7BEAE', 'text': '#B85042'}

# Teal Trust (Confiance Sarcelle)
COULEURS = {'primary': '#028090', 'secondary': '#00A896', 'accent': '#02C39A', 'text': '#028090'}

Utilisez pour :

  • Graphiques statistiques complexes (barres, lignes, secteurs, nuages de points, radar, etc.)
  • Visualisations personnalisées non prises en charge par pptxgenjs
  • Heatmaps, nuages de points, boîtes à moustaches

⚠️ N'utilisez PAS matplotlib pour :

  • Diagrammes d'architecture
  • Organigrammes / diagrammes de processus
  • Organigrammes hiérarchiques / diagrammes de hiérarchie
  • Diagrammes de topologie réseau
  • Tout diagramme qui montre principalement des relations entre composants

Ceux-ci DOIVENT être construits avec les formes natives de pptxgenjs afin qu'ils soient rendus comme des objets PPT modifiables — et non comme des images raster.

matplotlib - Graphiques avec support des langues CJK

Lors de la création de graphiques avec matplotlib qui incluent du texte en chinois, vous DEVEZ configurer la police :

import os
import platform
import matplotlib.pyplot as plt
import matplotlib

def configurer_matplotlib_cjk():
    """Configure matplotlib pour prendre en charge les caractères CJK"""
    system = platform.system()

    if system == "Darwin":  # macOS
        noms_polices = ['Arial Unicode MS', 'PingFang SC', 'Heiti SC', 'STHeiti']
    elif system == "Windows":
        noms_polices = ['Microsoft YaHei', 'SimHei', 'SimSun']
    else:  # Linux
        noms_polices = ['Noto Sans CJK SC', 'WenQuanYi Zen Hei', 'Droid Sans Fallback']

    # Trouver la police disponible
    polices_disponibles = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
    for nom_police in noms_polices:
        if nom_police in polices_disponibles:
            plt.rcParams['font.sans-serif'] = [nom_police] + plt.rcParams['font.sans-serif']
            plt.rcParams['axes.unicode_minus'] = False  # Correction de l'affichage du signe moins
            return nom_police
    return None

# Configurer la police CJK avant de créer des graphiques
police_cjk = configurer_matplotlib_cjk()

# Créer un graphique à barres avec des étiquettes en chinois
categories = ['Premier trimestre', 'Deuxième trimestre', 'Troisième trimestre', 'Quatrième trimestre']
valeurs = [120, 135, 142, 158]

plt.figure(figsize=(10, 6))
plt.bar(categories, valeurs, color='steelblue')
plt.title('Données de ventes trimestrielles', fontsize=16)
plt.xlabel('Trimestre', fontsize=12)
plt.ylabel('Ventes', fontsize=12)
plt.tight_layout()
plt.savefig('graphique.png', dpi=150)
plt.close()

Option C : Recherche Web d'images

Recherchez des images pertinentes lorsque :
- Des photos ou illustrations libres de droits sont nécessaires
- Des icônes ou logos sont requis
- Des images de référence pour des concepts

Option D : Diagrammes Mermaid (Dernier recours)

Utilisez uniquement lorsque le diagramme ne peut pas être représenté proprement avec des formes/layouts natifs, et maintenez la cohérence avec le jeu de diapositives :

# Installer si nécessaire : npm install -g @mermaid-js/mermaid-cli

Créez un fichier de configuration de thème correspondant à votre palette PPT :

// mermaid-config.json - Exemple pour le thème « Ocean Gradient »
{
  "theme": "base",
  "themeVariables": {
    "primaryColor": "#065A82",
    "primaryTextColor": "#FFFFFF",
    "primaryBorderColor": "#21295C",
    "secondaryColor": "#1C7293",
    "secondaryTextColor": "#FFFFFF",
    "secondaryBorderColor": "#065A82",
    "tertiaryColor": "#E8F4F8",
    "tertiaryTextColor": "#21295C",
    "lineColor": "#21295C",
    "textColor": "#21295C",
    "mainBkg": "#E8F4F8",
    "nodeBorder": "#065A82",
    "clusterBkg": "#F0F7FA",
    "titleColor": "#21295C",
    "edgeLabelBackground": "#FFFFFF"
  }
}
cat > diagramme.mmd << 'EOF'
graph LR
    A[Client] --> B[Passerelle API]
    B --> C[Service A]
    B --> D[Service B]
EOF

# Privilégier l'export haute résolution pour utilisation dans PPT
mmdc -i diagramme.mmd -o diagramme.png -c mermaid-config.json -b white -w 1600 --scale 2

Étape 3 : Convention de nommage des images (OBLIGATOIRE)

Toutes les images générées DOIVENT inclure les dimensions dans le nom de fichier :

{nom}_{largeur}x{hauteur}.png

Exemples :

  • architecture_800x600.png - 800 px de large, 600 px de haut
  • timeline_1200x400.png - 1200 px de large, 400 px de haut
  • graphique_600x600.png - 600 px carré

Lors de l'enregistrement des images, incluez toujours les dimensions :

# Exemple Matplotlib
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... créer le graphique ...
largeur_px = int(8 * 150)   # 1200
hauteur_px = int(5 * 150)  # 750
plt.savefig(f'graphique_{largeur_px}x{hauteur_px}.png', dpi=150, transparent=True)
# Géné...

… [tronqué pour la traduction]

Skills associés