hexo
Version:
A fast, simple & powerful blog framework, powered by Node.js.
143 lines (112 loc) • 3.2 kB
JavaScript
var findData = function(data, source){
if (!source.length) return true;
for (var i = 0, len = source.length; i < len; ++i){
if (data.indexOf(source[i]) != -1) return true;
}
return false;
};
var arrayCaseFind = function(data, value){
value = value.toUpperCase();
for (var i = 0,len = data.length; i < len; i++){
if (data[i].toUpperCase() === value) return true;
}
return false;
};
var makeWhereQuery = function(index){
return function(data){
return findData(data, index);
};
};
var getPosts = function(site, options){
options = _.extend({
count: 6,
orderby: 'date',
order: -1,
query: {
tags: '',
categories: '',
operator: ''
}
}, options);
var posts = site.posts,
queryData = [],
conditions = options.query,
queryOperator = 'and',
query = {};
var getIndex = function(type, query){
if (_.isObject(query._index)) return query._index;
if (!_.isObject(query)) query = query.split(/\s*,\s*/);
if (query && query.length){
var data = site[type].find({
name: {
$where: function(name){
return arrayCaseFind(query, name);
}
}
});
return data._index;
}
return false;
};
var keys = Object.keys(conditions);
for (var i = 0, len = keys.length; i<len; ++i){
var key = keys[i],
obj = {};
query = conditions[key];
switch (key){
case 'tags':
case 'categories':
var _index = get_index(key, query);
if (_index && _index.length){
obj[key] = {
$where: makeWhereQuery(_index)
};
queryData.push(obj);
}
break;
case 'operator':
queryOperator = query;
break;
default:
obj[key] = typeof query === 'function' ? {$where: query} : query;
queryData.push(obj);
}
}
if (options.posts) posts = options.posts;
if (options.orderby){
if (options.orderby == 'random') posts = posts.random();
else posts = posts.sort(options.orderby, options.order);
}
if (queryData.length){
var queryOpt;
query = {};
if (options.count) queryOpt = {limit: options.count};
query['$' + queryOperator] = queryData;
return posts.find(query, queryOpt);
}
return options.count ? posts.limit(options.count) : posts;
};
exports.get_posts = function(options){
return getPosts(this.site, options);
};
exports.list_posts = function(options) {
options = _.extend({
ulClass: '',
liClass: '',
style: 'list',
separator: ', ',
class: 'post'
}, options);
var posts = getPosts(this.site, options),
style = options.style,
root = this.config.root,
ul = '<ul class="' + (options.ulClass ? options.ulClass : options.class) + '">',
li = '<li class="' + (options.liClass ? options.liClass : options.class + '-list-item') + '">',
arr = [];
posts.each(function(post){
arr.push( '<a href="' + root + post.path + '">' + (post.title?post.title:post.slug) + '</a>');
});
if (!arr.lentgh) return '';
if (style !== 'list') return arr.join(options.separator);
return ul + li + arr.join('</li>' + li) + '</li></ul>';
};