source DocumentInterface.js
Full url: ./modules/metadata/DocumentInterface.js
/**
* Extends {@link smx.Document Document} with metadata module methods.
* @mixin Document-Metadata
* @memberof smx.module:Metadata
* @see {@link smx.Document Document}
*/
var DocumentInterface = {
/**
* Performs a search
* @method search
* @instance
* @param {String} query
* @param {module:Metadata.searchOptions=} options
* @return {module:Metadata.searchResult[]}
* @memberof module:Metadata.Document-Metadata
* @see module:Metadata.searchOptions
* @see module:Metadata.searchResult
*/
search(str, opts){
let results = [];
//empty or invalid str return empty results array
if(!_.isString(str) || str === '')
return results;
/**
* The options object used as parameter in {@link module:Metadata.Node-Metadata#search .search()} method.
* @typedef {Object} module:Metadata.searchOptions
* @property {Boolean} sensitive
* @property {Boolean} insensitive
* @property {SMXNode} node
* @property {String} selector
* @property {String[]} include
* @property {String[]} exclude
* @see {@link module:Metadata.Document-Metadata#search Document-Metadata.search()}
* @see {@link module:Metadata.Node-Metadata#search Node-Metadata.search()}
*/
/**
* The returning object by the {@link module:Metadata.Node-Metadata#search .search()} method, returns an array of them.
* @typedef {Object[]} module:Metadata.searchResult
* @property {SMXNode} node
* @property {String} meta-key
* @property {String} meta-value
* @see {@link module:Metadata.Document-Metadata#search Document-Metadata.search()}
* @see {@link module:Metadata.Node-Metadata#search Node-Metadata.search()}
*/
var options = _.defaults(opts||{}, {
//case sensivity
sensitive: false,
//accents sensivity
insensitive: false,
//node context
node: null,
//base selector
selector: '',
//include selectors
include: [],
//exclude selectors
exclude: []
});
str = (options.sensitive)? str : str.toLowerCase();
var json;
var doc = this;
if(options.selector+''){
let nodes = this.find(options.selector, options.node);
let ids = _.pluck(nodes,'id');
let datas = [];
_.each(this._data.metadata, function(value, key, list){
if(_.includes(ids,key)) datas.push(value);
});
json = _.map(datas, function(data, index){ data.id = ids[index]; return data; });
}
else{
let ids = _.keys(this._data.metadata);
let values = _.values(this._data.metadata);
json = _.map(values, function(value, index){ value.id = ids[index]; return value; });
}
_.each(json, function(item){
//save id property for later use and delete it
//so loop wont process it and will run faster
var id = item.id+''; delete item.id;
_.each(item, function(value, key){
//ignore empty string and non string values...
var is_valid_string = ( _.isString(value) && !_.isEmpty(value) )? true : false;
if(is_valid_string){
var _value = (options.sensitive)? value : value.toLowerCase();
if(_value.indexOf(str)>=0){
results.push({
'node': doc.getNodeById(id),
'meta': key,
'value': value
});
}
}
});
});
results = _.uniq(results);
return results;
}
};
export default DocumentInterface;