Community Central
Community Central
mNo edit summary
No edit summary
Line 167: Line 167:
 
} );
 
} );
 
 
// Replace default deletation reason
+
// Replace default deletion reason
 
var deleteReason = document.querySelector( '#mw-delete-table #wpReason' );
 
var deleteReason = document.querySelector( '#mw-delete-table #wpReason' );
 
if ( deleteReason ) deleteReason.value = i18n( 'summary-delete', 'content' );
 
if ( deleteReason ) deleteReason.value = i18n( 'summary-delete', 'content' );
Line 223: Line 223:
 
'u:dev:MediaWiki:AjaxPatrol/code.js',
 
'u:dev:MediaWiki:AjaxPatrol/code.js',
 
'u:dev:MediaWiki:AjaxCommentDelete/code.js',
 
'u:dev:MediaWiki:AjaxCommentDelete/code.js',
  +
'u:dev:MediaWiki:CategoryRenameAuto-update/code.js',
  +
'u:dev:MediaWiki:FileUsageAuto-update/code.js',
 
'u:dev:MediaWiki:ViewRemoved/code.js'
 
'u:dev:MediaWiki:ViewRemoved/code.js'
 
]
 
]

Revision as of 21:44, 3 July 2020

;( function( mw, window, self ) {
    'use strict';
 
    // Get MediaWiki configuration options for current site
    var conf = mw.config.get( [
        'wgContentLanguage',
        'wgUserLanguage',
        'wgUserGroups',
        'wgUserName',
        'wgScriptPath',
        'wgVersion',
        'wgNamespaceNumber'
    ] );
 
    // Prevent double loading aaaand pls don't blow up in my face when they finally update MW
    if ( window.htzo7tpmw6ha6qo || conf.wgVersion !== '1.19.24' ) return;
 
    // Check my user groups
    self.groups = /sysop|bureaucrat|content-moderator|threadmoderator/.test( conf.wgUserGroups.join() );
 
    /**
     * Replacement for `jQuery.fn.extend()` method
     * https://stackoverflow.com/a/38777298
     *
     * @param defaults
     * @param options
     */
    function extend( defaults, options ) {
        var prop, extended = {};
 
        for ( prop in defaults ) {
            if ( Object.prototype.hasOwnProperty.call( defaults, prop ) ) extended[prop] = defaults[prop];
        }
        for ( prop in options ) {
            if ( Object.prototype.hasOwnProperty.call( options, prop ) ) extended[prop] = options[prop];
        }
 
        return extended;
    }
 
    /**
     * Simple i18n implementation
     *
     * @param msg
     * @param lang
     */
    function i18n( msg, lang ) {
        var a;
 
        // Check if language is specified. If so, check if it's content. Use current user language by default
        if ( lang ) {
            a = ( lang === 'content' ? conf.wgContentLanguage : lang );
        } else {
            a = conf.wgUserLanguage;
        }
 
        // i18n messages
        var string = {
            en: { // English (en)
                'recentchanges': 'Recent changes',
                'summary-delete': 'Housekeeping',
                'summary-block': '[[w:Help:Vandalism|Vandalism]]',
                'summary-comment': 'Harmful comment',
                'analytics': 'Analytics',
                'announcements': 'Announcements'
            },
            pl: { // polski (pl)
                'recentchanges': 'Ostatnie zmiany',
                'summary-delete': 'Porządki',
                'summary-block': '[[Pomoc:Wandalizm|Wandalizm]]',
                'summary-comment': 'Obraźliwy komentarz',
                'analytics': 'Dane analityczne',
                'announcements': 'Ogłoszenia'
            }
        };
 
        // Use English as fallback language
        string = extend( string.en, string[a] );
 
        // Return wanted message
        return string[msg];
    }
 
    /**
     * Import my custom user scripts - regular user or both user and admin codes
     *
     * @param scripts
     */
    self.importScripts = function( scripts ) {
        // Prepare array for merging
        var array = {};
 
        // Check for groups and merge arrays if I'm sysop
        if ( self.groups ) {
            array = scripts.user.concat( scripts.admin );
        } else { // Or leave it as it is if I'm not
            array = scripts.user;
        }
 
        // Import scripts specified in function call
        importArticles( {
            type: 'script',
            articles: array
        } );
    };
 
    // Other small snippets to use on page
    self.snippets = function() {
        // Prevent annoying RaiLWAM module from being loaded
        if ( !window.hasOwnProperty( 'railWAM' ) ) window.railWAM = {};
        if ( !window.railWAM.hasOwnProperty( 'load' ) ) window.railWAM.load = false;
 
        // ... or remove it if loaded already
        var WAMlogs = document.getElementById( 'railwam-rail-mod' );
        if ( WAMlogs ) WAMlogs.remove();
 
        // Force source editor on template pages (damn you, InfoboxBuilder!)
        var editButton = document.getElementById( 'ca-edit' );
        if ( conf.wgNamespaceNumber === 10 && editButton ) editButton.href += '&useeditor=source';
 
        // Add my custom links in toolbar
        var userToolbar = document.getElementById( 'my-tools-menu' );
        if ( userToolbar && self.groups ) {
            var li1 = document.createElement( 'li' ),
                li2 = document.createElement( 'li' );
 
            li1.classList.add( 'overflow' );
            li1.id = 'custom-tool1';
 
            li2.classList.add( 'overflow' );
            li2.id = 'custom-tool2';
 
            var announcements = document.createElement( 'a' ),
                analytics = document.createElement( 'a' );
 
            announcements.href = conf.wgScriptPath + '/announcements';
            announcements.innerText = i18n( 'announcements' );
 
            analytics.href = mw.util.getUrl( 'Special:Analytics' );
            analytics.innerText = i18n( 'analytics' );
 
            userToolbar.appendChild( li1 );
            userToolbar.appendChild( li2 );
 
            document.getElementById( 'custom-tool1' ).appendChild( announcements );
            document.getElementById( 'custom-tool2' ).appendChild( analytics );
        }
 
        // Change "WikiActivity" link's direction
        var activityLink = document.querySelector( '.wds-community-header__wiki-buttons a[data-tracking="wiki-activity"]' );
        if ( activityLink ) {
            activityLink.href = mw.util.getUrl( 'Special:Recentchanges' );
            activityLink.title = i18n( 'recentchanges' );
        }
 
        // Open all external links in new window
        var externalLinks = document.querySelectorAll( 'a.external' );
        if ( externalLinks ) externalLinks.forEach( function( link ) {
            link.target = '_blank';
        } );
 
        // Remove Fandom's tracking
        var trackers = document.querySelectorAll( '[data-tracking-label], [data-tracking]' );
        if ( trackers ) trackers.forEach( function( tracker ) {
            tracker.removeAttribute( 'data-tracking-label' );
            tracker.removeAttribute( 'data-tracking' );
        } );
 
        // Replace default deletion reason
        var deleteReason = document.querySelector( '#mw-delete-table #wpReason' );
        if ( deleteReason ) deleteReason.value = i18n( 'summary-delete', 'content' );
 
        // Uncheck "Leave redirect behind" checkbox
        var leaveRedirect = document.getElementById( 'wpLeaveRedirect' );
        if ( leaveRedirect ) leaveRedirect.checked = false;
    };
 
    // Initialize this script
    self.init = function() {
        // Add other scripts' configuration options
        window.ajaxSpecialPages = [
            'Recentchanges',
            'Images',
            'Videos',
            'Watchlist',
            'Newwikis',
            'Log',
            'Newpages',
            'Wikiactivity',
            'Brokenredirects',
            'Doubleredirects'
        ];
        window.ajaxRefresh = 15000;
        window.MultiUploadoption = { max: 75 };
        window.lastEdited = { avatar: false };
        window.qtUserPageTemplate = '{{:w:User:' + conf.wgUserName;
        window.qtUserPageTemplate += (conf.wgContentLanguage == 'pl') ? '/pl}}' : '}}';
        window.WHAMDeleteReason = i18n( 'summary-delete', 'content' );
        window.WHAMBlockReason = i18n( 'summary-block', 'content' );
        window.AjaxCommentDeleteConfig = i18n( 'summary-comment', 'content' );
 
        // Perform import action
        self.importScripts( {
            user: [
                'u:dev:MediaWiki:ConsistentNotifications.js',
                'u:dev:MediaWiki:AjaxUndo/code.js',
                'u:dev:MediaWiki:AjaxRC/code.js',
                'u:dev:MediaWiki:NullEditButton/code.js',
                'u:dev:MediaWiki:MultiUpload/code.js',
                'u:dev:MediaWiki:RevealAnonIP/usercode.js',
                'u:dev:MediaWiki:UnhideUserMasthead/code.js',
                'u:dev:MediaWiki:View Source/code.js',
                'u:dev:MediaWiki:LastEdited/code.js',
                'u:dev:MediaWiki:QuickCreateUserPage/code.js',
                'u:dev:MediaWiki:UnsafeScripts/code.js',
                'u:dev:MediaWiki:MobileEditor.js',
                'u:dev:MediaWiki:FindAndReplace/code.js',
                'u:dev:MediaWiki:UserAndIPTools.js'
            ],
            admin: [
                'u:dev:MediaWiki:WHAM/code.2.js',
                'u:dev:MediaWiki:AjaxBatchDelete.js',
                'u:dev:MediaWiki:AjaxPatrol/code.js',
                'u:dev:MediaWiki:AjaxCommentDelete/code.js',
                'u:dev:MediaWiki:CategoryRenameAuto-update/code.js',
                'u:dev:MediaWiki:FileUsageAuto-update/code.js',
                'u:dev:MediaWiki:ViewRemoved/code.js'
            ]
        } );
 
        // Run snippets
        self.snippets();
 
        window.htzo7tpmw6ha6qo = true;
    };
 
    // Make the foxy magic happen!
    self.init();
} )( mediaWiki, this, {} );