hexo-butterfly-swiper
Version:
A Slideshow plugin for theme-butterfly based on swiper
117 lines (110 loc) • 4.86 kB
JavaScript
// 全局声明插件代号
const pluginname = 'butterfly_swiper'
// 全局声明依赖
const pug = require('pug')
const path = require('path')
const urlFor = require('hexo-util').url_for.bind(hexo)
const util = require('hexo-util')
hexo.extend.filter.register('after_generate', function () {
// 获取所有文章
var posts_list = hexo.locals.get('posts').data;
var swiper_list = []
// 若文章的front_matter内设置了index和描述,则将其放到swiper_list内
for (var item of posts_list) {
if (item.swiper_index) {
swiper_list.push(item)
}
}
// 对swiper_list进行处理,使其按照index大小进行排序
function sortNumber(a, b) {
return a.swiper_index - b.swiper_index
}
swiper_list = swiper_list.sort(sortNumber);
// 排序反转,使得数字越大越靠前
swiper_list = swiper_list.reverse();
// =====================================================================
// 首先获取整体的配置项名称
const config = hexo.config.swiper || hexo.theme.config.swiper
// 如果配置开启
if (!(config && config.enable)) return
// 集体声明配置项
const data = {
pjaxenable: hexo.theme.config.pjax.enable,
enable_page: config.enable_page ? config.enable_page : "all",
exclude: config.exclude,
timemode: config.timemode ? config.timemode : "date",
layout_type: config.layout.type,
layout_name: config.layout.name,
layout_index: config.layout.index ? config.layout.index : 0,
error_img: config.error_img ? urlFor(config.error_img) : "https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif",
insertposition: config.insertposition ? config.insertposition : "afterbegin",
swiper_list: swiper_list,
default_descr: config.default_descr ? config.default_descr : "再怎么看我也不知道怎么描述它的啦!",
swiper_css: config.swiper_css ? urlFor(config.swiper_css) : "https://unpkg.zhimg.com/hexo-butterfly-swiper/lib/swiper.min.css",
swiper_js: config.swiper_js ? urlFor(config.swiper_js) : "https://unpkg.zhimg.com/hexo-butterfly-swiper/lib/swiper.min.js",
custom_css: config.custom_css ? urlFor(config.custom_css) : "https://unpkg.zhimg.com/hexo-butterfly-swiper/lib/swiperstyle.css",
custom_js: config.custom_js ? urlFor(config.custom_js) : "https://unpkg.zhimg.com/hexo-butterfly-swiper/lib/swiper_init.js"
}
// 渲染页面
const temple_html_text = config.temple_html ? config.temple_html : pug.renderFile(path.join(__dirname, './lib/html.pug'),data);
//cdn资源声明
//样式资源
const css_text = `<link rel="stylesheet" href="${data.swiper_css}" media="print" onload="this.media='all'"><link rel="stylesheet" href="${data.custom_css}" media="print" onload="this.media='all'">`
//脚本资源
const js_text = `<script defer src="${data.swiper_js}"></script><script defer data-pjax src="${data.custom_js}"></script>`
//注入容器声明
var get_layout
//若指定为class类型的容器
if (data.layout_type === 'class') {
//则根据class类名及序列获取容器
get_layout = `document.getElementsByClassName('${data.layout_name}')[${data.layout_index}]`
}
// 若指定为id类型的容器
else if (data.layout_type === 'id') {
// 直接根据id获取容器
get_layout = `document.getElementById('${data.layout_name}')`
}
// 若未指定容器类型,默认使用id查询
else {
get_layout = `document.getElementById('${data.layout_name}')`
}
//挂载容器脚本
var user_info_js = `<script data-pjax>
function ${pluginname}_injector_config(){
var parent_div_git = ${get_layout};
var item_html = '${temple_html_text}';
console.log('已挂载${pluginname}')
parent_div_git.insertAdjacentHTML("${data.insertposition}",item_html)
}
var elist = '${data.exclude}'.split(',');
var cpage = location.pathname;
var epage = '${data.enable_page}';
var flag = 0;
for (var i=0;i<elist.length;i++){
if (cpage.includes(elist[i])){
flag++;
}
}
if ((epage ==='all')&&(flag == 0)){
${pluginname}_injector_config();
}
else if (epage === cpage){
${pluginname}_injector_config();
}
</script>`
// 注入用户脚本
// 此处利用挂载容器实现了二级注入
hexo.extend.injector.register('body_end', user_info_js, "default");
// 注入样式资源
hexo.extend.injector.register('body_end', js_text, "default");
// 注入脚本资源
hexo.extend.injector.register('head_end', css_text, "default");
},
hexo.extend.helper.register('priority', function(){
// 过滤器优先级,priority 值越低,过滤器会越早执行,默认priority是10
const pre_priority = hexo.config.swiper.priority || hexo.theme.config.swiper.priority
const priority = pre_priority ? pre_priority : 10
return priority
})
)