Потребител:V111P/js/QuickDiffCommands.js: Разлика между версии

от Уикипедия, свободната енциклопедия
Изтрито е съдържание Добавено е съдържание
мРедакция без резюме
Меню; Използване на оригиналния Бързолик скрипт МедияУики:Gadget-Quick_diff.js
Ред 1: Ред 1:
/**
/**
* For [[МедияУики:Gadget-Quick diff.js]]
* Enhance recent changes diff links.
*
* Author: Borislav Manolov
* License: Public domain
* Documentation: [[МедияУики:Gadget-Quick diff.js/doc]]
*/
var KEY_ESC = 27;


Задайте клавишите, които искате във вашия .js файл:
//$(document).off();
//$('a[href*="diff="]').off();
//$('#quickdiff').remove();


window.quickDiffConfig = {
var QuickDiff = {
keys: {
close: '4',
patrol: '3',
rollback: '5',
up: 'r',
down: 'f',
upUnpatrolled: 'e',
downUnpatrolled: 'd'
}
};


*/
enable: function()
{
jQuery('body').on('click', 'a[href*="diff="]', function (event) {
var $link = jQuery(this);
var isInside = $link.closest('#quickdiff').length > 0;
if (isInside)
$link = QuickDiff.$currentDiffLink;
else
QuickDiff.$currentDiffLink = $link.addClass("working");
var href = this.href + "&action=render"
+ ( event.ctrlKey ? "" : "&diffonly=1" );
jQuery.get(href, function(data){
QuickDiff.viewDiff(data, $link);
if (!isInside)
$link.removeClass("working").addClass("done");
});
return false;
});
},


//$(document).off(); $('a[href*="diff="]').off();
viewDiff: function(content, $link)
//$('#quickdiff').remove(); window.QuickDiff = null;
{
//if (QuickDiffCmds) QuickDiffCmds.turnOff();
var $viewWin = this.getViewWindow().css("top", $link.position().top + 30)
.find("#quickdiff-content").html(content)
.end().show();
if (mw.ext && mw.ext.Patroller) {
new mw.ext.Patroller.bulk(new mw.ext.Patroller.quick()).enable($link[0].href);
var patrolLink = $viewWin.find('.patrollink a');
new mw.ext.Patroller.quick().enable(patrolLink, $link[0].href);
}
if (mw.ext && mw.ext.QuickRollback) {
var $rollbackLinkSpan = $('#quickdiff .mw-rollback-link');
$rollbackLinkSpan.before('<br/>');
mw.ext.QuickRollback.enable($rollbackLinkSpan.find('a'));
}
},


var QuickDiffCmds = {
viewWindow: null,


$menu: null,
getViewWindow: function()
{
if ( null === this.viewWindow ) {
this.prepareViewWindow();
}


closeWin: function () {
return this.viewWindow;
$('#quickdiff').hide();
},
},


prepareViewWindow: function()
turnOff: function () {
QuickDiffCmds.quickDiffPatch(true);
if (QuickDiffCmds.qdcCss) QuickDiffCmds.qdcCss.disabled = true;
if (QuickDiffCmds.$menu) QuickDiffCmds.$menu.remove();
},

buildMenu: function()
{
{
var $menuDiv = $('<div id="quickdiff-menu"></div>');
this.viewWindow = this.buildViewWindow();


var clk = function (fn) { return function (e) { e.preventDefault(); fn(); } }
mw.loader.load("mediawiki.diff.styles", "text/css");
var spEl = document.createTextNode('&nbsp;');
this.addCss();
var sp = '&nbsp;&nbsp;';
},
$menuDiv.prepend(sp, $('<a href="#">&gt;&gt;</a>').click(clk(QuickDiffCmds.nextUnpatrolled)));
$menuDiv.prepend(sp, $('<a href="#">&gt;</a>').click(clk(QuickDiffCmds.next)));
$menuDiv.prepend(sp, $('<a href="#" title="' + QuickDiffCmds.helpMsg() + '">?</span>')
.click(clk(function () {
alert(QuickDiffCmds.helpMsg());
})));
$menuDiv.prepend(sp, $('<a href="#">&lt;</a>').click(clk(QuickDiffCmds.up)));
$menuDiv.prepend(sp, $('<a href="#">&lt;&lt;</a>').click(clk(QuickDiffCmds.upUnpatrolled)));


closeWin: function() {
$('#quickdiff').hide();
},

buildViewWindow: function()
{
var $win = jQuery('<div id="quickdiff"><div id="quickdiff-close"></div><div id="quickdiff-content"></div></div>');
var closeWin = function(){
if ($win) {
$win.hide();
}
};
$win.on('dblclick', closeWin).appendTo("#bodyContent").find("#quickdiff-close").click(closeWin);
$(document).keyup(function(e) {
$(document).keyup(function(e) {
var keys = QuickDiff.keys;
var keys = QuickDiffCmds.keys;

if (e.keyCode == KEY_ESC) { closeWin(); }


if (e.keyCode == KEY_ESC) { QuickDiff.closeWin(); return; }
if ( !$('#quickdiff').is(':visible') || e.target.nodeName == 'INPUT' ) { return; }
if ( !$('#quickdiff').is(':visible') || e.target.nodeName == 'INPUT' ) { return; }


var key = String.fromCharCode(e.keyCode).toLowerCase();
var key = String.fromCharCode(e.keyCode).toLowerCase();


if (QuickDiff.userIsPatroller && key == keys.patrol) { QuickDiff.patrolMulti(); }
if (QuickDiffCmds.userIsPatroller && key == keys.patrol) { QuickDiffCmds.patrolMulti(); }
else if (key == keys.close) { closeWin(); }
else if (key == keys.close) { QuickDiffCmds.closeWin(); }
else if (key == keys.rollback) {
else if (key == keys.rollback) {
var rollbkLink = $('#quickdiff .mw-rollback-link a').attr('target', '_blank')[0];
var rollbkLink = $('#quickdiff .mw-rollback-link a').attr('target', '_blank')[0];
Ред 104: Ред 72:
else if (key == keys.rollbackComment) {
else if (key == keys.rollbackComment) {
var rollbkCLink = $('#quickdiff a.quickRollback_comm')[0];
var rollbkCLink = $('#quickdiff a.quickRollback_comm')[0];
if (rollbkCLink) rollbkCLink.click();
if (rollbkCLink) rollbkCLink.click();
}
}
else if (key == keys.up || key == keys.down) {
else if (key == keys.up || key == keys.down) {
QuickDiff.next( key == keys.up );
QuickDiffCmds.next( key == keys.up );
}
}
else if ( QuickDiff.userIsPatroller && ( key == keys.upUnpatrolled || key == keys.downUnpatrolled ) ) {
else if ( QuickDiffCmds.userIsPatroller && ( key == keys.upUnpatrolled || key == keys.downUnpatrolled ) ) {
QuickDiff.nextUnpatrolled( key == keys.upUnpatrolled );
QuickDiffCmds.nextUnpatrolled( key == keys.upUnpatrolled );
}
}
});
});
return $menuDiv;
$(document.body).on("click", function(event) {
if ($(event.target).parents('#quickdiff').length === 0) {
closeWin();
}
});
return $win;
},
},


addCss: function()
addCss: function()
{
{
mw.util.addCSS(
QuickDiffCmds.qdcCss = mw.util.addCSS(
'#quickdiff {\
'#quickdiff-menu {\
position: absolute;\
z-index: 1;\
width: 100%;\
border: thin outset silver;\
box-shadow: 0 0 30px #888888;\
background-color: white;\
}\
#quickdiff-close {\
position: absolute;\
position: absolute;\
top: 0;\
top: 0;\
right: 0;\
right: 40px;\
width: 20px;\
font-family: sans-serif;\
height: 20px;\
background: url(//upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Fileclose.png/16px-Fileclose.png) no-repeat center center;\
cursor: pointer;\
z-index: 1;\
}'
}'
);
);
Ред 158: Ред 111:
},
},


up: function() {QuickDiffCmds.next(true);},
next: function(up) {
next: function(up) {
function scrollTo(el) {
function scrollTo(el) {
Ред 165: Ред 119:
}
}
var $lastDiffLink = QuickDiff.$currentDiffLink;
var $lastDiffLink = QuickDiff.$currentDiffLink;
var $all, index, closeWin = QuickDiff.closeWin;
var $all, index, closeWin = QuickDiffCmds.closeWin;


if (mw.config.get('wgAction') === "history") {
if (mw.config.get('wgAction') === "history") {
Ред 190: Ред 144:
}
}
else { // Recent changes, Watchlist, Contributions
else { // Recent changes, Watchlist, Contributions
var $all;
var $all;
if (mw.config.get('wgCanonicalSpecialPageName') == 'Contributions') {
if (mw.config.get('wgCanonicalSpecialPageName') == 'Contributions') {
$all = $('.mw-changeslist-date + a[href*="&diff=prev"]');
$all = $('.mw-changeslist-date + a[href*="&diff=prev"]');
}
}
else if ($('.mw-enhanced-rc').length > 0) {
else if ($('.mw-enhanced-rc').length > 0) {
$all = $('.mw-title + a[href*="&diff="]'); // excludes the subdiffs
$all = $('.mw-title + a[href*="&diff="]'); // excludes the subdiffs
}
}
else $all = $('a[href*="&diff="]');
else $all = $('a[href*="&diff="]');


if (up) { $all = $($all.get().reverse()); }
if (up) { $all = $($all.get().reverse()); }
Ред 221: Ред 175:
},
},


upUnpatrolled: function() {QuickDiffCmds.nextUnpatrolled(true);},
nextUnpatrolled: function(up) {
nextUnpatrolled: function(up) {
var namespaceNames = mw.config.get('wgFormattedNamespaces');
var namespaceNames = mw.config.get('wgFormattedNamespaces');
Ред 245: Ред 200:
});
});


if (!$nextUnpatrolled) QuickDiff.closeWin();
if (!$nextUnpatrolled) QuickDiffCmds.closeWin();
else {
else {
var $scrollToEl = ($above && $above[0] ? $above : $nextUnpatrolled);
var $scrollToEl = ($above && $above[0] ? $above : $nextUnpatrolled);
Ред 251: Ред 206:
$lnk.click();
$lnk.click();
}
}
},

helpMsg: function() {
var hlpStr = '<< – Нагоре непатрул.\n< – Нагоре\n> – Надолу\n>> – Надолу непатрул.\n\nКлавиши\n';
$.each(QuickDiffCmds.keys, function(idx,val) {
switch (idx) {
case 'rollbackGood': // fallthrough
case 'rollbackComment': if (!mw.ext.QuickRollback) return; // fallthrough
case 'rollback': // fallthrough
case 'patrol': if (!QuickDiffCmds.userIsPatroller) return; break;
}
var str = idx + ": " + val + '\n';
hlpStr += str;
});
return hlpStr + '';
},

quickDiffPatch: function (undo) {
if (undo) {
if (QuickDiffCmds.originalGVW)
QuickDiff.getViewWindow = QuickDiffCmds.originalGVW;
return;
}

QuickDiffCmds.originalGVW = QuickDiff.getViewWindow;
QuickDiff.getViewWindow = function () {
var $menu = QuickDiffCmds.$menu;
if ( null === $menu ) {
$menu = QuickDiffCmds.$menu = QuickDiffCmds.buildMenu();
}
var win = QuickDiffCmds.originalGVW.call(QuickDiff);
win && win.prepend && win.prepend($menu);
return win;
};
}
}


