Icontem

File: examples/4gl/js.php

Recommend this page to a friend!
  Classes of philippe thomassigny  >  WAJAF  >  examples/4gl/js.php  >  Download  
File: examples/4gl/js.php
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: WAJAF
Build single page applications
Author: By
Last change: patch 3.0.2
Date: 1 year ago
Size: 12,754 bytes
 

Contents

Class file image Download
<?php

/*
    js.php, WAJAF, the WebAbility(r) Javascript Application Framework
    Contains the wrapper to load, minimize and cache javascripts of WAJAF
    (c) 2008-2009 Philippe Thomassigny

    This file is part of WAJAF

    WAJAF is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    WAJAF is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with WAJAF.  If not, see <http://www.gnu.org/licenses/>.
*/

class js
{
  function notFound()
  {
    if (substr(php_sapi_name(), 0, 3) == 'cgi')
      header('Status: 404 Not Found', TRUE);
    else
      header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
    return null;
  }

  function getJS($BASEDIR, $REPOSITORYDIR)
  {
    if (isset($_GET["js"]) && $_GET["js"])
    {
      if (strpos($_GET["js"], "/") !== false || strpos($_GET["js"], "\\") || strpos($_GET["js"], "%2F") || strpos($_GET["js"], "%5C"))  // No / \ or rawurlencoded allowed
        return $this->notFound();
      $dirs = array('/system/', '/managers/', '/containers/', '/elements/', '../dominion/js/containers/', '../dominion/js/elements/');
      $xF = explode(',', $_GET["js"]);
      if (!$xF)
        return null;
      $code = '';

      $usedF = array();
      $finalF = array();
      foreach ($xF as $k => $js)
      {
        if ($js == 'wajaf.js')
        {
          unset($xF[$k]);
          $usedF['core.js'] = $finalF[] = 'core.js';
          $usedF['eventManager.js'] = $finalF[] = 'eventManager.js';
          $usedF['ddManager.js'] = $finalF[] = 'ddManager.js';
          $usedF['soundManager.js'] = $finalF[] = 'soundManager.js';
          $usedF['animManager.js'] = $finalF[] = 'animManager.js';
          $usedF['helpManager.js'] = $finalF[] = 'helpManager.js';
          $usedF['ajaxManager.js'] = $finalF[] = 'ajaxManager.js';
          $usedF['ondemandManager.js'] = $finalF[] = 'ondemandManager.js';
          $usedF['messageManager.js'] = $finalF[] = 'messageManager.js';
          $usedF['wa4glManager.js'] = $finalF[] = 'wa4glManager.js';
        }
      }
      foreach ($xF as $k => $js)
      {
        if (!isset($usedF[$js]))
          $usedF[$js] = $finalF[] = $js;
      }
      foreach ($finalF as $k => $js)
      {
        $filename = null;
        foreach ($dirs as $d)
        {
          $fn = $BASEDIR.$d.$js;

          if (file_exists($fn))
          {
            $filename = $fn;
            break;
          }
        }
        if ($filename)
        {
          $code .= $this->minimizeJS($REPOSITORYDIR, $filename);
        }
      }
      header("Content-Type: text/javascript");
      header("Content-Length: " . strlen($code));
      print $code;
      return null;
    }
    elseif (isset($_GET["TEMP"]))
    {
      if (strpos("/", $_GET["TEMP"]) !== false || strpos("\\", $_GET["TEMP"]) || strpos("%2F", $_GET["TEMP"]) || strpos("%5C", $_GET["TEMP"]))  // No / \ or rawurlencoded allowed
        return $this->notFound();
      $filename = $BASEDIR."/components/js/templates/".$_GET["TEMP"];
      if (file_exists($filename))
      {
        header("Content-Type: text/html");
        header("Content-Length: " . filesize($filename));
        readfile($filename);
        return;
      }
      else
      {
        return $this->notFound();
      }
    }
    return $this->notFound();
  }

