diff --git a/Makefile b/Makefile index 3a948b70..135caf23 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ VER = sed "s/v@VERSION/$$(git log -1 --format=format:"Git Build: SHA1: %H <> Date: %cd")/" VER_MIN = "/*! jQuery Mobile v$$(git log -1 --format=format:"Git Build: SHA1: %H <> Date: %cd") jquerymobile.com | jquery.org/license */" VER_OFFICIAL = $(shell cat version.txt) +SED_VER_API = sed 's/__version__/"${VER_OFFICIAL}"/g' deploy: VER = sed "s/v@VERSION/${VER_OFFICIAL}/" deploy: VER_MIN = "/*! jQuery Mobile v${VER_OFFICIAL} jquerymobile.com | jquery.org/license */" @@ -72,7 +73,7 @@ docs: init # ... Prepend versioned license @@cat LICENSE-INFO.txt | ${VER} > tmp/${NAME}/LICENSE-INFO.txt @@cat tmp/${NAME}/LICENSE-INFO.txt | cat - tmp/${NAME}/js/jquery.mobile.docs.js > tmp/${NAME}/js/jquery.mobile.docs.js.tmp - @@mv tmp/${NAME}/js/jquery.mobile.docs.js.tmp tmp/${NAME}/js/jquery.mobile.docs.js + @@cat tmp/${NAME}/js/jquery.mobile.docs.js.tmp | ${SED_VER_API} > tmp/${NAME}/js/jquery.mobile.docs.js @@cat tmp/${NAME}/LICENSE-INFO.txt | cat - tmp/${NAME}/css/themes/default/${NAME}.css > tmp/${NAME}/css/themes/default/${NAME}.css.tmp @@mv tmp/${NAME}/css/themes/default/${NAME}.css.tmp tmp/${NAME}/css/themes/default/${NAME}.css # ... Move and zip up the the whole folder @@ -99,7 +100,8 @@ js: init ${RUN_JS} \ external/r.js/dist/r.js \ -o baseUrl="js" \ - include=jquery.mobile exclude=jquery,order \ + include=jquery.mobile \ + exclude=jquery,order,text,text!../version.txt \ out=${OUTPUT}/${NAME}.compiled.js \ pragmasOnSave.jqmBuildExclude=true \ wrap.startFile=build/wrap.start \ @@ -108,7 +110,7 @@ js: init skipModuleInsertion=true \ optimize=none @@cat LICENSE-INFO.txt | ${VER} > ${OUTPUT}/${NAME}.js - @@cat ${OUTPUT}/${NAME}.compiled.js >> ${OUTPUT}/${NAME}.js + @@cat ${OUTPUT}/${NAME}.compiled.js | ${SED_VER_API} >> ${OUTPUT}/${NAME}.js @@rm ${OUTPUT}/${NAME}.compiled.js # ..... and then minify it @@echo ${VER_MIN} > ${OUTPUT}/${NAME}.min.js @@ -153,8 +155,6 @@ zip: init css js latest: init css docs js zip # Time to put these on the CDN @@scp -qr ${OUTPUT}/* jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/mobile/latest/ - # Do some cleanup to wrap it up - @@rm -rf ${OUTPUT} # ------------------------------------------------- # Build the nightly backups. This is done on a server cronjob diff --git a/build/docs.build.js b/build/docs.build.js index 8f38ee18..23f2f564 100644 --- a/build/docs.build.js +++ b/build/docs.build.js @@ -19,7 +19,8 @@ modules: [ { - name: "jquery.mobile.docs" + name: "jquery.mobile.docs", + exclude: [ "jquery", "order" , "text", "text!../version.txt" ] } ], diff --git a/docs/_assets/images/version.png b/docs/_assets/images/version.png index 51dbb3e4..02b6e439 100644 Binary files a/docs/_assets/images/version.png and b/docs/_assets/images/version.png differ diff --git a/js/jquery.mobile.core.js b/js/jquery.mobile.core.js index 348f359d..2bb3b6a0 100644 --- a/js/jquery.mobile.core.js +++ b/js/jquery.mobile.core.js @@ -4,7 +4,7 @@ //>>group: core //>>required: true -define( [ "jquery", "./jquery.mobile.widget" ], function( $ ) { +define( [ "jquery", "text!../version.txt", "./jquery.mobile.widget" ], function( $, __version__ ) { //>>excludeEnd("jqmBuildExclude"); (function( $, window, undefined ) { @@ -13,6 +13,9 @@ define( [ "jquery", "./jquery.mobile.widget" ], function( $ ) { // jQuery.mobile configurable options $.mobile = $.extend( {}, { + // Version of the jQuery Mobile Framework + version: __version__, + // Namespace used framework-wide for data-attrs. Default is no namespace ns: "", diff --git a/js/jquery.mobile.js b/js/jquery.mobile.js index 071db495..57f9c7f9 100644 --- a/js/jquery.mobile.js +++ b/js/jquery.mobile.js @@ -10,8 +10,8 @@ define([ './jquery.mobile.hashchange', './jquery.mobile.page', './jquery.mobile.core', - 'order!./jquery.mobile.navigation', - 'order!./jquery.mobile.navigation.pushstate', + './jquery.mobile.navigation', + './jquery.mobile.navigation.pushstate', './jquery.mobile.transition', './jquery.mobile.transition.pop', './jquery.mobile.transition.slide', diff --git a/js/text.js b/js/text.js new file mode 100644 index 00000000..6ef7422e --- /dev/null +++ b/js/text.js @@ -0,0 +1,283 @@ +/** + * @license RequireJS text 1.0.2 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ +/*jslint regexp: false, nomen: false, plusplus: false, strict: false */ +/*global require: false, XMLHttpRequest: false, ActiveXObject: false, + define: false, window: false, process: false, Packages: false, + java: false, location: false */ + +(function () { + var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], + xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, + bodyRegExp = /]*>\s*([\s\S]+)\s*<\/body>/im, + hasLocation = typeof location !== 'undefined' && location.href, + defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''), + defaultHostName = hasLocation && location.hostname, + defaultPort = hasLocation && (location.port || undefined), + buildMap = []; + + define(function () { + var text, get, fs; + + if (typeof window !== "undefined" && window.navigator && window.document) { + get = function (url, callback) { + var xhr = text.createXhr(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function (evt) { + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + callback(xhr.responseText); + } + }; + xhr.send(null); + }; + } else if (typeof process !== "undefined" && + process.versions && + !!process.versions.node) { + //Using special require.nodeRequire, something added by r.js. + fs = require.nodeRequire('fs'); + + get = function (url, callback) { + callback(fs.readFileSync(url, 'utf8')); + }; + } else if (typeof Packages !== 'undefined') { + //Why Java, why is this so awkward? + get = function (url, callback) { + var encoding = "utf-8", + file = new java.io.File(url), + lineSeparator = java.lang.System.getProperty("line.separator"), + input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)), + stringBuffer, line, + content = ''; + try { + stringBuffer = new java.lang.StringBuffer(); + line = input.readLine(); + + // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324 + // http://www.unicode.org/faq/utf_bom.html + + // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK: + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058 + if (line && line.length() && line.charAt(0) === 0xfeff) { + // Eat the BOM, since we've already found the encoding on this file, + // and we plan to concatenating this buffer with others; the BOM should + // only appear at the top of a file. + line = line.substring(1); + } + + stringBuffer.append(line); + + while ((line = input.readLine()) !== null) { + stringBuffer.append(lineSeparator); + stringBuffer.append(line); + } + //Make sure we return a JavaScript string and not a Java string. + content = String(stringBuffer.toString()); //String + } finally { + input.close(); + } + callback(content); + }; + } + + text = { + version: '1.0.2', + + strip: function (content) { + //Strips declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if (content) { + content = content.replace(xmlRegExp, ""); + var matches = content.match(bodyRegExp); + if (matches) { + content = matches[1]; + } + } else { + content = ""; + } + return content; + }, + + jsEscape: function (content) { + return content.replace(/(['\\])/g, '\\$1') + .replace(/[\f]/g, "\\f") + .replace(/[\b]/g, "\\b") + .replace(/[\n]/g, "\\n") + .replace(/[\t]/g, "\\t") + .replace(/[\r]/g, "\\r"); + }, + + createXhr: function () { + //Would love to dump the ActiveX crap in here. Need IE 6 to die first. + var xhr, i, progId; + if (typeof XMLHttpRequest !== "undefined") { + return new XMLHttpRequest(); + } else { + for (i = 0; i < 3; i++) { + progId = progIds[i]; + try { + xhr = new ActiveXObject(progId); + } catch (e) {} + + if (xhr) { + progIds = [progId]; // so faster next time + break; + } + } + } + + if (!xhr) { + throw new Error("createXhr(): XMLHttpRequest not available"); + } + + return xhr; + }, + + get: get, + + /** + * Parses a resource name into its component parts. Resource names + * look like: module/name.ext!strip, where the !strip part is + * optional. + * @param {String} name the resource name + * @returns {Object} with properties "moduleName", "ext" and "strip" + * where strip is a boolean. + */ + parseName: function (name) { + var strip = false, index = name.indexOf("."), + modName = name.substring(0, index), + ext = name.substring(index + 1, name.length); + + index = ext.indexOf("!"); + if (index !== -1) { + //Pull off the strip arg. + strip = ext.substring(index + 1, ext.length); + strip = strip === "strip"; + ext = ext.substring(0, index); + } + + return { + moduleName: modName, + ext: ext, + strip: strip + }; + }, + + xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/, + + /** + * Is an URL on another domain. Only works for browser use, returns + * false in non-browser environments. Only used to know if an + * optimized .js version of a text resource should be loaded + * instead. + * @param {String} url + * @returns Boolean + */ + useXhr: function (url, protocol, hostname, port) { + var match = text.xdRegExp.exec(url), + uProtocol, uHostName, uPort; + if (!match) { + return true; + } + uProtocol = match[2]; + uHostName = match[3]; + + uHostName = uHostName.split(':'); + uPort = uHostName[1]; + uHostName = uHostName[0]; + + return (!uProtocol || uProtocol === protocol) && + (!uHostName || uHostName === hostname) && + ((!uPort && !uHostName) || uPort === port); + }, + + finishLoad: function (name, strip, content, onLoad, config) { + content = strip ? text.strip(content) : content; + if (config.isBuild) { + buildMap[name] = content; + } + onLoad(content); + }, + + load: function (name, req, onLoad, config) { + //Name has format: some.module.filext!strip + //The strip part is optional. + //if strip is present, then that means only get the string contents + //inside a body tag in an HTML string. For XML/SVG content it means + //removing the declarations so the content can be inserted + //into the current doc without problems. + + // Do not bother with the work if a build and text will + // not be inlined. + if (config.isBuild && !config.inlineText) { + onLoad(); + return; + } + + var parsed = text.parseName(name), + nonStripName = parsed.moduleName + '.' + parsed.ext, + url = req.toUrl(nonStripName), + useXhr = (config && config.text && config.text.useXhr) || + text.useXhr; + + //Load the text. Use XHR if possible and in a browser. + if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) { + text.get(url, function (content) { + text.finishLoad(name, parsed.strip, content, onLoad, config); + }); + } else { + //Need to fetch the resource across domains. Assume + //the resource has been optimized into a JS module. Fetch + //by the module name + extension, but do not include the + //!strip part to avoid file system issues. + req([nonStripName], function (content) { + text.finishLoad(parsed.moduleName + '.' + parsed.ext, + parsed.strip, content, onLoad, config); + }); + } + }, + + write: function (pluginName, moduleName, write, config) { + if (moduleName in buildMap) { + var content = text.jsEscape(buildMap[moduleName]); + write.asModule(pluginName + "!" + moduleName, + "define(function () { return '" + + content + + "';});\n"); + } + }, + + writeFile: function (pluginName, moduleName, req, write, config) { + var parsed = text.parseName(moduleName), + nonStripName = parsed.moduleName + '.' + parsed.ext, + //Use a '.js' file name so that it indicates it is a + //script that can be loaded across domains. + fileName = req.toUrl(parsed.moduleName + '.' + + parsed.ext) + '.js'; + + //Leverage own load() method to load plugin value, but only + //write out values that do not have the strip argument, + //to avoid any potential issues with ! in file names. + text.load(nonStripName, req, function (value) { + //Use own write() method to construct full module value. + //But need to create shell that translates writeFile's + //write() to the right interface. + var textWrite = function (contents) { + return write(fileName, contents); + }; + textWrite.asModule = function (moduleName, contents) { + return write.asModule(moduleName, fileName, contents); + }; + + text.write(pluginName, nonStripName, textWrite, config); + }, config); + } + }; + + return text; + }); +}()); diff --git a/version.txt b/version.txt index 7033b1f1..991f910e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.1pre +1.1pre \ No newline at end of file