Raw Source
s-marty / Wikipedia Tweaker

// ==UserScript==
// @name            Wikipedia Tweaker
// @version         20.1.11
// @description     Hides left column, adds dark theme at Wikipedia.org.
// @author          S-Marty
// @compatible      firefox
// @compatible      chrome
// @compatible      opera
// @license         MIT
// @namespace       https://github.com/s-marty/Wikipedia-Tweaker
// @homepageURL     https://github.com/s-marty/Wikipedia-Tweaker
// @icon            https://github.com/s-marty/Wikipedia-Tweaker/raw/master/images/Wikipedia.png
// @downloadURL     https://github.com/s-marty/Wikipedia-Tweaker/raw/master/src/Wikipedia.user.js
// @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, table.vertical-navbox th, table.vertical-navbox td, .messagebox, table[style*="background: #f7f8ff"],
            *[style*="background: #ccf"]
              {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, table.vertical-navbox
              {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;}
            
            ol, 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, table.vertical-navbox th, table.vertical-navbox td, 
            .messagebox
              {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;}
            
            table.messagebox
              {border-color: #3C3C3C !important;/*Dark border*/}
            
            .wikitable > tr > th, .wikitable > tr > td, .wikitable > * > tr > th, .wikitable > * > tr > td,
            table.layouttemplate
              {border-color: #a2a9b1 !important;/*Medium border*/}
            
            ul
              {list-style-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My`+
              `5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjEzIj4KCTxjaXJjbGUgY3g9IjIuNSIgY3k9IjkiIHI9IjIuNSIgZmlsbD0iI0NDQyIvPgo8L3N2Zz4K) !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();

}) ();