UNPKG

npm-creole

Version:

npm package for parsing wiki creole. fork of https://github.com/codeholic/jscreole/network

291 lines (236 loc) 6.9 kB
/* */ var JSAN = function () { JSAN.addRepository(arguments) } JSAN.VERSION = 0.10; /* */ JSAN.globalScope = self; JSAN.includePath = ['.', 'lib']; JSAN.errorLevel = "none"; JSAN.errorMessage = ""; JSAN.loaded = {}; /* */ JSAN.use = function () { var classdef = JSAN.require(arguments[0]); if (!classdef) return null; var importList = JSAN._parseUseArgs.apply(JSAN, arguments).importList; JSAN.exporter(classdef, importList); return classdef; } /* */ JSAN.require = function (pkg) { var path = JSAN._convertPackageToPath(pkg); if (JSAN.loaded[path]) { return JSAN.loaded[path]; } try { var classdef = eval(pkg); if (typeof classdef != 'undefined') return classdef; } catch (e) { /* nice try, eh? */ } for (var i = 0; i < JSAN.includePath.length; i++) { var js; try{ var url = JSAN._convertPathToUrl(path, JSAN.includePath[i]); js = JSAN._loadJSFromUrl(url); } catch (e) { if (i == JSAN.includePath.length - 1) throw e; } if (js != null) { var classdef = JSAN._createScript(js, pkg); JSAN.loaded[path] = classdef; return classdef; } } return false; } /* */ JSAN.exporter = function () { JSAN._exportItems.apply(JSAN, arguments); } /* */ JSAN.addRepository = function () { var temp = JSAN._flatten( arguments ); // Need to go in reverse to do something as simple as unshift( @foo, @_ ); for ( var i = temp.length - 1; i >= 0; i-- ) JSAN.includePath.unshift(temp[i]); return JSAN; } JSAN._flatten = function( list1 ) { var list2 = new Array(); for ( var i = 0; i < list1.length; i++ ) { if ( typeof list1[i] == 'object' ) { list2 = JSAN._flatten( list1[i], list2 ); } else { list2.push( list1[i] ); } } return list2; }; JSAN._findMyPath = function () { if (document) { var scripts = document.getElementsByTagName('script'); for ( var i = 0; i < scripts.length; i++ ) { var src = scripts[i].getAttribute('src'); if (src) { var inc = src.match(/^(.*?)\/?JSAN.js/); if (inc && inc[1]) { var repo = inc[1]; for (var j = 0; j < JSAN.includePath.length; j++) { if (JSAN.includePath[j] == repo) { return; } } JSAN.addRepository(repo); } } } } } JSAN._findMyPath(); JSAN._convertPathToUrl = function (path, repository) { return repository.concat('/' + path); }; JSAN._convertPackageToPath = function (pkg) { var path = pkg.replace(/\./g, '/'); path = path.concat('.js'); return path; } JSAN._parseUseArgs = function () { var pkg = arguments[0]; var importList = []; for (var i = 1; i < arguments.length; i++) importList.push(arguments[i]); return { pkg: pkg, importList: importList } } JSAN._loadJSFromUrl = function (url) { return new JSAN.Request().getText(url); } JSAN._findExportInList = function (list, request) { if (list == null) return false; for (var i = 0; i < list.length; i++) if (list[i] == request) return true; return false; } JSAN._findExportInTag = function (tags, request) { if (tags == null) return []; for (var i in tags) if (i == request) return tags[i]; return []; } JSAN._exportItems = function (classdef, importList) { var exportList = new Array(); var EXPORT = classdef.EXPORT; var EXPORT_OK = classdef.EXPORT_OK; var EXPORT_TAGS = classdef.EXPORT_TAGS; if (importList.length > 0) { importList = JSAN._flatten( importList ); for (var i = 0; i < importList.length; i++) { var request = importList[i]; if ( JSAN._findExportInList(EXPORT, request) || JSAN._findExportInList(EXPORT_OK, request)) { exportList.push(request); continue; } var list = JSAN._findExportInTag(EXPORT_TAGS, request); for (var i = 0; i < list.length; i++) { exportList.push(list[i]); } } } else { exportList = EXPORT; } JSAN._exportList(classdef, exportList); } JSAN._exportList = function (classdef, exportList) { if (typeof(exportList) != 'object') return null; for (var i = 0; i < exportList.length; i++) { var name = exportList[i]; if (JSAN.globalScope[name] == null) JSAN.globalScope[name] = classdef[name]; } } JSAN._makeNamespace = function(js, pkg) { var spaces = pkg.split('.'); var parent = JSAN.globalScope; eval(js); var classdef = eval(pkg); for (var i = 0; i < spaces.length; i++) { var name = spaces[i]; if (i == spaces.length - 1) { if (typeof parent[name] == 'undefined') { parent[name] = classdef; if ( typeof classdef['prototype'] != 'undefined' ) { parent[name].prototype = classdef.prototype; } } } else { if (parent[name] == undefined) { parent[name] = {}; } } parent = parent[name]; } return classdef; } JSAN._handleError = function (msg, level) { if (!level) level = JSAN.errorLevel; JSAN.errorMessage = msg; switch (level) { case "none": break; case "warn": alert(msg); break; case "die": default: throw new Error(msg); break; } } JSAN._createScript = function (js, pkg) { try { return JSAN._makeNamespace(js, pkg); } catch (e) { JSAN._handleError("Could not create namespace[" + pkg + "]: " + e); } return null; } JSAN.prototype = { use: function () { JSAN.use.apply(JSAN, arguments) } }; // Low-Level HTTP Request JSAN.Request = function (jsan) { if (JSAN.globalScope.XMLHttpRequest) { this._req = new XMLHttpRequest(); } else { this._req = new ActiveXObject("Microsoft.XMLHTTP"); } } JSAN.Request.prototype = { _req: null, getText: function (url) { this._req.open("GET", url, false); try { this._req.send(null); if (this._req.status == 200 || this._req.status == 0) return this._req.responseText; } catch (e) { JSAN._handleError("File not found: " + url); return null; }; JSAN._handleError("File not found: " + url); return null; } }; /* */