مدیاویکی:Gadget-AdsCleaner.js
نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
- فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلیدهای Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-R)
- گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-Shift-R)
- اینترنت اکسپلورر/ Edge: کلید Ctrl را نگهدارید و روی دکمهٔ Refresh کلیک کنید، یا کلیدهای Ctrl-F5 را با هم فشار دهید
- اپرا: Ctrl-F5 را بفشارید.
(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));