您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Apply default sort to subs listing (SH bug)
当前为
// ==UserScript== // @name Reddit - Subs - default sort // @namespace https://github.com/Procyon-b // @version 0.4 // @description Apply default sort to subs listing (SH bug) // @author Achernar // @match https://www.reddit.com/* // @run-at document-start // @grant none // ==/UserScript== (function() { "use strict"; var sort={}; const RE=/^(?:https:\/\/(?:sh|www)\.reddit\.com)?(\/(?:r\/[^\/]+\/)?)(?:(best|new|hot|top|rising)\/)?(?:\?.*)?$/; const REval=/^(best|new|hot|top|rising)?$/; var SR=[]; var done=false; function init() { if (done) return; done=true; document && document.body && chk(); newObs(document.body); window.addEventListener('focus', function(){ if (load()) { chk(null, true); updLeftNav(); } }); if (window == top) { var e=document.createElement('div'); e.style='position: fixed; top: 0; left: 0; width: 15px; height: 15px; z-index: 9999;'; document.body.appendChild(e); e.ondblclick=function(){ var p; do { p=prompt('Default sort\nChoose between: [empty] - hot - new - top - rising', sort.default); if (p == null) break; } while (!REval.test(p)); if (p != null) { if (p) sort.default=p; else delete sort.default; store(); chk(null, true); updLeftNav(); } p=prompt('Auto-redirect to correct sort ?\nEither: [empty field] - true - force - ask', sort.redir); if (p != null) { if (p) sort.redir = p; else delete sort.redir; store(); } }; } } function gen(re) { var s=sort[re[1]] || ''; if (s) s+='/'; else if ((re[1] != '/') && sort.default) s=sort.default+'/'; return s; } function chk(r, force=false) { var a=(r||document).getElementsByTagName("a"); if (r && (r.nodeName == 'A')) a=[r, ...a]; for (let i=0,e; e=a[i]; i++) { if (!force && e._sortfixed) continue; e._sortfixed=true; if (e.hostname == 'www.reddit.com') { let re; if (re=RE.exec(e.pathname + (!e.pathname.endsWith('/') ? '/':'' ) )) { if (e.closest('[slot="dropdown-items"], faceplate-dropdown-menu')) continue; e.classList.add('_marked_'); let s=gen(re); e.pathname=re[1]+s; } } } a=(r||document).querySelectorAll('pdp-back-button[subreddit-prefixed-name]'); for (let i=0,e; e=a[i]; i++) { if (!force && e._sortfixed) continue; e._sortfixed=true; let re, v=e.attributes['subreddit-prefixed-name'].value; if (re=RE.exec('/'+v+'/')) { e.classList.add('_marked_'); let s=gen(re); e.attributes['subreddit-prefixed-name'].value=(re[1]+s).replace(/^\/(.+)\/$/, "$1"); } } } var AS=HTMLElement.prototype.attachShadow; HTMLElement.prototype.attachShadow=function(m){/*[native */ var e=this; let sr=AS.call(e,m); if (e.tagName == 'REDDIT-RECENT-PAGES') { SR.push(sr); newObs(sr, cbRec); e.SR=true; } else if (e.tagName.startsWith('LEFT-NAV-') || (e.tagName == 'SHREDDIT-SUBREDDIT-HEADER') || (e.tagName == 'MOD-NAV') ) { SR.push(sr); newObs(sr); e.SR=true; } return sr; } function updLeftNav() { for(let r, i=0; r=SR[i]; i++) { for(let e, j=0; e=r.children[j]; j++) { chk(e, true); } } } function ds(sub, s) { let d= sub == '/' ? 'best' : (sort.default?'DEF':''); return s == d ? '' : s; } function patchFetch() { // XHR - Fetch const _fetch=window.fetch; window.fetch = async (...args) => { let [resource, config ] = args; let response = await _fetch(resource, config); let re; if ( re=RE.exec(resource) ) { let s=ds(re[1], re[2]); if (s != ds(re[1],sort[re[1]] || '') ) { if ( (re[1] != '/') && sort.default && (s == sort.default) ) s=''; if (s) sort[re[1]] = s; else delete sort[re[1]]; store(); chk(null, true); updLeftNav(); } } return response; }; } function newObs(r, f=cb) { var o=new MutationObserver(f), config = { attributes: false, childList: true, subtree: true}; o.observe(r, config); return o; } function cb(mutL) { for(let mut of mutL) { if (mut.type == 'childList') { for (let e,i=0; e=mut.addedNodes[i]; i++) { if (e.nodeType == 1) chk(e); } } } } function cbRec(mutL) { for(let mut of mutL) { if (mut.type == 'childList') { for (let e,i=0; e=mut.addedNodes[i]; i++) { if (e.nodeType == 1) { let r=e.closest('details'); if (r) chk(r, true); else chk(e); } } } } } function load() { var o=sort.upd; sort=JSON.parse(localStorage.getItem('_sort_') || '{}'); if (o != sort.upd) return true; } function store() { sort.upd=Date.now(); localStorage.setItem('_sort_', JSON.stringify(sort) ); } patchFetch(); load(); if (document.readyState != 'loading') init(); else { document.addEventListener('DOMContentLoaded', init); window.addEventListener('load', init); } var redir=sort.redir; if (redir) { let re; if (re = RE.exec(location.pathname)) { if ( !re[2] || (redir == 'force') ) { let l=re[1]+gen(re); if (l != location.pathname) { if (redir == 'ask') { if ( (window == top) && (window.document.visibilityState == 'visible') && confirm('Redirect to correct order ?\n'+location.href+'\n'+l) ) redir=true; else redir=false; } if (redir) location.pathname=l; } } } } })();