Browse Source

Refactored amber.js to create an Amber JS object

JohnnyT 12 years ago
parent
commit
2bfba6b9ae
2 changed files with 184 additions and 103 deletions
  1. 183 95
      js/amber.js
  2. 1 8
      js/init.js

+ 183 - 95
js/amber.js

@@ -1,103 +1,191 @@
 /* Adapted from Clamato by Avi Bryant. http://www.clamato.net */
 
 (function() {
-    var scripts = document.getElementsByTagName("script");
-    var src = scripts[ scripts.length - 1 ].src;
-    var home = src.split("/").slice(0, -2).join("/") + "/";
-    var nocache = '?' + (new Date()).getTime();
-    var deploy = false;
-
-    function loadJS(name, prefix) {
-	var prefix = prefix || 'js';
-	var name = name;
-	if(!deploy) {
-	    name = name + nocache;
-	}
-	document.write('<script src="' + home + prefix + '/' + name + '" type="text/javascript"></script>');
-    }
-    
-    function loadCSS(name, prefix) {
-	var prefix = prefix || 'css';
-	var name = name;
-	if(!deploy) {
-	    name = name + nocache;
-	}
-	var link = document.createElement("link")
-  	link.setAttribute("rel", "stylesheet")
-  	link.setAttribute("type", "text/css")
-  	link.setAttribute("href", home + prefix + '/' + name)
-	document.getElementsByTagName("head")[0].appendChild(link);
-    }
+  var
+    scripts = document.getElementsByTagName("script"),
+    src = scripts[ scripts.length - 1 ].src,
+    home = src.split("/").slice(0, -2).join("/") + "/";
 
-    function loadDependencies() {
-	loadJS('lib/jQuery/jquery-1.6.4.min.js');
-	loadJS('lib/jQuery/jquery-ui-1.8.9.custom.min.js');
-    }
+  window.Amber = {
+    debug: false,
+    deploy: false,
+    nocache: '?' + (new Date()).getTime(),
+    home: home,
 
-    function loadIDEDependencies() {
-	loadJS('lib/jQuery/jquery.textarea.js');
-	loadJS('lib/CodeMirror/lib/codemirror.js');
-	loadCSS('lib/CodeMirror/lib/codemirror.css', 'js');
-	loadJS('lib/CodeMirror/mode/smalltalk/smalltalk.js');
-	loadCSS('lib/CodeMirror/theme/amber.css', 'js');
-    }
+    /*
+     example:
+     Amber.load({
+       files: ['MyCategory1.js', 'MyCategory2.js'],
+       ready: function() {smalltalk.Browser._open()}
+     })
+    */
+    load: function(spec) {
+      var self = this;
+      self.localStorageSource = [];
+      self.spec = ((typeof spec == 'undefined') ? {} : spec);
+
+      // In deployment mode, only the compressed version of Kernel
+      // and Canvas are loaded
+      self.deploy = self.spec.deploy || self.deploy;
+      self.debug = self.spec.debug || self.debug;
+
+      // Specify a version string to avoid wrong browser caching
+      if (self.spec.version)
+        self.nocache = '?' + self.spec.version;
+
+      self.loadDependencies();
+      self.loadJS('boot.js');
+
+      self.populateLocalPackages();
+
+      if (self.deploy) {
+        self.loadPackages([
+          'Kernel.deploy',
+          'Canvas.deploy'
+        ]);
+      } else {
+        self.loadIDEDependencies();
+        self.loadCSS('amber.css');
+
+        self.loadPackages([
+          'Kernel',
+          'Canvas',
+          'Compiler',
+          'parser',
+          'IDE',
+          'SUnit',
+          'Examples',
+          'Benchfib',
+          'Kernel-Tests',
+        ]);
+      }
+
+      var additionalFiles = self.spec.packages || self.spec.files;
+      if (additionalFiles)
+        self.loadPackages(additionalFiles, self.spec.prefix);
+
+      // Always load all local packages
+      for (name in self.localPackages) {
+        self.log('Local package:  ' + name);
+        self.localStorageSource.push(self.localPackages[name]);
+      }
+
+      // Be sure to setup & initialize smalltalk classes
+      self.loadJS('init.js');
+    },
+
+    loadPackages: function(names, prefix){
+      var self = this;
+      var name, url;
+      var prefix = prefix || 'js';
+
+      for (var i=0; i < names.length; i++) {
+        name = names[i].split(/\.js$/)[0];
+
+        // Only load package from the server if it isn't stored in
+        // localStorage
+        if (!(name in self.localPackages)) {
+          self.log('Server package: ' + name);
+          self.loadJS(name + '.js', prefix);
+        }
+      }
+    },
+
+    loadJS: function(name, prefix) {
+      var self = this;
+      var prefix = prefix || 'js';
+      var name = name;
+
+      if (!self.deploy)
+        name = name + self.nocache;
+
+      var url = self.home + prefix + '/' + name;
+      var scriptString = '<script src="' + url + '" type="text/javascript"></script>';
+      document.write(scriptString);
+    },
+
+    loadCSS: function (name, prefix) {
+      var self = this;
+      var prefix = prefix || 'css';
+      var name = name;
+      if (!self.deploy)
+        name = name + self.nocache;
+
+      var url = self.home + prefix + '/' + name;
+
+      var link = document.createElement("link");
+      link.setAttribute("rel", "stylesheet");
+      link.setAttribute("type", "text/css");
+      link.setAttribute("href", url);
+      document.getElementsByTagName("head")[0].appendChild(link);
+    },
+
+    loadDependencies: function() {
+      var self = this;
+      self.loadJS('lib/jQuery/jquery-1.6.4.min.js');
+      self.loadJS('lib/jQuery/jquery-ui-1.8.9.custom.min.js');
+    },
+
+    loadIDEDependencies: function() {
+      var self = this;
+      self.loadJS('lib/jQuery/jquery.textarea.js');
+      self.loadJS('lib/CodeMirror/lib/codemirror.js');
+      self.loadCSS('lib/CodeMirror/lib/codemirror.css', 'js');
+      self.loadJS('lib/CodeMirror/mode/smalltalk/smalltalk.js');
+      self.loadCSS('lib/CodeMirror/theme/amber.css', 'js');
+    },
+
+    // This will be called after JS files have been loaded
+    initializeSmalltalk: function(){
+      var self = this;
+
+      for (var i=0; i < self.localStorageSource.length; i++)
+        eval(self.localStorageSource[i]);
+
+      smalltalk.init(smalltalk.Object);
+      smalltalk.classes()._do_(function(each) {each._initialize()});
+
+      if (self.spec.ready)
+        self.spec.ready();
+
+      if (self.deploy)
+        smalltalk.setDeploymentMode();
+    },
+
+    populateLocalPackages: function(){
+      var self = this;
+      var localStorageRE = /^smalltalk\.packages\.(.*)$/;
+      self.localPackages = {};
+
+      var match, key;
+
+      for(var i=0; i < localStorage.length; i++) {
+        key = localStorage.key(i);
+
+        if (match = key.match(localStorageRE)) {
+          self.localPackages[match[1]] = localStorage[key];
+        }
+      }
+
+      return self.localPackages;
+    },
+
+    clearLocalPackages: function(){
+      var self = this;
+      for (var name in self.localPackages) {
+        self.log('Removing ' + name + ' from local storage');
+        localStorage.removeItem('smalltalk.packages.' + name);
+      }
+    },
 
-    window.loadAmber = function(spec) {
-	/* 
-	 example: 
-	 loadAmber({
-	   files: ['MyCategory1.js', 'MyCategory2.js'], 
-	   ready: function() {smalltalk.Browser._open()}
-	 })
-	*/
-
-	var spec = spec || {};
-
-	// In deployment mode, only the compressed version of Kernel 
-	// and Canvas are loaded
-	deploy = spec.deploy || false;
-
-	// Specify a version string to avoid wrong browser caching
-	if(spec.version) {
-	    nocache = '?' + spec.version;
-	}
-
-	loadDependencies();
-	if(deploy) {
-	    loadJS("boot.js");
-	    loadJS("Kernel.deploy.js");
-	    loadJS("Canvas.deploy.js");
-	} else {
-	    loadIDEDependencies();
-	    loadCSS('amber.css');
-	    loadJS("boot.js");
-	    loadJS("Kernel.js");
-	    loadJS("Canvas.js");
-	    loadJS("Compiler.js");
-	    loadJS("parser.js");
-	    loadJS("IDE.js");
-	    loadJS("SUnit.js");
-	    loadJS("Examples.js");
-	    loadJS("Benchfib.js");
-	    loadJS("Kernel-Tests.js");
-	}
-
-	// Load other files, possibly with another directory prefix than 'js'
-	if(spec.files) {
-	    for(var i=0; i < spec.files.length; i++) {
-		loadJS(spec.files[i], spec.prefix);
-	    }
-	}
-
-	smalltalkReady = function() {
-	    if(spec.ready) {
-		spec.ready();
-	    }
-	    if(deploy) {smalltalk.setDeploymentMode()}
-	}
-
-	// Be sure to setup & initialize smalltalk classes
-	loadJS("init.js");
+    log: function(string) {
+      var self = this;
+      if (self.debug)
+        console.log(string);
     }
+  };
 
-})();
+  window.loadAmber = function(spec) {
+    Amber.load(spec);
+  }
+})();

+ 1 - 8
js/init.js

@@ -1,8 +1 @@
-smalltalk.init(smalltalk.Object);
-smalltalk.classes()._do_(function(each) {each._initialize()});
-
-/* Similar to jQuery(document).ready() */
-
-if(this.smalltalkReady) {
-    this.smalltalkReady();
-}
+Amber.initializeSmalltalk();