مدیاویکی:Gadget-DiffPicker.js

از ویکی‌پدیا، دانشنامهٔ آزاد

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

(function ($, mw) {
	'use strict';
	var bookmarks = [];
	
	$(function () {
		$(mw.util.addPortletLink('p-tb', '#', 'تفاوت‌ها', 't-pickeddiffs'))
			.click(function (e) {
				e.preventDefault();
				bookmarks = cookie.get('pickedDiffs');
				if (bookmarks.length > 0) {
					openDiffPicker();
				} else {
					mw.notify('هیچ تفاوت ذخیره شده‌ای وجود ندارد.');
				}
				return false;
			});
		counter();
	});


	var cookie = {
		set: function(name, value){
			mw.cookie.set(name, JSON.stringify(value));
		},
		get: function(name){
			var value = mw.cookie.get(name);
			if (value) {
				return JSON.parse(value);
			} else {
				return [];
			}
		}
	};



	var diff = mw.config.get('wgDiffNewId');

	if (diff) {
		$('.diff-ntitle').prepend('<div id="diffPeaker-btn"></div>');
		icon();
	}

	$(document).on('click', '#diffPeaker-btn', function(){
		doIt(diff);
	});

	function counter(){
		$('#t-pickeddiffs a').html('تفاوت‌ها <span id="diffCounter"></span>');
		var n = cookie.get('pickedDiffs').length;
		$('#diffCounter').removeClass();
		if (n > 0) {
			$('#diffCounter').addClass('red');
		}
		if (n == 0) {
			n = '';
		}
		$('#diffCounter').text(toPersianNum(n));
	}

	function doIt(revId){
		revId = parseInt(revId);
		bookmarks = cookie.get('pickedDiffs');
		var index = bookmarks.indexOf(revId);
		if (index == -1) {
			bookmarks.push(revId);
		} else {
			bookmarks.splice(index, 1);
		}
		cookie.set('pickedDiffs', bookmarks);
		icon();
		counter();
	}

	function icon(){
		bookmarks = cookie.get('pickedDiffs');
		$('#diffPeaker-btn').removeClass();
		if (bookmarks.indexOf(diff) != -1) {
			$('#diffPeaker-btn').addClass('picked');
		} else {
			$('#diffPeaker-btn').addClass('notPicked');
		}
	}

	function toPersianNum(num, dontTrim) {
		var i = 0,

		dontTrim = dontTrim || false,

		num = dontTrim ? num.toString() : num.toString().trim(),
		len = num.length,

		res = '',
		pos,

		persianNumbers = typeof persianNumber == 'undefined' ?
			['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'] :
			persianNumbers;

		for (; i < len; i++) {
			if (( pos = persianNumbers[num.charAt(i)] ))
				res += pos;
			else
				res += num.charAt(i);
		}

		return res;
	}


	function insertAtCursor(selector, value) {
		var cursorPos = $(selector).prop('selectionStart');
		var v = $(selector).val();
		var textBefore = v.substring(0,  cursorPos);
		var textAfter  = v.substring(cursorPos, v.length);

		$(selector).val(textBefore + value + textAfter);
	}



	$(document).on('click', '.DiffList .unpickDiff', function(){
		var row = $(this);
		doIt(row.attr('diff'));
		row.parents('tr').remove();
	});



	// Interface

	var DiffModule = {};
	function DiffPicker( config ) {
		DiffPicker.parent.call( this, config );
	}
	OO.inheritClass( DiffPicker, OO.ui.ProcessDialog );

	DiffPicker.static.name = 'DiffPicker';
	DiffPicker.static.title = 'گزینش‌گر تفاوت';
	DiffPicker.static.actions = [];
	if ($('#wpTextbox1').length > 0) {
		DiffPicker.static.actions.push({ action: 'insert', label: 'درج', flags: 'primary' });
	}
	DiffPicker.static.actions.push({action: 'cancel', label: 'بستن', flags: 'safe'});
	DiffPicker.static.actions.push({action: 'clear', label: 'خالی کردن فهرست'});


	DiffPicker.prototype.initialize = function () {
		DiffPicker.parent.prototype.initialize.apply( this, arguments );
		this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );


		DiffModule = new OO.ui.ToggleSwitchWidget({
			value: true
		});

		var fieldset = new OO.ui.FieldsetLayout();
		fieldset.addItems( [
			new OO.ui.FieldLayout( DiffModule, { label: 'الگوی تفاوت‌ها' } )
		] );
		this.content.$element.append(fieldset.$element);


		bookmarks = cookie.get('pickedDiffs');

		var diffsList = '<table class="DiffList"><tr><th>پیوند تفاوت</th><th>حذف</th></tr>';

		for (var i in bookmarks) {
			diffsList += '<tr>';
			diffsList += '<td><a href="https://fa.wikipedia.org/w/index.php?diff=' + bookmarks[i] + '">[[ویژه:تفاوت/' + bookmarks[i] + ']]</a></td>';
			diffsList += '<td><img src="https://upload.wikimedia.org/wikipedia/commons/d/d0/OOjs_UI_icon_clear-progressive.svg" class="unpickDiff" diff="' + bookmarks[i] + '"/></td>';
			diffsList += '</tr>';
		}

		diffsList += '</table>';
		this.content.$element.append(diffsList);
		this.$body.append( this.content.$element );
	};
	DiffPicker.prototype.getActionProcess = function ( action ) {
		var dialog = this;
		bookmarks = cookie.get('pickedDiffs');
		if (action == 'insert' && bookmarks.length > 0) {
			var out = '';
			if (DiffModule.getValue()) {
				out += '{{تفاوت‌ها|';
				for (var i in bookmarks) {
					out += bookmarks[i];
					if (i <= bookmarks.length - 2) {
						out += '|';
					}
				}
				out += '}}'
			} else {
				for (var i in bookmarks) {
					out += '[[ویژه:تفاوت/' + bookmarks[i] + ']]';
					if (i <= bookmarks.length - 3) {
						out += '، ';
					}
					if (i == bookmarks.length - 2) {
						out += ' و ';
					}
				}
			}

			insertAtCursor('#wpTextbox1', out);
			mw.notify('پیوندهای تفاوت در متن درج شدند.');

		} else if (action == 'clear') {
			cookie.set('pickedDiffs', []);
			counter();
			return new OO.ui.Process( function () {
				dialog.close( { action: action } );
			} );
		} else {
			return new OO.ui.Process( function () {
				dialog.close( { action: action } );
			} );
		}
		return DiffPicker.parent.prototype.getActionProcess.call( this, action );
	};


	function openDiffPicker() {
		var windowManager = new OO.ui.WindowManager();
		$( 'body' ).append( windowManager.$element );

		var dialog = new DiffPicker();
		windowManager.addWindows( [ dialog ] );
		windowManager.openWindow( dialog );
	}
}(jQuery, mediaWiki));