Comparing version 1.11.2 to 1.12.0
{ | ||
"name": "URIjs", | ||
"version": "1.11.2", | ||
"version": "1.12.0", | ||
"title": "URI.js - Mutating URLs", | ||
@@ -5,0 +5,0 @@ "author": { |
@@ -159,2 +159,3 @@ # URI.js # | ||
* [application/x-www-form-urlencoded](http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type) (Query String Parameters) and [application/x-www-form-urlencoded encoding algorithm](http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#application/x-www-form-urlencoded-encoding-algorithm) | ||
* [What every web developer must know about URL encoding](http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding) | ||
@@ -198,3 +199,5 @@ Informal stuff | ||
* [uri-templates](https://github.com/geraintluff/uri-templates) (supporting extraction as well) by Geraint Luff | ||
* [uri-templates](https://github.com/marc-portier/uri-templates) by Marc Portier | ||
* [uri-templates](https://github.com/geraintluff/uri-templates) by Geraint Luff (includint reverse operation) | ||
* [URI Template JS](https://github.com/fxa/uritemplate-js) by Franz Antesberger | ||
@@ -228,2 +231,11 @@ * [Temple](https://github.com/brettstimmerman/temple) by Brett Stimmerman | ||
### 1.12.0 (January 23rd 2014) ### | ||
* fixing [`.absoluteTo()`](http://medialize.github.com/URI.js/docs.html#absoluteto) to comply with [RFC3986 Reference Resolution Examples](http://tools.ietf.org/html/rfc3986#section-5.4) - ([Issue #113](https://github.com/medialize/URI.js/issues/113)) | ||
* fixing [`.normalizePath()`](http://medialize.github.com/URI.js/docs.html#normalize-path) to maintain leading parent references (`../`) for relative paths, while removing them for absolute paths - ([Issue #133](https://github.com/medialize/URI.js/issues/133)) | ||
* fixing `URI.protocol_expression` to properly accept `.` in compliance with [RFC 3986 - Scheme](http://tools.ietf.org/html/rfc3986#section-3.1) - ([Issue #132](https://github.com/medialize/URI.js/issues/132)) | ||
* fixing [`URI.withinString()`](http://medialize.github.com/URI.js/docs.html#static-withinString) to not use backtracking prone regular expression `URI.find_uri_expression` anymore - ([Issue #131](https://github.com/medialize/URI.js/issues/131)) | ||
* fixing [`URI.withinString()`](http://medialize.github.com/URI.js/docs.html#static-withinString) to accept options `ignore` and `ignoreHtml` to allow better control over which detected URLs get handled - ([Issue #117](https://github.com/medialize/URI.js/issues/117)) | ||
* fixing [`URI.withinString()`](http://medialize.github.com/URI.js/docs.html#static-withinString) to accept option `start` to specify the RegExp used for finding the beginning of an URL (defaults to `/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi`) - ([Issue #115](https://github.com/medialize/URI.js/issues/115)) | ||
### 1.11.2 (August 14th 2013) ### | ||
@@ -230,0 +242,0 @@ |
@@ -5,3 +5,3 @@ /*! | ||
* | ||
* Version: 1.11.2 | ||
* Version: 1.12.0 | ||
* | ||
@@ -8,0 +8,0 @@ * Author: Rodney Rehm |
@@ -5,3 +5,3 @@ /*! | ||
* | ||
* Version: 1.11.2 | ||
* Version: 1.12.0 | ||
* | ||
@@ -8,0 +8,0 @@ * Author: Rodney Rehm |
@@ -5,3 +5,3 @@ /*! | ||
* | ||
* Version: 1.11.2 | ||
* Version: 1.12.0 | ||
* | ||
@@ -8,0 +8,0 @@ * Author: Rodney Rehm |
/*! | ||
* URI.js - Mutating URLs | ||
* | ||
* Version: 1.11.2 | ||
* Version: 1.12.0 | ||
* | ||
@@ -56,2 +56,4 @@ * Author: Rodney Rehm | ||
URI.version = '1.12.0'; | ||
var p = URI.prototype; | ||
@@ -173,3 +175,3 @@ var hasOwn = Object.prototype.hasOwnProperty; | ||
// static properties | ||
URI.protocol_expression = /^[a-z][a-z0-9-+-]*$/i; | ||
URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i; | ||
URI.idn_expression = /[^a-z0-9\.-]/i; | ||
@@ -183,4 +185,15 @@ URI.punycode_expression = /(xn--)/i; | ||
URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/; | ||
// gruber revised expression - http://rodneyrehm.de/t/url-regex.html | ||
// expression used is "gruber revised" (@gruber v2) determined to be the | ||
// best solution in a regex-golf we did a couple of ages ago at | ||
// * http://mathiasbynens.be/demo/url-regex | ||
// * http://rodneyrehm.de/t/url-regex.html | ||
URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig; | ||
URI.findUri = { | ||
// valid "scheme://" or "www." | ||
start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi, | ||
// everything up to the next whitespace | ||
end: /[\s\r\n]|$/, | ||
// trim trailing punctuation captured by end RegExp | ||
trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/ | ||
}; | ||
// http://www.iana.org/assignments/uri-schemes.html | ||
@@ -762,9 +775,39 @@ // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports | ||
URI.withinString = function(string, callback) { | ||
// expression used is "gruber revised" (@gruber v2) determined to be the best solution in | ||
// a regex sprint we did a couple of ages ago at | ||
// * http://mathiasbynens.be/demo/url-regex | ||
// * http://rodneyrehm.de/t/url-regex.html | ||
URI.withinString = function(string, callback, options) { | ||
options || (options = {}); | ||
var _start = options.start || URI.findUri.start; | ||
var _end = options.end || URI.findUri.end; | ||
var _trim = options.trim || URI.findUri.trim; | ||
var _attributeOpen = /[a-z0-9-]=["']?$/i; | ||
return string.replace(URI.find_uri_expression, callback); | ||
_start.lastIndex = 0; | ||
while (true) { | ||
var match = _start.exec(string); | ||
if (!match) { | ||
break; | ||
} | ||
var start = match.index; | ||
if (options.ignoreHtml) { | ||
// attribut(e=["']?$) | ||
var attributeOpen = string.slice(Math.max(start - 3, 0), start); | ||
if (attributeOpen && _attributeOpen.test(attributeOpen)) { | ||
continue; | ||
} | ||
} | ||
var end = start + string.slice(start).search(_end); | ||
var slice = string.slice(start, end).replace(_trim, ''); | ||
if (options.ignore && options.ignore.test(slice)) { | ||
continue; | ||
} | ||
end = start + slice.length; | ||
var result = callback(slice, start, end, string); | ||
string = string.slice(0, start) + result + string.slice(end); | ||
_start.lastIndex = start + result.length; | ||
} | ||
_start.lastIndex = 0; | ||
return string; | ||
}; | ||
@@ -1024,4 +1067,4 @@ | ||
if (v.match(/[^a-zA-z0-9\.+-]/)) { | ||
throw new TypeError("Protocol '" + v + "' contains characters other than [A-Z0-9.+-]"); | ||
if (!v.match(URI.protocol_expression)) { | ||
throw new TypeError("Protocol '" + v + "' contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]"); | ||
} | ||
@@ -1626,2 +1669,3 @@ } | ||
var _path = this._parts.path; | ||
var _leadingParents = ''; | ||
var _parent, _pos; | ||
@@ -1640,5 +1684,13 @@ | ||
// remember leading parents | ||
if (_was_relative) { | ||
_leadingParents = _path.substring(1).match(/^(\.\.\/)+/) || ''; | ||
if (_leadingParents) { | ||
_leadingParents = _leadingParents[0]; | ||
} | ||
} | ||
// resolve parents | ||
while (true) { | ||
_parent = _path.indexOf('/../'); | ||
_parent = _path.indexOf('/..'); | ||
if (_parent === -1) { | ||
@@ -1648,5 +1700,5 @@ // no more ../ to resolve | ||
} else if (_parent === 0) { | ||
// top level cannot be relative... | ||
// top level cannot be relative, skip it | ||
_path = _path.substring(3); | ||
break; | ||
continue; | ||
} | ||
@@ -1663,3 +1715,3 @@ | ||
if (_was_relative && this.is('relative')) { | ||
_path = _path.substring(1); | ||
_path = _leadingParents + _path.substring(1); | ||
} | ||
@@ -1793,9 +1845,11 @@ | ||
properties = ['query', 'path']; | ||
for (i = 0; p = properties[i]; i++) { | ||
if (!resolved._parts[p] && base._parts[p]) { | ||
resolved._parts[p] = base._parts[p]; | ||
if (!resolved._parts.path) { | ||
resolved._parts.path = base._parts.path; | ||
if (!resolved._parts.query) { | ||
resolved._parts.query = base._parts.query; | ||
} | ||
} else if (resolved._parts.path.substring(-2) === '..') { | ||
resolved._parts.path += '/'; | ||
} | ||
if (resolved.path().charAt(0) !== '/') { | ||
@@ -1802,0 +1856,0 @@ basedir = base.directory(); |
@@ -5,3 +5,3 @@ /*! | ||
* | ||
* Version: 1.11.2 | ||
* Version: 1.12.0 | ||
* | ||
@@ -8,0 +8,0 @@ * Author: Rodney Rehm |
139394
3180
450