/**
* Sakura halo分支主题, 基于Siren制作
* @author LIlGG
* @url https://lixingyong.com
* @date 2020.06.01
*/
"use strict";
// 附加补充功能
var LIlGGAttachContext = {
// 补充功能的PJAX
PJAX: function () {
// 加载动态属性
LIlGGAttachContext.LA();
// 背景图片点击
LIlGGAttachContext.BGEVEN();
// 暂停背景视频
if (Poi.headFocus && Poi.bgvideo) LIlGGAttachContext.BGV().bgPause();
// 渲染主题
LIlGGAttachContext.CBG().changeSkinSecter();
try {
$("#to-load-aplayer").on("click", function () {
reloadAplayer();
$("div").remove(".load-aplayer");
});
if ($("div").hasClass("aplayer")) {
reloadAplayer();
}
} catch (e) { }
Poi.toc && LIlGGAttachContext.TOC(); // 文章目录
LIlGGAttachContext.MINI_CODE(); // 迷你代码块
PageAttr.isPost === "true" && LIlGGAttachContext.POST_CONTEXT(); // 文章内容处理
LIlGGAttachContext.CHS(); // 代码样式
LIlGGAttachContext.PHO(); // 图库功能
LIlGGAttachContext.CMN(); // 评论组件
LIlGGAttachContext.SS(); // 日志功能
// i18n
I18N.init();
},
// 背景视频
BGV: function () {
var $bg_video_btn = $("#video-btn"),
$bg_video = $("#bgvideo"),
$bg_video_stu = $(".video-stu"),
$bg_video_add = $("#video-add"),
dom = $bg_video[0],
flvPlayer,
mediaBlob;
var bindBgVideoEvent = function () {
$bg_video_btn.on("click", function () {
if ($(this).hasClass("loadvideo")) {
$(this).removeClass("loadvideo").hide();
loadSource();
} else {
if ($(this).hasClass("video-pause")) {
bgPause();
$bg_video_btn.removeClass("videolive");
} else {
bgPlay();
$bg_video_btn.addClass("videolive");
}
}
});
dom.oncanplay = function () {
bgPlay();
$bg_video_add.show();
$bg_video_btn.addClass("videolive");
$bg_video_btn.addClass("haslive");
};
dom.onended = function () {
defaultStyle();
flvPlayer.pause()
flvPlayer.unload()
flvPlayer.detachMediaElement()
flvPlayer.destroy()
flvPlayer = null
};
$bg_video_add.on("click", function () {
loadSource();
});
};
var defaultStyle = function () {
$bg_video_add.hide();
$bg_video_btn.addClass("loadvideo").removeClass("video-pause");
$bg_video_btn.removeClass("videolive");
$bg_video_btn.removeClass("haslive");
$(".focusinfo").css({
top: "49.3%",
});
}
var bgPlay = function () {
$bg_video_btn.addClass("video-pause").removeClass("video-play").show();
$bg_video_stu.css({
bottom: "-100px",
});
$(".focusinfo").css({
top: "-999px",
});
$("#banner_wave_1").addClass("banner_wave_hide");
$("#banner_wave_2").addClass("banner_wave_hide");
flvPlayer.play();
};
var bgPause = function () {
if (dom.oncanplay != undefined && $(".haslive").length > 0) {
$bg_video_btn.addClass("video-play").removeClass("video-pause");
$bg_video_stu
.css({
bottom: "0px",
})
.html("已暂停 ...");
$(".focusinfo").css({
top: "49.3%",
});
$("#banner_wave_1").removeClass("banner_wave_hide");
$("#banner_wave_2").removeClass("banner_wave_hide");
dom.pause();
}
};
try {
var loadSource = function () {
function handleResult(result) {
var config;
$bg_video_stu.html("正在载入视频 ...").css({
bottom: "0px",
});
// 这里开始自定义的选项,根据不同的服务接口,处理不同的逻辑(具有较强的独特性)
switch (result.server) {
case "bilibili":
switch (result.type) {
case "mp4":
result["url"] = result["playUrl"][0]["url"];
break;
case "m4s":
throw new RuntimeException("目前暂不支持m4s格式");
default:
if (result.type.indexOf("flv") != -1) {
result.type = "flv";
}
result["segments"] = result["playUrl"];
for (var i = 0; i < result["segments"].length; i++) {
result["segments"][i]["duration"] = result["segments"][i]["length"];
result["segments"][i]["filesize"] = result["segments"][i]["size"];
}
var isCache = result["segments"][0]["isCached"]
config = isCache ? {
enableStashBuffer: true,
} : {
rangeLoadZeroStart: true,
enableStashBuffer: false,
lazyLoadMaxDuration: 8,
lazyLoadRecoverDuration: 5
}
break;
}
break;
case "local":
// 获取后缀
var urladdr = result.url.split('?')[0].split('/');
var type = urladdr[urladdr.length - 1].split('.')[1];
if (type != "mp4" && type != "flv") {
throw new RuntimeException("无法解析的播放格式");
}
result["type"] = type;
break;
}
playVideo(result, config);
}
function playVideo(result, config = {}) {
var mediaDataSource = {
type: result.type,
url: result.url || ''
};
if (result.segments) {
mediaDataSource.segments = result.segments;
}
// 关闭日志
flvjs.LoggingControl.enableAll = false;
flvjs.LoggingControl.enableError = true;
flvPlayer = flvjs.createPlayer(mediaDataSource, config);
flvPlayer.attachMediaElement(dom);
flvPlayer.load();
}
if (mediaBlob) {
$bg_video.attr("src", mediaBlob);
return;
}
var b = "https://api.lixingyong.com/api/:server?type=urllist&id=:id&cid=:cid&qn=:qn&vtype=:vtype&r=:r";
"undefined" != typeof bg_video_api && (b = bg_video_api);
var dom = $bg_video[0];
var url = dom.dataset.url;
var id = dom.dataset.id;
if (url) {
var source = {
title: dom.dataset.name || dom.dataset.title || "Video name",
url: dom.dataset.url,
server: "local"
};
handleResult(source);
} else if (id) {
var api = dom.dataset.api || b;
api = api
.replace(":server", dom.dataset.server || 'bilibili')
.replace(":id", id)
.replace(":cid", dom.dataset.cid || '')
.replace(":qn", dom.dataset.qn || '')
.replace(":vtype", dom.dataset.vtype || '')
.replace(":r", Math.random());
var http = new XMLHttpRequest();
(http.onreadystatechange = function () {
if (
4 === http.readyState &&
((200 <= http.status && 300 > http.status) || 304 === http.status)
) {
var source = JSON.parse(http.responseText);
source["server"] = dom.dataset.server || 'bilibili';
handleResult(source);
}
}),
http.open("get", api, true),
http.send();
}
};
} catch (e) {
Log.e("video", e.msg)
defaultStyle();
}
if (
dom != undefined &&
dom.oncanplay == undefined &&
document.body.clientWidth > 860 &&
Poi.windowheight != "fixed"
) {
bindBgVideoEvent();
}
return {
bgPause: bgPause,
};
},
// 文章列表动画
PLSA: function () {
// 首次加载时判断图片是否足够显示完整
$("article.post-list-thumb:not(.post-list-show)").each(function (
index,
item
) {
var pTop = item.getBoundingClientRect().top;
var window_height = $(window).height();
if (pTop <= window_height) {
$(item).addClass("post-list-show");
} else {
return false;
}
});
$(window).scroll(function () {
var window_height = $(window).height();
var hide_post_thumb_first = $(
"article.post-list-thumb:not(.post-list-show):first"
);
if (hide_post_thumb_first.length > 0) {
var pTop = hide_post_thumb_first[0].getBoundingClientRect().top;
if (pTop <= window_height)
hide_post_thumb_first.addClass("post-list-show");
}
});
},
// 文章目录
TOC: function () {
if (document.body.clientWidth <= 1200) {
return;
}
var baseTopPadding = 240,
maxToppadding = 134,
offset = 100,
bottomOffset = 30;
if ($("div").hasClass("toc")) {
$(".toc-container").css("height", $(".site-content").outerHeight());
} else {
// 纠正TOC为空时,警告问题
return;
}
$(".entry-content , .links")
.children("h1,h2,h3,h4,h5")
.each(function (index) {
var hyphenated = "toc-head-" + index;
$(this).attr("id", hyphenated);
});
tocbot.init({
tocSelector: ".toc",
contentSelector: [".entry-content", ".links"],
headingSelector: "h1, h2, h3, h4, h5",
collapseDepth: !!PageAttr.metas.tocDepth && [0,1,2,3,4,5].includes(Number(PageAttr.metas.tocDepth)) ? Number(PageAttr.metas.tocDepth) : Poi.tocDepth,
hasInnerContainers: false,
headingsOffset:
$("#page").find(".pattern-center").length > 0 ? -500 : -230,
scrollEndCallback: function (e) {
if ($(".is-active-link").length == 0) {
return;
}
if ($(window).scrollTop() == 0) {
$(".toc").animate({
scrollTop: 0,
});
return;
}
var activeLikeOffset =
$(".is-active-link").offset().top - $(window).scrollTop();
// 当前可视高度小于100,则滚动时toc向上偏移一个li的高度
if (activeLikeOffset < offset) {
$(".toc").animate({
scrollTop:
$(".toc").scrollTop() -
(offset - activeLikeOffset + $(".is-active-link").height()),
});
} else if (activeLikeOffset > $(window).height() - bottomOffset) {
$(".toc").animate({
scrollTop: $(".toc").scrollTop() + (activeLikeOffset - offset),
});
}
},
});
var interval = setInterval(function () {
if(document.readyState == "complete"){
$(".toc").css(
"max-height",
$(document).scrollTop() + ($(window).height() - baseTopPadding) + "px"
);
$(".toc-container").css(
"height",
$(document).scrollTop() + ($(window).height() - baseTopPadding) + "px"
);
$(window).scroll(function () {
var s = $(document).scrollTop();
if (s == 0) {
$(".toc").css(
"max-height",
$(document).scrollTop() +
($(window).height() - baseTopPadding) +
"px"
);
} else if (s > offset) {
$(".toc").css(
"max-height",
$(window).height() - maxToppadding + "px"
);
} else {
$(".toc").css(
"max-height",
$(document).scrollTop() +
($(window).height() - baseTopPadding) +
"px"
);
}
});
clearInterval(interval);
}
},2000);
},
// 文章代码样式
CHS: function () {
var attributes = {
autocomplete: "off",
autocorrect: "off",
autocapitalize: "off",
spellcheck: "false",
contenteditable: "false",
design: "by LIlGG",
};
$("pre").each(function (i, item) {
var $code = $(this).children("code");
var classNameStr = $code[0].className;
var classNameArr = classNameStr.split(" ");
var lang = "";
classNameArr.some(function (className) {
if (className.indexOf("language-") > -1) {
lang = className.substring(
className.indexOf("-") + 1,
className.length
);
return true;
}
});
// 检测语言是否存在,不存在则自动检测
var language = hljs.getLanguage(lang.toLowerCase());
if (language == undefined) {
// 启用自动检测
var autolanguage = hljs.highlightAuto($code.text());
$code.removeClass("language-" + lang);
lang = autolanguage.language;
if(lang == undefined) {
lang = "text";
}
$code.addClass("language-" + lang);
} else {
lang = language.name;
}
$(this).addClass("highlight-wrap");
$(this).attr(attributes);
$code.attr("data-rel", lang.toUpperCase()).addClass(lang.toLowerCase());
// 启用代码高亮
hljs.highlightBlock($code[0]);
// 启用代码行号
if (Poi.codeLine) hljs.lineNumbersBlock($code[0]);
});
/**
* [#23](https://github.com/LIlGG/halo-theme-sakura/issues/23) 减少失误,将单击改为双击
*/
$("pre").on("dblclick", function (e) {
if (e.target !== this) return;
$(this).toggleClass("code-block-fullscreen");
$("html").toggleClass("code-block-fullscreen-html-scroll");
});
$("pre code").each(function (i, block) {
$(block).attr({
id: "hljs-" + i,
});
$(this).after(
''
);
new ClipboardJS(".copy-code");
});
},
// 主题切换
CBG: function () {
var themeConfig = {};
/**
* 检查并回显主题
*/
var checkBgImgEcho = function () {
var configTag = Util.getCookie("bgTagClass");
if(!configTag) {
configTag = Poi.defaultTheme;
}
var bgConfigTags = Object.keys(bgConfig);
// 默认为bg_0
bgConfigTags.includes(configTag) ? configTag : Poi.defaultTheme;
// 切换主题
changeBg(configTag);
};
/**
* 切换主题开关
*/
var changeSkinGear = function () {
// 这里使用off来解决匿名空间的问题
$(".changeSkin-gear")
.off("click")
.on("click", function () {
$(".skin-menu").toggleClass("show");
});
//绑定主题子项点击事件
Object.keys(bgConfig).forEach(function (currBg) {
$(".skin-menu " + "#" + currBg).on("click", function () {
changeBg(currBg, function () {
// 保存tagClass, 方便下次查询
Util.setCookie("bgTagClass", currBg, 30);
// 绑定完之后隐藏主题开关
$(".skin-menu").removeClass("show");
setTimeout(function () {
$(".changeSkin-gear").css("visibility", "visible");
}, 300);
});
});
});
// 显示切换主题功能
$(".changeSkin-gear").css("visibility", "visible");
};
/**
* 根据tagClass切换主题
* @param {*} tagClass
*/
var changeBg = function (tagClass, callback) {
var bgAttr = bgConfig[tagClass];
if (!bgAttr) return;
themeConfig.bgAttr = bgAttr;
$("body").removeAttr("style");
$("body").css(
"background-image",
bgAttr["url"] == "" ? "none" : "url(" + bgAttr["url"] + ")"
);
changeSkinSecter();
// 回调切换主题方法
!callback || typeof callback == "undefined" || callback == undefined
? false
: callback(bgAttr["isNight"]);
};
/**
* 主题部分渲染
*/
var changeSkinSecter = function () {
// 渲染主题,如果配置不存在则直接返回
if (Object.getOwnPropertyNames(themeConfig).length == 0) {
return;
}
var bgAttr = themeConfig.bgAttr;
// 如果为黑夜模式,也会影响到评论组件
var comments = document.getElementsByTagName("halo-comment");
// 删除以 theme_ 开头的 class
Util.removeClassByPrefix($("body")[0], "theme_");
// 增加 class
$("body").remove("theme_" + bgAttr["id"]);
$("body").addClass("theme_" + bgAttr["id"]);
// 黑夜模式下
if (bgAttr["isNight"]) {
$("html").css("background", "#31363b");
$(".site-content").css("background-color", "#fff");
$("body").addClass("dark");
for (var i = 0; i < comments.length; i++) {
var shadowDom = comments[i].shadowRoot.getElementById("halo-comment");
$(shadowDom).addClass("dark")
}
} else {
$("html").css("background", "unset");
$("body").removeClass("dark");
$(".site-content").css("background-color", "rgba(255, 255, 255, .8)");
for (var i = 0; i < comments.length; i++) {
var shadowDom = comments[i].shadowRoot.getElementById("halo-comment");
$(shadowDom).removeClass("dark")
}
}
switch (bgAttr["strategy"]) {
case "no-repeat":
$("body").css("background-repeat", "no-repeat");
break;
case "repeat":
$("body").css("background-repeat", "repeat");
break;
case "cover":
$("body").css("background-size", "cover");
break;
default:
break;
}
};
// 检查cookie并回显
if (document.body.clientWidth > 860) {
checkBgImgEcho();
// 切换主题开关
changeSkinGear();
}
return {
changeSkinSecter: changeSkinSecter,
};
},
// 移动端回到顶部
MGT: function () {
var offset = 20,
scroll_top_duration = 700,
$m_back_to_top = $(".m-cd-top");
$(window).scroll(function () {
if ($(this).scrollTop() > offset) {
$m_back_to_top.addClass("cd-is-visible");
} else {
$m_back_to_top.removeClass("cd-is-visible");
}
});
$m_back_to_top.on("click", function (event) {
event.preventDefault();
$("body,html").animate(
{
scrollTop: 0,
},
scroll_top_duration
);
});
},
// 复制提示
CPY: function () {
document.body.addEventListener("copy", function (e) {
if (Poi.copyrightNotice && window.getSelection().toString().length > 30) {
setClipboardText(e);
}
if (toast) {
toast.create("复制成功!
Copied to clipboard successfully!", 2000);
}
});
var setClipboardText = function (event) {
event.preventDefault();
var htmlData =
"# 商业转载请联系作者获得授权,非商业转载请注明出处。
" +
"# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.
" +
"# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
" +
"# 作者(Author):" +
Poi.nickname +
"
" +
"# 链接(URL):" +
window.location.href +
"
" +
"# 来源(Source):" +
Poi.sitename +
"
" +
window.getSelection().toString().replace(/\r\n/g, "
");
var textData =
"# 商业转载请联系作者获得授权,非商业转载请注明出处。\n" +
"# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.\n" +
"# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)\n" +
"# 作者(Author):" +
Poi.nickname +
"\n" +
"# 链接(URL):" +
window.location.href +
"\n" +
"# 来源(Source):" +
Poi.sitename +
"\n\n" +
window.getSelection().toString().replace(/\r\n/g, "\n");
if (event.clipboardData) {
event.clipboardData.setData("text/html", htmlData);
event.clipboardData.setData("text/plain", textData);
} else if (window.clipboardData) {
return window.clipboardData.setData("text", textData);
}
};
},
// 图库功能
PHO: function () {
var $photoPage = $(".photo-page");
// 判断当前是否为图库界面
if ($photoPage.length == 0) {
return;
}
// 渲染图库信息
var $masonrys = $(".masonry-gallery.gallery");
var justify = function () {
var option = {
margins: isNaN(Poi.photosGutter) ? 10 : Number(Poi.photosGutter),
rowHeight: 200,
}
// 默认过滤
if (Poi.defaultGroup) {
var filter = "." + Poi.defaultGroup;
$("#gallery-filter li a").removeClass("active");
$("#gallery-filter li a").each(function() {
if ($(this).data("filter") == filter) {
$(this).addClass("active");
return false;
}
})
option.filter = filter
}
$masonrys.justifiedGallery(option);
// 过滤
$("#gallery-filter li a").on("click", function () {
$("#gallery-filter li a").removeClass("active");
$(this).addClass("active");
var dataFilter = $(this).data("filter");
$masonrys.justifiedGallery({
filter: dataFilter,
});
return false;
});
};
var masonry = function () {
var option =
Poi.photosStyle == "masonry"
? {
masonry: {
gutter: isNaN(Poi.photosGutter) ? 10 : Number(Poi.photosGutter),
},
itemSelector: ".gallery-item",
}
: {
layoutMode: "packery",
packery: {
columnWidth: 100,
gutter: isNaN(Poi.photosGutter) ? 10 : Number(Poi.photosGutter),
},
itemSelector: ".gallery-item",
};
// 默认过滤
if (Poi.defaultGroup) {
var filter = "." + Poi.defaultGroup;
$("#gallery-filter li a").each(function() {
$("#gallery-filter li a").removeClass("active");
if ($(this).data("filter") == filter) {
$(this).addClass("active");
return false;
}
})
option.filter = filter
}
$masonrys.find("img.lazyload").on('load', function () {
$(this).parents(".gallery-item").css("background", "#222");
delete option.filter;
$masonrys.isotope(option);
})
// 过滤
$("#gallery-filter li a").on("click", function () {
$("#gallery-filter li a").removeClass("active");
$(this).addClass("active");
var dataFilter = $(this).data("filter");
$masonrys.isotope({
filter: dataFilter,
});
return false;
});
if (Poi.photosStyle == "masonry") {
// 切换风格
$("#grid-changer a").on("click", function () {
$("#grid-changer a").removeClass("active");
$(this).toggleClass("active");
for (var i = 2; i < 9; i++) {
$masonrys.find(".gallery-item").removeClass("col-" + i);
}
$masonrys.find(".gallery-item").toggleClass($(this).closest("li").attr("class"));
$masonrys.isotope(option);
});
}
};
if ($masonrys.length > 0) {
if (Poi.photosStyle == "masonry" || Poi.photosStyle == "packery") {
masonry();
} else {
justify();
}
}
},
// 日志
SS: function () {
if ($(".journal").length > 0) {
var journalIds = Util.getLocalStorage("journalIds") || [];
$(".journal").each(function () {
let that = $(this);
let idDoms = that.attr("id").split("-");
let jid = Number(idDoms[idDoms.length - 1]);
// 为日志设置时间图标
var $firstSpan =that.find(".journal-time>span").first();
if ($firstSpan.find("i").length == 0) {
$firstSpan.prepend(
' '
);
}
// 为所有图片增加box
var $imgs = that.find(".journal-label img:not('.avatar')");
$imgs.each(function () {
if (!$(this).hasClass("journal-img")) {
$(this)
.addClass("journal-img")
.wrap(
''
);
}
});
// 为说说评论增加额外 class
if (Poi.journalComment) {
var comment = that.find("halo-comment");
if (comment.length > 0) {
var $comment = $(comment[0].shadowRoot.getElementById("halo-comment"));
if (!$comment.hasClass("journal")) {
$comment.addClass("journal");
}
// 如果是黑夜模式,还需要额外添加黑夜模式 class
if ($("body").hasClass("dark") && !$comment.hasClass("dark")) {
$comment.addClass("dark");
}
}
// 说说评论展开/收起
that.find(".journal-label .comment-js").off("click").on("click", function () {
that.find(".journal-label .comment").toggle();
});
}
if (Poi.journalLikes) {
// 说说是否已经点赞
var $like = that.find(".journal-label .journal-like")
if ($like.length > 0) {
journalIds.includes(jid) ? $like.addClass("on") : "";
// 说说点赞
that.find(".journal-label .journal-like").off("click").on("click", function () {
// 目前仅能前端控制是否已经点赞
var $dom = $(this)
var links = $dom.data("links")
journalIds = Util.getLocalStorage("journalIds") || [];
var flag = journalIds.includes(jid);
if (flag) {
return;
}
$.ajax({
url: "/api/content/journals/" + jid + "/likes",
type: "post",
dataType: "json",
success(res) {
if (res.status !== 200) {
Log.e(res.message);
return;
}
links++;
journalIds.push(jid);
$dom.addClass("on");
Util.setLocalStorage("journalIds", journalIds, 60 * 60 * 24);
$dom.children( ":last-child").text(links);
$dom.data("links", links);
}
})
});
}
}
});
}
},
// 评论组件
CMN: function () {
var comments = $("halo-comment");
for (var i = 0; i < comments.length; i++) {
// 复制一个css副本
var commentStyle = $("#comment-style").clone();
commentStyle.attr("media", "all");
// 注入外部css
if (!comments[i].shadowRoot.getElementById("comment-style")) {
comments[i].shadowRoot.appendChild(commentStyle[0]);
}
}
},
// 背景视频点击切换
BGEVEN: function() {
function nextBG() {
if (Poi.coverOpen == 'true' && Poi.rimageUrl != '') {
var url = new URL($(".centerbg").css("background-image").split("\"")[1]);
if(!url) {
return;
}
if(Poi.coverNum == 0) {
url.searchParams.set("t", new Date().getTime());
} else {
url.searchParams.set("t", (url.searchParams.get("t") % Poi.coverNum) + 1)
}
$(".centerbg").css("background-image", "url(" + url.href + ")");
}
}
function preBG() {
if (Poi.coverOpen == 'true' && Poi.rimageUrl != '') {
var url = new URL($(".centerbg").css("background-image").split("\"")[1]);
if(!url) {
return;
}
if(Poi.coverNum == 0) {
url.searchParams.set("t", new Date().getTime());
} else {
var t = url.searchParams.get("t");
t = t - 1 || Poi.coverNum
url.searchParams.set("t", t);
}
$(".centerbg").css("background-image", "url(" + url.href + ")");
}
}
$("#bg-next").on('click', function() {
nextBG();
});
$("#bg-pre").on('click', function() {
preBG();
});
},
/**
* 发送 Email
*/
TOMAIL: function() {
if(!Poi.meEmail) {
return;
}
var mail = "mailto:" + Poi.meEmail;
window.open(mail);
},
LA: function() {
},
// 内容提示块
MINI_CODE: function() {
if (!!$('.is-homepage')[0]) {
return;
}
const reg = new RegExp("(?<=]).+(?=\\[/)","g")
const noway = new RegExp("(?=\\[noway])(\\S*)(\\[/noway]=?)","g");
const buy = new RegExp("(?=\\[buy])(\\S*)(\\[/buy]=?)","g");
const task = new RegExp("(?=\\[task])(\\S*)(\\[/task]=?)","g");
const warning = new RegExp("(?=\\[warning])(\\S*)(\\[/warning]=?)","g");
let $contentDom = $('.site-content p');
if (!$contentDom) {
return;
}
$contentDom.each(function () {
var text = $(this).html();
// 获取提示块中的内容提示信息及类型
text = text.replace(noway, (text) => {
return createToast("noway", text.match(reg)[0]);
})
text = text.replace(buy, (text) => {
return createToast("buy", text.match(reg)[0]);
})
text = text.replace(task, (text) => {
return createToast("task", text.match(reg)[0]);
})
text = text.replace(warning, (text) => {
return createToast("warning", text.match(reg)[0]);
})
$(this).html(text)
})
function createToast(type, msg) {
var icon = "";
switch (type) {
case "noway":
icon = "fa fa-exclamation-circle";
break;
case "buy":
icon = "fa fa-check-square";
break;
case "task":
icon = "fa fa-tasks";
break;
case "warning":
icon = "fa fa-warning";
break;
default:
break;
}
if (icon === '') {
return `${ msg }
`;
}
return `${ msg }
`;
}
},
// 内容处理
POST_CONTEXT: function() {
const normal = "rgba(167, 210, 226, 1)";
const medium = "rgba(255, 197, 160, 1)";
const difficulty = "rgba(239, 206, 201, 1)";
var msg, div, remind;
var contentDom = document.getElementsByClassName("entry-content")[0];
if (Poi.isPostWordCountToast === "true") {
var coefficient = 3;
if (!!PageAttr.metas.level) {
coefficient = Number(PageAttr.metas.level);
}
if (!!PageAttr.postWordCount) {
var color = "";
var oldWordCount = PageAttr.postWordCount;
var wordCount = Number(PageAttr.postWordCount.replaceAll(",", ""));
var seconds = Util.caclEstimateReadTime(wordCount, coefficient);
var timeStr = Util.minuteToTimeString(seconds);
// 时间段为 x 0<=10<=30<=+∞ 分钟
if (seconds <= (60 * 10)) {
remind = Poi.postWordCountToastNormal || "文章篇幅适中,可以放心阅读。";
color = normal;
} else if (seconds <= (60 * 30) && seconds > (60 * 10)) {
remind = Poi.postWordCountToastMedium || "文章比较长,建议分段阅读。"
color = medium;
} else {
remind = Poi.postWordCountToastDifficulty || "文章内容很长,提前准备好咖啡!!!"
color = difficulty;
}
msg = `文章共 ${oldWordCount} 字,全部阅读完预计需要 ${timeStr}。 ${remind}`;
div = buildToastDiv("word_count", color, msg);
contentDom.insertAdjacentHTML("afterbegin", div);
}
}
if (Poi.isPostEditTimeToast === "true") {
// 获取上次至今的时间差
var editTime = new Date(PageAttr.postEditTime);
if (!isNaN(editTime.getTime())) {
var time = new Date().getTime() - editTime.getTime();
var sinceLastTime = Util.timeAgo(editTime.getTime());
// 时间段为 x 0<=1<=3<=+∞ 月
if (time <= (1000 * 60 * 60 * 24 * 30)) {
remind = Poi.postEditTimeToastNormal || "近期有所更新,请放心阅读!";
color = normal;
} else if (time > (1000 * 60 * 60 * 24 * 30) && time <= (1000 * 60 * 60 * 24 * 90)) {
remind = Poi.postEditTimeToastMedium || "文章距上次编辑时间较远,部分内容可能已经过时!";
color = medium;
} else {
remind = Poi.postEditTimeToastDifficulty || "文章内容已经很陈旧了,也许不再适用!";
color = difficulty;
}
msg = `文章内容上次编辑时间于 ${sinceLastTime}。 ${remind}`;
div = buildToastDiv("last_time", color, msg);
contentDom.insertAdjacentHTML("afterbegin", div);
}
}
var contentToast = contentDom.getElementsByClassName("content_toast");
Array.prototype.forEach.call(contentToast, (content) => {
var i = content.getElementsByTagName("i")[0];
i.onclick = function () {
content.classList.toggle('hide');
}
})
function buildToastDiv(type, color, msg) {
return `
${ msg }
`
}
}
};
/**
* 图片加载失败/错误后的替补方案
* @param {Document} ele 失败的图片do
*/
var imgError = function (ele) {
ele.src = "https://cdn.lixingyong.com/2020/07/18/98fca04416944b282a558b98b2131879.png";
};
/**
* 根据日期时间,获取对应的图标
* @param {*} time
*/
var getTimeIcon = function (time) {
var ICON_DAY = "kaiqitaiyangguangshezhi",
ICON_MORN = "gengzaotubiao_tianqi-qingchen",
ICON_NIGHT = "yueliang";
var date = new Date(time);
var hours = date.getHours();
if (isNaN(hours)) {
return ICON_DAY;
}
if (5 <= hours && hours < 12) {
return ICON_MORN;
} else if (12 <= hours && hours < 18) {
return ICON_DAY;
} else {
return ICON_NIGHT;
}
};
/**
* pjax功能
*/
var pjaxFun = function () {
$(document)
.pjax("a[target!=_top][target!=_blank]", "#page", {
fragment: "#page",
timeout: 8000,
})
.on("pjax:send", function () {
NProgress.start();
Siren.MNH();
})
.on("pjax:complete", function () {
Siren.AH();
Siren.PE();
Siren.CE();
// 额外加载的pjax
LIlGGAttachContext.PJAX();
NProgress.done();
$("#loading").fadeOut(500);
})
.on("submit", ".search-form,.s-search", function (event) {
event.preventDefault();
$.pjax.submit(event, "#page", {
fragment: "#page",
timeout: 8000,
});
if ($(".js-search.is-visible").length > 0) {
$(".js-toggle-search").toggleClass("is-active");
$(".js-search").toggleClass("is-visible");
}
});
window.addEventListener(
"popstate",
function (e) {
Siren.AH();
Siren.PE();
Siren.CE();
},
false
);
};
var home = location.href,
Siren = {
// 移动端菜单
MN: function () {
$(".iconflat").on("click", function () {
$("body").toggleClass("navOpen");
$("#main-container,#mo-nav,.openNav").toggleClass("open");
});
},
// 移动端菜单自动隐藏
MNH: function () {
if ($("body").hasClass("navOpen")) {
$("body").toggleClass("navOpen");
$("#main-container,#mo-nav,.openNav").toggleClass("open");
}
},
// 自适应窗口高度
AH: function () {
if (Poi.windowheight == "auto") {
if (window.outerWidth <= 860) {
$("#centerbg").css({ height: 300 });
$(".headertop").addClass("headertop-bar");
return;
}
$(".headertop").removeClass("headertop-bar");
if ($("h1.main-title").length > 0) {
var _height = $(window).height();
$("#centerbg").css({ height: _height });
$("#bgvideo").css({ "min-height": _height });
$(window).resize(function () {
Siren.AH();
});
}
} else {
$(".headertop").addClass("headertop-bar");
}
},
// 进程
PE: function () {
if ($(".headertop").length > 0) {
if ($("h1.main-title").length > 0) {
$(".blank").css({ "padding-top": "0px" });
$(".headertop").css({ height: "auto" }).show();
} else {
$(".blank").css({ "padding-top": "5.2%" });
$(".headertop").css({ height: "0px" }).hide();
}
}
// table
if ($(".entry-content").children("table").length > 0) {
$(".entry-content")
.children("table")
.wrap("");
}
// 为文章中的图片增加灯箱设置,并在图片加载完成之后,重新计算菜单高度
if (
$(".entry-content").length > 0 &&
$(".entry-content").find("img").length > 0
) {
var $imgs = $(".entry-content").find("img");
$imgs.each(function () {
if (!$(this).hasClass("gallery-img")) {
$(this)
.addClass("gallery-img")
.wrap(
''
);
}
});
}
// 标签云
if (
$("#tag-wordcloud").length > 0 &&
$("#tag-wordcloud").children().length == 0
) {
$("#tag-wordcloud").jQCloud(wordcloud, {
autoResize: true,
delayedMode: true,
});
}
// 标签
if ($(".chip").length > 0) {
$(".chip").each(function () {
$(this).css(
"background-color",
Util.getRandomColor(Poi.tagRandomColorMin, Poi.tagRandomColorMax)
);
});
}
// 分类雷达
if (
$("#category-echarts").length > 0 &&
$("#category-echarts").children().length == 0
) {
var values = Object.values(categoryRadar),
keys = Object.keys(categoryRadar);
// 这里向上取5的倍数,例如100则取100 101则取105]
if (keys.length < 3) {
$("#category-echarts").remove();
return;
}
var maxNum =
Math.ceil(Math.max.apply(Math, _toConsumableArray(values)) / 5) * 5;
var categoryChart = echarts.init(
document.getElementById("category-echarts")
);
var option = {
title: {
text: "文章分类雷达图",
left: "center",
top: "25px",
textStyle: {
fontSize: 22,
fontWeight: "normal",
},
},
tooltip: {
trigger: "item",
textStyle: {
align: "left",
},
},
radar: [
{
indicator: (function () {
var indicators = [];
for (var i = 0; i < keys.length; i++) {
indicators.push({ text: keys[i], max: maxNum });
}
return indicators;
})(),
name: {
textStyle: {
color: $(".dark").length > 0 ? "#bebebe" : "black"
},
},
center: ["50%", "60%"],
radius: "60%",
},
],
series: [
{
type: "radar",
itemStyle: {
color: "rgb(123,234,185)",
},
lineStyle: {
color: "rgb(123,234,185)",
},
areaStyle: {
color: "rgb(123,234,185)",
},
data: [
{
value: values,
name: "文章分类数量",
},
],
},
],
};
categoryChart.setOption(option);
}
// 微信二维码
if ($("#qrcode").length > 0 && $("#qrcode").children().length == 0) {
new QRCode(document.getElementById("qrcode"), {
text: $("#qrcode").data("url"),
width: 128,
height: 128,
colorDark: "#000000",
colorLight: "#ffffff",
});
}
},
// 点击事件
CE: function () {
// 归档页
$(".archives").hide();
$(".archives:first").show();
$("#archives-temp h3").click(function () {
$(this).next().slideToggle("fast");
return false;
});
// 搜索框
$(".js-toggle-search").on("click", function () {
$(".js-toggle-search").toggleClass("is-active");
$(".js-search").toggleClass("is-visible");
});
$(".search_close").on("click", function () {
if ($(".js-search").hasClass("is-visible")) {
$(".js-toggle-search").toggleClass("is-active");
$(".js-search").toggleClass("is-visible");
}
});
// 导航菜单
$("#show-nav").on("click", function () {
if ($("#show-nav").hasClass("showNav")) {
$("#show-nav").removeClass("showNav").addClass("hideNav");
$(".site-top .lower nav").addClass("navbar");
} else {
$("#show-nav").removeClass("hideNav").addClass("showNav");
$(".site-top .lower nav").removeClass("navbar");
}
});
// 过渡动画
$("#loading").click(function () {
$("#loading").fadeOut(500);
});
},
// 显示&隐藏导航栏
NH: function () {
var h1 = 0,
h2 = 50,
ss = $(document).scrollTop();
$(window).scroll(function () {
var s = $(document).scrollTop();
// 屏幕剩余的高度
var surplus =
document.documentElement.scrollHeight -
document.documentElement.clientHeight;
// 当前位置小数
var coorY = s / surplus;
NProgress.set(coorY);
if (s == h1) {
$(".site-header").removeClass("yya");
}
if (s > h1) {
$(".site-header").addClass("yya");
}
if (s > h2) {
$(".site-header").addClass("gizle");
if (s > ss) {
$(".site-header").removeClass("sabit");
} else {
$(".site-header").addClass("sabit");
}
ss = s;
}
});
},
// Ajax加载文章/说说
XLS: function () {
var $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');
$body.on("click", "#pagination a", function () {
var tempScrollTop = $(window).scrollTop();
$(this).addClass("loading").text("");
$.ajax({
type: "GET",
url: $(this).attr("href") + "#main",
success: function (data) {
var result = $(data).find("#main .post");
var nextHref = $(data).find("#pagination a").attr("href");
// 添加新的内容
$("#main").append(result.fadeIn(500));
$("#pagination a").removeClass("loading").text("下一页");
// 加载完成不改变位置
$(window).scrollTop(tempScrollTop);
LIlGGAttachContext.PLSA();
if (nextHref != undefined) {
$("#pagination a").attr("href", nextHref);
} else {
$("#pagination").html("没有更多文章了");
}
I18N.init();
},
});
return false;
});
/**
* 说说
*/
$body.on("click", "#journals-pagination a", function () {
$(this).addClass("loading").text("");
var tempScrollTop = $(window).scrollTop();
$.ajax({
type: "GET",
url: $(this).attr("href") + "#main",
success: function (data) {
var result = $(data).find("#main .journal");
var nextHref = $(data).find("#journals-pagination a").attr("href");
// 添加新的内容
$("#main").append(result.fadeIn(500));
$("#journals-pagination a")
.removeClass("loading")
.text("加载更多...");
LIlGGAttachContext.SS();
// 注入评论 CSS
LIlGGAttachContext.CMN();
// 加载完成不改变位置
$(window).scrollTop(tempScrollTop);
if (nextHref != undefined) {
$("#journals-pagination a").attr("href", nextHref);
} else {
$("#journals-pagination a").remove();
}
},
});
return false;
});
},
// 返回顶部
GT: function () {
var offset = 100,
offset_opacity = 1200,
scroll_top_duration = 700,
$back_to_top = $(".cd-top");
$(window).scroll(function () {
if ($(this).scrollTop() > offset) {
$back_to_top.addClass("cd-is-visible");
$(".changeSkin-gear").css("bottom", "0"); // 显示主题
if ($(window).height() > 950) {
$(".cd-top.cd-is-visible").css("top", "0");
} else {
$(".cd-top.cd-is-visible").css(
"top",
$(window).height() - 950 + "px"
);
}
} else {
$(".changeSkin-gear").css("bottom", "-999px"); // 隐藏主题
$(".cd-top.cd-is-visible").css("top", "-900px");
$back_to_top.removeClass("cd-is-visible cd-fade-out");
}
if ($(this).scrollTop() > offset_opacity) {
$back_to_top.addClass("cd-fade-out");
}
$(".skin-menu").removeClass("show"); // 有滚动就隐藏主题选择
});
//smooth scroll to top
$back_to_top.on("click", function (event) {
event.preventDefault();
$("body,html").animate(
{
scrollTop: 0,
},
scroll_top_duration
);
});
},
};
var toast = null;
/**
* 独立功能,可拔插
*/
$(function () {
Siren.AH(); // 自适应窗口高度
Siren.PE(); // 进程
Siren.NH(); // 显示&隐藏导航栏
Siren.GT(); // 返回顶部
Siren.XLS(); // Ajax文章列表
Siren.CE(); // 点击事件
Siren.MN(); // 移动端菜单
// 新增功能
// 背景视频点击切换
LIlGGAttachContext.BGEVEN();
Poi.themeChange && LIlGGAttachContext.CBG(); // 主题切换
LIlGGAttachContext.PLSA(); // 文章列表动画
(Poi.headFocus && Poi.bgvideo) && LIlGGAttachContext.BGV(); // 背景视频
Poi.toc && LIlGGAttachContext.TOC(); // 文章目录
LIlGGAttachContext.MINI_CODE(); // 迷你代码块
PageAttr.isPost === "true" && LIlGGAttachContext.POST_CONTEXT(); // 文章内容处理
LIlGGAttachContext.CHS(); // 代码类Mac样式、高亮
LIlGGAttachContext.MGT(); // 移动端回到顶部
(Poi.photosStyle == "packery") && supplement();
LIlGGAttachContext.PHO(); // 图库功能
LIlGGAttachContext.SS(); // 日志功能
// 复制提示
Poi.copyMonitor && LIlGGAttachContext.CPY();
// 评论组件
LIlGGAttachContext.CMN();
// PJAX
Poi.pjax && pjaxFun();
I18N.init();
// 全局提示组件
if (Poi.openToast && window.outerWidth > 860) {
toast = new Toast();
toast.init({
width: Poi.toastWidth,
height: Poi.toastHeight,
top: Poi.toastTop,
background: Poi.toastBackground,
color: Poi.toastColor,
"font-size": Poi.toastFontSize,
});
}
// 点赞
$.fn.postLike = function () {
if ($(this).hasClass("done")) {
return false;
} else {
$(this).addClass("done");
var id = $(this).data("id"),
action = $(this).data("action"),
rateHolder = $(this).children(".count");
var ajax_data = {
action: "specs_zan",
um_id: id,
um_action: action,
};
$.post(Poi.ajaxurl, ajax_data, function (data) {
$(rateHolder).html(data);
});
return false;
}
};
$(document).on("click", ".specsZan", function () {
$(this).postLike();
});
console.log(
"%c Github %c",
"background:#24272A; color:#ffffff",
"",
"https://github.com/LIlGG/halo-theme-Sakura"
);
});
/* 首页下拉箭头 */
function headertop_down() {
var coverOffset = $('#content').offset().top;
$('html,body').animate({
scrollTop: coverOffset
},
600);
}
var supplement = function () {
var PackeryMode = Isotope.LayoutMode.modes.packery;
var __resetLayout = PackeryMode.prototype._resetLayout;
PackeryMode.prototype._resetLayout = function () {
__resetLayout.call(this);
// 重置packer
var parentSize = getSize(this.element.parentNode);
var colW = this.columnWidth + this.gutter;
this.fitWidth =
Math.floor((parentSize.innerWidth + this.gutter) / colW) * colW;
this.packer.width = this.fitWidth;
this.packer.height = Number.POSITIVE_INFINITY;
this.packer.reset();
};
PackeryMode.prototype._getContainerSize = function () {
// 删除空白
var emptyWidth = 0;
for (var i = 0, len = this.packer.spaces.length; i < len; i++) {
var space = this.packer.spaces[i];
if (space.y === 0 && space.height === Number.POSITIVE_INFINITY) {
emptyWidth += space.width;
}
}
return {
width: this.fitWidth - this.gutter,
height: this.maxY - this.gutter,
};
};
// 始终调整大小
PackeryMode.prototype.needsResizeLayout = function () {
return true;
};
};
/*
* File skip-link-focus-fix.js.
* Helps with accessibility for keyboard only users.
* Learn more: https://git.io/vWdr2
*/
var isWebkit = navigator.userAgent.toLowerCase().indexOf("webkit") > -1,
isOpera = navigator.userAgent.toLowerCase().indexOf("opera") > -1,
isIe = navigator.userAgent.toLowerCase().indexOf("msie") > -1;
if (
(isWebkit || isOpera || isIe) &&
document.getElementById &&
window.addEventListener
) {
window.addEventListener(
"hashchange",
function () {
var id = location.hash.substring(1),
element;
if (!/^[A-z0-9_-]+$/.test(id)) {
return;
}
element = document.getElementById(id);
if (element) {
if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {
element.tabIndex = -1;
}
element.focus();
}
},
false
);
}
var IllegalStateException = function (message) {
IllegalStateException.prototype = new RuntimeException();
IllegalStateException.prototype = {
get name() {
return 'IllegalStateException';
}
}
}
var InvalidArgumentException = function (message) {
InvalidArgumentException.prototype = new RuntimeException();
InvalidArgumentException.prototype = {
get name() {
return 'InvalidArgumentException';
}
}
}
var NotImplementedException = function (message) {
NotImplementedException.prototype = new RuntimeException();
NotImplementedException.prototype = {
get name() {
return 'NotImplementedException';
}
}
}
function _toConsumableArray(arr) {
return (
_arrayWithoutHoles(arr) ||
_iterableToArray(arr) ||
_unsupportedIterableToArray(arr) ||
_nonIterableSpread()
);
}
function _nonIterableSpread() {
throw new TypeError(
"Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."
);
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
return _arrayLikeToArray(o, minLen);
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter))
return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) {
arr2[i] = arr[i];
}
return arr2;
}
function _instanceof(left, right) {
if (
right != null &&
typeof Symbol !== "undefined" &&
right[Symbol.hasInstance]
) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
function _classCallCheck(instance, Constructor) {
if (!_instanceof(instance, Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}