Skip to content

Instantly share code, notes, and snippets.

@vandanojan
Last active March 24, 2024 15:48
Show Gist options
  • Select an option

  • Save vandanojan/c13c70513c0367e486e90a8bb397d260 to your computer and use it in GitHub Desktop.

Select an option

Save vandanojan/c13c70513c0367e486e90a8bb397d260 to your computer and use it in GitHub Desktop.

Revisions

  1. vandanojan renamed this gist Mar 24, 2024. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. vandanojan created this gist Oct 23, 2021.
    122 changes: 122 additions & 0 deletions HTML Minification
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,122 @@
    class FLHM_HTML_Compression
    {
    protected $flhm_compress_css = true;
    protected $flhm_compress_js = true;
    protected $flhm_info_comment = true;
    protected $flhm_remove_comments = true;
    protected $html;
    public function __construct($html)
    {
    if (!empty($html))
    {
    $this->flhm_parseHTML($html);
    }
    }
    public function __toString()
    {
    return $this->html;
    }
    protected function flhm_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 flhm_minifyHTML($html)
    {
    $pattern = '/<(?<script>script).*?<\/script\s*>|<(?<style>style).*?<\/style\s*>|<!(?<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->flhm_compress_js;
    }
    else if ( !empty($token['style']) )
    {
    $strip = $this->flhm_compress_css;
    }
    else if ($content == '<!--wp-html-compression no compression-->')
    {
    $overriding = !$overriding;
    continue;
    }
    else if ($this->flhm_remove_comments)
    {
    if (!$overriding && $raw_tag != 'textarea')
    {
    $content = preg_replace('/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', '', $content);
    }
    }
    }
    else
    {
    if ($tag == 'pre' || $tag == 'textarea')
    {
    $raw_tag = $tag;
    }
    else if ($tag == '/pre' || $tag == '/textarea')
    {
    $raw_tag = false;
    }
    else
    {
    if ($raw_tag || $overriding)
    {
    $strip = false;
    }
    else
    {
    $strip = true;
    $content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content);
    $content = str_replace(' />', '/>', $content);
    }
    }
    }
    if ($strip)
    {
    $content = $this->flhm_removeWhiteSpace($content);
    }
    $html .= $content;
    }
    return $html;
    }
    public function flhm_parseHTML($html)
    {
    $this->html = $this->flhm_minifyHTML($html);
    if ($this->flhm_info_comment)
    {
    $this->html .= "\n" . $this->flhm_bottomComment($html, $this->html);
    }
    }
    protected function flhm_removeWhiteSpace($str)
    {
    $str = str_replace("\t", ' ', $str);
    $str = str_replace("\n", '', $str);
    $str = str_replace("\r", '', $str);
    $str = str_replace("// The customizer requires postMessage and CORS (if the site is cross domain).",'',$str);
    while (stristr($str, ' '))
    {
    $str = str_replace(' ', ' ', $str);
    }
    return $str;
    }
    }
    function flhm_wp_html_compression_finish($html)
    {
    return new FLHM_HTML_Compression($html);
    }
    function flhm_wp_html_compression_start()
    {
    ob_start('flhm_wp_html_compression_finish');
    }
    add_action('get_header', 'flhm_wp_html_compression_start');