Ред 265: Ред 254:
patrol: '3',
patrol: '3',
rollback: '5',
rollback: '5',
rollbackGood: '6', // изисква джаджата „Бързо отменяне“
rollbackGood: '6', // изисква джаджата „Бързо отменяне“
rollbackComment: '7', // изисква джаджата „Бързо отменяне“
rollbackComment: '7', // изисква джаджата „Бързо отменяне“
up: 'r',
up: 'r',
Ред 273: Ред 262:
};
};
var customKeys = window.quickDiffConfig && window.quickDiffConfig.keys;
var customKeys = window.quickDiffConfig && window.quickDiffConfig.keys;
QuickDiff.keys = $.extend(keys, customKeys);
QuickDiffCmds.keys = $.extend(keys, customKeys);


var userGroups = mw.config.get('wgUserGroups');
var userGroups = mw.config.get('wgUserGroups');
QuickDiff.userIsAdmin = $.inArray("sysop", userGroups) > -1;
QuickDiffCmds.userIsAdmin = $.inArray("sysop", userGroups) > -1;
QuickDiff.userIsPatroller = $.inArray("patroller", userGroups) > -1
QuickDiffCmds.userIsPatroller = $.inArray("patroller", userGroups) > -1 || QuickDiffCmds.userIsAdmin;
QuickDiffCmds.addCss();
|| $.inArray("autopatrolled", userGroups) > -1 || QuickDiff.userIsAdmin;


