User:Arashiryuu0/wikia.js

/** * @namespace Personal_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 */

/** * @returns {void} */   'use strict'; /**     * Utility functions from native prototypes */   const slice = Array.prototype.slice; const toString = Object.prototype.toString; /**    * Config */   const mwc = mw.config.get([        'wgPageName',        'wgNamespaceNumber'    ]); /**    * Import list */   const imports = [ {           type: 'script', articles: [ 'u:dev:MediaWiki:UI-js/code.js', 'u:dev:MediaWiki:Toasts.js', 'u:bloodborne:MediaWiki:DOMTools.js', 'u:bloodborne:MediaWiki:Tooltips.js', 'u:dev:MediaWiki:WikiaNotification/code.js' ]       },        {            type: 'style', articles: [ 'u:dev:MediaWiki:FontAwesome.css', 'u:bloodborne:MediaWiki:Codeblocks.css', 'u:dev:MediaWiki:ModernWikiActivity.css', 'u:dev:MediaWiki:ModernProfile/Wall.css', 'u:dev:MediaWiki:ModernWikiActivity.css', 'u:dev:MediaWiki:ModernCommentsSection.css', 'u:dev:MediaWiki:ModernProfile/Masthead.css', 'u:dev:MediaWiki:FandomizedRailModules/code.css' ]       }    ];    /**     * Cache of fired hooks. * @private */   const fired = new mw.Map; window.tagList = { '死': 'Death', 'Blockhammer User': 'B&' };   window.CodeblockLinesConfig = { ready: false, delay: 1e3 };   /**     * Logger */   const levels = ['log', 'info', 'warn', 'debug', 'error']; const getLevel = function (level) { return levels.includes(level) ? level : 'log'; };   const _log = function (level, name) { const lvl = getLevel(level); return function { const args = slice.call(arguments); const time = new Date.toUTCString; const parts = ['%c[' + name + '] \u2014 %c%s', 'color: #C3E88D;', 'color: #F78C6A;', time]; console.group.apply(null, parts); console[lvl].apply(null, args); console.groupEnd; };   };    /**     * Utility */   function $_ (selector) { return document.querySelector(selector); }   function $$ (selector) { return document.querySelectorAll(selector); }   function $a (target, element) { return target.appendChild(element); }   function isNil (anything) { return typeof anything === 'undefined' || anything === null; }   function isObject (item) { return toString.call(item) === '[object Object]'; }
 * (function {

/**    * Init functions */   function init (dev) { // jshint ignore: line return function (DOMTools) { if (fired.exists('init')) return; window.importArticles(imports[0]); window.importArticles(imports[1]); /**	        * Utility */	       function createElement (type, properties) { const nodeTypes = [1, 3]; if (typeof type !== 'string' || !isObject(properties)) return; function addStyle (element, _, styles) { const keys = Object.keys(styles); const len = keys.length; for (var i = 0; i < len; i++) { const style = keys[i]; DOMTools.css(element, style, styles[style]); }	               return element; }	           function setText (element, _, value) { element.textContent = value; return element; }	           function addAttribute (element, attribute, value) { if (attribute === 'text') return setText(element, value); element.setAttribute(attribute, value); return element; }	           function addEvent (element, event, callback) { DOMTools.on(element, event, callback); return element; }	           function addData (element, _, data) { for (const i in data) element[_][i] = data[i]; return element; }	           function addChildren (element, _, children) { for (var i = 0, len = children.length; i < len; i++) { if (!nodeTypes.includes(children[i].nodeType)) continue; $a(element, children[i]); }	               return element; }	           function processProps (element, props) { const keys = Object.keys(props); const len = keys.length; const actions = { 'text': setText, 'style': addStyle, 'class': addAttribute, 'dataset': addData, 'childNodes': addChildren };	               for (var i = 0; i < len; i++) { const prop = keys[i]; const val = props[prop]; if (isNil(val)) continue; const name = prop.split('.')[0]; const ns = prop.split('.')[1]; if (typeof actions[name] !== 'undefined') { actions[name](element, prop, val); continue; } else if (typeof ns !== 'undefined') { addEvent(element, prop, val); continue; }	                   element[prop] = val; }	               Object.defineProperty(element, 'props', {	                    value: props,	                    configurable: false	                }); return element; }	           const element = document.createElement(type); return processProps(element, properties); }	       /**	         * Assorted functions */	       ;(function  {	            if (!mwc.wgPageName.includes('WikiActivity')) return;	            const log = _log('log', 'WallConversations');	            const article = $_('.WikiaArticle');	            const options = { childList: true, subtree: true };	            var counter = 0;	            function iterate  {	                const sel = $$('.activity-ns-1201 > table, .activity-ns-2001 > table');	                const len = sel.length;	                for (var i = 0; i < len; i++) {	                    const n = sel[i];	                    if (n.classList && n.classList.contains('wallfeed')) continue;	                    n.classList.add('wallfeed');	                    log('iteration complete: ' + counter, n);	                    counter++;	                }	            }	            function handleMutation (changes) {	                for (const changed in changes) { const change = changes[changed]; if (!change.addedNodes.length) continue; const len = change.addedNodes.length; for (var i = 0; i < len; i++) { const node = change.addedNodes[i]; if (node.classList && node.classList.contains('activityfeed')) { iterate; }	                   }	                }	            }	            const e = new MutationObserver(handleMutation); log('iterating...'); iterate; e.observe(article, options); });	       /**	         * 1	         */	        ;(function  { const selectors = [ '.wds-community-header__wiki-buttons', '.wds-button-group' ];	           const target = DOMTools.query(selectors.join('')); if (!target) return; DOMTools.appendAll(target, [	               createElement('a', { className: 'wds-button wds-is-squished wds-is-secondary', id: 'jsReturn', childNodes: [ createElement('span', {	                           className: 'jsReturn',	                            textContent: '\u2111',	                        }) ],	                   style: { fontSize: '20px', fontWeight: 400 },	                   href: '/wiki/User:Arashiryuu0/wikia.js', title: 'Return to Personal JS' }),	               createElement('a', { className: 'wds-button wds-is-squished wds-is-secondary', id: 'cssReturn', childNodes: [ createElement('span', {	                           className: 'cssReturn',	                            textContent: '\u212D',	                        }) ],	                   style: { fontSize: '20px', fontWeight: 400 },	                   href: '/wiki/User:Arashiryuu0/wikia.css', title: 'Return to Personal CSS' }),	               createElement('a', { className: 'wds-button wds-is-squished wds-is-secondary', id: 'purgePageButton', childNodes: [ createElement('span', {	                           className: 'purgeButton',	                            textContent: '\u262F',	                        }) ],	                   style: { fontSize: '20px', fontWeight: 400 },	                   href: '?action=purge', title: 'Purge Page' }),	               createElement('a', { className: 'wds-button wds-is-squished wds-is-secondary', childNodes: [ createElement('span', {	                           className: 'userReturn',	                            textContent: '↩'	                        }) ],	                   style: { fontSize: '18px', fontWeight: 600 },	                   href: '/wiki/User:Arashiryuu0', title: 'Return to User Page' }),	               createElement('a', { className: 'wds-button wds-is-squished wds-is-secondary', childNodes: [ createElement('span', {	                           className: 'randomPage',	                            textContent: '?'	                        }) ], 	                   style: { fontSize: '18px', }, 	                   dataset: { tracking: 'Special:Random' }, href: '/wiki/Special:Random', title: 'Random Page' })	           ]);	        });	        ;(function  { if (mwc.wgNamespaceNumber !== 0) return; const element = { wrapper: DOMTools.query('.WikiaPageContentWrapper'), $wrapper: $('.WikiaPageContentWrapper'), target: DOMTools.query('.wds-community-header'), toggle: function (t) { element.$wrapper.toggle(200); DOMTools.toggleClass(element.wrapper, 'hidden'); DOMTools.text(t, this.getText); },	               getText: function  { return DOMTools.hasClass(element.wrapper, 'hidden') ? 'show' : 'hide'; }	           };	            const toggle = createElement('a', {	                id: 'togglePage',	                style: {	                    position: 'relative',	                    left: '2px',	                    bottom: '1.3vh',	                    color: 'whitesmoke',	                    cursor: 'pointer',	                    textTransform: 'uppercase'	                },	                textContent: element.getText,	                'click.pageToggle': function (e) {	                    element.toggle(e.target);	                }	            }); DOMTools.appendTo(element.target, toggle); });	       /**	         * 2 	         */	        ;(function  { const lang = document.documentElement.lang; const date = { obj: new Date, target: $_('.wds-community-header__local-navigation'), };	           Object.defineProperty(date, 'current_day', {	                writable: false,	                configurable: false,	                value: date.obj.toLocaleDateString(lang, { weekday: 'long' })	            }); Object.defineProperty(date, 'day', {	               configurable: false,	                value: createElement('a', { id: 'current-day', title: 'Today', target: '_blank', textContent: date.current_day })	           });	            const css = { ellipse: { id: 'EllipseFixCSS', type: 'text/css', selectors: [ [	                           '.WikiaSiteWrapper', '.wds-community-header', '.wds-community-header__wiki-buttons', '>',	                           '.wds-dropdown', '>',	                           '.wds-dropdown__content,', '.wds-dropdown.wds-is-active::after,', '.wds-dropdown.wds-is-active::before,', '.wds-dropdown:hover::after,', '.wds-dropdown:hover::before' ],	                       [	                            '.wds-community-header__wiki-buttons', '>',	                           '.wds-dropdown', '>',	                           '.wds-button:hover' ],	                       [	                            '.WikiaSiteWrapper', '.wds-community-header', '.wds-community-header__wiki-buttons', '>',	                           '.wds-dropdown.is-open', '>',	                           '.wds-dropdown__content,', '.wds-dropdown.wds-is-active.is-open::after,', '.wds-dropdown.wds-is-active.is-open::before,', '.wds-dropdown.is-open:hover::after,', '.wds-dropdown.is-open:hover::before,', '.wds-dropdown.is-open::after,', '.wds-dropdown.is-open::before' ]	                   ]	                },	                toggle: { id: 'ToggleCSS', type: 'text/css', selectors: [ [	                           '.wds-dropdown.wds-is-active:not(.wds-no-chevron)::after,', '.wds-dropdown.wds-is-active:not(.wds-no-chevron)::before,', '.wds-dropdown' + ':not(.wds-is-touch-device):not(.wds-is-not-hoverable)' + ':hover:not(.wds-no-chevron)::after,', '.wds-dropdown' + ':not(.wds-is-touch-device):not(.wds-is-not-hoverable)' + ':hover:not(.wds-no-chevron)::before,', '.wds-community-header__local-navigation', '.wds-dropdown.wds-is-active', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown.wds-is-active', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown' + ':not(.wds-is-touch-device):not(.wds-is-not-hoverable):hover', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown:hover::after' ],	                       [	                            '.wds-community-header__local-navigation', '.wds-dropdown:hover', '.wds-dropdown__toggle-chevron' ],	                       [	                            '.wds-community-header__local-navigation', '.wds-dropdown:hover', '.wds-dropdown__toggle' ],	                       [	                            '.wds-dropdown.wds-is-active.is-open:not(.wds-no-chevron)::after,', '.wds-dropdown.wds-is-active.is-open:not(.wds-no-chevron)::before,', '.wds-dropdown.is-open' + ':not(.wds-is-touch-device):not(.wds-is-not-hoverable)' + ':hover:not(.wds-no-chevron)::after,', '.wds-dropdown.is-open' + ':not(.wds-is-touch-device):not(.wds-is-not-hoverable)' + ':hover:not(.wds-no-chevron)::before,', '.wds-community-header__local-navigation', '.wds-dropdown.wds-is-active.is-open', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown.wds-is-active.is-open', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown.is-open::before,', '.wds-community-header__local-navigation', '.wds-dropdown.is-open::after,', '.wds-community-header__local-navigation', '.wds-dropdown.is-open', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown.is-open' + ':not(.wds-is-touch-device):not(.wds-is-not-hoverable):hover', '.wds-dropdown__content,', '.wds-community-header__local-navigation', '.wds-dropdown.is-open:hover::after' ]	                   ]	                },	                target: document.head };	           Object.defineProperty(css.ellipse, 'rules', {	                configurable: false,	                value: [	                    css.ellipse.selectors[0].join(' ') + ' { display: none; }',	                    css.ellipse.selectors[1].join(' ') + ' { cursor: pointer; }',	                    css.ellipse.selectors[2].join(' ') + ' { display: block !important; }'	                ]	            }); Object.defineProperty(css.ellipse, 'stylesheet', {	               configurable: false,	                value: createElement('style', { id: css.ellipse.id, type: css.ellipse.type, textContent: css.ellipse.rules.join('\n') })	           });	            Object.defineProperty(css.toggle, 'rules', {	                configurable: false,	                value: [	                    css.toggle.selectors[0].join(' ') + ' { display: none; }',	                    css.toggle.selectors[1].join(' ') + ' { transform: none; '	                    + 'transition: transform 200ms '	                    + 'cubic-bezier(0.6, -0.28, 0.74, 0.05); }',	                    css.toggle.selectors[2].join(' ') + ' { transform: none; }',	                    css.toggle.selectors[3].join(' ') + ' { display: block !important; }'	                ]	            }); Object.defineProperty(css.toggle, 'stylesheet', {	               configurable: false,	                value: createElement('style', { id: css.toggle.id, type: css.toggle.type, textContent: css.toggle.rules.join('\n') })	           });	            const els = { selectors: [ [	                       '.wds-community-header__local-navigation', '.wds-dropdown', '.wds-dropdown__toggle-chevron' ],	                   [	                        '.wds-community-header__wiki-buttons', '>',	                       '.wds-dropdown', '>',	                       '.wds-button' ]	               ]	            };	            Object.defineProperties(els, {	                toggles: {	                    configurable: false,	                    value: DOMTools.queryAll(els.selectors[0].join(' '))	                },	                headerButton: {	                    configurable: false,	                    value: $_(els.selectors[1].join(' '))	                }	            }); function ellipse (button) { const root = button.parentElement; const content = root.querySelector('.wds-dropdown__content'); return function { $(content).toggle('fast'); DOMTools.toggleClass(root, 'is-open'); };	           }	            function chevron (button) { const rotation = 'rotateX(180deg)'; const root = button.parentElement.parentElement; const content = root.querySelector('.wds-dropdown__content'); return function { $(content).toggle('fast'); DOMTools.toggleClass(root, 'is-open'); const ts = button.style.transform; DOMTools.css(button, 'transform', ts !== rotation ? rotation : 'none'); };	           }	            function addChevronListener (element) { if (!element) return; DOMTools.on(element, 'click.toggle', chevron(element)); }	           $a(date.target, date.day); DOMTools.appendAll(css.target, [	               css.ellipse.stylesheet,	                css.toggle.stylesheet	            ]); if (els.headerButton) { els.headerButton.setAttribute('title', 'Options'); DOMTools.css(els.headerButton, 'padding', '11px 3px'); DOMTools.on(els.headerButton, 'click.toggle', ellipse(els.headerButton)); }	           els.toggles.forEach(addChevronListener); });	       ;(function  { const base = DOMTools.query('#UserProfileMasthead'); if (!base) return; const onError = _log('error', 'GlobalEditCount'); function getData (user) { const url = [ mw.util.wikiScript('api'), '?action=query&list=users&usprop=registration', '&ususers=' + user + '&format=json' ].join(''); function cb (resolve, reject) { const xhr = new XMLHttpRequest; function load { resolve(JSON.parse(xhr.responseText)); }	                   function error (e) { reject(e, xhr); }	                   xhr.addEventListener('load', load); xhr.addEventListener('error', error); xhr.open('GET', url, true); xhr.send; }	               return new Promise(cb); }	           function appendToGlobalCount (data) { const d = DOMTools.getProp(data, 'query.users.0.registration'); const date = new Date(d).toLocaleDateString('en-us', {	                   day: '2-digit',	                    month: 'long',	                    year: 'numeric'	                }); const target = DOMTools.query('.globaledit-label', base); if (!target) return Promise.reject(new Error('Unable to find label.')); const clone = target.cloneNode(true); DOMTools.text(clone, 'global edits since account creation'); DOMTools.appendAll(clone, [	                   document.createElement('br'),	                    document.createTextNode(date)	                ]); target.replaceWith(clone); return Promise.resolve(clone); }	           function removeLinkedCSS  { const links = DOMTools.queryAll('link[type="text/css"][rel="stylesheet"]'); function filterLinks (l) { return l.href && l.href.includes('GlobalEditcount'); }	               const link = links.find(filterLinks); try { link.parentElement.removeChild(link); return Promise.resolve(true); } catch(e) { return Promise.reject(e); }	           }	            function done (toasts) { return function { toasts.success('Appended account creation date to global editcount.'); return Promise.resolve(toasts); };	           }	            function _init (values) { const GEC = values[0]; const toasts = values[1]; return getData(GEC.user) .then(appendToGlobalCount, onError) .then(removeLinkedCSS, onError) .then(done(toasts), onError); }	           function getFromHook (hookName) { return new Promise(function (resolve) {	                   mw.hook(hookName).add(resolve);	                }); }	           function allLoaded  { return Promise.all([	                   getFromHook('GlobalEditcount.loaded'),	                    getFromHook('dev.toasts'),	                    getFromHook('dev.ui')	                ]); }	           allLoaded.then(_init, onError); });	       ;(function  { if (!document.getElementById('WallThreadHistory')) return; const fixDimensions = function (avatar) { const src = avatar.getAttribute('src'); avatar.setAttribute('height', '50'); avatar.setAttribute('width', '50'); avatar.setAttribute('src', src.slice(0, -2) + 50); };	           const avatars = DOMTools.queryAll('.WallHistory #WallThreadHistory .avatar'); avatars.forEach(fixDimensions); });	       fired.set('init', true);    	};    }    function wait  {        if (fired.exists('wait')) return;        mw.hook('DOMTools').add(init(window.dev));        fired.set('wait', true);    }    /**     * Finalize     */    mw.config.get('wgVersion') === '1.19.24'        ? window.addOnloadHook(wait)        : wait; }); /*@end@*/