summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Andreev <narf@bofh.bg>2012-12-19 14:01:14 +0100
committerAndrey Andreev <narf@bofh.bg>2012-12-19 14:01:14 +0100
commita9162502512e5eca4fa257689e7a250be900968f (patch)
treef0c45301f5122a15f8cf3f94f458b989a9dc4d5e
parentdbcd9a9c318c97cbe5d0ebef899ee1dbeb9e21c1 (diff)
parent9dfceda245c7833edd3311ed0e5e5704db34e847 (diff)
Merge pull request #2079 from AndrewPodner/develop
Issue #2078: refinement of the minify function for CSS and scripts.
-rw-r--r--system/core/Output.php95
1 files changed, 82 insertions, 13 deletions
diff --git a/system/core/Output.php b/system/core/Output.php
index 0ba0a5743..2793d4132 100644
--- a/system/core/Output.php
+++ b/system/core/Output.php
@@ -728,13 +728,13 @@ class CI_Output {
preg_match_all('{<style.+</style>}msU', $output, $style_clean);
foreach ($style_clean[0] as $s)
{
- $output = str_replace($s, $this->minify($s, 'text/css'), $output);
+ $output = str_replace($s, $this->_minify_script_style($s, TRUE), $output);
}
// Minify the javascript in <script> tags.
foreach ($javascript_clean[0] as $s)
{
- $javascript_mini[] = $this->minify($s, 'text/javascript');
+ $javascript_mini[] = $this->_minify_script_style($s, TRUE);
}
// Replace multiple spaces with a single space.
@@ -782,22 +782,91 @@ class CI_Output {
case 'text/css':
case 'text/javascript':
- //Remove CSS comments
- $output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output);
+ $output = $this->_minify_script_style($output);
- // Remove spaces around curly brackets, colons,
- // semi-colons, parenthesis, commas
- $output = preg_replace('!\s*(:|;|,|}|{|\(|\))\s*!', '$1', $output);
+ break;
- // Remove spaces
- $output = preg_replace('/ /s', ' ', $output);
+ default: break;
+ }
+
+ return $output;
+ }
- // Remove breaklines and tabs
- $output = preg_replace('/[\r\n\t]/', '', $output);
- break;
+ // --------------------------------------------------------------------
- default: break;
+ /**
+ * Minify Style and Script
+ *
+ * Reduce excessive size of CSS/JavaScript content. To remove spaces this
+ * script walks the string as an array and determines if the pointer is inside
+ * a string created by single quotes or double quotes. spaces inside those
+ * strings are not stripped. Opening and closing tags are severed from
+ * the string initially and saved without stripping whitespace to preserve
+ * the tags and any associated properties if tags are present
+ *
+ * @param string $output Output to minify
+ * @param bool $has_tags specify if the output has style or script tags
+ * @return string Minified output
+ */
+ protected function _minify_script_style($output, $has_tags = FALSE)
+ {
+ // We only need this if there are tags in the file
+ if ($has_tags === TRUE)
+ {
+ // Remove opening tag and save for later
+ $pos = strpos($output, '>');
+ $open_tag = substr($output, 0, $pos);
+ $output = substr_replace($output, '', 0, $pos);
+
+ // Remove closing tag and save it for later
+ $end_pos = strlen($output);
+ $pos = strpos($output, '</');
+ $closing_tag = substr($output, $pos, $end_pos);
+ $output = substr_replace($output, '', $pos);
+ }
+
+ // Remove CSS comments
+ $output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output);
+
+ // Remove spaces around curly brackets, colons,
+ // semi-colons, parenthesis, commas
+ $output = preg_replace('!\s*(:|;|,|}|{|\(|\))\s*!', '$1', $output);
+
+ // Remove spaces
+ $in_string = FALSE;
+ $in_dstring = FALSE;
+ $array_output = str_split($output);
+ foreach ($array_output as $key => $value)
+ {
+ if ($in_string === FALSE && $in_dstring === FALSE)
+ {
+ if ($value === ' ')
+ {
+ unset($array_output[$key]);
+ }
+ }
+
+ if ($value === "'")
+ {
+ $in_string = ! $in_string;
+ }
+
+ if ($value === '"')
+ {
+ $in_dstring = ! $in_dstring;
+ }
+ }
+
+ $output = implode($array_output);
+
+ // Remove breaklines and tabs
+ $output = preg_replace('/[\r\n\t]/', '', $output);
+
+ // Put the opening and closing tags back if applicable
+ if (isset($open_tag))
+ {
+ $output = $open_tag.$output.$closing_tag;
}
return $output;