Evaluation de Français A2 – Un chef d’oeuvre

body {
font-family: ‘Arial’, sans-serif;
line-height: 1.6;
max-width: 100%;
margin: 0 auto;
padding: 20px;
color: #333;
}

h1, h2 {
color: #8B4513;
text-align: center;
}

.intro {
background-color: #F5F5DC;
padding: 15px;
border-radius: 8px;
margin-bottom: 20px;
border-left: 5px solid #8B4513;
}

.question-container {
margin-bottom: 20px;
padding: 15px;
border: 1px solid #ddd;
border-radius: 8px;
background-color: #FEFEFE;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

.options {
margin-top: 10px;
}

button {
background-color: #8B4513;
color: white;
border: none;
padding: 10px 15px;
border-radius: 5px;
cursor: pointer;
margin-top: 10px;
}

button:hover {
background-color: #A0522D;
}

input[type=”text”], textarea {
width: 100%;
padding: 8px;
margin-top: 5px;
border: 1px solid #ddd;
border-radius: 4px;
}

textarea {
min-height: 100px;
}

.result-section {
display: none;
text-align: center;
margin-top: 20px;
}

.badge {
border: 2px solid #8B4513;
padding: 20px;
margin: 20px auto;
text-align: center;
background-color: #F5F5DC;
max-width: 500px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
border-radius: 10px;
}

.progress-container {
width: 100%;
background-color: #ddd;
margin-bottom: 20px;
border-radius: 5px;
}

.progress-bar {
height: 20px;
background-color: #8B4513;
border-radius: 5px;
width: 0%;
text-align: center;
line-height: 20px;
color: white;
}

.controls {
display: flex;
justify-content: center;
margin-top: 15px;
}

#email-form {
margin-top: 20px;
display: none;
}

.stamp {
width: 100px;
height: 100px;
border: 2px solid #8B4513;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 20px auto;
background-color: #F0E68C;
font-weight: bold;
color: #8B4513;
transform: rotate(-15deg);
}

#badge {
border: 5px solid #8B4513;
border-radius: 10px;
padding: 20px;
max-width: 800px;
margin: 20px auto;
background-color: #F5F5DC;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
position: relative;
}

#grade-stamp {
position: absolute;
top: 20px;
right: 20px;
width: 60px;
height: 60px;
background-color: #CD853F;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 24px;
font-weight: bold;
border: 3px solid #8B4513;
transform: rotate(15deg);
}

#email-status {
padding: 10px;
background-color: #dff0d8;
border: 1px solid #d6e9c6;
border-radius: 4px;
color: #3c763d;
margin-top: 15px;
display: none;
}

.certificate-header {
text-align: center;
margin-bottom: 20px;
}

.certificate-header h2 {
color: #8B4513;
font-size: 28px;
margin-bottom: 5px;
}

.certificate-header p {
font-style: italic;
color: #666;
}

.certificate-body {
margin: 20px 0;
text-align: center;
}

.certificate-signature {
margin-top: 40px;
text-align: center;
}

.signature-line {
width: 200px;
height: 1px;
background-color: #8B4513;
margin: 10px auto;
}

.timer {
position: fixed;
top: 20px;
right: 20px;
background-color: #8B4513;
color: white;
padding: 15px;
border-radius: 50%;
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
font-weight: bold;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
z-index: 1000;
}

.texte-comprehension {
background-color: #FFFEF7;
padding: 20px;
border-left: 5px solid #8B4513;
margin-bottom: 20px;
line-height: 1.8;
font-size: 16px;
}

.audio-player {
background-color: #F5F5DC;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
text-align: center;
border: 2px solid #8B4513;
}

.audio-controls {
margin: 10px 0;
}

.audio-text {
background-color: #FFFEF7;
padding: 15px;
border-radius: 5px;
margin-top: 15px;
font-size: 14px;
line-height: 1.6;
}

.matching-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin-top: 15px;
}

.items-list, .matches-list {
border: 1px solid #ddd;
padding: 15px;
border-radius: 5px;
background-color: #FAFAFA;
}

.match-item {
padding: 8px;
margin: 5px 0;
background-color: #F5F5DC;
border-radius: 3px;
border: 1px solid #8B4513;
}

.match-definition {
margin: 10px 0;
padding: 8px;
background-color: white;
border-radius: 3px;
border: 1px solid #ddd;
}

.match-select {
width: 100%;
margin-bottom: 5px;
padding: 5px;
}

.aplenguas-login-form {
max-width: 100%;
margin: 0 auto;
padding: 20px;
background-color: #F5F5DC;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}

.form-group {
margin-bottom: 15px;
}

.form-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}

.form-group input {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
}

.btn-submit {
background-color: #8B4513;
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
}

#continuar {
background-color: #228B22;
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
margin-top: 10px;
}

2:00:00

Examen de Français A2 – Un chef d’œuvre

