Same name in other branches
  1. 5.0.x advagg_js_minify/jsqueeze.inc \Patchwork\JSqueeze::squeeze()
  2. 6.0.x advagg_js_minify/jsqueeze.inc \Patchwork\JSqueeze::squeeze()
  3. 7.x-2.x advagg_js_compress/jsqueeze.inc \Patchwork\JSqueeze::squeeze()
  4. 8.x-2.x advagg_js_minify/jsqueeze.inc \Patchwork\JSqueeze::squeeze()
  5. 8.x-4.x advagg_js_minify/jsqueeze.inc \Patchwork\JSqueeze::squeeze()

Squeezes a JavaScript source code.

Set $singleLine to false if you want optional semi-colons to be replaced by line feeds.

Set $keepImportantComments to false if you want /*! comments to be removed.

$specialVarRx defines the regular expression of special variables names for global vars, methods, properties and in string substitution. Set it to false if you don't want any.

If the analysed javascript source contains a single line comment like this one, then the directive will overwrite $specialVarRx:

// jsqueeze.specialVarRx = your_special_var_regexp_here

Only the first directive is parsed, others are ignored. It is not possible to redefine $specialVarRx in the middle of the javascript source.

Example: $parser = new JSqueeze; $squeezed_js = $parser->squeeze($fat_js);

Fichier

advagg_js_minify/jsqueeze.inc, line 144

Classe

JSqueeze

Namespace

Patchwork

Code

function squeeze($code, $singleLine = true, $keepImportantComments = true, $specialVarRx = false) {
    $code = trim($code);
    if ('' === $code) {
        return '';
    }
    $this->argFreq = array(
        -1 => 0,
    );
    $this->specialVarRx = $specialVarRx;
    $this->keepImportantComments = !!$keepImportantComments;
    if (preg_match("#//[ \t]*jsqueeze\\.specialVarRx[ \t]*=[ \t]*([\"']?)(.*)\x01#i", $code, $key)) {
        if (!$key[1]) {
            $key[2] = trim($key[2]);
            $key[1] = strtolower($key[2]);
            $key[1] = $key[1] && $key[1] != 'false' && $key[1] != 'none' && $key[1] != 'off';
        }
        $this->specialVarRx = $key[1] ? $key[2] : false;
    }
    // Remove capturing parentheses
    $this->specialVarRx && ($this->specialVarRx = preg_replace('/(?<!\\\\)((?:\\\\\\\\)*)\\((?!\\?)/', '(?:', $this->specialVarRx));
    false !== strpos($code, "\r") && ($code = strtr(str_replace("\r\n", "\n", $code), "\r", "\n"));
    false !== strpos($code, "…") && ($code = str_replace("…", "\n", $code));
    // Next Line
    false !== strpos($code, "
") && ($code = str_replace("
", "\n", $code));
    // Line Separator
    false !== strpos($code, "
") && ($code = str_replace("
", "\n", $code));
    // Paragraph Separator
    list($code, $this->strings) = $this->extractStrings($code);
    list($code, $this->closures) = $this->extractClosures($code);
    $key = "//''\"\"#0'";
    // This crap has a wonderful property: it can not happen in any valid javascript, even in strings
    $this->closures[$key] =& $code;
    $tree = array(
        $key => array(
            'parent' => false,
        ),
    );
    $this->makeVars($code, $tree[$key], $key);
    $this->renameVars($tree[$key], true);
    $code = substr($tree[$key]['code'], 1);
    $code = preg_replace("'\\breturn !'", 'return!', $code);
    $code = preg_replace("'\\}(?=(else|while)[^\$.a-zA-Z0-9_])'", "}\r", $code);
    $code = str_replace(array_keys($this->strings), array_values($this->strings), $code);
    if ($singleLine) {
        $code = strtr($code, "\n", ';');
    }
    else {
        $code = str_replace("\n", ";\n", $code);
    }
    false !== strpos($code, "\r") && ($code = strtr(trim($code), "\r", "\n"));
    // Cleanup memory
    $this->charFreq = array_fill(0, 256, 0);
    $this->strings = $this->closures = $this->argFreq = array();
    $this->str0 = $this->str1 = '';
    return $code;
}