mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-02 20:30:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			217 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**********************************************************************
 | 
						|
* 
 | 
						|
*
 | 
						|
*
 | 
						|
**********************************************************************/
 | 
						|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
 | 
						|
(function(require){ var module={} // make module AMD/node compatible...
 | 
						|
/*********************************************************************/
 | 
						|
 | 
						|
if(typeof(process) != 'undefined'){
 | 
						|
	var file = require('imagegrid/file')
 | 
						|
}
 | 
						|
 | 
						|
var actions = require('lib/actions')
 | 
						|
var features = require('lib/features')
 | 
						|
 | 
						|
var core = require('features/core')
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*********************************************************************/
 | 
						|
// Comments...
 | 
						|
// XXX these are quite generic, might be a good idea to move them out of fs...
 | 
						|
 | 
						|
var CommentsActions = actions.Actions({
 | 
						|
	// Format:
 | 
						|
	// 	{
 | 
						|
	// 		// raw loaded comments...
 | 
						|
	// 		raw: {
 | 
						|
	// 			<path>: <comments>,
 | 
						|
	// 			...
 | 
						|
	// 		},
 | 
						|
	//
 | 
						|
	// 		<keyword>: <data>,
 | 
						|
	// 		...
 | 
						|
	// 	}
 | 
						|
	__comments: null,
 | 
						|
 | 
						|
	get comments(){
 | 
						|
		return this.__comments },
 | 
						|
	set comments(value){
 | 
						|
		this.__comments = value },
 | 
						|
})
 | 
						|
 | 
						|
var Comments = 
 | 
						|
module.Comments = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'comments',
 | 
						|
 | 
						|
	actions: CommentsActions,
 | 
						|
 | 
						|
	handlers: [
 | 
						|
		// save/resore .comments
 | 
						|
		['json',
 | 
						|
			function(res){
 | 
						|
				if(this.comments != null){
 | 
						|
					res.comments = JSON.parse(JSON.stringify(this.comments))
 | 
						|
				}
 | 
						|
			}],
 | 
						|
		['load',
 | 
						|
			function(_, data){
 | 
						|
				if(data.comments != null){
 | 
						|
					this.comments = data.comments
 | 
						|
				}
 | 
						|
			}],
 | 
						|
 | 
						|
		// prepare comments for saving to "comments/<keyword>"...
 | 
						|
		//
 | 
						|
		// NOTE: this will skip the 'raw' comment field...
 | 
						|
		// NOTE: we do not change the .json() format here, so we do not 
 | 
						|
		// 		need to do anything special to restore, i.e. no need for
 | 
						|
		// 		doing anything on .prepareIndexForLoad(..)
 | 
						|
		['prepareIndexForWrite',
 | 
						|
			function(res){
 | 
						|
				var changed = res.changes === true
 | 
						|
					|| res.changes.comments
 | 
						|
 | 
						|
				if(changed && res.raw.comments){
 | 
						|
					var comments = res.raw.comments
 | 
						|
 | 
						|
					Object.keys(comments)
 | 
						|
						// skip the raw field...
 | 
						|
						.filter(function(k){ return k != 'raw' })
 | 
						|
						.forEach(function(k){
 | 
						|
							res.index['comments/' + k] = comments[k]
 | 
						|
						})
 | 
						|
				}
 | 
						|
			}],
 | 
						|
	],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//---------------------------------------------------------------------
 | 
						|
// FS Comments... 
 | 
						|
 | 
						|
// XXX split this to loader and writer???
 | 
						|
var FileSystemCommentsActions = actions.Actions({
 | 
						|
	config: {
 | 
						|
		// Comment loading delay...
 | 
						|
		//
 | 
						|
		// This helps prevent the comment loading process from delaying
 | 
						|
		// showing the user the images...
 | 
						|
		//
 | 
						|
		// NOTE: to load without a delay set this to -1.
 | 
						|
		'comments-delay-load': 100,
 | 
						|
	},
 | 
						|
 | 
						|
	/* XXX we do not actually need this...
 | 
						|
	// XXX this will not save comments for merged indexes...
 | 
						|
	saveComments: ['- File/',
 | 
						|
		function(path, date, logger){
 | 
						|
			if(this.location.method != 'loadIndex' 
 | 
						|
				|| this.location.loaded.length > 1){
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			logger = logger || this.logger
 | 
						|
			logger = logger && logger.push('saveComments')
 | 
						|
 | 
						|
			var path = this.location.path
 | 
						|
			var comments_dir = this.config['index-dir'] +'/comments'
 | 
						|
			var data = JSON.parse(JSON.stringify(this.comments))
 | 
						|
 | 
						|
			// XXX
 | 
						|
			return file.writeIndex(
 | 
						|
					data, 
 | 
						|
					path +'/'+ comments_dir,
 | 
						|
					date || Date.timeStamp(),
 | 
						|
					this.config['index-filename-template'], 
 | 
						|
					logger)
 | 
						|
		}],
 | 
						|
	//*/
 | 
						|
	loadComments: ['- File/',
 | 
						|
		function(path, date, logger){
 | 
						|
			if(this.location.method != 'loadIndex'){
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			logger = logger || this.logger
 | 
						|
			logger = logger && logger.push('Load comments')
 | 
						|
 | 
						|
			var that = this
 | 
						|
			var loaded = this.location.loaded
 | 
						|
 | 
						|
			// prepare empty comments...
 | 
						|
			// XXX should we reset or just merge???
 | 
						|
			this.comments = {
 | 
						|
				raw: {}
 | 
						|
			}
 | 
						|
 | 
						|
			return Promise.all(loaded.map(function(path){
 | 
						|
				var comments_dir = that.config['index-dir'] +'/comments'
 | 
						|
 | 
						|
				return file.loadIndex(path +'/'+ comments_dir, false, date, logger)
 | 
						|
					.then(function(res){
 | 
						|
						var c = res[path +'/'+ comments_dir]
 | 
						|
 | 
						|
						// no comments present...
 | 
						|
						if(c == null){
 | 
						|
							return res
 | 
						|
						}
 | 
						|
 | 
						|
						// if we have no sub-indexes just load the 
 | 
						|
						// comments as-is...
 | 
						|
						if(loaded.length == 1){
 | 
						|
							that.comments = JSON.parse(JSON.stringify(c))
 | 
						|
							that.comments.raw = {path: c}
 | 
						|
 | 
						|
						// sub-indexes -> let the client merge their stuff...
 | 
						|
						} else {
 | 
						|
							that.comments.raw[path] = c
 | 
						|
						} 
 | 
						|
 | 
						|
						return res
 | 
						|
					})
 | 
						|
			}))
 | 
						|
		}],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
var FileSystemComments = 
 | 
						|
module.FileSystemComments = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'fs-comments',
 | 
						|
	depends: [
 | 
						|
		'comments',
 | 
						|
		'fs-loader',
 | 
						|
	],
 | 
						|
 | 
						|
	actions: FileSystemCommentsActions,
 | 
						|
 | 
						|
	handlers: [
 | 
						|
		['loadIndex',
 | 
						|
			function(res){
 | 
						|
				var that = this
 | 
						|
				var delay = that.config['comments-delay-load']
 | 
						|
 | 
						|
				res.then(function(){
 | 
						|
					delay < 0 ?
 | 
						|
						that.loadComments()
 | 
						|
						: setTimeout(function(){
 | 
						|
							that.loadComments() }, delay || 0) })
 | 
						|
			}],
 | 
						|
	],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* vim:set ts=4 sw=4 :                               */ return module })
 |