مدیاویکی:Tofawiki.js
نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاکسازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید ⇧ Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاکسازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکیپدیا:میانگیر مرورگرتان را خالی کنید را ببینید.
(function () {
'use strict';
// افزودن ابزار ترجمه
importScript('User:Ebrahim/ArticleTranslator.js');
var namespaceNumber = mw.config.get('wgNamespaceNumber');
var userName = mw.config.get('wgUserName'); // It's here for future use to prevent users' abuse
if (mw.config.get('wgAction') !== 'view' || // userName === '<The abusing user's name>' ||
[0, 4, 6, 10, 12, 14, 102, 828].indexOf(namespaceNumber) === -1) {
return;
}
var baseFaWikiUrl = 'https://fa.wikipedia.org';
if (mw.config.get('wgMFMode')) baseFaWikiUrl = 'https://fa.m.wikipedia.org';
var GENERAL_BOT = 'ویکیپدیا:درخواست ایجاد مقاله (رباتیک)';
var CITIES_BOT = 'ویکیپدیا:ویکیپروژه ایجاد مقالههای شهرها با ربات/درخواست ساخت رباتیک';
var PEOPLE_BOT = 'ویکیپدیا:درخواست ایجاد مقاله (رباتیک)/انسان';
var OTHER_REQUESTS = 'ویکیپدیا:مقالههای درخواستی';
var CATEGORIES_BOT = 'ویکیپدیا:درخواست ایجاد رده (رباتیک)';
var FAIRUSE_IMAGES = 'تصاویر استفادهٔ منصفانه';
var TEMPLATE_BOOK_TRANSLATOR = 'انتقالدهندهٔ الگو، پودمان و کتاب';
var DISAMBIGUATION_BOT = 'صفحهٔ ابهامزدایی';
var WIKIPEDIA_TRANSLATOR = 'مترجم فضای نام ویکیپدیا';
var requestingPages = {
'آرایههای زیستی، فیلم، موسیقی، رود، ساختمان و بازیهای ویدئویی': GENERAL_BOT,
'شهرها و مکانهای مسکونی': CITIES_BOT,
'انسان و اشخاص': PEOPLE_BOT,
'صفحهٔ ابهامزدایی': DISAMBIGUATION_BOT,
'مطالب عمومی': OTHER_REQUESTS,
'ردهها': CATEGORIES_BOT,
'تصاویر منصفانه': FAIRUSE_IMAGES,
'انتقالدهندهٔ الگو، پودمان و کتاب': TEMPLATE_BOOK_TRANSLATOR,
'فضای نام راهنما و ویکیپدیا': WIKIPEDIA_TRANSLATOR
};
function suggestRequestPlace() {
if (namespaceNumber === 0 && $([
'.infobox.geography',
'#catlinks a[href^="/wiki/Category:Rivers"]'
].join(', ')).length) {
return CITIES_BOT;
} else if (namespaceNumber === 0 && $([
'.infobox.biota',
'.infobox.haudio',
'.description a[href="/wiki/Single_(music)"]',
'#coordinates',
'.infobox.vcard .fn',
'#catlinks a[href^="/wiki/Category:Rivers"]',
'#catlinks a[href^="/wiki/Category:Songs"]',
'#catlinks a[href^="/wiki/Category:Films"]',
'#catlinks a[href$="films"]',
'#catlinks a[href*="video_games"], #catlinks a[href*="Video_game"]'
].join(', ')).length) {
return GENERAL_BOT;
} else if (namespaceNumber === 0 && $([
'#catlinks a[href^="/wiki/Category:All_article_disambiguation_pages"]',
'#catlinks a[href^="/wiki/Category:All_set_index_articles"]'
].join(', ')).length) {
return DISAMBIGUATION_BOT;
} else if (namespaceNumber === 0 && $([
'#catlinks a[href^="/wiki/Category:Island"]'
].join(', ')).length) {
return CITIES_BOT;
} else if ([4, 12].indexOf(namespaceNumber) !== -1) {
return WIKIPEDIA_TRANSLATOR;
} else if (namespaceNumber === 14) {
return CATEGORIES_BOT;
} else if ([10, 102, 828].indexOf(namespaceNumber) !== -1) {
return TEMPLATE_BOOK_TRANSLATOR;
} else if (namespaceNumber === 6) {
return FAIRUSE_IMAGES;
} else if (namespaceNumber === 0 && $([
'.infobox.vcard .fn',
'#catlinks a[href^="people"]',
'#catlinks a[href*="Ethnic_groups"]'
].join(', ')).length) {
return PEOPLE_BOT;
}
return OTHER_REQUESTS;
}
function pageExists(page) {
return new mw.Api({ ajax: { url: baseFaWikiUrl + '/w/api.php' } }).get({
action: 'query',
titles: page,
format: 'json',
origin: location.protocol + '//' + location.hostname
}).then(function (data) { return data.query.pages['-1'] === undefined; });
}
function isAllowedToUseTofawikiConsole() {
return new mw.Api({ ajax: { url: baseFaWikiUrl + '/w/api.php' } }).get({
action: 'query',
list: 'users',
ususers: mw.config.get('wgUserName'),
usprop: 'groups',
origin: location.protocol + '//' + location.hostname
}).then(function (res) {
return res.query.users[0].groups.some(function (x) {
return ['bot', 'autopatrolled', 'patroller', 'sysop', 'eliminator'].indexOf(x) !== -1;
});
});
}
function addNamespace(title) {
if (namespaceNumber === 14) { title = 'رده:' + title.replace(/^([Cc]ategory:|رده:)+/, ''); }
if (namespaceNumber === 10) { title = 'الگو:' + title.replace(/^([Tt]emplate:|الگو:)+/, ''); }
if (namespaceNumber === 102) { title = 'کتاب:' + title.replace(/^([Bb]ook:|کتاب:)+/, ''); }
if (namespaceNumber === 828) { title = 'پودمان:' + title.replace(/^([Mm]odule:|پودمان:)+/, ''); }
if (namespaceNumber === 6) { title = 'پرونده:' + title.replace(/^([Ff]ile:|پرونده:)+/, ''); }
if (namespaceNumber === 4) { title = 'ویکیپدیا:' + title.replace(/^([Ww]ikipedia:|ویکیپدیا:)+/, ''); }
if (namespaceNumber === 12) { title = 'راهنما:' + title.replace(/^([Hh]elp:|راهنما:)+/, ''); }
return title;
}
// Limiting oojs-ui windowing things to this place is intentional
// so that we can switch to something else easily later.
function showDialog(title, dialogContent, actions) {
function Dialog(config) {
Dialog.super.call(this, config);
}
OO.inheritClass(Dialog, OO.ui.ProcessDialog);
Dialog.static.name = 'dialog';
Dialog.static.title = title;
Dialog.static.actions = actions;
Dialog.prototype.initialize = function () {
Dialog.super.prototype.initialize.apply(this, arguments);
this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.content.$element.append(dialogContent);
this.$body.append(this.content.$element);
};
Dialog.prototype.getActionProcess = function (action) {
var dialog = this;
if (action) {
return new OO.ui.Process(function () {
actions.filter(function (x) {
return x.action === action;
})[0].onClose();
dialog.close({ action: action });
})
} else {
return Dialog.super.prototype.getActionProcess.call(this, action);
}
};
var windowManager = new OO.ui.WindowManager();
windowManager.$element.addClass('tofawiki-dialog');
mw.util.addCSS([
'.tofawiki-dialog * { font-family: system-ui!important; }',
// Needed in Mobile UI version of oojs dialog
'.tofawiki-dialog .oo-ui-processDialog-location { text-align: center!important; }'
].join('\n'));
$(document.body).append(windowManager.$element);
var dialog = new Dialog();
windowManager.addWindows([dialog]);
windowManager.openWindow(dialog);
}
var passedHtml = '<span style="color: #00af89; font-size: 140%">✓</span>';
var failedHtml = '<span style="color: #d33; font-size: 140%">✗</span>';
function validityCheck(dialogContent) {
$('.tofawiki-transliteration-success', dialogContent).hide();
var origValue = $('.tofawiki-name', dialogContent).val(), page = origValue;
if (page === '') { $('.tofawiki-status', dialogContent).html(''); return; }
page = addNamespace(page);
pageExists(page).then(function (exists) {
if ($('.tofawiki-name', dialogContent).val() !== origValue) { // that request is no longer relevant
return;
}
if (!exists) {
$('.tofawiki-status', dialogContent).empty().append(passedHtml + ' صفحهای با نام «' + page + '» ' +
'در ویکیپدیای فارسی موجود نیست پس روند ایجاد را ادامه میدهیم!');
} else {
$('.tofawiki-status', dialogContent).empty().append(failedHtml, ' عنوان «', $('<a>', {
target: '_blank',
href: baseFaWikiUrl + mw.util.getUrl(page),
text: page
}), '» در ویکیپدیای فارسی وجود دارد. مطمئن شوید که صفحهٔ تکراری نیست!');
if ($('.tofawiki-select', dialogContent).val() === DISAMBIGUATION_BOT) {
$('.tofawiki-status', dialogContent).append('<br><br>', $('<a>', {
text: 'برای افزودن (ابهامزدایی) بهعنوان کلیک کنید',
href: '#'
}).click(function (e) {
e.preventDefault();
$('.tofawiki-name', dialogContent).val($('.tofawiki-name', dialogContent).val() + ' (ابهامزدایی)');
validityCheck(dialogContent);
}));
}
}
});
}
function showTranslationDialog() {
mw.loader.load(baseFaWikiUrl + '/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persiantools.js&action=raw&ctype=text/javascript');
mw.loader.load(baseFaWikiUrl + '/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persianwikitools.js&action=raw&ctype=text/javascript');
mw.loader.load(baseFaWikiUrl + '/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-dictionary.js&action=raw&ctype=text/javascript');
var dialogContent = $('<div>', { dir: 'rtl' });
// var transliterationButton = namespaceNumber !== 0 ? '' : $('<span>', {
// class: 'tofawiki-transliteration-suggestion mw-ui-button mw-ui-progressive',
// style: 'font-size: 70%; min-height: initial',
// text: 'پیشنهاد',
// title: 'دریافت عنوان پیشنهادی از طریق نویسهگردانی رباتیک'
// }).click(function () {
// var button = $(this).prop('disabled', 'disabled').text('لطفاً منتظر بمانید…');
// $.get('https://rezabot.toolforge.org/TileTransliteration.php', {
// page: mw.config.get('wgTitle')
// }).then(function (response) {
// button.replaceWith($('<div>', {
// class: 'tofawiki-transliteration-success',
// style: 'font-size: 90%; color: #d33',
// text: 'نویسهگردانی عنوان با موفقیت وارد شد. احتمال خطا وجود دارد، لطفاً به دقت بازبینی کنید!'
// }));
// $('.tofawiki-name', dialogContent).val(response.result);
// }, function () {
// button.remove();
// mw.notify('درخواست نویسهگردانی موفق نبود');
// });
// });
var inputWidget = new OO.ui.TextInputWidget({ placeholder: 'عنوان' });
// TextInputWidget own event handling didn't look apealing
$('input', inputWidget.$element).on('input', function () { validityCheck(dialogContent); })
.css({ display: 'inline', width: '60%' }).prop('dir', 'rtl')
.addClass('tofawiki-name')
.on('paste', function (e) {
// https://stackoverflow.com/a/13895093
setTimeout(function () {
$(e.target).val(addNamespace($(e.target).val()));
}, 0);
});
$(inputWidget.$element).css({ display: 'inline', 'margin-right': 0 });
dialogContent.append([
$('<div>', {
style: 'font-size: 90%; float: left'
}).append(
$('<a>', {
class: 'tofawiki-consolelink',
html: 'ابزار ایجاد انبوه',
tabindex: '-1',
title: 'ابزار ایجاد انبوه',
target: '_blank',
href: baseFaWikiUrl + mw.util.getUrl('ویژه:صفحهٔ_خالی/tofawiki-conosle') + '?withJS=MediaWiki:TofawikiConsole.js'
}).hide()
),
$('<br>').css('clear', 'both'),
$('<div>').append([
$('<a>', {
text: 'راهنما',
tabindex: '-1',
title: 'راهنمای کار با ابزار',
target: '_blank',
style: 'float: left; font-size: smaller;',
href: baseFaWikiUrl + mw.util.getUrl('راهنما:ابزار/به_ویکیفا')
}),
$('<select>', {
class: 'tofawiki-select',
style: 'font-family: inherit'
}).append(
$.map(requestingPages, function (item, description) {
var disabled =
namespaceNumber === 14 && item !== CATEGORIES_BOT ||
namespaceNumber === 0 && item === CATEGORIES_BOT ||
[4, 12].indexOf(namespaceNumber) !== -1 && item !== WIKIPEDIA_TRANSLATOR ||
namespaceNumber === 0 && item === WIKIPEDIA_TRANSLATOR ||
namespaceNumber === 6 && item !== FAIRUSE_IMAGES ||
namespaceNumber === 0 && item === FAIRUSE_IMAGES ||
[10, 102, 828].indexOf(namespaceNumber) !== -1 && item !== TEMPLATE_BOOK_TRANSLATOR ||
namespaceNumber === 0 && item === TEMPLATE_BOOK_TRANSLATOR;
return $('<option>', { value: item, text: description, disabled: disabled });
})
)
]),
$('<div>').css('margin-top', '0.4em').append([
inputWidget.$element,
' ',
$('<img>', {
src: '//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png',
style: 'vertical-align: middle',
click: function () {
$('.tofawiki-name', dialogContent).val(persianWikiTools.superToolMove(
$('.tofawiki-name', dialogContent).val()
));
}
}),
// ' ',
// transliterationButton
]),
$('<div>', {
class: 'tofawiki-status',
html: '<br><br>'
})
]);
$('.tofawiki-select', dialogContent).val(suggestRequestPlace());
var suggestedTitle = [10, 828, 6].indexOf(namespaceNumber) !== -1 ? mw.config.get('wgTitle') : '';
$('.tofawiki-name', dialogContent).val(addNamespace(suggestedTitle));
if (suggestedTitle !== '') validityCheck(dialogContent);
showDialog('ایجاد در ویکیپدیای فارسی', dialogContent, [{
action: 'cx',
label: 'ایجاد به کمک ترجمهٔ محتوا',
onClose: function () {
window.open(new mw.Uri(baseFaWikiUrl + '/w/index.php').extend({
title: 'Special:CX',
page: mw.config.get('wgPageName'),
from: 'en',
to: 'fa',
targettitle: $('.tofawiki-name', dialogContent).val().replace(/_/g, '+').replace(/ي/g, 'ی').replace(/ك/g, 'ک'),
withJS: 'MediaWiki:EnableCX.js'
}));
}
}, {
action: 'tofawiki',
label: namespaceNumber === 6 ? 'بارگذاری' : 'ایجاد به کمک ابزار توفاویکی',
onClose: function () {
var faName = $('.tofawiki-name', dialogContent).val().replace(/ي/g, 'ی').replace(/ك/g, 'ک');
var requestingPage = $('.tofawiki-select', dialogContent).val();
if (!faName || !requestingPage) {
$('.tofawiki-status', dialogContent).text('ابتدا نامی وارد کنید!');
return;
}
if (requestingPage === FAIRUSE_IMAGES) {
window.open(new mw.Uri(baseFaWikiUrl + '/w/index.php').extend({
title: 'ویژه:بارگذاری_پرونده',
wpDestFile: faName.replace(/^پرونده:/, ''),
enName: mw.config.get('wgRelevantPageName'),
withJS: 'MediaWiki:TofawikiUpload.js',
wpUploadDescription: '----'
}));
} else {
window.open(new mw.Uri(baseFaWikiUrl + '/w/index.php').extend({
title: addNamespace(faName),
enName: mw.config.get('wgRelevantPageName'),
enOldid: mw.config.get('wgRevisionId'),
redlink: 1,
action: 'edit',
withJS: 'MediaWiki:TofawikiHelper.js',
requestingPage: requestingPage,
editintro: 'الگو:به ویکیفا/ادیتنوتیس'
}));
}
}
}, {
label: 'بستن',
flags: 'safe'
}].filter(function (x) {
// Enable CX only for the main namespace
return x.action !== 'cx' || namespaceNumber === 0;
}));
isAllowedToUseTofawikiConsole().then(function (allowed) {
if (allowed) {
$('.tofawiki-consolelink', dialogContent).show();
}
});
}
$(function () {
if ($('.interlanguage-link.interwiki-fa').length !== 0) { return; }
// if is commons image, give up
if ($('#ca-view-foreign').length !== 0) { return; }
$('#ca-tofawiki, #page-actions-tofawiki').remove();
if ($('#mw-imagepage-nofile, #noarticletext').length !== 0) {
return;
}
// if it is a free image, bring TransferToCommons instead
if (namespaceNumber === 6 && $([
'#catlinks a[href="/wiki/Category:GFDL_files"]',
'#catlinks a[href^="/wiki/Category:Creative_Commons_Attribution"]',
'#catlinks a[href="/wiki/Category:Move_to_Commons_Priority_Candidates"]',
'#catlinks a[href="/wiki/Category:Convert_to_SVG_and_copy_to_Wikimedia_Commons"]',
'#catlinks a[href^="/wiki/Category:Copy_to_Wikimedia_Commons"]'
].join(', ')).length && $(
'#catlinks a[href^="/wiki/Category:Wikipedia_files_not_suitable_for_Commons"]'
).length === 0) {
$(mw.util.addPortletLink(
'p-views',
new mw.Uri('//commonshelper.toolforge.org/').extend({
lang: mw.config.get('wgContentLanguage'),
image: mw.config.get('wgTitle'),
interface: mw.config.get('wgContentLanguage')
}),
'انتقال به ویکیانبار'
)).addClass('vector-tab-noicon').find('a').prop('target', '_blank').prepend($('<img>', {
src: '//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/14px-Commons-logo.svg.png'
}), ' ');
return;
}
var link;
if (mw.config.get('wgMFMode')) {
link = mw.util.addPortletLink('p-tb', '#', 'tofawiki!', 'ca-tofawiki');
} else {
link = mw.util.addPortletLink(
$('#p-views').length !== 0 ? 'p-views' : 'p-cactions', '#',
'tofawiki!', 'ca-tofawiki', null, null, '#ca-view'
);
}
$(link).addClass('vector-tab-noicon').click(function (e) {
e.preventDefault();
mw.loader.using(['oojs-ui']).then(showTranslationDialog);
});
});
// // translate the section part
// function createTranslateLink(sectionId, placeToPutAfter) {
// return $('<span>').append([
// $('<a>', {
// text: 'translate',
// title: 'Translate the section from English to Persian, provided by Targoman',
// href: '#'
// }).click(function (e) {
// e.preventDefault();
// var translateButtonLink = $(e.target);
// if (translateButtonLink.css('color') === 'lightgray') return;
// translateButtonLink.css('color', 'lightgray');
// $.get('https://rezabot.toolforge.org/targoman3.php', {
// title: mw.config.get('wgPageName'),
// subsection: sectionId
// }).then(function (result) {
// translateButtonLink.css('color', '');
// $(placeToPutAfter).after($('<div>', {
// contenteditable: 'true',
// spellcheck: 'true',
// lang: 'fa',
// dir: 'rtl',
// text: result.translation
// }).css({
// 'white-space': 'pre-wrap',
// 'font-family': 'system-ui',
// border: '2px solid #54595d',
// padding: '1em',
// 'background-color': '#f0f0f0',
// 'margin-bottom': '8px',
// 'border-radius': '15px'
// }))
// }).catch(function (e) {
// console.error(e);
// mw.notify(JSON.stringify(e));
// });
// })
// ].concat($('.interlanguage-link.interwiki-fa').length ? [
// '/',
// $('<a>', {
// text: 'transfer',
// title: 'Transfer the section to Persian Wikipedia',
// target: '_blank',
// href: new mw.Uri($('.interlanguage-link.interwiki-fa a')[0].href).extend({
// action: 'edit',
// editintro: 'Template:Null',
// enTitle: mw.config.get('wgPageName'),
// enSectionId: sectionId,
// withJS: 'MediaWiki:TofawikiSection.js'
// })
// })
// ] : []));
// }
// $(function () {
// if ([0, 4].indexOf(namespaceNumber) === -1) return;
// $('.mw-editsection a').get().forEach(function (editLink) {
// var sectionId = new mw.Uri(editLink.href).query.section;
// // don't interfere with MediaWiki:Gadget-edittop.js
// if (!sectionId) return;
// if (mw.config.get('wgMFMode')) {
// $('.mw-headline', editLink.parentElement.parentElement).append([
// ' ',
// createTranslateLink(
// sectionId,
// editLink.parentElement.parentElement
// ).css('font-size', '50%')
// ]);
// } else {
// $(editLink).after([
// ' | ',
// createTranslateLink(
// sectionId,
// editLink.parentElement.parentElement
// )
// ]);
// }
// });
// // first section
// $('h1.firstHeading:first').append($('<span>', {
// class: 'noprint'
// }).css({
// 'user-select': 'none',
// 'font-size': '40%',
// 'margin-left': '2em'
// }).append(
// $('<span>', { contenteditable: true }),
// ' ',
// createTranslateLink(0, $('#content h1')).prepend('(').append(')')
// ));
// });
$(function () {
// improvements when tofawiki is in translation
if (window.self === window.top || location.hash !== '#tofawikiframe') {
return;
}
mw.util.addCSS('.translatorBar, header { display: none!important; }');
$('#mw-page-base, #mw-head-base, #mw-navigation, #siteSub, #footer, .read-more-container').remove();
$('#firstHeading').each(function () { this.firstChild.remove(); });
$('#content').css('margin-left', 0).css('margin-right', 0).css('padding-top', 0);
importStylesheet('MediaWiki:Print.css');
// quick specialized links translator
var links = {};
document.querySelectorAll('#bodyContent a').forEach(function (x) {
var href = x.getAttribute('href');
if (!href || href.indexOf('/wiki/') === -1) return;
var title = decodeURIComponent(href.replace(/.*?\/wiki\//, ''))
.replace(/_/g, ' ').replace(/#.*$/g, '');
if (title) {
if (!links[title]) links[title] = [];
links[title].push(x);
}
});
$('#bodyContent').after($('<textarea id="linkstranslator-link-textarea">').css({
// http://stackoverflow.com/a/30810322
position: 'fixed', top: 0, right: '-2em', width: '2em', height: '2em',
padding: 0, border: 'none', outline: 'none', boxShadow: 'none',
background: 'transparent'
}));
$.post('https://tofawiki-linkstranslator.wmcloud.org/', {
from: 'en',
to: 'fa',
p: Object.keys(links).join('|')
}).then(function (result) {
Object.keys(links).forEach(function (entry) {
var translation = result[entry];
if (translation === undefined) return;
links[entry].forEach(function (link) {
$(link).after($('<span>').append('(', !navigator.clipboard ? '' : $('<a>', {
href: '#',
style: 'font-size: 140%; font-weight: normal; line-height: 0;',
title: 'Copy to clipboard',
text: '⎘',
click: function (e) {
// TODO: Maybe some communication with the parent frame and put it there directly?
e.preventDefault();
$('#linkstranslator-link-textarea').val('[[' + translation + ']]')[0].select();
try {
document.execCommand('copy');
e.target.animate && e.target.animate([
{ fontSize: '140%' }, { fontSize: '100%' }
], { duration: 220, iterations: 1 });
} catch (e) {}
}
}), ' ', $('<bdi>').append($('<a>', {
lang: 'fa',
href: baseFaWikiUrl + mw.util.getUrl(translation),
text: translation
})), ')'));
});
})
});
});
}());