您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Keeps entries on the GitHub dashboard page ordered from the newest one to the oldest one, but the More button may not always appear.
- // ==UserScript==
- // @name Fix Order of GitHub Dashboard
- // @namespace http://prantlf.me/
- // @version 2.2
- // @description Keeps entries on the GitHub dashboard page ordered from the newest one to the oldest one, but the More button may not always appear.
- // @author prantlf@gmail.com
- // @license MIT
- // @match https://github.com/
- // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- const dashboard = document.getElementById('dashboard')
- let observe = true
- const observer = new MutationObserver(mutations => {
- if (observe && mutations.some(mutatedArticle)) {
- console.debug('[fix-order]', 'new articles detected')
- debounce(reorder)
- }
- })
- observer.observe(dashboard, { childList: true, subtree: true })
- function mutatedArticle({ target, addedNodes }) {
- return isOrHasArticle(target) || Array.from(addedNodes).some(isOrHasArticle)
- }
- function isOrHasArticle(el) {
- return el.tagName === 'ARTICLE' || el.nodeType === 1 && el.getElementsByTagName('ARTICLE').length > 0
- }
- let debouncing
- function debounce(fn) {
- if (debouncing) {
- clearTimeout(debouncing)
- debouncing = undefined
- }
- debouncing = setTimeout(fn, 100)
- }
- function reorder() {
- observe = false
- const feeds = Array.from(dashboard.getElementsByTagName('TURBO-FRAME'))
- const articles = feeds
- .map(frame => Array.from(frame.children).filter(el => el.tagName === 'ARTICLE'))
- .flat()
- const position = document.documentElement.scrollTop
- const now = new Date
- for (const article of articles) {
- const { nextElementSibling: div } = article
- article.div = div
- const time = article.querySelector('relative-time')
- article.time = time && new Date(time.getAttribute('datetime')) || now
- article.remove()
- div.remove()
- }
- articles.sort((l, r) => l.time < r.time ? 1 : l.time > r.time ? -1 : 0)
- const feed = feeds[feeds.length - 1]
- let { firstElementChild: anchor } = feed
- for (const article of articles) {
- const { div } = article
- anchor.insertAdjacentElement('afterend', article)
- article.insertAdjacentElement('afterend', div)
- delete article.div
- delete article.time
- anchor = div
- }
- console.debug('[fix-order]', articles.length, 'articles reordered')
- setTimeout(() => {
- document.documentElement.scrollTop = position
- observe = true
- })
- }
- })();