From 8f2ed91f1a19fb9f5ff029d4bae9f1844e2f12b9 Mon Sep 17 00:00:00 2001 From: William Petit Date: Thu, 27 Aug 2015 17:35:00 +0200 Subject: [PATCH] Base chargement/parsing fichiers Desktop --- js/fs.js | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 js/fs.js diff --git a/js/fs.js b/js/fs.js new file mode 100644 index 0000000..7830b1e --- /dev/null +++ b/js/fs.js @@ -0,0 +1,104 @@ +(function(Pitaya) { + + "use strict"; + + var ini = require('ini'); + var glob = require('glob'); + var path = require('path'); + var fs = require('fs'); + + var FS = Pitaya.FS = {}; + + FS.loadAllDesktopFiles = function(rootDirs) { + + return FS.findAllDesktopFiles(rootDirs) + .then(function(filePaths) { + + var promises = filePaths.map(function(path) { + return FS.loadDesktopFile(path); + }); + + return Promise.all(promises) + .then(function(desktopFiles) { + return desktopFiles.map(function(desktop, i) { + return { + path: filePaths[i], + desktop: desktop + }; + }); + }) + ; + + }) + ; + + }; + + FS.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)); + }) + ; + + }; + + FS.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); + } + }); + }); + }; + + // 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; + }, []); + } + + +}(Pitaya = global.Pitaya || {})); + + +Pitaya.FS.loadAllDesktopFiles(['/usr/share/applications', '/home/william/.local/share/applications']) + .then(function(apps) { + console.log(apps[5]) + }) +;