André Amorim

Crafting Web Experiences

//

Compress your HTML and CSS & JS Inline of your WordPress site

Compression class:

<?php

class WP_HTML_Compression {

    // Settings
    protected $compress_css = true;
    protected $compress_js = true;
    protected $info_comment = false;
    protected $remove_comments = true;

    // Variables
    protected $html;

    public function __construct($html) {
        if (!empty($html)) {
            $this->parseHTML($html);
        }
    }

    public function __toString() {
        return $this->html;
    }

    protected function bottomComment($raw, $compressed) {
        $raw = strlen($raw);
        $compressed = strlen($compressed);

        $savings = ($raw - $compressed) / $raw * 100;
        $savings = round($savings, 2);

        return '<!--HTML compressed, size saved ' . $savings . '%. From ' . $raw . ' bytes, now ' . $compressed . ' bytes-->';
    }

    protected function minifyHTML($html) {
        $pattern = '/<(?<script>script).*?</scripts*>|<(?<style>style).*?</styles*>|<!(?<comment>--).*?-->|<(?<tag>[\/\w\.\:-]*)(?:".*?"|\'.*?\'|[^\'">]+)*>|(?<text>((<[^!\/\w\.\:-])?[^<]*)+)|/si';

        preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);

        $overriding = false;
        $raw_tag = false;

        $html = '';

        foreach ($matches as $token) {

            $tag = isset($token['tag']) ? strtolower($token['tag']) : null;
            $content = $token[0];

            if (is_null($tag)) {

                if (!empty($token['script'])) {
                    $strip = $this->compress_js;

                } elseif (!empty($token['style'])) {
                    $strip = $this->compress_css;

                } elseif ($content == '<!--wp-html-compression no compression-->') {
                    $overriding = !$overriding;
                    continue;

                } elseif ($this->remove_comments) {
                    if (!$overriding && $raw_tag != 'textarea') {
                        $content = preg_replace(
                            '/<!--(?!\s*(?:\[if [^\]]+\]|<!|>))(?:(?!-->).)*-->/s',
                            '',
                            $content
                        );
                    }
                }

            } else {

                if ($tag == 'pre' || $tag == 'textarea') {
                    $raw_tag = $tag;

                } elseif ($tag == '/pre' || $tag == '/textarea') {
                    $raw_tag = false;

                } else {

                    if ($raw_tag || $overriding) {
                        $strip = false;
                    } else {
                        $strip = true;

                        // Remove empty attributes except allowed ones
                        $content = preg_replace(
                            '/(\s+)(\w+\s*=\s*""\s*)/',
                            '$1',
                            $content
                        );

                        // Remove space before self-closing tags
                        $content = str_replace(' />', '/>', $content);
                    }
                }
            }

            if (!isset($strip)) {
                $strip = false;
            }

            if ($strip) {
                $content = $this->removeWhiteSpace($content);
            }

            $html .= $content;
        }

        return $html;
    }

    public function parseHTML($html) {
        $this->html = $this->minifyHTML($html);

        if ($this->info_comment) {
            $this->html .= "\n" . $this->bottomComment($html, $this->html);
        }
    }

    protected function removeWhiteSpace($str) {
        $str = str_replace("\t", ' ', $str);
        $str = str_replace("\n", '', $str);
        $str = str_replace("\r", '', $str);

        while (stristr($str, '  ')) {
            $str = str_replace('  ', ' ', $str);
        }

        return $str;
    }
}

Call the class:

<?php
include('html-compression.php');

if (!function_exists('wp_html_compression_finish')) {
    function wp_html_compression_finish($html) {
        return new WP_HTML_Compression($html);
    }
}

if (!function_exists('wp_wp_html_compression_start')) {
    function wp_wp_html_compression_start() {
        ob_start('wp_html_compression_finish');
    }
}

add_action('get_header', 'wp_wp_html_compression_start');

Published date:

Modified date: