Title: Possible feature request
Last modified: November 30, 2019

---

# Possible feature request

 *  Resolved [TRY01](https://wordpress.org/support/users/try01/)
 * (@try01)
 * [6 years, 6 months ago](https://wordpress.org/support/topic/possible-feature-request/)
 * We are using a custom code to compress inline CSS, remove comments and minify
   HTML. We don’t compress inline JS because we don’t want to take a chance of it
   breaking our inline JS scripts.
 * Would it be possible to include something like this in a future release. We wouldn’t
   want to remove the HTML comments from your plugin because the date stamp is useful.
   We leave a lot of comments that we comment out to make it easier for us to know
   what changes we make but don’t like that showing up in the source code which 
   is the only reason for needing this.
 * Although it is working, we would feel more confident if it were included in your
   plugin since we aren’t 100% sure that there aren’t any issues using it with the
   caching of your plugin or if using it cause a performance issue with caching.
 * This is the code that we are using now …
 *     ```
       <?php
       class WP_HTML_Compression
       {
           // Settings 
           protected $compress_css = true;
           protected $compress_js = false;
           protected $info_comment = true;
           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).*?<\/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;
          	 // Variable reused for output
          	 $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;
          			 }
          			 else if ( !empty($token['style']) )
          			 {
          				 $strip = $this->compress_css;
          			 }
          			 else if ($content == '<!--wp-html-compression no compression-->')
          			 {
          				 $overriding = !$overriding;
   
          				 // Don't print the comment
          				 continue;
          			 }
          			 else if ($this->remove_comments)
          			 {
          				 if (!$overriding && $raw_tag != 'textarea')
          				 {
          					 // Remove any HTML comments, except MSIE conditional comments
          					 $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;
   
          					 // Remove any empty attributes, except:
          					 // action, alt, content, src
          					 $content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content);
   
          					 // Remove any space before the end of self-closing XHTML tags
          					 // JavaScript excluded
          					 $content = str_replace(' />', '/>', $content);
          				 }
          			 }
          		 }
   
          		 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;
           }
       }
   
       function wp_html_compression_finish($html)
       {
           return new WP_HTML_Compression($html);
       }
   
       function wp_html_compression_start()
       {
           ob_start('wp_html_compression_finish');
       }
       add_action('get_header', 'wp_html_compression_start');
       ?>
       ```
   

Viewing 2 replies - 1 through 2 (of 2 total)

 *  Plugin Support [Imran – WPMU DEV Support](https://wordpress.org/support/users/wpmudev-support9/)
 * (@wpmudev-support9)
 * [6 years, 6 months ago](https://wordpress.org/support/topic/possible-feature-request/#post-12198468)
 * Hello [@try01](https://wordpress.org/support/users/try01/),
 * I trust you’re doing well!
 * Thank you for your suggestion! I’ve forwarded it to our developers so they could
   review it and see if the feature will be added to the development list.
 * Have a good day and take care!
 * Cheers,
    Nastia
 *  Thread Starter [TRY01](https://wordpress.org/support/users/try01/)
 * (@try01)
 * [6 years, 6 months ago](https://wordpress.org/support/topic/possible-feature-request/#post-12200101)
 * Thank you, Nastia. I appreciate it.

Viewing 2 replies - 1 through 2 (of 2 total)

The topic ‘Possible feature request’ is closed to new replies.

 * ![](https://ps.w.org/hummingbird-performance/assets/icon-256x256.gif?rev=2633221)
 * [Hummingbird Performance - Cache & Page Speed Optimization for Core Web Vitals | Critical CSS | Minify CSS | Defer CSS Javascript | CDN](https://wordpress.org/plugins/hummingbird-performance/)
 * [Frequently Asked Questions](https://wordpress.org/plugins/hummingbird-performance/#faq)
 * [Support Threads](https://wordpress.org/support/plugin/hummingbird-performance/)
 * [Active Topics](https://wordpress.org/support/plugin/hummingbird-performance/active/)
 * [Unresolved Topics](https://wordpress.org/support/plugin/hummingbird-performance/unresolved/)
 * [Reviews](https://wordpress.org/support/plugin/hummingbird-performance/reviews/)

 * 2 replies
 * 2 participants
 * Last reply from: [TRY01](https://wordpress.org/support/users/try01/)
 * Last activity: [6 years, 6 months ago](https://wordpress.org/support/topic/possible-feature-request/#post-12200101)
 * Status: resolved