您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a 'Sourcrgraph' Button on GitHub repository & file page.
// ==UserScript== // @name Add Sourcegraph Button to GitHub (updated) // @description Add a 'Sourcrgraph' Button on GitHub repository & file page. // @version 5 // @grant none // @inject-into auto // @supportURL https://github.com/whtsky/userscripts/issues // @match https://github.com/* // @namespace https://greasyfork.org/users/164794 // ==/UserScript== const pats = [ ['^/([^/]+)/([^/]+)/tree/([^/]+)$', '/github.com/$1/$2@$3'], ['^/([^/]+)/([^/]+)/tree/([^/]+)/(.+)$', '/github.com/$1/$2@$3/-/tree/$4'], ['^/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', '/github.com/$1/$2@$3/-/blob/$4'], ['^/([^/]+)/([^/]+)/?$', '/github.com/$1/$2'], ['^/([^/]+)/?$', '/$1'], ].map(([reg, replaceValue]) => ({ regexp: new RegExp(reg), replaceValue, })) const buttonID = 'userscript__sourcegraph' function getSourceGraphUrl() { var pathname = window.location.pathname for (const { regexp, replaceValue } of pats) { if (pathname.match(regexp)) { const pathname2 = pathname.replace(regexp, replaceValue) return 'https://sourcegraph.com' + pathname2 } } } /** * @returns {HTMLAnchorElement | null} */ function getCreatedButton() { return document.querySelector(`#${buttonID}`) } function createButton() { if (getCreatedButton()) { return } const targetBtn = document.querySelector('#repository-details-container') if (targetBtn) { /** * @type {HTMLAnchorElement} */ const newBtn = document.createElement('a') newBtn.id = buttonID newBtn.href = getSourceGraphUrl() // rounded Square border, line height 28px, svg is centered newBtn.style="display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; border:1px solid #ccc; border-radius:4px;" // blocked: csp (Content Security Policy), github has banned cross-site request for img src url, use svg or base64, <svg> elements may not be displayed, width should be specified explicitly. newBtn.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" fill="#FF5543" viewBox="0 0 24 24" width="80%" height="80%"> <path d="m9.663 6.991 3.238.862L10.8 0 7.065 1.005l1.227 4.611c.178.67.704 1.197 1.371 1.375M10.894 15.852l.1-.099.037.135L13.2 24l3.735-1.005-.914-3.434-2.443-9.15L.993 7.058 0 10.81l8.103 2.165.134.037-.097.099-5.94 5.944 2.729 2.752zM16.131 11.086l.867 3.25c.18.67.705 1.197 1.374 1.375l4.637 1.233.992-3.753-7.868-2.105zM15.464 8.522l1.824.067h.07c.515 0 1-.201 1.363-.567l3.077-3.08-2.728-2.751-2.987 2.982a1.94 1.94 0 0 0-.57 1.329l-.05 2.02"/> </svg> ` targetBtn.parentNode.insertBefore(newBtn, targetBtn) } } window.addEventListener('popstate', function() { const button = getCreatedButton() if (button) { button.href = getSourceGraphUrl() } }) const observer = new MutationObserver(function() { observer.disconnect() createButton() observer.observe(document.body, { childList: true, subtree: true }) }) observer.observe(document.body, { childList: true, subtree: true }) createButton()