Structure du cours
Structure
Structure du cours
Format d'export JSON : FormationExport → Formation → Chapitres → Leçons → Blocs.
FormationExport (racine)
Enveloppe d'export
Structure racine contenant les métadonnées d'export et la formation
interface FormationExport {
// Métadonnées d'export
type: "formation_export"; // Type fixe
version: string; // Version du format (ex: "2.2.0")
exported_at: string; // Date ISO d'export
source: "draft" | "parsed_content"; // Source des données
// Contenu
formation: Formation; // Métadonnées de la formation
chapitres: Chapitre[]; // Structure du cours (2 niveaux)
sections?: Section[]; // Structure 3 niveaux (optionnel)
}Formation (métadonnées)
Données de la formation
Toutes les métadonnées et informations pédagogiques
interface Formation {
id?: string; // UUID ou slug
titre: string;
titre_court?: string;
description?: string;
resume?: string;
// Source et statut
source: "manual" | "ai-standard" | "ai-doconly" | "ai-softskills" | "ai-advanced" | "ai-v2" | "ai-agent" | "ai-parcours" | "opale" | "import" | "scenari" | "elephorm" | "scorm";
status: "draft" | "published" | "archived";
// Catégorisation
niveau?: string; // Ex: "Débutant", "Intermédiaire"
filiere?: string; // Ex: "Informatique", "Cuisine"
bloc_competences?: string;
domain?: string; // Domaine (catégorisation avancée)
skill?: string; // Compétence ciblée
academic_level?: string; // Niveau académique
thematiques?: string;
// Durée et compteurs
duree_minutes?: number;
nb_chapitres: number;
nb_lecons: number;
nb_videos?: string; // String ("0", "3", etc.)
nb_quiz?: number;
nb_exercices?: number;
// Pédagogie
objectifs?: string; // Objectifs de la formation
objectifs_globaux?: string; // Objectifs généraux
prerequis?: string;
public_cible?: string;
competences_acquises?: string;
mots_cles?: string[];
// Médias
vignette_url?: string;
image_url?: string;
image_stats?: object; // Stats de l'image
// Publication
is_public?: boolean; // Visible publiquement
visible_in_catalog?: boolean; // Affiché dans le catalogue
pack_id?: string; // ID du pack parent
// Métadonnées additionnelles
metadata_opale?: object; // Métadonnées Opale (si import)
metadata?: object; // Métadonnées génériques
criterias?: object; // Critères de génération IA
// Import
associated_title?: string; // Titre associé (certification)
sources_enrichies?: object; // Sources enrichies
source_path?: string; // Chemin source (import)
imported_at?: string; // Date d'import
// Tracking
created_by?: string; // UUID de l'auteur
created_at?: string;
updated_at?: string;
date_derniere_modification?: number; // Timestamp dernière modif
}Champs requis
- •
titre- Titre de la formation - •
source- Source de création - •
nb_chapitres,nb_lecons- Compteurs
Champs recommandés
- •
description- Pour le SEO et catalogue - •
duree_minutes- Durée estimée - •
vignette_url- Image d'aperçu - •
objectifs- Objectifs pédagogiques
Chapitre
Section thématique
Regroupe des leçons autour d'un thème. Doit se terminer par un quiz.
interface Chapitre {
id: string; // Identifiant unique (ex: "ch_1")
titre: string; // Titre du chapitre
description?: string;
ordre: number; // Position (1, 2, 3...)
duree_minutes?: number;
objectifs?: string[];
lecons: Lesson[]; // Au moins 1 leçon
}Règle pédagogique : Chaque chapitre doit contenir un quiz en dernière position pour valider les acquis. Le dernier chapitre doit inclure un exercice pratique long (60-90 min) suivi d'un quiz final.
Leçon
Unité pédagogique
7 types de leçons disponibles selon l'objectif pédagogique
Types de leçons actifs
lesson_theory
Cours théoriquelesson_practice
Pratique guidéelesson_exercice
Exercice / TPlesson_quiz
Quiz de validationlesson_resource
Ressources / FichesTypes legacy
lesson_video
Vidéo (déprécié)lesson_riche
Contenu riche (déprécié)interface Lesson {
type: LessonType; // lesson_theory, lesson_practice, etc.
id: string; // Identifiant unique (ex: "lesson_ch_1_1")
titre: string;
ordre: number; // Position dans le chapitre
duree_minutes?: number;
objectif?: string; // Objectif de la leçon
resume?: string;
description?: string;
blocs: ContentBlock[]; // Contenu de la leçon (max recommandé: 7 blocs)
}
type LessonType =
| "lesson_theory" // Cours théorique
| "lesson_practice" // Pratique guidée
| "lesson_exercice" // Exercice autonome
| "lesson_quiz" // Quiz de validation
| "lesson_resource" // Ressources annexes
| "lesson_video" // [Legacy] Vidéo
| "lesson_riche"; // [Legacy] Contenu richeBloc
Contenu atomique
37 types de blocs répartis en 7 catégories
interface BaseBlock {
id: string; // Identifiant unique
type: BlockType; // Type du bloc
ordre?: number; // Position dans la leçon
// + propriétés spécifiques au type
}
type BlockType =
// Contenu (10)
| "texte" | "liste_ordonnee" | "liste_non_ordonnee" | "tableau"
| "exemple" | "attention" | "citation" | "key_points" | "pros_cons" | "code"
// Médias (5)
| "video" | "image" | "galerie" | "audio" | "document_pdf"
// Interactifs (6)
| "accordion" | "tabs" | "flashcard" | "fill_blanks" | "sorting" | "checklist"
// Visualisation (5)
| "process" | "timeline" | "stats" | "math" | "mermaid"
// Quiz (6)
| "qcm_simple" | "qcm_multiple" | "vrai_faux"
| "appariement" | "ordonnancement" | "categorisation"
// Exercices (3)
| "exercice_pratique" | "texte_a_trous" | "mise_en_situation"
// Spécialisés (2)
| "compte_t" | "ecriture_comptable";Type RichText
Segments de texte enrichi
Structure utilisée dans les blocs pour le texte formaté
type RichText = TextSegment | LinkSegment;
interface TextSegment {
type: "text";
text: string;
styles?: {
bold?: boolean;
italic?: boolean;
underline?: boolean;
strikethrough?: boolean;
code?: boolean;
superscript?: boolean;
subscript?: boolean;
};
}
interface LinkSegment {
type: "link";
text: string;
href: string;
target?: "_self" | "_blank";
}
// Exemple d'utilisation
const paragraphContent: RichText[] = [
{ type: "text", text: "Texte normal " },
{ type: "text", text: "en gras", styles: { bold: true } },
{ type: "text", text: " et un " },
{ type: "link", text: "lien", href: "https://example.com", target: "_blank" },
{ type: "text", text: "." }
];