140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /*
 | |
| JavaScript loader. Load a sequence of JavaScript files using individual
 | |
| SCRIPT elements, or concatenated, with or without a wrapper function (to keep
 | |
| variables out of the global scope) and with or without a SCRIPT element wrapper
 | |
| (with for an internal script, without for external).
 | |
| 
 | |
| Copyright © 2012 Jesse McCarthy <http://jessemccarthy.net/>
 | |
| 
 | |
| This software may be used under the MIT (aka X11) license or
 | |
| Simplified BSD (aka FreeBSD) license.  See LICENSE.
 | |
| 
 | |
| */
 | |
| /**
 | |
|  * JavaScript loader.
 | |
|  *
 | |
|  * @version 0.5.0
 | |
|  */
 | |
| class JSLoader {
 | |
|     protected $cfg = array();
 | |
| 
 | |
|     protected $scripts = array();
 | |
| 
 | |
|     protected $output;
 | |
| 
 | |
|     public function __construct($cfg = array()) {
 | |
|         $this->cfg = array_merge($this->get_default_cfg() , $cfg);
 | |
|     }
 | |
| 
 | |
|     protected function get_default_cfg(){
 | |
|         $default_cfg = array(
 | |
|             'file_system_path' => "./",
 | |
|             'concat' => false,
 | |
|             'function_wrapper' => false,
 | |
|             'indent_string' => "  ",
 | |
| 
 | |
|             // False for an external script or for concatenating output from multiple
 | |
|             // instances.
 | |
| 
 | |
|             'script_wrapper' => true,
 | |
|             'with_header' => true
 | |
|         );
 | |
| 
 | |
|         return $default_cfg;
 | |
|     }
 | |
| 
 | |
|     public function parse_scripts($scripts) {
 | |
|         $scripts = explode("\n", $scripts);
 | |
|         foreach($scripts as $script_i => & $script) {
 | |
|             if (!strlen($script = trim($script)) || $script[0] === "#") {
 | |
|                 unset($scripts[$script_i]);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $scripts;
 | |
|     }
 | |
| 
 | |
|     public function set_scripts($scripts, $cfg = array()) {
 | |
|         $default_cfg = array(
 | |
|             'add' => false
 | |
|         );
 | |
|         $cfg = array_merge($default_cfg, $cfg);
 | |
|         if (!is_array($scripts)) {
 | |
|             $scripts = $this->parse_scripts($scripts);
 | |
|         }
 | |
| 
 | |
|         if (!$cfg['add']) {
 | |
|             $this->scripts = array();
 | |
|         }
 | |
| 
 | |
|         $this->scripts = array_merge($this->scripts, $scripts);
 | |
|     }
 | |
| 
 | |
|     public function add_scripts($scripts)
 | |
|     {
 | |
|         $this->set_scripts($scripts, array(
 | |
|             'add' => true
 | |
|         ));
 | |
|     }
 | |
| 
 | |
|     public function get_output() {
 | |
|         $scripts = $this->scripts ? $this->scripts : array();
 | |
|         if ($this->cfg['concat']) {
 | |
|             foreach($scripts as & $script) {
 | |
|                 $file = $script;
 | |
|                 $file = rtrim($this->cfg['file_system_path'], "/") . "/{$file}";
 | |
|                 $script = file_get_contents($file);
 | |
|             }
 | |
| 
 | |
|             $scripts = join("\n\n", $scripts);
 | |
|             if ($this->cfg['function_wrapper']) {
 | |
|                 $scripts = explode("\n", $scripts);
 | |
|                 foreach($scripts as & $line) {
 | |
|                     if ($line !== "") {
 | |
|                         $line = "{$this->cfg['indent_string']}{$line}";
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 $scripts = join("\n", $scripts);
 | |
|                 $scripts = <<<DOCHERE
 | |
| ( function () {
 | |
| 
 | |
| {$scripts}
 | |
| 
 | |
| } )();
 | |
| 
 | |
| DOCHERE;
 | |
|             }
 | |
| 
 | |
|             // if
 | |
| 
 | |
|             if ($this->cfg['script_wrapper']) {
 | |
|                 $scripts = <<<DOCHERE
 | |
| <script>
 | |
| 
 | |
| {$scripts}
 | |
| 
 | |
| </script>
 | |
| DOCHERE;
 | |
|             } elseif ($this->cfg['with_header']) {
 | |
|                 header("Content-Type: text/javascript");
 | |
|             }
 | |
| 
 | |
|             $scripts = array(
 | |
|                 $scripts
 | |
|             );
 | |
|         }
 | |
|         else {
 | |
|             foreach($scripts as & $script) {
 | |
|                 $script = <<<DOCHERE
 | |
| <script src="{$script}"></script>
 | |
| DOCHERE;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $this->output = join("\n\n\n", $scripts);
 | |
|         return $this->output;
 | |
|     }
 | |
| }
 |