function sprongulate() { // Since GitHub is an SPA, we can't limit ourselves to only loading on // specifically nixpkgs PRs, as synthetic browser navigation doesn't // trigger content script loading. Thus, we have to load on all pages, // and ensure we're on a nixpkgs PR before running. const [, NixOS, nixpkgs, pull, number] = new URL(window.location.href).pathname.split('/') if (NixOS !== 'NixOS' || nixpkgs !== 'nixpkgs' || pull !== 'pull') return // There are (at the time of writing) two contexts in which the PR // number is visible: // // 1. in the header (following the PR title) // 2. sufficiently far down that the header is no longer visible (at // which point the header shrinks and affixes itself to the top of // the page) // // These are actually two distinct elements, the visibility of which // are dependent on your scroll position. They also have completely // different (and nondescript) CSS selectors, so instead of looking // for them directly, we locate the immediately preceding PR title // elements (which *do* have a common CSS selector), to find them. for (let node of document.querySelectorAll('.js-issue-title')) { node = node.nextElementSibling const a = document.createElement('a') a.setAttribute('href', `https://nixpk.gs/pr-tracker.html?pr=${number}`) node.replaceWith(a) a.appendChild(node) } } // Once on first page load... sprongulate() // ...and once every time there is new page content. document.addEventListener('pjax:end', sprongulate)