bcosca / fatfree

A powerful yet easy-to-use PHP micro-framework designed to help you build dynamic and robust Web applications - fast!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Remove HTML comments from template (minifying)

Pique7 opened this issue · comments

commented

Hello,
What would be an appropriate method to remove HTML comments from my templates when they are rendered?
I haven't found anything about it in the documentation.

I tried \Template::instance()->extend() but this does not work with HTML comments.

I also found View::afterrender() but I don't know whether might be helpful and how to utilize it. I am not that familiar with PHP and F3.

Use the exclude Tags: <exclude><!-- HTML Comment --></exclude>

commented

Oh, I really overlooked this in the documentation because I was focused on removing existing <!-- HTML comments -->.
I think for my case the provided solution is acceptable. I can replace/complement all my comments with the <exclude> tag.
Okay, thanks for your help!

commented

Meanwhile, on the subject of minification, there is some functionality in core, but it's only for js and css:

commented

Meanwhile, on the subject of minification, there is some functionality in core, but it's only for js and css:

* https://fatfreeframework.com/3.8/optimization#KeepingJavascriptandCSSonaHealthyDiet

* https://fatfreeframework.com/3.8/web#minify

Yes, initially I hoped this could be an answer to my problem but ironically my project barely contains custom CSS and JavaScript (yet).
As already mentioned, for now the solution provided by @httpneo and @geniuswebtools seems to be suitable.

Hello use afterrender :

\Template::instance()->afterrender(function($html) {
return Minify::MinifyHtml($html);
});

return Minify::MinifyHtml($html);

@dabcorp Interesting where is that from?

@GlassGruber , Minify is a class like this (simply) :

`<?php

// Définition de la classe Minify qui étend la classe de base Prefab
class Minify extends \Prefab
{
// Méthode statique pour minifier le HTML
public static function MinifyHtml(string $src): string
{
// Stocke temporairement les sections de script et de style pour les traiter séparément
$placeholders = [];

    // Capture et remplace les balises <script> par des placeholders tout en minifiant leur contenu JavaScript
    $src = preg_replace_callback('/(<script\b[^>]*>)(.*?)(<\/script>)/is', function ($matches) use (&$placeholders) {
        $placeholder = "<!--" . count($placeholders) . "-->";
        $minifiedJs = self::minifyJs($matches[2]);
        $placeholders[$placeholder] = $matches[1] . $minifiedJs . $matches[3];
        return $placeholder;
    }, $src);

    // Capture et remplace les balises <style> par des placeholders tout en minifiant leur contenu CSS
    $src = preg_replace_callback('/(<style\b[^>]*>)(.*?)(<\/style>)/is', function ($matches) use (&$placeholders) {
        $placeholder = "<!--" . count($placeholders) . "-->";
        $minifiedCss = self::minifyCss($matches[2]);
        $placeholders[$placeholder] = $matches[1] . $minifiedCss . $matches[3];
        return $placeholder;
    }, $src);

    // Définit un tableau de motifs regex et leurs remplacements pour nettoyer le HTML
    $patterns = [
        '/>\s+</' => '><', // Supprime les espaces blancs entre les balises HTML
        '/<\?php\s+/' => '<?php ', // Normalise les balises d'ouverture PHP
        "/\s+/" => ' ', // Réduit les espaces multiples en un seul espace
        "/\s+>/" => '>', // Supprime les espaces de fin avant les balises fermantes
        "/<\s+/" => '<', // Supprime les espaces de début après les balises ouvrantes
    ];

    // Applique tous les remplacements en une seule opération
    $src = preg_replace(array_keys($patterns), array_values($patterns), $src);

    // Réinsère les sections de script et de style
    foreach ($placeholders as $placeholder => $content) {
        $src = str_replace($placeholder, $content, $src);
    }

    // Retourne la source HTML minifiée
    return $src;
}

// Méthode privée pour minifier le CSS
private static function minifyCss($css) {
    $css = preg_replace('/\/\*.*?\*\/|\/\/.*(?=\n)/s', '', $css); // Supprime les commentaires CSS
    $css = preg_replace('/\s+/', ' ', $css); // Réduit les espaces multiples en un seul espace
    return trim($css);
}

// Méthode privée pour minifier le JavaScript
private static function minifyJs($js) {
	// Suppression des commentaires de bloc
	$js = preg_replace('/\/\*[\s\S]*?\*\//', '', $js);
	return trim($js);
}

}`