Gentics Portal.Node PHP API
 All Classes Namespaces Functions Variables Pages
Public Member Functions | Static Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | List of all members
JSMin Class Reference

Public Member Functions

 __construct ($input)

Static Public Member Functions

static minify ($js)

Public Attributes

const ORD_LF = 10
const ORD_SPACE = 32
const ACTION_KEEP_A = 1
const ACTION_DELETE_A = 2
const ACTION_DELETE_A_B = 3

Protected Member Functions

 action ($command)
 get ()
 isAlphaNum ($c)
 min ()
 next ()
 peek ()

Protected Attributes

 $a = ''
 $b = ''
 $input = ''
 $inputIndex = 0
 $inputLength = 0
 $lookAhead = null
 $output = ''

Detailed Description

Definition at line 48 of file JSMin.php.

Constructor & Destructor Documentation

JSMin::__construct (   $input)

Constructor

Parameters
string$inputJavascript to be minified

Definition at line 85 of file JSMin.php.

{
$this->input = str_replace("\r\n", "\n", $input);
$this->inputLength = strlen($this->input);
}

Member Function Documentation

JSMin::action (   $command)
protected

Action – do something! What to do is determined by the $command argument.

action treats a string as a single character. Wow! action recognizes a regular expression if it is preceded by ( or , or =.

next() get()

Exceptions
JSMinExceptionIf parser errors are found:
  • Unterminated string literal
  • Unterminated regular expression set in regex literal
  • Unterminated regular expression literal
Parameters
int$commandOne of class constants: ACTION_KEEP_A Output A. Copy B to A. Get the next B. ACTION_DELETE_A Copy B to A. Get the next B. (Delete A). ACTION_DELETE_A_B Get the next B. (Delete B).

Definition at line 109 of file JSMin.php.

References next().

Referenced by min().

{
switch($command) {
case self::ACTION_KEEP_A:
$this->output .= $this->a;
case self::ACTION_DELETE_A:
$this->a = $this->b;
if ($this->a === "'" || $this->a === '"') {
for (;;) {
$this->output .= $this->a;
$this->a = $this->get();
if ($this->a === $this->b) {
break;
}
if (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('Unterminated string literal.');
}
if ($this->a === '\\') {
$this->output .= $this->a;
$this->a = $this->get();
}
}
}
case self::ACTION_DELETE_A_B:
$this->b = $this->next();
if ($this->b === '/' && (
$this->a === '(' || $this->a === ',' || $this->a === '=' ||
$this->a === ':' || $this->a === '[' || $this->a === '!' ||
$this->a === '&' || $this->a === '|' || $this->a === '?' ||
$this->a === '{' || $this->a === '}' || $this->a === ';' ||
$this->a === "\n" )) {
$this->output .= $this->a . $this->b;
for (;;) {
$this->a = $this->get();
if ($this->a === '[') {
/*
inside a regex [...] set, which MAY contain a '/' itself. Example: mootools Form.Validator near line 460:
return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(element.get('value'));
*/
for (;;) {
$this->output .= $this->a;
$this->a = $this->get();
if ($this->a === ']') {
break;
} elseif ($this->a === '\\') {
$this->output .= $this->a;
$this->a = $this->get();
} elseif (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('Unterminated regular expression set in regex literal.');
}
}
} elseif ($this->a === '/') {
break;
} elseif ($this->a === '\\') {
$this->output .= $this->a;
$this->a = $this->get();
} elseif (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('Unterminated regular expression literal.');
}
$this->output .= $this->a;
}
$this->b = $this->next();
}
}
}
JSMin::get ( )
protected

Get next char. Convert ctrl char to space.

Returns
string|null

Definition at line 192 of file JSMin.php.

{
$c = $this->lookAhead;
$this->lookAhead = null;
if ($c === null) {
if ($this->inputIndex < $this->inputLength) {
$c = substr($this->input, $this->inputIndex, 1);
$this->inputIndex += 1;
} else {
$c = null;
}
}
if ($c === "\r") {
return "\n";
}
if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
return $c;
}
return ' ';
}
JSMin::isAlphaNum (   $c)
protected

Is $c a letter, digit, underscore, dollar sign, or non-ASCII character.

Returns
bool

Definition at line 221 of file JSMin.php.

Referenced by min().

{
return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1;
}
JSMin::min ( )
protected

Perform minification, return result

action() isAlphaNum()

Returns
string

Definition at line 232 of file JSMin.php.

References action(), and isAlphaNum().

{
$this->a = "\n";
$this->action(self::ACTION_DELETE_A_B);
while ($this->a !== null) {
switch ($this->a) {
case ' ':
if ($this->isAlphaNum($this->b)) {
$this->action(self::ACTION_KEEP_A);
} else {
$this->action(self::ACTION_DELETE_A);
}
break;
case "\n":
switch ($this->b) {
case '{':
case '[':
case '(':
case '+':
case '-':
$this->action(self::ACTION_KEEP_A);
break;
case ' ':
$this->action(self::ACTION_DELETE_A_B);
break;
default:
if ($this->isAlphaNum($this->b)) {
$this->action(self::ACTION_KEEP_A);
}
else {
$this->action(self::ACTION_DELETE_A);
}
}
break;
default:
switch ($this->b) {
case ' ':
if ($this->isAlphaNum($this->a)) {
$this->action(self::ACTION_KEEP_A);
break;
}
$this->action(self::ACTION_DELETE_A_B);
break;
case "\n":
switch ($this->a) {
case '}':
case ']':
case ')':
case '+':
case '-':
case '"':
case "'":
$this->action(self::ACTION_KEEP_A);
break;
default:
if ($this->isAlphaNum($this->a)) {
$this->action(self::ACTION_KEEP_A);
}
else {
$this->action(self::ACTION_DELETE_A_B);
}
}
break;
default:
$this->action(self::ACTION_KEEP_A);
break;
}
}
}
return $this->output;
}
static JSMin::minify (   $js)
static

Minify Javascript

__construct() min()

Parameters
string$jsJavascript to be minified
Returns
string

Definition at line 73 of file JSMin.php.

Referenced by CssCompressExpressionValuesMinifierPlugin\apply().

{
$jsmin = new JSMin($js);
return $jsmin->min();
}
JSMin::next ( )
protected

Get the next character, skipping over comments. peek() is used to see if a '/' is followed by a '/' or '*'.

get() peek()

Exceptions
JSMinExceptionOn unterminated comment.
Returns
string

Definition at line 322 of file JSMin.php.

References peek().

Referenced by action().

{
$c = $this->get();
if ($c === '/') {
switch($this->peek()) {
case '/':
for (;;) {
$c = $this->get();
if (ord($c) <= self::ORD_LF) {
return $c;
}
}
case '*':
$this->get();
for (;;) {
switch($this->get()) {
case '*':
if ($this->peek() === '/') {
$this->get();
return ' ';
}
break;
case null:
throw new JSMinException('Unterminated comment.');
}
}
default:
return $c;
}
}
return $c;
}
JSMin::peek ( )
protected

Get next char. If is ctrl character, translate to a space or newline.

get()

Returns
string|null

Definition at line 367 of file JSMin.php.

Referenced by next().

{
$this->lookAhead = $this->get();
return $this->lookAhead;
}

The documentation for this class was generated from the following file: