| /* |
| * Copyright 2018 Christophe Friederich |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| "use strict"; |
| |
| function getViewPort() { |
| var e = window, a = 'inner'; |
| if (!('innerWidth' in window)) { |
| a = 'client'; |
| e = document.documentElement || document.body; |
| } |
| |
| return { |
| width: e[a + 'Width'], |
| height: e[a + 'Height'] |
| }; |
| } |
| |
| var timestampSideBar = 0; |
| |
| var mReflow = function () { |
| var $window = $(window); |
| var $body = $(document.body); |
| var TOC_SEPARATOR = '_toc_'; |
| |
| |
| function initCarousel() { |
| $('.carousel').carousel(); |
| } |
| |
| function initTocTop() { |
| if ($('#m-toc-topbar').length) { |
| $body.scrollspy({ |
| target: '#m-toc-topbar', |
| offset: $('#m-top-navbar').outerHeight() + $('#m-toc-topbar').outerHeight() |
| }); |
| } |
| } |
| |
| function initTocSidebar() { |
| var tocSidebar = $('#m-toc-sidebar'); |
| if (!tocSidebar.length) { |
| return; |
| } |
| |
| |
| // collapse all |
| if (!tocSidebar.hasClass('m-toc-sidebar-expanded')) { |
| tocSidebar.find('.nav-collapsible').addClass('collapse').attr('aria-expanded', 'false'); |
| } |
| |
| // apply scrollspy to #m-toc-sidebar |
| $body.scrollspy({ |
| target: '#m-toc-sidebar', |
| offset: 0 |
| }); |
| |
| |
| // add auto collapse on scrollspy |
| if (tocSidebar.hasClass('m-toc-sidebar-autoexpandable')) { |
| |
| $window.on('activate.bs.scrollspy', function () { |
| var active = $('#m-toc-sidebar a.active'); |
| var collapsePanel = active.parent().next('ul.nav.nav-collapsible'); |
| tocSidebar.find('ul.nav.nav-collapsible').each(function (index, element) { |
| var el = $(element); |
| if (el.is(collapsePanel)) |
| return; |
| var children = el.find('a.active'); |
| if (children.length == 0) { |
| el.collapse('hide'); |
| } |
| }); |
| collapsePanel.collapse('show'); |
| active.parent().parent('ul.nav.nav-collapsible').collapse('show'); |
| }); |
| } |
| |
| } |
| |
| function initHighlight() { |
| // activate syntax higlighting with highlight.js |
| // Note: only run if `hljs` exists |
| if (typeof hljs !== 'undefined') { |
| // classic encoding with <div class="source"><pre></pre></div> |
| // and HTML5 version with <pre><code></code></pre> |
| // asciidoc with <div class="content"><pre></pre></div> |
| $('pre.source, div.source pre, pre code, div.content pre').each(function (i, e) { |
| hljs.highlightBlock(e); |
| }); |
| } |
| } |
| |
| function initTopNavBar() { |
| function resizeTopNavBar() { |
| var navbar = $('#m-top-navbar'); |
| var size = 0; |
| if (navbar.length) { |
| size = navbar.outerHeight(); |
| } |
| $('body').css('padding-top', size); |
| $('#m-toc-sidebar.toc-sidebar-fixed').css('top', size); |
| $('#m-toc-topbar').css('top', size); |
| } |
| $window.resize(resizeTopNavBar); |
| // initialize size on start up |
| resizeTopNavBar(); |
| // prevents the browser from opening a URL but allows that if tapped once |
| // again in succession |
| $('.dropdown-submenu').doubleTapToGo(); |
| |
| // auto adjust placement of sub dropdown menu when out of window. |
| $('.dropdown-submenu').on('mouseenter', function (event) { |
| var ww = $(window).width(); |
| var menu = $(this); |
| var $menuItem = menu.find('.dropdown-menu'); |
| var width = $menuItem.width(); |
| var mw = width + (menu.offset().left + menu.width()); |
| if (ww < mw) { |
| $menuItem.css('left', -1 * (width), 'important'); |
| } else { |
| $menuItem.css('left', '100%'); |
| } |
| }); |
| |
| } |
| |
| function scrollTo(el, offset, clbck) { |
| var pos = (el && el.length > 0) ? el.offset().top : 0; |
| pos = pos + (offset ? offset : 0); |
| |
| $('html,body').animate({ |
| scrollTop: pos |
| }, 300, clbck); |
| } |
| |
| function initScrollTop() { |
| var el = $("#m_scrolltop"); |
| |
| function handle() { |
| if ($(window).scrollTop() > 100) { |
| $body.addClass('m-scrolltop--on'); |
| } else { |
| $body.removeClass('m-scrolltop--on'); |
| } |
| } |
| |
| $window.scroll(function () { |
| handle(); |
| }); |
| |
| el.click(function () { |
| if ($body.hasClass('scrolltop-smooth-enabled')) { |
| scrollTo(0, 0); |
| } else { |
| $window.scrollTop(0); |
| } |
| }); |
| } |
| |
| var currentMenu = null; |
| |
| function loadFrame(href, slugName) { |
| if (href === currentMenu) { |
| return; |
| } |
| currentMenu = href; |
| $('#m-doc-frame').load(href, function (evt) { |
| // find li parent of 'href' |
| href = href.replace(/\./g, "\\."); |
| var item = $('.navside-menu a[slug-name="' + slugName + '"]').parent(); |
| // remove all active item |
| $('.navside-menu li').removeClass('active'); |
| // activate current item |
| item.addClass('active'); |
| |
| scrollTo(); |
| initCarousel(); |
| initTocTop(); |
| initTocSidebar(); |
| initHighlight(); |
| initAnchorJs(); |
| refreshScrollSpy(); |
| |
| var hash = window.location.hash; |
| // scroll to anchor if toc separator exists |
| if (hash && hash.indexOf(TOC_SEPARATOR) > 0) { |
| scrollTo($(hash)); |
| } |
| }); |
| } |
| |
| function initAnchorJs() { |
| if (!$body.hasClass('anchorjs-enabled')) { |
| return; |
| } |
| if (anchors && $body.hasClass('m-toc-sidebar-enabled') || $body.hasClass('m-toc-top-enabled') |
| || $body.hasClass('m-sidenav-enabled')) { |
| anchors.options = { |
| placement: 'right', |
| class: 'fas fa-link', |
| icon: '' |
| }; |
| anchors.add('.main-body h2:not(.no-anchor), .main-body h3:not(.no-anchor), .main-body h4:not(.no-anchor), .main-body h5:not(.no-anchor), .main-body h6:not(.no-anchor)'); |
| $(".main-body h2:not(.no-anchor), .main-body h3:not(.no-anchor), .main-body h4:not(.no-anchor), .main-body h5:not(.no-anchor), .main-body h6:not(.no-anchor)").wrapInner("<div></div>"); |
| } |
| } |
| |
| function initNavSidebar() { |
| var navSidebar = $('.navside-menu'); |
| if (navSidebar.length == 0) { |
| return; |
| } |
| |
| /** |
| * Gets the slug name of first <a> element in nav sidebar. |
| */ |
| function findFirstMenu() { |
| var href = $('.navside-menu a').first(); |
| return href.attr('slug-name'); |
| } |
| |
| /** |
| * create a link |
| * @param {*} slugName |
| * @param {*} chapter |
| */ |
| function hashes(slugName, chapter) { |
| var hash = '#' + slugName; |
| if (chapter) { |
| hash += TOC_SEPARATOR + chapter; |
| } |
| return hash; |
| } |
| |
| |
| /** |
| * Split the fragement of url and returns an array containing following info: |
| * - the slugname of section |
| * - the chapter in the section |
| * @param {*} url the url the split |
| */ |
| function splitUrl(url) { |
| var index = url.indexOf(TOC_SEPARATOR, url.indexOf('#')); |
| if (index >= 0) { |
| return [url.substring(0, index), url.substring(index + TOC_SEPARATOR.length)]; |
| } |
| return [url]; |
| } |
| |
| $window.bind('hashchange', function (evt) { |
| var originalEvt = evt.originalEvent; |
| // not load page if is identical |
| var oldURL; |
| var newURL; |
| var identicalPage = false; |
| |
| // do nothing if same url |
| if (originalEvt) { |
| oldURL = originalEvt.oldURL; |
| newURL = originalEvt.newURL; |
| if (oldURL === newURL) { |
| return; |
| } |
| } |
| |
| |
| |
| var item = null; |
| var hash = window.location.hash; |
| // set the first page in nav sidebar |
| if (window.location.hash == '') { |
| hash = hashes(findFirstMenu()); |
| } |
| |
| var chapter = ''; |
| var splittedUrl = splitUrl(hash); |
| var section = splittedUrl[0].substring(1); |
| if (splittedUrl.length > 1) { |
| chapter = splittedUrl[1]; |
| } else { |
| chapter = null; |
| } |
| |
| // search the item in nav sidebar corresponding to section |
| if (section.endsWith('html')) { |
| item = $('.navside-menu a[href$="' + section + '"]'); |
| } else { |
| item = $('.navside-menu a[slug-name$="' + section + '"]'); |
| } |
| if (item.length) { |
| |
| // expand the parent of item if it is sub-section menu. |
| var collapsible = item.parents('ul.collapse'); |
| if (collapsible.length > 0) { |
| collapsible.collapse('show'); |
| } |
| var slugName = item.attr('slug-name'); |
| window.location.hash = hashes(slugName, chapter); |
| |
| if (originalEvt) { |
| oldURL = splitUrl(originalEvt.oldURL); |
| newURL = splitUrl(originalEvt.newURL); |
| identicalPage = oldURL[0] === newURL[0]; |
| } |
| if (identicalPage) { |
| return; |
| } |
| var href = item.attr('href').substring(1); |
| loadFrame(href, slugName); |
| } |
| }); |
| |
| |
| // init fragment url part |
| var fragment = window.location.hash; |
| if (!fragment) { |
| var href = findFirstMenu(); |
| window.location.hash = hashes(href); |
| } else { |
| // enforce load frame |
| $window.trigger('hashchange'); |
| } |
| |
| // select first menu item on expand |
| if ($body.hasClass('m-sidenav-select-first-on-select')) { |
| navSidebar.on('shown.bs.collapse', function (ev) { |
| var el = $(ev.target); |
| // break if have already active item |
| if (el.find('li.active').length > 0) { |
| return; |
| } |
| |
| var href = el.find('li a').first(); |
| window.location.hash = hashes(href.attr('slug-name')); |
| }); |
| } |
| |
| // prevent event on collapse clik. |
| navSidebar.find("a[href=\\#]").click(function (event) { |
| event.preventDefault(); |
| }); |
| } |
| |
| |
| function refreshScrollSpy() { |
| $body.scrollspy('refresh'); |
| } |
| |
| return { |
| init: function () { |
| initCarousel(); |
| initTocSidebar(); |
| initTocTop(); |
| initNavSidebar(); |
| initScrollTop(); |
| initTopNavBar(); |
| initHighlight(); |
| initAnchorJs(); |
| refreshScrollSpy(); |
| } |
| }; |
| |
| }(); |
| |
| $(document).ready(function () { |
| mReflow.init(); |
| }); |
| |
| /* |
| * By Osvaldas Valutis, www.osvaldas.info Available for use under the MIT |
| * License |
| */ |
| (function ($, window, document, undefined) { |
| $.fn.doubleTapToGo = function (params) { |
| if (!('ontouchstart' in window) && !navigator.msMaxTouchPoints |
| && !navigator.userAgent.toLowerCase().match(/windows phone os 7/i)) |
| return false; |
| |
| this.each(function () { |
| var curItem = false; |
| |
| $(this).on('click', function (e) { |
| var item = $(this); |
| if (item[0] != curItem[0]) { |
| e.stopPropagation(); |
| e.preventDefault(); |
| curItem = item; |
| } |
| }); |
| |
| $(document).on('click touchstart MSPointerDown', function (e) { |
| var resetItem = true, parents = $(e.target).parents(); |
| |
| for (var i = 0; i < parents.length; i++) |
| if (parents[i] == curItem[0]) { |
| resetItem = false; |
| break; |
| } |
| |
| if (resetItem) |
| curItem = false; |
| }); |
| }); |
| return this; |
| }; |
| })(jQuery, window, document); |