123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- /* 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 debug;
- var deploy;
- var spec;
- var jsToLoad = [];
- var loadJS;
- var nocache = '';
- that.toggleIDE = function() {
- if ($('#amber').length == 0) {
- smalltalk.Browser._open();
- } else if ($('#amber').is(':visible')) {
- smalltalk.TabManager._current()._close();
- } else {
- smalltalk.TabManager._current()._open();
- }
- return false;
- };
- 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;
- // When debug is turned on, logs are written to the console,
- // and the user will be prompted before they leave the page.
- if (debug) {
- window.onbeforeunload = function(){ return 'You will loose all code that you have not committed'; }
- }
- // Allow loading default Amber files from a different location
- // e.g. http://amber-lang.net/amber/
- if (spec.home) home = spec.home;
- // Specify a version string to avoid wrong browser caching
- if (spec.version) {
- nocache = '?' + spec.version;
- }
- loadDependencies();
- addJSToLoad('js/lib/es5-shim-2.0.2/es5-shim.min.js');
- addJSToLoad('js/lib/es5-shim-2.0.2/es5-sham.min.js');
- addJSToLoad('js/boot.js');
- if (deploy) {
- loadPackages([
- 'Kernel-Objects.deploy',
- 'Kernel-Classes.deploy',
- 'Kernel-Methods.deploy',
- 'Kernel-Collections.deploy',
- 'Kernel-Exceptions.deploy',
- 'Kernel-Transcript.deploy',
- 'Kernel-Announcements.deploy',
- 'Canvas.deploy'
- ]);
- } else {
- loadIDEDependencies();
- loadCSS('amber.css');
- loadPackages([
- 'Kernel-Objects',
- 'Kernel-Classes',
- 'Kernel-Methods',
- 'Kernel-Collections',
- 'Kernel-Exceptions',
- 'Kernel-Transcript',
- 'Kernel-Announcements',
- 'Canvas',
- 'SUnit',
- 'Importer-Exporter',
- 'Compiler-Exceptions',
- 'Compiler-Core',
- 'Compiler-AST',
- 'Compiler-Semantic',
- 'Compiler-IR',
- 'Compiler-Inlining',
- 'Compiler-Interpreter',
- 'Compiler-Tests',
- 'parser',
- 'IDE',
- 'Examples',
- 'Benchfib',
- 'Kernel-Tests',
- 'SUnit-Tests'
- ]);
- }
- var additionalFiles = spec.packages || spec.files;
- var commitPathForInit = null;
- if (additionalFiles) {
- commitPathForInit = loadPackages(additionalFiles, spec.prefix, spec.packageHome);
- }
- // Be sure to setup & initialize smalltalk classes
- addJSToLoad('js/init.js');
- initializeSmalltalk(commitPathForInit);
- };
- function loadPackages(names, prefix, urlHome){
- var name;
- prefix = prefix || 'js';
- urlHome = urlHome || home;
- for (var i=0; i < names.length; i++) {
- name = names[i].split(/\.js$/)[0];
- addJSToLoad(name + '.js', prefix, urlHome);
- }
- return {
- js: urlHome + prefix,
- st: urlHome + (prefix.match(/\/js$/) ? prefix.replace(/\/js$/, "/st") : "st")
- };
- }
- function addJSToLoad(name, prefix, urlHome) {
- urlHome = urlHome || home;
- jsToLoad.push(buildJSURL(name, prefix, urlHome));
- }
- function resolve(base, path) {
- if (/(^|:)\/\//.test(path)) {
- // path: [http:]//foo.com/bar/; base: whatever/
- // -> http://foo.com/bar/
- return path;
- }
- if (!/^\//.test(path)) {
- // path: relative/; base: whatever/
- // -> whatever/relative/
- return base + path;
- }
- var match = base.match(/^(([^:/]*:|^)\/\/[^/]*)/);
- if (match) {
- // path: /absolute/; base: [http:]//foo.com/whatever/
- // -> [http:]//foo.com/absolute/
- return match[1] + path;
- }
- // path: /absolute/; base: whatever/path/
- // -> /absolute/
- return path;
- }
- function buildJSURL(name, prefix, urlHome) {
- prefix = prefix || '';
- urlHome = urlHome || home;
- var parts = name.match(/^(.*\/)([^/]*)$/);
- if (parts) {
- name = parts[2];
- urlHome = resolve(urlHome, parts[1]);
- }
- if (!deploy) {
- name = name + nocache;
- }
- return urlHome + prefix + '/' + name;
- }
- function loadCSS(name, prefix) {
- prefix = prefix || 'css';
- if (!deploy) {
- name = name + nocache;
- }
- var url = 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);
- }
- function loadDependencies() {
- if (typeof jQuery == 'undefined') {
- writeScriptTag(buildJSURL('js/lib/jQuery/jquery-1.8.2.min.js'));
- }
- if ((typeof jQuery == 'undefined') || (typeof jQuery.ui == 'undefined')) {
- writeScriptTag(buildJSURL('js/lib/jQuery/jquery-ui-1.8.16.custom.min.js'));
- }
- }
- function loadIDEDependencies() {
- addJSToLoad('js/lib/jQuery/jquery.textarea.js');
- addJSToLoad('js/lib/CodeMirror/codemirror.js');
- addJSToLoad('js/lib/CodeMirror/smalltalk.js');
- loadCSS('lib/CodeMirror/codemirror.css', 'js');
- loadCSS('lib/CodeMirror/amber.css', 'js');
- }
- // This will be called after JS files have been loaded
- function initializeSmalltalk(commitPath) {
- window.smalltalkReady = function() {
- if (commitPath) {
- smalltalk['@@commitPath'] = commitPath;
- smalltalk.Package._commitPathsFromLoader();
- }
- if (spec.ready) {
- spec.ready();
- }
- evaluateSmalltalkScripts();
- };
- loadAllJS();
- }
- /*
- * When loaded using AJAX, scripts order not guaranteed.
- * Load JS in the order they have been added using addJSToLoad().
- * If loaded, will use jQuery's getScript instead of adding a script element
- */
- function loadAllJS() {
- loadJS = loadJSViaScriptTag;
- if (typeof jQuery != 'undefined') {
- loadJS = loadJSViaJQuery;
- }
- loadNextJS();
- }
- function loadNextJS() {
- loadJS(jsToLoad[0], function(){
- jsToLoad.shift();
- if (jsToLoad.length > 0) {
- loadNextJS();
- }
- });
- }
- function loadJSViaScriptTag(url, callback) {
- writeScriptTag(url);
- callback();
- }
- function loadJSViaJQuery(url, callback) {
- $.ajax({
- dataType: "script",
- url: url,
- cache: deploy,
- success: callback
- });
- }
- function writeScriptTag(src) {
- var scriptString = '<script src="' + src + '" type="text/javascript"></script>';
- document.write(scriptString);
- }
- function evaluateSmalltalkScripts() {
- jQuery(document).ready(function() {
- jQuery('script[type="text/smalltalk"]').each(function(i, elt) {
- smalltalk.Compiler._new()._evaluateExpression_(jQuery(elt).html());
- });
- })
- }
- var localPackages;
- 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;
- }
- 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 = amber.load;
- window.toggleAmberIDE = amber.toggleIDE;
|