diff --git a/js/scroll-to-anchor.js b/js/scroll-to-anchor.js deleted file mode 100644 index da092e5c..00000000 --- a/js/scroll-to-anchor.js +++ /dev/null @@ -1,99 +0,0 @@ -// Modified from https://stackoverflow.com/a/13067009 -// Going for a JS solution to scrolling to an anchor so we can benefit from -// less hacky css and smooth scrolling. - -window.scrollToAnchor = { - bind: function() { - var document = window.document; - var history = window.history; - var location = window.location - var HISTORY_SUPPORT = !!(history && history.pushState); - - var anchorScrolls = { - ANCHOR_REGEX: /^#[^ ]+$/, - offsetHeightPx: function() { - var OFFSET_HEIGHT_PADDING = 20; - // TODO: this is a little janky. We should try to not rely on JS for this - return utilities.headersHeight() + OFFSET_HEIGHT_PADDING; - }, - - /** - * Establish events, and fix initial scroll position if a hash is provided. - */ - init: function() { - this.scrollToCurrent(); - // This interferes with clicks below it, causing a double fire - // $(window).on('hashchange', $.proxy(this, 'scrollToCurrent')); - $('body').on('click', 'a', $.proxy(this, 'delegateAnchors')); - $('body').on('click', '#pytorch-right-menu li span', $.proxy(this, 'delegateSpans')); - }, - - /** - * Return the offset amount to deduct from the normal scroll position. - * Modify as appropriate to allow for dynamic calculations - */ - getFixedOffset: function() { - return this.offsetHeightPx(); - }, - - /** - * If the provided href is an anchor which resolves to an element on the - * page, scroll to it. - * @param {String} href - * @return {Boolean} - Was the href an anchor. - */ - scrollIfAnchor: function(href, pushToHistory) { - var match, anchorOffset; - - if(!this.ANCHOR_REGEX.test(href)) { - return false; - } - - match = document.getElementById(href.slice(1)); - - if(match) { - var anchorOffset = $(match).offset().top - this.getFixedOffset(); - - $('html, body').scrollTop(anchorOffset); - - // Add the state to history as-per normal anchor links - if(HISTORY_SUPPORT && pushToHistory) { - history.pushState({}, document.title, location.pathname + href); - } - } - - return !!match; - }, - - /** - * Attempt to scroll to the current location's hash. - */ - scrollToCurrent: function(e) { - if(this.scrollIfAnchor(window.location.hash) && e) { - e.preventDefault(); - } - }, - - delegateSpans: function(e) { - var elem = utilities.closest(e.target, "a"); - - if(this.scrollIfAnchor(elem.getAttribute('href'), true)) { - e.preventDefault(); - } - }, - - /** - * If the click event's target was an anchor, fix the scroll position. - */ - delegateAnchors: function(e) { - var elem = e.target; - - if(this.scrollIfAnchor(elem.getAttribute('href'), true)) { - e.preventDefault(); - } - } - }; - - $(document).ready($.proxy(anchorScrolls, 'init')); - } -}; diff --git a/js/theme.js b/js/theme.js index 1c44e34c..b26200dc 100644 --- a/js/theme.js +++ b/js/theme.js @@ -250,10 +250,19 @@ if (downloadNote.length >= 1) { var tutorialUrlArray = $("#tutorial-type").text().split('/'); tutorialUrlArray[0] = tutorialUrlArray[0] + "_source" - var githubLink = "https://github.com/pytorch/tutorials/blob/master/" + tutorialUrlArray.join("/") + ".py", - notebookLink = $(".reference.download")[1].href, - notebookDownloadPath = notebookLink.split('_downloads')[1], - colabLink = "https://colab.research.google.com/github/pytorch/tutorials/blob/gh-pages/_downloads" + notebookDownloadPath; + var githubLink = "https://github.com/pytorch/tutorials/blob/master/" + tutorialUrlArray.join("/") + ".py"; + var notebookLink = ""; + // some versions of sphinx gallery have different orders of the download + // links so we need to check if the link ends with .ipynb to find the + // correct one + for (var i = 0; i < $(".reference.download").length; i++) { + notebookLink = $(".reference.download")[i].href; + if (notebookLink.endsWith(".ipynb")) { + break; + } + } + var notebookDownloadPath = notebookLink.split('_downloads')[1]; + var colabLink = "https://colab.research.google.com/github/pytorch/tutorials/blob/gh-pages/_downloads" + notebookDownloadPath; $("#google-colab-link").wrap(""); $("#download-notebook-link").wrap(""); @@ -428,4 +437,3 @@ $(window).scroll(function () { } }); }); - diff --git a/pytorch_sphinx_theme/layout.html b/pytorch_sphinx_theme/layout.html index ec98e804..008284e5 100644 --- a/pytorch_sphinx_theme/layout.html +++ b/pytorch_sphinx_theme/layout.html @@ -712,7 +712,6 @@

Resources

