2017-08-27 14:38:42 +00:00
|
|
|
'use strict'
|
|
|
|
|
2017-11-01 14:25:41 +00:00
|
|
|
const Even = {}
|
2017-08-27 14:38:42 +00:00
|
|
|
|
|
|
|
Even.backToTop = function () {
|
2017-11-01 14:25:41 +00:00
|
|
|
const $backToTop = $('#back-to-top')
|
2017-08-27 14:38:42 +00:00
|
|
|
|
|
|
|
$(window).scroll(function () {
|
|
|
|
if ($(window).scrollTop() > 100) {
|
|
|
|
$backToTop.fadeIn(1000)
|
|
|
|
} else {
|
|
|
|
$backToTop.fadeOut(1000)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
$backToTop.click(function () {
|
|
|
|
$('body,html').animate({ scrollTop: 0 })
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
Even.mobileNavbar = function () {
|
2017-11-01 14:25:41 +00:00
|
|
|
const $mobileNav = $('#mobile-navbar')
|
|
|
|
const $mobileNavIcon = $('.mobile-navbar-icon')
|
|
|
|
const slideout = new Slideout({
|
2017-08-27 14:38:42 +00:00
|
|
|
'panel': document.getElementById('mobile-panel'),
|
|
|
|
'menu': document.getElementById('mobile-menu'),
|
|
|
|
'padding': 180,
|
|
|
|
'tolerance': 70
|
|
|
|
})
|
|
|
|
slideout.disableTouch()
|
|
|
|
|
|
|
|
$mobileNavIcon.click(function () {
|
|
|
|
slideout.toggle()
|
|
|
|
})
|
|
|
|
|
|
|
|
slideout.on('beforeopen', function () {
|
|
|
|
$mobileNav.addClass('fixed-open')
|
|
|
|
$mobileNavIcon.addClass('icon-click').removeClass('icon-out')
|
|
|
|
})
|
|
|
|
|
|
|
|
slideout.on('beforeclose', function () {
|
|
|
|
$mobileNav.removeClass('fixed-open')
|
|
|
|
$mobileNavIcon.addClass('icon-out').removeClass('icon-click')
|
|
|
|
})
|
|
|
|
|
|
|
|
$('#mobile-panel').on('touchend', function () {
|
|
|
|
slideout.isOpen() && $mobileNavIcon.click()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2017-10-12 15:01:06 +00:00
|
|
|
Even._initToc = function () {
|
2017-11-01 14:25:41 +00:00
|
|
|
const SPACING = 20
|
|
|
|
const $toc = $('.post-toc')
|
|
|
|
const $footer = $('.post-footer')
|
2017-08-27 14:38:42 +00:00
|
|
|
|
|
|
|
if ($toc.length) {
|
2017-11-01 14:25:41 +00:00
|
|
|
const minScrollTop = $toc.offset().top - SPACING
|
|
|
|
const maxScrollTop = $footer.offset().top - $toc.height() - SPACING
|
2017-08-27 14:38:42 +00:00
|
|
|
|
2017-11-01 14:25:41 +00:00
|
|
|
const tocState = {
|
2017-08-27 14:38:42 +00:00
|
|
|
start: {
|
|
|
|
'position': 'absolute',
|
|
|
|
'top': minScrollTop
|
|
|
|
},
|
|
|
|
process: {
|
|
|
|
'position': 'fixed',
|
|
|
|
'top': SPACING
|
|
|
|
},
|
|
|
|
end: {
|
|
|
|
'position': 'absolute',
|
|
|
|
'top': maxScrollTop
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$(window).scroll(function () {
|
2017-11-01 14:25:41 +00:00
|
|
|
const scrollTop = $(window).scrollTop()
|
2017-08-27 14:38:42 +00:00
|
|
|
|
|
|
|
if (scrollTop < minScrollTop) {
|
|
|
|
$toc.css(tocState.start)
|
|
|
|
} else if (scrollTop > maxScrollTop) {
|
|
|
|
$toc.css(tocState.end)
|
|
|
|
} else {
|
|
|
|
$toc.css(tocState.process)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2017-11-01 14:25:41 +00:00
|
|
|
const HEADERFIX = 30
|
|
|
|
const $toclink = $('.toc-link')
|
|
|
|
const $headerlink = $('.headerlink')
|
2017-12-05 12:02:25 +00:00
|
|
|
const $tocLinkLis = $('.post-toc-content li')
|
2017-08-27 14:38:42 +00:00
|
|
|
|
2017-11-01 14:25:41 +00:00
|
|
|
const headerlinkTop = $.map($headerlink, function (link) {
|
2017-08-27 14:38:42 +00:00
|
|
|
return $(link).offset().top
|
|
|
|
})
|
|
|
|
|
2017-12-05 12:02:25 +00:00
|
|
|
const headerLinksOffsetForSearch = $.map(headerlinkTop, function (offset) {
|
|
|
|
return offset - HEADERFIX
|
|
|
|
})
|
|
|
|
|
|
|
|
const searchActiveTocIndex = function (array, target) {
|
|
|
|
for (let i = 0; i < array.length - 1; i++) {
|
|
|
|
if (target > array[i] && target <= array[i + 1]) return i
|
|
|
|
}
|
|
|
|
if (target > array[array.length - 1]) return array.length - 1
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
2017-08-27 14:38:42 +00:00
|
|
|
$(window).scroll(function () {
|
2017-11-01 14:25:41 +00:00
|
|
|
const scrollTop = $(window).scrollTop()
|
2017-12-05 12:02:25 +00:00
|
|
|
const activeTocIndex = searchActiveTocIndex(headerLinksOffsetForSearch, scrollTop)
|
2017-08-27 14:38:42 +00:00
|
|
|
|
2017-12-05 12:02:25 +00:00
|
|
|
$($toclink).removeClass('active')
|
|
|
|
$($tocLinkLis).removeClass('has-active')
|
2017-08-27 14:38:42 +00:00
|
|
|
|
2017-12-05 12:02:25 +00:00
|
|
|
if (activeTocIndex !== -1) {
|
|
|
|
$($toclink[activeTocIndex]).addClass('active')
|
|
|
|
let ancestor = $toclink[activeTocIndex].parentNode
|
|
|
|
while (ancestor.tagName !== 'NAV') {
|
|
|
|
$(ancestor).addClass('has-active')
|
|
|
|
ancestor = ancestor.parentNode.parentNode
|
2017-08-27 14:38:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
Even.fancybox = function () {
|
|
|
|
if ($.fancybox) {
|
2017-09-11 13:55:26 +00:00
|
|
|
$('.post-content').each(function () {
|
2017-08-27 14:38:42 +00:00
|
|
|
$(this).find('img').each(function () {
|
2017-09-06 09:20:16 +00:00
|
|
|
$(this).wrap(`<a class="fancybox" href="${this.src}" data-fancybox="gallery" data-caption="${this.title}"></a>`)
|
2017-08-27 14:38:42 +00:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
$('.fancybox').fancybox({
|
2017-09-06 09:20:16 +00:00
|
|
|
selector: '.fancybox',
|
|
|
|
protect: true
|
2017-08-27 14:38:42 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Even.highlight = function () {
|
|
|
|
const blocks = document.querySelectorAll('pre code')
|
2017-09-17 13:52:46 +00:00
|
|
|
for (let i = 0; i < blocks.length; i++) {
|
|
|
|
const block = blocks[i]
|
2017-08-27 14:38:42 +00:00
|
|
|
const rootElement = block.parentElement
|
2018-01-10 08:21:01 +00:00
|
|
|
const lineCodes = block.innerHTML.split(/\n/)
|
|
|
|
if (lineCodes[lineCodes.length - 1] === '') lineCodes.pop()
|
2017-08-27 14:38:42 +00:00
|
|
|
const lineLength = lineCodes.length
|
|
|
|
|
|
|
|
let codeLineHtml = ''
|
|
|
|
for (let i = 0; i < lineLength; i++) {
|
|
|
|
codeLineHtml += `<div class="line">${i + 1}</div>`
|
|
|
|
}
|
|
|
|
|
|
|
|
let codeHtml = ''
|
2017-09-17 13:52:46 +00:00
|
|
|
for (let i = 0; i < lineLength; i++) {
|
|
|
|
codeHtml += `<div class="line">${lineCodes[i]}</div>`
|
2017-08-27 14:38:42 +00:00
|
|
|
}
|
|
|
|
|
2017-09-17 13:52:46 +00:00
|
|
|
block.className += ' highlight'
|
2017-08-27 14:38:42 +00:00
|
|
|
const figure = document.createElement('figure')
|
2017-09-17 13:52:46 +00:00
|
|
|
figure.className = block.className
|
2017-08-27 14:38:42 +00:00
|
|
|
figure.innerHTML = `<table><tbody><tr><td class="gutter"><pre>${codeLineHtml}</pre></td><td class="code"><pre>${codeHtml}</pre></td></tr></tbody></table>`
|
|
|
|
|
|
|
|
rootElement.parentElement.replaceChild(figure, rootElement)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-09 16:49:20 +00:00
|
|
|
Even.chroma = function() {
|
|
|
|
const blocks = document.querySelectorAll('.highlight > .chroma')
|
|
|
|
for (let i = 0; i < blocks.length; i++) {
|
|
|
|
const block = blocks[i]
|
|
|
|
const afterHighLight = block.querySelector('pre.chroma > code')
|
|
|
|
const lang = afterHighLight ? afterHighLight.className : ''
|
|
|
|
block.className += ' ' + lang
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-10-12 15:01:06 +00:00
|
|
|
Even.toc = function () {
|
|
|
|
const tocContainer = document.getElementById('post-toc')
|
|
|
|
if (tocContainer !== null) {
|
|
|
|
const toc = document.getElementById('TableOfContents')
|
|
|
|
if (toc === null) {
|
|
|
|
// toc = true, but there are no headings
|
|
|
|
tocContainer.parentNode.removeChild(tocContainer)
|
|
|
|
} else {
|
2017-11-01 14:55:58 +00:00
|
|
|
this._refactorToc(toc)
|
2017-10-12 15:01:06 +00:00
|
|
|
this._linkToc()
|
|
|
|
this._initToc()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-01 14:55:58 +00:00
|
|
|
Even._refactorToc = function (toc) {
|
2018-01-13 12:34:14 +00:00
|
|
|
// when headings do not start with `h1`
|
2017-11-01 14:55:58 +00:00
|
|
|
const oldTocList = toc.children[0]
|
|
|
|
let newTocList = oldTocList
|
|
|
|
let temp
|
2017-12-05 12:02:25 +00:00
|
|
|
while (newTocList.children.length === 1 && (temp = newTocList.children[0].children[0]).tagName === 'UL') newTocList = temp
|
2017-11-01 14:55:58 +00:00
|
|
|
|
2017-12-05 12:02:25 +00:00
|
|
|
if (newTocList !== oldTocList) toc.replaceChild(newTocList, oldTocList)
|
2017-11-01 14:55:58 +00:00
|
|
|
}
|
|
|
|
|
2017-10-12 15:01:06 +00:00
|
|
|
Even._linkToc = function () {
|
2018-01-13 12:34:14 +00:00
|
|
|
const links = document.querySelectorAll('#TableOfContents a:first-child')
|
2017-09-17 13:52:46 +00:00
|
|
|
for (let i = 0; i < links.length; i++) links[i].className += ' toc-link'
|
2017-08-27 14:38:42 +00:00
|
|
|
|
2017-09-17 13:52:46 +00:00
|
|
|
for (let num = 1; num <= 6; num++) {
|
2017-08-27 14:38:42 +00:00
|
|
|
const headers = document.querySelectorAll('.post-content>h' + num)
|
2017-09-17 13:52:46 +00:00
|
|
|
for (let i = 0; i < headers.length; i++) {
|
|
|
|
const header = headers[i]
|
2018-01-13 12:34:14 +00:00
|
|
|
header.innerHTML = `<a href="#${header.id}" class="headerlink"></a>${header.innerHTML}`
|
2017-08-27 14:38:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-12 13:30:47 +00:00
|
|
|
Even.flowchart = function () {
|
|
|
|
if (!window.flowchart) return
|
|
|
|
|
|
|
|
const blocks = document.querySelectorAll('pre code.language-flowchart')
|
|
|
|
for (let i = 0; i < blocks.length; i++) {
|
2018-07-09 16:49:20 +00:00
|
|
|
if (!window.hljs && i % 2 === 0) continue
|
|
|
|
|
2018-03-12 13:30:47 +00:00
|
|
|
const block = blocks[i]
|
2018-07-09 16:49:20 +00:00
|
|
|
const rootElement = window.hljs
|
|
|
|
? block.parentElement
|
|
|
|
: block.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement
|
2018-03-12 13:30:47 +00:00
|
|
|
|
|
|
|
const container = document.createElement('div')
|
|
|
|
const id = `js-flowchart-diagrams-${i}`
|
|
|
|
container.id = id
|
|
|
|
container.className = 'align-center'
|
|
|
|
rootElement.parentElement.replaceChild(container, rootElement)
|
|
|
|
|
|
|
|
const diagram = flowchart.parse(block.childNodes[0].nodeValue)
|
|
|
|
diagram.drawSVG(id, window.flowchartDiagramsOptions ? window.flowchartDiagramsOptions : {})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-12 13:44:54 +00:00
|
|
|
Even.sequence = function () {
|
|
|
|
if (!window.Diagram) return
|
|
|
|
|
|
|
|
const blocks = document.querySelectorAll('pre code.language-sequence')
|
|
|
|
for (let i = 0; i < blocks.length; i++) {
|
2018-07-09 16:49:20 +00:00
|
|
|
if (!window.hljs && i % 2 === 0) continue
|
|
|
|
|
2018-03-12 13:44:54 +00:00
|
|
|
const block = blocks[i]
|
2018-07-09 16:49:20 +00:00
|
|
|
const rootElement = window.hljs
|
|
|
|
? block.parentElement
|
|
|
|
: block.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement
|
2018-03-12 13:44:54 +00:00
|
|
|
|
|
|
|
const container = document.createElement('div')
|
|
|
|
const id = `js-sequence-diagrams-${i}`
|
|
|
|
container.id = id
|
|
|
|
container.className = 'align-center'
|
|
|
|
rootElement.parentElement.replaceChild(container, rootElement)
|
|
|
|
|
|
|
|
const diagram = Diagram.parse(block.childNodes[0].nodeValue)
|
|
|
|
diagram.drawSVG(id, window.sequenceDiagramsOptions ? window.sequenceDiagramsOptions : {theme: 'simple'})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-27 14:38:42 +00:00
|
|
|
export {Even}
|