Greasy Fork is available in English.

github-repo-info

Add ⌛creation date/🍴forks/📁 repo size to repo search result page,code search page and repo detail page.

  1. // ==UserScript==
  2. // @name github-repo-info
  3. // @name:zh-CN github显示仓库信息
  4. // @namespace http://tampermonkey.net/
  5. // @version 0.3
  6. // @description Add ⌛creation date/🍴forks/📁 repo size to repo search result page,code search page and repo detail page.
  7. // @description:zh-cn 向仓库搜索页,代码搜索页,仓库主页添加 ⌛创建时间/🍴fork数/📁文件大小显示
  8. // @author CXXN008
  9. // @match *://github.com/*/*
  10. // @match *://github.com/search*
  11. // @source https://github.com/CXXN008/github-repo-info
  12. // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
  13. // @grant window.onurlchange
  14. // @license MIT
  15. // ==/UserScript==
  16.  
  17. 'use strict';
  18. // github free rates are limited to 5000 requests / hour ,if u get some errors in console , try https://github.com/settings/tokens -> Generate new token & paste here
  19. const API_TOKEN = atob('Z2l0aHViX3BhdF8xMUFaRldORVEwZE5CRE1zalRRTG4zX3dua2NDeFNFR1lmeHJueWpiSjdLUE1WeG1PYlRVNFhYNHYzV1liZlFNWFU2N0hPN1I1UE5yUkt1SHY0')
  20. const PARAMS = {
  21. "headers": {
  22. "authorization": `token ${API_TOKEN}`,
  23. }
  24. }
  25. const FORKS_PAGESIZE = 50
  26. const STYLE = ``
  27. const CLICKABLESPANSTYLE = 'background-color:#000;color:#0f0;cursor:help'
  28.  
  29. const PAGE_SELECTOR = { 'search': 'li.repo-list-item> div > div> div > a.v-align-middle', 'repo': 'strong.mr-2 > a:nth-child(1)', 'code': '.Link--secondary' }
  30.  
  31. let hasLoaded = false
  32.  
  33. const appendForksList = async (href) => {
  34.  
  35. let forksList = document.querySelector('#forks-list')
  36. if (forksList ===null) {
  37. forksList = document.createElement('span')
  38. forksList.id = 'forks-list'
  39. forksList.style.cssText = `background-color:#0000003f;position:absolute;left:0;top:60px;color:#0f0;z-index:9999`
  40. }
  41.  
  42. forksList.innerHTML = `🍴${href.slice(1)}'s forks(sorted by star counts ↓)<br>Loading ... ...`
  43. const forksJ = (await (await fetch(`https://api.github.com/repos${href}/forks?per_page=${FORKS_PAGESIZE}&sort=stargazers`, PARAMS)).json())
  44. let forksHTML = ''
  45. forksJ.forEach(forkJ => forksHTML += `<a href=${forkJ.html_url}>💻${forkJ.full_name}/⌛${forkJ.created_at.split('T')[0]}/⭐${forkJ.stargazers_count}/🍴${forkJ.forks_count}</a><br>`)
  46.  
  47. forksList.innerHTML = forksList.innerHTML.replace('Loading ... ...',forksHTML)
  48. document.body.insertAdjacentElement('afterbegin',forksList)
  49. }
  50.  
  51. const getPageType = (urlParams) => {
  52. const q = urlParams.get("q")?.toLocaleLowerCase();
  53. const type = urlParams.get("type")?.toLocaleLowerCase();
  54. if (q) {
  55. if (type === 'code') {
  56. return 'code'
  57. } else {
  58. return 'search'
  59. }
  60. } else {
  61. return 'repo'
  62. }
  63. }
  64.  
  65. const fireUp = () => {
  66.  
  67. //replace date
  68. //const engDate = document.querySelector('relative-time')
  69. //engDate.textContent = engDate.getAttribute('datetime')
  70.  
  71.  
  72. // console.log(c)
  73.  
  74.  
  75. const pageType = getPageType(new URLSearchParams(location.search))
  76. // console.log(pageType)
  77. document.querySelectorAll(PAGE_SELECTOR[pageType]).forEach(async e => {
  78. const p = e.parentElement
  79. let span = p.querySelector(`#my-span-tag`)
  80. if (span === null) {
  81. span = document.createElement('span')
  82. span.id = 'my-span-tag'
  83. span.style = STYLE
  84. span.innerText = '... ...'
  85. p.insertAdjacentElement('beforeend', span)
  86.  
  87.  
  88. const href = e.getAttribute('href')
  89. const j = (await (await fetch(`https://api.github.com/repos${href}`, PARAMS)).json())
  90.  
  91. const date = j.created_at.split('T')[0]
  92. const size = (j.size / 1024).toFixed(2)
  93. const forks = j.forks_count
  94. const stars = j.stargazers_count
  95.  
  96.  
  97. // /<span style=${CLICKABLESPANSTYLE}>🍴${forks}</span>/<span style=${CLICKABLESPANSTYLE}>📁${size}MB</span>
  98.  
  99. const textHTML = `/⌛${date}/⭐${stars}`
  100.  
  101. span.innerText = ''
  102. span.insertAdjacentText('beforeend', textHTML)
  103.  
  104.  
  105. let forksBtn = document.createElement('span')
  106. forksBtn.style = CLICKABLESPANSTYLE
  107. forksBtn.innerText =`/🍴${forks}`
  108. forksBtn.addEventListener('click',()=>appendForksList(href))
  109. span.insertAdjacentElement('beforeend',forksBtn)
  110.  
  111. let sizeBtn = document.createElement('span')
  112. // sizeBtn.style = CLICKABLESPANSTYLE
  113. sizeBtn.innerText =`/📁${size}MB`
  114. // sizeBtn.addEventListener('click',()=>appendForksList(href))
  115. span.insertAdjacentElement('beforeend',sizeBtn)
  116.  
  117.  
  118. }
  119. })
  120. }
  121.  
  122.  
  123.  
  124. window.onurlchange = (c) => {
  125. if (!hasLoaded) {
  126. hasLoaded = !hasLoaded
  127. return
  128. }
  129. fireUp()
  130. }
  131.  
  132. fireUp()
  133.