mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +00:00 
			
		
		
		
	now .loadImages(..) will also try and load previews + refactoring and cleanup...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									803cbb84a5
								
							
						
					
					
						commit
						96b8ebab04
					
				| @ -196,18 +196,20 @@ actions.Actions({ | |||||||
| 			return res | 			return res | ||||||
| 		}], | 		}], | ||||||
| 
 | 
 | ||||||
|  | 	dataFromURLs: ['- File/', | ||||||
|  | 		function(lst, base){ | ||||||
|  | 			var imgs = images.Images.fromArray(lst, base) | ||||||
|  | 			return { | ||||||
|  | 				images: imgs, | ||||||
|  | 				data: data.Data.fromArray(imgs.keys()), | ||||||
|  | 			} | ||||||
|  | 		}], | ||||||
|  | 
 | ||||||
| 	// XXX should this be here???
 | 	// XXX should this be here???
 | ||||||
| 	// XXX should this use .load(..)
 | 	// XXX should this use .load(..)
 | ||||||
| 	// 		...note if we use this it breaks, need to rethink...
 | 	// 		...note if we use this it breaks, need to rethink...
 | ||||||
| 	loadURLs: ['- File/Load a URL list', | 	loadURLs: ['- File/Load a URL list', | ||||||
| 		function(lst, base){ | 		function(lst, base){ this.load(this.dataFromURLs(lst, base)) }], | ||||||
| 			var imgs = images.Images.fromArray(lst, base) |  | ||||||
| 
 |  | ||||||
| 			this.load({ |  | ||||||
| 				images: imgs, |  | ||||||
| 				data: data.Data.fromArray(imgs.keys()), |  | ||||||
| 			}) |  | ||||||
| 		}], |  | ||||||
| 
 | 
 | ||||||
| 	// XXX experimental...
 | 	// XXX experimental...
 | ||||||
