UNPKG

jetfuel-blackbox

Version:

Currently, BlackBox is a boilerplate client-side application framework, built on top of the JetFuel build system and Grunt, Backbone, RequireJS, JetRunner unit test server (Mocha BDD/TDD test framework + PhantomJS + SauceLabs cloud integration), Dust (and Plate Django port) for templating (both client and server-side), Sass, Express dynamic web server, etc. BlackBox is the template used for JetFuel's basic `init` command.

237 lines (217 loc) 6.56 kB
/** * @fileOverview Parses a string into URL parts * @author <a href="mailto:promano@urbandaddy.com">Pete Romano</a> */ define('util/URLParser', function() { 'use strict'; var /** * @constant * @private * @type RegExp * @fieldOf blackbox.web.util.URLParser * @description /^((\w+)\:)?\/\/([^\/\\]+)/ */ X_DOMAIN = /^((\w+)\:)?\/\/([^\/\\]+)/, /** * @constant * @private * @type RegExp * @fieldOf blackbox.web.util.URLParser * @description /^(?:([A-Za-z]+:))?(?:\/{2})?([0-9.\-A-Za-z]*)(?::(\d+))?(?:(\/[^?#]*))?(?:\?([^#]*))?(?:#!?(.*))?$/ */ SEGMENTS = /^(?:([A-Za-z]+:))?(?:\/{2})?([0-9.\-A-Za-z]*)(?::(\d+))?(?:(\/[^?#]*))?(?:\?([^#]*))?(?:#!?(.*))?$/, /** * @constant * @private * @type RegExp * @fieldOf blackbox.web.util.URLParser * @description /([^&=]+)=?([^&]*)/g */ QS_PARTS = /([^&=]+)=?([^&]*)/g, /** * @constant * @private * @type RegExp * @fieldOf blackbox.web.util.URLParser * @description /\+/g */ QS_SPACE = /\+/g, /** * @private * @fieldOf blackbox.web.util.URLParser * @namespace */ SegmentsEnum = { /** * @name blackbox.web.util.URLParser.SegmentsEnum.PROTOCOL * @constant * @type Number * @description 1 */ PROTOCOL: 1, /** * @name blackbox.web.util.URLParser.SegmentsEnum.DOMAIN * @constant * @type Number * @description 2 */ DOMAIN: 2, /** * @name blackbox.web.util.URLParser.SegmentsEnum.PORT * @constant * @type Number * @description 3 */ PORT: 3, /** * @name blackbox.web.util.URLParser.SegmentsEnum.PATH * @constant * @type Number * @description 4 */ PATH: 4, /** * @name blackbox.web.util.URLParser.SegmentsEnum.QUERY_STRING * @constant * @type Number * @description 5 */ QUERY_STRING: 5, /** * @name blackbox.web.util.URLParser.SegmentsEnum.HASH * @constant * @type Number * @description 6 */ HASH: 6 }; /** * @methodOf blackbox.web.util.URLParser * @private * @static * @param {String} url * @param Number segment * @returns {String} */ function getSegment(url, segment) { return [].concat(url.match(SEGMENTS) || [])[segment] || ''; } /** * @methodOf blackbox.web.util.URLParser * @private * @static * @param {String} url * @returns {Array} */ function getSegments(url) { return [].concat(url.match(SEGMENTS) || []); } getSegment.curry = function(segment) { return function(url) { return getSegment(url, segment); }; }; /** * @name blackbox.web.util.URLParser * @version 2.0 * @constructor * @description * Parses a string into URL parts */ function URLParser() {} return { /** * @name parse * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {Object} */ parse: function(url) { var segments = getSegments(url); function getSegment(segment) { return segments[segment] || ''; } return { port: getSegment(SegmentsEnum.PORT), path: getSegment(SegmentsEnum.PATH), queryString: getSegment(SegmentsEnum.QUERY_STRING), protocol: getSegment(SegmentsEnum.PROTOCOL), domain: getSegment(SegmentsEnum.DOMAIN), hash: getSegment(SegmentsEnum.HASH) }; }, /** * @name getHash * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {String} */ getHash: getSegment.curry(SegmentsEnum.HASH), /** * @name getDomain * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {String} */ getDomain: getSegment.curry(SegmentsEnum.DOMAIN), /** * @name getPort * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {String} */ getPort: getSegment.curry(SegmentsEnum.PORT), /** * @name getPath * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {String} */ getPath: getSegment.curry(SegmentsEnum.PATH), /** * @name getQueryString * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {String} */ getQueryString: getSegment.curry(SegmentsEnum.QUERY_STRING), /** * @name getProtocol * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {String} */ getProtocol: getSegment.curry(SegmentsEnum.PROTOCOL), /** * @name parseQueryString * @methodOf blackbox.web.util.URLParser * @static * @param {String} queryString * @returns {Object} */ parseQueryString: function(queryString) { var d = function (s) { return decodeURIComponent(s.replace(QS_SPACE, ' ')); }, p = {}, e; while ((e = QS_PARTS.exec(queryString))) { p[d(e[1])] = d(e[2]); } return p; }, /** * @name isXDomain * @methodOf blackbox.web.util.URLParser * @static * @param {String} url * @returns {Boolean} * * TODO: Add more sophisticated checks against protocol, port, domain, etc. */ isXDomain: function(url) { return !!this.getProtocol(url); } }; });