Docfile commited on
Commit
7f72ec9
·
verified ·
1 Parent(s): 391a4e5

Update templates/philosophie.html

Browse files
Files changed (1) hide show
  1. templates/philosophie.html +126 -164
templates/philosophie.html CHANGED
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html>
2
  <html lang="fr">
3
  <head>
4
  <meta charset="UTF-8">
@@ -69,66 +69,59 @@
69
  @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
70
  .error { color: #c0392b; text-align: center; margin-top: 20px; }
71
 
72
- /* --- Styles du Rendu "Cahier" --- */
73
  .dissertation-paper {
74
  font-family: 'Kalam', cursive;
75
  font-size: 18px;
76
  color: #1a2a4c;
77
  background-color: #fdfaf4;
78
  line-height: 1.6;
79
- background-image: linear-gradient(transparent 94%, #d8e2ee 95%, transparent 96%);
80
- background-size: 100% 25px;
81
  border-left: 3px solid #ffaaab;
82
- padding: 30px 30px 30px 60px;
83
- margin: 40px 0;
84
  min-height: 500px;
85
- position: relative;
86
  }
87
 
88
- /* Marges pour les trous de classeur */
89
- .dissertation-paper::before {
90
- content: '';
91
- position: absolute;
92
- left: 20px;
93
- top: 50px;
94
- width: 15px;
95
- height: 15px;
96
- border-radius: 50%;
97
- background-color: #f4f4f9;
98
- border: 2px solid #ddd;
99
- box-shadow: 0 100px 0 #f4f4f9, 0 100px 0 2px #ddd, 0 200px 0 #f4f4f9, 0 200px 0 2px #ddd;
100
  }
101
 
102
  .dissertation-paper h2 {
103
  font-size: 1.4em;
104
  text-align: center;
105
- margin-bottom: 30px;
106
- color: #1a2a4c;
107
- text-decoration: underline;
108
  }
109
 
110
  .dissertation-paper h3 {
111
- font-size: 1.1em;
112
- margin: 40px 0 20px 0;
 
113
  text-transform: uppercase;
114
- text-decoration: underline;
115
- color: #1a2a4c;
116
  }
117
 
118
  .dissertation-paper .development-block {
119
- margin: 30px 0;
 
120
  }
121
 
122
  .dissertation-paper p {
123
  text-align: justify;
124
- margin: 15px 0;
125
- color: #1a2a4c;
126
  }
127
 
128
  .dissertation-paper .prof {
129
  text-align: center;
130
  font-style: italic;
131
- margin-bottom: 30px;
 
132
  }
133
 
134
  .dissertation-paper .indented {
@@ -136,31 +129,44 @@
136
  }
137
 
138
  .dissertation-paper .transition {
139
- margin: 25px 0;
 
140
  font-style: italic;
141
- color: #4a6a9c;
 
142
  }
143
 
144
  .dissertation-paper .pdf-button-container {
145
  text-align: center;
146
- margin-top: 40px;
 
 
147
  }
148
 
149
  .dissertation-paper .pdf-button {
150
  font-family: 'Lato', sans-serif;
151
  font-size: 16px;
152
- padding: 10px 20px;
153
- width: auto;
154
  display: inline-block;
155
  }
156
 
157
- /* Styles pour une meilleure compatibilité PDF */
158
  @media print {
 
 
 
 
159
  .dissertation-paper {
160
  margin: 0;
 
161
  box-shadow: none;
162
  border: none;
163
  }
 
 
 
 
164
  }
165
  </style>
166
  </head>
@@ -173,13 +179,6 @@
173
  <button type="submit" id="submit-btn">Générer la dissertation</button>
174
  </form>
175
 
176
- <!-- Section de test pour démonstration -->
177
- <div style="margin-top: 30px; padding: 20px; background-color: #e8f4f8; border-radius: 5px;">
178
- <h3>Test de génération PDF</h3>
179
- <p>Cliquez sur le bouton ci-dessous pour tester la génération PDF avec un contenu d'exemple :</p>
180
- <button id="test-demo" style="background-color: #27ae60; margin-top: 10px;">Générer exemple de dissertation</button>
181
- </div>
182
-
183
  <div id="loader" class="loader"></div>
184
  <div id="result-container"></div>
185
  </div>
@@ -188,59 +187,9 @@
188
  document.addEventListener('DOMContentLoaded', () => {
189
  const form = document.getElementById('philo-form');
190
  const submitBtn = document.getElementById('submit-btn');
191
- const testDemoBtn = document.getElementById('test-demo');
192
  const loader = document.getElementById('loader');
193
  const resultContainer = document.getElementById('result-container');
194
 
195
- // Gestionnaire pour le bouton de test
196
- testDemoBtn.addEventListener('click', () => {
197
- const sampleData = {
198
- sujet: "Sommes-nous toujours conscients ?",
199
- prof: "M. Rousseau",
200
- introduction: "La conscience semble être ce qui nous définit en tant qu'êtres humains. Pourtant, nous passons une grande partie de notre existence dans des états où notre conscience paraît altérée ou diminuée : le sommeil, la distraction, l'automatisme. Cette question nous amène à interroger la nature même de la conscience et ses limites.\n\nLa problématique qui se pose est la suivante : la conscience est-elle un état permanent de l'esprit humain, ou connaît-elle des interruptions et des variations ? Nous examinerons d'abord les arguments qui plaident pour une conscience permanente, puis nous analyserons les phénomènes qui semblent la remettre en question, avant de proposer une conception nuancée de la conscience.",
201
- parties: [
202
- {
203
- chapeau: "I. La thèse de la conscience permanente",
204
- arguments: [
205
- {
206
- paragraphe_argumentatif: "Descartes, dans ses Méditations métaphysiques, établit que la pensée est l'essence même de l'âme. « Je pense, donc je suis » implique une conscience constante de soi. Selon cette perspective, même dans le sommeil ou la distraction, une forme de conscience subsiste toujours, car penser c'est être conscient."
207
- },
208
- {
209
- paragraphe_argumentatif: "Cette permanence de la conscience peut également être comprise comme une continuité de l'identité personnelle. John Locke montre que c'est la conscience de nos expériences passées qui assure notre identité à travers le temps. Sans cette continuité, nous ne serions plus la même personne."
210
- }
211
- ],
212
- transition: "Cependant, cette vision de la conscience permanente se heurte à des objections importantes issues de l'observation de nos états mentaux quotidiens."
213
- },
214
- {
215
- chapeau: "II. Les limites et interruptions de la conscience",
216
- arguments: [
217
- {
218
- paragraphe_argumentatif: "Le sommeil profond constitue un défi majeur pour la thèse de la conscience permanente. Pendant certaines phases du sommeil, nous n'avons aucune expérience consciente, aucun souvenir. Comment alors maintenir que nous sommes toujours conscients ?"
219
- },
220
- {
221
- paragraphe_argumentatif: "Henri Bergson met en évidence les phénomènes d'automatisme dans la vie quotidienne. Nous accomplissons de nombreuses actions sans y prêter attention consciente : marcher, conduire sur un trajet familier, ou répéter des gestes habituels. Ces comportements révèlent des zones d'inconscience dans notre existence éveillée."
222
- }
223
- ],
224
- transition: "Ces observations nous invitent à repenser la nature même de la conscience et à adopter une approche plus nuancée."
225
- },
226
- {
227
- chapeau: "III. Pour une conception graduée de la conscience",
228
- arguments: [
229
- {
230
- paragraphe_argumentatif: "Plutôt que de concevoir la conscience comme un état binaire (présent ou absent), il convient de la comprendre comme un phénomène à degrés. William James propose l'idée d'un « courant de conscience » qui varie en intensité et en clarté selon les moments et les situations."
231
- },
232
- {
233
- paragraphe_argumentatif: "Cette conception permet de réconcilier les observations contradictoires : nous sommes toujours conscients dans le sens où il y a toujours une forme de présence à soi ou au monde, mais cette conscience varie en intensité, en clarté et en contenu. Même dans le sommeil, une conscience minimale subsiste qui nous permet de nous réveiller."
234
- }
235
- ]
236
- }
237
- ],
238
- conclusion: "La question de la permanence de la conscience ne peut recevoir de réponse tranchée. Si nous ne sommes pas toujours pleinement conscients au sens d'une vigilance maximale et d'une réflexivité complète, il semble néanmoins qu'une forme de conscience, même minimale, nous accompagne en permanence.\n\nCette réflexion nous enseigne que la conscience humaine est plus complexe et plus nuancée qu'il n'y paraît. Elle nous invite à être attentifs aux différents degrés de notre présence au monde et à nous-mêmes, et à cultiver une conscience plus éveillée de notre propre conscience."
239
- };
240
-
241
- renderDissertation(sampleData);
242
- });
243
-
244
  form.addEventListener('submit', async (event) => {
245
  event.preventDefault();
246
  const question = document.getElementById('question').value.trim();
@@ -250,36 +199,57 @@
250
  return;
251
  }
252
 
253
- // UI management
 
 
 
 
254
  submitBtn.disabled = true;
255
  submitBtn.textContent = 'Génération en cours...';
256
  loader.style.display = 'block';
257
  resultContainer.innerHTML = '';
258
 
259
- try {
260
- const response = await fetch('/api/generate_dissertation', {
261
- method: 'POST',
262
- headers: { 'Content-Type': 'application/json' },
263
- body: JSON.stringify({ question: question })
264
- });
265
-
266
- if (!response.ok) {
267
- const errorData = await response.json();
268
- throw new Error(errorData.error || "Une erreur inconnue est survenue.");
269
- }
270
-
271
- const data = await response.json();
272
- renderDissertation(data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273
 
274
- } catch (error) {
275
- showError(error.message);
276
- } finally {
277
- // Reset UI
278
  submitBtn.disabled = false;
279
  submitBtn.textContent = 'Générer la dissertation';
280
  loader.style.display = 'none';
281
- }
282
- });
283
 
284
  function renderDissertation(data) {
285
  let html = `
@@ -287,25 +257,25 @@
287
  <h2>Sujet : ${data.sujet}</h2>
288
  <p class="prof">Prof : ${data.prof}</p>
289
  <h3>Introduction</h3>
290
- <p class="indented">${data.introduction.replace(/\n/g, '</p><p class="indented">')}</p>
291
  `;
292
 
293
  data.parties.forEach((partie, index) => {
294
  html += `<div class="development-block">`;
295
- html += `<h3>${partie.chapeau}</h3>`;
296
  partie.arguments.forEach(arg => {
297
- html += `<p class="indented">${arg.paragraphe_argumentatif.replace(/\n/g, '</p><p class="indented">')}</p>`;
298
  });
299
  html += `</div>`;
300
 
301
  if (partie.transition) {
302
- html += `<p class="indented transition">${partie.transition.replace(/\n/g, '</p><p class="indented transition">')}</p>`;
303
  }
304
  });
305
 
306
  html += `
307
  <h3>Conclusion</h3>
308
- <p class="indented">${data.conclusion.replace(/\n/g, '</p><p class="indented">')}</p>
309
  <div class="pdf-button-container">
310
  <button class="pdf-button" id="download-pdf">Télécharger en PDF</button>
311
  </div>
@@ -314,70 +284,62 @@
314
 
315
  resultContainer.innerHTML = html;
316
 
317
- // Attach event listener to the newly created button
318
  document.getElementById('download-pdf').addEventListener('click', generatePDF);
319
  }
320
 
321
  function generatePDF() {
322
  const element = document.getElementById('dissertation-content');
323
- if (!element) {
324
- showError("Erreur : contenu de la dissertation non trouvé.");
325
- return;
326
- }
327
-
328
- // Clone l'élément pour éviter de modifier l'original
329
- const clone = element.cloneNode(true);
330
 
331
- // Supprimer le bouton du clone
332
- const pdfButton = clone.querySelector('.pdf-button-container');
333
- if (pdfButton) {
334
- pdfButton.remove();
335
- }
336
-
337
- // Créer un conteneur temporaire
338
- const tempContainer = document.createElement('div');
339
- tempContainer.style.position = 'absolute';
340
- tempContainer.style.left = '-9999px';
341
- tempContainer.style.top = '0';
342
- tempContainer.style.width = '210mm'; // Largeur A4
343
- tempContainer.appendChild(clone);
344
- document.body.appendChild(tempContainer);
345
 
 
346
  const options = {
347
- margin: [10, 10, 10, 10],
348
  filename: 'dissertation-philosophie.pdf',
349
- image: { type: 'jpeg', quality: 0.98 },
 
 
 
350
  html2canvas: {
351
- scale: 2,
352
  useCORS: true,
 
353
  allowTaint: true,
354
- backgroundColor: '#fdfaf4'
 
 
355
  },
356
  jsPDF: {
357
- unit: 'mm',
358
  format: 'a4',
359
  orientation: 'portrait',
360
- compressPDF: true
 
 
 
361
  }
362
  };
363
 
364
- html2pdf()
365
- .set(options)
366
- .from(tempContainer)
367
- .save()
368
- .then(() => {
369
- // Nettoyer le conteneur temporaire
370
- document.body.removeChild(tempContainer);
371
- console.log('PDF généré avec succès');
372
- })
373
- .catch((error) => {
374
- console.error('Erreur lors de la génération du PDF:', error);
375
- showError('Erreur lors de la génération du PDF. Veuillez réessayer.');
376
- // Nettoyer le conteneur temporaire même en cas d'erreur
377
- if (document.body.contains(tempContainer)) {
378
- document.body.removeChild(tempContainer);
379
- }
380
- });
381
  }
382
 
383
  function showError(message) {
 
1
+ <!DOCTYPE html>
2
  <html lang="fr">
3
  <head>
4
  <meta charset="UTF-8">
 
69
  @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
70
  .error { color: #c0392b; text-align: center; margin-top: 20px; }
71
 
72
+ /* --- Styles du Rendu "Cahier" (optimisés pour PDF) --- */
73
  .dissertation-paper {
74
  font-family: 'Kalam', cursive;
75
  font-size: 18px;
76
  color: #1a2a4c;
77
  background-color: #fdfaf4;
78
  line-height: 1.6;
 
 
79
  border-left: 3px solid #ffaaab;
80
+ padding: 30px;
81
+ margin: 40px -30px -30px -30px;
82
  min-height: 500px;
 
83
  }
84
 
85
+ /* Lignes simulées avec des bordures au lieu de background-image */
86
+ .dissertation-paper p,
87
+ .dissertation-paper h2,
88
+ .dissertation-paper h3 {
89
+ border-bottom: 1px solid rgba(216, 226, 238, 0.3);
90
+ padding-bottom: 8px;
91
+ margin-bottom: 16px;
 
 
 
 
 
92
  }
93
 
94
  .dissertation-paper h2 {
95
  font-size: 1.4em;
96
  text-align: center;
97
+ margin-bottom: 24px;
98
+ font-weight: bold;
 
99
  }
100
 
101
  .dissertation-paper h3 {
102
+ font-size: 1.2em;
103
+ margin-top: 32px;
104
+ margin-bottom: 20px;
105
  text-transform: uppercase;
106
+ text-decoration: underline;
107
+ font-weight: bold;
108
  }
109
 
110
  .dissertation-paper .development-block {
111
+ margin-top: 24px;
112
+ margin-bottom: 24px;
113
  }
114
 
115
  .dissertation-paper p {
116
  text-align: justify;
117
+ margin-bottom: 16px;
 
118
  }
119
 
120
  .dissertation-paper .prof {
121
  text-align: center;
122
  font-style: italic;
123
+ margin-bottom: 24px;
124
+ font-size: 0.9em;
125
  }
126
 
127
  .dissertation-paper .indented {
 
129
  }
130
 
131
  .dissertation-paper .transition {
132
+ margin-top: 20px;
133
+ margin-bottom: 20px;
134
  font-style: italic;
135
+ color: #4a6a9c;
136
+ font-weight: 500;
137
  }
138
 
139
  .dissertation-paper .pdf-button-container {
140
  text-align: center;
141
+ margin-top: 40px;
142
+ border: none;
143
+ padding: 0;
144
  }
145
 
146
  .dissertation-paper .pdf-button {
147
  font-family: 'Lato', sans-serif;
148
  font-size: 16px;
149
+ padding: 12px 24px;
150
+ width: auto;
151
  display: inline-block;
152
  }
153
 
154
+ /* Styles spécifiques pour l'impression PDF */
155
  @media print {
156
+ .pdf-button-container {
157
+ display: none !important;
158
+ }
159
+
160
  .dissertation-paper {
161
  margin: 0;
162
+ padding: 20px;
163
  box-shadow: none;
164
  border: none;
165
  }
166
+
167
+ body {
168
+ background: white;
169
+ }
170
  }
171
  </style>
172
  </head>
 
179
  <button type="submit" id="submit-btn">Générer la dissertation</button>
180
  </form>
181
 
 
 
 
 
 
 
 
182
  <div id="loader" class="loader"></div>
183
  <div id="result-container"></div>
184
  </div>
 
187
  document.addEventListener('DOMContentLoaded', () => {
188
  const form = document.getElementById('philo-form');
189
  const submitBtn = document.getElementById('submit-btn');
 
190
  const loader = document.getElementById('loader');
191
  const resultContainer = document.getElementById('result-container');
192
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  form.addEventListener('submit', async (event) => {
194
  event.preventDefault();
195
  const question = document.getElementById('question').value.trim();
 
199
  return;
200
  }
201
 
202
+ // Simuler la génération d'une dissertation (à remplacer par votre API)
203
+ simulateGeneration(question);
204
+ });
205
+
206
+ function simulateGeneration(question) {
207
  submitBtn.disabled = true;
208
  submitBtn.textContent = 'Génération en cours...';
209
  loader.style.display = 'block';
210
  resultContainer.innerHTML = '';
211
 
212
+ // Simulation d'une réponse (remplacez ceci par votre appel API réel)
213
+ setTimeout(() => {
214
+ const mockData = {
215
+ sujet: question,
216
+ prof: "M. Dupont",
217
+ introduction: "L'introduction de cette dissertation explore les différentes dimensions du sujet proposé. Nous commençons par définir les termes clés et établir la problématique qui guidera notre réflexion. Cette question soulève des enjeux philosophiques fondamentaux que nous devrons examiner avec rigueur.",
218
+ parties: [
219
+ {
220
+ chapeau: "Dans un premier temps, nous examinerons la dimension théorique de cette question.",
221
+ arguments: [
222
+ {
223
+ paragraphe_argumentatif: "Premier argument : Cette perspective nous permet de comprendre les fondements conceptuels du problème. En effet, l'analyse théorique révèle des aspects souvent négligés dans l'approche commune de cette question."
224
+ },
225
+ {
226
+ paragraphe_argumentatif: "Deuxième argument : L'examen des sources philosophiques classiques nous éclaire sur les différentes interprétations possibles. Les penseurs comme Descartes, Kant ou Nietzsche ont chacun apporté des éléments de réponse qui méritent d'être confrontés."
227
+ }
228
+ ],
229
+ transition: "Cependant, cette approche théorique trouve ses limites, ce qui nous amène à considérer une perspective plus pratique."
230
+ },
231
+ {
232
+ chapeau: "Dans un second temps, nous analyserons les implications pratiques et concrètes.",
233
+ arguments: [
234
+ {
235
+ paragraphe_argumentatif: "L'expérience quotidienne nous confronte à des situations qui remettent en question les conclusions purement théoriques. La réalité vécue apporte une richesse d'exemples qui nuancent notre compréhension initiale."
236
+ },
237
+ {
238
+ paragraphe_argumentatif: "Les applications contemporaines de cette réflexion philosophique montrent l'actualité et la pertinence du questionnement. Dans notre société moderne, ces enjeux prennent une dimension particulière qu'il convient d'examiner."
239
+ }
240
+ ]
241
+ }
242
+ ],
243
+ conclusion: "En conclusion, cette dissertation a permis d'explorer les multiples facettes du sujet proposé. Nous avons vu que l'approche théorique, bien qu'essentielle, doit être complétée par une analyse pratique pour saisir toute la complexité de la question. Cette réflexion ouvre de nouvelles perspectives et invite à poursuivre l'investigation philosophique sur ces thèmes fondamentaux."
244
+ };
245
 
246
+ renderDissertation(mockData);
247
+
 
 
248
  submitBtn.disabled = false;
249
  submitBtn.textContent = 'Générer la dissertation';
250
  loader.style.display = 'none';
251
+ }, 2000);
252
+ }
253
 
254
  function renderDissertation(data) {
255
  let html = `
 
257
  <h2>Sujet : ${data.sujet}</h2>
258
  <p class="prof">Prof : ${data.prof}</p>
259
  <h3>Introduction</h3>
260
+ <p class="indented">${data.introduction.replace(/\n/g, '<br>')}</p>
261
  `;
262
 
263
  data.parties.forEach((partie, index) => {
264
  html += `<div class="development-block">`;
265
+ html += `<p class="indented">${partie.chapeau.replace(/\n/g, '<br>')}</p>`;
266
  partie.arguments.forEach(arg => {
267
+ html += `<p class="indented">${arg.paragraphe_argumentatif.replace(/\n/g, '<br>')}</p>`;
268
  });
269
  html += `</div>`;
270
 
271
  if (partie.transition) {
272
+ html += `<p class="indented transition">${partie.transition.replace(/\n/g, '<br>')}</p>`;
273
  }
274
  });
275
 
276
  html += `
277
  <h3>Conclusion</h3>
278
+ <p class="indented">${data.conclusion.replace(/\n/g, '<br>')}</p>
279
  <div class="pdf-button-container">
280
  <button class="pdf-button" id="download-pdf">Télécharger en PDF</button>
281
  </div>
 
284
 
285
  resultContainer.innerHTML = html;
286
 
287
+ // Attacher l'événement au bouton PDF nouvellement créé
288
  document.getElementById('download-pdf').addEventListener('click', generatePDF);
289
  }
290
 
291
  function generatePDF() {
292
  const element = document.getElementById('dissertation-content');
293
+ const pdfButtonContainer = element.querySelector('.pdf-button-container');
 
 
 
 
 
 
294
 
295
+ // Cacher le bouton temporairement
296
+ pdfButtonContainer.style.display = 'none';
 
 
 
 
 
 
 
 
 
 
 
 
297
 
298
+ // Options améliorées pour html2pdf
299
  const options = {
300
+ margin: [0.5, 0.5, 0.5, 0.5],
301
  filename: 'dissertation-philosophie.pdf',
302
+ image: {
303
+ type: 'jpeg',
304
+ quality: 0.95
305
+ },
306
  html2canvas: {
307
+ scale: 2,
308
  useCORS: true,
309
+ letterRendering: true,
310
  allowTaint: true,
311
+ logging: false,
312
+ height: element.scrollHeight,
313
+ width: element.scrollWidth
314
  },
315
  jsPDF: {
316
+ unit: 'in',
317
  format: 'a4',
318
  orientation: 'portrait',
319
+ compress: true
320
+ },
321
+ pagebreak: {
322
+ mode: ['avoid-all', 'css', 'legacy']
323
  }
324
  };
325
 
326
+ // Attendre un peu pour que le DOM soit stable
327
+ setTimeout(() => {
328
+ html2pdf()
329
+ .set(options)
330
+ .from(element)
331
+ .save()
332
+ .then(() => {
333
+ // Remettre le bouton visible
334
+ pdfButtonContainer.style.display = 'block';
335
+ console.log('PDF généré avec succès');
336
+ })
337
+ .catch((error) => {
338
+ console.error('Erreur lors de la génération du PDF:', error);
339
+ pdfButtonContainer.style.display = 'block';
340
+ showError('Erreur lors de la génération du PDF. Veuillez réessayer.');
341
+ });
342
+ }, 100);
343
  }
344
 
345
  function showError(message) {