Base edit view
This commit is contained in:
96
js/util/desktop-apps.js
Normal file
96
js/util/desktop-apps.js
Normal file
@ -0,0 +1,96 @@
|
||||
var ini = require('ini');
|
||||
var glob = require('glob');
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
|
||||
// Constants
|
||||
var ICON_REALPATH_REGEX = /\..+$/;
|
||||
|
||||
exports.loadAllDesktopFiles = function(rootDirs) {
|
||||
|
||||
return exports.findAllDesktopFiles(rootDirs)
|
||||
.then(function(filePaths) {
|
||||
|
||||
var promises = filePaths.map(function(path) {
|
||||
return exports.loadDesktopFile(path);
|
||||
});
|
||||
|
||||
return Promise.all(promises)
|
||||
.then(function(contents) {
|
||||
return contents.map(function(content, i) {
|
||||
return { content: content, path: filePaths[i] };
|
||||
});
|
||||
})
|
||||
;
|
||||
|
||||
})
|
||||
;
|
||||
|
||||
};
|
||||
|
||||
exports.findAllDesktopFiles = function(rootDirs) {
|
||||
|
||||
if(!Array.isArray(rootDirs)) {
|
||||
rootDirs = [rootDirs];
|
||||
}
|
||||
|
||||
var promises = rootDirs.map(function(rootDir) {
|
||||
|
||||
var globPath = path.join(rootDir, '**/*.desktop');
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
glob(globPath, function(err, files) {
|
||||
if(err) return reject(err);
|
||||
return resolve(files);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
return Promise.all(promises)
|
||||
.then(function(apps) {
|
||||
return uniq(flatten(apps));
|
||||
})
|
||||
;
|
||||
|
||||
};
|
||||
|
||||
exports.loadDesktopFile = function(filePath) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
fs.readFile(filePath, 'utf8', function(err, content) {
|
||||
if(err) return reject(err);
|
||||
try {
|
||||
var decoded = ini.decode(content);
|
||||
return resolve(decoded);
|
||||
} catch(err) {
|
||||
return reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
exports.findIcon = function(iconPath) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
if( ICON_REALPATH_REGEX.test(iconPath) ) {
|
||||
return resolve(iconPath);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Array helpers
|
||||
|
||||
function flatten(arr) {
|
||||
return arr.reduce(function(result, item) {
|
||||
result = result.concat.apply(result, Array.isArray(item) ? flatten(item) : [item]);
|
||||
return result;
|
||||
}, []);
|
||||
}
|
||||
|
||||
function uniq(arr) {
|
||||
return arr.reduce(function(result, item) {
|
||||
if(result.indexOf(item) === -1) {
|
||||
result.push(item);
|
||||
}
|
||||
return result;
|
||||
}, []);
|
||||
}
|
Reference in New Issue
Block a user