Index: branches/5.0.x/core/kernel/nparser/nparser.php =================================================================== diff -u -r12229 -r12277 --- branches/5.0.x/core/kernel/nparser/nparser.php (.../nparser.php) (revision 12229) +++ branches/5.0.x/core/kernel/nparser/nparser.php (.../nparser.php) (revision 12277) @@ -1,6 +1,6 @@ _compressOutput = $this->Application->ConfigValue('UseTemplateCompression'); } function Compile($pre_parsed, $template_name = 'unknown') @@ -74,6 +80,11 @@ } else { $compiled = fopen($pre_parsed['fname'], 'w'); + + if ($this->_compressOutput) { + $this->Buffers[0] = $this->_compress($this->Buffers[0]); + } + if (!fwrite($compiled, $this->Buffers[0])) { trigger_error('Saving compiled template failed', E_USER_ERROR); } @@ -729,4 +740,140 @@ $this->CacheSet($this->PopPointer(), $ret); // . ($this->CurrentKeyPart ? ':'.$this->CurrentKeyPart : '') echo $ret; } + + function _compress($src) { + // Whitespaces left and right from this signs can be ignored + static $IW = array( + T_CONCAT_EQUAL, // .= + T_DOUBLE_ARROW, // => + T_BOOLEAN_AND, // && + T_BOOLEAN_OR, // || + T_IS_EQUAL, // == + T_IS_NOT_EQUAL, // != or <> + T_IS_SMALLER_OR_EQUAL, // <= + T_IS_GREATER_OR_EQUAL, // >= + T_INC, // ++ + T_DEC, // -- + T_PLUS_EQUAL, // += + T_MINUS_EQUAL, // -= + T_MUL_EQUAL, // *= + T_DIV_EQUAL, // /= + T_IS_IDENTICAL, // === + T_IS_NOT_IDENTICAL, // !== + T_DOUBLE_COLON, // :: + T_PAAMAYIM_NEKUDOTAYIM, // :: + T_OBJECT_OPERATOR, // -> + T_DOLLAR_OPEN_CURLY_BRACES, // ${ + T_AND_EQUAL, // &= + T_MOD_EQUAL, // %= + T_XOR_EQUAL, // ^= + T_OR_EQUAL, // |= + T_SL, // << + T_SR, // >> + T_SL_EQUAL, // <<= + T_SR_EQUAL, // >>= + ); + + $tokens = token_get_all($src); + + $new = ""; + $c = sizeof($tokens); + $iw = false; // ignore whitespace + $ih = false; // in HEREDOC + $ls = ""; // last sign + $ot = null; // open tag + + for ($i = 0; $i < $c; $i++) { + $token = $tokens[$i]; + + if (is_array($token)) { + list ($tn, $ts) = $token; // tokens: number, string, line + $tname = token_name($tn); + + if ($tn == T_INLINE_HTML) { + $new .= $ts; + $iw = false; + } else { + if ($tn == T_OPEN_TAG) { + if (strpos($ts, " ") || strpos($ts, "\n") || strpos($ts, "\t") || strpos($ts, "\r")) { + $ts = rtrim($ts); + } + + $ts .= " "; + $new .= $ts; + $ot = T_OPEN_TAG; + $iw = true; + } elseif ($tn == T_OPEN_TAG_WITH_ECHO) { + $new .= $ts; + $ot = T_OPEN_TAG_WITH_ECHO; + $iw = true; + } elseif ($tn == T_CLOSE_TAG) { + if ($ot == T_OPEN_TAG_WITH_ECHO) { + $new = rtrim($new, "; "); + } else { + $ts = " ".$ts; + } + + $new .= $ts; + $ot = null; + $iw = false; + } elseif (in_array($tn, $IW)) { + $new .= $ts; + $iw = true; + } elseif ($tn == T_CONSTANT_ENCAPSED_STRING || $tn == T_ENCAPSED_AND_WHITESPACE) { + if ($ts[0] == '"') { + $ts = addcslashes($ts, "\n\t\r"); + } + + $new .= $ts; + $iw = true; + } elseif ($tn == T_WHITESPACE) { + $nt = @$tokens[$i+1]; + if (!$iw && (!is_string($nt) || $nt == '$') && !in_array($nt[0], $IW)) { + $new .= " "; + } + + $iw = false; + } elseif ($tn == T_START_HEREDOC) { + $new .= "<<