74 lines
2.4 KiB
JavaScript
74 lines
2.4 KiB
JavaScript
|
var SVGParser = require('./core');
|
||
|
var Mode = require('../../modes/current');
|
||
|
|
||
|
var urlSuffix = '', baseUrl, urlAliases = {},
|
||
|
urlParts = /^((?:\w+:)?(?:\/\/[^\/?#]*)?)(\.\.?$|(?:[^?#\/]*\/)*)(.*)/,
|
||
|
endSlash = /\/$/;
|
||
|
|
||
|
function resolvePath(path, base){
|
||
|
var parts = String(path).match(urlParts);
|
||
|
if (!parts || parts[1]) return path;
|
||
|
|
||
|
if (!base || path.charAt(0) !== '.') base = '';
|
||
|
base = String(base).match(urlParts);
|
||
|
|
||
|
var directory = parts[2];
|
||
|
if (directory.charAt(0) != '/'){
|
||
|
directory = (base[2] || '') + directory;
|
||
|
var result = [], paths = directory.replace(endSlash, '').split('/');
|
||
|
for (var i = 0, l = paths.length; i < l; i++){
|
||
|
var dir = paths[i];
|
||
|
if (dir === '..' && result.length > 0 && result[result.length - 1] != '..') result.pop();
|
||
|
else if (dir !== '.') result.push(dir);
|
||
|
};
|
||
|
directory = result.join('/') + '/';
|
||
|
}
|
||
|
return base[1] + directory + parts[3];
|
||
|
}
|
||
|
|
||
|
SVGParser.prototype.findByURL = function(document, url, callback){
|
||
|
if (!url){
|
||
|
callback.call(this, null);
|
||
|
return;
|
||
|
}
|
||
|
if (url.charAt(0) == '#'){
|
||
|
callback.call(this, this.findById(document, url.substr(1)));
|
||
|
return;
|
||
|
}
|
||
|
url = this.resolveURL(url);
|
||
|
var self = this, i = url.indexOf('#'), id = i > -1 ? url.substr(i + 1) : null;
|
||
|
if (i > -1) url = url.substr(0, i);
|
||
|
this.pendingRequests = (this.pendingRequests || 0) + 1;
|
||
|
|
||
|
var xhr = new XMLHttpRequest();
|
||
|
xhr.open('GET', url, true);
|
||
|
xhr.onreadystatechange = function(){
|
||
|
if (xhr.readyState == 4){
|
||
|
if (xhr.status == 200){
|
||
|
var resolve = self.resolveURL,
|
||
|
doc = /*xhr.responseXML ||*/ self.parseXML(xhr.responseText);
|
||
|
self.resolveURL = function(newurl){
|
||
|
return resolvePath(newurl, url);
|
||
|
}
|
||
|
callback.call(self, !doc ? null : id ? self.findById(doc, id) : doc.documentElement);
|
||
|
self.resolveURL = resolve;
|
||
|
} else {
|
||
|
callback.call(self, null);
|
||
|
}
|
||
|
if (--self.pendingRequests == 0 && self.oncomplete) self.oncomplete();
|
||
|
}
|
||
|
};
|
||
|
xhr.send(null);
|
||
|
};
|
||
|
|
||
|
SVGParser.prototype.load = function(url, styles, callback){
|
||
|
if (typeof styles == 'function'){ callback = styles; styles = null; }
|
||
|
var parser = this, result = null;
|
||
|
parser.oncomplete = function(){ callback(result); };
|
||
|
parser.findByURL(null, url, function(doc){ result = parser.parse(doc.ownerDocument, styles); });
|
||
|
};
|
||
|
|
||
|
SVGParser.load = function(url, styles, callback){
|
||
|
new SVGParser(Mode).load(url, styles, callback);
|
||
|
};
|