以上をサポートしています。
引数に基底URI(またはパス)を与えてインスタンスを生成します。基底URIごとに一つのインスタンスを作成するモデルになっています。URIの解決を相対URIを変更して何度も行ったり、各種のURIコンポーネントを取得する際に、キャッシュを利用して効率化を図るのが特徴です。
var URI = new Identifier(location.href);
相対URIから絶対URIへの解決はresolveメソッドに相対URIを与えます。
var jsdir = URI.resolve('../js/')
schemeコンポーネント、authorityコンポーネント、pathコンポーネント、その他fragment識別子、クエリ文字列の取得は、それぞれ getscheme, getauthority, getpath, getfragment, getqueryメソッドで行います。事前にURI(またはパス)をchangeIDメソッドに引数として与えます。
URI.changeID('../css/')
var path = URI.getpath();
ファイル名はgetfilenameメソッドで取得します。
URI.changeID('../index.html');
var filename = URI.getfilename() // => index.html
/**************************************************************************/
/************************* Class Identifier *******************************/
/**************************************************************************/
function Identifier(baseURI, id){
/* Handle URI, URL and OS-paths as identifier.
Copy left. Comment? w650s@mcn.ne.jp */
this.__base = baseURI;
this.__id = (id !== undefined)? id : '';
this.__cache = null;
}
(function(/*Identifier.prototype*/self){
self.changeID = function(id){
this.__cache = null;
this.__id = id; };
self.changeBase = function(URI){
this.__base = this.resolve(URI); };
self.getscheme = function(){
return this.getcomponents()[0]; };
self.getauthority = function(){
return this.getcomponents()[1]; };
self.getpath = function(){
return this.getcomponents()[2]; };
self.getquery = function(){
return this.getcomponents()[3]; };
self.getfragment = function(){
return this.getcomponents()[4]; };
self.getfilename = function(){
return this.getpath().split('/').pop(); };
self.__import__ = function(){
for (var i=0,len=arguments.length; i<len; i++) {
var html = '<script type="text/javascript" src="'+
this.resolve(arguments[i]+'.js')+'"><\/script>';
document.write(html); } };
self.getcomponents = function(){
/* => [scheme, authority, path, query, fragment] */
var cache;
if (cache = this.__cache)
return cache[1];
cache = [];
var uri = this.resolve();
REG_URI.test(uri);
var scheme = RegExp.$1, authority = RegExp.$2, path = RegExp.$3,
query = '', fragment = '', i;
if ((i = path.indexOf('#')) != -1) {
fragment = path.slice(i+1, path.length);
path = path.slice(0, i); }
if ((i = path.indexOf('?')) != -1) {
query = path.slice(i+1, path.length);
path = path.slice(0, i); }
var components = [scheme, authority, path, query, fragment];
cache[0] = this.__id, cache[1] = components;
this.__cache = cache;
return components; };
self.resolve = function(/*optional*/relativeURI){
var ruri = (relativeURI === undefined)? this.__id : relativeURI;
if (/^[\#\?]/.test(ruri) || ruri == '')
return this.__base + ruri;
if (ruri.match(REG_PATH))
return pathToUri();
if (REG_URI.test(ruri))
return ruri;
var buri = this.__base;
if (buri.match(REG_PATH))
buri = pathToUri();
REG_URI.test(buri);
var scheme = RegExp.$1, authority = RegExp.$2, path = RegExp.$3;
if (ruri.slice(0,2) == '//')
return scheme + ':' + ruri;
if (ruri.charAt(0) == '/')
return scheme + '://' + authority + ruri;
var i = path.lastIndexOf('/');
path = (i != -1)? path.slice(0, i) : '';
if (ruri.indexOf('./') == 0)
ruri = ruri.slice(2, ruri.length);
var components = [scheme+':/', authority];
while (ruri.indexOf('../') == 0 && path.length) {
ruri = ruri.slice(3, ruri.length);
path = ((i = path.lastIndexOf('/', path.length-2)) != -1)?
path.slice(0, i) : ''; }
if (path)
components.push(path);
components.push(ruri);
return components.join('/');
function pathToUri(){
return [
'file://', RegExp.$1, RegExp.$2.replace(/\\/g, '/')
].join('/');
}
};
// private, final variables and its getters
var REG_PATH = /^([a-zA-Z]:)\\([^\s]+)/;
self.getRePath = function(){ return REG_PATH; };
var REG_URI = /^([a-zA-Z0-9]+):\/\/(\/?[^\s\/]+)\/(.*)/;
self.getReURI = function(){ return REG_URI; };
})(Identifier.prototype);