QuickDiff.enable();
if (!window.QuickDiff) $.ajax({
url: '//bg.wikipedia.org/w/index.php?title=МедияУики:Gadget-Quick_diff.js'
+ '&action=raw&ctype=text/javascript',
dataType: 'script',
cache: true,
success: function () {
setTimeout(function () {
if (window.QuickDiff)
QuickDiffCmds.quickDiffPatch();
}, 500); // sometimes a script needs time to execute
}
});
}
}

});
});

Версия от 10:55, 27 април 2018

/**
 * For [[МедияУики:Gadget-Quick diff.js]]
 *

   Задайте клавишите, които искате във вашия .js файл:

    window.quickDiffConfig = {
        keys: {
            close: '4',
            patrol: '3',
            rollback: '5',
            up: 'r',
            down: 'f',
            upUnpatrolled: 'e',
            downUnpatrolled: 'd'
        }
    };

 */

//$(document).off(); $('a[href*="diff="]').off();
//$('#quickdiff').remove(); window.QuickDiff = null;
//if (QuickDiffCmds) QuickDiffCmds.turnOff();

var QuickDiffCmds = {

	$menu: null,

	closeWin: function () {
		$('#quickdiff').hide();
	},

	turnOff: function () {
		QuickDiffCmds.quickDiffPatch(true);
        if (QuickDiffCmds.qdcCss) QuickDiffCmds.qdcCss.disabled = true;
		if (QuickDiffCmds.$menu) QuickDiffCmds.$menu.remove();
	},

	buildMenu: function()
	{
		var $menuDiv = $('<div id="quickdiff-menu"></div>');

		var clk =  function (fn) { return function (e) { e.preventDefault(); fn(); } }
		var spEl =  document.createTextNode('&nbsp;');
		var sp = '&nbsp;&nbsp;';
		$menuDiv.prepend(sp, $('<a href="#">&gt;&gt;</a>').click(clk(QuickDiffCmds.nextUnpatrolled)));
		$menuDiv.prepend(sp, $('<a href="#">&gt;</a>').click(clk(QuickDiffCmds.next)));
		$menuDiv.prepend(sp, $('<a href="#" title="' + QuickDiffCmds.helpMsg() + '">?</span>')
			.click(clk(function () {
				alert(QuickDiffCmds.helpMsg());
			})));
		$menuDiv.prepend(sp, $('<a href="#">&lt;</a>').click(clk(QuickDiffCmds.up)));
		$menuDiv.prepend(sp, $('<a href="#">&lt;&lt;</a>').click(clk(QuickDiffCmds.upUnpatrolled)));

		$(document).keyup(function(e) {
			var keys = QuickDiffCmds.keys;

			if ( !$('#quickdiff').is(':visible') || e.target.nodeName == 'INPUT' ) { return; }

			var key = String.fromCharCode(e.keyCode).toLowerCase();

			if (QuickDiffCmds.userIsPatroller && key == keys.patrol) { QuickDiffCmds.patrolMulti(); }
			else if (key == keys.close) { QuickDiffCmds.closeWin(); }
			else if (key == keys.rollback) {
				var rollbkLink = $('#quickdiff .mw-rollback-link a').attr('target', '_blank')[0];
				if (rollbkLink) rollbkLink.click();
			}
			else if (key == keys.rollbackGood) {
				var rollbkGLink = $('#quickdiff a.quickRollback_good')[0];
				if (rollbkGLink) rollbkGLink.click();
			}
			else if (key == keys.rollbackComment) {
				var rollbkCLink = $('#quickdiff a.quickRollback_comm')[0];
				if (rollbkCLink) rollbkCLink.click();
			}
			else if (key == keys.up || key == keys.down) {
				QuickDiffCmds.next( key == keys.up );
			}
			else if ( QuickDiffCmds.userIsPatroller && ( key == keys.upUnpatrolled || key == keys.downUnpatrolled ) ) {
				QuickDiffCmds.nextUnpatrolled( key == keys.upUnpatrolled );
			}
		});
		return $menuDiv;
	},

	addCss: function()
	{
		QuickDiffCmds.qdcCss = mw.util.addCSS(
			'#quickdiff-menu {\
				z-index: 1;\
				position: absolute;\
				top: 0;\
				right: 40px;\
				font-family: sans-serif;\
			}'
		);
	},

	patrolMulti: function() { // "click" the Patrol-multiple link if exists, otherwise "click" the Patrol link
		var $quickPatrolMultipleLink = $('#quickdiff [href="#executePatrol"]');
		var $standardPatrolLink = $('#quickdiff .patrollink a');
		if ($quickPatrolMultipleLink[0]) $quickPatrolMultipleLink.click();
		else {
			if (mw.ext && mw.ext.Patroller)
				$standardPatrolLink.click();
			else
				$standardPatrolLink[0].click();
		}
		// remove the exclamation point from the line
		QuickDiff.$currentDiffLink.closest('tr').find('abbr.unpatrolled').after('&nbsp;').remove();
	},

	up: function() {QuickDiffCmds.next(true);},
	next: function(up) {
		function scrollTo(el) {
			el = (el && el instanceof jQuery ? el[0] : el);
			if (el) el.scrollIntoView();
			return $(el);
		}
		var $lastDiffLink = QuickDiff.$currentDiffLink;
		var $all, index, closeWin = QuickDiffCmds.closeWin;

		if (mw.config.get('wgAction') === "history") {
			$all = $('ul#pagehistory li');
			index = $all.index($lastDiffLink.closest('li'));

			if ( (up && index === 0) || (!up && index == $all.length - 1) ) closeWin();
			else {
				var $diffLinks = $all.eq( index + (up ? -1 : 1) ).find('.mw-history-histlinks a');
				if (up) {
					// if at top and there is no more recent edit, the "prev" link is the first link
					var $lnk = $( $diffLinks[1] || $diffLinks[0] );
					scrollTo( $all[index - 2] || $lnk );
					$lnk.click();
				}
				else { // down
					if ($diffLinks.length == 1) { closeWin(); } // no prev link (no earlier edits)
					else {
						scrollTo($lastDiffLink); // scroll to the link above
						$diffLinks[1].click();
					}
				}
			}
		}
		else { // Recent changes, Watchlist, Contributions
			var $all;
			if (mw.config.get('wgCanonicalSpecialPageName') == 'Contributions') {
				$all = $('.mw-changeslist-date + a[href*="&diff=prev"]');
			}
			else if ($('.mw-enhanced-rc').length > 0) {
				$all = $('.mw-title + a[href*="&diff="]'); // excludes the subdiffs
			}
			else $all = $('a[href*="&diff="]');

			if (up) { $all = $($all.get().reverse()); }
			index = $all.index($lastDiffLink);

			if (index > -1) {
				if ( index == $all.length - 1 ) closeWin();
				else {
					var $el = $all.eq(index + 1);
					// scroll to the element above $el, unless $el is the top element
					scrollTo( $(!up ? $lastDiffLink : $( $all.eq(index + 2)[0] || $el[0] ) ) );
					$el.click();
				}
			}
			else { // Enhanced Recent Changes/Watchlist sublist diff link
				var $sublist = $lastDiffLink.closest('.mw-enhanced-rc').find('.mw-enhanced-rc-time + a + a');
				index = $sublist.index($lastDiffLink);
				if ( (!up && index + 1 == $sublist.length) || (up && index < 1) ) closeWin();
				else if (index > -1) scrollTo( $sublist.eq( index + (up ? -1 : 1) ) ).click();
			}
		}

	},

	upUnpatrolled: function() {QuickDiffCmds.nextUnpatrolled(true);},
	nextUnpatrolled: function(up) {
		var namespaceNames = mw.config.get('wgFormattedNamespaces');
		var talkNS = namespaceNames[1], wpNS = namespaceNames[4];
		var excludeNSRegEx = new RegExp('[' + talkNS[0] + talkNS[0].toLowerCase() + ']'
		                                  + talkNS.slice(1) + ':|' + wpNS + ':');
		var grouped = $('table.mw-enhanced-rc').length > 0;
		var $all = $( grouped ? 'table.mw-enhanced-rc' : '.mw-changeslist li' );
		if (up) { $all = $($all.get().reverse()); }
		var index = $all.index(QuickDiff.$currentDiffLink.closest( (grouped ? 'table.mw-enhanced-rc' : 'li' ) ));
		var $nextUnpatrolled, $above, $lnk;

		$all.each(function (i, el) {
			if (i <= index) return true; // continue
			var $el = $(el);
			$lnk = $el.find( ( grouped ? '.mw-title + ' : '' ) + 'a[href*="&diff="]' );

			if ( $lnk[0] && $el.has('.unpatrolled')[0] && !$el.text().match(excludeNSRegEx) ) {
				$nextUnpatrolled = $el;
				$above = (up ? $($all[i + 1]) : $($all[i - 1]));
				return false; // break
			}
			return true; // continue
		});

		if (!$nextUnpatrolled) QuickDiffCmds.closeWin();
		else {
			var $scrollToEl = ($above && $above[0] ? $above : $nextUnpatrolled);
			$scrollToEl[0].scrollIntoView();
			$lnk.click();
		}
	},

	helpMsg: function() {
		var hlpStr =  '<< – Нагоре непатрул.\n< – Нагоре\n> – Надолу\n>> – Надолу непатрул.\n\nКлавиши\n';
		$.each(QuickDiffCmds.keys, function(idx,val) {
			switch (idx) {
				case 'rollbackGood': // fallthrough
				case 'rollbackComment': if (!mw.ext.QuickRollback) return; // fallthrough
				case 'rollback': // fallthrough
				case 'patrol': if (!QuickDiffCmds.userIsPatroller) return; break;
  			}
  			var str = idx + ": " + val + '\n';
  			hlpStr += str;
		});
			return hlpStr + '';
	},

	quickDiffPatch: function (undo) {
		if (undo) {
			if (QuickDiffCmds.originalGVW)
				QuickDiff.getViewWindow = QuickDiffCmds.originalGVW;
			return;
		}

		QuickDiffCmds.originalGVW = QuickDiff.getViewWindow;
		QuickDiff.getViewWindow = function () {
			var $menu = QuickDiffCmds.$menu;
			if ( null === $menu ) {
				$menu = QuickDiffCmds.$menu = QuickDiffCmds.buildMenu();
			}
			var win = QuickDiffCmds.originalGVW.call(QuickDiff);
			win && win.prepend && win.prepend($menu);
			return win;
		};
	}

};

