mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
287 lines
6.6 KiB
JavaScript
287 lines
6.6 KiB
JavaScript
|
/**
|
|||
|
* $Id: URI.js 1054 2009-03-10 19:03:15Z spocke $
|
|||
|
*
|
|||
|
* @author Moxiecode
|
|||
|
* @copyright Copyright <EFBFBD> 2004-2008, Moxiecode Systems AB, All rights reserved.
|
|||
|
*/
|
|||
|
|
|||
|
(function() {
|
|||
|
var each = tinymce.each;
|
|||
|
|
|||
|
/**#@+
|
|||
|
* @class This class handles parsing, modification and serialization of URI/URL strings.
|
|||
|
* @member tinymce.util.URI
|
|||
|
*/
|
|||
|
tinymce.create('tinymce.util.URI', {
|
|||
|
/**
|
|||
|
* Constucts a new URI instance.
|
|||
|
*
|
|||
|
* @constructor
|
|||
|
* @param {String} u URI string to parse.
|
|||
|
* @param {Object} s Optional settings object.
|
|||
|
*/
|
|||
|
URI : function(u, s) {
|
|||
|
var t = this, o, a, b;
|
|||
|
|
|||
|
// Default settings
|
|||
|
s = t.settings = s || {};
|
|||
|
|
|||
|
// Strange app protocol or local anchor
|
|||
|
if (/^(mailto|tel|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) {
|
|||
|
t.source = u;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// Absolute path with no host, fake host and protocol
|
|||
|
if (u.indexOf('/') === 0 && u.indexOf('//') !== 0)
|
|||
|
u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u;
|
|||
|
|
|||
|
// Relative path
|
|||
|
if (u.indexOf(':/') === -1 && u.indexOf('//') !== 0)
|
|||
|
u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u);
|
|||
|
|
|||
|
// Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri)
|
|||
|
u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something
|
|||
|
u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);
|
|||
|
each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) {
|
|||
|
var s = u[i];
|
|||
|
|
|||
|
// Zope 3 workaround, they use @@something
|
|||
|
if (s)
|
|||
|
s = s.replace(/\(mce_at\)/g, '@@');
|
|||
|
|
|||
|
t[v] = s;
|
|||
|
});
|
|||
|
|
|||
|
if (b = s.base_uri) {
|
|||
|
if (!t.protocol)
|
|||
|
t.protocol = b.protocol;
|
|||
|
|
|||
|
if (!t.userInfo)
|
|||
|
t.userInfo = b.userInfo;
|
|||
|
|
|||
|
if (!t.port && t.host == 'mce_host')
|
|||
|
t.port = b.port;
|
|||
|
|
|||
|
if (!t.host || t.host == 'mce_host')
|
|||
|
t.host = b.host;
|
|||
|
|
|||
|
t.source = '';
|
|||
|
}
|
|||
|
|
|||
|
//t.path = t.path || '/';
|
|||
|
},
|
|||
|
|
|||
|
/**#@+
|
|||
|
* @method
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the internal path part of the URI.
|
|||
|
*
|
|||
|
* @param {string} p Path string to set.
|
|||
|
*/
|
|||
|
setPath : function(p) {
|
|||
|
var t = this;
|
|||
|
|
|||
|
p = /^(.*?)\/?(\w+)?$/.exec(p);
|
|||
|
|
|||
|
// Update path parts
|
|||
|
t.path = p[0];
|
|||
|
t.directory = p[1];
|
|||
|
t.file = p[2];
|
|||
|
|
|||
|
// Rebuild source
|
|||
|
t.source = '';
|
|||
|
t.getURI();
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Converts the specified URI into a relative URI based on the current URI instance location.
|
|||
|
*
|
|||
|
* @param {String} u URI to convert into a relative path/URI.
|
|||
|
* @return {String} Relative URI from the point specified in the current URI instance.
|
|||
|
*/
|
|||
|
toRelative : function(u) {
|
|||
|
var t = this, o;
|
|||
|
|
|||
|
if (u === "./")
|
|||
|
return u;
|
|||
|
|
|||
|
u = new tinymce.util.URI(u, {base_uri : t});
|
|||
|
|
|||
|
// Not on same domain/port or protocol
|
|||
|
if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol)
|
|||
|
return u.getURI();
|
|||
|
|
|||
|
o = t.toRelPath(t.path, u.path);
|
|||
|
|
|||
|
// Add query
|
|||
|
if (u.query)
|
|||
|
o += '?' + u.query;
|
|||
|
|
|||
|
// Add anchor
|
|||
|
if (u.anchor)
|
|||
|
o += '#' + u.anchor;
|
|||
|
|
|||
|
return o;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Converts the specified URI into a absolute URI based on the current URI instance location.
|
|||
|
*
|
|||
|
* @param {String} u URI to convert into a relative path/URI.
|
|||
|
* @param {bool} nh No host and protocol prefix.
|
|||
|
* @return {String} Absolute URI from the point specified in the current URI instance.
|
|||
|
*/
|
|||
|
toAbsolute : function(u, nh) {
|
|||
|
var u = new tinymce.util.URI(u, {base_uri : this});
|
|||
|
|
|||
|
return u.getURI(this.host == u.host ? nh : 0);
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Converts a absolute path into a relative path.
|
|||
|
*
|
|||
|
* @param {String} base Base point to convert the path from.
|
|||
|
* @param {String} path Absolute path to convert into a relative path.
|
|||
|
*/
|
|||
|
toRelPath : function(base, path) {
|
|||
|
var items, bp = 0, out = '', i, l;
|
|||
|
|
|||
|
// Split the paths
|
|||
|
base = base.substring(0, base.lastIndexOf('/'));
|
|||
|
base = base.split('/');
|
|||
|
items = path.split('/');
|
|||
|
|
|||
|
if (base.length >= items.length) {
|
|||
|
for (i = 0, l = base.length; i < l; i++) {
|
|||
|
if (i >= items.length || base[i] != items[i]) {
|
|||
|
bp = i + 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (base.length < items.length) {
|
|||
|
for (i = 0, l = items.length; i < l; i++) {
|
|||
|
if (i >= base.length || base[i] != items[i]) {
|
|||
|
bp = i + 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (bp == 1)
|
|||
|
return path;
|
|||
|
|
|||
|
for (i = 0, l = base.length - (bp - 1); i < l; i++)
|
|||
|
out += "../";
|
|||
|
|
|||
|
for (i = bp - 1, l = items.length; i < l; i++) {
|
|||
|
if (i != bp - 1)
|
|||
|
out += "/" + items[i];
|
|||
|
else
|
|||
|
out += items[i];
|
|||
|
}
|
|||
|
|
|||
|
return out;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Converts a relative path into a absolute path.
|
|||
|
*
|
|||
|
* @param {String} base Base point to convert the path from.
|
|||
|
* @param {String} path Relative path to convert into an absolute path.
|
|||
|
*/
|
|||
|
toAbsPath : function(base, path) {
|
|||
|
var i, nb = 0, o = [], tr;
|
|||
|
|
|||
|
// Split paths
|
|||
|
tr = /\/$/.test(path) ? '/' : '';
|
|||
|
base = base.split('/');
|
|||
|
path = path.split('/');
|
|||
|
|
|||
|
// Remove empty chunks
|
|||
|
each(base, function(k) {
|
|||
|
if (k)
|
|||
|
o.push(k);
|
|||
|
});
|
|||
|
|
|||
|
base = o;
|
|||
|
|
|||
|
// Merge relURLParts chunks
|
|||
|
for (i = path.length - 1, o = []; i >= 0; i--) {
|
|||
|
// Ignore empty or .
|
|||
|
if (path[i].length == 0 || path[i] == ".")
|
|||
|
continue;
|
|||
|
|
|||
|
// Is parent
|
|||
|
if (path[i] == '..') {
|
|||
|
nb++;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
// Move up
|
|||
|
if (nb > 0) {
|
|||
|
nb--;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
o.push(path[i]);
|
|||
|
}
|
|||
|
|
|||
|
i = base.length - nb;
|
|||
|
|
|||
|
// If /a/b/c or /
|
|||
|
if (i <= 0)
|
|||
|
return '/' + o.reverse().join('/') + tr;
|
|||
|
|
|||
|
return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/') + tr;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Returns the full URI of the internal structure.
|
|||
|
*
|
|||
|
* @param {bool} nh Optional no host and protocol part. Defaults to false.
|
|||
|
*/
|
|||
|
getURI : function(nh) {
|
|||
|
var s, t = this;
|
|||
|
|
|||
|
// Rebuild source
|
|||
|
if (!t.source || nh) {
|
|||
|
s = '';
|
|||
|
|
|||
|
if (!nh) {
|
|||
|
if (t.protocol)
|
|||
|
s += t.protocol + '://';
|
|||
|
|
|||
|
if (t.userInfo)
|
|||
|
s += t.userInfo + '@';
|
|||
|
|
|||
|
if (t.host)
|
|||
|
s += t.host;
|
|||
|
|
|||
|
if (t.port)
|
|||
|
s += ':' + t.port;
|
|||
|
}
|
|||
|
|
|||
|
if (t.path)
|
|||
|
s += t.path;
|
|||
|
|
|||
|
if (t.query)
|
|||
|
s += '?' + t.query;
|
|||
|
|
|||
|
if (t.anchor)
|
|||
|
s += '#' + t.anchor;
|
|||
|
|
|||
|
t.source = s;
|
|||
|
}
|
|||
|
|
|||
|
return t.source;
|
|||
|
}
|
|||
|
|
|||
|
/**#@-*/
|
|||
|
});
|
|||
|
})();
|