mirror of
https://github.com/jerryc127/hexo-theme-butterfly.git
synced 2025-09-15 12:58:48 +08:00
1. 不再支持hexo 4.0.0以下版本 2. 添加hexo fragment_cache,加快生成速度 3. 完善V5圖標顯示,不再需要同時加載V4和v5圖標 4. 去除cheerio依賴 5. 整合豆瓣配置,增加配置遊戲,圖書頁面top_img,可設置是否設置meta,解決部分瀏覽器無法顯示圖片問題 6. 友情鏈接除列表外可自定義內容 7. 可設置主頁標題距離頂部距離 8. 側邊欄可隱藏,可設置手機頁面是否隱藏 9. 增加disqusjs和utterances 兩個評論 10. 主頁文章增加tags和更新日期顯示,可以配置post_meta 11. 首頁subtitle可關閉打字效果,可設置打字效果顯示一次或loop 12. 增加valine和gitalk的配置 13. darkmode配置整理 14. 增加404頁面 15. post_beautify改為beautify,頁面美化不再只限於post頁,page頁也一樣 16. 可設置是否顯示cover,可設置各位置的cover顯示 17. 增加mermaid,可畫流程圖、狀態圖、時序圖、甘特圖等等 18. 增加pangu配置,中英文之間添加空格 19. 整合部分配置 20. post-copyright增加decode網址 (可以顯示中文) 21. 增加部分顏色配置 Feature 1. 適配IE 2. 增加一個Tag Plugins: 圖庫集 3. 增加一個Tag Plugins: tag-hide 功能 inline/block 4. 去除page頁開頭顯示與標題一樣的內容 5. aside 公告欄設置,支持html代碼 6. 手機界面sidebar顯示進度條和加深對應的標題 7. 主頁subtitle 的 hitokoto 顯示內容出處 9. footer 的hexo鏈接改為https 10. 修改手機下,menus和toc的打開效果 11. 手機頁面下,搜索界面全屏顯示 12. SEO優化,標題欄改為h1顯示 13. 閲讀模式優化,可根據light mode 和darkmode調整背景 14. 當屏蔽js時,header會出現(之前用js控制,會隱藏) Fixed 1. 修復Tencent Analytics的script加載為https #105 2. 修復相關文章,日期顯示錯誤bug 3. 修復gitalk報錯問題 4. 修復當valine background 是絕對地址時無法顯示的bug 5. 修復medium-zoom 無法使用的bug 6. 修復在safari下,點擊或移動到首頁文章cover,圓角變成正方形的bug #114 7. 修復在部分瀏覽器下,aside,友情鏈接頭像轉動變形的bug 8. 修復在寬度限制下,表格內容溢出屏幕外而出現滾動條的bug \#138 9. 修復gitalk js 在一些沒有設置評論的page里加載的bug 10. 修復tag plugins 的gist 在不同主題下的背景顏色問題(黑色主題下,文字不易觀看) 11. 修復highlight figcaption 顯示不全的bug 12. 修復disqus評論數無法獲取的bug 13. 修復子目錄在觸摸屏下點擊,偶爾不出現的bug 14. 修復a標籤太長(連續英文字母)不會換行的bug 15. 修復toc滾動時,閲讀進度條也跟著滾動的bug 16. 修復aside的圖片,可點擊顯示大圖bug 17. 修復activate-power-mode設置參數無效bug 18. 修復語言上的錯誤 \#156 19. 修復主頁在safari桌面端,首頁滾動卡頓的bug
756 lines
22 KiB
JavaScript
756 lines
22 KiB
JavaScript
$(function () {
|
||
const isSnackbar = GLOBAL_CONFIG.Snackbar !== undefined
|
||
const isTocContent = $('#sidebar .sidebar-toc__content').children().length > 0
|
||
const $pageHead = $('#page-header')
|
||
const $rightside = $('#rightside')
|
||
const $body = $('body')
|
||
|
||
/**
|
||
* 當menu過多時,自動適配,避免UI錯亂
|
||
*/
|
||
const searchWidth = $('#search_button').outerWidth() !== undefined ? $('#search_button').outerWidth() : 0
|
||
const blogNameWidth = $('#blog_name').width()
|
||
|
||
var mw = 0
|
||
var $menusItem = $pageHead.find('.menus_item')
|
||
for (var i = 0; i < $menusItem.length; i++) {
|
||
mw = mw + $menusItem.eq(i).outerWidth()
|
||
}
|
||
|
||
/**
|
||
* 傳入 1 sidebar打開時
|
||
* 傳入 2 正常狀態下
|
||
* 傳入 3 resize時使用
|
||
*/
|
||
function isAdjust (n) {
|
||
var t
|
||
if (n === 1) {
|
||
t = blogNameWidth + searchWidth + mw > $pageHead.width() - 300
|
||
} else if (n === 2) {
|
||
t = blogNameWidth + searchWidth + mw > $pageHead.width()
|
||
}
|
||
|
||
if (t) headerAdjust()
|
||
else headerAdjustBack()
|
||
}
|
||
|
||
// 初始化header
|
||
function initAjust () {
|
||
if (window.innerWidth < 768) headerAdjust()
|
||
else isAdjust(2)
|
||
}
|
||
initAjust()
|
||
|
||
function headerAdjust () {
|
||
$pageHead.find('.toggle-menu').addClass('is_visible')
|
||
$pageHead.find('.menus').addClass('is_invisible')
|
||
$pageHead.find('#search_button span').addClass('is_invisible')
|
||
}
|
||
|
||
function headerAdjustBack () {
|
||
$pageHead.find('.toggle-menu').removeClass('is_visible')
|
||
$pageHead.find('.menus').removeClass('is_invisible')
|
||
$pageHead.find('#search_button span').removeClass('is_invisible')
|
||
}
|
||
|
||
$(window).on('resize', function () {
|
||
if (!$pageHead.hasClass('open-sidebar')) {
|
||
initAjust()
|
||
}
|
||
})
|
||
|
||
/**
|
||
* windows時 設置主頁top_img 為 fixed
|
||
*/
|
||
if (GLOBAL_CONFIG_SITE.isHome) {
|
||
var isSafari = /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)
|
||
if (!isSafari && isDesktop()) {
|
||
$('#nav').css('background-attachment', 'fixed')
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 進入post頁sidebar處理
|
||
*/
|
||
|
||
var isSidebarOpen = $('#toggle-sidebar').hasClass('on') && isTocContent
|
||
var isPcSidebarOpen = false
|
||
if (window.innerWidth > 1024 && isSidebarOpen) {
|
||
setTimeout(function () {
|
||
openSidebar()
|
||
}, 400)
|
||
}
|
||
|
||
// 當toc爲空時,隱藏toc按鈕
|
||
if (isTocContent) {
|
||
$('#toggle-sidebar').css('opacity', '1')
|
||
} else {
|
||
$('#toggle-sidebar').css('display', 'none')
|
||
$('#mobile-toc-button').css('display', 'none')
|
||
}
|
||
|
||
/**
|
||
* 點擊左下角箭頭,顯示sidebar
|
||
*/
|
||
|
||
function closeSidebar () {
|
||
isPcSidebarOpen = false
|
||
$pageHead.removeClass('open-sidebar')
|
||
$('#sidebar').removeClass('tocOpenPc')
|
||
$('#body-wrap').animate({
|
||
paddingLeft: 0
|
||
}, 400)
|
||
$('#sidebar').animate({
|
||
left: '-300px'
|
||
}, 400)
|
||
$('#toggle-sidebar').css({
|
||
transform: 'rotateZ(0deg)',
|
||
color: '#1F2D3D',
|
||
opacity: '1'
|
||
})
|
||
setTimeout(function () {
|
||
isAdjust(2)
|
||
}, 400)
|
||
}
|
||
|
||
function openSidebar () {
|
||
isPcSidebarOpen = true
|
||
$pageHead.addClass('open-sidebar')
|
||
$('#sidebar').addClass('tocOpenPc')
|
||
$('#body-wrap').animate({
|
||
paddingLeft: 300
|
||
}, 400)
|
||
$('#sidebar').animate({
|
||
left: 0
|
||
}, 400)
|
||
$('#toggle-sidebar').css({
|
||
transform: 'rotateZ(180deg)',
|
||
color: '#99a9bf',
|
||
opacity: '1'
|
||
})
|
||
var isAdjustTimeCount = window.setInterval(function () {
|
||
isAdjust(1)
|
||
}, 100)
|
||
setTimeout(function () {
|
||
clearInterval(isAdjustTimeCount)
|
||
}, 400)
|
||
}
|
||
|
||
$('#toggle-sidebar').on('click', function () {
|
||
var isOpen = $(this).hasClass('on')
|
||
isOpen ? $(this).removeClass('on') : $(this).addClass('on')
|
||
if (isOpen) {
|
||
closeSidebar()
|
||
} else {
|
||
openSidebar()
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 手機menu和toc按鈕點擊
|
||
* 顯示menu和toc的sidebar
|
||
*/
|
||
|
||
var $toggleMenu = $('.toggle-menu')
|
||
var $mobileSidevarMenus = $('#mobile-sidebar-menus')
|
||
var $mobileTocButton = $('#mobile-toc-button')
|
||
var $menuMask = $('#menu_mask')
|
||
|
||
function openMobileSidebar (name) {
|
||
sidebarPaddingR()
|
||
$('body').css('overflow', 'hidden')
|
||
$menuMask.fadeIn()
|
||
|
||
if (name === 'menu') {
|
||
$toggleMenu.removeClass('close').addClass('open')
|
||
$mobileSidevarMenus.css('transform', 'translate3d(-100%,0,0)')
|
||
var $mobileSidevarMenusChild = $mobileSidevarMenus.children()
|
||
for (i = 0; i <= $mobileSidevarMenusChild.length; i++) {
|
||
const duration = i / 5 + 0.2
|
||
$mobileSidevarMenusChild.eq(i).css('animation', 'sidebarItem ' + duration + 's')
|
||
}
|
||
}
|
||
|
||
if (name === 'toc') {
|
||
$mobileTocButton.removeClass('close').addClass('open')
|
||
$('#sidebar').addClass('tocOpenMobile')
|
||
$('#sidebar').css({ transform: 'translate3d(-100%,0,0)', left: '' })
|
||
}
|
||
}
|
||
|
||
function closeMobileSidebar (name) {
|
||
$('body').css({ overflow: '', 'padding-right': '' })
|
||
$menuMask.fadeOut()
|
||
|
||
if (name === 'menu') {
|
||
$toggleMenu.removeClass('open').addClass('close')
|
||
$mobileSidevarMenus.css('transform', '')
|
||
$('#mobile-sidebar-menus > div,#mobile-sidebar-menus > hr').css('animation', '')
|
||
}
|
||
|
||
if (name === 'toc') {
|
||
$mobileTocButton.removeClass('open').addClass('close')
|
||
$('#sidebar').removeClass('tocOpenMobile')
|
||
$('#sidebar').css({ transform: '' })
|
||
}
|
||
}
|
||
|
||
$toggleMenu.on('click', function () {
|
||
openMobileSidebar('menu')
|
||
})
|
||
|
||
$mobileTocButton.on('click', function () {
|
||
openMobileSidebar('toc')
|
||
})
|
||
|
||
$menuMask.on('click touchstart', function (e) {
|
||
if ($toggleMenu.hasClass('open')) {
|
||
closeMobileSidebar('menu')
|
||
}
|
||
if ($mobileTocButton.hasClass('open')) {
|
||
closeMobileSidebar('toc')
|
||
}
|
||
})
|
||
|
||
$(window).on('resize', function (e) {
|
||
if (!$toggleMenu.is(':visible')) {
|
||
if ($toggleMenu.hasClass('open')) closeMobileSidebar('menu')
|
||
}
|
||
})
|
||
|
||
const mql = window.matchMedia('(max-width: 1024px)')
|
||
mql.addListener(function (ev) {
|
||
if (ev.matches) {
|
||
if (isPcSidebarOpen === true) closeSidebar()
|
||
} else {
|
||
if ($('#toggle-sidebar').hasClass('on') && isTocContent) openSidebar()
|
||
if ($mobileTocButton.hasClass('open')) closeMobileSidebar('toc')
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 首頁top_img底下的箭頭
|
||
*/
|
||
$('#scroll_down').on('click', function () {
|
||
scrollTo('#content-inner')
|
||
})
|
||
|
||
/**
|
||
* BOOKMARK 書簽
|
||
*/
|
||
$('#bookmark-it').on('click', function () {
|
||
if (window.sidebar && window.sidebar.addPanel) { // Mozilla Firefox Bookmark
|
||
window.sidebar.addPanel(document.title, window.location.href, '')
|
||
} else if (window.external && ('AddFavorite' in window.external)) { // IE Favorite
|
||
window.external.AddFavorite(location.href, document.title)
|
||
} else if (window.opera && window.print) { // Opera Hotlist
|
||
this.title = document.title
|
||
return true
|
||
} else { // webkit - safari/chrome
|
||
if (isSnackbar) {
|
||
var bookmarkText = GLOBAL_CONFIG.Snackbar.bookmark.message_prev + ' ' + (navigator.userAgent.toLowerCase().indexOf('mac') !== -1 ? 'Command/Cmd' : 'CTRL') + '+ D ' + GLOBAL_CONFIG.Snackbar.bookmark.message_next + '.'
|
||
snackbarShow(bookmarkText)
|
||
} else {
|
||
alert(GLOBAL_CONFIG.bookmark.message_prev + ' ' + (navigator.userAgent.toLowerCase().indexOf('mac') !== -1 ? 'Command/Cmd' : 'CTRL') + '+ D ' + GLOBAL_CONFIG.bookmark.message_next + '.')
|
||
}
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 代碼
|
||
*/
|
||
const isHighlightCopy = GLOBAL_CONFIG.highlightCopy
|
||
const isHighlightLang = GLOBAL_CONFIG.highlightLang
|
||
const isHighlightShrink = GLOBAL_CONFIG.highlightShrink
|
||
const $figureHighlight = $('figure.highlight')
|
||
if (isHighlightCopy || isHighlightLang || isHighlightShrink !== 'none') {
|
||
$figureHighlight.wrap('<div class="code-area-wrap"></div>').before('<div class="highlight-tools"></div>')
|
||
}
|
||
|
||
/**
|
||
* 代碼收縮
|
||
*/
|
||
const $highlightTools = $('.highlight-tools')
|
||
if (isHighlightShrink === true) {
|
||
$highlightTools.append('<i class="fa fa-angle-down code-expand code-closed" aria-hidden="true"></i>')
|
||
} else if (isHighlightShrink === false) {
|
||
$highlightTools.append('<i class="fa fa-angle-down code-expand" aria-hidden="true"></i>')
|
||
}
|
||
|
||
$(document).on('click', '.highlight-tools >.code-expand', function () {
|
||
var $table = $(this).parent().next()
|
||
if ($(this).hasClass('code-closed')) {
|
||
$table.css('display', '')
|
||
$(this).removeClass('code-closed')
|
||
} else {
|
||
$table.css('display', 'none')
|
||
$(this).addClass('code-closed')
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 代碼語言
|
||
*/
|
||
if (isHighlightLang) {
|
||
var langNameIndex, langName
|
||
$figureHighlight.each(function () {
|
||
langNameIndex = langName = $(this).attr('class').split(' ')[1]
|
||
if (langNameIndex === 'plain') langName = 'Code'
|
||
$(this).prev().append('<div class="code-lang">' + langName + '</div>')
|
||
})
|
||
}
|
||
/**
|
||
* 代碼copy
|
||
* copy function
|
||
*/
|
||
if (isHighlightCopy) {
|
||
$highlightTools.append('<div class="copy-notice"></div><i class="fa fa-clipboard" aria-hidden="true"></i>')
|
||
var copy = function (text, ctx) {
|
||
if (document.queryCommandSupported && document.queryCommandSupported('copy')) {
|
||
try {
|
||
document.execCommand('copy') // Security exception may be thrown by some browsers.
|
||
if (isSnackbar) {
|
||
snackbarShow(GLOBAL_CONFIG.copy.success)
|
||
} else {
|
||
$(ctx).prev('.copy-notice')
|
||
.text(GLOBAL_CONFIG.copy.success)
|
||
.animate({
|
||
opacity: 1,
|
||
right: 30
|
||
}, 450, function () {
|
||
setTimeout(function () {
|
||
$(ctx).prev('.copy-notice').animate({
|
||
opacity: 0,
|
||
right: 0
|
||
}, 650)
|
||
}, 400)
|
||
})
|
||
}
|
||
} catch (ex) {
|
||
if (isSnackbar) {
|
||
snackbarShow(GLOBAL_CONFIG.copy.success)
|
||
} else {
|
||
$(ctx).prev('.copy-notice')
|
||
.text(GLOBAL_CONFIG.copy.error)
|
||
.animate({
|
||
opacity: 1,
|
||
right: 30
|
||
}, 650, function () {
|
||
setTimeout(function () {
|
||
$(ctx).prev('.copy-notice').animate({
|
||
opacity: 0,
|
||
right: 0
|
||
}, 650)
|
||
}, 400)
|
||
})
|
||
return false
|
||
}
|
||
}
|
||
} else {
|
||
if (isSnackbar) {
|
||
snackbarShow(GLOBAL_CONFIG.copy.noSupport)
|
||
} else {
|
||
$(ctx).prev('.copy-notice').text(GLOBAL_CONFIG.copy.noSupport)
|
||
}
|
||
}
|
||
}
|
||
|
||
// click events
|
||
$(document).on('click', '.highlight-tools>.fa-clipboard', function () {
|
||
var selection = window.getSelection()
|
||
var range = document.createRange()
|
||
range.selectNodeContents($(this).parent().next().find('.code pre')[0])
|
||
selection.removeAllRanges()
|
||
selection.addRange(range)
|
||
var text = selection.toString()
|
||
copy(text, this)
|
||
selection.removeAllRanges()
|
||
})
|
||
}
|
||
|
||
/**
|
||
* justified-gallery 圖庫排版
|
||
*/
|
||
var $justifiedGallery = $('.justified-gallery')
|
||
if ($justifiedGallery.length) {
|
||
var $imgList = $justifiedGallery.find('img')
|
||
$imgList.unwrap()
|
||
if ($imgList.length) {
|
||
$imgList.each(function (i, o) {
|
||
if ($(o).attr('data-src')) $(o).attr('src', $(o).attr('data-src'))
|
||
$(o).wrap('<div></div>')
|
||
})
|
||
}
|
||
$('head').append('<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css">')
|
||
loadScript('https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js', function () {
|
||
$justifiedGallery.not($('.hide-content .justified-gallery')).justifiedGallery({
|
||
rowHeight: 220,
|
||
margins: 4
|
||
})
|
||
})
|
||
}
|
||
|
||
/**
|
||
* fancybox和 mediumZoom
|
||
*/
|
||
|
||
var isMediumZoom = GLOBAL_CONFIG.medium_zoom
|
||
var isFancybox = GLOBAL_CONFIG.fancybox
|
||
if (isFancybox) {
|
||
var images = $('#article-container img:not(.gallery-group-img)').not($('a>img'))
|
||
images.each(function (i, o) {
|
||
var lazyloadSrc = $(o).attr('data-src') ? $(o).attr('data-src') : $(o).attr('src')
|
||
$(o).wrap(
|
||
'<a href="' +
|
||
lazyloadSrc +
|
||
'" data-fancybox="group" data-caption="' +
|
||
$(o).attr('alt') +
|
||
'" class="fancybox"></a>'
|
||
)
|
||
})
|
||
|
||
$().fancybox({
|
||
selector: '[data-fancybox]',
|
||
loop: true,
|
||
transitionEffect: 'slide',
|
||
protect: true,
|
||
buttons: ['slideShow', 'fullScreen', 'thumbs', 'close']
|
||
})
|
||
} else if (isMediumZoom) {
|
||
const zoom = mediumZoom(document.querySelectorAll('#article-container :not(a)>img'))
|
||
zoom.on('open', function (event) {
|
||
const photoBg = $(document.documentElement).attr('data-theme') === 'dark' ? '#121212' : '#fff'
|
||
zoom.update({
|
||
background: photoBg
|
||
})
|
||
})
|
||
}
|
||
|
||
// 點擊toc,收起sidebar
|
||
// $('.toc-link').on('click', function () {
|
||
// closeMobileSidebar('toc')
|
||
// })
|
||
|
||
var initTop = 0
|
||
$(window).scroll(function (event) {
|
||
var currentTop = $(this).scrollTop()
|
||
var isUp = scrollDirection(currentTop)
|
||
if (currentTop > 56) {
|
||
if (isUp) {
|
||
if ($pageHead.hasClass('visible')) $pageHead.removeClass('visible')
|
||
} else {
|
||
if (!$pageHead.hasClass('visible')) $pageHead.addClass('visible')
|
||
}
|
||
$pageHead.addClass('fixed')
|
||
|
||
if ($rightside.css('opacity') === '0') {
|
||
$rightside.css({ opacity: '1', transform: 'translateX(-38px)' })
|
||
}
|
||
} else {
|
||
if (currentTop === 0) {
|
||
$pageHead.removeClass('fixed').removeClass('visible')
|
||
}
|
||
|
||
$rightside.css({ opacity: '', transform: '' })
|
||
}
|
||
})
|
||
|
||
// find the scroll direction
|
||
function scrollDirection (currentTop) {
|
||
var result = currentTop > initTop // true is down & false is up
|
||
initTop = currentTop
|
||
return result
|
||
}
|
||
|
||
/**
|
||
* 點擊滾回頂部
|
||
*/
|
||
$('#go-up').on('click', function () {
|
||
scrollTo('body')
|
||
})
|
||
|
||
/**
|
||
* toc
|
||
*/
|
||
|
||
if (GLOBAL_CONFIG_SITE.isPost && isTocContent) {
|
||
$('.toc-child').hide()
|
||
|
||
// main of scroll
|
||
$(window).scroll(throttle(function (event) {
|
||
var currentTop = $(this).scrollTop()
|
||
scrollPercent(currentTop)
|
||
findHeadPosition(currentTop)
|
||
autoScrollToc(currentTop)
|
||
}, 100))
|
||
|
||
// scroll
|
||
$('.toc-link').on('click', function (e) {
|
||
if (window.innerWidth <= 1024) {
|
||
closeMobileSidebar('toc')
|
||
} else {
|
||
e.preventDefault()
|
||
scrollTo($(this).attr('href'))
|
||
}
|
||
})
|
||
|
||
// expand toc-item
|
||
var expandToc = function ($item) {
|
||
if ($item.is(':visible')) {
|
||
return
|
||
}
|
||
$item.fadeIn(400)
|
||
}
|
||
|
||
var scrollPercent = function (currentTop) {
|
||
var docHeight = $('#article-container').height()
|
||
var winHeight = $(window).height()
|
||
var contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : ($(document).height() - winHeight)
|
||
var scrollPercent = (currentTop) / (contentMath)
|
||
var scrollPercentRounded = Math.round(scrollPercent * 100)
|
||
var percentage = (scrollPercentRounded > 100) ? 100
|
||
: (scrollPercentRounded <= 0) ? 0
|
||
: scrollPercentRounded
|
||
$('.progress-num').text(percentage)
|
||
$('.sidebar-toc__progress-bar').animate({
|
||
width: percentage + '%'
|
||
}, 100)
|
||
}
|
||
|
||
var updateAnchor = function (anchor) {
|
||
if (window.history.replaceState && anchor !== window.location.hash) {
|
||
window.history.replaceState(undefined, undefined, anchor)
|
||
}
|
||
}
|
||
|
||
// find head position & add active class
|
||
// DOM Hierarchy:
|
||
// ol.toc > (li.toc-item, ...)
|
||
// li.toc-item > (a.toc-link, ol.toc-child > (li.toc-item, ...))
|
||
var findHeadPosition = function (top) {
|
||
// assume that we are not in the post page if no TOC link be found,
|
||
// thus no need to update the status
|
||
if ($('.toc-link').length === 0) {
|
||
return false
|
||
}
|
||
|
||
var list = $('#article-container').find('h1,h2,h3,h4,h5,h6')
|
||
var currentId = ''
|
||
list.each(function () {
|
||
var head = $(this)
|
||
if (top > head.offset().top - 25) {
|
||
currentId = '#' + $(this).attr('id')
|
||
}
|
||
})
|
||
|
||
if (currentId === '') {
|
||
$('.toc-link').removeClass('active')
|
||
$('.toc-child').hide()
|
||
}
|
||
|
||
var currentActive = $('.toc-link.active')
|
||
if (currentId && currentActive.attr('href') !== currentId) {
|
||
updateAnchor(currentId)
|
||
|
||
$('.toc-link').removeClass('active')
|
||
|
||
var _this = $('.toc-link[href="' + currentId + '"]')
|
||
_this.addClass('active')
|
||
|
||
var parents = _this.parents('.toc-child')
|
||
// Returned list is in reverse order of the DOM elements
|
||
// Thus `parents.last()` is the outermost .toc-child container
|
||
// i.e. list of subsections
|
||
var topLink = (parents.length > 0) ? parents.last() : _this
|
||
expandToc(topLink.closest('.toc-item').find('.toc-child'))
|
||
topLink
|
||
// Find all top-level .toc-item containers, i.e. sections
|
||
// excluding the currently active one
|
||
.closest('.toc-item').siblings('.toc-item')
|
||
// Hide their respective list of subsections
|
||
.find('.toc-child').hide()
|
||
}
|
||
}
|
||
|
||
var autoScrollToc = function (currentTop) {
|
||
if ($('.toc-link').hasClass('active')) {
|
||
var activePosition = $('.active').offset().top
|
||
var sidebarScrolltop = $('#sidebar .sidebar-toc__content').scrollTop()
|
||
if (activePosition > (currentTop + $(window).height() - 100)) {
|
||
$('#sidebar .sidebar-toc__content').scrollTop(sidebarScrolltop + 100)
|
||
}
|
||
if (activePosition < currentTop + 100) {
|
||
$('#sidebar .sidebar-toc__content').scrollTop(sidebarScrolltop - 100)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 閲讀模式
|
||
*/
|
||
$('#readmode').click(function () {
|
||
$('body').toggleClass('read-mode')
|
||
})
|
||
|
||
/**
|
||
* 字體調整
|
||
*/
|
||
$('#font_plus').click(function () {
|
||
$body.css('font-size', parseFloat($body.css('font-size')) + 1)
|
||
})
|
||
$('#font_minus').click(function () {
|
||
$body.css('font-size', parseFloat($body.css('font-size')) - 1)
|
||
})
|
||
|
||
/**
|
||
* menu
|
||
* 側邊欄sub-menu 展開/收縮
|
||
* 解決menus在觸摸屏下,滑動屏幕menus_item_child不消失的問題(手機hover的bug)
|
||
*/
|
||
$('#mobile-sidebar-menus .menus-expand').on('click', function () {
|
||
if ($(this).hasClass('menus-closed')) {
|
||
$(this).parents('.menus_item').find('.menus_item_child').slideDown()
|
||
$(this).removeClass('menus-closed')
|
||
} else {
|
||
$(this).parents('.menus_item').find('.menus_item_child').slideUp()
|
||
$(this).addClass('menus-closed')
|
||
}
|
||
})
|
||
|
||
$(window).on('touchmove', function (e) {
|
||
var $menusChild = $('#page-header .menus_item_child')
|
||
if ($menusChild.is(':visible')) {
|
||
$menusChild.css('display', 'none')
|
||
}
|
||
})
|
||
|
||
/**
|
||
* rightside 點擊設置 按鈕 展開
|
||
*/
|
||
$('#rightside_config').on('click', function () {
|
||
if ($('#rightside-config-hide').hasClass('rightside-in')) {
|
||
$('#rightside-config-hide').removeClass('rightside-in').addClass('rightside-out')
|
||
} else {
|
||
$('#rightside-config-hide').removeClass('rightside-out').addClass('rightside-in')
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 複製時加上版權信息
|
||
*/
|
||
var copyright = GLOBAL_CONFIG.copyright
|
||
if (copyright !== undefined) {
|
||
document.body.oncopy = function (event) {
|
||
event.preventDefault()
|
||
let textFont; const copyFont = window.getSelection(0).toString()
|
||
if (copyFont.length > 45) {
|
||
textFont = copyFont + '\n' + '\n' + '\n' +
|
||
copyright.languages.author + '\n' +
|
||
copyright.languages.link + '\n' +
|
||
copyright.languages.source + '\n' +
|
||
copyright.languages.info
|
||
} else {
|
||
textFont = copyFont
|
||
}
|
||
if (event.clipboardData) {
|
||
return event.clipboardData.setData('text', textFont)
|
||
} else {
|
||
// 兼容IE
|
||
return window.clipboardData.setData('text', textFont)
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Darkmode
|
||
*/
|
||
var isFontAwesomeV5 = GLOBAL_CONFIG.isFontAwesomeV5
|
||
var $darkModeButtom = $('#darkmode')
|
||
if (typeof autoChangeMode !== 'undefined') {
|
||
if (Cookies.get('theme') === 'dark') changeLightIcon()
|
||
else changeDarkIcon()
|
||
}
|
||
|
||
function changeLightIcon () {
|
||
isFontAwesomeV5 ? $darkModeButtom.removeClass('fa-moon').addClass('fa-sun') : $darkModeButtom.removeClass('fa-moon-o').addClass('fa-sun-o')
|
||
}
|
||
|
||
function changeDarkIcon () {
|
||
isFontAwesomeV5 ? $darkModeButtom.removeClass('fa-sun').addClass('fa-moon') : $darkModeButtom.removeClass('fa-sun-o').addClass('fa-moon-o')
|
||
}
|
||
|
||
function switchReadMode () {
|
||
var nowMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
|
||
if (nowMode === 'light') {
|
||
changeLightIcon()
|
||
activateDarkMode()
|
||
Cookies.set('theme', 'dark', { expires: 2 })
|
||
if (isSnackbar) snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night)
|
||
} else {
|
||
changeDarkIcon()
|
||
activateLightMode()
|
||
Cookies.set('theme', 'light', { expires: 2 })
|
||
if (isSnackbar) snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day)
|
||
}
|
||
}
|
||
|
||
$darkModeButtom.click(function () {
|
||
switchReadMode()
|
||
try {
|
||
utterancesTheme()
|
||
} catch (e) {
|
||
return false
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 網頁運行時間
|
||
*/
|
||
if (GLOBAL_CONFIG.runtime) {
|
||
// get user config
|
||
var $runtimeCount = $('#webinfo-runtime-count')
|
||
var startDate = $runtimeCount.attr('start_date')
|
||
var showDateTime = function () {
|
||
var BirthDay = new Date(startDate)
|
||
var today = new Date()
|
||
var timeold = (today.getTime() - BirthDay.getTime())
|
||
var daysold = Math.floor(timeold / (24 * 60 * 60 * 1000))
|
||
$runtimeCount.text(daysold + ' ' + GLOBAL_CONFIG.runtime_unit)
|
||
}
|
||
var interval
|
||
showDateTime()
|
||
clearInterval(interval)
|
||
interval = setInterval(showDateTime, 10000)
|
||
}
|
||
|
||
if (GLOBAL_CONFIG.baiduPush) {
|
||
(function () {
|
||
var bp = document.createElement('script')
|
||
var curProtocol = window.location.protocol.split(':')[0]
|
||
if (curProtocol === 'https') {
|
||
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'
|
||
} else {
|
||
bp.src = 'http://push.zhanzhang.baidu.com/push.js'
|
||
}
|
||
var s = document.getElementsByTagName('script')[0]
|
||
s.parentNode.insertBefore(bp, s)
|
||
})()
|
||
}
|
||
|
||
/**
|
||
* tag-hide
|
||
*/
|
||
var $hideInline = $('.hide-button')
|
||
$hideInline.on('click', function (e) {
|
||
e.preventDefault()
|
||
$(this).hide()
|
||
var $hideContent = $(this).next('.hide-content')
|
||
$hideContent.show()
|
||
$hideContent.find('.justified-gallery').justifiedGallery({
|
||
rowHeight: 220,
|
||
margins: 4
|
||
})
|
||
})
|
||
})
|