Identifier - URIやパスを扱うクラス(JavaScript版)

状態

最終更新
2003-11-29T13:11:38+09:00
  • 相対URIの解決
  • 各URIコンポーネントの取得
  • ファイル名の取得
  • パススキームのURIへの変換

以上をサポートしています。

使い方

最終更新
2003-11-29T13:11:38+09:00

引数に基底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

ソースコード

最終更新
2004-03-07T11:35:46+09:00
/**************************************************************************/
/************************* 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);