// prepare for fight
$(function(){
	if ( /^(Recentchanges|Watchlist|Contributions)/.test(mw.config.get('wgCanonicalSpecialPageName'))
			|| mw.config.get('wgAction') === "history"
			|| mw.config.get('wgPageName') === "Уикипедия:Активни_беседи"
	) {
		var keys = {
			close: '4',
			patrol: '3',
			rollback: '5',
			rollbackGood: '6',    // изисква джаджата „Бързо отменяне“
			rollbackComment: '7', // изисква джаджата „Бързо отменяне“
			up: 'r',
			down: 'f',
			upUnpatrolled: 'e',
			downUnpatrolled: 'd'
		};
		var customKeys = window.quickDiffConfig && window.quickDiffConfig.keys;
		QuickDiffCmds.keys = $.extend(keys, customKeys);

		var userGroups = mw.config.get('wgUserGroups');
		QuickDiffCmds.userIsAdmin = $.inArray("sysop", userGroups) > -1;
		QuickDiffCmds.userIsPatroller = $.inArray("patroller", userGroups) > -1 || QuickDiffCmds.userIsAdmin;
		QuickDiffCmds.addCss();

		if (!window.QuickDiff) $.ajax({
			url: '//bg.wikipedia.org/w/index.php?title=МедияУики:Gadget-Quick_diff.js'
					+ '&action=raw&ctype=text/javascript',
			dataType: 'script',
			cache: true,
			success: function () {
				setTimeout(function () {
					if (window.QuickDiff)
						QuickDiffCmds.quickDiffPatch();
				}, 500); // sometimes a script needs time to execute
			}
		});
	}

});