PHP7 fix
[Pman.Core] / JsCompile.php
index ef7e97f..a5b9159 100644 (file)
@@ -5,6 +5,8 @@
 * 
 *  -- we will use this later to compile on the fly...
 *
+*  -- updated to use roojspacker https://github.com/roojs/roojspacker
+*
 *
 * For general usage:
 *  $x = new Pman_Core_JsCompile();
@@ -35,7 +37,7 @@ class Pman_Core_JsCompile  extends Pman
     }
     
     
-    function get($proj, $args)
+    function get($proj, $args=array())
     {
         if (empty($args)) {
             die("missing action : eg. build or install");
@@ -81,6 +83,16 @@ class Pman_Core_JsCompile  extends Pman
      *
      */
     
+    static function jsSort($a,$b)
+    {
+        $a = substr($a, 0, -3);
+        $b=  substr($b, 0, -3);
+        if ($a == $b) {
+            return 0;
+        }
+        return ($a > $b) ? +1 : -1;
+    }
+    
     
     function packScript($basedir, $files,  $output_url, $compile=true)
     {
@@ -110,15 +122,10 @@ class Pman_Core_JsCompile  extends Pman
                 $ofiles [] = $f . '/'. basename($fx);
             }
         }
+        $tf = 
         // sort exc. the .js
-        usort($ofiles,function($a,$b) {
-            $a = substr($a, 0, -3);
-            $b=  substr($b, 0, -3);
-            if ($a == $b) {
-                return 0;
-            }
-            return ($a > $b) ? +1 : -1;
-        });
+        usort($ofiles,function($a,$b) { return Pman_Core_JsCompile::jsSort($a,$b); });
+        
         //print_R($ofiles);
         
         $output = md5(serialize($arfiles)) .'.js';
@@ -139,6 +146,8 @@ class Pman_Core_JsCompile  extends Pman
           
     }
     
+    // this is depricated... - we can use the pear CSS library for this..
+    
     function packCss($basedir, $files,   $output_url)
     {
         // this outputs <script tags..>
@@ -243,13 +252,104 @@ class Pman_Core_JsCompile  extends Pman
      * @param {String} $output name fo file to output
      *
      */
+    
     function pack($files, $output, $translation_base=false)
     {
         
+        if (empty($files)) {
+            return false;
+        }
+        
+        $o = HTML_FlexyFramework::get()->Pman_Core;
+        if (isset($o['packseed'])) {
+            return $this->packSeed($files,$output,$translation_base);
+        }
+        
+        
+        require_once 'System.php';
+        $packer = System::which('roojspacker');
+        
+        
+        if (!$packer) {
+            echo '<!-- roojspacker is not installed -->';
+            return false;
+            
+        }
+        $targetm = file_exists($output) && filesize($output) ? filemtime($output) : 0;
+        $max = 0;
+        $ofiles = array();
+        foreach($files as $f => $mt) {
+            $max = max($max,$mt);
+            $ofiles[] = escapeshellarg($f);
+        }
+        if ($max < $targetm) {
+            echo '<!--  use cached compile. -->';
+            return true;
+        }
+        
+        if (file_exists($output)) {
+            unlink($output);
+        }
+        
+         
+        if (!file_exists(dirname($output))) {
+            mkdir(dirname($output), 0755, true);
+        }
+        
+        usort($ofiles, function($a,$b)  { return strlen($a) > strlen($b) ? 1 : -1; });
+        
+        //$eoutput = " -k  -o " . escapeshellarg($output) ; // with whitespace..
+        $eoutput = "  -t " . escapeshellarg($output) ;
+          
+        // no support for translation any more?         
+        //if (  $translation_base) {
+        //    $toutput = " -t ". escapeshellarg(preg_replace('/\.js$/', '.__translation__.js', $output)) .
+        //            " -p " . escapeshellarg($translation_base) ;//." -k "; // this kills the compression.
+        //            
+        //}
+        
+    
+        $cmd = "$packer  $eoutput  -f " . implode(' -f ', $ofiles) . ' 2>&1';
+        //echo "<PRE>$cmd\n";
+        //echo `$cmd`;
+        
+         echo "<!-- Compile javascript
+          
+            " . htmlspecialchars($cmd) . "
+            
+            -->";
+            
+       // return false;
+        
+        $res = `$cmd`;
+        //exit;
+        file_put_contents($output.'.log', $cmd."\n\n". $res);
+        // since this only appears when we change.. it's ok to dump it out..
+        echo "<!-- Compiled javascript
+            " . htmlspecialchars($res) . "
+            -->";
+        clearstatcache();
+        // we should do more checking.. return val etc..
+        if (file_exists($output) && filesize($output) && ($max < filemtime($output) ) ) {
+            echo "<!-- file looks like its been generated -->\n";
+            return true;
+        }
+        echo '<script type="text/javascript"> alert('. json_encode("Error: Javascript Compile failed\n" . $res) .');</script>';
+     
+        
+        echo "<!-- JS COMPILE ERROR: packed file did not exist  -->";
+        return false;
+        
+    }
+    
+    // depricated verison using seed.
+    function packSeed($files, $output, $translation_base=false)
+    {
+        
          
         $o = HTML_FlexyFramework::get()->Pman_Core;
         
-        if (empty($o['jspacker']) || !file_exists($o['jspacker'].'/pack.js')) {
+        if (empty($o['packseed']) || !file_exists($o['jspacker'].'/pack.js')) {
             echo '<!-- JS COMPILE ERROR: option: Pman_Core[jspacker] not set to directory -->';
             return false;
             
@@ -292,8 +392,8 @@ class Pman_Core_JsCompile  extends Pman
         
         
         $cmd = ($seed ?
-             "$seed {$o['jspacker']}/pack.js " :
-             "$gjs -I {$o['jspacker']} -I {$o['jspacker']}/JSDOC  {$o['jspacker']}/pack.js -- -- " 
+             "$seed {$o['packseed']}/pack.js " :
+             "$gjs -I {$o['packseed']} -I {$o['packseed']}/JSDOC  {$o['packseed']}/pack.js -- -- " 
               
              ) . " $eoutput  $toutput " . implode($ofiles, ' ') . ' 2>&1';
         //echo "<PRE>$cmd\n";
@@ -320,7 +420,9 @@ class Pman_Core_JsCompile  extends Pman
             
             return true;
         }
-        echo "<!-- JS COMPILE ERROR: packed file did not exist  -->";
+        
+         
+        echo "\n<!-- JS COMPILE ERROR: packed file did not exist  -->\n";
         return false;
         
     }
@@ -362,8 +464,8 @@ class Pman_Core_JsCompile  extends Pman
         
         $o = HTML_FlexyFramework::get()->Pman_Core;
         
-        if (empty($o['jspacker']) || !file_exists($o['jspacker'].'/pack.js')) {
-            $this->err ="no jstoolkit path set [Pman_Core][jspacker] to the
+        if (empty($o['packseed']) || !file_exists($o['packseed'].'/pack.js')) {
+            $this->err ="no jstoolkit path set [Pman_Core][packseed] to the
                     introspection documentation directory where pack.js is located.";
             if ($this->cli) echo $this->err;
             return false;
@@ -371,7 +473,7 @@ class Pman_Core_JsCompile  extends Pman
         
         // should we be more specirfic!??!?!?
          
-        $cmd = "$seed {$o['jspacker']}/pack.js -m $proj  -a  $src/*.js";
+        $cmd = "$seed {$o['packseed']}/pack.js -m $proj  -a  $src/*.js";
         echo "$cmd\n";
         passthru($cmd);
         // technically we should trash old compiled files..