Refined Github Commit Rewind

Make World Better!

  1. // ==UserScript==
  2. // @name Refined Github Commit Rewind
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3
  5. // @description Make World Better!
  6. // @author Konv Suu
  7. // @license MIT
  8. // @match https://github.com/**
  9. // @icon https://cdn0.iconfinder.com/data/icons/data-analytics-orchid-vol-2/256/Reverse_Engineering-128.png
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. (function () {
  14. 'use strict'
  15.  
  16. function blankLinks() {
  17. const links = Array.from(document.querySelectorAll('.TimelineItem-body a'))
  18. links.forEach((link) => {
  19. link.setAttribute('target', '_blank')
  20. })
  21. }
  22.  
  23. function reverseTimelineItems() {
  24. const timeline = document.querySelector('.js-navigation-container.js-active-navigation-container.mt-3')
  25. const timelineItems = timeline.querySelectorAll('.TimelineItem.TimelineItem--condensed')
  26. timeline.innerHTML = ''
  27. const timelineItemsArr = Array.from(timelineItems).reverse()
  28.  
  29. timelineItemsArr[0].classList.remove('pt-2')
  30. timelineItemsArr[0].classList.add('pt-0')
  31. timelineItemsArr[timelineItemsArr.length - 1].classList.add('pt-2')
  32.  
  33. timelineItemsArr.forEach((item) => {
  34. reverseCommits(item.querySelector('.Box.Box--condensed'))
  35. timeline.appendChild(item)
  36. })
  37. }
  38.  
  39. function reverseCommits(timeline) {
  40. const commitItems = timeline.querySelectorAll('.Box-row.Box-row--focus-gray.js-commits-list-item.js-navigation-item')
  41. timeline.innerHTML = ''
  42. const commitItemsArr = Array.from(commitItems).reverse()
  43. commitItemsArr.forEach((item) => {
  44. timeline.appendChild(item)
  45. })
  46. }
  47.  
  48. let isAutoJump = JSON.parse(localStorage.getItem('is-auto-jump')) ?? false
  49.  
  50. function appendDOM() {
  51. const container = document.querySelector('.file-navigation')
  52.  
  53. const reverseBtn = document.createElement('button')
  54. reverseBtn.classList.add('btn', 'mt-2')
  55. reverseBtn.innerText = 'Reverse'
  56. reverseBtn.addEventListener('click', () => {
  57. reverseTimelineItems()
  58. })
  59.  
  60. const autoJumpBtn = document.createElement('button')
  61. autoJumpBtn.classList.add('btn', 'mt-2', 'mr-2')
  62. autoJumpBtn.innerText = isAutoJump ? 'Cancel Auto Jump' : 'Auto Jump'
  63. autoJumpBtn.addEventListener('click', () => {
  64. isAutoJump = !isAutoJump
  65. localStorage.setItem('is-auto-jump', JSON.parse(isAutoJump))
  66. autoJumpBtn.innerText = isAutoJump ? 'Cancel Auto Jump' : 'Auto Jump'
  67. })
  68.  
  69. container.appendChild(autoJumpBtn)
  70. container.appendChild(reverseBtn)
  71. }
  72.  
  73. function toLastPage() {
  74. if (!isAutoJump)
  75. return
  76.  
  77. const olderBtn = Array.from(document.querySelectorAll('.btn.BtnGroup-item'))[1]
  78.  
  79. if (olderBtn.getAttribute('disabled') === 'disabled') {
  80. isAutoJump = true
  81. localStorage.setItem('is-github-commit-last-page', JSON.parse(true))
  82. }
  83. olderBtn.click()
  84. }
  85.  
  86. function run() {
  87. if (location.href.startsWith('https://github.com/') && location.href.split('/').includes('commits')) {
  88. blankLinks()
  89. appendDOM()
  90. toLastPage()
  91. }
  92. }
  93.  
  94. run()
  95.  
  96. // listen to github page loaded event
  97. document.addEventListener('pjax:end', () => run())
  98. document.addEventListener('turbo:render', () => run())
  99. })()

QingJ © 2025

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