Cette évaluation porte sur le thème des chefs-d’œuvre, du patrimoine culturel, de l’art et de la littérature. L’examen est noté sur 100 points (5 catégories de 20 points chacune).

0%

Résultats de l’évaluation

Nom:

Prénom:

Score: /100

Commentaire:

Certificat de Réussite

Évaluation de Français A2 – Un chef d’œuvre

Ce certificat atteste que

a complété avec succès l’évaluation de français avec un score de

sur un total de 100 points

Signature du professeur

Envoyer le certificat par email

// Script para el formulario de inicio de sesión
const SCRIPT_URL = ‘https://script.google.com/macros/s/AKfycbz4Mw8KlIOeMhqPciP0ZHo43_D-3t5Q505vMpBqr5yBfpyYYGn_ISl6Wuti7ko4JnxGjQ/exec’;

document.getElementById(‘login-form’).addEventListener(‘submit’, function(e) {
e.preventDefault();

const email = document.getElementById(‘email’).value;
const nombre = document.getElementById(‘nombre’).value;
const curso = document.getElementById(‘curso’).value;

// Mostrar estado de procesamiento
document.getElementById(‘estado-envio’).style.display = ‘block’;
document.getElementById(‘mensaje-estado’).innerText = ‘Enviando datos…’;

// Guardar los datos localmente
sessionStorage.setItem(‘student_email’, email);
sessionStorage.setItem(‘student_name’, nombre);
sessionStorage.setItem(‘student_course’, curso);

// Enviar datos al servidor usando fetch
const formData = new FormData();
formData.append(‘email’, email);
formData.append(‘nombre’, nombre);
formData.append(‘curso’, curso);
formData.append(‘accion’, ‘iniciar’);

fetch(SCRIPT_URL, {
method: ‘POST’,
body: formData,
mode: ‘no-cors’
})
.then(response => {
document.getElementById(‘login-form’).style.display = ‘none’;
document.getElementById(‘mensaje-confirmacion’).style.display = ‘block’;
document.getElementById(‘estado-envio’).style.display = ‘none’;
})
.catch(error => {
console.error(‘Error:’, error);
document.getElementById(‘mensaje-estado’).innerText = ‘Error al enviar datos’;
document.getElementById(‘detalles-error’).innerText = error.message;
document.getElementById(‘detalles-error’).style.display = ‘block’;
});
});

document.getElementById(‘continuar’).addEventListener(‘click’, function() {
document.querySelector(‘.aplenguas-login-form’).style.display = ‘none’;
document.getElementById(‘contenido-ejercicio’).style.display = ‘block’;
});

// Variables globales para el examen
let currentQuestionIndex = 0;
let userAnswers = [];
let questionOrder = [];
let studentData = {};
let examTimer;
let timeLeft = 120 * 60; // 2h00 en segundos

// Función para actualizar el temporizador
function updateTimer() {
const hours = Math.floor(timeLeft / 3600);
const minutes = Math.floor((timeLeft % 3600) / 60);
const seconds = timeLeft % 60;

document.getElementById(‘exam-timer’).textContent =
(hours > 0 ? hours + ‘:’ : ”) +
(minutes < 10 ? '0' + minutes : minutes) + ':' +
(seconds < 10 ? '0' + seconds : seconds);

if (timeLeft <= 0) {
clearInterval(examTimer);
alert("Le temps est écoulé! L'examen va être terminé automatiquement.");
calculateResults();
} else {
timeLeft–;
}
}

