283 lines
10 KiB
HTML
283 lines
10 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en" th:fragment="layout(content, htmlType)" xmlns:th="http://www.thymeleaf.org">
|
||
|
||
<!-- head 中自定义的 -->
|
||
|
||
<head th:replace="~{modules/head :: head(htmlType = ${htmlType})}">
|
||
<title th:text="${site.title}"></title>
|
||
</head>
|
||
|
||
<body>
|
||
|
||
<!-- loading 页面 -->
|
||
<div th:replace="~{modules/loading-box :: loading-box}"></div>
|
||
|
||
<!-- 网站背景 -->
|
||
<div id="web_bg"></div>
|
||
|
||
<!-- 控制台 -->
|
||
<div th:replace="~{modules/widgets/console :: console}"></div>
|
||
|
||
<div th:replace="~{modules/sidebar :: sidebar}"></div>
|
||
|
||
<!-- 内容 -->
|
||
<th:block th:replace="${content}"></th:block>
|
||
|
||
<!-- todo 暂时没显示,是右下角悬浮操作按钮 -->
|
||
<div id="rightside">
|
||
<div id="rightside-config-hide">
|
||
<button id="translateLink" title="简繁转换" type="button">简</button>
|
||
<button id="darkmode" title="浅色和深色模式转换" type="button"><i class="fas fa-adjust"></i></button>
|
||
<button id="hide-aside-btn" title="单栏和双栏切换" type="button"><i class="fas fa-arrows-alt-h"></i></button>
|
||
</div>
|
||
<div id="rightside-config-show">
|
||
<button id="rightside_config" title="设置" type="button"><i class="fas fa-cog fa-spin"></i></button>
|
||
<button id="go-up" title="回到顶部" type="button"><i class="fas fa-arrow-up"></i></button>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<div th:replace="~{modules/right-menu :: right-menu}"></div>
|
||
|
||
<div>
|
||
<script th:src="@{/assets/js/utils.js}"></script>
|
||
<script th:src="@{/assets/js/main.js}"></script>
|
||
<script charset="utf-8" data-pjax th:src="@{/assets/zhheo/blogex.js}"></script>
|
||
|
||
<!-- https://instant.page/ 网站预加载, 放在 </body> 之前 -->
|
||
<script th:src="@{/assets/libs/instantpage/instantpage.min.js}" type="module"></script>
|
||
|
||
<script th:src="@{/assets/libs/lazyload/lazyload.iife.min.js}"></script>
|
||
|
||
<!-- 右下角通知 https://www.polonel.com/snackbar/ -->
|
||
<!-- todo head 中有它的 css,应该可以写一块,并改成后台可配置的功能,代码中应该还有他的 js -->
|
||
<script th:src="@{/assets/libs/snackbar/snackbar.min.js}"></script>
|
||
|
||
<!-- https://davidshimjs.github.io/qrcodejs/ 生成二维码 -->
|
||
<!-- 应该是文章页分享使用 -->
|
||
<script data-pjax src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/qrcodejs/1.0.0/qrcode.min.js"></script>
|
||
|
||
<!-- https://raphamorim.io/waterfall.js/ 应该是这个 还有相关的 js 代码 是否可以调整-->
|
||
<script th:src="@{/assets/libs/waterfall/waterfall.min.js}"></script>
|
||
|
||
<!-- 获取主色 https://lokeshdhakar.com/projects/color-thief/ -->
|
||
<!--<script th:src="@{/assets/libs/color-thief/color-thief.umd.js}"></script>-->
|
||
<script th:src="@{/assets/libs/fast-average-color/index.browser.min.js}"></script>
|
||
|
||
<script th:src="@{/assets/libs/view-image/view-image.min.js}"></script>
|
||
|
||
<script th:src="@{/assets/libs/pjax/pjax.min.js}"></script>
|
||
|
||
<!-- swiper 在瞬间滚动时会使用 -->
|
||
<script data-pjax th:src="@{/assets/libs/swiper/swiper-bundle.min.js}"></script>
|
||
|
||
<!-- 评论弹幕 -->
|
||
<script th:replace="~{modules/commentBarrage :: commentBarrage}"></script>
|
||
|
||
<!-- Tocbot 目录生成 start -->
|
||
<script th:src="@{/assets/libs/tocbot/4.18.2/tocbot.min.js}"></script>
|
||
<link th:href="@{/assets/libs/tocbot/4.18.2/tocbot.css}" rel="stylesheet">
|
||
|
||
<script>
|
||
document.addEventListener("DOMContentLoaded", function() {
|
||
|
||
const postContent = document.querySelector('.post-content');
|
||
|
||
if (postContent == null) return;
|
||
|
||
const headers = postContent.querySelectorAll('h1,h2,h3,h4,h5,h6');
|
||
// 没有 toc 目录,则直接移除
|
||
if (headers.length === 0) {
|
||
document.getElementById("card-toc").remove();
|
||
} else {
|
||
tocbot.init({
|
||
tocSelector: '.toc-content',
|
||
contentSelector: '.post-content',
|
||
headingSelector: 'h1,h2,h3,h4,h5,h6',
|
||
hasInnerContainers: true
|
||
});
|
||
|
||
}
|
||
})
|
||
document.addEventListener('pjax:complete', function () {
|
||
|
||
const postContent = document.querySelector('.post-content');
|
||
|
||
if (postContent == null) return;
|
||
|
||
const headers = postContent.querySelectorAll('h1,h2,h3,h4,h5,h6');
|
||
// 没有 toc 目录,则直接移除
|
||
if (headers.length === 0) {
|
||
document.getElementById("card-toc").remove();
|
||
} else {
|
||
tocbot.init({
|
||
tocSelector: '.toc-content',
|
||
contentSelector: '.post-content',
|
||
headingSelector: 'h1,h2,h3,h4,h5,h6',
|
||
hasInnerContainers: true
|
||
});
|
||
|
||
}
|
||
})
|
||
</script>
|
||
|
||
<!-- Tocbot 目录生成 end -->
|
||
|
||
|
||
|
||
|
||
|
||
<script >
|
||
if(GLOBAL_CONFIG.isFriendLinksInFooter){
|
||
var link = {
|
||
// 页脚友链
|
||
addFriendLinksInFooter: function () {
|
||
|
||
var fetchUrl = [[${theme.config.fcircle.fetchUrl}]]
|
||
fetch(fetchUrl)
|
||
.then(res => res.json())
|
||
.then(json => {
|
||
var randomFriendLinks = getArrayItems(json, 3);
|
||
|
||
var htmlText = '';
|
||
for (let i = 0; i < randomFriendLinks.length; ++i) {
|
||
var item = randomFriendLinks[i]
|
||
htmlText += `<a class='footer-item' href='${item.link}' target="_blank" rel="noopener nofollow">${item.name}</a>`;
|
||
}
|
||
htmlText += `<a class='footer-item' href='/links'>更多</a>`
|
||
document.getElementById("friend-links-in-footer").innerHTML = htmlText;
|
||
})
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<div id="js-pjax"></div>
|
||
|
||
|
||
<script>
|
||
let pjaxSelectors = ['title', '#config-diff', '#body-wrap', '#rightside-config-hide', '#rightside-config-show', '.js-pjax','#site-config']
|
||
|
||
if (false) {
|
||
pjaxSelectors.unshift('meta[property="og:image"]', 'meta[property="og:title"]', 'meta[property="og:url"]')
|
||
}
|
||
|
||
var pjax = new Pjax({
|
||
elements: 'a:not([target="_blank"])',
|
||
selectors: pjaxSelectors,
|
||
cacheBust: false,
|
||
analytics: false,
|
||
scrollRestoration: false
|
||
})
|
||
|
||
document.addEventListener('pjax:send', function () {
|
||
|
||
// removeEventListener toc scroll
|
||
window.removeEventListener('scroll', window.tocScrollFn)
|
||
|
||
typeof preloader === 'object' && preloader.initLoading()
|
||
|
||
if (window.aplayers) {
|
||
for (let i = 0; i < window.aplayers.length; i++) {
|
||
if (!window.aplayers[i].options.fixed) {
|
||
window.aplayers[i].destroy()
|
||
}
|
||
}
|
||
}
|
||
|
||
typeof typed === 'object' && typed.destroy()
|
||
|
||
//reset readmode
|
||
const $bodyClassList = document.body.classList
|
||
$bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode')
|
||
})
|
||
|
||
document.addEventListener('pjax:complete', function () {
|
||
window.refreshFn()
|
||
|
||
document.querySelectorAll('script[data-pjax]').forEach(item => {
|
||
const newScript = document.createElement('script')
|
||
const content = item.text || item.textContent || item.innerHTML || ""
|
||
Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
|
||
newScript.appendChild(document.createTextNode(content))
|
||
item.parentNode.replaceChild(newScript, item)
|
||
}
|
||
)
|
||
|
||
GLOBAL_CONFIG.lazyload.enable && window.lazyLoadInstance.update()
|
||
|
||
typeof chatBtnFn === 'function' && chatBtnFn()
|
||
typeof panguInit === 'function' && panguInit()
|
||
|
||
// google analytics
|
||
typeof gtag === 'function' && gtag('config', '', {
|
||
'page_path': window.location.pathname
|
||
});
|
||
|
||
// baidu analytics
|
||
typeof _hmt === 'object' && _hmt.push(['_trackPageview', window.location.pathname]);
|
||
|
||
typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()
|
||
|
||
// Analytics
|
||
if (false) {
|
||
MtaH5.pgv()
|
||
}
|
||
|
||
// prismjs
|
||
typeof Prism === 'object' && Prism.highlightAll()
|
||
|
||
typeof preloader === 'object' && preloader.endLoading()
|
||
})
|
||
|
||
document.addEventListener('pjax:error', (e) => {
|
||
if (e.request.status === 404) {
|
||
pjax.loadUrl('/404')
|
||
}
|
||
}
|
||
)
|
||
</script>
|
||
|
||
|
||
</div>
|
||
|
||
<script data-pjax="">
|
||
|
||
|
||
if ([[${ theme.config.post.dynamicBackground }]]) {
|
||
// 图片主色
|
||
coverColor();
|
||
}
|
||
|
||
if ([[${ theme.config.other.loadingBox }]]) {
|
||
// 移除加载动画
|
||
removeLoading();
|
||
}
|
||
navTitle();
|
||
heo.topPostScroll();
|
||
heo.topCategoriesBarScroll();
|
||
heo.sayhi();
|
||
heo.addTag();
|
||
heo.stopImgRightDrag();
|
||
heo.qrcodeCreate();
|
||
heo.onlyHome();
|
||
heo.addNavBackgroundInit();
|
||
//heo.addMediumInEssay();
|
||
heo.darkModeStatus();
|
||
// heo.categoriesBarActive();
|
||
heo.initThemeColor();
|
||
//页脚友联
|
||
if(GLOBAL_CONFIG.isFriendLinksInFooter){
|
||
link.addFriendLinksInFooter()
|
||
}
|
||
|
||
//右下角 snackbar 弹窗
|
||
if ([[${ theme.config.snackbar.switch }]]) {
|
||
heo.hidecookie()
|
||
}
|
||
|
||
|
||
</script>
|
||
</body>
|
||
|
||
</html> |