Recently i worked on improving page load using Google's page speed tool. One of the suggestion includes minifying HTML , page speed indicated around 10 to 30 % improvement using minifyer.
So i decided to include it in our project which is built on CodeIgniter framework.
In CodeIgniter we can use hooks so that before HTML output is sent to browser it can be minifyed. here's how-
1) Enable hooks if not done previously
- Set $config['enable_hooks'] = TRUE; in /system/application/config/config.php.
2)Configure the hook function in /system/application/config/hooks.php. as below-
$hook['display_override'] = array(
'class' => 'Minifyhtml',
'function' => 'minify',
'filename' => 'Minifyhtml.php',
'filepath' => 'hooks'
);
3) Create Minifyhtml.php in /system/application/hooks/ folder with following content. Following HTML minifying code is extracted from minifyer http://code.google.com/p/minify/ which is better than all available other as it wont break your existing HTML.
class Minifyhtml {
/**
* "Minify" an HTML page
*
* @param string $html
*
* @param array $options
*
* 'cssMinifier' : (optional) callback function to process content of STYLE elements.
*
* 'jsMinifier' : (optional) callback function to process content of SCRIPT elements. Note: the type attribute
* is ignored.
* 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If unset, minify will sniff for an
* XHTML doctype.
*
* @return string
*/
function minify() {
$CI =& get_instance();
$buffer = $CI->output->get_output();
$options = array();
$min = new Minifyhtml();
$min->pre_process($buffer, $options);
return $min->process();
}
/**
* Create a minifier object
*
* @param string $html
*
* @param array $options
*
* 'cssMinifier' : (optional) callback function to process content of STYLE elements.
*
*
* 'jsMinifier' : (optional) callback function to process content of SCRIPT elements. Note: the type attribute
* is ignored.
*
* 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If unset, minify will sniff for an
* XHTML doctype.
* @return null
*/
public function pre_process($html, $options = array())
{
$this->_html = str_replace("\r\n", "\n", trim($html));
if (isset($options['xhtml'])) {
$this->_isXhtml = (bool)$options['xhtml'];
}
if (isset($options['cssMinifier'])) {
$this->_cssMinifier = $options['cssMinifier'];
}
if (isset($options['jsMinifier'])) {
$this->_jsMinifier = $options['jsMinifier'];
}
}
/**
* Minify the markeup
*
* @return string
*/
public function process()
{
if ($this->_isXhtml === null) {
$this->_isXhtml = (false !== strpos($this->_html, '
}
$this->_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']);
$this->_placeholders = array();
// replace SCRIPTs (and minify) with placeholders
$this->_html = preg_replace_callback(
'/(\\s*)(
<>&lgt;>
<>
<><>
So i decided to include it in our project which is built on CodeIgniter framework.
In CodeIgniter we can use hooks so that before HTML output is sent to browser it can be minifyed. here's how-
1) Enable hooks if not done previously
- Set $config['enable_hooks'] = TRUE; in /system/application/config/config.php.
2)Configure the hook function in /system/application/config/hooks.php. as below-
$hook['display_override'] = array(
'class' => 'Minifyhtml',
'function' => 'minify',
'filename' => 'Minifyhtml.php',
'filepath' => 'hooks'
);
3) Create Minifyhtml.php in /system/application/hooks/ folder with following content. Following HTML minifying code is extracted from minifyer http://code.google.com/p/minify/ which is better than all available other as it wont break your existing HTML.
class Minifyhtml {
/**
* "Minify" an HTML page
*
* @param string $html
*
* @param array $options
*
* 'cssMinifier' : (optional) callback function to process content of STYLE elements.
*
* 'jsMinifier' : (optional) callback function to process content of SCRIPT elements. Note: the type attribute
* is ignored.
* 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If unset, minify will sniff for an
* XHTML doctype.
*
* @return string
*/
function minify() {
$CI =& get_instance();
$buffer = $CI->output->get_output();
$options = array();
$min = new Minifyhtml();
$min->pre_process($buffer, $options);
return $min->process();
}
/**
* Create a minifier object
*
* @param string $html
*
* @param array $options
*
* 'cssMinifier' : (optional) callback function to process content of STYLE elements.
*
*
* 'jsMinifier' : (optional) callback function to process content of SCRIPT elements. Note: the type attribute
* is ignored.
*
* 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If unset, minify will sniff for an
* XHTML doctype.
* @return null
*/
public function pre_process($html, $options = array())
{
$this->_html = str_replace("\r\n", "\n", trim($html));
if (isset($options['xhtml'])) {
$this->_isXhtml = (bool)$options['xhtml'];
}
if (isset($options['cssMinifier'])) {
$this->_cssMinifier = $options['cssMinifier'];
}
if (isset($options['jsMinifier'])) {
$this->_jsMinifier = $options['jsMinifier'];
}
}
/**
* Minify the markeup
*
* @return string
*/
public function process()
{
if ($this->_isXhtml === null) {
$this->_isXhtml = (false !== strpos($this->_html, '
}
$this->_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']);
$this->_placeholders = array();
// replace SCRIPTs (and minify) with placeholders
$this->_html = preg_replace_callback(
'/(\\s*)(
<>&lgt;>
<>
<><>