blog/themes/fluid/scripts/generators/local-search.js

69 lines
1.7 KiB
JavaScript
Raw Normal View History

2024-11-16 11:34:10 +08:00
/* global hexo */
'use strict';
hexo.extend.generator.register('_hexo_generator_search', function(locals) {
const config = this.theme.config;
if (!config.search.enable) {
return;
}
const nunjucks = require('nunjucks');
const env = new nunjucks.Environment();
const pathFn = require('path');
const fs = require('fs');
env.addFilter('uriencode', function(str) {
return encodeURI(str);
});
env.addFilter('noControlChars', function(str) {
// eslint-disable-next-line no-control-regex
return str && str.replace(/[\x00-\x1F\x7F]/g, '');
});
env.addFilter('urlJoin', function(str) {
const base = str[0];
const relative = str[1];
return relative
? base.replace(/\/+$/, '') + '/' + relative.replace(/^\/+/, '')
: base;
});
const searchTmplSrc = pathFn.join(hexo.theme_dir, './source/xml/local-search.xml');
const searchTmpl = nunjucks.compile(fs.readFileSync(searchTmplSrc, 'utf8'), env);
const searchConfig = config.search;
let searchField = searchConfig.field;
const content = searchConfig.content && true;
let posts, pages;
if (searchField.trim() !== '') {
searchField = searchField.trim();
if (searchField === 'post') {
posts = locals.posts.sort('-date');
} else if (searchField === 'page') {
pages = locals.pages;
} else {
posts = locals.posts.sort('-date');
pages = locals.pages;
}
} else {
posts = locals.posts.sort('-date');
}
const xml = searchTmpl.render({
config : config,
posts : posts,
pages : pages,
content: content,
url : hexo.config.root
});
return {
path: searchConfig.generate_path || '/local-search.xml',
data: xml
};
});