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

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

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

(function ($, mw) {
	'use strict';
	var links = [];
	function loadPage(title, callback) {
		new mw.Api().get({
			action: 'query',
			prop: 'revisions',
			titles: title,
			rvprop: 'content',
			format: 'json'
		}).done(function (data) {
			callback($.map(data.query.pages, function (value) { return value; })[0].revisions[0]['*']);
		});
	}
	function savePage(title, text, summary, callback) {
		new mw.Api().post({
			action: 'edit',
			title: title,
			text: text,
			summary: summary,
			nocreate: '',
			minor: '',
			token: mw.user.tokens.get('csrfToken')
		}).done(function (data) {
			if (data.error && data.error.info) {
				alert(data.error.info);
			} else {
				callback();
			}
		}).fail(function (data) {
			alert(data);
		});
	}
	function clean(text, urls){
		var implode = [];
		for (var i in urls) {
			implode.push(urls[i]);
			implode.push('www.' + urls[i]);
		}
		implode = implode.join("|");
		implode = implode.replace(new RegExp('\\.', 'g'), "\\.");

		var patterns = {
			'\\<ref.+?\\>.+?({URL}).+?\\<\\/ref\\>': "",
			'\\<ref.+?({URL}).+?\\<\\/ref\\>': "",
			'(\\*|\\#).*({URL}).*\\s*\\]*': "",
			'\\[.+?({URL})\\S.+?\\s(.+?)\\]': "$2",
			'\\[.+?({URL})\\s(.+?)\\]': "$2",
			'(http)s?:\\/\\/({URL})\\S+\\s': "",
			'(http)s?:\\/\\/({URL})': ""
		};
		for (var reg in patterns) {
			var replacement = patterns[reg];
			reg = reg.replace('{URL}', implode);
			text = text.replace(new RegExp(reg, 'gi'), replacement);
		}
		return text;
	}
	function urls(text){
		var urls = text.match(/http(?:s)?:\/\/(?:[\w-]+\.)*([\w-]{1,63})(?:\.(?:\w{3}|\w{2}))/gi);
		var unq = [];
		for (var i in urls) {
			urls[i] = urls[i].replace(/\/www\./, '/');
			urls[i] = urls[i].replace(/^https?:\/\//i, '');
			if (unq.indexOf(urls[i]) === -1) {
				unq.push(urls[i]);
			}
		}
		return unq;
	}

	function loadSavePageRefresh(replaceCallback, summary) {
		loadPage(mw.config.get('wgPageName'), function (text) {
			savePage(mw.config.get('wgPageName'), replaceCallback(text), summary, function () {
				mw.notify('حذف پیوندهای تبلیغی با موفقیت انجام شد.');
				// Loading diff page
				var uri = new mw.Uri();
				uri.query = {
					'title': mw.config.get('wgPageName'),
					'diff': 'cur',
					'oldid': 'prev'
				};
				uri.path = mw.config.get('wgScriptPath') + '/index.php';
				window.location = uri.toString();
			});
		});
	}
	if (mw.config.get('wgAction') === 'view' && mw.config.get('wgIsArticle')) {
		$(function () {
			$(mw.util.addPortletLink('p-cactions', '#', 'تبلیغ‌زدا', 'ca-adcleaner'))
				.click(function () {
					openAdsCleaner();
				});
		});
	}


	var multiselectInput = {};

	function AdsCleaner( config ) {
		AdsCleaner.parent.call( this, config );
	}
	OO.inheritClass( AdsCleaner, OO.ui.ProcessDialog );

	AdsCleaner.static.name = 'AdsCleaner';
	AdsCleaner.static.title = 'حذف پیوندهای تبلیغی / نامعتبر';
	AdsCleaner.static.actions = [
		{ action: 'remove', label: 'حذف', flags: 'primary' },
		{ action: 'cancel', label: 'انصراف', flags: 'safe' }
	];

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



		multiselectInput = new OO.ui.CheckboxMultiselectInputWidget( {
			options: links
		} );

		this.content.$element.append( '<div style="text-align: center; color: red;">هشدار: پیوند‌هایی که تیک بزنید به هر شکلی اعم از پیوند یا یادکرد از مقاله زدوده خواهد شد.<div>' );
		this.content.$element.append( multiselectInput.$element );
		this.$body.append( this.content.$element );
	};
	AdsCleaner.prototype.getActionProcess = function ( action ) {
		var dialog = this;
		if ( action == 'remove') {
			var checked = multiselectInput.getValue();
			if (checked.length < 1) {
				return new OO.ui.Process( function () {
					mw.notify('ناموفق: هیچ پیوندی گزیده نشد.');
					dialog.close( { action: action } );
				} );
			}
			loadPage(mw.config.get('wgPageName'), function (text) {
				var newText = clean(text, checked);
				loadSavePageRefresh(
					function () {
						return newText;
					},
					'ویرایش با [[ویکی‌پدیا:ابزار زدودن تبلیغ|ابزار زدودن تبلیغ]]'
				);
			});

		} else {
			return new OO.ui.Process( function () {
				dialog.close( { action: action } );
			} );
		}
		return AdsCleaner.parent.prototype.getActionProcess.call( this, action );
	};


	function openAdsCleaner() {
		loadPage(mw.config.get('wgPageName'), function (text) {
			var linksArray = urls(text);
			links = [];
			for (var i in linksArray) {
				links.push({data: linksArray[i], label: linksArray[i]})
			}

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

			var dialog = new AdsCleaner();
			windowManager.addWindows( [ dialog ] );
			windowManager.openWindow( dialog );
		});

	}
}(jQuery, mediaWiki));