// ==UserScript== // @name Wikipedia Vector Legacy Layout // @description Restore the old Wikipedia layout or choose between other available skins: Vector legacy (2010), Vector (2022), MinervaNeue, MonoBook, Timeless // @version 1.1.3 // @author Pabli // @namespace https://github.com/pabli24 // @license MIT // @match *://*.wikipedia.org/* // @match *://*.wiktionary.org/* // @match *://*.wikiquote.org/* // @match *://*.wikinews.org/* // @match *://*.wikidata.org/* // @match *://*.wikivoyage.org/* // @match *://*.wikiversity.org/* // @match *://*.wikifunctions.org/* // @match *://*.wikisource.org/* // @match *://*.wikibooks.org/* // @match *://*.wikimedia.org/* // @match *://*.mediawiki.org/* // @run-at document-start // @icon https://www.google.com/s2/favicons?sz=64&domain=wikipedia.org // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @downloadURL none // ==/UserScript== (async () => { 'use strict'; let url = new URL(window.location.href); const domains = ['wikipedia.org', 'wiktionary.org', 'wikiquote.org', 'wikinews.org', 'wikidata.org', 'wikivoyage.org', 'wikiversity.org', 'wikifunctions.org', 'wikisource.org', 'wikibooks.org', 'wikimedia.org', 'mediawiki.org']; const skin = await GM_getValue('skin', 'vector'); const skins = { vector: 'Vector legacy (2010)', 'vector-2022': 'Vector (2022)', minerva: 'MinervaNeue (Mobile view)', monobook: 'MonoBook', timeless: 'Timeless' }; Object.entries(skins).forEach(([key, label]) => { GM_registerMenuCommand( `${skin === key ? '◉' : '○'} ${label}`, async () => { await GM_setValue('skin', key); url = new URL(window.location.href); url.searchParams.append('useskin', key); window.location.href = url; } ); }); function deleteUseskinParam() { url = new URL(window.location.href); if (url.searchParams.has('useskin')) { url.searchParams.delete('useskin'); window.history.replaceState({}, '', url); } } if (!url.searchParams.has('useskin') && url.pathname !== '/') { url.searchParams.append('useskin', skin); window.location.href = url; } else { deleteUseskinParam(); setTimeout(deleteUseskinParam, 1000); setTimeout(deleteUseskinParam, 3000); } window.addEventListener('click', (e) => { if (e.button > 0 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return; let link = e.target.closest('a[href]:not([href^="#"])'); if (!link) return; if (!domains.some(domain => link.hostname.endsWith(`.${domain}`) || link.hostname === domain)) return; e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); url = new URL(link); url.searchParams.append('useskin', skin); window.location.href = url; }); })();