This commit is contained in:
xaoxuu 2021-02-21 17:27:48 +08:00
parent 5caa8aa484
commit ba4008e57d
16 changed files with 352 additions and 224 deletions

View File

@ -147,7 +147,7 @@ plugins:
# image lazyload
# https://www.npmjs.com/package/vanilla-lazyload
lazyload:
enable: true
enable: true # [hexo clean && hexo s] is required after changing this value.
js: https://cdn.jsdelivr.net/npm/vanilla-lazyload@17.3.1/dist/lazyload.min.js
onlypost: false
loadingImg: # https://7.dusays.com/2021/02/14/e45d2469cdeaf.svg

View File

@ -22,6 +22,14 @@ meta:
comment_title: Join the discussion
back_to_top: Back to top
more: 'More %s'
created: 'Posted on'
updated: 'Updated on'
date_suffix:
just: Just
min: minutes ago
hour: hours ago
day: days ago
month: months ago
footer:
license: 'All articles in this blog are licensed under %s unless stating additionally.'

View File

@ -22,6 +22,14 @@ meta:
comment_title: 快来参与讨论吧
back_to_top: 回到顶部
more: '更多%s'
created: 发布于
updated: 更新于
date_suffix:
just: 刚刚
min: 分钟前
hour: 小时前
day: 天前
month: 个月前
footer:
license: '本博客所有文章除特别声明外,均采用 %s 许可协议。转载请注明出处!'

View File

@ -22,6 +22,14 @@ meta:
comment_title: 快來參與討論吧
back_to_top: 回到頂部
more: '更多%s'
created: 發表於
updated: 更新於
date_suffix:
just: 剛剛
min: 分鐘前
hour: 小時前
day: 天前
month: 個月前
footer:
license: '本網誌所有文章除特別聲明外,均採用 %s 許可協議。轉載請註明出處!'

View File

