Wikipedia Tweaker

Hides left column, adds dark theme.

目前為 2019-12-09 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name            Wikipedia Tweaker
// @version         19.12.9
// @namespace       https://wikipedia.org/wiki/Main_Page
// @description     Hides left column, adds dark theme.
// @author          S-Marty
// @compatible      firefox
// @compatible      chrome
// @compatible      opera
// @icon            https://raw.githubusercontent.com/s-marty/SmartChute/master/images/Wikipedia.png
// @license         MIT http://www.opensource.org/licenses/MIT
// @include         *wikipedia.org/wiki/*
// @include         *wikimedia.org/wiki/*
// @include         *wikipedia.org/w/*
// @exclude         *.m.wikipedia.org/*
// @run-at          document-end
// @grant           none
// ==/UserScript==


/* greasyfork.org jshint syntax checking hacks */
/* jshint asi: true */
/* jshint boss: true */
/* jshint esversion: 6 */
/* jshint multistr: true */

/** **********************   Features   **********************
*** Hides the left column providing a ">" button in upper left
***   corner to animate it. Settable in code.
*** Provides a page zoom of 120%. Settable in code.
*** Provides a dark theme, also setable.
*** Normal color printing (Black text on white background.)
*** No extra @require files (jquery et.al.)

*** Not intended for mobile devices.
*** Not likely to work with Wikipedia Skins.
***  ***  Does not & will not work well with IE and IEdge  ***/


/* Editable options */
var hide_column  = true;  /* Set to false for normal wiki theme */
var dark_theme   = true;  /* Set to false for normal wiki theme */
var zoom_pages   = true;  /* Set to false for normal wiki zoom */
var zoom_factor  = 1.2;   /* 1.0 is normal zoom, 2.0 is 2x zoom */
/* End Editable options */


