mirror of
https://github.com/Hopiu/jquery-mobile.git
synced 2026-05-01 19:34:42 +00:00
253 lines
8.5 KiB
JavaScript
253 lines
8.5 KiB
JavaScript
/**
|
|
* almond 0.0.1 Copyright (c) 2011, The Dojo Foundation All Rights Reserved.
|
|
* Available via the MIT or new BSD license.
|
|
* see: http://github.com/jrburke/almond for details
|
|
*/
|
|
/*jslint strict: false, plusplus: false */
|
|
/*global setTimeout: false */
|
|
|
|
var requirejs, require, define;
|
|
(function () {
|
|
|
|
var defined = {},
|
|
aps = [].slice,
|
|
req;
|
|
|
|
if (typeof define === "function") {
|
|
//If a define is already in play via another AMD loader,
|
|
//do not overwrite.
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Given a relative module name, like ./something, normalize it to
|
|
* a real name that can be mapped to a path.
|
|
* @param {String} name the relative name
|
|
* @param {String} baseName a real name that the name arg is relative
|
|
* to.
|
|
* @returns {String} normalized name
|
|
*/
|
|
function normalize(name, baseName) {
|
|
//Adjust any relative paths.
|
|
if (name && name.charAt(0) === ".") {
|
|
//If have a base name, try to normalize against it,
|
|
//otherwise, assume it is a top-level require that will
|
|
//be relative to baseUrl in the end.
|
|
if (baseName) {
|
|
//Convert baseName to array, and lop off the last part,
|
|
//so that . matches that "directory" and not name of the baseName's
|
|
//module. For instance, baseName of "one/two/three", maps to
|
|
//"one/two/three.js", but we want the directory, "one/two" for
|
|
//this normalization.
|
|
baseName = baseName.split("/");
|
|
baseName = baseName.slice(0, baseName.length - 1);
|
|
|
|
name = baseName.concat(name.split("/"));
|
|
|
|
//start trimDots
|
|
var i, part;
|
|
for (i = 0; (part = name[i]); i++) {
|
|
if (part === ".") {
|
|
name.splice(i, 1);
|
|
i -= 1;
|
|
} else if (part === "..") {
|
|
if (i === 1 && (name[2] === '..' || name[0] === '..')) {
|
|
//End of the line. Keep at least one non-dot
|
|
//path segment at the front so it can be mapped
|
|
//correctly to disk. Otherwise, there is likely
|
|
//no path mapping for a path starting with '..'.
|
|
//This can still fail, but catches the most reasonable
|
|
//uses of ..
|
|
break;
|
|
} else if (i > 0) {
|
|
name.splice(i - 1, 2);
|
|
i -= 2;
|
|
}
|
|
}
|
|
}
|
|
//end trimDots
|
|
|
|
name = name.join("/");
|
|
}
|
|
}
|
|
return name;
|
|
}
|
|
|
|
function makeRequire(relName, forceSync) {
|
|
return function () {
|
|
//A version of a require function that passes a moduleName
|
|
//value for items that may need to
|
|
//look up paths relative to the moduleName
|
|
return req.apply(null, aps.call(arguments, 0).concat([relName, forceSync]));
|
|
};
|
|
}
|
|
|
|
function makeNormalize(relName) {
|
|
return function (name) {
|
|
return normalize(name, relName);
|
|
};
|
|
}
|
|
|
|
function makeLoad(depName) {
|
|
return function (value) {
|
|
defined[depName] = value;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Makes a name map, normalizing the name, and using a plugin
|
|
* for normalization if necessary. Grabs a ref to plugin
|
|
* too, as an optimization.
|
|
*/
|
|
function makeMap(name, relName) {
|
|
var prefix, plugin,
|
|
index = name.indexOf('!');
|
|
|
|
if (index !== -1) {
|
|
prefix = normalize(name.slice(0, index), relName);
|
|
name = name.slice(index + 1);
|
|
plugin = defined[prefix];
|
|
|
|
//Normalize according
|
|
if (plugin && plugin.normalize) {
|
|
name = plugin.normalize(name, makeNormalize(relName));
|
|
} else {
|
|
name = normalize(name, relName);
|
|
}
|
|
} else {
|
|
name = normalize(name, relName);
|
|
}
|
|
|
|
//Using ridiculous property names for space reasons
|
|
return {
|
|
f: prefix ? prefix + '!' + name : name, //fullName
|
|
n: name,
|
|
p: plugin
|
|
};
|
|
}
|
|
|
|
function main(name, deps, callback, relName) {
|
|
var args = [],
|
|
usingExports,
|
|
cjsModule, depName, i, ret, map;
|
|
|
|
//Use name if no relName
|
|
if (!relName) {
|
|
relName = name;
|
|
}
|
|
|
|
//Call the callback to define the module, if necessary.
|
|
if (typeof callback === 'function') {
|
|
//Pull out the defined dependencies and pass the ordered
|
|
//values to the callback.
|
|
if (deps) {
|
|
for (i = 0; i < deps.length; i++) {
|
|
map = makeMap(deps[i], relName);
|
|
depName = map.f;
|
|
|
|
//Fast path CommonJS standard dependencies.
|
|
if (depName === "require") {
|
|
args[i] = makeRequire(name);
|
|
} else if (depName === "exports") {
|
|
//CommonJS module spec 1.1
|
|
args[i] = defined[name] = {};
|
|
usingExports = true;
|
|
} else if (depName === "module") {
|
|
//CommonJS module spec 1.1
|
|
cjsModule = args[i] = {
|
|
id: name,
|
|
uri: '',
|
|
exports: defined[name]
|
|
};
|
|
} else if (depName in defined) {
|
|
args[i] = defined[depName];
|
|
} else if (map.p) {
|
|
map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
|
|
args[i] = defined[depName];
|
|
}
|
|
}
|
|
}
|
|
|
|
ret = callback.apply(defined[name], args);
|
|
|
|
if (name) {
|
|
//If setting exports via "module" is in play,
|
|
//favor that over return value and exports. After that,
|
|
//favor a non-undefined return value over exports use.
|
|
if (cjsModule && cjsModule.exports !== undefined) {
|
|
defined[name] = cjsModule.exports;
|
|
} else if (!usingExports) {
|
|
//Use the return value from the function.
|
|
defined[name] = ret;
|
|
}
|
|
}
|
|
} else if (name) {
|
|
//May just be an object definition for the module. Only
|
|
//worry about defining if have a module name.
|
|
defined[name] = callback;
|
|
}
|
|
}
|
|
|
|
requirejs = req = function (deps, callback, relName, forceSync) {
|
|
if (typeof deps === "string") {
|
|
|
|
//Just return the module wanted. In this scenario, the
|
|
//deps arg is the module name, and second arg (if passed)
|
|
//is just the relName.
|
|
//Normalize module name, if it contains . or ..
|
|
return defined[makeMap(deps, callback).f];
|
|
} else if (!deps.splice) {
|
|
//deps is a config object, not an array.
|
|
//Drop the config stuff on the ground.
|
|
if (callback.splice) {
|
|
//callback is an array, which means it is a dependency list.
|
|
//Adjust args if there are dependencies
|
|
deps = callback;
|
|
callback = arguments[2];
|
|
} else {
|
|
deps = [];
|
|
}
|
|
}
|
|
|
|
//Simulate async callback;
|
|
if (forceSync) {
|
|
main(null, deps, callback, relName);
|
|
} else {
|
|
setTimeout(function () {
|
|
main(null, deps, callback, relName);
|
|
}, 15);
|
|
}
|
|
|
|
return req;
|
|
};
|
|
|
|
/**
|
|
* Just drops the config on the floor, but returns req in case
|
|
* the config return value is used.
|
|
*/
|
|
req.config = function () {
|
|
return req;
|
|
};
|
|
|
|
/**
|
|
* Export require as a global, but only if it does not already exist.
|
|
*/
|
|
if (!require) {
|
|
require = req;
|
|
}
|
|
|
|
define = function (name, deps, callback) {
|
|
|
|
//This module may not have dependencies
|
|
if (!deps.splice) {
|
|
//deps is not an array, so probably means
|
|
//an object literal for the value. Adjust args.
|
|
callback = deps;
|
|
deps = [];
|
|
}
|
|
|
|
main(name, deps, callback);
|
|
};
|
|
|
|
define.amd = {};
|
|
}());
|