NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name GitHub Pages Link // @version 0.1.0 // @description A userscript that adds pages link to repository // @license MIT // @author Jim Cheung // @namespace https://github.com/jinhucheung // @include https://github.com/* // @run-at document-idle // @grant none // @icon https://github.githubassets.com/pinned-octocat.svg // @updateURL https://raw.githubusercontent.com/jinhucheung/GitHub-userscripts/master/github-pages-link.user.js // @downloadURL https://raw.githubusercontent.com/jinhucheung/GitHub-userscripts/master/github-pages-link.user.js // ==/UserScript== (function() { "use strict"; var selectors = { // repository content repoContent: ".repository-content", // pages enironments pagesEnv: ".BorderGrid-cell a[href$='environment=github-pages']", // pages link pagesLink: "a[role='link']", // repo link on side repoLinkGridPreSibling: ".BorderGrid .BorderGrid-row:first-child > .BorderGrid-cell > h2 ~ .f4", // repo link on header repoLinkHeaderPreSibling: "#js-repo-pjax-container > .hide-full-screen > .d-block > p" } var pagesHostTemplete = "{space}.github.io" var pagesLinkTemplete = '<div class="d-flex flex-items-center {containerClass}">' + '<svg mr="2" classes="flex-shrink-0" height="16" class="octicon octicon-link flex-shrink-0 mr-2" viewBox="0 0 16 16" version="1.1" width="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg>' + '<span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit">' + '<a title="https://{pagesLink}" role="link" target="_blank" class="text-bold" rel="noopener noreferrer" href="https://{pagesLink}">{pagesLink}</a>' + '</span>' + '</div>' function isEnablePages() { var repoContent = document.querySelector(selectors.repoContent) return repoContent && repoContent.querySelector(selectors.repoLinkGridPreSibling) && getPagesLink() } function isNotFoundPagesLink() { return !document.querySelector(selectors.pagesLink) } function getPagesLink() { var paths = location.pathname.split("/") var space = paths[1] || "" var repoPath = paths[2] || "" var pageLink = pagesHostTemplete.replace("{space}", space) if (repoPath.toLowerCase() !== pageLink.toLowerCase()) { if (!document.querySelector(selectors.pagesEnv)) return pageLink = pageLink + "/" + repoPath } return pageLink } function addPagesLink() { var pagesLink = getPagesLink() if (!pagesLink) return false var repoLinkGridPreSibling = document.querySelector(selectors.repoLinkGridPreSibling) if (repoLinkGridPreSibling) { var repoLinkGridContent = pagesLinkTemplete.replaceAll("{containerClass}", "mt-3").replaceAll("{pagesLink}", pagesLink) repoLinkGridPreSibling.outerHTML += repoLinkGridContent } var repoLinkHeaderPreSibling = document.querySelector(selectors.repoLinkHeaderPreSibling) if (repoLinkHeaderPreSibling) { var repoLinkHeaderContent = pagesLinkTemplete.replaceAll("{containerClass}", "mb-2").replaceAll("{pagesLink}", pagesLink) repoLinkHeaderPreSibling.outerHTML += repoLinkHeaderContent } return true } function setup() { return isEnablePages() && isNotFoundPagesLink() && addPagesLink() } function init() { var success = setup() if (!success) { window.setTimeout(init, 2000) } } document.addEventListener("pjax:end", init) init() })()