// El texto de comprensión sobre los monumentos franceses y el arte
const texteComprehension = `

Les chefs-d’œuvre du patrimoine français : entre tradition et modernité

La France possède un patrimoine artistique et architectural d’une richesse exceptionnelle qui attire chaque année des millions de visiteurs du monde entier. Du château de Versailles aux cathédrales gothiques, en passant par les musées parisiens, ces monuments constituent de véritables chefs-d’œuvre qui témoignent de l’histoire et de la culture françaises.

Au cœur de Paris, le musée du Louvre abrite la plus célèbre des peintures : la Joconde de Léonard de Vinci. Cette œuvre mystérieuse fascine par son sourire énigmatique et continue d’inspirer artistes et visiteurs. “Je suis totalement passionné par cette peinture”, confie souvent Marie Dubois, guide au Louvre depuis vingt ans. “Chaque jour, je découvre un nouveau détail dans ce chef-d’œuvre.”

Non loin de là, la cathédrale Notre-Dame de Paris, malgré l’incendie de 2019, reste un symbole de l’art gothique français. Ses voûtes élancées, ses rosaces colorées et ses gargouilles sculptées représentent le savoir-faire des artisans du Moyen Âge. “Permettez-moi de vous proposer une visite guidée de cette merveille architecturale”, suggèrent régulièrement les guides touristiques aux visiteurs éblouis.

Au sud de la France, le Palais des Papes d’Avignon illustre parfaitement l’art de vivre médiéval. Situé au centre de la vieille ville, ce monument imposant domine la vallée du Rhône. En face du palais, sur la rive opposée du fleuve, le fameux pont d’Avignon évoque les chansons populaires françaises.

Mais le patrimoine français ne se limite pas aux monuments anciens. Le Centre Pompidou à Paris, avec sa structure colorée et ses tuyaux apparents, divise l’opinion publique. “Ça m’est égal, cette architecture moderne”, déclare parfois le public traditionnel, tandis que les amateurs d’art contemporain y voient un symbole de créativité et d’innovation.

Le château de Versailles, quant à lui, incarne la grandeur de la France classique. Sa galerie des Glaces, ses jardins à la française et ses appartements royaux transportent les visiteurs dans l’univers de Louis XIV. Derrière le château, les jardins s’étendent à perte de vue, offrant une promenade majestueuse entre sculptures et fontaines.

En Provence, le théâtre antique d’Orange témoigne de l’héritage romain en France. Construit au premier siècle après J.-C., il accueille encore aujourd’hui des représentations lyriques et théâtrales. À côté du théâtre, les ruines de l’arc de triomphe rappellent la puissance de l’Empire romain.

Les châteaux de la Loire constituent également un ensemble architectural remarquable. Chambord, avec ses tours et ses escaliers à vis, Chenonceau enjambant gracieusement le Cher, ou encore Amboise perché sur son promontoire, chacun raconte une page de l’Histoire de France. Ces résidences royales, situées dans la vallée de la Loire, attirent les passionnés d’histoire et d’architecture.

L’art français contemporain trouve aussi sa place dans ce paysage culturel. La pyramide du Louvre, œuvre de l’architecte sino-américain Ieoh Ming Pei, créa une polémique lors de son inauguration en 1989. Aujourd’hui, cette structure de verre et d’acier s’intègre parfaitement dans la cour du musée, créant un dialogue harmonieux entre tradition et modernité.

Ces monuments et œuvres d’art ne sont pas de simples curiosités touristiques : ils constituent le patrimoine vivant de la France. Chaque pierre, chaque peinture, chaque sculpture raconte une histoire et transmet un savoir-faire ancestral aux générations futures. C’est pourquoi leur préservation représente un enjeu majeur pour l’avenir culturel du pays.

`;

// Audio para comprensión oral integrado con Google Drive
const audioText = `

Compréhension orale – Interview avec une artiste

Instructions : Écoutez attentivement l’interview suivante. Vous pouvez l’écouter plusieurs fois si nécessaire.

💡 Conseils pour l’écoute :

  • Écoutez une première fois pour comprendre le sens général
  • Prenez des notes si nécessaire
  • Réécouter les passages difficiles
  • Portez attention aux détails importants
📝 Afficher la transcription (à utiliser seulement si nécessaire)

Transcription de l’interview :

Journaliste : Bonjour Sophie Moreau. Vous êtes peintre depuis quinze ans. Qu’est-ce qui vous passionne le plus dans votre art ?

Sophie Moreau : Bonjour. Ce qui me passionne, c’est la possibilité de transformer une toile blanche en univers coloré. Chaque coup de pinceau raconte une histoire. J’adore mélanger les couleurs vives – le rouge, le jaune, le bleu – pour créer des émotions.

Journaliste : Vos œuvres sont exposées dans plusieurs galeries parisiennes. Comment décririez-vous votre style ?

Sophie Moreau : Mon style ? Je dirais qu’il est entre l’impressionnisme et l’art contemporain. J’aime peindre en plein air, dans les parcs, devant les monuments. L’année dernière, j’ai peint une série sur Notre-Dame, avant et après l’incendie. C’était très émouvant.

Journaliste : Vous travaillez aussi avec des écoles. Pourquoi cette démarche ?

Sophie Moreau : L’art doit être accessible à tous, surtout aux enfants. Je vais dans les écoles primaires et les collèges pour montrer aux élèves que l’art n’est pas réservé aux musées. Avec quelques tubes de peinture et de l’imagination, on peut créer des merveilles !

Journaliste : Quels conseils donneriez-vous aux jeunes qui veulent devenir artistes ?

Sophie Moreau : Il faut d’abord être passionné. Ensuite, pratiquer tous les jours, observer la nature, visiter les musées. Et surtout, ne jamais abandonner ses rêves, même si c’est difficile au début.

`;

