From c5a8e28f33025feb80fe739abe02b63c9b230b7d Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sun, 28 Dec 2014 04:33:57 +0300 Subject: [PATCH] refactored file.loadIndex(..), still not done... Signed-off-by: Alex A. Naanou --- ui (gen4)/file.js | 239 ++++++++++++++++++++++------------------------ 1 file changed, 115 insertions(+), 124 deletions(-) diff --git a/ui (gen4)/file.js b/ui (gen4)/file.js index d38c39ae..1dbbf2f5 100755 --- a/ui (gen4)/file.js +++ b/ui (gen4)/file.js @@ -63,13 +63,13 @@ var INDEX_DIR = '.ImageGrid' // } // -// XXX return a promice rather than an event emitter.... +// XXX return a promise rather than an event emitter.... function listIndexes(base){ return glob(base +'/**/'+ INDEX_DIR) } -// XXX return a promice rather than an event emitter.... +// XXX return a promise rather than an event emitter.... function listJSON(path, pattern){ pattern = pattern || '*' return glob(path +'/'+ pattern +'.json') @@ -91,156 +91,147 @@ function loadJSON(path){ // - index - done loding index at path // - end - done loading all indexes // -// XXX return a promice rather than an event emitter.... // XXX test with: -// requirejs(['file'], function(m){ -// m.loadIndex("L:/mnt/hdd15 (photo)/NTFS1/media/img/others") -// .on('index', function(){ console.log('!!!', arguments) }) }) +// requirejs(['file'], +// function(m){ +// f = m.loadIndex("L:/mnt/hdd15 (photo)/NTFS1/media/img/others") }) +// .done(function(d){ console.log(d) }) +// XXX need to do better error handling... var loadIndex = module.loadIndex = -function(path, emitter){ +function(path, logger){ var p = path.split(INDEX_DIR) var last = p.slice(-1)[0].trim() - var end = emitter == null - emitter = emitter == null ? new events.EventEmitter() : emitter + return new promise(function(resolve, reject){ + // we've got an index... + if(p.length > 1 && /^\/*$/.test(last)){ + listJSON(path) + .on('end', function(files){ + var res = {} + var index = {} + var root = {} - // XXX to facilitate tracking this needs return an object that both - // emits events (EventEmitter) and holds state (promise)... - //return new promice(function(resolve, reject){ - // // XXX - //}) + // group by keyword... + files + .sort() + .reverse() + .forEach(function(n){ + var b = pathlib.basename(n) + var s = b.split(/[-.]/g).slice(0, -1) - // we've got an index... - if(p.length > 1 && /^\/*$/.test(last)){ - listJSON(path) - .on('end', function(files){ - var res = {} - var index = {} - var root = {} + // .json / non-diff + // NOTE: this is a special case, we add this to + // a seporate index and then concat it to + // the final list if needed... + if(s.length == 1){ + var k = s[0] + root[k] = n + return - // group by keyword... - files - .sort() - .reverse() - .forEach(function(n){ - var b = pathlib.basename(n) - var s = b.split(/[-.]/g).slice(0, -1) + // -[-diff].json / diff / non-diff + } else { + var k = s[1] + var d = s[2] == 'diff' + } - // .json / non-diff - // NOTE: this is a special case, we add this to - // a seporate index and then concat it to - // the final list if needed... - if(s.length == 1){ - var k = s[0] - root[k] = n - return + // new keyword... + if(index[k] == null){ + index[k] = [[d, n]] + logger && logger.emit('queued', n) - // -[-diff].json / diff / non-diff - } else { - var k = s[1] - var d = s[2] == 'diff' - } + // do not add anything past the latest non-diff + // for each keyword... + } else if(index[k].slice(-1)[0][0] == true){ + index[k].push([d, n]) + logger && logger.emit('queued', n) + } + }) - // new keyword... + // add root files where needed... + Object.keys(root).forEach(function(k){ + var n = root[k] + + // no diffs... if(index[k] == null){ - index[k] = [[d, n]] - emitter.emit('queued', n) + index[k] = [[false, n]] + logger && logger.emit('queued', n) - // do not add anything past the latest non-diff - // for each keyword... + // add root file if no base is found... } else if(index[k].slice(-1)[0][0] == true){ - index[k].push([d, n]) - emitter.emit('queued', n) + index[k].push([false, n]) + logger && logger.emit('queued', n) } }) - // add root files where needed... - Object.keys(root).forEach(function(k){ - var n = root[k] + // load... + promise + .all(Object.keys(index).map(function(k){ + // get relevant paths... + var diffs = index[k] + var latest = diffs.splice(-1)[0][1] - // no diffs... - if(index[k] == null){ - index[k] = [[false, n]] - emitter.emit('queued', n) + // load latest... + return loadJSON(latest) + .then(function(data){ + // handle diffs... + return promise + .all(diffs + .reverse() + .map(function(p){ + p = p[1] + // load diff... + return loadJSON(p) + .done(function(json){ + // merge... + for(var k in json){ + data[k] = json[k] + } - // add root file if no base is found... - } else if(index[k].slice(-1)[0][0] == true){ - index[k].push([false, n]) - emitter.emit('queued', n) - } + logger && logger.emit('loaded', p) + }) + })) + .then(function(){ + res[k] = data + + logger && logger.emit('loaded', latest) + }) + }) + })) + .then(function(){ + logger && logger.emit('index', path, res) + + var d = {} + d[path] = res + + resolve(d) + }) }) - // load... - promise - .all(Object.keys(index).map(function(k){ - // get relevant paths... - var diffs = index[k] - var latest = diffs.splice(-1)[0][1] + // no explicit index given -- find all in sub tree... + } else { + var res = {} - // load latest... - return loadJSON(latest) - .then(function(data){ - // handle diffs... - return promise - .all(diffs - .reverse() - .map(function(p){ - p = p[1] - // load diff... - return loadJSON(p) - .done(function(json){ - // merge... - for(var k in json){ - data[k] = json[k] - } + listIndexes(path) + .on('end', function(indexes){ + var i = indexes.length - emitter.emit('loaded', p) - }) - })) - .then(function(){ - res[k] = data + indexes.forEach(function(path){ + loadIndex(path, logger) + // collect the found indexes... + .done(function(obj){ + i -= 1 + res[path] = obj[path] - emitter.emit('loaded', latest) - }) + // call this when the load is done... + if(i <= 0){ + resolve(res) + } }) - })) - .then(function(){ - emitter.emit('index', path, res) - - // indicate end only if we are not part of a multi-index load... - if(end){ - emitter.emit('end', {path: res}) - } }) - }) - - // no explicit index given -- find all in sub tree... - } else { - var res = {} - - - listIndexes(path) - .on('end', function(indexes){ - var i = indexes.length - - // collect the found indexes... - emitter.on('index', function(path, obj){ - i -= 1 - res[path] = obj - - if(i <= 0){ - // XXX need to call this when the load was done... - emitter.emit('end', res) - } }) - - indexes.forEach(function(path){ loadIndex(path, emitter) }) - - }) - } - - return emitter + } + }) }