(function() {

    var d           = document;
    var url         = window.location.href;
    var edit        = url.indexOf('/w/') !=-1;
    var wiki        = url.indexOf('/wiki/') !=-1;
    var leftCol     = null;
    var content     = null;
    var show_panel  = null;

    function unMaskMe() {

        if(wiki || edit) {

            let a, div, style, text;
            leftCol = d.querySelector('div#mw-panel');
            content = d.querySelector('div#content.mw-body');

                // Remove 10em left margin
            if (hide_column) {
                if(leftCol !== null && content !== null) {
                    content.style.marginLeft = '0em';
                    if(!d.getElementById('show_panel')) {
                        div = d.createElement('div');
                        div.style='width:12em;height:1em;position:fixed;top:4px;left:4px;'
                        div.className = 'noprint';
                        a = d.createElement('a');
                        a.id = 'show_panel';
                        a.href = "javascript:void(0)";
                        a.title = 'Open Panel';
                        a.className = 'noprint';
                        a.innerHTML = '>';
                        a.style.marginLeft = '0em';

                        d.body.appendChild(div).appendChild(a);
                        show_panel = d.querySelector('a#show_panel');
                        show_panel.addEventListener("click",togglePanel,!1);
                    }
                    leftCol.style.width ='0em';
                    leftCol.style.height ='100%';
                    leftCol.style.display ='none';
                    leftCol.style.position ='fixed';
                    leftCol.style.overflowY ='scroll';
                    leftCol.style.overflowX ='hidden';

                    if (zoom_pages) zoom(zoom_factor);
                }
            }
            if (dark_theme) appendDarkStyle();

            style = d.createElement("style");
            text = '#content #siteNotice, #frb-inline, .frb {display: none !important;}\
                #show_panel:hover {border-color: rgb(65, 135, 214);}\
                #show_panel {font-weight: bold;  margin-left: 0px; text-decoration: none;\
                 outline-color: initial; outline-style: none; padding: 0px 2px; border-radius: 4px;';
            if (dark_theme) {
                text += 'border: 1px solid rgb(204, 204, 204); background-color: rgb(28, 28, 28); }';
            }
            else {
                text += 'border: 1px solid rgb(40, 40, 40); background-color: rgb(255, 255, 255); }';
            }
            style.type      = "text/css";
            style.innerText = text;
            d.documentElement.appendChild(style);
        }

    }


    function appendDarkStyle() {
        let style       = d.createElement("style");

        style.type      = "text/css";
        style.innerText = '@media only screen {\
            #p-logo {background-image: linear-gradient(to bottom,rgba(40,40,40,0),#3c3c3c 50%);}\
            \
            #p-logo a.mw-wiki-logo {background-image: url(https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Paullusmagnus-logo_%28large%29.png/120px-Paullusmagnus-logo_%28large%29.png);}\
            \
            body, div#content, #mw-panel, #mw-head, table.infobox, .toc, .mw-warning, .toccolours, \
            div.thumbinner, .mw-ui-input, .layouttemplate, .oo-ui-popupWidget-popup, .mw-mmv-post-image, .mw-mmv-image-metadata, \
            .wikitable td[bgcolor="Gainsboro"], .mw-parser-output .module-shortcutboxplain, .mw-parser-output .shortcutbox, \
            #mp-topbanner, .MainPageBG\
              {background-color: #1C1C1C !important; /*Background*/}\
            \
            .vectorTabs .selected, .rt-tooltip, .mbox-small, .navbox, .navbox-subgroup, .catlinks, .navbox-even, \
            .navbox-odd, .mwe-popups, table.tmbox, table#talkheader td, #pagehistory li.selected, #mwe-popups-settings, \
            #filetoc, table.fmbox-system, .fileinfo-paramfield, .licensetpl_wrapper, .filehistory, .filehistory th, \
            .wikitable, .infobox th, .oo-ui-textInputWidget .oo-ui-inputWidget-input, .oo-ui-widget, .iw-resultset, \
            a.oo-ui-buttonElement-button, #mw-AnonymousI18N-suggest, .mw_metadata th, .mw_metadata td, .wikitable caption, \
            .wikitable > tr > th, .wikitable > * > tr > th, .wikitable td[bgcolor="White"], table.ombox-notice, table.ombox, \
            .infobox .mw-collapsible, .infobox .mw-collapsible div\
              {background-color: #2C2C2C !important; /*Light background*/}\
            \
            .vectorTabs li\
              {background-image: linear-gradient(to top,#77c1f6 0,#2c2c2c 1px,#1c1c1c 100%) !important; /*Buttons*/}\
            \
            #searchInput\
              {color: #fff !important; background-color: rgba(44,44,44,0.5) !important; /*Search*/}\
            \
            .suggestions-results\
              {color: #fff !important; background-color: #2c2c2c !important; /*Search suggestions*/}\
            \
            a.mw-searchSuggest-link .suggestions-result, a.mw-searchSuggest-link .suggestions-special,\
            .suggestions-special .special-query, .suggestions a.mw-searchSuggest-link,\
            .suggestions a.mw-searchSuggest-link:active, .suggestions a.mw-searchSuggest-link:focus\
              {color: #fff !important; background-color: #2c2c2c !important; /*Search suggestions*/}\
            \
            \.suggestions a.mw-searchSuggest-link:hover div\
              {background-color: #2738d3 !important;}\
            \
            h1, h2, h3, h4, h5, h6, div#content, #pt-anonuserpage, table.infobox, .rt-tooltip, .mbox-small, \
            div.reflist ol.references, a#show_panel, .mw-ui-input, #pagehistory li.selected, .mwe-popups a, \
            #mwe-popups-settings, #mwe-popups-settings main form label > span, .filehistory, .mw-mmv-post-image, \
            .oo-ui-textInputWidget .oo-ui-inputWidget-input, .oo-ui-widget, .oo-ui-dropdownWidget-handle, .wikitable, \
            #mp-topbanner, #mp-left, #mp-right, #mp-lower\
              {color: #CCCCCC !important; /*Text*/}\
            \
            #mw-panel .portal h3, .vectorTabs .selected a, .vectorTabs .selected a:visited, .mw-ui-button,\
            #mwe-popups-settings main form label\
              {color: #AAAAAA !important; /*Dark text*/}\
            \
            a, #mw-panel .portal .body li a, .vectorTabs li a\
              {color: #4187fa !important; /*Links*/}\
            \
            .navbox-abovebelow, th.navbox-group, .navbox-subgroup .navbox-title, .nowraplinks .navbox-title, \
            .mw-ui-button, .oo-ui-dropdownWidget-handle\
              {background-color: #3c3c2c !important; /*Nav buttons*/}\
            \
            .mw-advancedSearch-fieldContainer {background: linear-gradient(rgba(0,0,0,0.1),#3c3c3c 0.5em) !important;}\
            \
            .mwe-popups-overlay {background-color: rgba(40,40,40,0.9) !important;}\
            \
            .oo-ui-icon-info {background-color: #BBBBBB !important;}\
            \
            a.image img {background-color: #EEEEEE !important;}\
            \
            .mwe-popups .mwe-popups-extract[dir="ltr"]::after {\
              background-image: -webkit-linear-gradient(to right,rgba(40,40,40,0),#2c2c2c 50%) !important;\
              background-image: -moz-linear-gradient(to right,rgba(40,40,40,0),#2c2c2c 50%) !important;\
              background-image: linear-gradient(to right,rgba(40,40,40,0),#2c2c2c 50%) !important;}\
            \
            table td[bgcolor="#CCCCCC"], table th[bgcolor="#CCCCCC"], #mp-upper h2, #mp-lower h2, #mp-other-lower h2\
              {color: #3C3C3C !important;}\
            \
            .scrollable-element {scrollbar-color: orange #2C2C2C;} }';
        d.documentElement.appendChild(style);
    }

    function togglePanel(e) {

        if(leftCol && content) {
            if(leftCol.style.display && leftCol.style.display =='none') {
                leftCol.style.display ='block';
                show_panel.innerHTML = '<';
                show_panel.title = 'Close Panel';
                
                animate({
                  duration: 400,
                  timing: function(timeFraction) {
                    return Math.pow(timeFraction, 2);
                  },
                  draw: function(progress) {
                    leftCol.style.width = progress * 10 + 'em';
                    show_panel.style.marginLeft = progress * 9 + 'em';
                    content.style.marginLeft = progress * 10 + 'em';
                  }
                });
            }
            else
            {
                show_panel.innerHTML = '>';
                show_panel.title = 'Open Panel';

                animate({
                  duration: 500,
                  timing: function back(x, timeFraction) {
                    return Math.pow(timeFraction, 2) * ((x + 1) * timeFraction - x)
                  }.bind(null, 2.8),
                  draw: function(progress) {
                    leftCol.style.width = 10 - (progress * 10) + 'em';
                    show_panel.style.marginLeft = 9 - (progress * 9) + 'em';
                    content.style.marginLeft = 10 - (progress * 10) + 'em';
                    if (progress === 1) leftCol.style.display ='none';
                  }
                });
            }
        }
    }

    function zoom(factor) {
        let n, img, imgX, imgY, container;
        let doc = d.querySelector('html');
        let imgs = d.querySelectorAll('#bodyContent img');

        if(doc !== null) {
            doc.style.fontSize = (factor * 100) +'%';
        }

        if(imgs !== null) {
            for(n in imgs) {
                img = imgs[n];
                imgX = img.clientWidth;
		        imgY = img.clientHeight;

		        if(imgX !== undefined && imgY !== undefined) {

		            img.style.width  = imgX * factor + "px";
		            img.style.height = imgY * factor + "px";
		            container = img.parentNode.parentNode;
		            if(container.className == 'thumbinner') {
		                container.style.width = Math.ceil((imgX * factor) + 2) + "px";
		            }

		        }
            }
        }
    }

    function animate({timing, draw, duration}) {
      let start = performance.now();

      requestAnimationFrame(function animate(time) {
        let timeFraction = (time - start) / duration;
        if (timeFraction > 1) timeFraction = 1;
        let progress = timing(timeFraction);
        draw(progress);
        if (timeFraction < 1) {
          requestAnimationFrame(animate);
        }
      });

    }

    unMaskMe();

}) ();