// Las preguntas de la evaluación organizadas por categorías
const questionsData = [
// CATÉGORIE 1: Compréhension de texte (20 points)
{
type: “text_intro”,
content: texteComprehension,
category: “Compréhension de texte”
},
{
type: “qcm”,
question: “Selon le texte, où se trouve la Joconde de Léonard de Vinci ?”,
options: [“Au Centre Pompidou”, “Au musée du Louvre”, “À Versailles”, “À Notre-Dame”],
correct: 1,
category: “Compréhension de texte”,
points: 2
},
{
type: “text”,
question: “Quel événement important a affecté Notre-Dame de Paris en 2019 ?”,
correct: “incendie”,
acceptableAnswers: [“incendie”, “un incendie”, “l’incendie”],
category: “Compréhension de texte”,
points: 2
},
{
type: “choix_phrase”,
question: “Quelle phrase exprime une passion dans le texte ?”,
options: [
“Ça m’est égal, cette architecture moderne”,
“Je suis totalement passionné par cette peinture”,
“Permettez-moi de vous proposer une visite guidée”,
“Cette structure divise l’opinion publique”
],
correct: 1,
category: “Compréhension de texte”,
points: 2
},
{
type: “qcm”,
question: “Où se situe le Palais des Papes ?”,
options: [“À Paris”, “À Versailles”, “À Avignon”, “À Orange”],
correct: 2,
category: “Compréhension de texte”,
points: 2
},
{
type: “choix_phrase”,
question: “Quelle expression montre l’indifférence dans le texte ?”,
options: [
“Je suis totalement passionné”,
“Ça m’est égal, cette architecture moderne”,
“Permettez-moi de vous proposer”,
“Cette œuvre mystérieuse fascine”
],
correct: 1,
category: “Compréhension de texte”,
points: 2
},
{
type: “text”,
question: “Selon le texte, où se trouvent les jardins par rapport au château de Versailles ?”,
correct: “derrière”,
acceptableAnswers: [“derrière”, “derrière le château”, “à l’arrière”],
category: “Compréhension de texte”,
points: 2
},
{
type: “qcm”,
question: “Le théâtre antique d’Orange date de quelle époque ?”,
options: [“Du Moyen Âge”, “Du premier siècle après J.-C.”, “De la Renaissance”, “Du 18ème siècle”],
correct: 1,
category: “Compréhension de texte”,
points: 2
},
{
type: “choix_phrase”,
question: “Quelle phrase contient une proposition ?”,
options: [
“La France possède un patrimoine exceptionnel”,
“Permettez-moi de vous proposer une visite guidée”,
“Cette œuvre fascine par son sourire”,
“Le patrimoine français ne se limite pas aux monuments”
],
correct: 1,
category: “Compréhension de texte”,
points: 2
},
{
type: “text”,
question: “Quel architecte a créé la pyramide du Louvre ?”,
correct: “Ieoh Ming Pei”,
acceptableAnswers: [“Ieoh Ming Pei”, “Ming Pei”, “Pei”],
category: “Compréhension de texte”,
points: 2
},
{
type: “qcm”,
question: “Dans quelle vallée se trouvent les châteaux de la Loire ?”,
options: [“La vallée du Rhône”, “La vallée de la Seine”, “La vallée de la Loire”, “La vallée de la Garonne”],
correct: 2,
category: “Compréhension de texte”,
points: 2
},

// CATÉGORIE 2: Grammaire (20 points)
{
type: “text”,
question: “Conjuguez à l’imparfait : ‘Quand j’étais petit, je __ (visiter) souvent les musées avec mes parents.'”,
correct: “visitais”,
category: “Grammaire”,
points: 2
},
{
type: “qcm”,
question: “Choisissez la phrase correcte avec l’imparfait :”,
options: [
“Les artistes peignent dans l’atelier hier”,
“Les artistes peignaient dans l’atelier chaque jour”,
“Les artistes ont peint dans l’atelier hier”,
“Les artistes peigneront dans l’atelier demain”
],
correct: 1,
category: “Grammaire”,
points: 2
},
{
type: “text”,
question: “Complétez à l’imparfait : ‘Nous _____ (être) toujours émerveillés par les œuvres d’art.'”,
correct: “étions”,
acceptableAnswers: [“étions”],
category: “Imparfait”,
points: 2
},
{
type: “qcm”,
question: “Quelle phrase utilise correctement l’imparfait ?”,
options: [
“Hier, il pleut toute la journée”,
“Hier, il a plu toute la journée”,
“Avant, il pleuvait souvent en automne”,
“Demain, il pleuvra sûrement”
],
correct: 2,
category: “Imparfait”,
points: 2
},
{
type: “text”,
question: “Transformez au passé composé : ‘Je visite le Louvre.’ → ‘J’ le Louvre.'”,
correct: “ai visité”,
acceptableAnswers: [“ai visité”],
category: “Grammaire”,
points: 2
},
{
type: “qcm”,
question: “Choisissez la bonne préposition : ‘Cette peinture est exposée musée d’Orsay.'”,
options: [“au”, “à la”, “dans le”, “sur le”],
correct: 0,
category: “Grammaire”,
points: 2
},
{
type: “text”,
question: “Accordez l’adjectif : ‘Les œuvres sont très __ (beau).'”,
correct: “belles”,
acceptableAnswers: [“belles”],
category: “Grammaire”,
points: 2
},
{
type: “qcm”,
question: “Choisissez la forme correcte du passé composé :”,
options: [
“Elle a parti en vacances”,
“Elle est partie en vacances”,
“Elle a partis en vacances”,
“Elle est parti en vacances”
],
correct: 1,
category: “Passé composé”,
points: 2
},
{
type: “text”,
question: “Complétez avec la bonne forme du participe passé : ‘Les sculptures que j’ai _ (voir) étaient magnifiques.'”,
correct: “vues”,
acceptableAnswers: [“vues”],
category: “Grammaire”,
points: 2
},
{
type: “qcm”,
question: “Choisissez la négation correcte :”,
options: [
“Je n’ai vu personne au musée”,
“Je n’ai vu quelqu’un au musée”,
“Je ai vu personne au musée”,
“Je ne ai vu personne au musée”
],
correct: 0,
category: “Négation complexe”,
points: 2
},

// CATÉGORIE 3: Compréhension orale (20 points)
{
type: “audio_intro”,
content: audioText,
category: “Compréhension orale”
},
{
type: “qcm”,
question: “Depuis combien d’années Sophie Moreau est-elle peintre ?”,
options: [“10 ans”, “15 ans”, “20 ans”, “25 ans”],
correct: 1,
category: “Compréhension orale”,
points: 2
},
{
type: “text”,
question: “Quelles sont les trois couleurs vives mentionnées par Sophie Moreau ?”,
correct: “rouge, jaune, bleu”,
acceptableAnswers: [“rouge, jaune, bleu”, “le rouge, le jaune, le bleu”, “rouge jaune bleu”],
category: “Compréhension orale”,
points: 2
},
{
type: “qcm”,
question: “Comment Sophie décrit-elle son style artistique ?”,
options: [
“Uniquement impressionniste”,
“Uniquement contemporain”,
“Entre l’impressionnisme et l’art contemporain”,
“Complètement moderne”
],
correct: 2,
category: “Compréhension orale”,
points: 2
},
{
type: “text”,
question: “Sur quel monument Sophie a-t-elle peint une série l’année dernière ?”,
correct: “Notre-Dame”,
acceptableAnswers: [“Notre-Dame”, “Notre Dame”, “la cathédrale Notre-Dame”],
category: “Compréhension orale”,
points: 2
},
{
type: “qcm”,
question: “Où Sophie aime-t-elle peindre ?”,
options: [
“Seulement dans son atelier”,
“Dans les galeries”,
“En plein air, dans les parcs, devant les monuments”,
“Uniquement dans les musées”
],
correct: 2,
category: “Compréhension orale”,
points: 2
},
{
type: “text”,
question: “Dans quels types d’établissements scolaires Sophie va-t-elle travailler ?”,
correct: “écoles primaires et collèges”,
acceptableAnswers: [“écoles primaires et collèges”, “écoles primaires et les collèges”, “primaires et collèges”],
category: “Compréhension orale”,
points: 2
},
{
type: “qcm”,
question: “Selon Sophie, que faut-il pour créer des merveilles ?”,
options: [
“Beaucoup d’argent”,
“Quelques tubes de peinture et de l’imagination”,
“Un grand atelier”,
“Des pinceaux professionnels”
],
correct: 1,
category: “Compréhension orale”,
points: 2
},
{
type: “text”,
question: “Quel est le premier conseil que donne Sophie aux jeunes qui veulent devenir artistes ?”,
correct: “être passionné”,
acceptableAnswers: [“être passionné”, “il faut être passionné”, “la passion”],
category: “Compréhension orale”,
points: 2
},
{
type: “qcm”,
question: “Que recommande Sophie de faire tous les jours ?”,
options: [“Visiter des galeries”, “Pratiquer”, “Acheter du matériel”, “Rencontrer d’autres artistes”],
correct: 1,
category: “Compréhension orale”,
points: 2
},
{
type: “text”,
question: “Complétez cette phrase de Sophie : ‘Et surtout, ne jamais _____ ses rêves.'”,
correct: “abandonner”,
acceptableAnswers: [“abandonner”],
category: “Compréhension orale”,
points: 2
},

// CATÉGORIE 4: Vocabulaire (20 points)
{
type: “matching”,
question: “Associez chaque mot à sa définition :”,
items: [“Chef-d’œuvre”, “Patrimoine”, “Vernissage”, “Esquisse”, “Exposition”],
definitions: [
“Première ébauche d’une œuvre d’art”,
“Œuvre d’art remarquable et parfaite”,
“Présentation publique d’œuvres d’art”,
“Héritage culturel d’une société”,
“Inauguration d’une exposition”
],
correctMatches: [1, 3, 4, 0, 2],
category: “Vocabulaire”,
points: 4
},
{
type: “qcm”,
question: “Quel mot désigne une peinture représentant une personne ?”,
options: [“Paysage”, “Nature morte”, “Portrait”, “Esquisse”],
correct: 2,
category: “Vocabulaire”,
points: 2
},
{
type: “text”,
question: “Comment appelle-t-on l’art de sculpter dans la pierre ou le marbre ?”,
correct: “sculpture”,
acceptableAnswers: [“sculpture”, “la sculpture”],
category: “Vocabulaire”,
points: 2
},
{
type: “qcm”,
question: “Qu’est-ce qu’un ‘mécène’ ?”,
options: [
“Un critique d’art”,
“Une personne qui finance les arts”,
“Un conservateur de musée”,
“Un marchand d’art”
],
correct: 1,
category: “Vocabulaire”,
points: 2
},
{
type: “text”,
question: “Quel terme désigne l’ensemble des œuvres d’un artiste ?”,
correct: “œuvre”,
acceptableAnswers: [“œuvre”, “l’œuvre”, “corpus”],
category: “Vocabulaire”,
points: 2
},
{
type: “qcm”,
question: “Que signifie ‘restaurer’ une œuvre d’art ?”,
options: [
“La vendre”,
“La critiquer”,
“La réparer et la rénover”,
“L’exposer”
],
correct: 2,
category: “Vocabulaire”,
points: 2
},
{
type: “text”,
question: “Comment appelle-t-on une personne qui collectionne les œuvres d’art ?”,
correct: “collectionneur”,
acceptableAnswers: [“collectionneur”, “un collectionneur”, “collectionneuse”],
category: “Vocabulaire”,
points: 2
},
{
type: “qcm”,
question: “Qu’est-ce qu’un ‘atelier’ d’artiste ?”,
options: [
“Un magasin d’art”,
“Un lieu de travail de l’artiste”,
“Une école d’art”,
“Un musée privé”
],
correct: 1,
category: “Vocabulaire”,
points: 2
},
{
type: “text”,
question: “Quel mot désigne l’art de dessiner et peindre des paysages ?”,
correct: “paysage”,
acceptableAnswers: [“paysage”, “le paysage”, “paysagisme”],
category: “Vocabulaire”,
points: 2
},

// CATÉGORIE 5: Expression écrite (20 points)
{
type: “essay”,
question: “Rédigez un texte de 150-200 mots sur le sujet suivant : ‘Décrivez votre œuvre d’art préférée (peinture, sculpture, monument, etc.) et expliquez pourquoi elle vous touche particulièrement. Utilisez le vocabulaire artistique approprié et variez vos expressions.'”,
category: “Expression écrite”,
points: 20,
criteria: {
“Respect de la consigne et longueur”: 4,
“Richesse du vocabulaire artistique”: 4,
“Correction grammaticale”: 4,
“Cohérence et organisation”: 4,
“Originalité et créativité”: 4
}
}
];

