'use strict'; const Even = {}; Even.backToTop = function() { const $backToTop = $('#back-to-top'); $(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() { const $mobileNav = $('#mobile-navbar'); const $mobileNavIcon = $('.mobile-navbar-icon'); const slideout = new Slideout({ '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(); }); }; Even._initToc = function() { const SPACING = 20; const $toc = $('.post-toc'); const $footer = $('.post-footer'); if ($toc.length) { const minScrollTop = $toc.offset().top - SPACING; const maxScrollTop = $footer.offset().top - $toc.height() - SPACING; const tocState = { start: { 'position': 'absolute', 'top': minScrollTop, }, process: { 'position': 'fixed', 'top': SPACING, }, end: { 'position': 'absolute', 'top': maxScrollTop, }, }; $(window).scroll(function() { const scrollTop = $(window).scrollTop(); if (scrollTop < minScrollTop) { $toc.css(tocState.start); } else if (scrollTop > maxScrollTop) { $toc.css(tocState.end); } else { $toc.css(tocState.process); } }); } const HEADERFIX = 30; const $toclink = $('.toc-link'); const $headerlink = $('.headerlink'); const $tocLinkLis = $('.post-toc-content li'); const headerlinkTop = $.map($headerlink, function(link) { return $(link).offset().top; }); 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; }; $(window).scroll(function() { const scrollTop = $(window).scrollTop(); const activeTocIndex = searchActiveTocIndex(headerLinksOffsetForSearch, scrollTop); $($toclink).removeClass('active'); $($tocLinkLis).removeClass('has-active'); if (activeTocIndex !== -1) { $($toclink[activeTocIndex]).addClass('active'); let ancestor = $toclink[activeTocIndex].parentNode; while (ancestor.tagName !== 'NAV') { $(ancestor).addClass('has-active'); ancestor = ancestor.parentNode.parentNode; } } }); }; Even.fancybox = function() { if ($.fancybox) { $('.post-content').each(function() { $(this).find('img').each(function() { $(this).wrap(``); }); }); $('.fancybox').fancybox({ selector: '.fancybox', protect: true, }); } }; Even.highlight = function() { const blocks = document.querySelectorAll('pre code'); for (let i = 0; i < blocks.length; i++) { const block = blocks[i]; const rootElement = block.parentElement; const lineCodes = block.innerHTML.split(/\n/); if (lineCodes[lineCodes.length - 1] === '') lineCodes.pop(); const lineLength = lineCodes.length; let codeLineHtml = ''; for (let i = 0; i < lineLength; i++) { codeLineHtml += `
${codeLineHtml} | ${codeHtml} |