added a basic tags implementations to data.js -- boy, I hate manual super calls!

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2014-11-19 02:42:45 +03:00
parent d281b6e06e
commit b972835da0
3 changed files with 194 additions and 48 deletions

View File

@ -1815,16 +1815,205 @@ var DataPrototype = {
/*********************************************************************/
var DataWithTagsPrototype = {
// XXX need a unified init/dump/load scheme...
loadJSON: function(json){
json = typeof(json) == typeof('str') ? JSON.parse(json) : json
// XXX hate manual super calls...
DataWithTagsPrototype.__proto__.loadJSON.call(this, json)
if(json.tags != null){
// XXX should we make copy here???
this.tags = json.tags
this.sortTags()
}
return this
},
dumpJSON: function(){
// XXX hate manual super calls...
var res = DataWithTagsPrototype.__proto__.dumpJSON.call(this)
if(this.tags != null){
var tags = this.tags
res.tags = {}
Object.keys(tags).forEach(function(tag){
res.tags[tag] = tags[tag].compact()
})
}
return res
},
sortTags: function(){
var that = this
var tags = this.tags
if(tags == null){
return this
}
Object.keys(tags).forEach(function(tag){
tags[tag] = that.makeSparseImages(tags[tag])
})
return this
},
tag: function(tags, gids){
tags = tags.constructor !== Array ? [tags] : tags
gids = gids == null ? this.getImage() : gids
gids = gids.constructor !== Array ? [gids] : gids
if(this.tags == null){
this.tags = {}
}
var that = this
var tagset = this.tags
var order = this.order
tags.forEach(function(tag){
gids.forEach(function(gid){
if(tagset[tag] == null){
tagset[tag] = []
}
tagset[tag][order.indexOf(gid)] = gid
})
})
return this
},
untag: function(tags, gids){
tags = tags.constructor !== Array ? [tags] : tags
gids = gids == null ? this.getImage() : gids
gids = gids.constructor !== Array ? [gids] : gids
var that = this
var tagset = this.tags
var order = this.order
tags.forEach(function(tag){
gids.forEach(function(gid){
delete tagset[tag][order.indexOf(gid)]
})
if(tagset[tag].length == 0){
delete tagset[tag]
}
})
return this
},
getTags: function(gids){
gids = gids == null ? this.getImage() : gids
gids = gids.constructor !== Array ? [gids] : gids
if(this.tags == null){
return []
}
var tags = this.tags
var order = this.order
// index the gids...
var indexes = gids.map(function(gid){ return order.indexOf(gid) })
// return only those tags that have at least one non-null gid index...
return Object.keys(tags).filter(function(tag){
return indexes.filter(function(i){
return tags[tag][i] != null
}).length > 0
})
},
// selectors...
getTaggedByAny: function(tags){
tags = tags.constructor !== Array ? [tags] : tags
var res = []
if(this.tags == null){
return res
}
var that = this
var tagset = this.tags
tags.forEach(function(tag){
if(tag in tagset){
that.makeSparseImages(tagset[tag], res)
}
})
return res.compact()
},
getTaggedByAll: function(tags){
tags = tags.constructor !== Array ? [tags] : tags
if(this.tags == null){
return []
}
var index = []
var l = tags.length
// count how many of the tags each image is tagged...
var that = this
var tagset = this.tags
tags.forEach(function(tag){
if(tag in tagset){
Object.keys(tagset[tag]).forEach(function(n){
if(index[n] == null){
index[n] = 1
} else {
index[n] += 1
}
})
}
})
// filter only the images tagged by all of the tags...
var order = this.order
var res = []
var i = index.indexOf(l)
while(i != -1){
res.push(order[i])
delete index[i]
i = index.indexOf(l)
}
return res
},
}
DataWithTagsPrototype.__proto__ = DataPrototype
/*********************************************************************/
// Main Data object...
var Data =
module.Data =
object.makeConstructor('Data',
var BaseData =
module.BaseData =
object.makeConstructor('BaseData',
DataClassPrototype,
DataPrototype)
var DataWithTags =
module.DataWithTags =
object.makeConstructor('DataWithTags',
DataClassPrototype,
DataWithTagsPrototype)
var Data =
module.Data = DataWithTags
/**********************************************************************
* vim:set ts=4 sw=4 : */

View File

@ -1338,7 +1338,8 @@ Array.prototype.compact = function(){
// like .length but for sparse arrays will return the element count...
// XXX make this a prop...
Array.prototype.len = function(){
return this.compact().length
//return this.compact().length
return Object.keys(this).length
}

View File

@ -1,44 +0,0 @@
/**********************************************************************
*
*
*
**********************************************************************/
define(function(require){ var module = {}
console.log('>>> tags')
//var DEBUG = DEBUG != null ? DEBUG : true
var object = require('object')
/*********************************************************************/
var TagsClassPrototype = {}
var TagsPrototype = {
loadJSON: function(json){
},
dumpJSON: function(){
},
_reset: function(){
},
}
/*********************************************************************/
var Tags =
module.Tags =
object.makeConstructor('Tags',
TagsClassPrototype,
TagsPrototype)
/**********************************************************************
* vim:set ts=4 sw=4 : */
return module })