diff --git a/assets/css/public.css b/assets/css/public.css
index bce7fc2..e842b89 100644
--- a/assets/css/public.css
+++ b/assets/css/public.css
@@ -389,6 +389,80 @@ body {
transition: var(--transition);
}
+/* Styles spécifiques aux chapitres */
+.chapter-content {
+ font-size: 1.1rem;
+ line-height: 1.8;
+ color: var(--text-primary);
+}
+
+/* Styles pour le contenu Quill */
+.chapter-content strong {
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.chapter-content em {
+ font-style: italic;
+ color: var(--text-primary);
+}
+
+.chapter-content u {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+}
+
+.chapter-content a {
+ color: var(--accent-primary);
+ text-decoration: none;
+ transition: var(--transition);
+}
+
+.chapter-content a:hover {
+ color: var(--accent-secondary);
+ text-decoration: underline;
+}
+
+.chapter-content p {
+ margin-bottom: 1.5em;
+}
+
+.chapter-content img {
+ max-width: 100%;
+ height: auto;
+ margin: 1.5em 0;
+ border-radius: var(--radius-sm);
+}
+
+.chapter-navigation {
+ display: flex;
+ justify-content: space-between;
+ margin-top: var(--spacing-xl);
+ padding-top: var(--spacing-lg);
+ border-top: 1px solid var(--border-color);
+}
+
+.chapter-nav {
+ color: var(--text-secondary);
+ text-decoration: none;
+ padding: var(--spacing-sm) var(--spacing-md);
+ border-radius: var(--radius-sm);
+ transition: var(--transition);
+}
+
+.chapter-nav:hover {
+ background-color: var(--bg-secondary);
+ color: var(--accent-primary);
+}
+
+.prev-chapter {
+ margin-right: auto;
+}
+
+.next-chapter {
+ margin-left: auto;
+}
+
.back-to-home a:hover {
color: var(--accent-primary);
}
@@ -448,6 +522,17 @@ body {
.novel-cover {
height: 320px;
}
+
+ .chapter-navigation {
+ flex-direction: column;
+ gap: var(--spacing-md);
+ text-align: center;
+ }
+
+ .chapter-nav {
+ display: block;
+ padding: var(--spacing-md);
+ }
}
@media (max-width: 480px) {
diff --git a/chapitre.php b/chapitre.php
new file mode 100644
index 0000000..84fc269
--- /dev/null
+++ b/chapitre.php
@@ -0,0 +1,178 @@
+ $chapter) {
+ if ($chapter['id'] === $chapterId) {
+ $currentChapter = $chapter;
+ $currentIndex = $index;
+ break;
+ }
+}
+
+if (!$currentChapter) {
+ header('Location: roman.php?id=' . urlencode($storyId));
+ exit;
+}
+
+// Fonction pour convertir le contenu Delta en HTML
+function deltaToHtml($content) {
+ if (empty($content)) return '';
+
+ // Si le contenu est déjà en HTML (ancien format)
+ if (is_string($content) && !isJson($content)) {
+ return $content;
+ }
+
+ // Convertir la chaîne JSON en tableau si nécessaire
+ if (is_string($content)) {
+ $delta = json_decode($content, true);
+ } else {
+ $delta = $content;
+ }
+
+ if (!isset($delta['ops'])) return '';
+
+ $html = '';
+ foreach ($delta['ops'] as $op) {
+ if (is_string($op['insert'])) {
+ $text = htmlspecialchars($op['insert']);
+
+ // Gérer les styles de texte
+ if (isset($op['attributes'])) {
+ if (!empty($op['attributes']['bold'])) {
+ $text = "{$text}";
+ }
+ if (!empty($op['attributes']['italic'])) {
+ $text = "{$text}";
+ }
+ if (!empty($op['attributes']['underline'])) {
+ $text = "{$text}";
+ }
+ // Ajouter d'autres styles si nécessaire
+ }
+
+ // Convertir les retours à la ligne en paragraphes
+ if ($text === "\n") {
+ $html .= "
";
+ } else {
+ $html .= $text;
+ }
+ }
+ // Gérer les images
+ elseif (is_array($op['insert']) && isset($op['insert']['image'])) {
+ $imageUrl = htmlspecialchars($op['insert']['image']);
+ // Retirer le "../" du début de l'URL si présent
+ $imageUrl = preg_replace('/^\.\.\//', '', $imageUrl);
+ $html .= "";
+ }
+ }
+
+ // Envelopper le contenu dans des balises p si nécessaire
+ if (!empty($html)) {
+ $paragraphs = explode("\n\n", $html);
+ $html = '';
+ foreach ($paragraphs as $p) {
+ if (trim($p) !== '') {
+ $html .= "
{$p}
"; + } + } + } + + return $html; +} + +function isJson($string) { + json_decode($string); + return json_last_error() === JSON_ERROR_NONE; +} + +// Récupération des chapitres précédent et suivant +$prevChapter = $currentIndex > 0 ? $story['chapters'][$currentIndex - 1] : null; +$nextChapter = $currentIndex < count($story['chapters']) - 1 ? $story['chapters'][$currentIndex + 1] : null; + +$config = Config::load(); +?> + + + + + +