mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-28 18:00:09 +00:00
started working on save history and partial loading...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
7e7cc8a168
commit
e94ba6ba2c
@ -84,6 +84,14 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
checkPath: ['- File/',
|
checkPath: ['- File/',
|
||||||
function(path){ return fse.existsSync(path) }],
|
function(path){ return fse.existsSync(path) }],
|
||||||
|
|
||||||
|
|
||||||
|
loadSaveHistoryList: ['- File/',
|
||||||
|
function(path){
|
||||||
|
path = path || this.location.path
|
||||||
|
|
||||||
|
return file.loadSaveHistoryList(path)
|
||||||
|
}],
|
||||||
|
|
||||||
// NOTE: when passed no path this will not do anything...
|
// NOTE: when passed no path this will not do anything...
|
||||||
//
|
//
|
||||||
// XXX how should .location be handled when merging indexes or
|
// XXX how should .location be handled when merging indexes or
|
||||||
@ -93,12 +101,16 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
// XXX should this return a promise??? ...a clean promise???
|
// 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, logger){
|
function(path, from_date, logger){
|
||||||
var that = this
|
var that = this
|
||||||
|
|
||||||
if(path == null){
|
if(path == null){
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if(from_date && from_date.emit != null){
|
||||||
|
logger = from_date
|
||||||
|
from_date = null
|
||||||
|
}
|
||||||
|
|
||||||
// XXX get a logger...
|
// XXX get a logger...
|
||||||
logger = logger || this.logger
|
logger = logger || this.logger
|
||||||
@ -106,7 +118,7 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
// XXX make this load incrementally (i.e. and EventEmitter
|
// XXX make this load incrementally (i.e. and EventEmitter
|
||||||
// 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'], logger)
|
return file.loadIndex(path, this.config['index-dir'], from_date, logger)
|
||||||
.then(function(res){
|
.then(function(res){
|
||||||
// XXX if res is empty load raw...
|
// XXX if res is empty load raw...
|
||||||
|
|
||||||
@ -149,6 +161,9 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
for(var i=0; i < paths.length; i++){
|
for(var i=0; i < paths.length; i++){
|
||||||
var k = paths[i]
|
var k = paths[i]
|
||||||
|
|
||||||
|
// XXX save dates...
|
||||||
|
res[k].__dates && console.log('DATES:', res[k].__dates)
|
||||||
|
|
||||||
// skip empty indexes...
|
// skip empty indexes...
|
||||||
// XXX should we rebuild or list here???
|
// XXX should we rebuild or list here???
|
||||||
if(res[k].data == null || res[k].images == null){
|
if(res[k].data == null || res[k].images == null){
|
||||||
|
|||||||
@ -89,7 +89,9 @@ function(base){
|
|||||||
|
|
||||||
|
|
||||||
// XXX return a promise rather than an event emitter (???)
|
// XXX return a promise rather than an event emitter (???)
|
||||||
function listJSON(path, pattern){
|
var listJSON =
|
||||||
|
module.listJSON =
|
||||||
|
function(path, pattern){
|
||||||
pattern = pattern || '*'
|
pattern = pattern || '*'
|
||||||
return gGlob(path +'/'+ pattern +'.json')
|
return gGlob(path +'/'+ pattern +'.json')
|
||||||
}
|
}
|
||||||
@ -127,6 +129,203 @@ function loadJSON(path){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Format:
|
||||||
|
// {
|
||||||
|
// <date>: [
|
||||||
|
// <path>,
|
||||||
|
// ...
|
||||||
|
// ],
|
||||||
|
//
|
||||||
|
// ...
|
||||||
|
//
|
||||||
|
// // root files -- no date...
|
||||||
|
// root: [
|
||||||
|
// <path>,
|
||||||
|
// ...
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
var groupByDate =
|
||||||
|
module.groupByDate =
|
||||||
|
function(list){
|
||||||
|
var res = {}
|
||||||
|
|
||||||
|
list
|
||||||
|
.forEach(function(n){
|
||||||
|
var b = pathlib.basename(n)
|
||||||
|
var s = b.split(/[-.]/g).slice(0, -1)
|
||||||
|
|
||||||
|
// no date set...
|
||||||
|
if(s.length == 1){
|
||||||
|
res.root = res.root || []
|
||||||
|
res.root.push(n)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
res[s[0]] = res[s[0]] || []
|
||||||
|
res[s[0]].push(n)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Group file list by keyword...
|
||||||
|
//
|
||||||
|
// this will build a structure in the following format:
|
||||||
|
// {
|
||||||
|
// <keyword>: [
|
||||||
|
// // diff files...
|
||||||
|
// // NOTE: the first argument indicates
|
||||||
|
// // if this is a diff or not, used to
|
||||||
|
// // skip past the last base...
|
||||||
|
// [true, <filename>],
|
||||||
|
// ...
|
||||||
|
//
|
||||||
|
// // base file (non-diff)
|
||||||
|
// [false, <filename>]
|
||||||
|
// ],
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// This is used to sequence, load and correctly merge
|
||||||
|
// the found JSON files.
|
||||||
|
//
|
||||||
|
// NOTE: all files past the first non-diff are skipped.
|
||||||
|
var groupByKeyword =
|
||||||
|
module.groupByKeyword =
|
||||||
|
function(list, from_date, logger){
|
||||||
|
var index = {}
|
||||||
|
var queued = 0
|
||||||
|
|
||||||
|
var dates = groupByDate(list)
|
||||||
|
|
||||||
|
Object.keys(dates)
|
||||||
|
.sort()
|
||||||
|
.reverse()
|
||||||
|
// skip dates before from_date...
|
||||||
|
// NOTE: from_date is included...
|
||||||
|
.filter(function(d){ return from_date ? d <= from_date : true })
|
||||||
|
.forEach(function(d){
|
||||||
|
dates[d]
|
||||||
|
.sort()
|
||||||
|
.reverse()
|
||||||
|
.forEach(function(n){
|
||||||
|
var b = pathlib.basename(n)
|
||||||
|
var s = b.split(/[-.]/g).slice(0, -1)
|
||||||
|
|
||||||
|
// <timestamp>-<keyword>[-diff].json / diff / non-diff
|
||||||
|
// NOTE: all files without a timestamp are filtered out
|
||||||
|
// by groupByDate(..) into a .root section so we
|
||||||
|
// do not need to worry about them here...
|
||||||
|
var k = s[1]
|
||||||
|
var d = s[2] == 'diff'
|
||||||
|
|
||||||
|
// new keyword...
|
||||||
|
if(index[k] == null){
|
||||||
|
index[k] = [[d, n]]
|
||||||
|
logger && logger.emit('queued', n)
|
||||||
|
queued += 1
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
queued += 1
|
||||||
|
}
|
||||||
|
}) })
|
||||||
|
|
||||||
|
// add base files back where needed...
|
||||||
|
// <keyword>.json / non-diff
|
||||||
|
dates.root
|
||||||
|
.forEach(function(n){
|
||||||
|
var b = pathlib.basename(n)
|
||||||
|
var k = b.split(/\./g)[0]
|
||||||
|
|
||||||
|
// no diffs...
|
||||||
|
if(index[k] == null){
|
||||||
|
index[k] = [[false, n]]
|
||||||
|
logger && logger.emit('queued', n)
|
||||||
|
queued += 1
|
||||||
|
|
||||||
|
// add root file if no base is found...
|
||||||
|
} else if(index[k].slice(-1)[0][0] == true){
|
||||||
|
index[k].push([false, n])
|
||||||
|
logger && logger.emit('queued', n)
|
||||||
|
queued += 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// remove the flags...
|
||||||
|
for(var k in index){
|
||||||
|
index[k] = index[k].map(function(e){ return e[1] })
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX revise...
|
||||||
|
index.__dates = Object.keys(dates)
|
||||||
|
|
||||||
|
logger && logger.emit('files-queued', queued, index)
|
||||||
|
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// XXX not yet working...
|
||||||
|
// XXX handle errors....
|
||||||
|
var loadSaveHistoryList =
|
||||||
|
module.loadSaveHistoryList =
|
||||||
|
function(path){
|
||||||
|
return new Promise(function(resolve, reject){
|
||||||
|
// direct index...
|
||||||
|
if(pathlib.basename(path) == index_dir){
|
||||||
|
listJSON(path)
|
||||||
|
// XXX handle errors...
|
||||||
|
.on('error', function(err){
|
||||||
|
logger && logger.emit('error', err)
|
||||||
|
})
|
||||||
|
.on('end', function(files){
|
||||||
|
var res = {}
|
||||||
|
|
||||||
|
resolve(Object.keys(groupByDate(files)))
|
||||||
|
})
|
||||||
|
|
||||||
|
// need to locate indexes...
|
||||||
|
} else {
|
||||||
|
var res = {}
|
||||||
|
var loaders = []
|
||||||
|
|
||||||
|
// XXX handle 'error' event...
|
||||||
|
listIndexes(path, index_dir)
|
||||||
|
// XXX handle errors...
|
||||||
|
.on('error', function(err){
|
||||||
|
logger && logger.emit('error', err)
|
||||||
|
})
|
||||||
|
// collect the found indexes...
|
||||||
|
.on('match', function(path){
|
||||||
|
loaders.push(loadSaveHistoryList(path)
|
||||||
|
.then(function(obj){
|
||||||
|
// NOTE: considering that all the paths within
|
||||||
|
// the index are relative to the preview
|
||||||
|
// dir (the parent dir to the index root)
|
||||||
|
// we do not need to include the index
|
||||||
|
// itself in the base path...
|
||||||
|
var p = path.split(index_dir)[0]
|
||||||
|
res[p] = obj[path]
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
// done...
|
||||||
|
.on('end', function(paths){
|
||||||
|
// wait for all the loaders to complete...
|
||||||
|
Promise.all(loaders).then(function(){ resolve(res) })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Load index(s)...
|
// Load index(s)...
|
||||||
//
|
//
|
||||||
// loadIndex(path)
|
// loadIndex(path)
|
||||||
@ -135,6 +334,12 @@ function loadJSON(path){
|
|||||||
// loadIndex(path, logger)
|
// loadIndex(path, logger)
|
||||||
// -> data
|
// -> data
|
||||||
//
|
//
|
||||||
|
// loadIndex(path, index_dir, logger)
|
||||||
|
// -> data
|
||||||
|
//
|
||||||
|
// loadIndex(path, index_dir, from_date, logger)
|
||||||
|
// -> data
|
||||||
|
//
|
||||||
//
|
//
|
||||||
// Procedure:
|
// Procedure:
|
||||||
// - locate indexes in path given
|
// - locate indexes in path given
|
||||||
@ -201,8 +406,17 @@ function loadJSON(path){
|
|||||||
// XXX do a task version...
|
// XXX do a task version...
|
||||||
var loadIndex =
|
var loadIndex =
|
||||||
module.loadIndex =
|
module.loadIndex =
|
||||||
function(path, index_dir, logger){
|
function(path, index_dir, from_date, logger){
|
||||||
|
if(index_dir && index_dir.emit != null){
|
||||||
|
logger = index_dir
|
||||||
|
index_dir = from_date = null
|
||||||
|
|
||||||
|
} else if(from_date && from_date.emit != null){
|
||||||
|
logger = from_date
|
||||||
|
from_date = null
|
||||||
|
}
|
||||||
index_dir = index_dir || INDEX_DIR
|
index_dir = index_dir || INDEX_DIR
|
||||||
|
|
||||||
// XXX should this be interactive (a-la EventEmitter) or as it is now
|
// XXX should this be interactive (a-la EventEmitter) or as it is now
|
||||||
// return the whole thing as a block (Promise)...
|
// return the whole thing as a block (Promise)...
|
||||||
// NOTE: one way to do this is use the logger, it will get
|
// NOTE: one way to do this is use the logger, it will get
|
||||||
@ -221,98 +435,22 @@ function(path, index_dir, logger){
|
|||||||
})
|
})
|
||||||
.on('end', function(files){
|
.on('end', function(files){
|
||||||
var res = {}
|
var res = {}
|
||||||
var index = {}
|
|
||||||
var root = {}
|
|
||||||
var queued = 0
|
|
||||||
|
|
||||||
logger && logger.emit('files-found', files.length, files)
|
// XXX need to pass a filter date to this...
|
||||||
|
var index = groupByKeyword(files, from_date, logger)
|
||||||
// group by keyword...
|
|
||||||
//
|
|
||||||
// this will build a structure in the following format:
|
|
||||||
// {
|
|
||||||
// <keyword>: [
|
|
||||||
// // diff files...
|
|
||||||
// // NOTE: the first argument indicates
|
|
||||||
// // if this is a diff or not, used to
|
|
||||||
// // skip past the last base...
|
|
||||||
// [true, <filename>],
|
|
||||||
// ...
|
|
||||||
//
|
|
||||||
// // base file (non-diff)
|
|
||||||
// [false, <filename>]
|
|
||||||
// ],
|
|
||||||
// ...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// This is used to sequence, load and correctly merge
|
|
||||||
// the found JSON files.
|
|
||||||
//
|
|
||||||
// NOTE: all files past the first non-diff are skipped.
|
|
||||||
files
|
|
||||||
.sort()
|
|
||||||
.reverse()
|
|
||||||
.forEach(function(n){
|
|
||||||
var b = pathlib.basename(n)
|
|
||||||
var s = b.split(/[-.]/g).slice(0, -1)
|
|
||||||
|
|
||||||
// <keyword>.json / non-diff
|
|
||||||
// NOTE: this is a special case, we add this to
|
|
||||||
// a separate index and then concat it to
|
|
||||||
// the final list if needed...
|
|
||||||
if(s.length == 1){
|
|
||||||
var k = s[0]
|
|
||||||
root[k] = n
|
|
||||||
return
|
|
||||||
|
|
||||||
// <timestamp>-<keyword>[-diff].json / diff / non-diff
|
|
||||||
} else {
|
|
||||||
var k = s[1]
|
|
||||||
var d = s[2] == 'diff'
|
|
||||||
}
|
|
||||||
|
|
||||||
// new keyword...
|
|
||||||
if(index[k] == null){
|
|
||||||
index[k] = [[d, n]]
|
|
||||||
logger && logger.emit('queued', n)
|
|
||||||
queued += 1
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
queued += 1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// add base files back where needed...
|
|
||||||
Object.keys(root)
|
|
||||||
.forEach(function(k){
|
|
||||||
var n = root[k]
|
|
||||||
|
|
||||||
// no diffs...
|
|
||||||
if(index[k] == null){
|
|
||||||
index[k] = [[false, n]]
|
|
||||||
logger && logger.emit('queued', n)
|
|
||||||
queued += 1
|
|
||||||
|
|
||||||
// add root file if no base is found...
|
|
||||||
} else if(index[k].slice(-1)[0][0] == true){
|
|
||||||
index[k].push([false, n])
|
|
||||||
logger && logger.emit('queued', n)
|
|
||||||
queued += 1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
logger && logger.emit('files-queued', queued, index)
|
|
||||||
|
|
||||||
// load...
|
// load...
|
||||||
Promise
|
Promise
|
||||||
.all(Object.keys(index).map(function(keyword){
|
.all(Object.keys(index).map(function(keyword){
|
||||||
// get relevant paths...
|
// get relevant paths...
|
||||||
var diffs = index[keyword]
|
var diffs = index[keyword]
|
||||||
var latest = diffs.splice(-1)[0][1]
|
var latest = diffs.splice(-1)[0]
|
||||||
|
|
||||||
|
// XXX not sure about this...
|
||||||
|
if(keyword == '__dates'){
|
||||||
|
res.__dates = index.__dates
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: so far I really do not like how nested and
|
// NOTE: so far I really do not like how nested and
|
||||||
// unreadable the Promise/Deferred code becomes
|
// unreadable the Promise/Deferred code becomes
|
||||||
@ -333,7 +471,6 @@ function(path, index_dir, logger){
|
|||||||
return Promise
|
return Promise
|
||||||
// load diffs...
|
// load diffs...
|
||||||
.all(diffs.map(function(p){
|
.all(diffs.map(function(p){
|
||||||
p = p[1]
|
|
||||||
return loadJSON(p)
|
return loadJSON(p)
|
||||||
// XXX handle errors...
|
// XXX handle errors...
|
||||||
// XXX we should abort loading this index...
|
// XXX we should abort loading this index...
|
||||||
@ -352,8 +489,6 @@ function(path, index_dir, logger){
|
|||||||
diffs
|
diffs
|
||||||
.reverse()
|
.reverse()
|
||||||
.forEach(function(p){
|
.forEach(function(p){
|
||||||
p = p[1]
|
|
||||||
|
|
||||||
var json = loading[p]
|
var json = loading[p]
|
||||||
|
|
||||||
for(var n in json){
|
for(var n in json){
|
||||||
@ -390,7 +525,7 @@ function(path, index_dir, logger){
|
|||||||
})
|
})
|
||||||
// collect the found indexes...
|
// collect the found indexes...
|
||||||
.on('match', function(path){
|
.on('match', function(path){
|
||||||
loaders.push(loadIndex(path, index_dir, logger)
|
loaders.push(loadIndex(path, index_dir, from_date, logger)
|
||||||
.then(function(obj){
|
.then(function(obj){
|
||||||
// NOTE: considering that all the paths within
|
// NOTE: considering that all the paths within
|
||||||
// the index are relative to the preview
|
// the index are relative to the preview
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user