correction de l'affichage de la mise en forme du texte (partie 2)

This commit is contained in:
Esenjin 2025-02-16 16:33:45 +01:00
parent 27076900bb
commit 38b7596569

View File

@ -2,13 +2,40 @@
class DeltaConverter { class DeltaConverter {
private static $blockAttrs = ['align', 'header', 'blockquote', 'code-block', 'list']; private static $blockAttrs = ['align', 'header', 'blockquote', 'code-block', 'list'];
private static $inlineAttrs = ['bold', 'italic', 'underline', 'color', 'background', 'link', 'font', 'script']; private static $inlineAttrs = ['bold', 'italic', 'underline', 'strike', 'color', 'background', 'link', 'font', 'script'];
public static function toHtml($content) { public static function toHtml($content) {
if (empty($content)) return ''; if (empty($content)) return '';
// Si le contenu est déjà en HTML // Si le contenu est déjà en HTML
if (is_string($content) && !self::isJson($content)) { if (is_string($content) && !self::isJson($content)) {
// Convertir les classes ql-align-* en styles d'alignement
$content = preg_replace_callback(
'/class="ql-align-(justify|center|right)"/',
function($matches) {
return 'style="text-align: ' . $matches[1] . ' !important"';
},
$content
);
// Convertir les classes ql-font-* en classes de police
$content = preg_replace_callback(
'/class="ql-font-(serif|monospace|sans-serif)"/',
function($matches) {
switch($matches[1]) {
case 'serif':
return 'class="font-serif"';
case 'monospace':
return 'class="font-mono"';
case 'sans-serif':
return 'class="font-sans"';
default:
return '';
}
},
$content
);
return self::cleanImageUrls($content); return self::cleanImageUrls($content);
} }
@ -37,10 +64,17 @@ class DeltaConverter {
// Si c'est un saut de ligne, on finalise le bloc // Si c'est un saut de ligne, on finalise le bloc
if ($text === "\n") { if ($text === "\n") {
// Vérifier les attributs de bloc pour ce saut de ligne // Vérifier les attributs de bloc pour ce saut de ligne
foreach ($attrs as $key => $value) { if (!empty($attrs['align'])) {
if (in_array($key, self::$blockAttrs)) { $currentBlock['attrs']['text-align'] = $attrs['align'];
$currentBlock['attrs'][$key] = $value; }
} if (!empty($attrs['header'])) {
$currentBlock['attrs']['header'] = $attrs['header'];
}
if (!empty($attrs['blockquote'])) {
$currentBlock['attrs']['blockquote'] = true;
}
if (!empty($attrs['code-block'])) {
$currentBlock['attrs']['code-block'] = true;
} }
// Finaliser le bloc courant // Finaliser le bloc courant
@ -111,16 +145,12 @@ class DeltaConverter {
$tag = 'blockquote'; $tag = 'blockquote';
} elseif (!empty($block['attrs']['code-block'])) { } elseif (!empty($block['attrs']['code-block'])) {
$tag = 'pre'; $tag = 'pre';
$classes[] = 'code-block';
} }
// Appliquer l'alignement au niveau du bloc // Appliquer l'alignement au niveau du bloc
if (!empty($block['attrs']['align'])) { if (!empty($block['attrs']['text-align'])) {
$styles[] = "text-align: " . $block['attrs']['align'] . " !important"; $styles[] = "text-align: " . $block['attrs']['text-align'] . " !important";
}
// Appliquer la police au niveau du bloc si présente
if (!empty($block['attrs']['font'])) {
$classes[] = 'font-' . strtolower($block['attrs']['font']);
} }
// Construire le contenu avec les attributs inline // Construire le contenu avec les attributs inline
@ -153,10 +183,10 @@ class DeltaConverter {
// Construire les attributs HTML finaux // Construire les attributs HTML finaux
$attributes = ''; $attributes = '';
if (!empty($styles)) { if (!empty($styles)) {
$attributes .= ' style="' . implode('; ', $styles) . '"'; $attributes .= ' style="' . implode('; ', array_unique($styles)) . '"';
} }
if (!empty($classes)) { if (!empty($classes)) {
$attributes .= ' class="' . implode(' ', $classes) . '"'; $attributes .= ' class="' . implode(' ', array_unique($classes)) . '"';
} }
return "<$tag$attributes>$content</$tag>"; return "<$tag$attributes>$content</$tag>";
@ -174,17 +204,30 @@ class DeltaConverter {
if (!empty($attrs['underline'])) { if (!empty($attrs['underline'])) {
$text = "<u>$text</u>"; $text = "<u>$text</u>";
} }
if (!empty($attrs['strike'])) {
$text = "<s>$text</s>";
}
if (!empty($attrs['color'])) { if (!empty($attrs['color'])) {
$text = "<span style=\"color: {$attrs['color']}\">$text</span>"; $text = "<span style=\"color: {$attrs['color']} !important\">$text</span>";
} }
if (!empty($attrs['background'])) { if (!empty($attrs['background'])) {
$text = "<span style=\"background-color: {$attrs['background']}\">$text</span>"; $text = "<span style=\"background-color: {$attrs['background']} !important\">$text</span>";
} }
if (!empty($attrs['link'])) { if (!empty($attrs['link'])) {
$text = "<a href=\"{$attrs['link']}\" target=\"_blank\">$text</a>"; $text = "<a href=\"{$attrs['link']}\" target=\"_blank\">$text</a>";
} }
if (!empty($attrs['font'])) { if (!empty($attrs['font'])) {
$text = "<span class=\"font-" . strtolower($attrs['font']) . "\">$text</span>"; switch($attrs['font']) {
case 'serif':
$text = "<span class=\"font-serif\">$text</span>";
break;
case 'monospace':
$text = "<span class=\"font-mono\">$text</span>";
break;
case 'sans-serif':
$text = "<span class=\"font-sans\">$text</span>";
break;
}
} }
if (!empty($attrs['script'])) { if (!empty($attrs['script'])) {
if ($attrs['script'] === 'super') $text = "<sup>$text</sup>"; if ($attrs['script'] === 'super') $text = "<sup>$text</sup>";