| 	// 		...the bad thing about this is that we can not extend this,
 | 	// 		...the bad thing about this is that we can not extend this,
 | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ define(function(require){ var module = {} | |||||||
| 
 | 
 | ||||||
| //var DEBUG = DEBUG != null ? DEBUG : true
 | //var DEBUG = DEBUG != null ? DEBUG : true
 | ||||||
| 
 | 
 | ||||||
|  | var util = require('lib/util') | ||||||
| var actions = require('lib/actions') | var actions = require('lib/actions') | ||||||
| var features = require('lib/features') | var features = require('lib/features') | ||||||
| 
 | 
 | ||||||
| @ -18,6 +19,11 @@ var core = require('features/core') | |||||||
| var base = require('features/base') | var base = require('features/base') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | if(typeof(process) != 'undefined'){ | ||||||
|  | 	var pathlib = requirejs('path') | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| /*********************************************************************/ | /*********************************************************************/ | ||||||
| // XXX what we need here is:
 | // XXX what we need here is:
 | ||||||
| @ -53,6 +59,8 @@ var CLIActions = actions.Actions({ | |||||||
| 			// XXX is this correct???
 | 			// XXX is this correct???
 | ||||||
| 			path = path || this.location.path | 			path = path || this.location.path | ||||||
| 
 | 
 | ||||||
|  | 			path = util.normalizePath(path) | ||||||
|  | 
 | ||||||
| 			return this.loadImages(path) | 			return this.loadImages(path) | ||||||
| 				.then(function(){  | 				.then(function(){  | ||||||
| 					// save base index...
 | 					// save base index...
 | ||||||
|  | |||||||
| @ -124,6 +124,7 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 		'image-file-pattern': '*+(jpg|jpeg|png|JPG|JPEG|PNG)', | 		'image-file-pattern': '*+(jpg|jpeg|png|JPG|JPEG|PNG)', | ||||||
| 
 | 
 | ||||||
| 		'image-file-read-stat': true, | 		'image-file-read-stat': true, | ||||||
|  | 		'image-file-skip-previews': true, | ||||||
| 
 | 
 | ||||||
| 		// XXX if true and multiple indexes found, load only the first 
 | 		// XXX if true and multiple indexes found, load only the first 
 | ||||||
| 		// 		without merging...
 | 		// 		without merging...
 | ||||||
| @ -161,7 +162,6 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 	// 			.loadIndex(..)
 | 	// 			.loadIndex(..)
 | ||||||
| 	// XXX add a symmetric equivalent to .prepareIndexForWrite(..) so as 
 | 	// XXX add a symmetric equivalent to .prepareIndexForWrite(..) so as 
 | ||||||
| 	// 		to enable features to load their data...
 | 	// 		to enable features to load their data...
 | ||||||
| 	// XXX should this return a promise??? ...a clean promise???
 |  | ||||||
| 	// XXX look inside...
 | 	// XXX look inside...
 | ||||||
| 	loadIndex: ['- File/Load index', | 	loadIndex: ['- File/Load index', | ||||||
| 		function(path, from_date, logger){ | 		function(path, from_date, logger){ | ||||||
| @ -182,10 +182,6 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 			// 		a-la glob)....
 | 			// 		a-la glob)....
 | ||||||
| 			//file.loadIndex(path, this.config['index-dir'], logger)
 | 			//file.loadIndex(path, this.config['index-dir'], logger)
 | ||||||
| 			return file.loadIndex(path, this.config['index-dir'], from_date, logger) | 			return file.loadIndex(path, this.config['index-dir'], from_date, logger) | ||||||
| 				.catch(function(err){ |  | ||||||
| 					// XXX
 |  | ||||||
| 					console.error(err) |  | ||||||
| 				}) |  | ||||||
| 				.then(function(res){ | 				.then(function(res){ | ||||||
| 					// XXX if res is empty load raw...
 | 					// XXX if res is empty load raw...
 | ||||||
| 
 | 
 | ||||||
| @ -284,56 +280,61 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 					} | 					} | ||||||
| 				}) | 				}) | ||||||
| 		}], | 		}], | ||||||
|  | 
 | ||||||
|  | 	// Load images...
 | ||||||
|  | 	//
 | ||||||
|  | 	// This will:
 | ||||||
|  | 	// 	- load images from path
 | ||||||
|  | 	// 	- load basic stat data
 | ||||||
|  | 	// 	- load previews from path if they exist...
 | ||||||
|  | 	//
 | ||||||
| 	// XXX use the logger...
 | 	// XXX use the logger...
 | ||||||
| 	// XXX add a recursive option...
 | 	// XXX add a recursive option...
 | ||||||
| 	// 		...might also be nice to add sub-dirs to ribbons...
 | 	// 		...might also be nice to add sub-dirs to ribbons...
 | ||||||
| 	// XXX make image pattern more generic...
 | 	// XXX make image pattern more generic...
 | ||||||
| 	// XXX should this return a promise??? ...a clean promise???
 |  | ||||||
| 	loadImages: ['- File/Load images', | 	loadImages: ['- File/Load images', | ||||||
| 		function(path, logger){ | 		function(path, logger){ | ||||||
| 			if(path == null){ | 			if(path == null){ | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			// XXX get a logger...
 | ||||||
|  | 			logger = logger || this.logger | ||||||
|  | 
 | ||||||
| 			var that = this | 			var that = this | ||||||
|  | 			path = util.normalizePath(path) | ||||||
| 
 | 
 | ||||||
| 			// NOTE: we set this before we start the load so as to let 
 | 			// NOTE: we set this before we start the load so as to let 
 | ||||||
| 			// 		clients know what we are loading and not force them
 | 			// 		clients know what we are loading and not force them
 | ||||||
| 			// 		to wait to find out...
 | 			// 		to wait to find out...
 | ||||||
| 			// XXX not sure if this is the way to go...
 | 			// XXX not sure if this is the way to go...
 | ||||||
|  | 			var location =  | ||||||
| 			this.__location = { | 			this.__location = { | ||||||
| 				path: path, | 				path: path, | ||||||
| 				method: 'loadImages', | 				method: 'loadImages', | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			// get the image list...
 | ||||||
| 			return new Promise(function(resolve, reject){ | 			return new Promise(function(resolve, reject){ | ||||||
| 				glob(path + '/'+ that.config['image-file-pattern'],  | 				glob(path + '/'+ that.config['image-file-pattern'],  | ||||||
| 						{stat: !!that.config['image-file-read-stat']}) | 						{stat: !!that.config['image-file-read-stat']}) | ||||||
| 					.on('error', function(err){ | 					.on('error', function(err){ | ||||||
| 						console.log('!!!!', err) | 						console.error(err) | ||||||
| 						reject(err) | 						reject(err) | ||||||
| 					}) | 					}) | ||||||
| 					/* |  | ||||||
| 					.on('match', function(img){ |  | ||||||
| 						// XXX stat stuff...
 |  | ||||||
| 						fse.statSync(img) |  | ||||||
| 					}) |  | ||||||
| 					*/ |  | ||||||
| 					.on('end', function(lst){  | 					.on('end', function(lst){  | ||||||
| 						// XXX might be a good idea to make image paths relative to path...
 | 						// XXX might be a good idea to make image paths relative to path...
 | ||||||
| 						//lst = lst.map(function(p){ return pathlib.relative(base, p) })
 | 						//lst = lst.map(function(p){ return pathlib.relative(base, p) })
 | ||||||
| 
 |  | ||||||
| 						that.loadURLs(lst, path) |  | ||||||
| 						// XXX do we need to normalize paths after we get them from glob??
 | 						// XXX do we need to normalize paths after we get them from glob??
 | ||||||
| 						//that.loadURLs(lst.map(pathlib.posix.normalize), path)
 | 						//lst = lst.map(function(p){ return util.normalizePath(p) }), path)
 | ||||||
| 						//that.loadURLs(lst
 | 
 | ||||||
| 						//	.map(function(p){ return util.normalizePath(p) }), path)
 | 						var data = that.dataFromURLs(lst, path) | ||||||
| 
 | 
 | ||||||
| 						if(!!that.config['image-file-read-stat']){ | 						if(!!that.config['image-file-read-stat']){ | ||||||
| 							var stats = this.statCache | 							var stats = this.statCache | ||||||
| 							var p = pathlib.posix | 							var p = pathlib.posix | ||||||
| 
 | 
 | ||||||
| 							that.images.forEach(function(gid, img){ | 							data.images.forEach(function(gid, img){ | ||||||
| 								var stat = stats[p.join(img.base_path, img.path)] | 								var stat = stats[p.join(img.base_path, img.path)] | ||||||
| 
 | 
 | ||||||
| 								img.atime = stat.atime | 								img.atime = stat.atime | ||||||
| @ -347,16 +348,39 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 							}) | 							}) | ||||||
| 						} | 						} | ||||||
| 
 | 
 | ||||||
| 						// NOTE: we set it again because .loadURLs() does a clear
 | 						// pass on the result...
 | ||||||
| 						// 		before it starts loading...
 | 						resolve(data) | ||||||
| 						// 		XXX is this a bug???
 | 					}) | ||||||
| 						that.__location = { | 			}) | ||||||
| 							path: path, | 			// load previews if they exist...
 | ||||||
| 							method: 'loadImages', | 			.then(function(data){ | ||||||
|  | 				if(that.config['image-file-skip-previews']){ | ||||||
|  | 					return data | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 						resolve(that) | 				var index_dir = that.config['index-dir'] | ||||||
|  | 				var index_path = path +'/'+ index_dir | ||||||
|  | 
 | ||||||
|  | 				return file.loadPreviews(index_path, null, index_dir) | ||||||
|  | 					.then(function(previews){ | ||||||
|  | 						previews = previews[index_path] | ||||||
|  | 						previews && Object.keys(previews).forEach(function(gid){ | ||||||
|  | 							if(gid in data.images){ | ||||||
|  | 								data.images[gid].preview = previews[gid].preview | ||||||
|  | 							} | ||||||
| 						}) | 						}) | ||||||
|  | 
 | ||||||
|  | 						return data | ||||||
|  | 					}) | ||||||
|  | 			}) | ||||||
|  | 			// load the data...
 | ||||||
|  | 			.then(function(data){ | ||||||
|  | 				that.load(data) | ||||||
|  | 
 | ||||||
|  | 				// NOTE: we set it again because .load() does a .clear()
 | ||||||
|  | 				// 		before it starts loading which clears the .location
 | ||||||
|  | 				// 		too...
 | ||||||
|  | 				that.__location = location | ||||||
| 			}) | 			}) | ||||||
| 		}], | 		}], | ||||||
| 
 | 
 | ||||||
| @ -371,7 +395,7 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 			//this.location.method = 'loadImages'
 | 			//this.location.method = 'loadImages'
 | ||||||
| 		}], | 		}], | ||||||
| 
 | 
 | ||||||
| 	// XXX should this return a promise??? ...a clean promise???
 | 	// XXX should this also try and load previews...
 | ||||||
| 	// XXX revise logger...
 | 	// XXX revise logger...
 | ||||||
| 	loadNewImages: ['File/Load new images', | 	loadNewImages: ['File/Load new images', | ||||||
| 		function(path, logger){ | 		function(path, logger){ | ||||||
| @ -383,6 +407,8 @@ var FileSystemLoaderActions = actions.Actions({ | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			var that = this | 			var that = this | ||||||
|  | 			path = util.normalizePath(path) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 			// cache the loaded images...
 | 			// cache the loaded images...
 | ||||||
| 			var loaded = this.images.map(function(gid, img){ return img.path }) | 			var loaded = this.images.map(function(gid, img){ return img.path }) | ||||||
| @ -537,7 +563,9 @@ var FileSystemLoaderUIActions = actions.Actions({ | |||||||
| 	browsePath: ['File/Browse file system...', | 	browsePath: ['File/Browse file system...', | ||||||
| 		widgets.makeUIDialog(function(base, callback){ | 		widgets.makeUIDialog(function(base, callback){ | ||||||
| 			var that = this | 			var that = this | ||||||
|  | 
 | ||||||
| 			base = base || this.location.path || '/' | 			base = base || this.location.path || '/' | ||||||
|  | 			base = util.normalizePath(base) | ||||||
| 
 | 
 | ||||||
| 			var o = browseWalk.makeWalk( | 			var o = browseWalk.makeWalk( | ||||||
| 						null, base, this.config['image-file-pattern'], | 						null, base, this.config['image-file-pattern'], | ||||||
| @ -1027,7 +1055,7 @@ var pushToHistory = function(action, to_top, checker){ | |||||||
| 			path = util.normalizePath(path) | 			path = util.normalizePath(path) | ||||||
| 			if(path){ | 			if(path){ | ||||||
| 				this.pushURLToHistory( | 				this.pushURLToHistory( | ||||||
| 					util.normalizePath(path),  | 					path,  | ||||||
| 					action,  | 					action,  | ||||||
| 					checker || 'checkPath')  | 					checker || 'checkPath')  | ||||||
| 			} | 			} | ||||||
| @ -1308,6 +1336,7 @@ var FileSystemWriterActions = actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 			path = path || this.location.loaded | 			path = path || this.location.loaded | ||||||
| 			path = path && path.length == 1 ? path[0] : path  | 			path = path && path.length == 1 ? path[0] : path  | ||||||
|  | 			path = util.normalizePath(path) | ||||||
| 
 | 
 | ||||||
| 			// XXX
 | 			// XXX
 | ||||||
| 			if(path instanceof Array){ | 			if(path instanceof Array){ | ||||||
| @ -1377,6 +1406,7 @@ var FileSystemWriterActions = actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 			// XXX is this correct???
 | 			// XXX is this correct???
 | ||||||
| 			path = path || './exported' | 			path = path || './exported' | ||||||
|  | 			path = util.normalizePath(path) | ||||||
| 
 | 
 | ||||||
| 			// XXX resolve env variables in path...
 | 			// XXX resolve env variables in path...
 | ||||||
| 			// XXX
 | 			// XXX
 | ||||||
| @ -1491,6 +1521,8 @@ var FileSystemWriterActions = actions.Actions({ | |||||||
| 			var that = this | 			var that = this | ||||||
| 			var base_dir = this.location.path | 			var base_dir = this.location.path | ||||||
| 
 | 
 | ||||||
|  | 			path = util.normalizePath(path) | ||||||
|  | 
 | ||||||
| 			// XXX resolve env variables in path...
 | 			// XXX resolve env variables in path...
 | ||||||
| 			// XXX
 | 			// XXX
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -25,6 +25,7 @@ if(typeof(process) != 'undefined'){ | |||||||
| var data = require('data') | var data = require('data') | ||||||
| var images = require('images') | var images = require('images') | ||||||
| 
 | 
 | ||||||
|  | var util = require('lib/util') | ||||||
| var tasks = require('lib/tasks') | var tasks = require('lib/tasks') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -99,7 +100,7 @@ module.gGlob = function(){ | |||||||
| var listIndexes = | var listIndexes = | ||||||
| module.listIndexes =  | module.listIndexes =  | ||||||
| function(base, index_dir){ | function(base, index_dir){ | ||||||
| 	return gGlob(base +'/**/'+ index_dir || INDEX_DIR) | 	return gGlob(base +'/**/'+ (index_dir || INDEX_DIR)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -136,6 +137,7 @@ var listJSON = | |||||||
| module.listJSON = | module.listJSON = | ||||||
| function(path, pattern){ | function(path, pattern){ | ||||||
| 	pattern = pattern || '*' | 	pattern = pattern || '*' | ||||||
|  | 	path = util.normalizePath(path) | ||||||
| 	return gGlob(path +'/'+ pattern +'.json') | 	return gGlob(path +'/'+ pattern +'.json') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -168,6 +170,7 @@ var ensureDir = denodeify(fse.ensureDir) | |||||||
| 
 | 
 | ||||||
| // XXX handle errors...
 | // XXX handle errors...
 | ||||||
| function loadJSON(path){ | function loadJSON(path){ | ||||||
|  | 	path = util.normalizePath(path) | ||||||
| 	return loadFile(path).then(JSON.parse) | 	return loadFile(path).then(JSON.parse) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -326,6 +329,7 @@ function(list, from_date, logger){ | |||||||
| var loadSaveHistoryList = | var loadSaveHistoryList = | ||||||
| module.loadSaveHistoryList = | module.loadSaveHistoryList = | ||||||
| function(path, index_dir, logger){ | function(path, index_dir, logger){ | ||||||
|  | 	path = util.normalizePath(path) | ||||||
| 	index_dir = index_dir || INDEX_DIR | 	index_dir = index_dir || INDEX_DIR | ||||||
| 
 | 
 | ||||||
| 	return new Promise(function(resolve, reject){ | 	return new Promise(function(resolve, reject){ | ||||||
| @ -461,6 +465,7 @@ function(path, index_dir, logger){ | |||||||
| var loadIndex = | var loadIndex = | ||||||
| module.loadIndex =  | module.loadIndex =  | ||||||
| function(path, index_dir, from_date, logger){ | function(path, index_dir, from_date, logger){ | ||||||
|  | 	path = util.normalizePath(path) | ||||||
| 	if(index_dir && index_dir.emit != null){ | 	if(index_dir && index_dir.emit != null){ | ||||||
| 		logger = index_dir | 		logger = index_dir | ||||||
| 		index_dir = from_date = null | 		index_dir = from_date = null | ||||||
| @ -622,13 +627,11 @@ module.loadPreviews = | |||||||
| function(base, previews, index_dir, absolute_path){ | function(base, previews, index_dir, absolute_path){ | ||||||
| 	previews = previews || {} | 	previews = previews || {} | ||||||
| 	index_dir = index_dir || INDEX_DIR | 	index_dir = index_dir || INDEX_DIR | ||||||
|  | 	base = util.normalizePath(base) | ||||||
| 
 | 
 | ||||||
|  | 	// we got an explicit index....
 | ||||||
|  | 	if(pathlib.basename(base) == index_dir){ | ||||||
| 		return new Promise(function(resolve, reject){ | 		return new Promise(function(resolve, reject){ | ||||||
| 		listIndexes(base) |  | ||||||
| 			// XXX handle errors....
 |  | ||||||
| 			//.on('error', function(err){
 |  | ||||||
| 			//})
 |  | ||||||
| 			.on('match', function(base){ |  | ||||||
| 			if(!(base in previews)){ | 			if(!(base in previews)){ | ||||||
| 				previews[base] = {} | 				previews[base] = {} | ||||||
| 			} | 			} | ||||||
| @ -657,13 +660,33 @@ function(base, previews, index_dir, absolute_path){ | |||||||
| 					// add a preview...
 | 					// add a preview...
 | ||||||
| 					// NOTE: this will overwrite a previews if they are found in
 | 					// NOTE: this will overwrite a previews if they are found in
 | ||||||
| 					// 		several locations...
 | 					// 		several locations...
 | ||||||
| 						images[gid].preview[res] = index_dir +'/'+ path.split(index_dir)[1] | 					images[gid].preview[res] = | ||||||
| 					}) | 						util.normalizePath(index_dir +'/'+ path.split(index_dir)[1]) | ||||||
| 				}) | 				}) | ||||||
| 				.on('end', function(){ | 				.on('end', function(){ | ||||||
| 					resolve(previews) | 					resolve(previews) | ||||||
| 				}) | 				}) | ||||||
| 		}) | 		}) | ||||||
|  | 
 | ||||||
|  | 	// find all sub indexes...
 | ||||||
|  | 	} else { | ||||||
|  | 		return new Promise(function(resolve, reject){ | ||||||
|  | 			var queue = [] | ||||||
|  | 			listIndexes(base, index_dir) | ||||||
|  | 				// XXX handle errors....
 | ||||||
|  | 				//.on('error', function(err){
 | ||||||
|  | 				//})
 | ||||||
|  | 				.on('match', function(base){ | ||||||
|  | 					queue.push(loadPreviews(base, previews, index_dir, absolute_path)) | ||||||
|  | 				}) | ||||||
|  | 				.on('end', function(){ | ||||||
|  | 					Promise.all(queue) | ||||||
|  | 						.then(function(){ | ||||||
|  | 							resolve(previews) | ||||||
|  | 						}) | ||||||
|  | 				}) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -885,6 +908,7 @@ var FILENAME = '${DATE}-${KEYWORD}.${EXT}' | |||||||
| var writeIndex = | var writeIndex = | ||||||
| module.writeIndex =  | module.writeIndex =  | ||||||
| function(json, path, date, filename_tpl, logger){ | function(json, path, date, filename_tpl, logger){ | ||||||
|  | 	path = util.normalizePath(path) | ||||||
| 	filename_tpl = filename_tpl || FILENAME | 	filename_tpl = filename_tpl || FILENAME | ||||||
| 	// XXX for some reason this gets the unpatched node.js Date, so we 
 | 	// XXX for some reason this gets the unpatched node.js Date, so we 
 | ||||||
| 	// 		get the patched date explicitly...
 | 	// 		get the patched date explicitly...
 | ||||||
|  | |||||||
| @ -188,7 +188,7 @@ module.normalizePath = | |||||||
| function(path){ | function(path){ | ||||||
| 	return typeof(path) == typeof('str') ? path | 	return typeof(path) == typeof('str') ? path | ||||||
| 			// normalize the slashes...
 | 			// normalize the slashes...
 | ||||||
| 			.replace(/(\/)/g, '/') | 			.replace(/\\/g, '/') | ||||||
| 			// remove duplicate '/'
 | 			// remove duplicate '/'
 | ||||||
| 			.replace(/(\/)\1+/g, '/') | 			.replace(/(\/)\1+/g, '/') | ||||||
| 			// remove trailing '/'
 | 			// remove trailing '/'
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user