94 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| var forEachBail = require("./forEachBail");
 | |
| 
 | |
| function loadDescriptionFile(resolver, directory, filenames, callback) {
 | |
| 	(function findDescriptionFile() {
 | |
| 		forEachBail(filenames, function(filename, callback) {
 | |
| 			var descriptionFilePath = resolver.join(directory, filename);
 | |
| 			if(resolver.fileSystem.readJson) {
 | |
| 				resolver.fileSystem.readJson(descriptionFilePath, function(err, content) {
 | |
| 					if(err) {
 | |
| 						if(typeof err.code !== "undefined") return callback();
 | |
| 						return onJson(err);
 | |
| 					}
 | |
| 					onJson(null, content);
 | |
| 				});
 | |
| 			} else {
 | |
| 				resolver.fileSystem.readFile(descriptionFilePath, function(err, content) {
 | |
| 					if(err) return callback();
 | |
| 					try {
 | |
| 						var json = JSON.parse(content);
 | |
| 					} catch(e) {
 | |
| 						onJson(e);
 | |
| 					}
 | |
| 					onJson(null, json);
 | |
| 				});
 | |
| 			}
 | |
| 
 | |
| 			function onJson(err, content) {
 | |
| 				if(err) {
 | |
| 					if(callback.log)
 | |
| 						callback.log(descriptionFilePath + " (directory description file): " + err);
 | |
| 					else
 | |
| 						err.message = descriptionFilePath + " (directory description file): " + err;
 | |
| 					return callback(err);
 | |
| 				}
 | |
| 				callback(null, {
 | |
| 					content: content,
 | |
| 					directory: directory,
 | |
| 					path: descriptionFilePath
 | |
| 				});
 | |
| 			}
 | |
| 		}, function(err, result) {
 | |
| 			if(err) return callback(err);
 | |
| 			if(result) {
 | |
| 				return callback(null, result);
 | |
| 			} else {
 | |
| 				directory = cdUp(directory);
 | |
| 				if(!directory) {
 | |
| 					return callback();
 | |
| 				} else {
 | |
| 					return findDescriptionFile();
 | |
| 				}
 | |
| 			}
 | |
| 		});
 | |
| 	}());
 | |
| }
 | |
| 
 | |
| function getField(content, field) {
 | |
| 	if(!content) return undefined;
 | |
| 	if(Array.isArray(field)) {
 | |
| 		var current = content;
 | |
| 		for(var j = 0; j < field.length; j++) {
 | |
| 			if(current === null || typeof current !== "object") {
 | |
| 				current = null;
 | |
| 				break;
 | |
| 			}
 | |
| 			current = current[field[j]];
 | |
| 		}
 | |
| 		if(typeof current === "object") {
 | |
| 			return current;
 | |
| 		}
 | |
| 	} else {
 | |
| 		if(typeof content[field] === "object") {
 | |
| 			return content[field];
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| function cdUp(directory) {
 | |
| 	if(directory === "/") return null;
 | |
| 	var i = directory.lastIndexOf("/"),
 | |
| 		j = directory.lastIndexOf("\\");
 | |
| 	var p = i < 0 ? j : j < 0 ? i : i < j ? j : i;
 | |
| 	if(p < 0) return null;
 | |
| 	return directory.substr(0, p || 1);
 | |
| }
 | |
| 
 | |
| exports.loadDescriptionFile = loadDescriptionFile;
 | |
| exports.getField = getField;
 | |
| exports.cdUp = cdUp;
 |