  function minimizeJS($REPOSITORYDIR, $filename)
  {
    $code = file_get_contents($filename);
    return $code;

    $cfilename = $REPOSITORYDIR.'jsmin/'.md5($filename);
    if (is_file($cfilename))
    {
      // check dates cache vs original to know if we use or invalidate the file
      if (filemtime($cfilename) > filemtime($filename))
        return file_get_contents($cfilename);
      unlink($cfilename);
    }

    $code = file_get_contents($filename);
    if (strpos($code, 'NO_MIN') !== false)
      return $code;

    $code = JSMin::minify($code);
    file_put_contents($cfilename, $code);
    return $code;
  }

}

$j = new js();
echo $j->getJS('../../','../../../temporal/');

// ==================================================================================================
// The class below is not part of WAJAF v1 and is (c) to its specific authors.
// ==================================================================================================

/**
 * 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
 * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and
 * outputs to stdout, this library accepts a string as input and returns another
 * string as output.
 *
 * PHP 5 or higher is required.
 *
 * Permission is hereby granted to use this version of the library under the
 * same terms as jsmin.c, which has the following license:
 *
 * --
 * Copyright (c) 2002 Douglas Crockford  (www.crockford.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * The Software shall be used for Good, not Evil.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 * --
 *
 * @package JSMin
 * @author Ryan Grove <ryan@wonko.com>
 * @copyright 2002 Douglas Crockford <douglas@crockford.com> (jsmin.c)
 * @copyright 2008 Ryan Grove <ryan@wonko.com> (PHP port)
 * @license http://opensource.org/licenses/mit-license.php MIT License
 * @version 1.1.1 (2008-03-02)
 * @link http://code.google.com/p/jsmin-php/
 */

class JSMin
{
  const ORD_LF    = 10;
  const ORD_SPACE = 32;

  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);
    return $jsmin->min();
  }

  // -- Public Instance Methods ------------------------------------------------

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

  // -- Protected Instance Methods ---------------------------------------------

  protected function action($d)
  {
    switch($d)
    {
      case 1:
        $this->output .= $this->a;

      case 2:
        $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 3:
        $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->output .= $this->a . $this->b;

          for (;;)
          {
            $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 '.
                  'literal.');
            }

            $this->output .= $this->a;
          }

          $this->b = $this->next();
        }
    }
  }

  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;
      }
    }

    if ($c === "\r")
    {
      return "\n";
    }

    if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE)
    {
      return $c;
    }

    return ' ';
  }

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

  protected function min()
  {
    $this->a = "\n";
    $this->action(3);

    while ($this->a !== null)
    {
      switch ($this->a)
      {
        case ' ':
          if ($this->isAlphaNum($this->b))
          {
            $this->action(1);
          }
          else
          {
            $this->action(2);
          }
          break;

        case "\n":
          switch ($this->b)
          {
            case '{':
            case '[':
            case '(':
            case '+':
            case '-':
              $this->action(1);
              break;

            case ' ':
              $this->action(3);
              break;

            default:
              if ($this->isAlphaNum($this->b))
              {
                $this->action(1);
              }
              else
              {
                $this->action(2);
              }
            }
          break;

        default:
          switch ($this->b)
          {
            case ' ':
              if ($this->isAlphaNum($this->a))
              {
                $this->action(1);
                break;
              }

              $this->action(3);
              break;

            case "\n":
              switch ($this->a)
              {
                case '}':
                case ']':
                case ')':
                case '+':
                case '-':
                case '"':
                case "'":
                  $this->action(1);
                  break;

                default:
                  if ($this->isAlphaNum($this->a))
                  {
                    $this->action(1);
                  }
                  else
                  {
                    $this->action(3);
                  }
                }
              break;

            default:
              $this->action(1);
              break;
          }
      }
    }

    return $this->output;
  }

  protected function next()
  {
    $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;
  }

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

// -- Exceptions ---------------------------------------------------------------
class JSMinException extends Exception {}

?>