Add Content, Model, and Story models with text processing and AI model configuration utilities

- Implement `Content` model for converting Tiptap raw data into HTML and plain text.
- Add `Model` for storing and managing AI model configurations with pricing and metadata.
- Introduce `Story` model to handle verbal styles and linguistic properties for diverse narrative structures.
- Update `book.repository.ts` to refine `updateBookBasicInformation` and `insertNewPlotPoint` methods, removing unused parameters and optimizing queries.
This commit is contained in:
natreex
2025-11-17 20:14:22 -05:00
parent 4cd4f68d1a
commit baa45ac106
10 changed files with 2904 additions and 9 deletions

712
electron/database/models/Story.ts Executable file
View File

@@ -0,0 +1,712 @@
export interface VerbalTimeProps{
actions: string;
descriptions: string;
dialogues: string;
thoughts: string;
summary: string;
}
export interface DialogueProps{
description: string;
example: string;
}
export default class Story {
constructor() {}
static getVerbesStyle(verbalTimeValue: number, level: number, lang: "fr" | "en"): VerbalTimeProps {
switch (verbalTimeValue) {
case 1: // Passé Simple / Simple Past
return {
actions: level === 1
? (lang === "fr" ? 'Passé composé' : 'Past perfect')
: level === 2
? (lang === "fr" ? 'Passé simple' : 'Simple past')
: (lang === "fr" ? 'Passé simple + passé antérieur' : 'Simple past + past perfect'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + plus-que-parfait' : 'Imperfect + pluperfect'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + passé composé' : 'Present + present perfect'),
thoughts: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: (lang === "fr" ? 'Plus-que-parfait + subjonctif passé' : 'Pluperfect + past subjunctive'),
summary: lang === "fr" ? '→ Narrations épurées, style classique' : '→ Clean narratives, classical style',
};
case 2: // Passé Immédiat / Immediate Past
return {
actions: level === 1
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: level === 2
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: (lang === "fr" ? 'Passé composé + présent' : 'Present perfect + present'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + participe passé' : 'Imperfect + past participle'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + passé composé' : 'Present + present perfect'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + passé composé' : 'Present + present perfect'),
summary: lang === "fr" ? '→ Témoignages, récits autobiographiques' : '→ Testimonies, autobiographical narratives',
};
case 3: // Passé Profond / Deep Past
return {
actions: level === 1
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: level === 2
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: (lang === "fr" ? 'Passé antérieur' : 'Past anterior'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: (lang === "fr" ? 'Plus-que-parfait + conditionnel passé' : 'Pluperfect + past conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect'),
thoughts: level === 1
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: level === 2
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: (lang === "fr" ? 'Plus-que-parfait + subjonctif passé' : 'Pluperfect + past subjunctive'),
summary: lang === "fr" ? '→ Flashbacks littéraires, tragédies' : '→ Literary flashbacks, tragedies',
};
case 4: // Présent Brut / Raw Present
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + participe présent' : 'Present + present participle'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + adjectifs' : 'Present + adjectives'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + impératif' : 'Present + imperative'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + infinitif' : 'Present + infinitive'),
summary: lang === "fr" ? '→ Urgence, immersion totale' : '→ Urgency, total immersion',
};
case 5: // Présent Réflexif / Reflective Present
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + gérondif' : 'Present + gerund'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent + adjectifs' : 'Present + adjectives')
: (lang === "fr" ? 'Présent + métaphores' : 'Present + metaphors'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + style indirect libre' : 'Present + free indirect style'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + subjonctif présent' : 'Present + present subjunctive'),
summary: lang === "fr" ? '→ Méditations philosophiques' : '→ Philosophical meditations',
};
case 6: // Futur Projeté / Projected Future
return {
actions: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
descriptions: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
dialogues: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur simple + conditionnel' : 'Simple future + conditional'),
thoughts: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
summary: lang === "fr" ? '→ Prophéties, plans stratégiques' : '→ Prophecies, strategic plans',
};
case 7: // Futur Catastrophe / Catastrophic Future
return {
actions: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
descriptions: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur + conditionnel' : 'Future perfect + conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur simple + impératif' : 'Simple future + imperative'),
thoughts: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Conditionnel présent' : 'Present conditional'),
summary: lang === "fr" ? '→ Dystopies, récits post-apocalyptiques' : '→ Dystopias, post-apocalyptic narratives',
};
case 8: // Imparfait Onirique / Dreamlike Imperfect
return {
actions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + conditionnel présent' : 'Imperfect + present conditional'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + conditionnel présent' : 'Imperfect + present conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + conditionnel présent' : 'Imperfect + present conditional'),
thoughts: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + subjonctif présent' : 'Imperfect + present subjunctive'),
summary: lang === "fr" ? '→ Rêves, souvenirs déformés' : '→ Dreams, distorted memories',
};
case 9: // Conditionnel Hypothétique / Hypothetical Conditional
return {
actions: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel passé' : 'Past conditional'),
descriptions: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel passé' : 'Past conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel présent + subjonctif' : 'Present conditional + subjunctive'),
thoughts: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel passé' : 'Past conditional'),
summary: lang === "fr" ? '→ Uchronies, réalités alternatives' : '→ Alternate histories, alternative realities',
};
case 10: // Subjonctif Angoissé / Anxious Subjunctive
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + subjonctif présent' : 'Present + present subjunctive'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + subjonctif présent' : 'Present + present subjunctive'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent + interjections' : 'Present + interjections')
: (lang === "fr" ? 'Présent + subjonctif présent' : 'Present + present subjunctive'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Subjonctif présent' : 'Present subjunctive'),
summary: lang === "fr" ? '→ Drames psychologiques, dilemmes' : '→ Psychological dramas, dilemmas',
};
case 11: // Mélancolie Composée / Compound Melancholy
return {
actions: level === 1
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: level === 2
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: (lang === "fr" ? 'Passé composé + plus-que-parfait' : 'Present perfect + pluperfect'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + conditionnel passé' : 'Imperfect + past conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect'),
thoughts: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: (lang === "fr" ? 'Plus-que-parfait + conditionnel passé' : 'Pluperfect + past conditional'),
summary: lang === "fr" ? '→ Regrets, introspection nostalgique' : '→ Regrets, nostalgic introspection',
};
case 12: // Urgence Narrative / Narrative Urgency
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + participe présent' : 'Present + present participle'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + adjectifs courts' : 'Present + short adjectives'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent + impératif' : 'Present + imperative')
: (lang === "fr" ? 'Impératif + présent' : 'Imperative + present'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + infinitif' : 'Present + infinitive'),
summary: lang === "fr" ? '→ Crise en cours, compte à rebours' : '→ Ongoing crisis, countdown',
};
case 13: // Présent Émotionnel / Emotional Present
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + participe présent' : 'Present + present participle'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent + adjectifs' : 'Present + adjectives')
: (lang === "fr" ? 'Présent + adjectifs expressifs' : 'Present + expressive adjectives'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent + interjections' : 'Present + interjections')
: (lang === "fr" ? 'Présent + style expressif' : 'Present + expressive style'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + exclamations' : 'Present + exclamations'),
summary: lang === "fr" ? '→ Émotions intenses, introspections vives' : '→ Intense emotions, vivid introspections',
};
case 14: // Présent Introspectif / Introspective Present
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + gérondif' : 'Present + gerund'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent + adjectifs' : 'Present + adjectives')
: (lang === "fr" ? 'Présent + métaphores' : 'Present + metaphors'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Style indirect libre' : 'Free indirect style'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + subjonctif présent' : 'Present + present subjunctive'),
summary: lang === "fr" ? '→ Réflexions profondes, analyse des émotions' : '→ Deep reflections, emotional analysis',
};
case 15: // Présent Historique / Historical Present
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + passé simple' : 'Present + simple past'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + imparfait' : 'Present + imperfect'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + passé composé' : 'Present + present perfect'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + plus-que-parfait' : 'Present + pluperfect'),
summary: lang === "fr" ? '→ Histoires historiques avec intensité immédiate' : '→ Historical stories with immediate intensity',
};
case 16: // Passé Réflexif / Reflective Past
return {
actions: level === 1
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: level === 2
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: (lang === "fr" ? 'Passé composé + plus-que-parfait' : 'Present perfect + pluperfect'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + conditionnel passé' : 'Imperfect + past conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: (lang === "fr" ? 'Style indirect libre' : 'Free indirect style'),
thoughts: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + subjonctif passé' : 'Imperfect + past subjunctive'),
summary: lang === "fr" ? '→ Récits introspectifs, auto-analyse' : '→ Introspective narratives, self-analysis',
};
case 17: // Futur Prophétique / Prophetic Future
return {
actions: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
descriptions: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
dialogues: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur simple + présent gnomique' : 'Simple future + gnomic present'),
thoughts: level === 1
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: level === 2
? (lang === "fr" ? 'Futur simple' : 'Simple future')
: (lang === "fr" ? 'Futur antérieur' : 'Future perfect'),
summary: lang === "fr" ? '→ Prophéties, visions apocalyptiques' : '→ Prophecies, apocalyptic visions',
};
case 18: // Conditionnel Visionnaire / Visionary Conditional
return {
actions: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel passé' : 'Past conditional'),
descriptions: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel passé' : 'Past conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel présent + subjonctif' : 'Present conditional + subjunctive'),
thoughts: level === 1
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: level === 2
? (lang === "fr" ? 'Conditionnel présent' : 'Present conditional')
: (lang === "fr" ? 'Conditionnel passé' : 'Past conditional'),
summary: lang === "fr" ? '→ Mondes parallèles, uchronies' : '→ Parallel worlds, alternate histories',
};
case 19: // Imparfait Poétique / Poetic Imperfect
return {
actions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + participe présent' : 'Imperfect + present participle'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait + adjectifs' : 'Imperfect + adjectives')
: (lang === "fr" ? 'Imparfait + métaphores' : 'Imperfect + metaphors'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Style poétique libre' : 'Free poetic style'),
thoughts: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + subjonctif présent' : 'Imperfect + present subjunctive'),
summary: lang === "fr" ? '→ Lyrisme, poésie narrative' : '→ Lyricism, narrative poetry',
};
case 20: // Second Person Narrative / Narration à la deuxième personne
return {
actions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + imparfait' : 'Present + imperfect'),
descriptions: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + conditionnel présent' : 'Present + present conditional'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + style direct' : 'Present + direct style'),
thoughts: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + conditionnel présent' : 'Present + present conditional'),
summary: lang === "fr" ? '→ Immersion totale, récits interactifs' : '→ Total immersion, interactive narratives',
};
default:
return {
actions: level === 1
? (lang === "fr" ? 'Passé composé' : 'Present perfect')
: level === 2
? (lang === "fr" ? 'Passé simple' : 'Simple past')
: (lang === "fr" ? 'Passé simple + passé antérieur' : 'Simple past + past perfect'),
descriptions: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: (lang === "fr" ? 'Imparfait + plus-que-parfait' : 'Imperfect + pluperfect'),
dialogues: level === 1
? (lang === "fr" ? 'Présent' : 'Present')
: level === 2
? (lang === "fr" ? 'Présent' : 'Present')
: (lang === "fr" ? 'Présent + passé composé' : 'Present + present perfect'),
thoughts: level === 1
? (lang === "fr" ? 'Imparfait' : 'Imperfect')
: level === 2
? (lang === "fr" ? 'Plus-que-parfait' : 'Pluperfect')
: (lang === "fr" ? 'Plus-que-parfait + subjonctif passé' : 'Pluperfect + past subjunctive'),
summary: lang === "fr" ? '→ Narrations épurées, style classique' : '→ Clean narratives, classical style',
};
}
}
static getDialogueType(value: number, level: number, lang: "fr" | "en"): string {
if (lang === "fr") {
// Version française existante
if (level === 1 /* Débutant - Secondaire 5 */) {
switch (value) {
case 1:
return 'Dialogue direct - Paroles exactes (ex: "Je t\'aime !")';
case 2:
return 'Dialogue indirect - Résumé par le narrateur (ex: Il dit qu\'il m\'aime)';
default:
return 'Dialogue direct';
}
} else if (level === 2 /* Intermédiaire - Collégial */) {
switch (value) {
case 1:
return 'Dialogue direct';
case 2:
return 'Dialogue indirect';
case 3:
return 'Dialogue mixte (ex: "Je t\'aime" dit-il, puis explique ses sentiments)';
default:
return 'Dialogue direct';
}
} else if (level === 3 /* Avancé - Universitaire/Littéraire */) {
switch (value) {
case 1:
return 'Dialogue direct';
case 2:
return 'Dialogue indirect';
case 3:
return 'Dialogue mixte';
case 4:
return 'Monologue intérieur (ex: *Je ne peux pas le perdre...*)';
default:
return 'Dialogue direct';
}
}
} else if (lang === "en") {
// Version anglaise canadienne
if (level === 1 /* Beginner - Grade 12 level */) {
switch (value) {
case 1:
return 'Direct dialogue - Exact words (e.g., "I love you!")';
case 2:
return 'Indirect dialogue - Summarized by narrator (e.g., He said that he loved me)';
default:
return 'Direct dialogue';
}
} else if (level === 2 /* Intermediate - College level */) {
switch (value) {
case 1:
return 'Direct dialogue';
case 2:
return 'Indirect dialogue';
case 3:
return 'Mixed dialogue (e.g., "I love you," he said, then explained his feelings)';
default:
return 'Direct dialogue';
}
} else if (level === 3 /* Advanced - University/Literary level */) {
switch (value) {
case 1:
return 'Direct dialogue';
case 2:
return 'Indirect dialogue';
case 3:
return 'Mixed dialogue';
case 4:
return 'Interior monologue (e.g., *I cannot lose him...*)';
default:
return 'Direct dialogue';
}
}
}
return lang === "fr" ? 'Dialogue direct' : 'Direct dialogue';
}
static getLanguage(value: number): string {
switch (value) {
case 1: // Français Canada
return 'Français Canada';
case 2: // Français France
return 'Français France';
case 3: // Français Québécois
return 'Français Québécois';
case 4: // Anglais
return 'English Canada';
default:
return 'Français Canada';
}
}
static getFormat(value: number): string {
switch (value) {
case 1: // Français Canada (espace fine «texte»)
case 3: // Français Québécois
return '«dialogue» - avec guillemet - [Espace fine insécable]';
case 2: // Français France
return '« dialogue » - avec guillemet - [Espace insécable standard]';
case 4: // Anglais
return `"dialogue" - or with a dash - [No space]`;
default:
return 'Format : « dialogue » - avec guillemet - [Espace fine insécable]';
}
}
static getNarrativePerson(value: number, level: number, lang: "fr" | "en"): string {
if (level === 1) {
switch (value) {
case 1:
return lang === "fr" ? 'Première personne (Je acteur)' : 'First Person (I as actor)';
case 3:
return lang === "fr" ? 'Troisième omnisciente - Narration globale' : 'Third Person Omniscient - Global narration';
default:
return 'Première personne';
}
} else if (level === 2) {
switch (value) {
case 1:
return lang === "fr" ? 'Première personne (Je acteur)' : 'First Person (I as actor)';
case 2:
return lang === "fr" ? 'Première personne (Je témoin) - Observateur' : 'First Person (I as witness) - Observer';
case 3:
return lang === "fr" ? 'Troisième omnisciente' : 'Third Person Omniscient';
case 4:
return lang === "fr" ? 'Troisième limitée - Focus sur un personnage' : 'Third Person Limited - Focus on a character';
default:
return 'Première personne';
}
} else if (level === 3) {
switch (value) {
case 1:
return lang === "fr" ? 'Première personne (Je acteur)' : 'First Person (I as actor)';
case 2:
return lang === "fr" ? 'Première personne (Je témoin) - Observateur' : 'First Person (I as witness) - Observer';
case 3:
return lang === "fr" ? 'Troisième omnisciente' : 'Third Person Omniscient';
case 4:
return lang === "fr" ? 'Troisième limitée - Focus sur un personnage' : 'Third Person Limited - Focus on a character';
case 5:
return lang === "fr" ? 'Deuxième personne (Tu) - Immersion forte' : 'Second Person (You) - Strong immersion';
case 6:
return lang === "fr" ? 'Nous collectif - Voix chorale' : 'We Collective - Choral voice';
default:
return lang === "fr" ? 'Troisième omnisciente' : 'Third Person Omniscient';
}
}
return 'Première personne';
}
static getStoryState(value: number): string {
switch (value) {
case 0:
return 'Continue à partir de la mise en contexte avec cela :';
case 1:
return 'Débutons le chapitre avec :';
case 2:
return 'Continue à partir de la mise en contexte et ferme le chapitre avec :';
case 3:
return `Commençons le l'histoire avec :`;
case 4:
return 'Terminons l\'histoire avec :';
default:
return 'Continue à partir de la mise en contexte avec cela :';
}
}
}