Browse Source

amber.js refactoring.

- amber object starting with a lowercase character
- all attributes are now private except amber.load()
Nicolas Petton 12 years ago
parent
commit
4220c497ac
2 changed files with 178 additions and 169 deletions
  1. 173 169
      js/amber.js
  2. 5 0
      js/init.js

+ 173 - 169
js/amber.js

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

+ 5 - 0
js/init.js

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