mobileTOC.bind(); pytorchAnchors.bind(); sideMenus.bind(); - scrollToAnchor.bind(); highlightNavigation.bind(); mainMenuDropdown.bind(); filterTags.bind(); diff --git a/pytorch_sphinx_theme/static/css/theme.css b/pytorch_sphinx_theme/static/css/theme.css index c04db2d2..592039c8 100644 --- a/pytorch_sphinx_theme/static/css/theme.css +++ b/pytorch_sphinx_theme/static/css/theme.css @@ -12591,4 +12591,15 @@ article.pytorch-article .tutorials-callout-container .btn.callout-button a { color: white; } +/* Scroll padding to account for fixed header when navigating to anchors */ +html { + scroll-padding-top: 90px; +} +@media screen and (min-width: 1201px) { + html { + /* page-level-bar (45px) + padding (20px) when fixed */ + scroll-padding-top: 65px; + } +} + /*# sourceMappingURL=theme.css.map */ diff --git a/pytorch_sphinx_theme/static/js/theme.js b/pytorch_sphinx_theme/static/js/theme.js index ceee8f06..695643f3 100644 --- a/pytorch_sphinx_theme/static/js/theme.js +++ b/pytorch_sphinx_theme/static/js/theme.js @@ -383,107 +383,6 @@ window.pytorchAnchors = { }; },{}],9:[function(require,module,exports){ -// Modified from https://stackoverflow.com/a/13067009 -// Going for a JS solution to scrolling to an anchor so we can benefit from -// less hacky css and smooth scrolling. - -window.scrollToAnchor = { - bind: function() { - var document = window.document; - var history = window.history; - var location = window.location - var HISTORY_SUPPORT = !!(history && history.pushState); - - var anchorScrolls = { - ANCHOR_REGEX: /^#[^ ]+$/, - offsetHeightPx: function() { - var OFFSET_HEIGHT_PADDING = 20; - // TODO: this is a little janky. We should try to not rely on JS for this - return utilities.headersHeight() + OFFSET_HEIGHT_PADDING; - }, - - /** - * Establish events, and fix initial scroll position if a hash is provided. - */ - init: function() { - this.scrollToCurrent(); - // This interferes with clicks below it, causing a double fire - // $(window).on('hashchange', $.proxy(this, 'scrollToCurrent')); - $('body').on('click', 'a', $.proxy(this, 'delegateAnchors')); - $('body').on('click', '#pytorch-right-menu li span', $.proxy(this, 'delegateSpans')); - }, - - /** - * Return the offset amount to deduct from the normal scroll position. - * Modify as appropriate to allow for dynamic calculations - */ - getFixedOffset: function() { - return this.offsetHeightPx(); - }, - - /** - * If the provided href is an anchor which resolves to an element on the - * page, scroll to it. - * @param {String} href - * @return {Boolean} - Was the href an anchor. - */ - scrollIfAnchor: function(href, pushToHistory) { - var match, anchorOffset; - - if(!this.ANCHOR_REGEX.test(href)) { - return false; - } - - match = document.getElementById(href.slice(1)); - - if(match) { - var anchorOffset = $(match).offset().top - this.getFixedOffset(); - - $('html, body').scrollTop(anchorOffset); - - // Add the state to history as-per normal anchor links - if(HISTORY_SUPPORT && pushToHistory) { - history.pushState({}, document.title, location.pathname + href); - } - } - - return !!match; - }, - - /** - * Attempt to scroll to the current location's hash. - */ - scrollToCurrent: function(e) { - if(this.scrollIfAnchor(window.location.hash) && e) { - e.preventDefault(); - } - }, - - delegateSpans: function(e) { - var elem = utilities.closest(e.target, "a"); - - if(this.scrollIfAnchor(elem.getAttribute('href'), true)) { - e.preventDefault(); - } - }, - - /** - * If the click event's target was an anchor, fix the scroll position. - */ - delegateAnchors: function(e) { - var elem = e.target; - - if(this.scrollIfAnchor(elem.getAttribute('href'), true)) { - e.preventDefault(); - } - } - }; - - $(document).ready($.proxy(anchorScrolls, 'init')); - } -}; - -},{}],10:[function(require,module,exports){ window.sideMenus = { rightMenuIsOnScreen: function() { return document.getElementById("pytorch-content-right").offsetParent !== null; @@ -945,10 +844,19 @@ if (downloadNote.length >= 1) { var tutorialUrlArray = $("#tutorial-type").text().split('/'); tutorialUrlArray[0] = tutorialUrlArray[0] + "_source" - var githubLink = "https://github.com/pytorch/tutorials/blob/master/" + tutorialUrlArray.join("/") + ".py", - notebookLink = $(".reference.download")[1].href, - notebookDownloadPath = notebookLink.split('_downloads')[1], - colabLink = "https://colab.research.google.com/github/pytorch/tutorials/blob/gh-pages/_downloads" + notebookDownloadPath; + var githubLink = "https://github.com/pytorch/tutorials/blob/master/" + tutorialUrlArray.join("/") + ".py"; + var notebookLink = ""; + // some versions of sphinx gallery have different orders of the download + // links so we need to check if the link ends with .ipynb to find the + // correct one + for (var i = 0; i < $(".reference.download").length; i++) { + notebookLink = $(".reference.download")[i].href; + if (notebookLink.endsWith(".ipynb")) { + break; + } + } + var notebookDownloadPath = notebookLink.split('_downloads')[1]; + var colabLink = "https://colab.research.google.com/github/pytorch/tutorials/blob/gh-pages/_downloads" + notebookDownloadPath; $("#google-colab-link").wrap("
"); $("#download-notebook-link").wrap("");