const nunjucks = require('nunjucks') const path = require('path') const fs = require('fs') // hexo@8 移除了内置 jsfiddle tag,在此重新注册 hexo.extend.tag.register('jsfiddle', function(args) { const shortcode = args[0] const tabs = args[1] || 'js,resources,html,css,result' const skin = args[2] || 'light' const width = args[3] || '100%' const height = args[4] || '300' return `` }) const env = new nunjucks.configure({ autoescape: false }) env.addFilter('noControlChars', function(str) { return str && str.replace(/[\x00-\x1F\x7F]/g, '') }) const searchTmplSrc = path.join(__dirname, '../templates/articles.xml') hexo.extend.generator.register('xml', function(locals){ const searchTmpl = nunjucks.compile(fs.readFileSync(searchTmplSrc, 'utf8'), env) const descCompare = function(value1, value2) { if(value1 > value2) { return -1 } else if(value1 < value2) { return 1 } else { return 0 } } const posts = locals.posts.toArray().sort(function(item1, item2){ return descCompare(item1.updateDate || item1.date, item2.updateDate || item2.date) }).slice(0, 10) const xmlData = searchTmpl.render({ posts, root: this.config.root }) return { path: 'articles.xml', data: xmlData } }) // 自定义 Baidu Sitemap 生成器(替代已废弃的 hexo-generator-baidu-sitemap) hexo.extend.generator.register('baidusitemap', function(locals) { const config = hexo.config.baidusitemap || {} const outputPath = config.path || 'baidusitemap.xml' const posts = locals.posts.toArray().filter(function(post) { return !post.draft }) const pages = locals.pages.toArray() const allItems = posts.concat(pages).sort(function(a, b) { const dateA = (a.updated || a.date) const dateB = (b.updated || b.date) return dateB - dateA }) const lines = [ '', '' ] allItems.forEach(function(item) { const dateObj = item.updated || item.date const dateStr = dateObj && dateObj.format ? dateObj.format('YYYY-MM-DD') : new Date(dateObj).toISOString().split('T')[0] lines.push(' ') lines.push(' ' + item.permalink + '') lines.push(' ' + dateStr + '') lines.push(' ') }) lines.push('') return { path: outputPath, data: lines.join('\n') } })