// Fonctions audio (simulation)
function playAudio() {
document.getElementById(‘audio-transcript’).style.display = ‘block’;
alert(“🔊 Audio en cours de lecture… (Durée: 3 minutes)”);
}

function pauseAudio() {
alert(“⏸ Audio mis en pause”);
}

function replayAudio() {
alert(“🔄 Audio redémarré depuis le début”);
}

// Fonction pour mélanger l’ordre des questions (sauf introduction des textes)
function shuffleQuestions() {
const introQuestions = questionsData.filter(q => q.type === ‘text_intro’ || q.type === ‘audio_intro’);
const regularQuestions = questionsData.filter(q => q.type !== ‘text_intro’ && q.type !== ‘audio_intro’);

// Grouper par catégorie
const categories = {};
regularQuestions.forEach(q => {
if (!categories[q.category]) categories[q.category] = [];
categories[q.category].push(q);
});

// Mélanger chaque catégorie et reconstruire
const shuffled = [];
Object.keys(categories).forEach(category => {
// Ajouter l’intro si elle existe
const intro = introQuestions.find(q => q.category === category);
if (intro) shuffled.push(intro);

// Mélanger et ajouter les questions de la catégorie
const categoryQuestions = categories[category];
for (let i = categoryQuestions.length – 1; i > 0; i–) {
const j = Math.floor(Math.random() * (i + 1));
[categoryQuestions[i], categoryQuestions[j]] = [categoryQuestions[j], categoryQuestions[i]];
}
shuffled.push(…categoryQuestions);
});

return shuffled;
}

