mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-30 10:50:08 +00:00
done refactoring output format construction (need to revise)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
dec295fd05
commit
6358945168
@ -923,17 +923,69 @@ module.Base = core.ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
['prepareIndexForWrite',
|
['prepareIndexForWrite',
|
||||||
function(res){
|
function(res){
|
||||||
|
// we save .current unconditionally...
|
||||||
res.index.current = res.raw.data.current
|
res.index.current = res.raw.data.current
|
||||||
|
|
||||||
// XXX .data
|
var changes = res.changes
|
||||||
// XXX .images
|
|
||||||
|
// data...
|
||||||
|
if(changes === true || changes.data){
|
||||||
|
res.index.data = res.raw.data
|
||||||
|
}
|
||||||
|
|
||||||
|
// images (full)...
|
||||||
|
if(changes === true || changes.images === true){
|
||||||
|
res.index.images = res.raw.images
|
||||||
|
|
||||||
|
// images-diff...
|
||||||
|
} else if(changes && changes.images){
|
||||||
|
var diff = res.index['images-diff'] = {}
|
||||||
|
changes.images.forEach(function(gid){
|
||||||
|
diff[gid] = res.raw.images[gid]
|
||||||
|
})
|
||||||
|
}
|
||||||
}],
|
}],
|
||||||
['prepareJSONForLoad',
|
['prepareJSONForLoad',
|
||||||
function(res, json){
|
function(res, json, base_path){
|
||||||
res.data.current = json.current || res.data.current
|
console.log('>>>>', res, json, base_path)
|
||||||
|
|
||||||
// XXX .data
|
// build data and images...
|
||||||
// XXX .images
|
// XXX do we actually need to build stuff here, shouldn't
|
||||||
|
// .load(..) take care of this???
|
||||||
|
var d = data.Data.fromJSON(json.data)
|
||||||
|
|
||||||
|
d.current = json.current || d.current
|
||||||
|
|
||||||
|
var img = images.Images(json.images)
|
||||||
|
|
||||||
|
if(base_path){
|
||||||
|
d.base_path = base_path
|
||||||
|
// XXX STUB remove ASAP...
|
||||||
|
// ...need a real way to handle base dir, possible
|
||||||
|
// approaches:
|
||||||
|
// 1) .base_path attr in image, set on load and
|
||||||
|
// do not save (or ignore on load)...
|
||||||
|
// if exists prepend to all paths...
|
||||||
|
// - more to do in view-time
|
||||||
|
// + more flexible
|
||||||
|
// 2) add/remove on load/save (approach below)
|
||||||
|
// + less to do in real time
|
||||||
|
// - more processing on load/save
|
||||||
|
img.forEach(function(_, img){ img.base_path = base_path })
|
||||||
|
}
|
||||||
|
|
||||||
|
// extra stuff...
|
||||||
|
// ...this will restore stuff stored in the data but not
|
||||||
|
// explicitly restored above...
|
||||||
|
// XXX do we need this???
|
||||||
|
Object.keys(json.data).forEach(function(k){
|
||||||
|
if(d[k] === undefined){
|
||||||
|
d[k] = json.data[k]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
res.data = d
|
||||||
|
res.images = img
|
||||||
}],
|
}],
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
@ -1130,19 +1182,19 @@ module.Tags = core.ImageGridFeatures.Feature({
|
|||||||
//
|
//
|
||||||
// XXX see if this can be automated...
|
// XXX see if this can be automated...
|
||||||
['prepareIndexForWrite',
|
['prepareIndexForWrite',
|
||||||
function(res, _, full){
|
function(res){
|
||||||
var changes = this.changes
|
var changes = res.changes
|
||||||
|
|
||||||
if((full || changes == null || changes.tags) && res.raw.data.tags){
|
if((changes === true || changes.tags) && res.raw.data.tags){
|
||||||
res.index.tags = res.raw.data.tags
|
res.index.tags = res.raw.data.tags
|
||||||
}
|
}
|
||||||
|
|
||||||
if((full || changes == null || changes.selected)
|
if((changes === true || changes.selected)
|
||||||
&& res.raw.data.tags
|
&& res.raw.data.tags
|
||||||
&& res.raw.data.tags.selected){
|
&& res.raw.data.tags.selected){
|
||||||
res.index.marked = res.raw.data.tags.selected
|
res.index.marked = res.raw.data.tags.selected
|
||||||
}
|
}
|
||||||
if((full || changes == null || changes.bookmarked)
|
if((changes === true || changes.bookmarked)
|
||||||
&& res.raw.data.tags
|
&& res.raw.data.tags
|
||||||
&& res.raw.data.tags.bookmark){
|
&& res.raw.data.tags.bookmark){
|
||||||
res.index.bookmarked = [
|
res.index.bookmarked = [
|
||||||
|
|||||||
@ -82,6 +82,92 @@ module.IndexFormat = core.ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
var ExportFormatActions = actions.Actions({
|
||||||
|
// Convert json index to a format compatible with file.writeIndex(..)
|
||||||
|
//
|
||||||
|
// This is here so as other features can participate in index
|
||||||
|
// preparation...
|
||||||
|
// There are several stages features can control the output format:
|
||||||
|
// 1) .json() action
|
||||||
|
// - use this for global high level serialization format
|
||||||
|
// - the output of this is .load(..) compatible
|
||||||
|
// 2) .prepareIndexForWrite(..) action
|
||||||
|
// - use this for file system write preparation
|
||||||
|
// - this directly affects the index structure
|
||||||
|
//
|
||||||
|
// This will get the base index, ignoring the cropped state.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// {
|
||||||
|
// // Timestamp...
|
||||||
|
// // NOTE: this is the timestamp used to write the index.
|
||||||
|
// date: <timestamp>,
|
||||||
|
//
|
||||||
|
// // normalized changes...
|
||||||
|
// // - true - everything changed
|
||||||
|
// // - false - nothing changes/disabled
|
||||||
|
// / - <object> - specific changes
|
||||||
|
// changes: <changes>,
|
||||||
|
//
|
||||||
|
// // This is the original json object, either the one passed as
|
||||||
|
// // an argument or the one returned by .json('base')
|
||||||
|
// raw: <original-json>,
|
||||||
|
//
|
||||||
|
// // this is the prepared index object, the one that is going to be
|
||||||
|
// // saved.
|
||||||
|
// index: <index-json>,
|
||||||
|
//
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// The format for the <prapared-json> is as follows:
|
||||||
|
// {
|
||||||
|
// <keyword>: <data>,
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// The <index-json> is written out to a fs index in the following
|
||||||
|
// way:
|
||||||
|
// <index-dir>/<timestamp>-<keyword>.json
|
||||||
|
//
|
||||||
|
// <index-dir> - taken from .config['index-dir'] (default: '.ImageGrid')
|
||||||
|
// <timestamp> - as returned by Date.timeStamp() (see: jli)
|
||||||
|
//
|
||||||
|
prepareIndexForWrite: ['- File/Prepare index for writing',
|
||||||
|
function(json, full){
|
||||||
|
json = json || this.json('base')
|
||||||
|
var changes = full ? null
|
||||||
|
: this.hasOwnProperty('changes') ? this.changes
|
||||||
|
: null
|
||||||
|
changes = changes === null ? true : changes
|
||||||
|
return {
|
||||||
|
date: Date.timeStamp(),
|
||||||
|
changes: changes,
|
||||||
|
raw: json,
|
||||||
|
index: {},
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
// XXX should this return {} or json???
|
||||||
|
prepareJSONForLoad: ['- File/Prepare JSON for loading',
|
||||||
|
function(json, base_path){ return {} }],
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
var ExportFormat =
|
||||||
|
module.ExportFormat = core.ImageGridFeatures.Feature({
|
||||||
|
title: '',
|
||||||
|
doc: '',
|
||||||
|
|
||||||
|
tag: 'export-format',
|
||||||
|
|
||||||
|
actions: ExportFormatActions,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
var FileSystemInfoActions = actions.Actions({
|
var FileSystemInfoActions = actions.Actions({
|
||||||
@ -130,16 +216,6 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
'default-load-method': 'loadIndex',
|
'default-load-method': 'loadIndex',
|
||||||
},
|
},
|
||||||
|
|
||||||
// NOTE: this is the reverse of .prepareIndexForWrite(..)
|
|
||||||
//
|
|
||||||
// XXX do we need both this and file.buildIndex(..), we essentially create
|
|
||||||
// a Data object and then create it again in .load()...
|
|
||||||
prepareJSONForLoad: ['- File/Prepare JSON for loading',
|
|
||||||
function(json, base_path){
|
|
||||||
// XXX move the code up here from file.js...
|
|
||||||
return file.buildIndex(json, base_path) }],
|
|
||||||
|
|
||||||
|
|
||||||
// XXX is this a hack???
|
// XXX is this a hack???
|
||||||
// XXX need a more generic form...
|
// XXX need a more generic form...
|
||||||
checkPath: ['- File/',
|
checkPath: ['- File/',
|
||||||
@ -629,6 +705,7 @@ module.FileSystemLoader = core.ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
tag: 'fs-loader',
|
tag: 'fs-loader',
|
||||||
depends: [
|
depends: [
|
||||||
|
'export-format',
|
||||||
'location',
|
'location',
|
||||||
'recover',
|
'recover',
|
||||||
'fs-info',
|
'fs-info',
|
||||||
@ -943,10 +1020,10 @@ module.Comments = core.ImageGridFeatures.Feature({
|
|||||||
// doing anything on .prepareJSONForLoad(..)
|
// doing anything on .prepareJSONForLoad(..)
|
||||||
['prepareIndexForWrite',
|
['prepareIndexForWrite',
|
||||||
function(res, _, full){
|
function(res, _, full){
|
||||||
var changed = this.changes == null
|
var changed = res.changes === true
|
||||||
|| this.changes.comments
|
|| res.changes.comments
|
||||||
|
|
||||||
if((full || changed) && res.raw.comments){
|
if(changed && res.raw.comments){
|
||||||
var comments = res.raw.comments
|
var comments = res.raw.comments
|
||||||
|
|
||||||
Object.keys(comments)
|
Object.keys(comments)
|
||||||
@ -1183,10 +1260,10 @@ module.FileSystemSaveHistory = core.ImageGridFeatures.Feature({
|
|||||||
// available.
|
// available.
|
||||||
// NOTE: 'loadIndex' will also drop any unsaved changes...
|
// NOTE: 'loadIndex' will also drop any unsaved changes...
|
||||||
['prepareIndexForWrite',
|
['prepareIndexForWrite',
|
||||||
function(res, _, full){
|
function(res){
|
||||||
var changed = this.changes == null || this.changes.comments
|
var changed = res.changes === true || res.changes.comments
|
||||||
|
|
||||||
if(full || changed){
|
if(changed){
|
||||||
var comments = res.raw.comments && res.raw.comments.save || {}
|
var comments = res.raw.comments && res.raw.comments.save || {}
|
||||||
|
|
||||||
// set the 'current' comment to the correct date...
|
// set the 'current' comment to the correct date...
|
||||||
@ -1552,67 +1629,6 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
// Convert json index to a format compatible with file.writeIndex(..)
|
|
||||||
//
|
|
||||||
// This is here so as other features can participate in index
|
|
||||||
// preparation...
|
|
||||||
// There are several stages features can control the output format:
|
|
||||||
// 1) .json() action
|
|
||||||
// - use this for global high level serialization format
|
|
||||||
// - the output of this is .load(..) compatible
|
|
||||||
// 2) .prepareIndexForWrite(..) action
|
|
||||||
// - use this for file system write preparation
|
|
||||||
// - this directly affects the index structure
|
|
||||||
//
|
|
||||||
// This will get the base index, ignoring the cropped state.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// {
|
|
||||||
// // Timestamp...
|
|
||||||
// // NOTE: this is the timestamp used to write the index.
|
|
||||||
// date: <timestamp>,
|
|
||||||
//
|
|
||||||
// // This is the original json object, either the one passed as
|
|
||||||
// // an argument or the one returned by .json('base')
|
|
||||||
// raw: <original-json>,
|
|
||||||
//
|
|
||||||
// // this is the prepared index object, the one that is going to be
|
|
||||||
// // saved.
|
|
||||||
// index: <index-json>,
|
|
||||||
//
|
|
||||||
// ...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// The format for the <prapared-json> is as follows:
|
|
||||||
// {
|
|
||||||
// <keyword>: <data>,
|
|
||||||
// ...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// The <index-json> is written out to a fs index in the following
|
|
||||||
// way:
|
|
||||||
// <index-dir>/<timestamp>-<keyword>.json
|
|
||||||
//
|
|
||||||
// <index-dir> - taken from .config['index-dir'] (default: '.ImageGrid')
|
|
||||||
// <timestamp> - as returned by Date.timeStamp() (see: jli)
|
|
||||||
//
|
|
||||||
// For more info see file.writeIndex(..) and file.loadIndex(..).
|
|
||||||
//
|
|
||||||
// NOTE: this is the reverse of .prepareJSONForLoad(..)
|
|
||||||
prepareIndexForWrite: ['- File/Prepare index for writing',
|
|
||||||
function(json, full){
|
|
||||||
json = json || this.json('base')
|
|
||||||
var changes = full ? null
|
|
||||||
: this.hasOwnProperty('changes') ? this.changes
|
|
||||||
: null
|
|
||||||
return {
|
|
||||||
date: Date.timeStamp(),
|
|
||||||
raw: json,
|
|
||||||
index: file.prepareIndex(json, changes),
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
|
|
||||||
// Save index...
|
// Save index...
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
|
|||||||
@ -467,14 +467,14 @@ module.Sort = core.ImageGridFeatures.Feature({
|
|||||||
// maintain .sort_order and .sort_cache separately from .data in
|
// maintain .sort_order and .sort_cache separately from .data in
|
||||||
// the store...
|
// the store...
|
||||||
['prepareIndexForWrite',
|
['prepareIndexForWrite',
|
||||||
function(res, _, full){
|
function(res){
|
||||||
var c = this.changes
|
var c = res.changes
|
||||||
|
|
||||||
;['sort_order', 'sort_cache']
|
;['sort_order', 'sort_cache']
|
||||||
.forEach(function(attr){
|
.forEach(function(attr){
|
||||||
if((full || c == null || c[attr]) && res.raw.data[attr]){
|
if((c === true || c[attr]) && res.raw.data[attr]){
|
||||||
// full save...
|
// full save...
|
||||||
if(full || c == null){
|
if(c === true){
|
||||||
res.index[attr] = res.raw.data[attr]
|
res.index[attr] = res.raw.data[attr]
|
||||||
|
|
||||||
// build diff...
|
// build diff...
|
||||||
|
|||||||
@ -742,96 +742,6 @@ function(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Build a data and images objects from the json returned by loadIndex(..)
|
|
||||||
//
|
|
||||||
// Contrary to loadIndex(..) this expects a specific format of data:
|
|
||||||
// .data
|
|
||||||
// .images
|
|
||||||
// .bookmarked
|
|
||||||
// .marked
|
|
||||||
// .tags
|
|
||||||
// .current
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// XXX need a clear format upgrade path/strategy...
|
|
||||||
// ...this can be:
|
|
||||||
// - full upgrade -- full update all data to new format
|
|
||||||
// - format continuation -- store in new format stating with a
|
|
||||||
// new snapshot keeping the older data as-is...
|
|
||||||
// XXX will need a "cut-off strategy", i.e. when a keyword
|
|
||||||
// stops being used we need some way to tell the
|
|
||||||
// loader/builder to ignore it...
|
|
||||||
// currently I'm for the second option...
|
|
||||||
//
|
|
||||||
// XXX move this to a better spot...
|
|
||||||
var buildIndex =
|
|
||||||
module.buildIndex = function(index, base_path){
|
|
||||||
var res = {}
|
|
||||||
|
|
||||||
// we'll handle these in a special way...
|
|
||||||
var special = [
|
|
||||||
'data',
|
|
||||||
'tags',
|
|
||||||
'bookmarked',
|
|
||||||
'marked',
|
|
||||||
'current',
|
|
||||||
'images',
|
|
||||||
]
|
|
||||||
|
|
||||||
// copy the rest as-is...
|
|
||||||
for(var k in index){
|
|
||||||
if(special.indexOf(k) > -1){
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
res[k] = index[k]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// now do the special stuff...
|
|
||||||
|
|
||||||
var d = data.Data.fromJSON(index.data)
|
|
||||||
|
|
||||||
// buildup the data object...
|
|
||||||
// NOTE: this is mostly to attach stuff that is stored in separate files...
|
|
||||||
|
|
||||||
// images...
|
|
||||||
// XXX there seems to be a problem with updated images...
|
|
||||||
// - in the test set not all rotated manually images are loaded rotated...
|
|
||||||
var img = images.Images(index.images)
|
|
||||||
|
|
||||||
if(base_path){
|
|
||||||
d.base_path = base_path
|
|
||||||
// XXX STUB remove ASAP...
|
|
||||||
// ...need a real way to handle base dir, possible
|
|
||||||
// approaches:
|
|
||||||
// 1) .base_path attr in image, set on load and
|
|
||||||
// do not save (or ignore on load)...
|
|
||||||
// if exists prepend to all paths...
|
|
||||||
// - more to do in view-time
|
|
||||||
// + more flexible
|
|
||||||
// 2) add/remove on load/save (approach below)
|
|
||||||
// + less to do in real time
|
|
||||||
// - more processing on load/save
|
|
||||||
img.forEach(function(_, img){ img.base_path = base_path })
|
|
||||||
}
|
|
||||||
|
|
||||||
// extra stuff...
|
|
||||||
// ...this will restore stuff stored in the data but not explicitly
|
|
||||||
// restored above...
|
|
||||||
Object.keys(index.data).forEach(function(k){
|
|
||||||
if(d[k] === undefined){
|
|
||||||
d[k] = index.data[k]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
res.data = d
|
|
||||||
res.images = img
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
// Builder...
|
// Builder...
|
||||||
@ -852,63 +762,6 @@ module.buildIndex = function(index, base_path){
|
|||||||
//
|
//
|
||||||
// NOTE: for now we'll stick to the current format...
|
// NOTE: for now we'll stick to the current format...
|
||||||
|
|
||||||
// this will take the output of .json()
|
|
||||||
//
|
|
||||||
// .data
|
|
||||||
// .images
|
|
||||||
// .bookmarked
|
|
||||||
// .marked
|
|
||||||
// .tags
|
|
||||||
// .current
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// changes can be:
|
|
||||||
// true | null - write all
|
|
||||||
// false - write only .current
|
|
||||||
// <detailed-format>
|
|
||||||
// - see below...
|
|
||||||
//
|
|
||||||
// changes detailed format:
|
|
||||||
// {
|
|
||||||
// data: <bool>,
|
|
||||||
//
|
|
||||||
// images: <bool> | [ <gid>, ... ]
|
|
||||||
//
|
|
||||||
// tags: <bool>,
|
|
||||||
// bookmarked: <bool>,
|
|
||||||
// selected: <bool>,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// NOTE: this will prepare for version 2.0 file structure...
|
|
||||||
var prepareIndex =
|
|
||||||
module.prepareIndex =
|
|
||||||
function(json, changes){
|
|
||||||
changes = changes === false ? false
|
|
||||||
// nothing set then save all...
|
|
||||||
: changes == null ? true
|
|
||||||
: changes
|
|
||||||
|
|
||||||
var res = {}
|
|
||||||
|
|
||||||
// data...
|
|
||||||
if(changes === true || changes && changes.data){
|
|
||||||
res.data = json.data
|
|
||||||
}
|
|
||||||
|
|
||||||
if(changes === true || changes && changes.images === true){
|
|
||||||
res.images = json.images
|
|
||||||
|
|
||||||
} else if(changes && changes.images){
|
|
||||||
var diff = res['images-diff'] = {}
|
|
||||||
changes.images.forEach(function(gid){
|
|
||||||
diff[gid] = json.images[gid]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var FILENAME = '${DATE}-${KEYWORD}.${EXT}'
|
var FILENAME = '${DATE}-${KEYWORD}.${EXT}'
|
||||||
|
|
||||||
// NOTE: keyword in index can take the form <path>/<keyword>, in which
|
// NOTE: keyword in index can take the form <path>/<keyword>, in which
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user