User:Arashiryuu0/global.js

/** * Global code - affects all wikias/fandoms I use. * @namespace Global.js */

// jshint browser: true, devel: true, jquery: true // jshint strict: true, freeze: true, eqeqeq: true, futurehostile: true // jshint newcap: true, noarg: true, quotmark: single, shadow: outer // jshint latedef: true, undef: true, unused: true /* globals mw */

/** * The callback to be fired when Fandom is ready. * @callback hookFunct * @returns {void} */

/** * @param {hookFunct} */ window.addOnloadHook(function {    'use strict';    const importArticles = window.importArticles;    const has = Object.prototype.hasOwnProperty;    const slice = Array.prototype.slice;    const config = mw.config.get([ 'wgNamespaceNumber', 'wgArticlePath', 'wgIsEditPage', 'wgPageName' ]);   const imports = [        {            type: 'script',            articles: [                'u:dev:MediaWiki:ConsistentModules/code.js',                'u:dev:RelatedDiscussionsModule/code.js',                'u:dev:MediaWiki:JavascriptEditor.js',                'u:dev:CodeblockLineNumbers/code.js',                'u:dev:DifferentSkinEditor/code.js',                'u:dev:YoutubeModal/code.js',                'u:dev:PurgeButton/code.js',                'u:dev:View_Source/code.js',                'u:dev:UTCClock/code.js',                'u:dev:Message/code.js',                'u:dev:I18n-js/code.js',                'u:dev:AjaxRC/code.js',                'u:dev:CodeEditor.js',                'u:dev:Toasts.js'            ]        },        {            type: 'script',            articles: [                'u:bloodborne:JSHighlightFixes.js',                'u:bloodborne:DOMTools.js' ]       },        {            type: 'style', articles: [ 'u:bloodborne:MediaWiki:CodeblockIdentifiers.css', 'u:bloodborne:MediaWiki:Codeblocks.css', 'u:dev:MediaWiki:Responsive_mobile.css' ]       }    ];    window.PurgeButtonText = 'Purge'; window.AjaxRCRefreshText = 'Auto-refresh'; window.AjaxRCRefreshHoverText = 'Automatically refresh the page'; window.ajaxSpecialPages = [ 'RecentChanges', 'WikiActivity', 'AllPages', 'UncategorizedPages' ];   importArticles.apply(this, imports); mw.hook('DOMTools').add(function (DOMTools) {       /**         * Remove featured videos         */        ;(function  { function hasChild (target) { return has.call(target.attributes, 'itemprop'); }           function removeChild (child) { return child.parentElement.removeChild(child); }           function removeChildren (children) { children.forEach(removeChild); }           function filterChildren (children) { return children.filter(hasChild); }           function handleChildren (children) { removeChildren(filterChildren(children)); }           function mapVideos (video) { return slice.call(video.parentElement.children); }           const items = DOMTools.queryAll('div[itemprop="video"]').map(mapVideos); items.forEach(handleChildren); });       /**         * LineNumbers on Codeblocks         * Moved to: https://dev.wikia.com/wiki/CodeblockLineNumbers         */        /**         * Cancel button for edit pages.         */        ;(function  { if (!config.wgIsEditPage || window.CancelEditLoaded) return; const head = document.querySelector('#EditPageHeader h2'); if (!head) return; window.CancelEditLoaded = true; const url = mw.util.getUrl; const button = DOMTools.parseHTML([               '',                'Cancel',                ''            ].join('').trim); head.appendChild(button); mw.util.addCSS('#cancel-button { margin-top: -2px; }'); });       /**         * Copy Code button         */        ;(function  { const init = function (i18n, toasts) { const s = [ 'div[class*="source-"]', '#theme-solarized-light', '#theme-solarized-dark', 'code[class]:not(.no-language)' ];               const targets = DOMTools.queryAll(s.join(', ')); const addButton = function (codeblock) { if (DOMTools.hasClass(codeblock, 'de1')) return; const child = codeblock.firstChild; const button = document.createElement('button'); button.setAttribute('id', 'CopyCodeButton'); DOMTools.text(button, i18n.msg('copy').plain); DOMTools.on(button, 'click.CopyButton', function {                        const range = document.createRange;                        window.getSelection.removeAllRanges;                        range.selectNode(codeblock);                        codeblock.focus;                        const selection = window.getSelection;                        selection.addRange(range);                        document.execCommand('copy');                        selection.removeAllRanges;                        toasts.info('Successfully copied.');                    }); if (!['hljs', 'lineNumbers', 'de1'].includes(child.className)) return; codeblock.prepend(button); };               targets.forEach(addButton); };           const preload = function (toasts) { return function (i18n) { i18n.loadMessages('CopyCodeButton').then(function (i18no) {                       setTimeout(function  { init(i18no, toasts); }, 1000);                   });                };            };            const toastHook = function (toast) { mw.hook('dev.i18n').add(preload(toast)); };           mw.hook('dev.toasts').add(toastHook); });       /**         * Make light-theme Discord widget use dark-theme         */        ;(function  { const handleWidget = function (rail) { const widget = rail.querySelector('.discord-widget-container .widget'); if (widget) widget.classList.replace('widget-theme-light', 'widget-theme-dark'); return widget; };           mw.hook('Discord.widget').add(handleWidget); });       /**         * Responsive Mobile         * dev.fandom.com/wiki/Responsive_Mobile         */        ;(function  { var meta = document.querySelector('meta[name="viewport"]'); if (!meta) { meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); }           meta.setAttribute('content', 'width=device-width, initial-scale=1, user-scalable=yes'); });       /**         * Code Buttons         */        ;(function  { const page = config.wgPageName; const getFlag = function { const p1 = ['MediaWiki', 'User'].includes(page.split(':').shift); const p2 = page.endsWith('.js') || page.endsWith('.css'); return p1 && p2; };           if (!getFlag) return console.log(page, getFlag); const root = document.documentElement; const container = DOMTools.parseHTML(               ' '            ); const buttons = []; const themes = ['material', 'vs2015', 'dracula']; function getTheme (id) { return themes.includes(id) && id || 'material'; }           function applyTheme (button) { const id = button.getAttribute('id'); const theme = getTheme(id); return function { button.blur; root.setAttribute('id', theme); };           }            function generateButtons  { if (buttons.length) return buttons; const len = themes.length; for (var i = 0; i < len; i++) { const id = themes[i]; const btn = DOMTools.parseHTML([                       '',                        id,                        ' '                    ].join('')); DOMTools.on(btn, 'click.code-button', applyTheme(btn)); buttons.push(btn); }               return buttons; }           mw.hook('wikipage.content').add(function ($content) {                if ($content.attr('id') !== 'mw-content-text') $content = $('#mw-content-text');                if (!$content) return;                DOMTools.appendAll(container, generateButtons);                const $target = $content.find('#mw-clearyourcache');                if (!$target) return;                $target.append(container);            }); });   }); });

/** * @typedef {Object} Cookies */

/** * Parses the document's cookies into a readable object. * @alias getCookies * @returns {Cookies} */ function getCookies { if (!window.cookies) { Object.defineProperty(window, 'cookies', {           get: function  {                return document.cookie.split(';').reduce(function (cookies, cookie) { cookies[cookie.split('=')[0].trim] = decodeURIComponent(cookie.split('=')[1]); return cookies; }, {});           }        });        return window.cookies; }   return window.cookies; }

/*@end@*/