MediaWiki:Common.js: Difference between revisions

From MB Wiki
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
Line 92: Line 92:
importStylesheet('User:'+config.wgUserName+'/common.css');
importStylesheet('User:'+config.wgUserName+'/common.css');
}
}
// === NoTitle OVERRIDE ===
// === PREVENT NoTitle EXECUTION ===
$(document).ready(function() {
if (mw.config.get('wgPageName') === 'Main_Page') {
    // Check if we're on Main Page
     // Override window.onload or other event listeners
    var isMainPage = mw.config.get('wgPageName') === 'Main_Page' ||
    var originalAddEventListener = EventTarget.prototype.addEventListener;
                    (mw.config.get('wgCanonicalNamespace') === '' &&
    EventTarget.prototype.addEventListener = function(type, listener, options) {
                      mw.config.get('wgTitle') === 'Main_Page');
        if (type === 'load' && listener.toString().indexOf('NoTitle') > -1) {
      
            console.log('Blocked NoTitle load event');
    if (isMainPage) {
             return; // Don't add the NoTitle listener
        console.log('Main Page detected - overriding NoTitle');
       
        // Function to show title
        function forceShowTitle() {
            var title = $('#firstHeading, h1.firstHeading, .mw-page-title-main');
           
            if (title.length) {
                // Force display
                title.css('display', 'block!important');
                title.css('visibility', 'visible!important');
               
                // Remove any inline hiding
                title.attr('style', function(i, style) {
                    return (style || '').replace(/display\s*:\s*none/gi, 'display:block!important');
                });
               
                console.log('Title element found and shown');
            } else {
                // Create title if it doesn't exist
                $('#content').prepend('<h1 id="firstHeading" class="firstHeading" style="display:block!important">' +
                                      mw.config.get('wgTitle') + '</h1>');
                console.log('Created title element');
             }
         }
         }
          
         return originalAddEventListener.call(this, type, listener, options);
        // Run multiple times to catch different load states
     };
        forceShowTitle();
}
        setTimeout(forceShowTitle, 100);
        setTimeout(forceShowTitle, 500);
        setTimeout(forceShowTitle, 1000);
     }
});

Revision as of 23:03, 10 December 2025

var config = mw.config.values;
window.dev = window.dev || {};
window.dev.waitFor = function(query, callback, extraDelay) {
	if ('function' == typeof callback && 'string' == typeof query) {
		extraDelay = extraDelay || 0;
		if (document.querySelector(query)) {
			setTimeout(callback, extraDelay);
		} else {
			// set up the mutation observer
			var observer = new MutationObserver(function (mutations, me) {
				// mutations is an array of mutations that occurred
				// me is the MutationObserver instance
				var targetNode = document.querySelector(query);
				if (targetNode) {
					setTimeout(callback, extraDelay);
					me.disconnect(); // stop observing
					return;
				}
			});
			
			// start observing
			observer.observe(document, {
			  childList: true,
			  subtree: true
			});
		}
	}
};

// Load site JS
[
	'ThemeToggle.js',	// Add link button on sidebar for mass renaming files and pages
	'MassRename.js',	// Add link button on sidebar for mass renaming files and pages
	'BetterUpload.js',	// Improvements to Special:Upload
	'BetterDiff.js'		// Aids with patrolling and with diff viewing on RC, page history and user contribs
]
.forEach(function(src){
	importScript('MediaWiki:'+src);
});

// Run when page content is added and loaded
mw.hook('wikipage.content').add(function(){
	// Add navigational keybinds
	if (config.wgAction=='view') {
		var actions = {
			e: function(page){ return config.wgServer+mw.util.getUrl(page)+'?action=edit'; },
			h: function(page){ return config.wgServer+mw.util.getUrl(page)+'?action=history'; },
			m: function(page){ return config.wgServer+mw.util.getUrl('Special:MovePage/'+page); },
			d: function(page){ return config.wgServer+mw.util.getUrl(page)+'?action=delete'; },
		};
		var url = new URL(document.location.href);
		var title = 
			url.searchParams.get('title') ||			// for `/w/index.php?title=XYZ` links
			url.pathname.replace(/^.*?wi?k?i?\//, '');	// for `/wiki/XYZ` links
		$(document).on('keydown', function(e) {
			var key = e.key.toLocaleLowerCase();
			if (
				actions[key] &&
				!(e.target && ['INPUT', 'TEXTAREA'].includes(e.target.nodeName)) &&
				config.wgCanonicalSpecialPageName===false
			) {
				document.location.href= actions[key](title);
			}
		});
	}
	
	// Run through sidebar to make sure classes align with collapse status
	window.dev.waitFor('#mw-navigation > .collapsible-nav > nav', function() {
		$('#mw-navigation > .collapsible-nav > nav').each(function(_, nav) {
			if (getComputedStyle(nav).display!=='none') {
				if (
					nav.classList.contains('collapsed') &&
					getComputedStyle(nav.querySelector('.vector-menu-content')).display!=='none'
				) {
					nav.classList.remove('collapsed');
					nav.classList.add('expanded');
				} else if (
					nav.classList.contains('expanded') &&
					getComputedStyle(nav.querySelector('.vector-menu-content')).display=='none'
				) {
					nav.classList.add('collapsed');
					nav.classList.remove('expanded');
				}
			}
		});
	});
});

// Load personal JS & CSS if logged in user
if (config.wgUserName && config.wgUserName.length>0) {
	importScript('User:'+config.wgUserName+'/common.js');
	importStylesheet('User:'+config.wgUserName+'/common.css');
}
// === PREVENT NoTitle EXECUTION ===
if (mw.config.get('wgPageName') === 'Main_Page') {
    // Override window.onload or other event listeners
    var originalAddEventListener = EventTarget.prototype.addEventListener;
    EventTarget.prototype.addEventListener = function(type, listener, options) {
        if (type === 'load' && listener.toString().indexOf('NoTitle') > -1) {
            console.log('Blocked NoTitle load event');
            return; // Don't add the NoTitle listener
        }
        return originalAddEventListener.call(this, type, listener, options);
    };
}