User:SHEIKH/highlight.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
//কোন কমেন্টে আপনাকে হাইলাইট করবে
( function ( mw, $ ) {

	"use strict";

	var settings = {
		highlighterFunction: function ( hc ) {

			hc.addColorForUsers( '#FFFFE0', [mw.config.get( 'wgUserName' )] );
			hc.wrapComments();
			hc.addMenuItem();
		}
	};
	var msg = {
		highlightText: 'দৃষ্টিগোচর',
		highlightTooltip: 'এই পৃষ্ঠায় আপনার নিজস্ব মন্তব্যের দৃষ্টিগোচর সক্রিয় করুন',
		unhighlightText: 'দৃষ্টি অগোচর',
		unhighlightTooltip: 'এই পৃষ্ঠায় আপনার নিজস্ব মন্তব্যের দৃষ্টিগোচর নিষ্ক্রিয় করুন'
	};

	var translations = {
	};

	$.extend( msg, translations[document.documentElement.lang] );

	var linkMap = Object.create( null ), classNumber = 0, pageRE = null, commentsAreHighlighted = false;

	function buildPageRE() {
		var articlePathParts = mw.config.get( 'wgArticlePath' ).split( '$1' );
		var articlePathStartRE = mw.util.escapeRegExp( articlePathParts[0] );
		var articlePathEndRE = mw.util.escapeRegExp( articlePathParts[1] );
		var indexPathRE = mw.util.escapeRegExp( mw.util.wikiScript( 'index' ) );

		return new RegExp(
			'^(?:' + articlePathStartRE + '([^?#]+)' + articlePathEndRE + '|' +
			indexPathRE + '\\?(?:[^&#]*&)*title=([^&#]+))'
		);
	}

	function findPageNameFromHref( href ) {
		var m = pageRE.exec( href );
		return m ? decodeURIComponent(
			( m[1] || m[2] ).replace( /\+/g, '%20' )
		).replace( / /g, '_' ) : null;
	}

	function wrapComments() {
		wrapElementComments( $( '.mw-highlight-comments' ) );
		commentsAreHighlighted = true;
		addMenuItem( true );
	}

	function wrapElementComments( content ) {
	
		var commentTags = 'dd, li, p', indentTags = 'dl, ol, ul';

		$( 'a', content ).each( function () {
			var pageName = findPageNameFromHref( this.getAttribute( 'href' ) );

			if ( pageName && pageName in linkMap ) {
				var className = linkMap[pageName];
				$( this ).closest( commentTags ).contents().each( function () {
					if ( this.nodeType === 1 ) {
						var $elem = $( this );
						if ( !$elem.is( indentTags ) && !$elem.hasClass( className ) ) {
							$elem
								.addClass( className )
								.attr( 'data-mw-highlighted-comment-class', className );
						}
					} else {
						$( this ).wrap( $( '<span>', {
							'class': className,
							'data-mw-highlighted-comment-wrapper': ''
						} ) );
					}
				} );
			}
		} );
	}

	function unwrapComments() {

		$( '[data-mw-highlighted-comment-wrapper]' ).replaceWith( function () {
			return this.childNodes;
		} );

		$( '[data-mw-highlighted-comment-class]' ).removeClass( function () {
			var klass = $( this ).attr( 'data-mw-highlighted-comment-class' );
			$( this ).removeAttr( 'data-mw-highlighted-comment-class' );
			return klass;
		} );

		commentsAreHighlighted = false;
		addMenuItem( true );
	}

	function addClassForUsers( className, users ) {
		var ns = mw.config.get( 'wgFormattedNamespaces' );
		for ( var i = 0; i < users.length; ++i ) {
			var userName = users[i].replace( / /g, '_' );
			var userPage = ns[2] + ':' + userName, userTalkPage = ns[3] + ':' + userName;
			linkMap[userPage] = className;
			linkMap[userTalkPage] = className;
		}
	}

	function addColorForUsers( color, users ) {
		var className = 'highlighted-comment-' + classNumber++;
		addClassForUsers( className, users );
		return mw.util.addCSS( '.' + className + ' { background-color: ' + color + '; }' );
	}

	function addMenuItem( updateOnly ) {
		var text, tooltip, $oldItem = $( '#ca-highlightcomments' );

		if ( updateOnly && !$oldItem.length ) {
			return;
		}

		if ( commentsAreHighlighted ) {
			text = msg.unhighlightText;
			tooltip = msg.unhighlightTooltip;
		} else {
			text = msg.highlightText;
			tooltip = msg.highlightTooltip;
		}

		var link = mw.util.addPortletLink(
			'p-cactions', '#', text, 'ca-highlightcomments', tooltip, null, $oldItem[0]
		);
		$oldItem.remove();

		$( link ).click(function () {
			if ( commentsAreHighlighted ) {
				unwrapComments();
			} else {
				wrapComments();
			}
		});
	}

	var hc = {
		addClassForUsers: addClassForUsers,
		addColorForUsers: addColorForUsers,
		addMenuItem: addMenuItem,
		wrapComments: wrapComments
	};

	mw.loader.using( [ 'mediawiki.util' ], function () {
		pageRE = buildPageRE();

		$( function () {
			$.extend( settings, window.highlightCommentsSettings );
			settings.highlighterFunction( hc );
		} );

		mw.hook( 'wikipage.content' ).add( function ( $content ) {
			$content.addClass( 'mw-highlight-comments' );
			if ( commentsAreHighlighted ) {
				wrapElementComments( $content );
			}
		} );
	} );

}( mediaWiki, jQuery ) );