hexo-theme-stellar/source/js/main.js

197 lines
5.6 KiB
JavaScript
Raw Normal View History

2021-02-21 17:27:48 +08:00
// utils
const util = {
2021-02-19 23:33:19 +08:00
2021-02-21 17:27:48 +08:00
// 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
let result
if (more) {
const dayCount = dateDiff / day
const hourCount = dateDiff / hour
const minuteCount = dateDiff / minute
2024-02-09 21:15:07 +08:00
if (dayCount > 14) {
2021-02-21 17:27:48 +08:00
result = null
} else if (dayCount >= 1) {
2024-02-12 23:07:56 +08:00
result = parseInt(dayCount) + ' ' + ctx.date_suffix.day
2021-02-21 17:27:48 +08:00
} else if (hourCount >= 1) {
2024-02-12 23:07:56 +08:00
result = parseInt(hourCount) + ' ' + ctx.date_suffix.hour
2021-02-21 17:27:48 +08:00
} else if (minuteCount >= 1) {
2024-02-12 23:07:56 +08:00
result = parseInt(minuteCount) + ' ' + ctx.date_suffix.min
2021-02-21 17:27:48 +08:00
} else {
2024-02-12 23:07:56 +08:00
result = ctx.date_suffix.just
2021-02-20 14:56:07 +08:00
}
2021-02-21 17:27:48 +08:00
} else {
result = parseInt(dateDiff / day)
2021-02-20 14:56:07 +08:00
}
2021-02-21 17:27:48 +08:00
return result
},
2021-02-27 20:08:36 +08:00
copy: (id, msg) => {
const el = document.getElementById(id);
2021-02-25 13:12:04 +08:00
if (el) {
el.select();
document.execCommand("Copy");
2021-02-27 21:50:18 +08:00
if (msg && msg.length > 0) {
2024-01-05 19:43:39 +08:00
hud.toast(msg, 2500);
2021-02-27 21:50:18 +08:00
}
2021-02-25 13:12:04 +08:00
}
},
2021-02-27 20:08:36 +08:00
toggle: (id) => {
const el = document.getElementById(id);
2021-02-25 13:12:04 +08:00
if (el) {
el.classList.toggle("display");
}
},
2024-02-05 22:55:10 +08:00
scrollTop: () => {
window.scrollTo({top: 0, behavior: "smooth"});
},
scrollComment: () => {
document.getElementById('comments').scrollIntoView({behavior: "smooth"});
},
2021-02-19 23:33:19 +08:00
}
2021-02-27 20:08:36 +08:00
const hud = {
toast: (msg, duration) => {
2024-01-05 19:43:39 +08:00
const d = Number(isNaN(duration) ? 2000 : duration);
2021-02-27 20:08:36 +08:00
var el = document.createElement('div');
el.classList.add('toast');
2024-01-05 19:43:39 +08:00
el.classList.add('show');
2021-02-27 20:08:36 +08:00
el.innerHTML = msg;
document.body.appendChild(el);
2024-01-05 19:43:39 +08:00
setTimeout(function(){ document.body.removeChild(el) }, d);
2021-02-27 20:08:36 +08:00
},
}
2021-02-21 17:27:48 +08:00
// defines
const l_body = document.querySelector('.l_body');
const init = {
toc: () => {
2024-02-12 23:07:56 +08:00
utils.jq(() => {
2021-02-21 17:27:48 +08:00
const scrollOffset = 32;
var segs = [];
2022-11-23 22:44:11 +08:00
$("article.md-text :header").each(function (idx, node) {
2024-02-05 18:01:50 +08:00
segs.push(node);
2021-02-21 17:27:48 +08:00
});
2024-02-05 18:01:50 +08:00
function activeTOC() {
2021-02-21 17:27:48 +08:00
var scrollTop = $(this).scrollTop();
2024-02-05 18:01:50 +08:00
var topSeg = null;
2021-02-21 17:27:48 +08:00
for (var idx in segs) {
2024-02-05 18:01:50 +08:00
var seg = $(segs[idx]);
2021-02-21 17:27:48 +08:00
if (seg.offset().top > scrollTop + scrollOffset) {
2024-02-05 18:01:50 +08:00
continue;
2021-02-21 17:27:48 +08:00
}
if (!topSeg) {
2024-02-05 18:01:50 +08:00
topSeg = seg;
2021-02-21 17:27:48 +08:00
} else if (seg.offset().top >= topSeg.offset().top) {
2024-02-05 18:01:50 +08:00
topSeg = seg;
2021-02-21 17:27:48 +08:00
}
}
if (topSeg) {
2024-02-05 18:01:50 +08:00
$("#data-toc a.toc-link").removeClass("active");
var link = "#" + topSeg.attr("id");
2021-02-21 17:27:48 +08:00
if (link != '#undefined') {
2024-02-05 18:01:50 +08:00
const highlightItem = $('#data-toc a.toc-link[href="' + encodeURI(link) + '"]');
2022-12-16 23:45:36 +08:00
if (highlightItem.length > 0) {
2024-02-05 18:01:50 +08:00
highlightItem.addClass("active");
2022-12-16 23:45:36 +08:00
}
2021-02-21 17:27:48 +08:00
} else {
2024-02-05 18:01:50 +08:00
$('#data-toc a.toc-link:first').addClass("active");
2021-02-21 17:27:48 +08:00
}
}
2024-02-05 18:01:50 +08:00
}
function scrollTOC() {
const e0 = document.querySelector('#data-toc .toc');
const e1 = document.querySelector('#data-toc .toc a.toc-link.active');
if (e0 == null || e1 == null) {
return;
}
const offsetBottom = e1.getBoundingClientRect().bottom - e0.getBoundingClientRect().bottom + 100;
const offsetTop = e1.getBoundingClientRect().top - e0.getBoundingClientRect().top - 64;
if (offsetTop < 0) {
e0.scrollBy({top: offsetTop, behavior: "smooth"});
} else if (offsetBottom > 0) {
e0.scrollBy({top: offsetBottom, behavior: "smooth"});
}
}
var timeout = null;
window.addEventListener('scroll', function() {
activeTOC();
if(timeout !== null) clearTimeout(timeout);
timeout = setTimeout(function() {
scrollTOC();
2024-02-06 23:39:51 +08:00
}.bind(this), 50);
2024-02-05 18:01:50 +08:00
});
2021-02-21 17:27:48 +08:00
})
},
2024-02-09 21:15:07 +08:00
sidebar: () => {
2024-02-12 23:07:56 +08:00
utils.jq(() => {
2022-12-12 21:07:22 +08:00
$("#data-toc a.toc-link").click(function (e) {
2024-02-09 21:15:07 +08:00
sidebar.dismiss();
2021-02-21 17:27:48 +08:00
});
})
},
relativeDate: (selector) => {
selector.forEach(item => {
const $this = item
const timeVal = $this.getAttribute('datetime')
let relativeValue = util.diffDate(timeVal, true)
if (relativeValue) {
$this.innerText = relativeValue
}
})
2021-03-08 17:54:23 +08:00
},
/**
* Tabs tag listener (without twitter bootstrap).
*/
2022-01-21 11:24:32 +08:00
registerTabsTag: function () {
2021-03-08 17:54:23 +08:00
// Binding `nav-tabs` & `tab-content` by real time permalink changing.
2022-12-15 22:09:01 +08:00
document.querySelectorAll('.tabs .nav-tabs .tab').forEach(element => {
2021-03-08 17:54:23 +08:00
element.addEventListener('click', event => {
event.preventDefault();
// Prevent selected tab to select again.
if (element.classList.contains('active')) return;
// Add & Remove active class on `nav-tabs` & `tab-content`.
[...element.parentNode.children].forEach(target => {
target.classList.toggle('active', target === element);
});
// https://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers
const tActive = document.getElementById(element.querySelector('a').getAttribute('href').replace('#', ''));
[...tActive.parentNode.children].forEach(target => {
target.classList.toggle('active', target === tActive);
});
// Trigger event
tActive.dispatchEvent(new Event('tabs:click', {
bubbles: true
}));
});
});
window.dispatchEvent(new Event('tabs:register'));
},
2021-02-21 17:27:48 +08:00
}
// init
init.toc()
2024-02-09 21:15:07 +08:00
init.sidebar()
2021-02-21 17:27:48 +08:00
init.relativeDate(document.querySelectorAll('#post-meta time'))
2021-03-08 17:54:23 +08:00
init.registerTabsTag()