VLC

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éorique
lesson_practice
Pratique guidée
lesson_exercice
Exercice / TP
lesson_quiz
Quiz de validation
lesson_resource
Ressources / Fiches

Types 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 riche

Bloc

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: "." }
];
    Vibe Learning Club