您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Open external links in the "Checks" section in a new tab
当前为
- // ==UserScript==
- // @name GitHub - Pull Request - Open external status links externally
- // @namespace https://greasyfork.org/en/scripts?by=1388261
- // @version 1.0
- // @description Open external links in the "Checks" section in a new tab
- // @author nate.clark@hear.com
- // @match https://github.com/*/*/pull/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
- // @tag productivity
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- const nonGitHubTextKeys = ['sonarqube']
- const getRowText = (link) => link.parentNode.parentNode.innerText
- const isSonarQubeLink = (link) => {
- const text = getRowText(link)
- return text.toLowerCase().indexOf('sonarqube') > -1
- }
- const updateSonarQubeLink = (link) => {
- // https://sonarqube.service-production.audibene.net/dashboard?id=ta.opportunity-service&pullRequest=286
- // https://github.com/Audibene-GMBH/ta.opportunity-service/pull/286/checks?check_run_id=32341231160
- const pathnameParts = window.location.pathname.split('/')
- const repo = pathnameParts.at(2)
- const pullRequest = pathnameParts.at(4)
- const url = new URL('https://sonarqube.service-production.audibene.net/dashboard')
- url.searchParams.set('id', repo)
- url.searchParams.set('pullRequest', pullRequest)
- link.setAttribute('href', url.href)
- }
- const isNotGitHubLink = (link) => {
- const href = link.getAttribute('href')
- const text = getRowText(link)
- const isNonGitHub = href.startsWith('/') === false || nonGitHubTextKeys.some((key) => text.toLowerCase().indexOf(key.toLowerCase()) > -1)
- return isNonGitHub
- }
- const makeLinkExternal = (link) => {
- link.setAttribute('target', '_blank')
- link.innerHTML = `<span>Details</span><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16"><path fill="currentColor" d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2m6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03L9.28 7.78a.75.75 0 0 1-1.042-.018a.75.75 0 0 1-.018-1.042l3.75-3.75l-1.543-1.543A.25.25 0 0 1 10.604 1"/></svg>`
- link.style.display = 'grid'
- link.style.alignItems = 'center'
- link.style.gap = '0.25rem'
- link.style.gridAutoFlow = 'column'
- if (isSonarQubeLink(link)) {
- updateSonarQubeLink(link)
- }
- }
- const setLinkTargets = () => {
- const links = [...document.querySelectorAll('a.status-actions:not([target])')]
- const nonGitHubLinks = links.filter(isNotGitHubLink);
- nonGitHubLinks.forEach(makeLinkExternal)
- }
- // Because when a build is running, these links are constantly updated/refreshed
- setInterval(setLinkTargets, 500)
- })();