From 4d27f4579a6d1de343030b720e9617f7f338f948 Mon Sep 17 00:00:00 2001 From: Esenjin Date: Sat, 15 Feb 2025 23:46:56 +0100 Subject: [PATCH] ajout de la page de lecture des chapitres --- assets/css/public.css | 85 ++++++++++++++++++++ chapitre.php | 178 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 263 insertions(+) create mode 100644 chapitre.php 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 .= "\"Image"; + } + } + + // 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(); +?> + + + + + + <?= htmlspecialchars($currentChapter['title']) ?> - <?= htmlspecialchars($story['title']) ?> - <?= htmlspecialchars($config['site']['name']) ?> + + + + + + + + + + + +
+

+
+ + +
+
+ + + +
+ + + ← + + + + + + → + + +
+
+ + +
+ +
+ ← Retour à l'accueil | ← Retour au roman +
+ + \ No newline at end of file