Jump to content

User:PleaseStand/highlight-comments-dev.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by PleaseStand (talk | contribs) at 03:50, 17 February 2011 (Add mw.user.name() if it does not exist). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/**
 * Highlights specific users' posts to discussion pages using a CSS class.
 *
 * Originally written by PleaseStand in 2010, updated for MediaWiki 1.17 in 2011
 * Released to the public domain; see http://en.wikipedia.org/wiki/Template:PD-self
 */

 // Work around mw.Map brokenness
 if ( !mw.Map ) {
	mw.Map = mw.config.constructor;
 }
 
 // Add mw.user.name() if it does not exist
 if ( !mw.user.name ) {
	mw.user.name = function() {
		return mw.config.get( 'wgUserName' );
	};
 }
 
window.highlightComments = new ( function( $ ) {
	var linkMap = new mw.Map(),
		classNumber = 0;

    /**
	 * Give comments linking to any given page a specific CSS class.
	 * Essentially, we need to find the comment's container and wrap (except where unnecessary)
	 * everything inside except replies to that comment. We can filter the replies out in that
	 * they are inside other element types that have the effect of indenting the text.
	 * @param linkMap A mw.Map from names of linked pages to CSS class names
	 */
	function wrapComments( linkMap ) {
		// Elements containing comments or indented text (replies to those comments)
		var commentTags = 'dd, li, p',
			indentTags = 'dl, ol, ul';
		
		$( 'a' ).each( function() {
			if ( linkMap.exists( this.title ) ) {
				var className = linkMap.get( this.title );
				$(this).closest( commentTags ).contents().not( indentTags ).each( function() {
						if ( this.nodeType == 1 ) {
							$( this ).addClass( className );
						} else {
							$( this ).wrap( $( '<span/>', { 'class': className } ) );
						}
				} );
			}
		} );
	}
	
	/**
	 * Add a group of users whose comments should be given the same CSS class.
	 * @param className The CSS class name to use
	 * @param users An array of usernames
	 */
	this.addClass = function( className, users ) {
		var ns = mw.config.get( 'wgFormattedNamespaces' );
		for ( var i = 0; i < users.length; ++i ) {
			var userName = users[i],
				userPage = ns[2] + ':' + userName,
				userTalkPage = ns[3] + ':' + userName;
			this.linkMap.set( userPage, className );
			this.linkMap.set( userTalkPage, className );
		}
	};
	
	/**
	 * Add a group of users whose comments should be highlighted in the same color.
	 * @param color The CSS background-color to use
	 * @param users An array of usernames
	 * @return The resulting CSSStyleSheet object
	 */
	this.addColor = function( color, users ) {
		var className = 'highlighted-comment-' + classNumber++;
		this.addClass( className, users );
		return mw.util.addCSS( '.' + className + ' { background-color: ' + color + '; }' );
	};
	
	this.addColor( '#ff7', [ mw.user.name() ] );
	$( function() {
		wrapComments( linkMap );
	} );
	
} )( $ );