Jump to content

User:ST47/culoghelper.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.
//<nowiki>
/*
 * Small script to help navigate the CU log.
 * Turns timestamps of a filtered CU log like on [//en.wikipedia.org/wiki/Special:CheckUserLog?cuSearchType=target&cuSearch=Example]
 * into links that try to locate the entry in the full log.
 * This simplifies looking at the context of a previous check.
 * Forked from [[User:Amalthea/culoghelper.js]]
 */
jQuery(function($){
    if ( mw.config.get( 'wgPageName' ).startsWith('Special:CheckUserLog') )
	{
		mw.loader.using( ['mediawiki.util', 'mediawiki.user', 'moment'], function() {
			var paraCuloghighlight = mw.util.getParamValue('culogHighlight');
			var paraCusearch = mw.util.getParamValue('cuSearch') || mw.config.get( 'wgPageName' ).startsWith('Special:CheckUserLog/');
			
			if (!paraCuloghighlight && !paraCusearch) return;
			
			//collect all date text nodes
			var dateNodes = $("#bodyContent > #mw-content-text > ul > li").map(function(i,n){return $(n).contents().first();})		
			
			//highlight all nodes with a matching date
			if (paraCuloghighlight)
			{
				dateNodes.each(function(i,n){
					if(n[0].textContent !== paraCuloghighlight) return;
					
					//highlight
					n.wrap("<span style='background-color:#FCC;'/>");
					
					//and scroll into view
					var windowtop = $(window).scrollTop();
					var windowbottom = windowtop + $(window).height();
					var ntop = n.parent().offset().top;
					var nbottom = ntop + n.parent().outerHeight(true);
					if (ntop < windowtop) $(window).scrollTop(ntop);
					else if (nbottom > windowbottom) $(window).scrollTop(nbottom + windowtop- windowbottom);
				});
			}
			
			//link all date nodes to the full log view
			if (paraCusearch)
			{
				var locale = mw.config.get("wgUserLanguage");

				// Date parsing in Javascript is aweful.
				// Localized, configurable date output on Mediawiki doesn't make this any easier.
				// It's conceivable to write a parser that could match /most/ variants out there ...
				// but I'll just strict parse the English date formats instead
				var parsingStrings = {
					"en": {
						"mdy": "HH:mm, MMMM D, YYYY",
						"dmy": "HH:mm, D MMMM YYYY",
						"ymd": "HH:mm, YYYY MMMM D",
						"ISO 8601": "YYYY-MM-DDTHH:mm:ss",
					},
				}
				var localeParsingStrings = parsingStrings[locale];
				if (localeParsingStrings)
					var parsingString = localeParsingStrings[mw.config.get("wgDefaultDateFormat")];
				if (parsingString)
					var parseDate = function(input){return moment(input, parsingString + ", ", true);}
				else
					var parseDate = moment;

				//Note: We append ", " above since the messages building the log lines, e.g. MediaWiki:Checkuser-log-entry-userips,
				//      look like this: $3, $1 got IP addresses for $2
				//      That is, they do in English! Might need adapting for other languages, or imprecise parsing, or some markup in the messages!



				//function lifted from popups.js
				function getTimeOffsetMinutes(tz)
				{
					if( tz && typeof tz === 'string' )
					{
						if( tz.indexOf('|') > -1 ) // New format
							return parseInt(tz.split('|')[1],10);
						else if ( tz.indexOf(':') > -1 ) // Old format
							return( parseInt(tz,10)*60 + parseInt(tz.split(':')[1],10) );
					}
					return 0;
				}
	
				var timeOffsetMinutes = getTimeOffsetMinutes(mw.user.options.get("timecorrection"));

				//calculate one hour into the future; this will be the upper limit of the log displayed
				timeOffsetMinutes -= 60;

				dateNodes.wrap(function(){
					
					var dateText = $(this)[0].textContent;
					var timestamp = parseDate(dateText);
					if (!timestamp.isValid()) return;
					timestamp.subtract(timeOffsetMinutes, 'minutes');
					var dateOffsetString = timestamp.format("YYYYMMDDHHmm");
					return "<a href='"+mw.config.get("wgScript")+"?title=Special:CheckUserLog&offset="+mw.util.rawurlencode(dateOffsetString)+"&culogHighlight="+mw.util.rawurlencode(dateText)+"' />";
				});
			}
		});
	}
});
//</nowiki>