// Fonction pour afficher une question
function displayQuestion(index) {
const question = questionsData[index];
const questionArea = document.getElementById(‘question-area’);

let html = ”;

if (question.type === ‘text_intro’) {
html = `

📚 ${question.category}

Lisez attentivement le texte suivant, puis répondez aux questions.

${question.content}

`;
} else if (question.type === ‘audio_intro’) {
html = `

🎧 ${question.category}

Écoutez l’enregistrement suivant, puis répondez aux questions.

${question.content}

`;
} else if (question.type === ‘qcm’) {
html = `

Question ${index} – ${question.category} (${question.points} points)

${question.question}

`;
question.options.forEach((option, i) => {
html += `

`;
} else if (question.type === ‘text’) {
html = `

Question ${index} – ${question.category} (${question.points} points)

${question.question}

`;
} else if (question.type === ‘choix_phrase’) {
html = `

Question ${index} – ${question.category} (${question.points} points)

${question.question}

`;
question.options.forEach((option, i) => {
html += `

`;
} else if (question.type === ‘matching’) {
html = `

Question ${index} – ${question.category} (${question.points} points)

${question.question}

Termes :

`;
question.items.forEach((item, i) => {
html += `

${i + 1}. ${item}

`;
});
html += `

Définitions :

`;
question.definitions.forEach((def, i) => {
html += `

${String.fromCharCode(65 + i)}. ${def}

Choisir…
`;
question.items.forEach((item, j) => {
html += `${j + 1}. ${item}`;
});
html += `

`;
});
html += `

`;
} else if (question.type === ‘essay’) {
html = `

Question ${index} – ${question.category} (${question.points} points)

${question.question}

Critères d’évaluation :

    `;
    Object.entries(question.criteria).forEach(([criterion, points]) => {
    html += `

  • ${criterion}: ${points} points
  • `;
    });
    html += `

`;
}

questionArea.innerHTML = html;

// Mettre à jour la barre de progression
const progress = ((index + 1) / questionsData.length) * 100;
document.querySelector(‘.progress-bar’).style.width = progress + ‘%’;
document.querySelector(‘.progress-bar’).textContent = Math.round(progress) + ‘%’;
}

// Fonction pour sauvegarder la réponse actuelle
function saveCurrentAnswer() {
const question = questionsData[currentQuestionIndex];
let answer = null;

if (question.type === ‘qcm’ || question.type === ‘choix_phrase’) {
const selected = document.querySelector(`input[name=”q${currentQuestionIndex}”]:checked`);
if (selected) answer = parseInt(selected.value);
} else if (question.type === ‘text’) {
const input = document.getElementById(`answer${currentQuestionIndex}`);
if (input) answer = input.value.trim();
} else if (question.type === ‘matching’) {
answer = [];
for (let i = 0; i {
if (question.type === ‘text_intro’ || question.type === ‘audio_intro’) return;

if (!categoryScores[question.category]) {
categoryScores[question.category] = { score: 0, total: 0 };
}

let questionScore = 0;
const userAnswer = userAnswers[index];

if (question.type === ‘qcm’ || question.type === ‘choix_phrase’) {
if (userAnswer === question.correct) {
questionScore = question.points;
}
} else if (question.type === ‘text’) {
if (userAnswer && question.acceptableAnswers) {
const normalizedAnswer = userAnswer.toLowerCase().trim();
if (question.acceptableAnswers.some(acceptable =>
acceptable.toLowerCase().trim() === normalizedAnswer)) {
questionScore = question.points;
}
}
} else if (question.type === ‘matching’) {
if (userAnswer && Array.isArray(userAnswer)) {
let correctMatches = 0;
question.correctMatches.forEach((correct, i) => {
if (userAnswer[i] === correct) correctMatches++;
});
questionScore = (correctMatches / question.correctMatches.length) * question.points;
}
} else if (question.type === ‘essay’) {
// Évaluation simplifiée de l’essai basée sur la longueur et des mots-clés
if (userAnswer) {
const wordCount = userAnswer.split(/s+/).length;
if (wordCount >= 150 && wordCount = 100) {
questionScore = question.points * 0.6; // 60% si trop court/long
} else {
questionScore = question.points * 0.3; // 30% si très insuffisant
}
}
}

categoryScores[question.category].score += questionScore;
categoryScores[question.category].total += question.points;
totalScore += questionScore;
});

// Afficher les résultats
showResults(Math.round(totalScore), categoryScores);
}

// Fonction pour afficher les résultats
function showResults(score, categoryScores) {
clearInterval(examTimer);

const studentName = sessionStorage.getItem(‘student_name’) || ‘Étudiant’;
const nameParts = studentName.split(‘ ‘);
const prenom = nameParts[0] || ‘Prénom’;
const nom = nameParts.slice(1).join(‘ ‘) || ‘Nom’;

document.getElementById(‘result-nom’).textContent = nom;
document.getElementById(‘result-prenom’).textContent = prenom;
document.getElementById(‘score’).textContent = score;

// Certificat
document.getElementById(‘cert-prenom’).textContent = prenom;
document.getElementById(‘cert-nom’).textContent = nom;
document.getElementById(‘cert-score’).textContent = score + ‘/100’;
document.getElementById(‘cert-date’).textContent = new Date().toLocaleDateString(‘fr-FR’);

// Commentaire selon le score
let feedback = ”;
let gradeStamp = ”;

if (score >= 90) {
feedback = ‘Excellent ! Vous maîtrisez parfaitement le français A2 dans le domaine artistique.’;
gradeStamp = ‘A+’;
} else if (score >= 80) {
feedback = ‘Très bien ! Votre niveau de français A2 est solide.’;
gradeStamp = ‘A’;
} else if (score >= 70) {
feedback = ‘Bien ! Vous avez un bon niveau de français A2 avec quelques points à améliorer.’;
gradeStamp = ‘B+’;
} else if (score >= 60) {
feedback = ‘Assez bien. Votre niveau A2 est correct mais nécessite du travail supplémentaire.’;
gradeStamp = ‘B’;
} else if (score >= 50) {
feedback = ‘Passable. Il faut renforcer vos connaissances pour atteindre le niveau A2.’;
gradeStamp = ‘C’;
} else {
feedback = ‘Insuffisant. Nous recommandons de reprendre les bases du niveau A2.’;
gradeStamp = ‘D’;
}

document.getElementById(‘feedback’).textContent = feedback;
document.getElementById(‘grade-stamp’).textContent = gradeStamp;

// Masquer la zone de questions et afficher les résultats
document.getElementById(‘question-area’).style.display = ‘none’;
document.querySelector(‘.controls’).style.display = ‘none’;
document.querySelector(‘.progress-container’).style.display = ‘none’;
document.getElementById(‘result-section’).style.display = ‘block’;

// Envoyer les résultats au serveur
sendResults(score, categoryScores);
}

// Fonction pour envoyer les résultats
function sendResults(score, categoryScores) {
const studentEmail = sessionStorage.getItem(‘student_email’);
const studentName = sessionStorage.getItem(‘student_name’);
const studentCourse = sessionStorage.getItem(‘student_course’);

const formData = new FormData();
formData.append(‘email’, studentEmail);
formData.append(‘nombre’, studentName);
formData.append(‘curso’, studentCourse);
formData.append(‘puntuacion’, score);
formData.append(‘detalles’, JSON.stringify(categoryScores));
formData.append(‘accion’, ‘resultados’);

fetch(SCRIPT_URL, {
method: ‘POST’,
body: formData,
mode: ‘no-cors’
}).catch(error => console.error(‘Error sending results:’, error));
}

// Gestionnaires d’événements
document.getElementById(‘start-btn’).addEventListener(‘click’, function() {
// Obtenir les données de l’étudiant
studentData.email = sessionStorage.getItem(‘student_email’);
studentData.name = sessionStorage.getItem(‘student_name’);
studentData.course = sessionStorage.getItem(‘student_course’);

// Mélanger les questions
questionOrder = Array.from({length: questionsData.length}, (_, i) => i);

// Initialiser les réponses
userAnswers = new Array(questionsData.length).fill(null);
currentQuestionIndex = 0;

// Commencer le timer
examTimer = setInterval(updateTimer, 1000);

// Afficher la première question
displayQuestion(currentQuestionIndex);

// Masquer le bouton de démarrage et afficher les contrôles
document.querySelector(‘.intro’).style.display = ‘none’;
document.querySelector(‘.progress-container’).style.display = ‘block’;
document.querySelector(‘.controls’).style.display = ‘block’;
});

document.getElementById(‘next-btn’).addEventListener(‘click’, function() {
// Sauvegarder la réponse actuelle
saveCurrentAnswer();

// Passer à la question suivante
currentQuestionIndex++;

if (currentQuestionIndex {
const {jsPDF} = window.jspdf;
const pdf = new jsPDF(‘landscape’, ‘mm’, ‘a4’);

const imgData = canvas.toDataURL(‘image/png’);
const imgWidth = 250;
const imgHeight = (canvas.height * imgWidth) / canvas.width;

pdf.addImage(imgData, ‘PNG’, 20, 20, imgWidth, imgHeight);
pdf.save(‘certificat-francais-b1.pdf’);
});
});

// Envoi par email
document.getElementById(‘show-email-form’).addEventListener(‘click’, function() {
document.getElementById(‘email-form’).style.display = ‘block’;
this.style.display = ‘none’;
});

document.getElementById(‘send-email’).addEventListener(‘click’, function() {
const recipientEmail = document.getElementById(‘recipient-email’).value;

if (!recipientEmail) {
alert(‘Veuillez saisir une adresse email.’);
return;
}

// Simuler l’envoi d’email
document.getElementById(‘email-status’).textContent = ‘Certificat envoyé avec succès !’;
document.getElementById(‘email-status’).style.display = ‘block’;
});

// Prévenir la fermeture accidentelle pendant l’examen
window.addEventListener(‘beforeunload’, function(e) {
if (currentQuestionIndex > 0 && currentQuestionIndex < questionsData.length) {
e.preventDefault();
e.returnValue = '';
return 'Êtes-vous sûr de vouloir quitter l'examen ? Vos réponses seront perdues.';
}
});