summaryrefslogtreecommitdiffstats
path: root/system/core/Output.php
diff options
context:
space:
mode:
authorAndrey Andreev <narf@devilix.net>2014-12-15 16:28:23 +0100
committerAndrey Andreev <narf@devilix.net>2014-12-15 16:28:23 +0100
commit466e8ccb0ad647fd8e477e881dfddc14c6d7cbc8 (patch)
treeb6d5228e553f821147bdae2a1f307bbcf3404f41 /system/core/Output.php
parent8586d0d51efb9c8a756ebfdcd3b341aafaa7affc (diff)
Remove output minifier
This feature has proven to be problematic and it's not nearly as flexible as a dedicated minifier library like Minify (http://www.minifier.org/, https://github.com/matthiasmullie/minify). The same results in terms of saving traffic can also be achievied via gzip compression (which should also be done on the httpd level, but we also support anyway) and stuff like mod_pagespeed. Reverts PR #965 Related issues as a track record proving how problematic this has been: #2078 #1499 #2163 #2092 #2387 #2637 #2710 #2120 #2171 #2631 #2326 #2795 #2791 #2772 Additionally, the count of contributors suggesting that the only way to fix the minifier problems is to remove it, is around the same as the count of people suggesting the feature to be implemented in the first place. It was experimental anyway ... the experiment failed.
Diffstat (limited to 'system/core/Output.php')
-rw-r--r--system/core/Output.php208
1 files changed, 0 insertions, 208 deletions
diff --git a/system/core/Output.php b/system/core/Output.php
index e8f0b1590..09d251fe2 100644
--- a/system/core/Output.php
+++ b/system/core/Output.php
@@ -426,14 +426,6 @@ class CI_Output {
// --------------------------------------------------------------------
- // Is minify requested?
- if ($CFG->item('minify_output') === TRUE)
- {
- $output = $this->minify($output, $this->mime_type);
- }
-
- // --------------------------------------------------------------------
-
// Do we need to write a cache file? Only if the controller does not have its
// own _output() method and we are not dealing with a cache file, which we
// can determine by the existence of the $CI object above
@@ -784,206 +776,6 @@ class CI_Output {
}
}
- // --------------------------------------------------------------------
-
- /**
- * Minify
- *
- * Reduce excessive size of HTML/CSS/JavaScript content.
- *
- * @param string $output Output to minify
- * @param string $type Output content MIME type
- * @return string Minified output
- */
- public function minify($output, $type = 'text/html')
- {
- switch ($type)
- {
- case 'text/html':
-
- if (($size_before = strlen($output)) === 0)
- {
- return '';
- }
-
- // Find all the <pre>,<code>,<textarea>, and <javascript> tags
- // We'll want to return them to this unprocessed state later.
- preg_match_all('{<pre.+</pre>}msU', $output, $pres_clean);
- preg_match_all('{<code.+</code>}msU', $output, $codes_clean);
- preg_match_all('{<textarea.+</textarea>}msU', $output, $textareas_clean);
- preg_match_all('{<script.+</script>}msU', $output, $javascript_clean);
-
- // Minify the CSS in all the <style> tags.
- preg_match_all('{<style.+</style>}msU', $output, $style_clean);
- foreach ($style_clean[0] as $s)
- {
- $output = str_replace($s, $this->_minify_js_css($s, 'css', TRUE), $output);
- }
-
- // Minify the javascript in <script> tags.
- foreach ($javascript_clean[0] as $s)
- {
- $javascript_mini[] = $this->_minify_js_css($s, 'js', TRUE);
- }
-
- // Replace multiple spaces with a single space.
- $output = preg_replace('!\s{2,}!', ' ', $output);
-
- // Remove comments (non-MSIE conditionals)
- $output = preg_replace('{\s*<!--[^\[<>].*(?<!!)-->\s*}msU', '', $output);
-
- // Remove spaces around block-level elements.
- $output = preg_replace('/\s*(<\/?(html|head|title|meta|script|link|style|body|table|thead|tbody|tfoot|tr|th|td|h[1-6]|div|p|br)[^>]*>)\s*/is', '$1', $output);
-
- // Replace mangled <pre> etc. tags with unprocessed ones.
-
- if ( ! empty($pres_clean))
- {
- preg_match_all('{<pre.+</pre>}msU', $output, $pres_messed);
- $output = str_replace($pres_messed[0], $pres_clean[0], $output);
- }
-
- if ( ! empty($codes_clean))
- {
- preg_match_all('{<code.+</code>}msU', $output, $codes_messed);
- $output = str_replace($codes_messed[0], $codes_clean[0], $output);
- }
-
- if ( ! empty($textareas_clean))
- {
- preg_match_all('{<textarea.+</textarea>}msU', $output, $textareas_messed);
- $output = str_replace($textareas_messed[0], $textareas_clean[0], $output);
- }
-
- if (isset($javascript_mini))
- {
- preg_match_all('{<script.+</script>}msU', $output, $javascript_messed);
- $output = str_replace($javascript_messed[0], $javascript_mini, $output);
- }
-
- $size_removed = $size_before - strlen($output);
- $savings_percent = round(($size_removed / $size_before * 100));
-
- log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
-
- break;
-
- case 'text/css':
-
- return $this->_minify_js_css($output, 'css');
-
- case 'text/javascript':
- case 'application/javascript':
- case 'application/x-javascript':
-
- return $this->_minify_js_css($output, 'js');
-
- default: break;
- }
-
- return $output;
- }
-
- // --------------------------------------------------------------------
-
- /**
- * Minify JavaScript and CSS code
- *
- * Strips comments and excessive whitespace characters
- *
- * @param string $output
- * @param string $type 'js' or 'css'
- * @param bool $tags Whether $output contains the 'script' or 'style' tag
- * @return string
- */
- protected function _minify_js_css($output, $type, $tags = FALSE)
- {
- if ($tags === TRUE)
- {
- $tags = array('close' => strrchr($output, '<'));
-
- $open_length = strpos($output, '>') + 1;
- $tags['open'] = substr($output, 0, $open_length);
-
- $output = substr($output, $open_length, -strlen($tags['close']));
-
- // Strip spaces from the tags
- $tags = preg_replace('#\s{2,}#', ' ', $tags);
- }
-
- $output = trim($output);
-
- if ($type === 'js')
- {
- // Catch all string literals and comment blocks
- if (preg_match_all('#((?:((?<!\\\)\'|")|(/\*)|(//)).*(?(2)(?<!\\\)\2|(?(3)\*/|\n)))#msuUS', $output, $match, PREG_OFFSET_CAPTURE))
- {
- $js_literals = $js_code = array();
- for ($match = $match[0], $c = count($match), $i = $pos = $offset = 0; $i < $c; $i++)
- {
- $js_code[$pos++] = trim(substr($output, $offset, $match[$i][1] - $offset));
- $offset = $match[$i][1] + strlen($match[$i][0]);
-
- // Save only if we haven't matched a comment block
- if ($match[$i][0][0] !== '/')
- {
- $js_literals[$pos++] = array_shift($match[$i]);
- }
- }
- $js_code[$pos] = substr($output, $offset);
-
- // $match might be quite large, so free it up together with other vars that we no longer need
- unset($match, $offset, $pos);
- }
- else
- {
- $js_code = array($output);
- $js_literals = array();
- }
-
- $varname = 'js_code';
- }
- else
- {
- $varname = 'output';
- }
-
- // Standartize new lines
- $$varname = str_replace(array("\r\n", "\r"), "\n", $$varname);
-
- if ($type === 'js')
- {
- $patterns = array(
- '#\s*([!\#%&()*+,\-./:;<=>?@\[\]^`{|}~])\s*#' => '$1', // Remove spaces following and preceeding JS-wise non-special & non-word characters
- '#\s{2,}#' => ' ' // Reduce the remaining multiple whitespace characters to a single space
- );
- }
- else
- {
- $patterns = array(
- '#/\*.*(?=\*/)\*/#s' => '', // Remove /* block comments */
- '#\n?//[^\n]*#' => '', // Remove // line comments
- '#\s*([^\w.\#%])\s*#U' => '$1', // Remove spaces following and preceeding non-word characters, excluding dots, hashes and the percent sign
- '#\s{2,}#' => ' ' // Reduce the remaining multiple space characters to a single space
- );
- }
-
- $$varname = preg_replace(array_keys($patterns), array_values($patterns), $$varname);
-
- // Glue back JS quoted strings
- if ($type === 'js')
- {
- $js_code += $js_literals;
- ksort($js_code);
- $output = implode($js_code);
- unset($js_code, $js_literals, $varname, $patterns);
- }
-
- return is_array($tags)
- ? $tags['open'].$output.$tags['close']
- : $output;
- }
-
}
/* End of file Output.php */