Add Sourcegraph Button to GitHub

Add a 'Sourcrgraph' Button on GitHub repository & file page.

目前为 2020-03-04 提交的版本。查看 最新版本

// ==UserScript==
// @name    Add Sourcegraph Button to GitHub
// @description Add a 'Sourcrgraph' Button on GitHub repository & file page.
// @version 4
// @grant   none
// @inject-into auto
// @supportURL https://github.com/whtsky/userscripts/issues
// @match   https://github.com/*
// @namespace https://gf.qytechs.cn/users/164794
// ==/UserScript==

function getSourceGraphUrl() {
  var pats = [
    [
      '^/([^/]+)/([^/]+)/tree/([^/]+)$',
      '/github.com/$1/$2@$3',
      '^/github.com/([^/]+)/([^/@]+)@([^/]+)$',
      '/$1/$2/tree/$3',
    ],
    [
      '^/([^/]+)/([^/]+)/tree/([^/]+)/(.+)$',
      '/github.com/$1/$2@$3/-/tree/$4',
      '^/github.com/([^/]+)/([^/@]+)@([^/]+)/-/tree/(.+)$',
      '/$1/$2/tree/$3/$4',
    ],
    ['^/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', '/github.com/$1/$2@$3/-/blob/$4', '', ''],
    ['^/([^/]+)/([^/]+)$', '/github.com/$1/$2', '^/github.com/([^/]+)/([^/]+)$', '/$1/$2'],
    ['^/([^/]+)$', '/$1', '^/([^/]+)$', '/$1'],
  ]
  var pathname = window.location.pathname
  for (var i = 0; i < pats.length; i++) {
    var pat = pats[i]
    var r, pathname2
    if (window.location.hostname === 'github.com') {
      if (pat[0] === '') {
        continue
      }
      r = new RegExp(pat[0])
      if (pathname.match(r)) {
        pathname2 = pathname.replace(r, pat[1])
        return 'https://sourcegraph.com' + pathname2
      }
    } else {
      if (pat[2] === '') {
        continue
      }
      r = new RegExp(pat[2])
      if (pathname.match(r)) {
        pathname2 = pathname.replace(r, pat[3])
        return 'https://github.com' + pathname2
      }
    }
  }
}

function goToSourcegraph(event) {
  event.preventDefault()
  const sourceGraphUrl = getSourceGraphUrl()
  if (sourceGraphUrl) {
    window.location = sourceGraphUrl
  } else {
    alert('Unable to jump to Sourcegraph (no matching URL pattern).')
  }
}

function createButton() {
  if (document.querySelector('#userscript__sourcegraph')) {
    return
  }
  const targetBtn = document.querySelector('#raw-url') || document.querySelector('.file-navigation a.BtnGroup-item')
  if (targetBtn) {
    const newBtn = targetBtn.cloneNode(false)
    newBtn.setAttribute('id', 'userscript__sourcegraph')
    newBtn.setAttribute('class', 'btn btn-sm BtnGroup-item')
    newBtn.textContent = 'Sourcegraph'
    newBtn.href = ''
    newBtn.addEventListener('click', goToSourcegraph)
    targetBtn.parentNode.insertBefore(newBtn, targetBtn)
    targetBtn.parentNode.addEventListener('mouseenter', () => {
      newBtn.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()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址