mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
added export of virtual blocks (now feature complete) + backup and clearing of ecport target dir...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
47f5bf9937
commit
e44d2573cc
@ -43,6 +43,8 @@ var browseWalk = require('lib/widget/browse-walk')
|
|||||||
if(typeof(process) != 'undefined'){
|
if(typeof(process) != 'undefined'){
|
||||||
var copy = file.denodeify(fse.copy)
|
var copy = file.denodeify(fse.copy)
|
||||||
var ensureDir = file.denodeify(fse.ensureDir)
|
var ensureDir = file.denodeify(fse.ensureDir)
|
||||||
|
var outputFile = file.denodeify(fse.outputFile)
|
||||||
|
var createFile = file.denodeify(fse.createFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1565,6 +1567,9 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
'export-path': null,
|
'export-path': null,
|
||||||
'export-paths': [],
|
'export-paths': [],
|
||||||
|
|
||||||
|
'export-include-virtual': true,
|
||||||
|
'export-clean-target': true,
|
||||||
|
|
||||||
// NOTE: file extension is added automatically...
|
// NOTE: file extension is added automatically...
|
||||||
// NOTE: see .formatImageName(..) for format docs...
|
// NOTE: see .formatImageName(..) for format docs...
|
||||||
'export-preview-name-pattern': '%(fav)l%n%(-%c)c',
|
'export-preview-name-pattern': '%(fav)l%n%(-%c)c',
|
||||||
@ -1617,6 +1622,28 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
'export-preview-size-limit': 'no limit',
|
'export-preview-size-limit': 'no limit',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// XXX should this be sync???
|
||||||
|
backupDir: ['- File/',
|
||||||
|
function(path, logger){
|
||||||
|
// XXX get a logger...
|
||||||
|
logger = logger || this.logger
|
||||||
|
logger = logger && logger.push('Backup')
|
||||||
|
|
||||||
|
do{
|
||||||
|
var d = Date.timeStamp()
|
||||||
|
var backup_dir = `${pathlib.dirname(path)}/.${pathlib.basename(path)}.${d}`
|
||||||
|
} while(fse.existsSync(backup_dir))
|
||||||
|
|
||||||
|
logger && logger.emit(backup_dir)
|
||||||
|
|
||||||
|
fse.moveSync(path, backup_dir)
|
||||||
|
|
||||||
|
typeof(process) != 'undefined'
|
||||||
|
&& (process.platform == 'win32'
|
||||||
|
|| process.platform == 'win64')
|
||||||
|
&& child_process
|
||||||
|
.spawn('attrib', ['+h', backup_dir]) }],
|
||||||
|
|
||||||
// Save index...
|
// Save index...
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
@ -1722,7 +1749,7 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
// XXX handle .image.path and other stack files...
|
// XXX handle .image.path and other stack files...
|
||||||
// XXX local collections???
|
// XXX local collections???
|
||||||
exportIndex: ['- File/Export/Export index',
|
exportIndex: ['- File/Export/Export index',
|
||||||
function(path, max_size, include_orig, logger){
|
function(path, max_size, include_orig, clean_target_dir, logger){
|
||||||
var that = this
|
var that = this
|
||||||
logger = logger || this.logger
|
logger = logger || this.logger
|
||||||
logger = logger && logger.push('Export index')
|
logger = logger && logger.push('Export index')
|
||||||
@ -1739,6 +1766,15 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
// XXX resolve env variables in path...
|
// XXX resolve env variables in path...
|
||||||
// ...also add ImageGrid specifics: $IG_INDEX, ...
|
// ...also add ImageGrid specifics: $IG_INDEX, ...
|
||||||
// XXX
|
// XXX
|
||||||
|
|
||||||
|
// clear/backup target...
|
||||||
|
clean_target_dir = clean_target_dir === undefined ?
|
||||||
|
this.config['export-clean-target']
|
||||||
|
: clean_target_dir
|
||||||
|
clean_target_dir
|
||||||
|
&& fse.existsSync(path)
|
||||||
|
&& this.backupDir(path, logger)
|
||||||
|
|
||||||
|
|
||||||
// resolve relative paths...
|
// resolve relative paths...
|
||||||
if(/^(\.\.?[\\\/]|[^\\\/])/.test(path)
|
if(/^(\.\.?[\\\/]|[^\\\/])/.test(path)
|
||||||
@ -2025,11 +2061,19 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
}
|
}
|
||||||
gid = gid || this.current
|
gid = gid || this.current
|
||||||
var ribbon = this.data.getRibbon(gid)
|
var ribbon = this.data.getRibbon(gid)
|
||||||
|
data = Object.assign({},
|
||||||
|
this.images[gid] || {},
|
||||||
|
data)
|
||||||
|
|
||||||
var img = this.images[gid]
|
name = name
|
||||||
name = name || pathlib.basename(img.path || (img.name + img.ext))
|
|| pathlib.basename(
|
||||||
|
data.path || ((data.name || '') + (data.ext || '')))
|
||||||
|
name = name == '' ?
|
||||||
|
gid
|
||||||
|
: name
|
||||||
var ext = pathlib.extname(name)
|
var ext = pathlib.extname(name)
|
||||||
var to_ext = data.ext || ext
|
var to_ext = data.ext
|
||||||
|
|| ext
|
||||||
|
|
||||||
var tags = data.tags || this.data.getTags(gid)
|
var tags = data.tags || this.data.getTags(gid)
|
||||||
|
|
||||||
@ -2123,12 +2167,14 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
// XXX stop the process on errors...
|
// XXX stop the process on errors...
|
||||||
// XXX use tasks...
|
// XXX use tasks...
|
||||||
// XXX check global index ('%I') in crop...
|
// XXX check global index ('%I') in crop...
|
||||||
|
// XXX add option to "clean" destination...
|
||||||
|
// ...i.e. if destination exists then move it to .removed/<date>/
|
||||||
exportDirs: ['- File/Export/Export ribbons as directories',
|
exportDirs: ['- File/Export/Export ribbons as directories',
|
||||||
core.doc`Export ribbons as directories
|
core.doc`Export ribbons as directories
|
||||||
|
|
||||||
NOTE: see .formatImageName(..) for pattern syntax details.
|
NOTE: see .formatImageName(..) for pattern syntax details.
|
||||||
`,
|
`,
|
||||||
function(path, pattern, level_dir, size, logger){
|
function(path, pattern, level_dir, size, include_virtual, clean_target_dir, logger){
|
||||||
logger = logger || this.logger
|
logger = logger || this.logger
|
||||||
logger = logger && logger.push('Export dirs')
|
logger = logger && logger.push('Export dirs')
|
||||||
var that = this
|
var that = this
|
||||||
@ -2156,6 +2202,17 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
: (level_dir || this.config['export-level-directory-name'] || 'fav')
|
: (level_dir || this.config['export-level-directory-name'] || 'fav')
|
||||||
size = size || this.config['export-preview-size'] || 1000
|
size = size || this.config['export-preview-size'] || 1000
|
||||||
pattern = pattern || this.config['export-preview-name-pattern'] || '%f'
|
pattern = pattern || this.config['export-preview-name-pattern'] || '%f'
|
||||||
|
include_virtual = include_virtual === undefined ?
|
||||||
|
this.config['export-include-virtual']
|
||||||
|
: include_virtual
|
||||||
|
|
||||||
|
// clear/backup target...
|
||||||
|
clean_target_dir = clean_target_dir === undefined ?
|
||||||
|
this.config['export-clean-target']
|
||||||
|
: clean_target_dir
|
||||||
|
clean_target_dir
|
||||||
|
&& fse.existsSync(to_dir)
|
||||||
|
&& this.backupDir(to_dir, logger)
|
||||||
|
|
||||||
// check if we have naming conflicts...
|
// check if we have naming conflicts...
|
||||||
var conflicts = this.imageNameConflicts()
|
var conflicts = this.imageNameConflicts()
|
||||||
@ -2180,19 +2237,6 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
|
|
||||||
that.data.ribbons[ribbon].forEach(function(gid){
|
that.data.ribbons[ribbon].forEach(function(gid){
|
||||||
var img = that.images[gid]
|
var img = that.images[gid]
|
||||||
// NOTE: we are intentionally losing image dir
|
|
||||||
// name here -- we do not need to preserve
|
|
||||||
// topology when exporting...
|
|
||||||
var img_name = pathlib.basename(img.path || (img.name + img.ext))
|
|
||||||
|
|
||||||
// get best preview...
|
|
||||||
var from = (img.base_path || base_dir)
|
|
||||||
+'/'
|
|
||||||
+ that.images.getBestPreview(gid, size).url
|
|
||||||
|
|
||||||
|
|
||||||
// XXX see if we need to make a preview (sharp)
|
|
||||||
// XXX
|
|
||||||
|
|
||||||
// XXX get/form image name...
|
// XXX get/form image name...
|
||||||
// XXX might be a good idea to connect this to the info framework...
|
// XXX might be a good idea to connect this to the info framework...
|
||||||
@ -2204,16 +2248,49 @@ var FileSystemWriterActions = actions.Actions({
|
|||||||
conflicts: conflicts.conflicts,
|
conflicts: conflicts.conflicts,
|
||||||
})
|
})
|
||||||
|
|
||||||
var to = img_dir +'/'+ name
|
// handle virtual blocks...
|
||||||
|
if(img.type == 'virtual'){
|
||||||
|
name = img.ext ?
|
||||||
|
name
|
||||||
|
: name +'.txt'
|
||||||
|
to = img_dir +'/'+ name
|
||||||
|
|
||||||
logger && logger.emit('queued', to)
|
logger && logger.emit('queued', to)
|
||||||
|
|
||||||
|
var res = include_virtual
|
||||||
|
&& !fse.existsSync(to)
|
||||||
|
&& outputFile(to, img.text || '')
|
||||||
|
|
||||||
|
// normal images...
|
||||||
|
} else {
|
||||||
|
// NOTE: we are intentionally losing image dir
|
||||||
|
// name here -- we do not need to preserve
|
||||||
|
// topology when exporting...
|
||||||
|
var img_name = pathlib.basename(img.path || (img.name + img.ext))
|
||||||
|
|
||||||
|
// get best preview...
|
||||||
|
var from = (img.base_path || base_dir)
|
||||||
|
+'/'
|
||||||
|
+ that.images.getBestPreview(gid, size).url
|
||||||
|
|
||||||
|
|
||||||
|
// XXX see if we need to make a preview (sharp)
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
var to = img_dir +'/'+ name
|
||||||
|
|
||||||
|
logger && logger.emit('queued', to)
|
||||||
|
|
||||||
|
var res = !fse.existsSync(to)
|
||||||
|
&& copy(from, to)
|
||||||
|
}
|
||||||
|
|
||||||
// destination exists...
|
// destination exists...
|
||||||
if(fse.existsSync(to)){
|
if(!res){
|
||||||
logger && logger.emit('skipping', to)
|
logger && logger.emit('skipping', to)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return copy(from, to)
|
return res
|
||||||
.then(function(){
|
.then(function(){
|
||||||
logger && logger.emit('done', to) })
|
logger && logger.emit('done', to) })
|
||||||
.catch(function(err){
|
.catch(function(err){
|
||||||
@ -2301,6 +2378,7 @@ var FileSystemWriterUIActions = actions.Actions({
|
|||||||
data: [
|
data: [
|
||||||
'base_path',
|
'base_path',
|
||||||
'target_dir',
|
'target_dir',
|
||||||
|
'clean_target_dir',
|
||||||
// XXX need to add options to size: 'none',
|
// XXX need to add options to size: 'none',
|
||||||
// XXX use closest preview instead of hi-res when
|
// XXX use closest preview instead of hi-res when
|
||||||
// this is set...
|
// this is set...
|
||||||
@ -2317,8 +2395,10 @@ var FileSystemWriterUIActions = actions.Actions({
|
|||||||
data: [
|
data: [
|
||||||
'pattern',
|
'pattern',
|
||||||
'size',
|
'size',
|
||||||
|
'include_virtual',
|
||||||
'base_path',
|
'base_path',
|
||||||
'target_dir',
|
'target_dir',
|
||||||
|
'clean_target_dir',
|
||||||
// XXX add option to disable this...
|
// XXX add option to disable this...
|
||||||
//'level_dir',
|
//'level_dir',
|
||||||
],
|
],
|
||||||
@ -2606,6 +2686,28 @@ var FileSystemWriterUIActions = actions.Actions({
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
'include_virtual': function(actions, make, parent){
|
||||||
|
var elem = make([
|
||||||
|
'Include $virtual: ',
|
||||||
|
actions.config['export-include-virtual'] ?
|
||||||
|
'yes'
|
||||||
|
: 'no'],
|
||||||
|
{ open: function(){
|
||||||
|
var v = actions.config['export-include-virtual'] =
|
||||||
|
!actions.config['export-include-virtual']
|
||||||
|
elem.find('.text').last()
|
||||||
|
.text(v ? 'yes' : 'no') }, }) },
|
||||||
|
'clean_target_dir': function(actions, make, parent){
|
||||||
|
var elem = make([
|
||||||
|
'$Clean target: ',
|
||||||
|
actions.config['export-clean-target'] ?
|
||||||
|
'yes'
|
||||||
|
: 'no'],
|
||||||
|
{ open: function(){
|
||||||
|
var v = actions.config['export-clean-target'] =
|
||||||
|
!actions.config['export-clean-target']
|
||||||
|
elem.find('.text').last()
|
||||||
|
.text(v ? 'yes' : 'no') }, }) },
|
||||||
},
|
},
|
||||||
// XXX update export state: index, crop, image...
|
// XXX update export state: index, crop, image...
|
||||||
// XXX should this be visible directly???
|
// XXX should this be visible directly???
|
||||||
|
|||||||
@ -68,7 +68,9 @@ var VirtualBlocksActions = actions.Actions({
|
|||||||
metadata
|
metadata
|
||||||
&& (this.images[gid] = metadata)
|
&& (this.images[gid] = metadata)
|
||||||
this.markChanged
|
this.markChanged
|
||||||
&& this.markChanged('images', [gid])
|
&& this
|
||||||
|
.markChanged('data')
|
||||||
|
.markChanged('images', [gid])
|
||||||
|
|
||||||
// focus new image...
|
// focus new image...
|
||||||
// NOTE: this should update the view too...
|
// NOTE: this should update the view too...
|
||||||
@ -304,5 +306,6 @@ module.VirtualBlocksEditUI = core.ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* vim:set ts=4 sw=4 : */ return module })
|
* vim:set ts=4 sw=4 : */ return module })
|
||||||
|
|||||||
@ -161,11 +161,7 @@ function(func){
|
|||||||
var args = [...arguments]
|
var args = [...arguments]
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
func.apply(that, args.concat([function(err, res){
|
func.apply(that, args.concat([function(err, res){
|
||||||
return err ? reject(err) : resolve(res)
|
return err ? reject(err) : resolve(res) }])) }) } }
|
||||||
}]))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var loadFile = denodeify(fse.readFile)
|
var loadFile = denodeify(fse.readFile)
|
||||||
var writeFile = denodeify(fse.writeFile)
|
var writeFile = denodeify(fse.writeFile)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user