@ -15,8 +15,8 @@
}) %>
<% } %>
</div>
<div>
<time><%- date(page.date, config.date_format) %></time>
<div id='post-meta'>
<%- __('meta.created') %>&nbsp;<time datetime='<%- date_xml(page.date) %>'><%- date(page.date, config.date_format) %></time>
</div>
<% } else if (page.layout == 'wiki') { %>
<div>
@ -36,6 +36,9 @@
<a class='cap breadcrumb' href='<%- url_for(p.path) %>'><%- page.wiki %></a>
<% }); %>
</div>
<div id='post-meta'>
<%- __('meta.updated') %>&nbsp;<time datetime='<%- date_xml(page.updated) %>'><%- date(page.updated, config.date_format) %></time>
</div>
<% } else { %>
<div>
<a class='cap breadcrumb' href='/'><%- __('btn.home') %></a>

View File

@ -30,8 +30,8 @@ if (post.categories && post.categories.length > 0) {
<% } %>
</div>
<div class='meta cap'>
<span class='cap'>
<time><%= date(post.date, config.date_format) %></time>
<span class='cap' id='post-meta'>
<%- __('meta.created') %>&nbsp;<time datetime='<%- date_xml(post.date) %>'><%= date(post.date, config.date_format) %></time>
</span>
<% if (showCat) { %>
<% if (post.layout == 'post' && post.categories && post.categories.length > 0) { %>

View File

@ -1,5 +1,5 @@
<div class='float-panel mobile-only' style='display:none'>
<button type='button' class='sidebar-toggle mobile' onclick='toggleSidebar()'>
<button type='button' class='sidebar-toggle mobile' onclick='sidebar.toggle()'>
<svg class="icon" viewBox="0 0 1228 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2849"><path d="M0 0m97.390199 0l973.901995 0q97.390199 0 97.390199 97.390199l0 0q0 97.390199-97.390199 97.3902l-973.901995 0q-97.390199 0-97.390199-97.3902l0 0q0-97.390199 97.390199-97.390199Z" p-id="2850"></path><path d="M0 389.560798m97.390199 0l973.901995 0q97.390199 0 97.390199 97.390199l0 0q0 97.390199-97.390199 97.3902l-973.901995 0q-97.390199 0-97.390199-97.3902l0 0q0-97.390199 97.390199-97.390199Z" p-id="2851"></path><path d="M0 779.121596m97.390199 0l973.901995 0q97.390199 0 97.390199 97.390199l0 0q0 97.390199-97.390199 97.390199l-973.901995 0q-97.390199 0-97.390199-97.390199l0 0q0-97.390199 97.390199-97.390199Z" p-id="2852"></path></svg>
</button>
</div>

View File

@ -1,21 +1,44 @@
<script type="text/javascript">
stellar = {};
stellar.config = {
date_suffix: {
just: '<%- __('meta.date_suffix.just') %>',
min: '<%- __('meta.date_suffix.min') %>',
hour: '<%- __('meta.date_suffix.hour') %>',
day: '<%- __('meta.date_suffix.day') %>',
month: '<%- __('meta.date_suffix.month') %>',
},
};
// required plugins (only load if needs)
stellar.plugins = {
jQuery: '<%- url_for(theme.plugins.jquery || "https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js") %>',
issuesjs: '<%- url_for(theme.plugins.issuesjs || "/js/issues.js") %>',
};
// optional plugins
if ('<%- theme.plugins.lazyload.enable %>' == 'true') {
stellar.plugins.lazyload = Object.assign(<%- JSON.stringify(theme.plugins.lazyload) %>);
}
if ('<%- theme.plugins.swiper.enable %>' == 'true') {
stellar.plugins.swiper = Object.assign(<%- JSON.stringify(theme.plugins.swiper) %>);
}
if ('<%- theme.plugins.scrollreveal.enable %>' == 'true') {
stellar.plugins.scrollreveal = Object.assign(<%- JSON.stringify(theme.plugins.scrollreveal) %>);
}
if ('<%- theme.plugins.preload.enable %>' == 'true') {
stellar.plugins.preload = Object.assign(<%- JSON.stringify(theme.plugins.preload) %>);
}
</script>
<!-- required -->
<%- js({src: theme.plugins.jquery || 'https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js'}) %>
<% if (theme.stellar.cdn_js) { %>
<%- js({src: theme.stellar.cdn_js, async: true}) %>
<% } else { %>
<%- js({src: 'js/main.js', async: true}) %>
<%- js({src: '/js/main.js', async: true}) %>
<% } %>
<!-- optional -->
<%- partial('lazyload') %>
<%- partial('preload') %>
<%- partial('swiper') %>
<%- partial('scrollreveal') %>
<%- partial('../plugins/comments/script') %>
<!-- inject -->
@ -24,7 +47,3 @@
<%- js %>
<% }) %>
<% } %>
<!-- lazyload scripts -->
<%- partial('issues') %>

View File

@ -1,11 +0,0 @@
<script>
function loadIssuesJS() {
const issues = document.getElementById('issues-api');
if (issues != undefined) {
loadScript('<%- url_for(theme.plugins.issuesjs || "/js/issues.js") %>');
}
};
$(function () {
loadIssuesJS();
});
</script>

View File

@ -1,25 +0,0 @@
<% if (theme.plugins.lazyload && theme.plugins.lazyload.enable) { %>
<script defer src="<%- theme.plugins.lazyload.js || 'https://cdn.jsdelivr.net/npm/vanilla-lazyload@17/dist/lazyload.min.js' %>"></script>
<script>
// https://www.npmjs.com/package/vanilla-lazyload
// Set the options globally
// to make LazyLoad self-initialize
window.lazyLoadOptions = {
elements_selector: ".lazyload",
threshold: 0
};
// Listen to the initialization event
// and get the instance of LazyLoad
window.addEventListener(
"LazyLoad::Initialized",
function (event) {
window.lazyLoadInstance = event.detail.instance;
},
false
);
document.addEventListener('DOMContentLoaded', function () {
lazyLoadInstance.update();
});
</script>
<% } %>

View File

@ -1,16 +0,0 @@
<% if (theme.plugins.preload.enable && theme.plugins.preload.service) { %>
<% let preload = theme.plugins.preload; %>
<% if (preload.service == 'instant_page') { %>
<script async src="<%- preload.instant_page %>" type="module" defer integrity="sha384-OeDn4XE77tdHo8pGtE1apMPmAipjoxUQ++eeJa6EtJCfHlvijigWiJpD7VDPWXV1"></script>
<% } else if (preload.service == 'flying_pages') { %>
<script>
window.FPConfig = {
delay: 0,
ignoreKeywords: [],
maxRPS: 5,
hoverDelay: 25
};
</script>
<script defer src="<%- preload.flying_pages %>"></script>
<% } %>
<% } %>

