/** * 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"); } }