var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery'); // Sphinx theme nav state function ThemeNav () { var nav = { navBar: null, win: null, winScroll: false, winResize: false, linkScroll: false, winPosition: 0, winHeight: null, docHeight: null, isRunning: false }; nav.enable = function () { var self = this; if (!self.isRunning) { self.isRunning = true; jQuery(function ($) { self.init($); self.reset(); self.win.on('hashchange', self.reset); // Set scroll monitor self.win.on('scroll', function () { if (!self.linkScroll) { self.winScroll = true; } }); setInterval(function () { if (self.winScroll) self.onScroll(); }, 25); // Set resize monitor self.win.on('resize', function () { self.winResize = true; }); setInterval(function () { if (self.winResize) self.onResize(); }, 25); self.onResize(); }); }; }; nav.init = function ($) { var doc = $(document), self = this; this.navBar = $('div.wy-side-scroll:first'); this.win = $(window); // Set up javascript UX bits $(document) // Shift nav in mobile when clicking the menu. .on('click', "[data-toggle='wy-nav-top']", function() { $("[data-toggle='wy-nav-shift']").toggleClass("shift"); $("[data-toggle='rst-versions']").toggleClass("shift"); }) // Nav menu link click operations .on('click', ".wy-menu-vertical .current ul li a", function() { var target = $(this); // Close menu when you click a link. $("[data-toggle='wy-nav-shift']").removeClass("shift"); $("[data-toggle='rst-versions']").toggleClass("shift"); // Handle dynamic display of l3 and l4 nav lists self.toggleCurrent(target); self.hashChange(); }) .on('click', "[data-toggle='rst-current-version']", function() { $("[data-toggle='rst-versions']").toggleClass("shift-up"); }) // Make tables responsive $("table.docutils:not(.field-list)") .wrap("
"); // Add expand links to all parents of nested ul $('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () { var link = $(this); expand = $(''); expand.on('click', function (ev) { self.toggleCurrent(link); ev.stopPropagation(); return false; }); link.prepend(expand); }); }; nav.reset = function () { // Get anchor from URL and open up nested nav var anchor = encodeURI(window.location.hash); if (anchor) { try { var link = $('.wy-menu-vertical') .find('[href="' + anchor + '"]'); $('.wy-menu-vertical li.toctree-l1 li.current') .removeClass('current'); link.closest('li.toctree-l2').addClass('current'); link.closest('li.toctree-l3').addClass('current'); link.closest('li.toctree-l4').addClass('current'); } catch (err) { console.log("Error expanding nav for anchor", err); } } }; nav.onScroll = function () { this.winScroll = false; var newWinPosition = this.win.scrollTop(), winBottom = newWinPosition + this.winHeight, navPosition = this.navBar.scrollTop(), newNavPosition = navPosition + (newWinPosition - this.winPosition); if (newWinPosition < 0 || winBottom > this.docHeight) { return; } this.navBar.scrollTop(newNavPosition); this.winPosition = newWinPosition; }; nav.onResize = function () { this.winResize = false; this.winHeight = this.win.height(); this.docHeight = $(document).height(); }; nav.hashChange = function () { this.linkScroll = true; this.win.one('hashchange', function () { this.linkScroll = false; }); }; nav.toggleCurrent = function (elem) { var parent_li = elem.closest('li'); parent_li.siblings('li.current').removeClass('current'); parent_li.siblings().find('li.current').removeClass('current'); parent_li.find('> ul li.current').removeClass('current'); parent_li.toggleClass('current'); } return nav; }; module.exports.ThemeNav = ThemeNav(); if (typeof(window) != 'undefined') { window.SphinxRtdTheme = { StickyNav: module.exports.ThemeNav }; }