View File

@ -1,12 +0,0 @@
<% if (theme.plugins.scrollreveal.enable && theme.plugins.scrollreveal.js) { %>
<%- js(theme.plugins.scrollreveal.js) %>
<script type="text/javascript">
ScrollReveal().reveal("body .reveal", {
distance: "<%- theme.plugins.scrollreveal.distance %>",
duration: "<%- theme.plugins.scrollreveal.duration %>",
interval: "<%- theme.plugins.scrollreveal.interval %>",
scale: "<%- theme.plugins.scrollreveal.scale %>",
easing: "ease-out",
});
</script>
<% } %>

View File

@ -1,29 +0,0 @@
<script>
function loadSwiper() {
if ($(".md").find(".swiper-container").length == 0) return;
loadCSS('<%- theme.plugins.swiper.css %>');
loadScript('<%- theme.plugins.swiper.js %>', () => {
var swiper = new Swiper('.swiper-container', {
slidesPerView: 'auto',
spaceBetween: 8,
centeredSlides: true,
zoom: true,
pagination: {
el: '.swiper-pagination',
clickable: true,
},
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
});
});
};
$(function () {
loadSwiper();
});
</script>

View File

@ -23,7 +23,7 @@ hexo.extend.tag.register('swiper', function(args, content) {
});
}
}
el += '<div class="tag-plugin swiper-container"';
el += '<div class="tag-plugin swiper-container" id="swiper-api"';
if (args.width && args.width.length > 0) {
el += ' ' + ArgsJoinTags(args, 'width').join(' ');
}

View File

@ -66,6 +66,8 @@ span.dot:before
content: '·'
span.sep:before
content: '/'
padding-left: 2px
padding-right: 2px
hr
color: var(--text-meta)

View File

