GT2/GT2-Android/node_modules/art/parsers/svg/externals.js

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);
};