MediaWiki:Gadget-one-click-patrol.js

Notă: După salvare, trebuie să treceți peste cache-ul browser-ului pentru a vedea modificările.

  • Mozilla, Google Chrome, Safari, Konqueror: țineți apăsat Shift în timp ce apăsați butonul Reload (sau apăsați Ctrl-Shift-R).
  • Internet Explorer: apăsați Ctrl-F5.
  • Opera: apăsați F5.
$(function() {
	var api = new mw.Api();
	
	function patrolEditAndHideExclamationMark(diffId, exclamationMark) {
		api.post( {
				action: 'patrol',
				revid: diffId,
				token: mw.user.rtokens.get( 'patrolToken' )
		}).then(function() {
			exclamationMark.fadeOut();
		});
	}
	
	function getSingleArgumentFromLink(diffHref, argument) {
		var diffIdMatcher = new RegExp('[&\?]' + argument + '=([^&]+)').exec(diffHref);
		if (diffIdMatcher) {
			return diffIdMatcher[1];
		}
		return null;
	}
	
	function getDiffIdFromLink(diffHref) {
		return getSingleArgumentFromLink(diffHref, 'diff');
	}


	function getDiffDataFromLink(diffHref) {
		var diffIdMatcher = /(?=(?:.*&diff=(\d+))?)(?=(?:.*&curid=(\d+))?)(?=(?:.*&oldid=(\d+))?)(?=(?:.*\?title=([^&]*))?)/.exec(diffHref);
		var ret = {};
		if (diffIdMatcher) {
			ret.diff = diffIdMatcher[1];
			ret.curid = diffIdMatcher[2];
			ret.oldid = diffIdMatcher[3];
			ret.title = decodeURIComponent(diffIdMatcher[4]);
		}
		if (ret.diff && ret.diff.length > 1
			&& ret.curid && ret.curid.length > 1
			&& ret.oldid && ret.oldid.length > 1
			&& ret.title && ret.title.length > 0) {
			return ret;
		}
		return null;
	}
	
	function getMarkerAsPatrolledRevlistFromResultWithOffset(offset) {
		return function(result) {
			var revIdList = [];
			$.each(result.query.pages, function(pageid, pagedata) {
				if (pagedata.revisions) for (var i = offset; i < pagedata.revisions.length; i++) {
					revIdList.push(pagedata.revisions[i].revid);
				}
			});
			var markPatrolledPromises = revIdList.map(function(eachRevId) {
				return api.post( {
					action: 'patrol',
					revid: eachRevId,
					token: mw.user.tokens.get( 'patrolToken' )
				});
			});
			return $.when.apply($, markPatrolledPromises);
		}
	}
	function registerClickListeners($element) {
		if (mw.config.get('wgCanonicalNamespace') !== 'Special' || (mw.config.get('wgCanonicalSpecialPageName') !== 'Recentchanges' && mw.config.get('wgCanonicalSpecialPageName') !== 'Watchlist')) {
			return;
		}
		
		// for the simple Recentchanges page
		$element.find('li:has(abbr.unpatrolled)').each(function() {
			var diffHref = $(this).find('a:first').attr('href');
			var diffId = getDiffIdFromLink(diffHref);
			if (diffId) {
				$(this).find('.unpatrolled').click(function() {
					var exclamationMark = $(this);
					patrolEditAndHideExclamationMark(diffId, exclamationMark);
				});
			}
		});
		
		//for the JS Recentchanges page
		$element.find('td.mw-enhanced-rc:has(abbr.unpatrolled)').each(function(){
			var exclamationMarkHolder = $(this);
			var diffListenerRegistered = false;
			var aclass = 'mw-changeslist-diff';
			if ($(exclamationMarkHolder).parent().first().has('label.mw-enhancedchanges-arrow').length) {
				aclass = 'mw-changeslist-groupdiff';
			}
			$(this).next().find('a.' + aclass).each(function(){
				var linkHref = $(this).attr('href');
				var linkData = getDiffDataFromLink(linkHref);
				if (linkData) {
					exclamationMarkHolder.find('.unpatrolled').click(function(){
						var exclamationMark = $(this);
						api.get({
							action: 'query',
							prop: 'revisions',
							rvstartid: linkData.oldid,
							rvendid: linkData.diff,
							rvdir: 'newer',
							titles: linkData.title,
							rvprop: 'ids'
						}).then(getMarkerAsPatrolledRevlistFromResultWithOffset(1)).then(function(){
							exclamationMark.replaceWith('\xa0');
						});
					});
					diffListenerRegistered = true;
				}
			});
			
			if (!diffListenerRegistered && $(this).has('abbr.newpage').length) {
				var revLimit, lastrevidparamname;
				var aclass = 'mw-changeslist-diff-cur';
				if ($(exclamationMarkHolder).parent().first().next().has('span.mw-enhancedchanges-arrow').length) {
					if ($(exclamationMarkHolder).next().has('span.mw-title').length) {
						aclass = 'mw-changeslist-history';
						var changeCountMatch = /(\d+)\s*modificări/.exec($(exclamationMarkHolder).next().text())
						if (changeCountMatch) {
							revLimit = changeCountMatch[1];
						}
					} else {
						lastrevidparamname = 'lastrevid';
					}
				} else {
					aclass = 'mw-changeslist-history';
					revLimit = 1;
				}
				$(this).next().find('a.' + aclass).each(function() {
					var linkHref = $(this).attr('href');
					var pageTitle = getSingleArgumentFromLink(linkHref, 'title');
					pageTitle = decodeURIComponent(pageTitle);
					
					$(exclamationMarkHolder).find('.unpatrolled').click(function() {
						var exclamationMark = $(this);
						var revQueryData = {
							action: 'query',
							prop: 'revisions',
							rvdir: 'newer',
							titles: pageTitle,
							rvprop: 'ids'
						};
						if (revLimit) {
							revQueryData.rvlimit = revLimit;
						}
						if (lastrevidparamname) {
							revQueryData.rvendid = getSingleArgumentFromLink(linkHref, lastrevidparamname);
						}
						api.get(revQueryData).then(getMarkerAsPatrolledRevlistFromResultWithOffset(0))
						.then(function(){
							exclamationMark.replaceWith('\xa0');
						});
					});
				});
			}
		});
	}
	
	mw.hook( 'wikipage.content' ).add(registerClickListeners);
});