@ -1,19 +1,44 @@
const l_body = document.querySelector('.l_body');
// utils
const util = {
// 懒加载 js
function loadScript(src, cb) {
setTimeout(function () {
var HEAD =
document.getElementsByTagName("head")[0] || document.documentElement;
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
if (cb) script.onload = cb;
script.setAttribute("src", src);
HEAD.appendChild(script);
});
// https://github.com/jerryc127/hexo-theme-butterfly
diffDate: (d, more = false) => {
const dateNow = new Date()
const datePost = new Date(d)
const dateDiff = dateNow.getTime() - datePost.getTime()
const minute = 1000 * 60
const hour = minute * 60
const day = hour * 24
const month = day * 30
let result
if (more) {
const monthCount = dateDiff / month
const dayCount = dateDiff / day
const hourCount = dateDiff / hour
const minuteCount = dateDiff / minute
if (monthCount > 12) {
result = null
} else if (monthCount >= 1) {
result = parseInt(monthCount) + ' ' + stellar.config.date_suffix.month
} else if (dayCount >= 1) {
result = parseInt(dayCount) + ' ' + stellar.config.date_suffix.day
} else if (hourCount >= 1) {
result = parseInt(hourCount) + ' ' + stellar.config.date_suffix.hour
} else if (minuteCount >= 1) {
result = parseInt(minuteCount) + ' ' + stellar.config.date_suffix.min
} else {
result = stellar.config.date_suffix.just
}
} else {
result = parseInt(dateDiff / day)
}
return result
},
// 懒加载 css https://github.com/filamentgroup/loadCSS
var loadCSS = function (href, before, media, attributes) {
loadCSS: (href, before, media, attributes) => {
var doc = window.document;
var ss = doc.createElement("link");
var ref;
@ -69,16 +94,58 @@ var loadCSS = function (href, before, media, attributes) {
ss.onloadcssdefined = onloadcssdefined;
onloadcssdefined(loadCB);
return ss;
};
// 弹出侧边栏
function toggleSidebar() {
},
// 从 butterfly 和 volantis 获得灵感
loadScript: (src, opt) => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = src
if (opt) {
for (let key of Object.keys(opt)) {
script[key] = opt[key]
}
} else {
// 默认异步,如果需要同步,第二个参数传入 {} 即可
script.async = true
}
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
}),
// https://github.com/jerryc127/hexo-theme-butterfly
jQuery: (fn) => {
if (typeof jQuery === 'undefined') {
util.loadScript(stellar.plugins.jQuery).then(fn)
} else {
fn()
}
},
}
// defines
const l_body = document.querySelector('.l_body');
const sidebar = {
toggle: () => {
if (l_body) {
l_body.classList.add('mobile');
l_body.classList.toggle("sidebar");
}
}
}
function setToc() {
const init = {
toc: () => {
util.jQuery(() => {
const scrollOffset = 32;
var segs = [];
$("article.md :header").each(function (idx, node) {
@ -108,20 +175,126 @@ function setToc() {
$('#toc a.toc-link:first').addClass("active")
}
}
});
}
function setSedebar() {
})
})
},
sidebar: () => {
util.jQuery(() => {
$("#toc a.toc-link").click(function(e) {
l_body.classList.remove("sidebar");
});
$("#toc a#s-top").click(function(e) {
l_body.classList.remove("sidebar");
});
})
},
relativeDate: (selector) => {
selector.forEach(item => {
const $this = item
const timeVal = $this.getAttribute('datetime')
let relativeValue = util.diffDate(timeVal, true)
if (relativeValue) {
$this.innerText = relativeValue
}
})
}
}
$(function () {
setToc();
setSedebar();
});
// init
init.toc()
init.sidebar()
init.relativeDate(document.querySelectorAll('#post-meta time'))
// scrollreveal
if (stellar.plugins.scrollreveal) {
util.loadScript(stellar.plugins.scrollreveal.js).then(function () {
ScrollReveal().reveal("body .reveal", {
distance: stellar.plugins.scrollreveal.distance,
duration: stellar.plugins.scrollreveal.duration,
interval: stellar.plugins.scrollreveal.interval,
scale: stellar.plugins.scrollreveal.scale,
easing: "ease-out",
});
})
}
// lazyload
if (stellar.plugins.lazyload) {
util.loadScript(stellar.plugins.lazyload.js, {defer:true})
// https://www.npmjs.com/package/vanilla-lazyload
// Set the options globally
// to make LazyLoad self-initialize
window.lazyLoadOptions = {
elements_selector: ".lazyload",
threshold: 0
};
// Listen to the initialization event
// and get the instance of LazyLoad
window.addEventListener(
"LazyLoad::Initialized",
function (event) {
window.lazyLoadInstance = event.detail.instance;
},
false
);
document.addEventListener('DOMContentLoaded', function () {
lazyLoadInstance.update();
});
}
// issuesjs
if (stellar.plugins.issuesjs) {
const issues_api = document.getElementById('issues-api');
if (issues_api != undefined) {
util.loadScript(stellar.plugins.issuesjs, {defer:true})
}
}
// swiper
if (stellar.plugins.swiper) {
const swiper_api = document.getElementById('swiper-api');
if (swiper_api != undefined) {
util.loadCSS(stellar.plugins.swiper.css);
util.loadScript(stellar.plugins.swiper.js, {defer:true}).then(function () {
var swiper = new Swiper('.swiper-container', {
slidesPerView: 'auto',
spaceBetween: 8,
centeredSlides: true,
zoom: true,
pagination: {
el: '.swiper-pagination',
clickable: true,
},
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
});
})
}
}
// preload
if (stellar.plugins.preload) {
if (stellar.plugins.preload.service == 'instant_page') {
util.loadScript(stellar.plugins.preload.instant_page, {
defer:true,
type:'module',
integrity: 'sha384-OeDn4XE77tdHo8pGtE1apMPmAipjoxUQ++eeJa6EtJCfHlvijigWiJpD7VDPWXV1'
})
} else if (stellar.plugins.preload.service == 'flying_pages') {
window.FPConfig = {
delay: 0,
ignoreKeywords: [],
maxRPS: 5,
hoverDelay: 25
};
util.loadScript(stellar.plugins.preload.flying_pages, {defer:true})
}
}