You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by Paul Lindner <li...@inuus.com> on 2010/09/23 16:26:28 UTC

Re: svn commit: r1000477 - /shindig/trunk/php/external/jsmin-php/jsmin.php

We need to find a way to replace jsmin with something better.

Right now a phpunit run on a cold cache with code-coverage profiling turned
on takes about 19 minutes.  Plus there's the 'don't be evil' clause of the
jsmin license which many lawyers do not like.

On Thu, Sep 23, 2010 at 7:12 AM, <bh...@apache.org> wrote:

> Author: bhofmann
> Date: Thu Sep 23 14:12:11 2010
> New Revision: 1000477
>
> URL: http://svn.apache.org/viewvc?rev=1000477&view=rev
> Log:
> reverted jsmin.php to old version because new has problems with method and
> variable names that begin with underscore (e.g. "function
> _IG_Fetch_wrapper(" was transformed to "function_IG_Fetch_wrapper(" )
>
> Modified:
>    shindig/trunk/php/external/jsmin-php/jsmin.php
>
> Modified: shindig/trunk/php/external/jsmin-php/jsmin.php
> URL:
> http://svn.apache.org/viewvc/shindig/trunk/php/external/jsmin-php/jsmin.php?rev=1000477&r1=1000476&r2=1000477&view=diff
>
> ==============================================================================
> --- shindig/trunk/php/external/jsmin-php/jsmin.php (original)
> +++ shindig/trunk/php/external/jsmin-php/jsmin.php Thu Sep 23 14:12:11 2010
> @@ -1,5 +1,5 @@
>  <?php
> -/**
> +/*
>  * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
>  *
>  * This is pretty much a direct port of jsmin.c to PHP with just a few
> @@ -45,39 +45,42 @@
>  * @link http://code.google.com/p/jsmin-php/
>  */
>
> -class JSMin {
> -  const ORD_LF    = 10;
> +class JsMinException extends Exception {
> +}
> +
> +class JsMin {
> +  const ORD_LF = 10;
>   const ORD_SPACE = 32;
>
> -  private $a           = '';
> -  private $b           = '';
> -  private $input       = '';
> -  private $inputIndex  = 0;
> -  private $inputLength = 0;
> -  private $lookAhead   = null;
> -  private $output      = '';
> +  protected $a = '';
> +  protected $b = '';
> +  protected $input = '';
> +  protected $inputIndex = 0;
> +  protected $inputLength = 0;
> +  protected $lookAhead = null;
> +  protected $output = '';
>
>   // -- Public Static Methods
> --------------------------------------------------
>
> +
>   public static function minify($js) {
> -    $jsmin = new JSMin($js);
> +    $jsmin = new JsMin($js);
>     return $jsmin->min();
>   }
>
>   // -- Public Instance Methods
> ------------------------------------------------
>
> +
>   public function __construct($input) {
> -    $this->input       = str_replace("\r\n", "\n", $input);
> -    if (strpos($this->input, "\r")) {
> -      $this->input = str_replace("\r", "\n", $this->input);
> -    }
> +    $this->input = str_replace("\r\n", "\n", $input);
>     $this->inputLength = strlen($this->input);
>   }
>
>   // -- Protected Instance Methods
> ---------------------------------------------
>
> -  private function action($d) {
> -    switch($d) {
> +
> +  protected function action($d) {
> +    switch ($d) {
>       case 1:
>         $this->output .= $this->a;
>
> @@ -87,33 +90,29 @@ class JSMin {
>         if ($this->a === "'" || $this->a === '"') {
>           for (;;) {
>             $this->output .= $this->a;
> -            $this->a       = $this->get();
> +            $this->a = $this->get();
>
>             if ($this->a === $this->b) {
>               break;
>             }
>
>             if (ord($this->a) <= self::ORD_LF) {
> -              throw new JSMinException('Unterminated string literal.');
> +              throw new JsMinException('Unterminated string literal.');
>             }
>
>             if ($this->a === '\\') {
>               $this->output .= $this->a;
> -              $this->a       = $this->get();
> +              $this->a = $this->get();
>             }
>           }
>         }
>
>       case 3:
>         $this->b = $this->next();
> -        $a = $this->a;
>
> -        if ($this->b === '/' && (
> -            $a === '(' || $a === ',' || $a === '=' ||
> -            $a === ':' || $a === '[' || $a === '!' ||
> -            $a === '&' || $a === '|' || $a === '?')) {
> +        if ($this->b === '/' && ($this->a === '(' || $this->a === ',' ||
> $this->a === '=' || $this->a === ':' || $this->a === '[' || $this->a === '!'
> || $this->a === '&' || $this->a === '|' || $this->a === '?')) {
>
> -          $this->output .= $a . $this->b;
> +          $this->output .= $this->a . $this->b;
>
>           for (;;) {
>             $this->a = $this->get();
> @@ -122,10 +121,9 @@ class JSMin {
>               break;
>             } elseif ($this->a === '\\') {
>               $this->output .= $this->a;
> -              $this->a       = $this->get();
> +              $this->a = $this->get();
>             } elseif (ord($this->a) <= self::ORD_LF) {
> -              throw new JSMinException('Unterminated regular expression '.
> -                  'literal.');
> +              throw new JsMinException('Unterminated regular expression '
> . 'literal.');
>             }
>
>             $this->output .= $this->a;
> @@ -136,73 +134,42 @@ class JSMin {
>     }
>   }
>
> -  private function getLF() {
> -    for (;;) {
> -      $c = $this->lookAhead;
> -      $this->lookAhead = null;
> -
> -      if ($c === null) {
> -        $c = ($this->inputIndex < $this->inputLength) ?
> -          $this->input{$this->inputIndex++} : null;
> -      }
> -
> -      $newval = ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE)
> ? $c : ' ';
> -
> -      if (ord($newval) <= self::ORD_LF) {
> -        return $newval;
> +  protected function get() {
> +    $c = $this->lookAhead;
> +    $this->lookAhead = null;
> +
> +    if ($c === null) {
> +      if ($this->inputIndex < $this->inputLength) {
> +        $c = $this->input[$this->inputIndex];
> +        $this->inputIndex += 1;
> +      } else {
> +        $c = null;
>       }
>     }
> -  }
> -
> -  private function getCommentEnd() {
> -    for (;;) {
> -      $c = $this->lookAhead;
> -      $this->lookAhead = null;
> -
> -      if ($c === null) {
> -        $c = ($this->inputIndex < $this->inputLength) ?
> -          $this->input{$this->inputIndex++} : null;
> -      }
>
> -      $newval = ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE)
> ? $c : ' ';
> -
> -      switch ($newval) {
> -      case '*':
> -        if ($this->peek() === '/') {
> -          $this->get();
> -          return ' ';
> -        }
> -        break;
> -      case null:
> -        throw new JSMinException('Unterminated comment.');
> -      }
> +    if ($c === "\r") {
> +      return "\n";
>     }
> -  }
>
> -  private function get() {
> -    if ($this->lookAhead === null) {
> -      $c = ($this->inputIndex < $this->inputLength) ?
> -        $this->input{$this->inputIndex++} : null;
> -    } else {
> -      $c = $this->lookAhead;
> -      $this->lookAhead = null;
> +    if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
> +      return $c;
>     }
>
> -    return ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) ? $c
> : ' ';
> +    return ' ';
>   }
>
> -  private function isAlphaNum($c) {
> -    return  $c === '\\' || ctype_alnum($c) || ord($c) > 126;
> +  protected function isAlphaNum($c) {
> +    return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c)
> === 1;
>   }
>
> -  private function min() {
> +  protected function min() {
>     $this->a = "\n";
>     $this->action(3);
>
>     while ($this->a !== null) {
>       switch ($this->a) {
>         case ' ':
> -          if (self::isAlphaNum($this->b)) {
> +          if ($this->isAlphaNum($this->b)) {
>             $this->action(1);
>           } else {
>             $this->action(2);
> @@ -211,10 +178,6 @@ class JSMin {
>
>         case "\n":
>           switch ($this->b) {
> -            case ' ':
> -              $this->action(3);
> -              break;
> -
>             case '{':
>             case '[':
>             case '(':
> @@ -223,12 +186,14 @@ class JSMin {
>               $this->action(1);
>               break;
>
> +            case ' ':
> +              $this->action(3);
> +              break;
>
>             default:
> -              if (self::isAlphaNum($this->b)) {
> +              if ($this->isAlphaNum($this->b)) {
>                 $this->action(1);
> -              }
> -              else {
> +              } else {
>                 $this->action(2);
>               }
>           }
> @@ -237,7 +202,7 @@ class JSMin {
>         default:
>           switch ($this->b) {
>             case ' ':
> -              if (self::isAlphaNum($this->a)) {
> +              if ($this->isAlphaNum($this->a)) {
>                 $this->action(1);
>                 break;
>               }
> @@ -258,10 +223,9 @@ class JSMin {
>                   break;
>
>                 default:
> -                  if (self::isAlphaNum($this->a)) {
> +                  if ($this->isAlphaNum($this->a)) {
>                     $this->action(1);
> -                  }
> -                  else {
> +                  } else {
>                     $this->action(3);
>                   }
>               }
> @@ -277,17 +241,36 @@ class JSMin {
>     return $this->output;
>   }
>
> -  private function next() {
> +  protected function next() {
>     $c = $this->get();
>
>     if ($c === '/') {
> -      switch($this->peek()) {
> +      switch ($this->peek()) {
>         case '/':
> -          return $this->getLF();
> +          for (;;) {
> +            $c = $this->get();
> +
> +            if (ord($c) <= self::ORD_LF) {
> +              return $c;
> +            }
> +          }
>
>         case '*':
>           $this->get();
> -          return $this->getCommentEnd();
> +
> +          for (;;) {
> +            switch ($this->get()) {
> +              case '*':
> +                if ($this->peek() === '/') {
> +                  $this->get();
> +                  return ' ';
> +                }
> +                break;
> +
> +              case null:
> +                throw new JsMinException('Unterminated comment.');
> +            }
> +          }
>
>         default:
>           return $c;
> @@ -297,11 +280,9 @@ class JSMin {
>     return $c;
>   }
>
> -  private function peek() {
> -    return $this->lookAhead = $this->get();
> +  protected function peek() {
> +    $this->lookAhead = $this->get();
> +    return $this->lookAhead;
>   }
>  }
>
> -// -- Exceptions
> ---------------------------------------------------------------
> -class JSMinException extends Exception {}
> -?>
>
>
>


-- 
Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner

Re: Building out end-to-end examples, and gadgets for interop, etc...

Posted by Chirag Shah <ch...@gmail.com>.
Hey Mark,

This is a great idea!  I've found example gadgets scattered around the
following places:

http://code.google.com/p/opensocial-resources/source/browse/samples/
http://wiki.opensocial.org/index.php?title=Articles_%26_Tutorials
http://wiki.opensocial.org/index.php?title=OpenSocial_Tutorial
http://wiki.opensocial.org/index.php?title=OpenSocial_Templates
http://wiki.opensocial.org/index.php?title=Social_Application_Tutorial

Just a heads up, some of these gadgets no longer work and need some tweaking.

Thanks,
Chirag

On Thu, Sep 23, 2010 at 12:46 PM, Mark D Weitzel <we...@us.ibm.com> wrote:
> Paul, et al.
>
> Quick question. We are starting to prepare for the Enterprise OpenSocial
> "Interop Fest" and a couple of questions came up.
>
> Given that we'd like to do as much of this as possible in the open, with
> example gadgets and the like being contributed to Shindig, where's the
> best place to put these. Right now, the samples directory is kind of a
> hodgepodge of "stuff", and my hope is that this work can serve as a
> catalyst to helping us clean up and organize the set of example gadgets
> that are available (as well as the documentation that goes with them!).
>
> A second thing we'd like to have is place to build and demonstrate better
> end-to-end examples. For the interop, I'd like to potentially have a
> "reference mashup" that we can use to add gadgets, show how things work,
> e.g. eventing, etc...
>
> This doesn't really feel like extras or sandbox. Maybe new folder under
> content is the right place.
>
> Thanks!
>
> -Mark W.
>

Building out end-to-end examples, and gadgets for interop, etc...

Posted by Mark D Weitzel <we...@us.ibm.com>.
Paul, et al.

Quick question. We are starting to prepare for the Enterprise OpenSocial 
"Interop Fest" and a couple of questions came up.

Given that we'd like to do as much of this as possible in the open, with 
example gadgets and the like being contributed to Shindig, where's the 
best place to put these. Right now, the samples directory is kind of a 
hodgepodge of "stuff", and my hope is that this work can serve as a 
catalyst to helping us clean up and organize the set of example gadgets 
that are available (as well as the documentation that goes with them!). 

A second thing we'd like to have is place to build and demonstrate better 
end-to-end examples. For the interop, I'd like to potentially have a 
"reference mashup" that we can use to add gadgets, show how things work, 
e.g. eventing, etc...

This doesn't really feel like extras or sandbox. Maybe new folder under 
content is the right place.

Thanks!

-Mark W.

Re: svn commit: r1000477 - /shindig/trunk/php/external/jsmin-php/jsmin.php

Posted by Paul Lindner <li...@inuus.com>.
Thanks!  This improves the hudson build times significantly:

     <http://hudson.inuus.com/job/Shindig%20Trunk/buildTimeTrend#>Build
 ↑<http://hudson.inuus.com/job/Shindig%20Trunk/buildTimeTrend#>
Duration    <http://hudson.inuus.com/job/Shindig%20Trunk/buildTimeTrend#>[image:
Success]#112 <http://hudson.inuus.com/job/Shindig%20Trunk/112>7 min 29
sec[image:
Success]#111 <http://hudson.inuus.com/job/Shindig%20Trunk/111>24 min[image:
Success]#110 <http://hudson.inuus.com/job/Shindig%20Trunk/110>21 min[image:
Success]#109 <http://hudson.inuus.com/job/Shindig%20Trunk/109>21 min[image:
Success]#108 <http://hudson.inuus.com/job/Shindig%20Trunk/108>21 min[image:
Success]#107 <http://hudson.inuus.com/job/Shindig%20Trunk/107>25 min[image:
Success]#106 <http://hudson.inuus.com/job/Shindig%20Trunk/106>25 min[image:
Failed]#105 <http://hudson.inuus.com/job/Shindig%20Trunk/105>25 min[image:
Success]#104 <http://hudson.inuus.com/job/Shindig%20Trunk/104>25 min[image:
Success]#103 <http://hudson.inuus.com/job/Shindig%20Trunk/103>35 min[image:
Success]#102 <http://hudson.inuus.com/job/Shindig%20Trunk/102>31 min[image:
Success]#101 <http://hudson.inuus.com/job/Shindig%20Trunk/101>6 min 45 sec



On Thu, Sep 23, 2010 at 8:34 AM, Bastian Hofmann
<ba...@googlemail.com>wrote:

> You are right, the performance from jsmin seems to be pretty bad,
> though it only takes 4 minutes on my machine.
> For the time being I deactivated JavaScript compression for unit tests
> since this is not really needed for the current test cases.
> I'll have a look if I find a solution that is better suited.
>
> Regards
>
> Bastian
>
> 2010/9/23 Paul Lindner <li...@inuus.com>:
> > We need to find a way to replace jsmin with something better.
> >
> > Right now a phpunit run on a cold cache with code-coverage profiling
> turned
> > on takes about 19 minutes.  Plus there's the 'don't be evil' clause of
> the
> > jsmin license which many lawyers do not like.
> >
> > On Thu, Sep 23, 2010 at 7:12 AM, <bh...@apache.org> wrote:
> >
> >> Author: bhofmann
> >> Date: Thu Sep 23 14:12:11 2010
> >> New Revision: 1000477
> >>
> >> URL: http://svn.apache.org/viewvc?rev=1000477&view=rev
> >> Log:
> >> reverted jsmin.php to old version because new has problems with method
> and
> >> variable names that begin with underscore (e.g. "function
> >> _IG_Fetch_wrapper(" was transformed to "function_IG_Fetch_wrapper(" )
> >>
> >> Modified:
> >>    shindig/trunk/php/external/jsmin-php/jsmin.php
> >>
> >> Modified: shindig/trunk/php/external/jsmin-php/jsmin.php
> >> URL:
> >>
> http://svn.apache.org/viewvc/shindig/trunk/php/external/jsmin-php/jsmin.php?rev=1000477&r1=1000476&r2=1000477&view=diff
> >>
> >>
> ==============================================================================
> >> --- shindig/trunk/php/external/jsmin-php/jsmin.php (original)
> >> +++ shindig/trunk/php/external/jsmin-php/jsmin.php Thu Sep 23 14:12:11
> 2010
> >> @@ -1,5 +1,5 @@
> >>  <?php
> >> -/**
> >> +/*
> >>  * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
> >>  *
> >>  * This is pretty much a direct port of jsmin.c to PHP with just a few
> >> @@ -45,39 +45,42 @@
> >>  * @link http://code.google.com/p/jsmin-php/
> >>  */
> >>
> >> -class JSMin {
> >> -  const ORD_LF    = 10;
> >> +class JsMinException extends Exception {
> >> +}
> >> +
> >> +class JsMin {
> >> +  const ORD_LF = 10;
> >>   const ORD_SPACE = 32;
> >>
> >> -  private $a           = '';
> >> -  private $b           = '';
> >> -  private $input       = '';
> >> -  private $inputIndex  = 0;
> >> -  private $inputLength = 0;
> >> -  private $lookAhead   = null;
> >> -  private $output      = '';
> >> +  protected $a = '';
> >> +  protected $b = '';
> >> +  protected $input = '';
> >> +  protected $inputIndex = 0;
> >> +  protected $inputLength = 0;
> >> +  protected $lookAhead = null;
> >> +  protected $output = '';
> >>
> >>   // -- Public Static Methods
> >> --------------------------------------------------
> >>
> >> +
> >>   public static function minify($js) {
> >> -    $jsmin = new JSMin($js);
> >> +    $jsmin = new JsMin($js);
> >>     return $jsmin->min();
> >>   }
> >>
> >>   // -- Public Instance Methods
> >> ------------------------------------------------
> >>
> >> +
> >>   public function __construct($input) {
> >> -    $this->input       = str_replace("\r\n", "\n", $input);
> >> -    if (strpos($this->input, "\r")) {
> >> -      $this->input = str_replace("\r", "\n", $this->input);
> >> -    }
> >> +    $this->input = str_replace("\r\n", "\n", $input);
> >>     $this->inputLength = strlen($this->input);
> >>   }
> >>
> >>   // -- Protected Instance Methods
> >> ---------------------------------------------
> >>
> >> -  private function action($d) {
> >> -    switch($d) {
> >> +
> >> +  protected function action($d) {
> >> +    switch ($d) {
> >>       case 1:
> >>         $this->output .= $this->a;
> >>
> >> @@ -87,33 +90,29 @@ class JSMin {
> >>         if ($this->a === "'" || $this->a === '"') {
> >>           for (;;) {
> >>             $this->output .= $this->a;
> >> -            $this->a       = $this->get();
> >> +            $this->a = $this->get();
> >>
> >>             if ($this->a === $this->b) {
> >>               break;
> >>             }
> >>
> >>             if (ord($this->a) <= self::ORD_LF) {
> >> -              throw new JSMinException('Unterminated string literal.');
> >> +              throw new JsMinException('Unterminated string literal.');
> >>             }
> >>
> >>             if ($this->a === '\\') {
> >>               $this->output .= $this->a;
> >> -              $this->a       = $this->get();
> >> +              $this->a = $this->get();
> >>             }
> >>           }
> >>         }
> >>
> >>       case 3:
> >>         $this->b = $this->next();
> >> -        $a = $this->a;
> >>
> >> -        if ($this->b === '/' && (
> >> -            $a === '(' || $a === ',' || $a === '=' ||
> >> -            $a === ':' || $a === '[' || $a === '!' ||
> >> -            $a === '&' || $a === '|' || $a === '?')) {
> >> +        if ($this->b === '/' && ($this->a === '(' || $this->a === ','
> ||
> >> $this->a === '=' || $this->a === ':' || $this->a === '[' || $this->a ===
> '!'
> >> || $this->a === '&' || $this->a === '|' || $this->a === '?')) {
> >>
> >> -          $this->output .= $a . $this->b;
> >> +          $this->output .= $this->a . $this->b;
> >>
> >>           for (;;) {
> >>             $this->a = $this->get();
> >> @@ -122,10 +121,9 @@ class JSMin {
> >>               break;
> >>             } elseif ($this->a === '\\') {
> >>               $this->output .= $this->a;
> >> -              $this->a       = $this->get();
> >> +              $this->a = $this->get();
> >>             } elseif (ord($this->a) <= self::ORD_LF) {
> >> -              throw new JSMinException('Unterminated regular expression
> '.
> >> -                  'literal.');
> >> +              throw new JsMinException('Unterminated regular expression
> '
> >> . 'literal.');
> >>             }
> >>
> >>             $this->output .= $this->a;
> >> @@ -136,73 +134,42 @@ class JSMin {
> >>     }
> >>   }
> >>
> >> -  private function getLF() {
> >> -    for (;;) {
> >> -      $c = $this->lookAhead;
> >> -      $this->lookAhead = null;
> >> -
> >> -      if ($c === null) {
> >> -        $c = ($this->inputIndex < $this->inputLength) ?
> >> -          $this->input{$this->inputIndex++} : null;
> >> -      }
> >> -
> >> -      $newval = ($c === null || $c === "\n" || ord($c) >=
> self::ORD_SPACE)
> >> ? $c : ' ';
> >> -
> >> -      if (ord($newval) <= self::ORD_LF) {
> >> -        return $newval;
> >> +  protected function get() {
> >> +    $c = $this->lookAhead;
> >> +    $this->lookAhead = null;
> >> +
> >> +    if ($c === null) {
> >> +      if ($this->inputIndex < $this->inputLength) {
> >> +        $c = $this->input[$this->inputIndex];
> >> +        $this->inputIndex += 1;
> >> +      } else {
> >> +        $c = null;
> >>       }
> >>     }
> >> -  }
> >> -
> >> -  private function getCommentEnd() {
> >> -    for (;;) {
> >> -      $c = $this->lookAhead;
> >> -      $this->lookAhead = null;
> >> -
> >> -      if ($c === null) {
> >> -        $c = ($this->inputIndex < $this->inputLength) ?
> >> -          $this->input{$this->inputIndex++} : null;
> >> -      }
> >>
> >> -      $newval = ($c === null || $c === "\n" || ord($c) >=
> self::ORD_SPACE)
> >> ? $c : ' ';
> >> -
> >> -      switch ($newval) {
> >> -      case '*':
> >> -        if ($this->peek() === '/') {
> >> -          $this->get();
> >> -          return ' ';
> >> -        }
> >> -        break;
> >> -      case null:
> >> -        throw new JSMinException('Unterminated comment.');
> >> -      }
> >> +    if ($c === "\r") {
> >> +      return "\n";
> >>     }
> >> -  }
> >>
> >> -  private function get() {
> >> -    if ($this->lookAhead === null) {
> >> -      $c = ($this->inputIndex < $this->inputLength) ?
> >> -        $this->input{$this->inputIndex++} : null;
> >> -    } else {
> >> -      $c = $this->lookAhead;
> >> -      $this->lookAhead = null;
> >> +    if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
> >> +      return $c;
> >>     }
> >>
> >> -    return ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) ?
> $c
> >> : ' ';
> >> +    return ' ';
> >>   }
> >>
> >> -  private function isAlphaNum($c) {
> >> -    return  $c === '\\' || ctype_alnum($c) || ord($c) > 126;
> >> +  protected function isAlphaNum($c) {
> >> +    return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c)
> >> === 1;
> >>   }
> >>
> >> -  private function min() {
> >> +  protected function min() {
> >>     $this->a = "\n";
> >>     $this->action(3);
> >>
> >>     while ($this->a !== null) {
> >>       switch ($this->a) {
> >>         case ' ':
> >> -          if (self::isAlphaNum($this->b)) {
> >> +          if ($this->isAlphaNum($this->b)) {
> >>             $this->action(1);
> >>           } else {
> >>             $this->action(2);
> >> @@ -211,10 +178,6 @@ class JSMin {
> >>
> >>         case "\n":
> >>           switch ($this->b) {
> >> -            case ' ':
> >> -              $this->action(3);
> >> -              break;
> >> -
> >>             case '{':
> >>             case '[':
> >>             case '(':
> >> @@ -223,12 +186,14 @@ class JSMin {
> >>               $this->action(1);
> >>               break;
> >>
> >> +            case ' ':
> >> +              $this->action(3);
> >> +              break;
> >>
> >>             default:
> >> -              if (self::isAlphaNum($this->b)) {
> >> +              if ($this->isAlphaNum($this->b)) {
> >>                 $this->action(1);
> >> -              }
> >> -              else {
> >> +              } else {
> >>                 $this->action(2);
> >>               }
> >>           }
> >> @@ -237,7 +202,7 @@ class JSMin {
> >>         default:
> >>           switch ($this->b) {
> >>             case ' ':
> >> -              if (self::isAlphaNum($this->a)) {
> >> +              if ($this->isAlphaNum($this->a)) {
> >>                 $this->action(1);
> >>                 break;
> >>               }
> >> @@ -258,10 +223,9 @@ class JSMin {
> >>                   break;
> >>
> >>                 default:
> >> -                  if (self::isAlphaNum($this->a)) {
> >> +                  if ($this->isAlphaNum($this->a)) {
> >>                     $this->action(1);
> >> -                  }
> >> -                  else {
> >> +                  } else {
> >>                     $this->action(3);
> >>                   }
> >>               }
> >> @@ -277,17 +241,36 @@ class JSMin {
> >>     return $this->output;
> >>   }
> >>
> >> -  private function next() {
> >> +  protected function next() {
> >>     $c = $this->get();
> >>
> >>     if ($c === '/') {
> >> -      switch($this->peek()) {
> >> +      switch ($this->peek()) {
> >>         case '/':
> >> -          return $this->getLF();
> >> +          for (;;) {
> >> +            $c = $this->get();
> >> +
> >> +            if (ord($c) <= self::ORD_LF) {
> >> +              return $c;
> >> +            }
> >> +          }
> >>
> >>         case '*':
> >>           $this->get();
> >> -          return $this->getCommentEnd();
> >> +
> >> +          for (;;) {
> >> +            switch ($this->get()) {
> >> +              case '*':
> >> +                if ($this->peek() === '/') {
> >> +                  $this->get();
> >> +                  return ' ';
> >> +                }
> >> +                break;
> >> +
> >> +              case null:
> >> +                throw new JsMinException('Unterminated comment.');
> >> +            }
> >> +          }
> >>
> >>         default:
> >>           return $c;
> >> @@ -297,11 +280,9 @@ class JSMin {
> >>     return $c;
> >>   }
> >>
> >> -  private function peek() {
> >> -    return $this->lookAhead = $this->get();
> >> +  protected function peek() {
> >> +    $this->lookAhead = $this->get();
> >> +    return $this->lookAhead;
> >>   }
> >>  }
> >>
> >> -// -- Exceptions
> >> ---------------------------------------------------------------
> >> -class JSMinException extends Exception {}
> >> -?>
> >>
> >>
> >>
> >
> >
> > --
> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
> >
>



-- 
Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner

Re: svn commit: r1000477 - /shindig/trunk/php/external/jsmin-php/jsmin.php

Posted by Bastian Hofmann <ba...@googlemail.com>.
You are right, the performance from jsmin seems to be pretty bad,
though it only takes 4 minutes on my machine.
For the time being I deactivated JavaScript compression for unit tests
since this is not really needed for the current test cases.
I'll have a look if I find a solution that is better suited.

Regards

Bastian

2010/9/23 Paul Lindner <li...@inuus.com>:
> We need to find a way to replace jsmin with something better.
>
> Right now a phpunit run on a cold cache with code-coverage profiling turned
> on takes about 19 minutes.  Plus there's the 'don't be evil' clause of the
> jsmin license which many lawyers do not like.
>
> On Thu, Sep 23, 2010 at 7:12 AM, <bh...@apache.org> wrote:
>
>> Author: bhofmann
>> Date: Thu Sep 23 14:12:11 2010
>> New Revision: 1000477
>>
>> URL: http://svn.apache.org/viewvc?rev=1000477&view=rev
>> Log:
>> reverted jsmin.php to old version because new has problems with method and
>> variable names that begin with underscore (e.g. "function
>> _IG_Fetch_wrapper(" was transformed to "function_IG_Fetch_wrapper(" )
>>
>> Modified:
>>    shindig/trunk/php/external/jsmin-php/jsmin.php
>>
>> Modified: shindig/trunk/php/external/jsmin-php/jsmin.php
>> URL:
>> http://svn.apache.org/viewvc/shindig/trunk/php/external/jsmin-php/jsmin.php?rev=1000477&r1=1000476&r2=1000477&view=diff
>>
>> ==============================================================================
>> --- shindig/trunk/php/external/jsmin-php/jsmin.php (original)
>> +++ shindig/trunk/php/external/jsmin-php/jsmin.php Thu Sep 23 14:12:11 2010
>> @@ -1,5 +1,5 @@
>>  <?php
>> -/**
>> +/*
>>  * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
>>  *
>>  * This is pretty much a direct port of jsmin.c to PHP with just a few
>> @@ -45,39 +45,42 @@
>>  * @link http://code.google.com/p/jsmin-php/
>>  */
>>
>> -class JSMin {
>> -  const ORD_LF    = 10;
>> +class JsMinException extends Exception {
>> +}
>> +
>> +class JsMin {
>> +  const ORD_LF = 10;
>>   const ORD_SPACE = 32;
>>
>> -  private $a           = '';
>> -  private $b           = '';
>> -  private $input       = '';
>> -  private $inputIndex  = 0;
>> -  private $inputLength = 0;
>> -  private $lookAhead   = null;
>> -  private $output      = '';
>> +  protected $a = '';
>> +  protected $b = '';
>> +  protected $input = '';
>> +  protected $inputIndex = 0;
>> +  protected $inputLength = 0;
>> +  protected $lookAhead = null;
>> +  protected $output = '';
>>
>>   // -- Public Static Methods
>> --------------------------------------------------
>>
>> +
>>   public static function minify($js) {
>> -    $jsmin = new JSMin($js);
>> +    $jsmin = new JsMin($js);
>>     return $jsmin->min();
>>   }
>>
>>   // -- Public Instance Methods
>> ------------------------------------------------
>>
>> +
>>   public function __construct($input) {
>> -    $this->input       = str_replace("\r\n", "\n", $input);
>> -    if (strpos($this->input, "\r")) {
>> -      $this->input = str_replace("\r", "\n", $this->input);
>> -    }
>> +    $this->input = str_replace("\r\n", "\n", $input);
>>     $this->inputLength = strlen($this->input);
>>   }
>>
>>   // -- Protected Instance Methods
>> ---------------------------------------------
>>
>> -  private function action($d) {
>> -    switch($d) {
>> +
>> +  protected function action($d) {
>> +    switch ($d) {
>>       case 1:
>>         $this->output .= $this->a;
>>
>> @@ -87,33 +90,29 @@ class JSMin {
>>         if ($this->a === "'" || $this->a === '"') {
>>           for (;;) {
>>             $this->output .= $this->a;
>> -            $this->a       = $this->get();
>> +            $this->a = $this->get();
>>
>>             if ($this->a === $this->b) {
>>               break;
>>             }
>>
>>             if (ord($this->a) <= self::ORD_LF) {
>> -              throw new JSMinException('Unterminated string literal.');
>> +              throw new JsMinException('Unterminated string literal.');
>>             }
>>
>>             if ($this->a === '\\') {
>>               $this->output .= $this->a;
>> -              $this->a       = $this->get();
>> +              $this->a = $this->get();
>>             }
>>           }
>>         }
>>
>>       case 3:
>>         $this->b = $this->next();
>> -        $a = $this->a;
>>
>> -        if ($this->b === '/' && (
>> -            $a === '(' || $a === ',' || $a === '=' ||
>> -            $a === ':' || $a === '[' || $a === '!' ||
>> -            $a === '&' || $a === '|' || $a === '?')) {
>> +        if ($this->b === '/' && ($this->a === '(' || $this->a === ',' ||
>> $this->a === '=' || $this->a === ':' || $this->a === '[' || $this->a === '!'
>> || $this->a === '&' || $this->a === '|' || $this->a === '?')) {
>>
>> -          $this->output .= $a . $this->b;
>> +          $this->output .= $this->a . $this->b;
>>
>>           for (;;) {
>>             $this->a = $this->get();
>> @@ -122,10 +121,9 @@ class JSMin {
>>               break;
>>             } elseif ($this->a === '\\') {
>>               $this->output .= $this->a;
>> -              $this->a       = $this->get();
>> +              $this->a = $this->get();
>>             } elseif (ord($this->a) <= self::ORD_LF) {
>> -              throw new JSMinException('Unterminated regular expression '.
>> -                  'literal.');
>> +              throw new JsMinException('Unterminated regular expression '
>> . 'literal.');
>>             }
>>
>>             $this->output .= $this->a;
>> @@ -136,73 +134,42 @@ class JSMin {
>>     }
>>   }
>>
>> -  private function getLF() {
>> -    for (;;) {
>> -      $c = $this->lookAhead;
>> -      $this->lookAhead = null;
>> -
>> -      if ($c === null) {
>> -        $c = ($this->inputIndex < $this->inputLength) ?
>> -          $this->input{$this->inputIndex++} : null;
>> -      }
>> -
>> -      $newval = ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE)
>> ? $c : ' ';
>> -
>> -      if (ord($newval) <= self::ORD_LF) {
>> -        return $newval;
>> +  protected function get() {
>> +    $c = $this->lookAhead;
>> +    $this->lookAhead = null;
>> +
>> +    if ($c === null) {
>> +      if ($this->inputIndex < $this->inputLength) {
>> +        $c = $this->input[$this->inputIndex];
>> +        $this->inputIndex += 1;
>> +      } else {
>> +        $c = null;
>>       }
>>     }
>> -  }
>> -
>> -  private function getCommentEnd() {
>> -    for (;;) {
>> -      $c = $this->lookAhead;
>> -      $this->lookAhead = null;
>> -
>> -      if ($c === null) {
>> -        $c = ($this->inputIndex < $this->inputLength) ?
>> -          $this->input{$this->inputIndex++} : null;
>> -      }
>>
>> -      $newval = ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE)
>> ? $c : ' ';
>> -
>> -      switch ($newval) {
>> -      case '*':
>> -        if ($this->peek() === '/') {
>> -          $this->get();
>> -          return ' ';
>> -        }
>> -        break;
>> -      case null:
>> -        throw new JSMinException('Unterminated comment.');
>> -      }
>> +    if ($c === "\r") {
>> +      return "\n";
>>     }
>> -  }
>>
>> -  private function get() {
>> -    if ($this->lookAhead === null) {
>> -      $c = ($this->inputIndex < $this->inputLength) ?
>> -        $this->input{$this->inputIndex++} : null;
>> -    } else {
>> -      $c = $this->lookAhead;
>> -      $this->lookAhead = null;
>> +    if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
>> +      return $c;
>>     }
>>
>> -    return ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) ? $c
>> : ' ';
>> +    return ' ';
>>   }
>>
>> -  private function isAlphaNum($c) {
>> -    return  $c === '\\' || ctype_alnum($c) || ord($c) > 126;
>> +  protected function isAlphaNum($c) {
>> +    return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c)
>> === 1;
>>   }
>>
>> -  private function min() {
>> +  protected function min() {
>>     $this->a = "\n";
>>     $this->action(3);
>>
>>     while ($this->a !== null) {
>>       switch ($this->a) {
>>         case ' ':
>> -          if (self::isAlphaNum($this->b)) {
>> +          if ($this->isAlphaNum($this->b)) {
>>             $this->action(1);
>>           } else {
>>             $this->action(2);
>> @@ -211,10 +178,6 @@ class JSMin {
>>
>>         case "\n":
>>           switch ($this->b) {
>> -            case ' ':
>> -              $this->action(3);
>> -              break;
>> -
>>             case '{':
>>             case '[':
>>             case '(':
>> @@ -223,12 +186,14 @@ class JSMin {
>>               $this->action(1);
>>               break;
>>
>> +            case ' ':
>> +              $this->action(3);
>> +              break;
>>
>>             default:
>> -              if (self::isAlphaNum($this->b)) {
>> +              if ($this->isAlphaNum($this->b)) {
>>                 $this->action(1);
>> -              }
>> -              else {
>> +              } else {
>>                 $this->action(2);
>>               }
>>           }
>> @@ -237,7 +202,7 @@ class JSMin {
>>         default:
>>           switch ($this->b) {
>>             case ' ':
>> -              if (self::isAlphaNum($this->a)) {
>> +              if ($this->isAlphaNum($this->a)) {
>>                 $this->action(1);
>>                 break;
>>               }
>> @@ -258,10 +223,9 @@ class JSMin {
>>                   break;
>>
>>                 default:
>> -                  if (self::isAlphaNum($this->a)) {
>> +                  if ($this->isAlphaNum($this->a)) {
>>                     $this->action(1);
>> -                  }
>> -                  else {
>> +                  } else {
>>                     $this->action(3);
>>                   }
>>               }
>> @@ -277,17 +241,36 @@ class JSMin {
>>     return $this->output;
>>   }
>>
>> -  private function next() {
>> +  protected function next() {
>>     $c = $this->get();
>>
>>     if ($c === '/') {
>> -      switch($this->peek()) {
>> +      switch ($this->peek()) {
>>         case '/':
>> -          return $this->getLF();
>> +          for (;;) {
>> +            $c = $this->get();
>> +
>> +            if (ord($c) <= self::ORD_LF) {
>> +              return $c;
>> +            }
>> +          }
>>
>>         case '*':
>>           $this->get();
>> -          return $this->getCommentEnd();
>> +
>> +          for (;;) {
>> +            switch ($this->get()) {
>> +              case '*':
>> +                if ($this->peek() === '/') {
>> +                  $this->get();
>> +                  return ' ';
>> +                }
>> +                break;
>> +
>> +              case null:
>> +                throw new JsMinException('Unterminated comment.');
>> +            }
>> +          }
>>
>>         default:
>>           return $c;
>> @@ -297,11 +280,9 @@ class JSMin {
>>     return $c;
>>   }
>>
>> -  private function peek() {
>> -    return $this->lookAhead = $this->get();
>> +  protected function peek() {
>> +    $this->lookAhead = $this->get();
>> +    return $this->lookAhead;
>>   }
>>  }
>>
>> -// -- Exceptions
>> ---------------------------------------------------------------
>> -class JSMinException extends Exception {}
>> -?>
>>
>>
>>
>
>
> --
> Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>