مدیاویکی:Gadget-friendlytag-2020.js
پرش به ناوبری
پرش به جستجو
نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
- فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلیدهای Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-R)
- گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-Shift-R)
- اینترنت اکسپلورر/ Edge: کلید Ctrl را نگهدارید و روی دکمهٔ Refresh کلیک کنید، یا کلیدهای Ctrl-F5 را با هم فشار دهید
- اپرا: Ctrl-F5 را بفشارید.
// <nowiki>
(function($) {
/*
****************************************
*** friendlytag.js: Tag module
****************************************
* Mode of invocation: Tab ("Tag")
* Active on: Existing articles and drafts; file pages with a corresponding file
* which is local (not on Commons); all redirects
*/
Twinkle.tag = function friendlytag() {
// redirect tagging
if (Morebits.wiki.isPageRedirect()) {
Twinkle.tag.mode = 'redirect';
Twinkle.addPortletLink(Twinkle.tag.callback, 'برچسب', 'friendly-tag', 'تغییرمسیر برچسب'); // localized
// file tagging
} else if (mw.config.get('wgNamespaceNumber') === 6 && !document.getElementById('mw-sharedupload') && document.getElementById('mw-imagepage-section-filehistory')) {
Twinkle.tag.mode = 'file';
Twinkle.addPortletLink(Twinkle.tag.callback, 'برچسب', 'friendly-tag', 'زدن برچسبهای نگهداری به پرونده'); // localized
// article/draft article tagging
} else if ([0, 118].indexOf(mw.config.get('wgNamespaceNumber')) !== -1 && mw.config.get('wgCurRevisionId')) {
Twinkle.tag.mode = 'article';
// Can't remove tags when not viewing current version
Twinkle.tag.canRemove = (mw.config.get('wgCurRevisionId') === mw.config.get('wgRevisionId')) &&
// Disabled on latest diff because the diff slider could be used to slide
// away from the latest diff without causing the script to reload
!mw.config.get('wgDiffNewId');
Twinkle.addPortletLink(Twinkle.tag.callback, 'برچسب', 'friendly-tag', 'افزودن یا حذف برچسبهای نگهداری مقاله'); // localized
}
};
Twinkle.tag.checkedTags = [];
Twinkle.tag.callback = function friendlytagCallback() {
var Window = new Morebits.simpleWindow(630, Twinkle.tag.mode === 'article' ? 500 : 400);
Window.setScriptName('Twinkle');
// anyone got a good policy/guideline/info page/instructional page link??
Window.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#tag');
var form = new Morebits.quickForm(Twinkle.tag.callback.evaluate);
form.append({
type: 'input',
label: 'پالایش سریع: ', // localized
name: 'quickfilter',
size: '30px',
event: function twinkletagquickfilter() {
// flush the DOM of all existing underline spans
$allCheckboxDivs.find('.search-hit').each(function(i, e) {
var label_element = e.parentElement;
// This would convert <label>Hello <span class=search-hit>wo</span>rld</label>
// to <label>Hello world</label>
label_element.innerHTML = label_element.textContent;
});
if (this.value) {
$allCheckboxDivs.hide();
$allHeaders.hide();
var searchString = this.value;
var searchRegex = new RegExp(mw.util.escapeRegExp(searchString), 'i');
$allCheckboxDivs.find('label').each(function () {
var label_text = this.textContent;
var searchHit = searchRegex.exec(label_text);
if (searchHit) {
var range = document.createRange();
var textnode = this.childNodes[0];
range.selectNodeContents(textnode);
range.setStart(textnode, searchHit.index);
range.setEnd(textnode, searchHit.index + searchString.length);
var underline_span = $('<span>').addClass('search-hit').css('text-decoration', 'underline')[0];
range.surroundContents(underline_span);
this.parentElement.style.display = 'block'; // show
}
});
} else {
$allCheckboxDivs.show();
$allHeaders.show();
}
}
});
switch (Twinkle.tag.mode) {
case 'article':
Window.setTitle('افزودن برچسبهای نگهداری مقاله');
form.append({
type: 'select',
name: 'sortorder',
label: 'مشاهده این فهرست:', // localized
tooltip: 'میتوانید ترتیب پیشفرض نمایش را در ترجیحات توینکل خود تغییر دهید (وپ:توینکل تر).', // localized
event: Twinkle.tag.updateSortOrder,
list: [
{ type: 'option', value: 'cat', label: 'بر پایه رده', selected: Twinkle.getPref('tagArticleSortOrder') === 'cat' }, // localized
{ type: 'option', value: 'alpha', label: 'بهترتیب الفبا', selected: Twinkle.getPref('tagArticleSortOrder') === 'alpha' } // localized
]
});
if (!Twinkle.tag.canRemove) {
var divElement = document.createElement('div');
divElement.innerHTML = 'برای حذف برچسبهای موجود، لطفاً منوی برچسب را از نسخهٔ کنونی مقاله باز کنید'; // localized
form.append({
type: 'div',
name: 'untagnotice',
label: divElement
});
}
form.append({
type: 'div',
id: 'tagWorkArea',
className: 'morebits-scrollbox',
style: 'max-height: 28em'
});
form.append({
type: 'checkbox',
list: [
{
label: 'گروهبندی برچسبها در {{مشکلات متعدد}}، در صورت امکان', // localized
value: 'group',
name: 'group',
tooltip: 'در صورتی که در حال افزودن دو یا چند الگویی که توسط {{مشکلات متعدد}} پشتیبانی میشوند هستید و این گزینه نیز انتخاب شدهاست، تمامی الگوهای پشتیبانیشده در درون الگوی {{مشکلات متعدد}} گروهبندی خواهند شد.', // localized
checked: Twinkle.getPref('groupByDefault')
}
]
});
form.append({
type: 'input',
label: 'دلیل',
name: 'reason',
tooltip: 'دلیل اختیاری برای پیوستشدن به خلاصه ویرایش. ذکر دلیل بههنگام حذف برچسبها توصیه میشود.', // localized
size: '60px'
});
break;
case 'file':
Window.setTitle('افزودن برچسبهای نگهداری پرونده');
form.append({ type: 'header', label: 'برچسبهای مشکلات مجوز و منبعدهی' }); // localized
form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.licenseList });
form.append({ type: 'header', label: 'برچسبهای مرتبط با ویکیانبار' }); // localized
form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.commonsList });
form.append({ type: 'header', label: 'برچسبهای تمیزکاری' }); // localized
form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.cleanupList });
form.append({ type: 'header', label: 'برچسبهای کیفیت تصویر' }); // localized
form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.qualityList });
form.append({ type: 'header', label: 'برچسبهای جایگزینی' }); // localized
form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.replacementList });
if (Twinkle.getPref('customFileTagList').length) {
form.append({ type: 'header', label: 'برچسبهای سفارشی' }); // localized
form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.getPref('customFileTagList') });
}
break;
case 'redirect':
Window.setTitle('افزودن برچسب های تغییرمسیر');
form.append({ type: 'header', label: 'الگوهای تلفظ، تلفظ اشتباه و زمان افعال' });
form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.spellingList });
form.append({ type: 'header', label: 'الگوهای نام جایگزین' }); // localized
form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.alternativeList });
form.append({ type: 'header', label: 'الگوهای تغییرمسیر گوناگون و مدیریتی' }); // localized
form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.administrativeList });
if (Twinkle.getPref('customRedirectTagList').length) {
form.append({ type: 'header', label: 'برچسبهای سفارشی' }); // localized
form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.getPref('customRedirectTagList') });
}
break;
default:
alert('Twinkle.tag: unknown mode ' + Twinkle.tag.mode);
break;
}
if (document.getElementsByClassName('patrollink').length) {
form.append({
type: 'checkbox',
list: [
{
label: 'علامت زدن صفحه بهعنوان گشتخورده/بازبینیشده', // localized
value: 'patrolPage',
name: 'patrolPage',
checked: Twinkle.getPref('markTaggedPagesAsPatrolled')
}
]
});
}
form.append({ type: 'submit', className: 'tw-tag-submit' });
var result = form.render();
Window.setContent(result);
Window.display();
// for quick filter:
$allCheckboxDivs = $(result).find('[name$=Tags]').parent();
$allHeaders = $(result).find('h5');
result.quickfilter.focus(); // place cursor in the quick filter field as soon as window is opened
result.quickfilter.autocomplete = 'off'; // disable browser suggestions
result.quickfilter.addEventListener('keypress', function(e) {
if (e.keyCode === 13) { // prevent enter key from accidentally submitting the form
e.preventDefault();
return false;
}
});
if (Twinkle.tag.mode === 'article') {
Twinkle.tag.alreadyPresentTags = [];
if (Twinkle.tag.canRemove) {
// Look for existing maintenance tags in the lead section and put them in array
// All tags are HTML table elements that are direct children of .mw-parser-output,
// except when they are within {{multiple issues}}
$('.mw-parser-output').children().each(function parsehtml(i, e) {
// break out on encountering the first heading, which means we are no
// longer in the lead section
if (e.tagName === 'H2') {
return false;
}
// The ability to remove tags depends on the template's {{ambox}} |name=
// parameter bearing the template's correct name (preferably) or a name that at
// least redirects to the actual name
// All tags have their first class name as "box-" + template name
if (e.className.indexOf('box-') === 0) {
if (e.classList[0] === 'box-Multiple_issues') {
$(e).find('.ambox').each(function(idx, e) {
var tag = e.classList[0].slice(4).replace(/_/g, ' ');
Twinkle.tag.alreadyPresentTags.push(tag);
});
return true; // continue
}
var tag = e.classList[0].slice(4).replace(/_/g, ' ');
Twinkle.tag.alreadyPresentTags.push(tag);
}
});
// {{Uncategorized}} and {{Improve categories}} are usually placed at the end
if ($('.box-Uncategorized').length) {
Twinkle.tag.alreadyPresentTags.push('Uncategorized');
}
if ($('.box-Improve_categories').length) {
Twinkle.tag.alreadyPresentTags.push('Improve categories');
}
}
// Add status text node after Submit button
var statusNode = document.createElement('small');
statusNode.id = 'tw-tag-status';
Twinkle.tag.status = {
// initial state; defined like this because these need to be available for reference
// in the click event handler
numAdded: 0,
numRemoved: 0
};
$('button.tw-tag-submit').after(statusNode);
// fake a change event on the sort dropdown, to initialize the tag list
var evt = document.createEvent('Event');
evt.initEvent('change', true, true);
result.sortorder.dispatchEvent(evt);
} else {
// Redirects and files: Add a link to each template's description page
Morebits.quickForm.getElements(result, Twinkle.tag.mode + 'Tags').forEach(generateLinks);
}
};
// $allCheckboxDivs and $allHeaders are defined globally, rather than in the
// quickfilter event function, to avoid having to recompute them on every keydown
var $allCheckboxDivs, $allHeaders;
Twinkle.tag.updateSortOrder = function(e) {
var form = e.target.form;
var sortorder = e.target.value;
Twinkle.tag.checkedTags = form.getChecked('articleTags') || [];
var container = new Morebits.quickForm.element({ type: 'fragment' });
// function to generate a checkbox, with appropriate subgroup if needed
var makeCheckbox = function(tag, description) {
var checkbox = { value: tag, label: '{{' + tag + '}}: ' + description };
if (Twinkle.tag.checkedTags.indexOf(tag) !== -1) {
checkbox.checked = true;
}
switch (tag) {
case 'Cleanup':
checkbox.subgroup = {
name: 'cleanup',
type: 'input',
label: 'دلیل مشخص برای اینکه چرا به تمیزکاری نیاز است: ', // localized
tooltip: 'الزامی.', // localized
size: 35
};
break;
case 'Close paraphrasing':
checkbox.subgroup = {
name: 'closeParaphrasing',
type: 'input',
label: 'منبع: ', // localized
tooltip: 'منبعی که بهطور نزدیک بازنویسی شدهاست' // localized
};
break;
case 'Copy edit':
checkbox.subgroup = {
name: 'copyEdit',
type: 'input',
label: '"این مقاله ممکن است نیازمند ویرایستاری باشد..." ', // localized
tooltip: 'بهعنوان مثال، "املای یکپارچه". انتخابی.', // localized
size: 35
};
break;
case 'Copypaste':
checkbox.subgroup = {
name: 'copypaste',
type: 'input',
label: 'نشانی منبع: ', // localized
tooltip: 'اگر مشخص است.', // localized
size: 50
};
break;
case 'Expand language':
checkbox.subgroup = [ {
name: 'expandLanguageLangCode',
type: 'input',
label: 'شناسه زبان: ', // localized
tooltip: 'شناسهٔ زبانی که مقاله باید از روی آن گسترش دادهشود' // localized
}, {
name: 'expandLanguageArticle',
type: 'input',
label: 'عنوان مقاله: ', // localized
tooltip: 'عنوان مقالهای که گسترش از روی آن انجام میشود، بدون پیشوند میانویکی' // localized
}
];
break;
case 'Expert needed':
checkbox.subgroup = [
{
name: 'expertNeeded',
type: 'input',
label: 'عنوان ویکیپروژهٔ مرتبط: ', // localized
tooltip: 'بهطور انتخابی، نام ویکیپروژهای که میتواند به جذب یک کاربر باتجربه کمک کند را وارد کنید. بدون پیشوند «ویکیپروژه».' // localized
},
{
name: 'expertNeededReason',
type: 'input',
label: 'دلیل: ', // localized
tooltip: 'توضیح کوتاه برای توصیف مشکل. پیوند به دلیل یا بحث الزامی است.' // localized
},
{
name: 'expertNeededTalk',
type: 'input',
label: 'ریسهٔ بحث: ', // localized
tooltip: 'عنوان بخشی از صفحهٔ بحث این مقاله که بحث دربارهٔ مشکل در آن جریان دارد. نیاز به درج پیوند نیست، تنها عنوان بخش را وارد کنید. پیوند به دلیل یا بحث الزامی است.' // localized
}
];
break;
case 'Globalize':
checkbox.subgroup = {
name: 'globalizeRegion',
type: 'input',
label: 'منطقه یا کشورِ بیش از اندازه معرفیشده' // localized
};
break;
case 'History merge':
checkbox.subgroup = [
{
name: 'histmergeOriginalPage',
type: 'input',
label: 'مقالهٔ دیگر: ', // localized
tooltip: 'عنوان صفحهای که میتواند در این مقاله ادغام شود (الزامی).' // localized
},
{
name: 'histmergeReason',
type: 'input',
label: 'دلیل: ', // localized
tooltip: 'توضیح کوتاه که دلیل نیاز به ادغام تاریخچه را بیان کند. بهتر است با عبارت «زیرا» آغاز شده و با یک نقطه پایان یابد.' // localized
},
{
name: 'histmergeSysopDetails',
type: 'input',
label: 'جزئیات بیشتر: ', // localized
tooltip: 'برای موارد پیچیده، راهنماییهای بیشتری را در اختیار مدیر بررسیکننده قرار دهید.' // localized
}
];
break;
case 'Merge':
case 'Merge from':
case 'Merge to':
var otherTagName = 'Merge';
switch (tag) {
case 'Merge from':
otherTagName = 'Merge to';
break;
case 'Merge to':
otherTagName = 'Merge from';
break;
// no default
}
checkbox.subgroup = [
{
name: 'mergeTarget',
type: 'input',
label: 'مقاله(های) دیگر: ', // localized
tooltip: 'اگر قصد دارید مقالههای متعدد را مشخص کنید، آنها را با نویسهٔ لوله از هم جدا کنید: مقالهٔ اول|مقالهٔ دوم' // localized
},
{
name: 'mergeTagOther',
type: 'checkbox',
list: [
{
label: 'مقالهٔ دیگر را با یک برچسب {{' + otherTagName + '}} مشخص کنید', // localized
checked: true,
tooltip: 'فقط در صورتی که تنها عنوان یک مقاله وارد شدهباشد، در دسترس است.' // localized
}
]
}
];
if (mw.config.get('wgNamespaceNumber') === 0) {
checkbox.subgroup.push({
name: 'mergeReason',
type: 'textarea',
label: 'دلیل اصلی برای ادغام (بر روی صفحهٔ بحث' +
(tag === 'Merge to' ? 'the other article\'s' : 'this article\'s') + ' قرار خواهد گرفت):', // localized
tooltip: 'انتخابی، اما بهشدت توصیهشده. در صورت عدم تمایل، خالی بگذارید. فقط در صورتی که تنها عنوان یک مقاله وارد شدهباشد، در دسترس است.' // localized
});
}
break;
case 'Not English':
case 'Rough translation':
checkbox.subgroup = [
{
name: 'translationLanguage',
type: 'input',
label: 'زبان مقاله (اگر مشخص است): ', // localized
tooltip: 'برای راهنمایی، مرور [[en:WP:LRC]] را در نظر داشتهباشید. اگر مقاله را در صفحهٔ مقالههای نیازمند ترجمه فهرست میکنید، لطفاً از خالیگذاشتن این جعبه خودداری کنید؛ مگر آنکه کاملاً نامطمؤن باشید.' // localized
}
];
if (tag === 'Not English') {
checkbox.subgroup.push({
name: 'translationNotify',
type: 'checkbox',
list: [
{
label: 'اطلاعرسانی به سازندهٔ مقاله', // localized
checked: true,
tooltip: "الگوی {{uw-notenglish}} را در صفحهٔ بحث سازندهٔ مقاله قرار میدهد." // localized
}
]
});
}
if (mw.config.get('wgNamespaceNumber') === 0) {
checkbox.subgroup.push({
name: 'translationPostAtPNT',
type: 'checkbox',
list: [
{
label: 'فهرستکردن این مقاله در ویکیپدیا:صفحههای نیازمند ترجمه به فارسی (PNT)', // localized
checked: true
}
]
});
checkbox.subgroup.push({
name: 'translationComments',
type: 'textarea',
label: 'توضیح بیشتر برای ارسال به ویکیپدیا:صفحههای نیازمند ترجمه به فارسی', // localized
tooltip: 'انتخابی، و متناسب تنها در صورتی که "فهرستکردن این مقاله..." در بالا انتخاب شدهباشد.' // localized
});
}
break;
case 'Notability':
checkbox.subgroup = {
name: 'notability',
type: 'select',
list: [
{ label: "{{سرشناسی}}: موضوع مقاله ممکن است رهنمود اصلی سرشناسی را احراز نکند", value: 'none' }, // localized
{ label: '{{سرشناسی|دانشگاهیان}}: رهنمود سرشناسی دانشگاهیان', value: 'Academics' }, // localized
{ label: '{{سرشناسی|اجرام آسمانی}}: رهنمود سرشناسی اجرام آسمانی', value: 'Astro' }, // localized
{ label: '{{سرشناسی|افراد}}: رهنمود سرشناسی زندگینامه افراد', value: 'Biographies' }, // localized
{ label: '{{سرشناسی|کتابها}}: رهنمود سرشناسی کتاب', value: 'Books' }, // localized
{ label: '{{سرشناسی|سازمانها}}: رهنمودهای سرشناسی شرکتها و سازمانها', value: 'Companies' }, // localized
{ label: '{{سرشناسی|رویدادها}}: رهنمود سرشناسی برای رویدادها', value: 'Events' }, // localized
{ label: '{{سرشناسی|فیلمها}}: رهنمود سرشناسی فیلمها', value: 'Films' }, // localized
{ label: '{{سرشناسی|مکان}}: رهنمود سرشناسی ویژگیهای جغرافیایی', value: 'Geographic' }, // localized
{ label: '{{سرشناسی|فهرستها}}: رهنمود سرشناسی فهرستهای مسقل', value: 'Lists' }, // localized
{ label: '{{سرشناسی|موسیقی}}: رهنمود سرشناسی موسیقی', value: 'Music' }, // localized
{ label: '{{سرشناسی|نوواژهها}}: رهنمود سرشناسی نوواژهها', value: 'Neologisms' }, // localized
{ label: '{{سرشناسی|عددها}}: رهنمود سرشناسی عددها', value: 'Numbers' }, // localized
{ label: '{{سرشناسی|محصولات}}: رهنمود سرشناسی محصولات و خدمات', value: 'Products' }, // localized
{ label: '{{سرشناسی|ورزشها}}: رهنمود سرشناسی ورزشها', value: 'Sports' }, // localized
{ label: '{{سرشناسی|تلویزیون}}: رهنمود سرشناسی برنامههای تلویزیونی', value: 'Television' }, // localized
{ label: '{{سرشناسی|وب}}: رهنمود سرشناسی مجتوای وب', value: 'Web' } // localized
]
};
break;
default:
break;
}
return checkbox;
};
var makeCheckboxesForAlreadyPresentTags = function() {
container.append({ type: 'header', id: 'tagHeader0', label: 'Tags already present' });
var subdiv = container.append({ type: 'div', id: 'tagSubdiv0' });
var checkboxes = [];
var unCheckedTags = e.target.form.getUnchecked('alreadyPresentArticleTags') || [];
Twinkle.tag.alreadyPresentTags.forEach(function(tag) {
var description = Twinkle.tag.article.tags[tag];
var checkbox =
{
value: tag,
label: '{{' + tag + '}}' + (description ? ': ' + description : ''),
checked: unCheckedTags.indexOf(tag) === -1,
style: 'font-style: italic'
};
checkboxes.push(checkbox);
});
subdiv.append({
type: 'checkbox',
name: 'alreadyPresentArticleTags',
list: checkboxes
});
};
if (sortorder === 'cat') { // categorical sort order
// function to iterate through the tags and create a checkbox for each one
var doCategoryCheckboxes = function(subdiv, array) {
var checkboxes = [];
$.each(array, function(k, tag) {
var description = Twinkle.tag.article.tags[tag];
if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
checkboxes.push(makeCheckbox(tag, description));
}
});
subdiv.append({
type: 'checkbox',
name: 'articleTags',
list: checkboxes
});
};
if (Twinkle.tag.alreadyPresentTags.length > 0) {
makeCheckboxesForAlreadyPresentTags();
}
var i = 1;
// go through each category and sub-category and append lists of checkboxes
$.each(Twinkle.tag.article.tagCategories, function(title, content) {
container.append({ type: 'header', id: 'tagHeader' + i, label: title }); // localized
var subdiv = container.append({ type: 'div', id: 'tagSubdiv' + i++ });
if (Array.isArray(content)) {
doCategoryCheckboxes(subdiv, content);
} else {
$.each(content, function(subtitle, subcontent) {
subdiv.append({ type: 'div', label: [ Morebits.htmlNode('b', subtitle) ] });
doCategoryCheckboxes(subdiv, subcontent);
});
}
});
} else { // alphabetical sort order
if (Twinkle.tag.alreadyPresentTags.length > 0) {
makeCheckboxesForAlreadyPresentTags();
container.append({ type: 'header', id: 'tagHeader1', label: 'برچسبهای قابل استفاده' }); // localized
}
var checkboxes = [];
$.each(Twinkle.tag.article.tags, function(tag, description) {
if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
checkboxes.push(makeCheckbox(tag, description));
}
});
container.append({
type: 'checkbox',
name: 'articleTags',
list: checkboxes
});
}
// append any custom tags
if (Twinkle.getPref('customTagList').length) {
container.append({ type: 'header', label: 'برچسبهای سفارشی' }); // localized
container.append({ type: 'checkbox', name: 'articleTags',
list: Twinkle.getPref('customTagList').map(function(el) {
el.checked = Twinkle.tag.checkedTags.indexOf(el.value) !== -1;
return el;
})
});
}
var $workarea = $(form).find('#tagWorkArea');
var rendered = container.render();
$workarea.empty().append(rendered);
// for quick filter:
$allCheckboxDivs = $workarea.find('[name$=Tags]').parent();
$allHeaders = $workarea.find('h5, .quickformDescription');
form.quickfilter.value = ''; // clear search, because the search results are not preserved over mode change
form.quickfilter.focus();
// style adjustments
$workarea.find('h5').css({ 'font-size': '110%' });
$workarea.find('h5:not(:first-child)').css({ 'margin-top': '1em' });
$workarea.find('div').filter(':has(span.quickformDescription)').css({ 'margin-top': '0.4em' });
var alreadyPresentTags = Morebits.quickForm.getElements(form, 'alreadyPresentArticleTags');
if (alreadyPresentTags) {
alreadyPresentTags.forEach(generateLinks);
}
// in the unlikely case that *every* tag is already on the page
var notPresentTags = Morebits.quickForm.getElements(form, 'articleTags');
if (notPresentTags) {
notPresentTags.forEach(generateLinks);
}
// tally tags added/removed, update statusNode text
var statusNode = document.getElementById('tw-tag-status');
$('[name=articleTags], [name=alreadyPresentArticleTags]').click(function() {
if (this.name === 'articleTags') {
Twinkle.tag.status.numAdded += this.checked ? 1 : -1;
} else if (this.name === 'alreadyPresentArticleTags') {
Twinkle.tag.status.numRemoved += this.checked ? -1 : 1;
}
var firstPart = 'افزودن ' + mw.language.convertNumber(Twinkle.tag.status.numAdded) + ' برچسب' + (Twinkle.tag.status.numAdded > 1 ? '' : '');
var secondPart = 'حذف ' + mw.language.convertNumber(Twinkle.tag.status.numRemoved) + ' برچسب' + (Twinkle.tag.status.numRemoved > 1 ? '' : '');
statusNode.textContent =
(Twinkle.tag.status.numAdded ? ' ' + firstPart : '') +
(Twinkle.tag.status.numRemoved ? (Twinkle.tag.status.numAdded ? '؛ ' : ' ') + secondPart : '');
});
};
/**
* Adds a link to each template's description page
* @param {Morebits.quickForm.element} checkbox associated with the template
*/
var generateLinks = function(checkbox) {
var link = Morebits.htmlNode('a', '>');
link.setAttribute('class', 'tag-template-link');
var tagname = checkbox.values;
link.setAttribute('href', mw.util.getUrl(
(tagname.indexOf(':') === -1 ? 'Template:' : '') +
(tagname.indexOf('|') === -1 ? tagname : tagname.slice(0, tagname.indexOf('|')))
));
link.setAttribute('target', '_blank');
$(checkbox).parent().append(['\u00A0', link]);
};
// Tags for ARTICLES start here
Twinkle.tag.article = {};
// A list of all article tags, in alphabetical order
// To ensure tags appear in the default "categorized" view, add them to the tagCategories hash below.
Twinkle.tag.article.tags = {
'Advert': 'مشابه یک متن تبلیغاتی نوشته شدهاست', // localized
'All plot': 'تقریباً بهطور کامل یک خلاصهٔ طرح است', // localized
'Autobiography': 'خودزندگینامه است و احتمالاً بیطرفانه نوشته نشدهاست', // localized
'BLP sources': 'زندگینامه زندگان که برای تأییدپذیری نیامند منابع بیشتر است', // localized
'BLP unsourced': 'زندگینامهٔ زندگان که هیچ منبعی ندارد (برای مقالههای جدید، از حذف زماندار زندگینامه زندگان اسفاده کنید)', // localized
'Citation style': 'از سبک یادکرد مبهم یا متناقض برخوردار است', // localized
'Cleanup': 'نیازمند تمیزکاری است', // localized
'Cleanup bare URLs': 'از پیوندهای عریان برای ارجاع استفاده میکند، که مستعد خرابشدن پیوند است', // localized
'Cleanup-PR': 'مشابه یک انتشار مطبوعاتی یا مقالهٔ خبری نوشته شدهاست', // localized
'Cleanup reorganize': "برای سازگار شدن با رهنمودهای قالببندی ویکیپدیا، نیازمند سازماندهی مجدد است", // localized
'Cleanup rewrite': "برای سازگار شدن با استانداردهای کیفی ویکیپدیا× نیازمند بازنویسی عمده است", // localized
'Cleanup tense': 'از رهنمودهای استفاده از زمانهای مختلف افعال پیروی نمیکند.', // localized
'Close paraphrasing': 'دربردارندهٔ بازنویسی نزدیک از یک منبع غیرآزاد دارای حق تکثیر است', // localized
'COI': 'سازنده یا مشارکتکنندهٔ عمده ممکن است دارای تعارض منافع باشد', // localized
'Condense': 'تعداد زیاد عنوانهای بخش که محتوا را پراکنده کردهاند', // localized
'Confusing': 'گیجکننده و مبهم', // localized
'Context': 'زمینهٔ ناکافی برای کسانی که با موضوع آشنا نیستند', // localized
'Copy edit': 'نیازمند ویراستاری دستور زبان، سبک، انسجام، لحن، یا آوانگاری', // localized
'Copypaste': 'بهنظر میرسد از جای دیگری کپیکاری شدهاست', // localized
'Current': 'دربردارندهٔ یک رویداد روز است', // localized
'Dead end': 'مقاله به هیچ مقالهٔ دیگری پیوند ندارد', // localized
'Disputed': 'دقت در بیان حقایق مورد سؤال است', // localized
'Essay-like': 'همانند یک تفکر شخصی، انشای شخصی یا مقالهٔ استدلالی نوشته شدهاست', // localized
'Expand language': 'لازم است که با ترجمهٔ متن از یک مقاله به زبان دیگر، گسترش یابد', // localized
'Expert needed': 'نیازمند توجه از سوی یک فرد آشنا با موضوع است', // localized
'External links': 'پیوندهای به بیرون ممکن است از سیاستها یا رهنمودهای محتوایی پیروی نکنند', // localized
'Fanpov': "از دیدگاه یک طرفدار نوشته شدهاست", // localized
'Fiction': 'وجه تمایز میان حقایق و حکایتها مشخص نیست', // localized
'Globalize': 'نمایانگر وجههٔ جهانی موضوع نیست', // localized
'GOCEinuse': 'currently undergoing a major copy edit by the Guild of Copy Editors',
'History merge': 'تاریخچهٔ یک صفحهٔ دیگر میتواند در تاریخچهٔ این صفحه ادغام شود', // localized
'Hoax': 'کل یا بخشی از آن ممکن است شامل کلکزنی باشد', // localized
'Improve categories': 'نیازمند ردههای تخصصی بیشتر است', // localized
'Incomprehensible': 'فهمیدن آن بسیار سخت یا غیرقابل درک است', // localized
'In-universe': 'موضوع، تخیلی است و برای ارائهٔ یک دیدگاه غیرخیالی، نیازمند بازنویسی است', // localized
'In use': 'برای مدتی کوتاه تحت ویرایش عمده است', // localized
'Lead missing': 'فاقد بخش آغازین است', // localized
'Lead rewrite': 'بخش آغازین برای سازگار شدن با رهنمودها، نیازمند بازنویسی است', // localized
'Lead too long': 'بخش آغازین نسبت به طول کلی مقاله بسیار بلند است', // localized
'Lead too short': 'بخش آغازین بسیار کوتاه است و برای بیان خلاصهای از نکتههای کلیدی، نیازمند گسترش است', // localized
'Like resume': 'همانند یک رزومه نوشته شدهاست', // localized
'Long plot': 'خلاصهٔ طرح بسیار بلند است یا دارای جزئیات بیش از اندازه است', // localized
'Manual': 'همانند یک دفترچهٔ راهنما نوشته شدهاست', // localized
'Merge': 'لازم است با یک مقالهٔ مشخص دیگر ادغام شود', // localized
'Merge from': 'یک مقالهٔ مشخص دیگر باید در این مقاله ادغام شود', // localized
'Merge to': 'لازم است که در یک مقالهٔ مشخص دیگر ادغام شود', // localized
'More citations needed': 'برای تأییدپذیری، نیازمند منابع و ارجاعهای بیشتر است', // localized
'More footnotes': 'چند ارجاع دارد، اما یادکردهای درونخطی آن کافی نیستند', // localized
'No footnotes': 'دارای ارجاع است، اما فاقد یادکرد درونخطی است', // localized
'No plot': 'نیازمند خلاصهٔ طرح است', // localized
'Non-free': 'ممکن است بیش از اندازه یا بهطور نادرست از محتوای دارای حق تکثیر استفاده کردهباشد', // localized
'Notability': 'موضوع ممکن است رهنمود اصلی سرشناسی را احراز نکند', // localized
'Not English': 'دقیق، کامل و صحیح ترجمه نشدهاست و نیازمند اصلاح ترجمه است',
'One source': 'بهطور گسترده یا تنها به یک منبع متکی است', // localized
'Original research': 'شامل تحقیق دست اول است', // localized
'Orphan': 'از هیچ مقالهٔ دیگری به آن پیوند داده نشدهاست', // localized
'Over-coverage': 'جانبداری گسترده یا پوشش نامتناسب بهسمت یک یا چند منطقهٔ مشخص', // localized
'Overlinked': 'پیوندهای تکراری و/یا نامرتبط زیاد به مقالههای دیگر', // localized
'Overly detailed': 'مقدار بیش از اندازه از جزئیات پیچیده', // localized
'Over-quotation': 'گفتاوردهای خیلی زیاد یا خیلی طولانی برای یک مدخل دانشنامهای', // localized
'Peacock': 'شامل جملهبندی است که بدون افزودن اطلاعات، موضوع را به شیوهای انتزاعی تبلیغ میکند', // localized
'POV': 'به دیدگاه بیطرف پایبند نیست', // localized
'Primary sources': 'بیش از اندازه بر ارجاع به منابع اولیه متکی است و نیازمند ارجاع به منابع ثانویه است', // localized
'Prose': 'در قالب یک فهرست نوشته شدهاست، اما در صورتی که به نثر درآید، بهتر خوانده میشود', // localized
'Recentism': 'دارای دید یکطرفه به رویدادهای اخیر است', // localized
'Rough translation': 'ترجمهٔ ضعیف از یک زبان دیگر', // localized
'Sections': 'نیازمند تقسیم به چند بخش بر پایه موضوع است', // localized
'Self-published': 'دارای ارجاعهای بیش از اندازه و نامناسب به منابع خود چاپکرده است', // localized
'Sources exist': 'موضوع سرشناس، منابعی موجود هستند که میتوانند به مقاله افزوده شوند', // localized
'Technical': 'بهاندازهای فنی است که درک آن برای بیشتر مخاطبان سخت است', // localized
'Third-party': 'بهشدت به منابعی اتکا دارد که بهطور نزدیکی با موضوع مرتبط هستند', // localized
'Tone': 'لحن یا سبک نوشتار بازتابدهندهٔ لحن دانشنامهای بهکار رفته در ویکیپدیا نیست', // localized
'Too few opinions': 'ممکن است دربردارندهٔ تمامی دیدگاههای قابل توجه نباشد', // localized
'Uncategorized': 'در هیچ ردهای قرار نگرفتهاست', // localized
'Under construction': 'در فرایند گسترش یا بازسازی عمده است', // localized
'Underlinked': 'نیازمند ویکیپیوندهای بیشتر به مقالههای دیگر است', // localized
'Undue weight': 'به بعضی ایدهها، وقایع یا حواشی، وزن بیمورد دادهاست', // localized
'Unfocused': 'فاقد تمرکز است، یا در مورد بیش از یک موضوع است', // localized
'Unreferenced': 'به هیچ منبعی استناد نمیکند', // localized
'Unreliable sources': 'بعضی منابع ممکن است قابل اعتماد نباشند', // localized
'Undisclosed paid': 'ممکن است در برابر دستمزد فاشنشده ایجاد یا ویرایش شدهباشد', // localized
'Update': 'نیازمند افزودن اطلاعات بهروز بیشتر است', // localized
'Very long': 'به اندازهای طولانی است که خواندن و گشتن در آن سخت است', // localized
'Weasel': 'بهدلیل استفاده از الفاظ طفرهآمیز، بیطرفی و اثباتپذیری آن بهخطر افتادهاست' // localized
};
// A list of tags in order of category
// Tags should be in alphabetical order within the categories
// Add new categories with discretion - the list is long enough as is!
Twinkle.tag.article.tagCategories = {
'برچسبهای تمیزکاری و نگهدار': {
'تمزیکاری عمومی': [
'Cleanup', // has a subgroup with text input
'Cleanup rewrite',
'Copy edit' // has a subgroup with text input
],
'محتوای بالقوه نامطلوب': [
'Close paraphrasing',
'Copypaste', // has a subgroup with text input
'External links',
'Non-free'
],
'ساختار، قالببندی و بخش آغازین': [
'Cleanup reorganize',
'Condense',
'Lead missing',
'Lead rewrite',
'Lead too long',
'Lead too short',
'Sections',
'Very long'
],
'تمزیکاری مرتبط با داستان': [
'All plot',
'Fiction',
'In-universe',
'Long plot',
'No plot'
]
},
'مشکلات محتوایی عمومی': {
'اهمیت و سرشناسی': [
'Notability' // has a subgroup with subcategories
],
'سبک نوشتار': [
'Advert',
'Cleanup tense',
'Essay-like',
'Fanpov',
'Like resume',
'Manual',
'Cleanup-PR',
'Over-quotation',
'Prose',
'Technical',
'Tone'
],
'مفهوم (یا فقدان آن)': [
'Confusing',
'Incomprehensible',
'Unfocused'
],
'اطلاعات و جزئیات': [
'Context',
'Expert needed',
'Overly detailed',
'Undue weight'
],
'وابستگی به زمان': [
'Current',
'Update'
],
'بیطرفی، جانبداری و دقت در بیان حقایق': [
'Autobiography',
'COI',
'Disputed',
'Hoax',
'Globalize',
'Over-coverage',
'Peacock',
'POV',
'Recentism',
'Too few opinions',
'Undisclosed paid',
'Weasel'
],
'تأییدپذیری و ارجاعات': [
'BLP sources',
'BLP unsourced',
'More citations needed',
'One source',
'Original research',
'Primary sources',
'Self-published',
'Sources exist',
'Third-party',
'Unreferenced',
'Unreliable sources'
]
},
'مشکلات خاص محتوایی': {
'زبان': [
'Not English', // has a subgroup with several options
'Rough translation', // has a subgroup with several options
'Expand language'
],
'پیوندها': [
'Dead end',
'Orphan',
'Overlinked',
'Underlinked'
],
'شیوهٔ ارجاع': [
'Citation style',
'Cleanup bare URLs',
'More footnotes',
'No footnotes'
],
'ردهبندی': [
'Improve categories',
'Uncategorized'
]
},
'ادغام': [
'History merge',
'Merge', // these three have a subgroup with several options
'Merge from',
'Merge to'
],
'اطلاعرسانی': [
'GOCEinuse',
'In use',
'Under construction'
]
};
// Contains those article tags that *do not* work inside {{multiple issues}}.
Twinkle.tag.multipleIssuesExceptions = [
'Copypaste',
'Current', // Works but not intended for use in MI
'Expand language',
'GOCEinuse',
'History merge',
'Improve categories',
'In use',
'Merge',
'Merge from',
'Merge to',
'Not English',
'Rough translation',
'Uncategorized',
'Under construction'
];
// Tags for REDIRECTS start here
Twinkle.tag.spellingList = [
{
label: '{{R from acronym}}: تغییرمسیر از یک سرنام (مانند فحن) به قالب گسترشیافتهٔ آن', // localized
value: 'R from acronym'
},
{
label: '{{R from alternative spelling}}: تغییرمسیر از یک عنوان با تلفظ متفاوت', // localized
value: 'R from alternative spelling'
},
{
label: '{{R from initialism}}: تغییرمسیر از یک سرواژه (مانند BBC) به قالب گسترشیافتهٔ آن', // localized
value: 'R from initialism'
},
{
label: '{{R from ASCII-only}}: redirect from a title in only basic ASCII to the formal article title, with differences that are not diacritical marks (accents, umlauts, etc.) or ligatures', // localized
value: 'R from ASCII-only'
},
{
label: '{{R from member}}: تغییرمسیر از عضو یک گروه به عنوان مرتبط مانند خود گروه، سازمان یا تیمی که در آن عضویت دارد', // localized
value: 'R from member'
},
{
label: '{{R from misspelling}}: تغییرمسیر از یک آوانگاری اشتباه یا خطای نشانهگذاری', // localized
value: 'R from misspelling'
},
{
label: '{{R from modification}}: تغییرمسیر از اعمال تغییر بر عنوان هدف، مثلاً مرتبسازی مجدد واژگان', // localized
value: 'R from modification'
},
{
label: '{{R from other capitalisation}}: redirect from a title with another method of capitalisation',
value: 'R from other capitalisation'
},
{
label: '{{R from plural}}: تغییرمسیر از یک واژهٔ جمع بستهشده به معادل مفرد', // localized
value: 'R from plural'
},
{
label: '{{R from related word}}: تغییرمسیر از یک واژهٔ مرتبط', // Localized
value: 'R from related word'
},
{
label: '{{R to list entry}}: تغییرمسیر به یک مقاله از نوع «فهرستی از موجودیتهای جزئی» که شامل توضیحات مختصری در مورد موضوعاتی است که سرشناسی کافی برای داشتن مقالهٔ مستقل را ندارند', // localized
value: 'R to list entry'
},
{
label: '{{تغییرمسیر به بخش}}: مشابه {{R to list entry}}، اما برای زمانی که فهرست بخشبندی شدهاست، مانند فهرستی از شخصیتها در یک دنیای خیالی.', // localized
value: 'R to section'
},
{
label: '{{R with possibilities}}: تغییرمسیر از یک عنوان اختصاصیتر به یک مقالهٔ عمومیتر و با جزئیات کمتر، که میتواند و بایست که گسترش پیدا کند', // Localized
value: 'R with possibilities'
}
];
Twinkle.tag.alternativeList = [
{
label: '{{تغییرمسیر از زبانی دیگر}}: تغییرمسیر از یک نام فارسی به نامی به زبان دیگر، یا برعکس', // localized
value: 'R from alternative language',
subgroup: [
{
name: 'altLangFrom',
type: 'input',
label: 'از زبان (شناسه دوحرفی): ', // localized
tooltip: 'شناسهٔ دوحرفی زبانی که عنوان تغییرمسیر به آن زبان نوشته شدهاست را وارد کنید؛ مانند fa برای فارسی و en برای انگلیسی' // localized
},
{
name: 'altLangTo',
type: 'input',
label: 'به زبان (شناسه دوحرفی): ', // localized
tooltip: 'شناسهٔ دوحرفی زبانی که عنوان هدف به آن زبان نوشته شدهاست را وارد کنید؛ مانند fa برای فارسی و en برای انگلیسی' // localized
},
{
name: 'altLangInfo',
type: 'div',
label: $.parseHTML('<p>برای فهرستی از شناسههای زبانها، <a href="/wiki/Wp:Template_messages/Redirect_language_codes">en:Wikipedia:Template messages/Redirect language codes</a></p> را ببینید') // localized
}
]
},
{
label: '{{R from alternative name}}: تغییرمسیر از عنوانی که نام دیگر، نام مستعار، نام خودمانی یا نام مترادف است', // localized
value: 'R from alternative name'
},
{
label: '{{R from former name}}: تغییرمسیر از نام یا عنوان کاری سابق', // localized
value: 'R from former name'
},
{
label: '{{R from historic name}}: تغییرمسیر از نامی دیگر با پیشینهٔ تاریخی قابل توجه مانند یک منطقه، ایالت، شهر یا نظایر آن، که دیگر با آن نام یا عنوان شناخته نمیشود', // localized
value: 'R from historic name'
},
{
label: '{{R from incorrect name}}: تغییرمسیر از یک نام اشتباه که برای استفاده در عنوان، مناسب نیست', // localized
value: 'R from incorrect name'
},
{
label: '{{R from long name}}: تغییرمسیر از عنوانی که شامل نام کامل یا کاملتر است', // localized
value: 'R from long name'
},
{
label: '{{R from molecular formula}}: تغییرمسیر از یک فرمول مولکولی/شیمیایی به نام فنی یا بدیهی آن', // localized
value: 'R from molecular formula'
},
{
label: '{{R from name and country}}: تغییرمسیر از نام اختصاصی به نام مختصرتر', // localized
value: 'R from name and country'
},
{
label: '{{R from phrase}}: تغییرمسیر از یک اصطلاح به یک مقالهٔ مرتبط عمومیتر که موضوع را پوشش میدهد', // localized
value: 'R from phrase'
},
{
label: '{{R from scientific name}}: تغییرمسیر از نام علمی به نام رایج', // localized
value: 'R from scientific name'
},
{
label: '{{R from short name}}: تغییرمسیر از عنوانی که صورت کوتاهشدهٔ نام کامل یک شخص، یک عنوان کتاب، یا عنوان کاملتر دیگری است', // localized
value: 'R from short name'
},
{
label: '{{R from subtopic}}: تغییرمسیر از عنوانی که موضوعی فرعی از مقالهٔ مقصد است', // localized
value: 'R from subtopic'
},
{
label: '{{R from surname}}: تغییرمسیر از عنوانی که لقب است', // localized
value: 'R from surname'
},
{
label: '{{R to diacritic}}: تغییرمسیر به عنوان مقاله با حرکتگذاری (تلفظ، دونقطه، و غیره)', // localized
value: 'R to diacritic'
},
{
label: '{{R to related topic}}: تغییرمسیر به یک مقاله دربارهٔ یک موضوع مشابه', // localized
value: 'R to related topic'
},
{
label: '{{R to scientific name}}: تغییرمسیر از یک نام رایج به نام علمی', // localized
value: 'R to scientific name'
}
];
Twinkle.tag.administrativeList = [
{
label: '{{R from ambiguous term}}: تغییرمسیر از یک نام صفحهٔ مبهم به صفحهای که آن را ابهامزدایی میکند. این الگو هرگز نباید در صفحهای که «(ابهامزدایی)» را در عنوانش دارد، نمایش یابد، بهجای آن از تغییرمسیر به صفحه ابهامزدایی استفاده کنید', // localized
value: 'R from ambiguous term'
},
{
label: '{{R from CamelCase}}: تغییرمسیر از یک عنوان با نگارش شتری', // localized
value: 'R from CamelCase'
},
{
label: '{{R to decade}}: تغییرمسیر از یک سال به مقالهٔ دهه', // localized
value: 'R to decade'
},
{
label: '{{R to disambiguation page}}: تغییرمسیر به یک صفحه ابهامزدایی', // localized
value: 'R to disambiguation page'
},
{
label: '{{R from duplicated article}}: تغییرمسیر به یک مقالهٔ مشابه جهت حفظ تاریخچهٔ ویرایش آن', // localized
value: 'R from duplicated article'
},
{
label: '{{R from file metadata link}}: تغییرمسیر یک ویکیپیوند ایجادشده از EXIF، XMP، یا اطلاعات دیگر (مثلاً بخش «فراداده» در بعضی از صفحههای توضیحات تصویر)', // localized
value: 'R from file metadata link'
},
{
label: '{{R with history}}: تغییرمسیر از یک صفحه با تاریخچهٔ قابل توجه، که جهت حفظ محتوا و انتسابها نگهداری شدهاست', // localized
value: 'R with history'
},
{
label: '{{R from incomplete disambiguation}}: تغییرمسیر از نام یک صفحه که بیش از آن دارای ابهام است که بتواند عنوان یک نوشتار قرار گیرد و باید به یک صفحهٔ ابهامزدایی مناسب تغییرمسیر یابد.', // localized
value: 'R from incomplete disambiguation'
},
{
label: '{{تغییرمسیر حاصل از ادغام}}: تغییرمسیر از یک صفحهٔ ادغامشده جهت حفظ تاریخچهٔ ویرایشی آن', // localized
value: 'R from merge'
},
{
label: '{{R from other disambiguation}}: تغییرمسیر از نام یک صفحه با یک واژه ابهامزدایی جایگزین', // localized
value: 'R from other disambiguation'
},
{
label: '{{R printworthy}}: تغییرمسیر از عنوانی که میتواند در یک نسخهٔ چاپشده یا نسخهٔ سیدی/دیویدی ویکیپدیا کمککننده باشد', // localized
value: 'R printworthy'
},
{
label: '{{R from school}}: تغییرمسیر از مقالهٔ یک مدرسه دارای اطلاعات کمی بودهاست', // localized
value: 'R from school'
},
{
label: '{{R from shortcut}}: تغییرمسیر از یک میانبر ویکیپدیا', // localized
value: 'R from shortcut'
},
{
label: '{{R from sort name}}: تغییرمسیر از نام مرتبسازی هدف، مثلاً عنوانی که بهجای نام کوچک، با نام خانوادگی شروع میشود', // localized
value: 'R from sort name'
},
{
label: '{{R unprintworthy}}: تغییرمسیر از عنوانی که «نمیتواند» در یک نسخهٔ چاپشده یا نسخهٔ سیدی/دیویدی ویکیپدیا کمککننده باشد', // localized
value: 'R unprintworthy'
}
];
// maintenance tags for FILES start here
Twinkle.tag.file = {};
Twinkle.tag.file.licenseList = [
{ label: '{{Bsr}}: source info consists of bare image URL/generic base URL only', value: 'Bsr' },
{ label: '{{نیازمند نسخه کوچکتر}}: تصویر مورد استفادهٔ منصفانه با وضوح بالا (یا کلیپ صوتی بسیار بلند و غیره)', value: 'Non-free reduce' }, // localized
{ label: '{{نسخههای غیر آزاد یتیم}}: رسانههای استفادهٔ منصفانه با اصلاحات قدیمی که نیازمند حذف هستند', value: 'subst:orfurrev' } // localized
];
Twinkle.tag.file.commonsList = [
{ label: '{{انتقال به ویکیانبار}}: رسانههای آزاد که باید به ویکیانبار منتقل شوند', value: 'Copy to Commons' }, // localized
{ label: '{{به ویکیانبار انتقال ندهید}} (مشکل مالکیت عمومی): پرونده در ایالات متحده در مالکیت عمومی قرار دارد، اما در کشور مبدأ خود، خیر.', value: 'Do not move to Commons' }, // localized
{
label: '{{به ویکیانبار انتقال ندهید}} (دلیل دیگر)', // localized
value: 'Do not move to Commons_reason',
subgroup: {
type: 'input',
name: 'DoNotMoveToCommons',
label: 'دلیل: ', // localized
tooltip: 'دلیلی ارائه دهید که چرا نباید این تصویر را به ویکیانبار انتقال داد (الزامی)' // localized
}
},
{
label: '{{نسخه محلی حفظ شود}}: درخواست برای نگهداشتن نسخهٔ محلی از یک پروندهٔ انبار', // localized
value: 'Keep local',
subgroup: {
type: 'input',
name: 'keeplocalName',
label: 'نام تصویر در انبار در صورت تفاوت داشتن: ', // localized
tooltip: 'نام تصویر در ویکیانبار (اگر با نام محلی متفاوت است)، بدون پیشوند «پرونده:»:' // localized
}
},
{
label: '{{موجود در انبار}}: پرونده به انبار کپی شدهاست', // localized
value: 'subst:ncd',
subgroup: {
type: 'input',
name: 'ncdName',
label: 'نام تصویر در انبار در صورت تفاوت داشتن: ', // localized
tooltip: 'نام تصویر در ویکیانبار (اگر با نام محلی متفاوت است), ، بدون پیشوند «پرونده:»:' // localized
}
}
];
Twinkle.tag.file.cleanupList = [
{ label: '{{Artifacts}}: پروندهٔ PNG شامل مصنوعات فشردهسازی باقیمانده', value: 'Artifacts' }, // localized
{ label: '{{Bad font}}: پروندهٔ SVG استفادهکننده از فونتهایی که در سرور بندانگشتی موجود نیستند', value: 'Bad font' }, // localized
{ label: '{{Bad format}}: پروندهٔ PDF/DOC/... باید به یک فرمت کاربردیتر تبدیل شود', value: 'Bad format' }, // localized
{ label: '{{Bad GIF}}: پروندهٔ GIF که باید در فرمت PNG، JPEG، یا SVG باشد', value: 'Bad GIF' }, // localized
{ label: '{{Bad JPEG}}: پروندهٔ JPEG که باید در فرمت PNG یا SVG باشد', value: 'Bad JPEG' }, // localized
{ label: '{{Bad SVG}}: پروندهٔ SVG شامل جلوههای شطرنجی', value: 'Bad SVG' }, // localized
{ label: '{{Bad trace}}: پروندهٔ SVG ترسیمشده بهصورت خودکار که نیازمند تمیزکاری است', value: 'Bad trace' }, // localized
{
label: '{{تمیزکاری تصویر}}: تمیزکاری عمومی', value: 'Cleanup image', // localized
subgroup: {
type: 'input',
name: 'cleanupimageReason',
label: 'دلیل: ', // localized
tooltip: 'دلیل نیاز به تمیزکاری را وارد کنید (الزامی)' // localized
}
},
{ label: '{{ClearType}}: تصویر (نه نماگرفت) با تصحیح فرکانس ClearType', value: 'ClearType' }, // localized
{ label: '{{واترمارک تصویر}}: تصویر شامل واترمارک نمایان یا پنهان است', value: 'Imagewatermark' }, // localized
{ label: '{{NoCoins}}: تصویر استفادهکننده از سکه برای نشاندادن مقیاس', value: 'NoCoins' }, // localized
{ label: '{{Overcompressed JPEG}}: پروندهٔ JPEG با سطح بالایی از مصنوعات', value: 'Overcompressed JPEG' }, // localized
{ label: '{{Opaque}}: پسزمینهٔ مات که باید شفاف باشد', value: 'Opaque' }, // localized
{ label: '{{نیازمند حذف کادر}}: کادر نالازم، فضای سفید و غیره.', value: 'Remove border' }, // localized
{
label: '{{تغییرنام پرونده}}: نام پرونده با توجه به معیار درجشده در [[وپ:بت]] باید تغییر یابد', // localized
value: 'Rename media',
subgroup: [
{
type: 'input',
name: 'renamemediaNewname',
label: 'نام جدید: ', // localized
tooltip: 'نام جدید برای تصویر را وارد کنید (اختیاری)' // localized
},
{
type: 'input',
name: 'renamemediaReason',
label: 'دلیل: ', // localized
tooltip: 'دلیل تغییر نام را وارد کنید (اختیاری)' // localized
}
]
},
{ label: '{{Should be PNG}}: پروندهٔ GIF یا JPEG که باید lossless باشد', value: 'Should be PNG' }, // localized
{
label: '{{باید اسویجی باشد}}: پروندهٔ PNG، GIF یا JPEG که باید گرافیکی بُرداری باشد', value: 'Should be SVG', // localized
subgroup: {
name: 'svgCategory',
type: 'select',
list: [
{ label: '{{باید اسویجی باشد|other}}', value: 'other' }, // localized
{ label: '{{باید اسویجی باشد|alphabet}}: character images, font examples, etc.', value: 'alphabet' }, // localized
{ label: '{{باید اسویجی باشد|chemical}}: chemical diagrams, etc.', value: 'chemical' }, // localized
{ label: '{{باید اسویجی باشد|circuit}}: electronic circuit diagrams, etc.', value: 'circuit' }, // localized
{ label: '{{باید اسویجی باشد|coat of arms}}: coats of arms', value: 'coat of arms' }, // localized
{ label: '{{باید اسویجی باشد|diagram}}: diagrams that do not fit any other subcategory', value: 'diagram' }, // localized
{ label: '{{باید اسویجی باشد|emblem}}: emblems, free/libre logos, insignias, etc.', value: 'emblem' }, // localized
{ label: '{{باید اسویجی باشد|fair use}}: fair-use images, fair-use logos', value: 'fair use' }, // localized
{ label: '{{باید اسویجی باشد|flag}}: flags', value: 'flag' }, // localized
{ label: '{{باید اسویجی باشد|graph}}: visual plots of data', value: 'graph' }, // localized
{ label: '{{باید اسویجی باشد|logo}}: logos', value: 'logo' }, // localized
{ label: '{{باید اسویجی باشد|map}}: maps', value: 'map' }, // localized
{ label: '{{باید اسویجی باشد|music}}: musical scales, notes, etc.', value: 'music' }, // localized
{ label: '{{باید اسویجی باشد|physical}}: "realistic" images of physical objects, people, etc.', value: 'physical' }, // localized
{ label: '{{باید اسویجی باشد|symbol}}: miscellaneous symbols, icons, etc.', value: 'symbol' } // localized
]
}
},
{ label: '{{Should be text}}: image should be represented as text, tables, or math markup', value: 'Should be text' } // localized
];
Twinkle.tag.file.qualityList = [
{ label: '{{Image-blownout}}', value: 'Image-blownout' },
{ label: '{{Image-out-of-focus}}', value: 'Image-out-of-focus' },
{
label: '{{Image-Poor-Quality}}', value: 'Image-Poor-Quality',
subgroup: {
type: 'input',
name: 'ImagePoorQualityReason',
label: 'دلیل: ', // localized
tooltip: 'دلیل اینکه چرا این تصویر خوب نیست (الزامی)' // localized
}
},
{ label: '{{Image-underexposure}}', value: 'Image-underexposure' },
{
label: '{{Low quality chem}}: ساختارهای شیمیایی مورد اختلاف', value: 'Low quality chem', // localized
subgroup: {
type: 'input',
name: 'lowQualityChemReason',
label: 'دلیل: ', // localized
tooltip: 'دلیل اینکه چرا نمودار مورد اختلاف است (الزامی)' // localized
}
}
];
Twinkle.tag.file.replacementList = [
{ label: '{{Obsolete}}: نسخهٔ بهبودیافته موجود است', value: 'Obsolete' }, // localized
{ label: '{{PNG version available}}', value: 'نسخهٔ پیانجی موجود است' }, // localized
{ label: '{{Vector version available}}', value: 'نسخهٔ وکتور موجود است' } // localized
];
Twinkle.tag.file.replacementList.forEach(function(el) {
el.subgroup = {
type: 'input',
label: 'پروندهٔ جایگزین: ', // localized
tooltip: 'نام پروندهای که جایگزین این پرونده میشود را وارد کنید (الزامی)', // localized
name: el.value.replace(/ /g, '_') + 'File'
};
});
Twinkle.tag.callbacks = {
article: function articleCallback(pageobj) {
// Remove tags that become superfluous with this action
var pageText = pageobj.getPageText().replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
var params = pageobj.getCallbackParameters();
/**
* Saves the page following the removal of tags if any. The last step.
* Called from removeTags()
*/
var postRemoval = function() {
if (params.tagsToRemove.length) {
// Remove empty {{multiple issues}} if found
pageText = pageText.replace(/\{\{(multiple ?issues|article ?issues|mi)\s*\|\s*\}\}\n?/im, '');
// Remove single-element {{multiple issues}} if found
pageText = pageText.replace(/\{\{(?:multiple ?issues|article ?issues|mi)\s*\|\s*(\{\{[^}]+\}\})\s*\}\}/im, '$1');
}
// Build edit summary
var makeSentence = function(array) {
if (array.length < 3) {
return array.join(' و ');
}
var last = array.pop();
return array.join('، ') + ' و ' + last;
};
var makeTemplateLink = function(tag) {
var text = '{{[[';
// if it is a custom tag with a parameter
if (tag.indexOf('|') !== -1) {
tag = tag.slice(0, tag.indexOf('|'));
}
text += tag.indexOf(':') !== -1 ? tag : 'الگو:' + tag + '|' + tag;
return text + ']]}}';
};
var summaryText;
var addedTags = params.tags.map(makeTemplateLink);
var removedTags = params.tagsToRemove.map(makeTemplateLink);
if (addedTags.length) {
summaryText = 'افزودن برچسب' + (addedTags.length > 1 ? 'های ' : ' ') + makeSentence(addedTags);
summaryText += removedTags.length ? '؛ و حذف برچسب' + (removedTags.length > 1 ? 'های ' : ' ') + makeSentence(removedTags) : '';
} else {
summaryText = 'حذف ' + makeSentence(removedTags);
}
// نیازی به عبارت زیر در پیامهای فارسی نیست. تغییرات لازم در سطر 1313 و 1314 اعمال شده
summaryText += '' + (addedTags.length + removedTags.length > 1 ? '' : '');
if (params.reason) {
summaryText += ': ' + params.reason;
}
// avoid truncated summaries
if (summaryText.length > (499 - Twinkle.getPref('summaryAd').length)) {
summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, '$1');
}
pageobj.setPageText(pageText);
pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
pageobj.setCreateOption('nocreate');
pageobj.save(function() {
// special functions for merge tags
if (params.mergeReason) {
// post the rationale on the talk page (only operates in main namespace)
var talkpageText = '\n\n== ' + params.talkDiscussionTitleLinked + ' ==\n\n';
talkpageText += params.mergeReason.trim() + ' ~~~~';
var talkpage = new Morebits.wiki.page('بحث:' + params.discussArticle, 'اعلام دلیل در صفحهٔ بحث');
talkpage.setAppendText(talkpageText);
talkpage.setEditSummary('/* ' + params.talkDiscussionTitle + ' */ بخش جدید' + Twinkle.getPref('summaryAd'));
talkpage.setWatchlist(Twinkle.getPref('watchMergeDiscussions'));
talkpage.setCreateOption('recreate');
talkpage.append();
}
if (params.mergeTagOther) {
// tag the target page if requested
var otherTagName = 'Merge';
if (params.mergeTag === 'Merge from') {
otherTagName = 'Merge to';
} else if (params.mergeTag === 'Merge to') {
otherTagName = 'Merge from';
}
var newParams = {
tags: [otherTagName],
tagsToRemove: [],
tagsToRemain: [],
mergeTarget: Morebits.pageNameNorm,
discussArticle: params.discussArticle,
talkDiscussionTitle: params.talkDiscussionTitle,
talkDiscussionTitleLinked: params.talkDiscussionTitleLinked
};
var otherpage = new Morebits.wiki.page(params.mergeTarget, 'برچسبزدن صفحهٔ دیگر (' +
params.mergeTarget + ')');
otherpage.setCallbackParameters(newParams);
otherpage.load(Twinkle.tag.callbacks.article);
}
// post at WP:PNT for {{not English}} and {{rough translation}} tag
if (params.translationPostAtPNT) {
var pntPage = new Morebits.wiki.page('ویکیپدیا:صفحههای نیازمند ترجمه به فارسی',
'فهرستکردن مقاله در ویکیپدیا:صفحههای نیازمند ترجمه به فارسی');
pntPage.setFollowRedirect(true);
pntPage.load(function friendlytagCallbacksTranslationListPage(pageobj) {
var old_text = pageobj.getPageText();
var template = params.tags.indexOf('Rough translation') !== -1 ? 'duflu' : 'needtrans';
var lang = params.translationLanguage;
var reason = params.translationComments;
var templateText = '{{subst:' + template + '|pg=' + Morebits.pageNameNorm + '|Language=' +
(lang || 'نامعلوم') + '|Comments=' + reason.trim() + '}} ~~~~';
var text, summary;
if (template === 'duflu') {
text = old_text + '\n\n' + templateText;
summary = 'درخواست تمیزکاری ترجمه برای ';
} else {
text = old_text.replace(/\n+(==\s?صفحههای ترجمهشده که هنوز نیازمند تمیزکاری هستند\s?==)/,
'\n\n' + templateText + '\n\n$1');
summary = 'درخواست ترجمه ' + (lang ? ' از ' + lang : '') + ' برای ';
}
if (text === old_text) {
pageobj.getStatusElement().error('ناتوان در یافتن نقطهٔ هدف برای قرار دادن بحث');
return;
}
pageobj.setPageText(text);
pageobj.setEditSummary(summary + ' [[:' + Morebits.pageNameNorm + ']]' + Twinkle.getPref('summaryAd'));
pageobj.setCreateOption('recreate');
pageobj.save();
});
}
if (params.translationNotify) {
pageobj.lookupCreation(function(innerPageobj) {
var initialContrib = innerPageobj.getCreator();
// Disallow warning yourself
if (initialContrib === mw.config.get('wgUserName')) {
innerPageobj.getStatusElement().warn('شما (' + initialContrib + ') این صفحه را ایجاد کردهاید؛ چشمپوشی از آگاهسازی');
return;
}
var userTalkPage = new Morebits.wiki.page('بحث کاربر:' + initialContrib,
'آگاهسازی ایجادکنندهٔ اولیه (' + initialContrib + ')');
var notifytext = '\n\n== مقالهٔ شما، [[' + Morebits.pageNameNorm + ']]==\n' +
'{{subst:uw-notenglish|1=' + Morebits.pageNameNorm +
(params.translationPostAtPNT ? '' : '|nopnt=yes') + '}} ~~~~';
userTalkPage.setAppendText(notifytext);
userTalkPage.setEditSummary('اعلان: لطفاً برای مشارکت در ویکیپدیای فارسی، از زبان فارسی استفاده کنید.' +
Twinkle.getPref('summaryAd'));
userTalkPage.setCreateOption('recreate');
userTalkPage.setFollowRedirect(true);
userTalkPage.append();
});
}
});
if (params.patrol) {
pageobj.triage();
}
};
/**
* Removes the existing tags that were deselected (if any)
* Calls postRemoval() when done
*/
var removeTags = function removeTags() {
if (params.tagsToRemove.length === 0) {
postRemoval();
return;
}
Morebits.status.info('Info', 'حذف برجسبهای منتفیشده که از پیش موجود بودند');
var getRedirectsFor = [];
// Remove the tags from the page text, if found in its proper name,
// otherwise moves it to `getRedirectsFor` array earmarking it for
// later removal
params.tagsToRemove.forEach(function removeTag(tag) {
var tag_re = new RegExp('\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]+)?\\}\\}\\n?');
if (tag_re.test(pageText)) {
pageText = pageText.replace(tag_re, '');
} else {
getRedirectsFor.push('الگو:' + tag);
}
});
if (!getRedirectsFor.length) {
postRemoval();
return;
}
// Remove tags which appear in page text as redirects
var api = new Morebits.wiki.api('دریافت تغییرمسیرهای الگو', {
'action': 'query',
'prop': 'linkshere',
'titles': getRedirectsFor.join('|'),
'redirects': 1, // follow redirect if the class name turns out to be a redirect page
'lhnamespace': '10', // template namespace only
'lhshow': 'redirect',
'lhlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops
}, function removeRedirectTag(apiobj) {
$(apiobj.responseXML).find('page').each(function(idx, page) {
var removed = false;
$(page).find('lh').each(function(idx, el) {
var tag = $(el).attr('title').slice(9);
var tag_re = new RegExp('\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]*)?\\}\\}\\n?');
if (tag_re.test(pageText)) {
pageText = pageText.replace(tag_re, '');
removed = true;
return false; // break out of $.each
}
});
if (!removed) {
Morebits.status.warn('Info', 'ناتوان در یافتن {{' +
$(page).attr('title').slice(9) + '}} در صفحه... در حال مستثنی کردن');
}
});
postRemoval();
});
api.post();
};
if (!params.tags.length) {
removeTags();
return;
}
var tagRe, tagText = '', tags = [], groupableTags = [], groupableExistingTags = [];
// Executes first: addition of selected tags
/**
* Updates `tagText` with the syntax of `tagName` template with its parameters
* @param {number} tagIndex
* @param {string} tagName
*/
var addTag = function articleAddTag(tagIndex, tagName) {
var currentTag = '';
if (tagName === 'Uncategorized' || tagName === 'Improve categories') {
pageText += '\n\n{{' + tagName + '|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}';
} else {
currentTag += '{{' + tagName;
// fill in other parameters, based on the tag
switch (tagName) {
case 'Cleanup':
currentTag += '|reason=' + params.cleanup;
break;
case 'Close paraphrasing':
currentTag += '|source=' + params.closeParaphrasing;
break;
case 'Copy edit':
if (params.copyEdit) {
currentTag += '|for=' + params.copyEdit;
}
break;
case 'Copypaste':
if (params.copypaste) {
currentTag += '|url=' + params.copypaste;
}
break;
case 'Expand language':
currentTag += '|topic=';
currentTag += '|langcode=' + params.expandLanguageLangCode;
if (params.expandLanguageArticle !== null) {
currentTag += '|otherarticle=' + params.expandLanguageArticle;
}
break;
case 'Expert needed':
if (params.expertNeeded) {
currentTag += '|1=' + params.expertNeeded;
}
if (params.expertNeededTalk) {
currentTag += '|talk=' + params.expertNeededTalk;
}
if (params.expertNeededReason) {
currentTag += '|reason=' + params.expertNeededReason;
}
break;
case 'Globalize':
currentTag += '|1=article';
if (params.globalizeRegion) {
currentTag += '|2=' + params.globalizeRegion;
}
break;
case 'News release':
currentTag += '|1=article';
break;
case 'Notability':
if (params.notability !== 'none') {
currentTag += '|' + params.notability;
}
break;
case 'Not English':
case 'Rough translation':
if (params.translationLanguage) {
currentTag += '|1=' + params.translationLanguage;
}
if (params.translationPostAtPNT) {
currentTag += '|listed=yes';
}
break;
case 'History merge':
currentTag += '|originalpage=' + params.histmergeOriginalPage;
if (params.histmergeReason) {
currentTag += '|reason=' + params.histmergeReason;
}
if (params.histmergeSysopDetails) {
currentTag += '|details=' + params.histmergeSysopDetails;
}
break;
case 'Merge':
case 'Merge to':
case 'Merge from':
params.mergeTag = tagName;
// normalize the merge target for now and later
params.mergeTarget = Morebits.string.toUpperCaseFirstChar(params.mergeTarget.replace(/_/g, ' '));
currentTag += '|' + params.mergeTarget;
// link to the correct section on the talk page, for article space only
if (mw.config.get('wgNamespaceNumber') === 0 && (params.mergeReason || params.discussArticle)) {
if (!params.discussArticle) {
// discussArticle is the article whose talk page will contain the discussion
params.discussArticle = tagName === 'Merge to' ? params.mergeTarget : mw.config.get('wgTitle');
// nonDiscussArticle is the article which won't have the discussion
params.nonDiscussArticle = tagName === 'Merge to' ? mw.config.get('wgTitle') : params.mergeTarget;
var direction = '[[' + params.nonDiscussArticle + ']]' + (params.mergeTag === 'Merge' ? ' with ' : ' into ') + '[[' + params.discussArticle + ']]';
params.talkDiscussionTitleLinked = 'پیشنهاد ادغام ' + direction;
params.talkDiscussionTitle = params.talkDiscussionTitleLinked.replace(/\[\[(.*?)\]\]/g, '$1');
}
currentTag += '|discuss=بحث:' + params.discussArticle + '#' + params.talkDiscussionTitle;
}
break;
default:
break;
}
currentTag += '|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}\n';
tagText += currentTag;
}
};
/**
* Adds the tags which go outside {{multiple issues}}, either because
* these tags aren't supported in {{multiple issues}} or because
* {{multiple issues}} is not being added to the page at all
*/
var addUngroupedTags = function() {
$.each(tags, addTag);
// Smartly insert the new tags after any hatnotes or
// afd, csd, or prod templates or hatnotes. Regex is
// extra complicated to allow for templates with
// parameters and to handle whitespace properly.
pageText = pageText.replace(
new RegExp(
// leading whitespace
'^\\s*' +
// capture template(s)
'(?:((?:\\s*' +
// AfD is special, as the tag includes html comments before and after the actual template
'(?:<!--.*AfD.*\\n\\{\\{(?:Article for deletion\\/dated|AfDM).*\\}\\}\\n<!--.*(?:\\n<!--.*)?AfD.*(?:\\s*\\n))?|' + // trailing whitespace/newline needed since this subst's a newline
// begin template format
'\\{\\{\\s*(?:' +
// CSD
'db|delete|db-.*?|speedy deletion-.*?|' +
// PROD
'(?:proposed deletion|prod blp)\\/dated(?:\\s*\\|(?:concern|user|timestamp|help).*)+|' +
// various hatnote templates
'about|correct title|dablink|distinguish|for|other\\s?(?:hurricaneuses|people|persons|places|uses(?:of)?)|redirect(?:-acronym)?|see\\s?(?:also|wiktionary)|selfref|short description|the' +
// not a hatnote, but sometimes under a CSD or AfD
'|salt|proposed deletion endorsed' +
// end main template name, optionally with a number (such as redirect2)
')\\d*\\s*' +
// template parameters
'(\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?' +
// end template format
'\\}\\})+' +
// end capture
'(?:\\s*\\n)?)' +
// trailing whitespace
'\\s*)?',
'i'), '$1' + tagText
);
removeTags();
};
// Separate tags into groupable ones (`groupableTags`) and non-groupable ones (`tags`)
params.tags.forEach(function(tag) {
tagRe = new RegExp('\\{\\{' + tag + '(\\||\\}\\})', 'im');
// regex check for preexistence of tag can be skipped if in canRemove mode
if (Twinkle.tag.canRemove || !tagRe.exec(pageText)) {
// condition Twinkle.tag.article.tags[tag] to ensure that its not a custom tag
// Custom tags are assumed non-groupable, since we don't know whether MI template supports them
if (Twinkle.tag.article.tags[tag] && Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1) {
groupableTags.push(tag);
} else {
tags.push(tag);
}
} else {
if (tag === 'Merge from' || tag === 'History merge') {
tags.push(tag);
} else {
Morebits.status.warn('Info', 'برچسب {{' + tag +
'}} از پیش در مقاله موجود است...در حال مستثنی کردن');
// don't do anything else with merge tags
if (['Merge', 'Merge to'].indexOf(tag) !== -1) {
params.mergeTarget = params.mergeReason = params.mergeTagOther = null;
}
}
}
});
// To-be-retained existing tags that are groupable
params.tagsToRemain.forEach(function(tag) {
if (Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1) {
groupableExistingTags.push(tag);
}
});
var miTest = /\{\{(multiple ?issues|article ?issues|mi)(?!\s*\|\s*section\s*=)[^}]+\{/im.exec(pageText);
if (miTest && groupableTags.length > 0) {
Morebits.status.info('Info', 'افزودن برچسبهای پشتیبانیشده به درون برچسب {{مشکلات متعدد}} که از پیش موجود بود');
tagText = '';
$.each(groupableTags, addTag);
var miRegex = new RegExp('(\\{\\{\\s*' + miTest[1] + '\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*', 'im');
pageText = pageText.replace(miRegex, '$1' + tagText + '}}\n');
tagText = '';
addUngroupedTags();
} else if (params.group && !miTest && (groupableExistingTags.length + groupableTags.length) >= 2) {
Morebits.status.info('Info', 'گروهبندی برچسبهای پشتیبانیشده درون {{مشکلات متعدد}}');
tagText += '{{Multiple issues|\n';
/**
* Adds newly added tags to MI
*/
var addNewTagsToMI = function() {
$.each(groupableTags, addTag);
tagText += '}}\n';
addUngroupedTags();
};
var getRedirectsFor = [];
// Reposition the tags on the page into {{multiple issues}}, if found with its
// proper name, else moves it to `getRedirectsFor` array to be handled later
groupableExistingTags.forEach(function repositionTagIntoMI(tag) {
var tag_re = new RegExp('(\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]+)?\\}\\}\\n?)');
if (tag_re.test(pageText)) {
tagText += tag_re.exec(pageText)[1];
pageText = pageText.replace(tag_re, '');
} else {
getRedirectsFor.push('الگو:' + tag);
}
});
if (!getRedirectsFor.length) {
addNewTagsToMI();
return;
}
var api = new Morebits.wiki.api('دریافت تغییرمسیرهای الگو', {
'action': 'query',
'prop': 'linkshere',
'titles': getRedirectsFor.join('|'),
'redirects': 1,
'lhnamespace': '10', // template namespace only
'lhshow': 'redirect',
'lhlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops
}, function replaceRedirectTag(apiobj) {
$(apiobj.responseXML).find('page').each(function(idx, page) {
var found = false;
$(page).find('lh').each(function(idx, el) {
var tag = $(el).attr('title').slice(9);
var tag_re = new RegExp('(\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]*)?\\}\\}\\n?)');
if (tag_re.test(pageText)) {
tagText += tag_re.exec(pageText)[1];
pageText = pageText.replace(tag_re, '');
found = true;
return false; // break out of $.each
}
});
if (!found) {
Morebits.status.warn('Info', 'ناتوان در یافتن الگوی تز پیش موجود {{' +
$(page).attr('title').slice(9) + '}} در صفحه... چشمپوش از جایگذاری مجدد');
}
});
addNewTagsToMI();
});
api.post();
} else {
tags = tags.concat(groupableTags);
addUngroupedTags();
}
},
redirect: function redirect(pageobj) {
var params = pageobj.getCallbackParameters(),
pageText = pageobj.getPageText(),
tagRe, tagText = '', summaryText = 'افزودن برچسب',
tags = [], i;
for (i = 0; i < params.tags.length; i++) {
tagRe = new RegExp('(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im');
if (!tagRe.exec(pageText)) {
tags.push(params.tags[i]);
} else {
Morebits.status.warn('Info', 'برچسب {{' + params.tags[i] +
'}} از پیش در صفحهٔ تغییرمسیر موجود است...در حال مستثنی کردن');
}
}
var addTag = function redirectAddTag(tagIndex, tagName) {
tagText += '\n{{' + tagName;
if (tagName === 'R from alternative language') {
if (params.altLangFrom) {
tagText += '|from=' + params.altLangFrom;
}
if (params.altLangTo) {
tagText += '|to=' + params.altLangTo;
}
}
tagText += '}}';
if (tagIndex > 0) {
if (tagIndex === (tags.length - 1)) {
summaryText += ' و';
} else if (tagIndex < (tags.length - 1)) {
summaryText += '،';
}
}
summaryText += ' {{[[:' + (tagName.indexOf(':') !== -1 ? tagName : 'الگو:' + tagName + '|' + tagName) + ']]}}';
};
tags.sort();
$.each(tags, addTag);
// Check for all Rcat shell redirects (from #433)
if (pageText.match(/{{(?:redr|این یک تغییرمسیر است|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
// Regex inspired by [[User:Kephir/gadgets/sagittarius.js]] ([[Special:PermaLink/831402893]])
var oldTags = pageText.match(/(\s*{{[A-Za-zا-ی ]+\|)((?:[^|{}]*|{{[^}]*}})+)(}})\s*/i);
pageText = pageText.replace(oldTags[0], oldTags[1] + tagText + oldTags[2] + oldTags[3]);
} else {
// Fold any pre-existing Rcats into taglist and under Rcatshell
var pageTags = pageText.match(/\n{{(تغییرمسیر|R(?:edirect)?) .*?}}/img); //localized to match "تغییرمسیر از..." templates
var oldPageTags = '';
if (pageTags) {
pageTags.forEach(function(pageTag) {
var pageRe = new RegExp(pageTag, 'img');
pageText = pageText.replace(pageRe, '');
oldPageTags += pageTag;
});
}
pageText += '\n{{پوسته رده تغییرمسیر|' + tagText + oldPageTags + '\n}}';
}
summaryText += (tags.length > 0 ? '' + (tags.length > 1 ? '' : '') : '') + ' به تغییرمسیر'; // "tags" not needed in Persian
// avoid truncated summaries
if (summaryText.length > (499 - Twinkle.getPref('summaryAd').length)) {
summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, '$1');
}
pageobj.setPageText(pageText);
pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
pageobj.setCreateOption('nocreate');
pageobj.save();
if (params.patrol) {
pageobj.triage();
}
},
file: function friendlytagCallbacksFile(pageobj) {
var text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
var summary = 'افزودن برچسب ';
// Add maintenance tags
if (params.tags.length) {
var tagtext = '', currentTag;
$.each(params.tags, function(k, tag) {
// when other commons-related tags are placed, remove "move to Commons" tag (or "انتقال به ویکیانبار" tag)
if (['Keep local', 'subst:ncd', 'Do not move to Commons_reason', 'Do not move to Commons',
'Now Commons', 'به ویکیانبار انتقال ندهید', 'نگاره آمریکا مغایر با ویکیانبار'].indexOf(tag) !== -1) {
text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons|انتقال به ویکیانبار|انتقال به انبار|نامزد انتقال به انبار|[Cc]tC)[^}]*\}\}/gi, '');
}
currentTag = '{{' + (tag === 'Do not move to Commons_reason' ? 'Do not move to Commons' : tag);
switch (tag) {
case 'subst:ncd':
if (params.ncdName !== '') {
currentTag += '|1=' + params.ncdName;
}
break;
case 'Keep local':
if (params.keeplocalName !== '') {
currentTag += '|1=' + params.keeplocalName;
}
break;
case 'Rename media':
if (params.renamemediaNewname !== '') {
currentTag += '|1=' + params.renamemediaNewname;
}
if (params.renamemediaReason !== '') {
currentTag += '|2=' + params.renamemediaReason;
}
break;
case 'Cleanup image':
currentTag += '|1=' + params.cleanupimageReason;
break;
case 'Image-Poor-Quality':
currentTag += '|1=' + params.ImagePoorQualityReason;
break;
case 'Low quality chem':
currentTag += '|1=' + params.lowQualityChemReason;
break;
case 'Vector version available':
text = text.replace(/\{\{((convert to |convertto|should be |shouldbe|to)?svg|badpng|vectorize)[^}]*\}\}/gi, '');
/* falls through */
case 'PNG version available':
/* falls through */
case 'Obsolete':
currentTag += '|1=' + params[tag.replace(/ /g, '_') + 'File'];
break;
case 'Do not move to Commons_reason':
currentTag += '|reason=' + params.DoNotMoveToCommons;
break;
case 'subst:orfurrev':
// remove {{non-free reduce}} and redirects
text = text.replace(/\{\{\s*(Template\s*:\s*)?(Non-free reduce|FairUseReduce|Fairusereduce|Fair Use Reduce|Fair use reduce|Reduce size|Reduce|Fair-use reduce|Image-toobig|Comic-ovrsize-img|Non-free-reduce|Nfr|Smaller image|Nonfree reduce)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, '');
currentTag += '|date={{subst:date}}';
break;
case 'Copy to Commons':
currentTag += '|human=' + mw.config.get('wgUserName');
break;
case 'Should be SVG':
currentTag += '|' + params.svgCategory;
break;
default:
break; // don't care
}
currentTag += '}}\n';
tagtext += currentTag;
summary += '{{' + tag + '}}, ';
});
if (!tagtext) {
pageobj.getStatusElement().warn('عملیات توسط کاربر لغو شد؛ کاری برای انجام نیست');
return;
}
text = tagtext + text;
}
pageobj.setPageText(text);
pageobj.setEditSummary(summary.substring(0, summary.length - 2) + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
pageobj.setCreateOption('nocreate');
pageobj.save();
if (params.patrol) {
pageobj.triage();
}
}
};
Twinkle.tag.callback.evaluate = function friendlytagCallbackEvaluate(e) {
var form = e.target;
var params = {};
if (form.patrolPage) {
params.patrol = form.patrolPage.checked;
}
// Don't return null if there aren't any available tags
params.tags = form.getChecked(Twinkle.tag.mode + 'Tags') || [];
// Save values of input fields into params object. This works as quickform input
// fields within subgroups of elements with name 'articleTags' (say) have their
// name attribute as 'articleTags.' + name of the subgroup element
var name_prefix = Twinkle.tag.mode + 'Tags.';
$(form).find("[name^='" + name_prefix + "']:not(div)").each(function(idx, el) {
// el are the HTMLInputElements, el.name gives the name attribute
params[el.name.slice(name_prefix.length)] =
el.type === 'checkbox' ? form[el.name].checked : form[el.name].value;
});
switch (Twinkle.tag.mode) {
case 'article':
params.tagsToRemove = form.getUnchecked('alreadyPresentArticleTags') || [];
params.tagsToRemain = form.getChecked('alreadyPresentArticleTags') || [];
params.reason = form.reason.value.trim();
params.group = form.group.checked;
// Validation
if ((params.tags.indexOf('Merge') !== -1) || (params.tags.indexOf('Merge from') !== -1) ||
(params.tags.indexOf('Merge to') !== -1)) {
if (((params.tags.indexOf('Merge') !== -1) + (params.tags.indexOf('Merge from') !== -1) +
(params.tags.indexOf('Merge to') !== -1)) > 1) {
alert('لطفاً تنها یکی از برچسبهای {{merge}}، {{merge from}}، و {{merge to}} را انتخاب کنید. اگر به چندین ادغام نیاز است، از {{merge}} استفاده کنید و نام مقالهها را با خط عمودی از هم جدا کنید (هرچند که در این حالت توینکل قادر به برچسبزدن به سایر مقالهها بهصورت خودکار نخواهد بود).');
return;
}
if (!params.mergeTarget) {
alert('لطفاً عنوان مقالهٔ دیگر را برای استفاده در الگوی ادغام مشخص کنید.');
return;
}
if ((params.mergeTagOther || params.mergeReason) && params.mergeTarget.indexOf('|') !== -1) {
alert('در حال حاضر برچسبزدن چندین مقاله برای ادغام، و آغاز یک بحث برای چندین مقاله پشتیبانی نمیشود. لطفاً گزینهٔ «برچسبزدن مقالهٔ دیگر» را غیرفعال کنید، و/یا جعبهٔ «دلیل» را خالی کرده و دوباره تلاش کنید.');
return;
}
}
if ((params.tags.indexOf('Not English') !== -1) && (params.tags.indexOf('Rough translation') !== -1)) {
alert('لطفاً تنها یکی از برچسبهای {{not English}} و {{rough translation}} را انتخاب کنید.');
return;
}
if (params.tags.indexOf('History merge') !== -1 && params.histmergeOriginalPage.trim() === '') {
alert('برای افزودن برچسب {{ادغام تاریخچه}}، باید صفحهای را برای ادغام مشخص کنید.');
return;
}
if (params.tags.indexOf('Cleanup') !== -1 && params.cleanup.trim() === '') {
alert('لازم است دلیلی را برای برچسب {{تمزیکاری}} مشخص کنید.');
return;
}
if (params.tags.indexOf('Expand language') !== -1 && params.expandLanguageLangCode.trim() === '') {
alert('لازم است که شناسهٔ زبان را برای برچسب {{expand language}} مشخص کنید.');
return;
}
break;
case 'file':
if (params.tags.indexOf('Cleanup image') !== -1 && params.cleanupimageReason === '') {
alert('لازم است که دلیلی را برای برچسب تمیزکاری مشخص کنید.');
return;
}
if (params.tags.indexOf('Image-Poor-Quality') !== -1 && params.ImagePoorQualityReason === '') {
alert('لازم است که دلیلی را برای برچسب {{Image-Poor-Quality}} مشخص کنید');
return;
}
if (params.tags.indexOf('Low Quality Chem') !== -1 && params.lowQualityChemReason === '') {
alert('لازم است که دلیلی را برای برچسب {{Low Quality Chem}} مشخص کنید');
return;
}
if ((params.tags.indexOf('Obsolete') !== -1 && params.ObsoleteFile === '') ||
(params.tags.indexOf('PNG version available') !== -1 && params.PNG_version_availableFile === '') ||
(params.tags.indexOf('Vector version available') !== -1 && params.Vector_version_availableFile === '')
) {
alert('لازم است که نام پروندهای جایگزین برای یک برچسب را در فهرست برچسبهای جایگزینی مشخص کنید');
return;
}
if (params.tags.indexOf('Do not move to Commons_reason') !== -1 && params.DoNotMoveToCommons === '') {
alert('لازم است که دلیلی را برای برچسب {{Do not move to Commons}} مشخص کنید');
return;
}
break;
case 'redirect':
break;
default:
alert('Twinkle.tag: حالت ناشناختهٔ ' + Twinkle.tag.mode);
break;
}
// File/redirect: return if no tags selected
// Article: return if no tag is selected and no already present tag is deselected
if (params.tags.length === 0 && (Twinkle.tag.mode !== 'article' || params.tagsToRemove.length === 0)) {
alert('لازم است که دست کم یک برچسب را انتخاب کنید!');
return;
}
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
Morebits.wiki.actionCompleted.redirect = Morebits.pageNameNorm;
Morebits.wiki.actionCompleted.notice = 'برچسب زدن کامل شد، بارگیری مجدد مقاله تا چند ثانیه دیگر';
if (Twinkle.tag.mode === 'redirect') {
Morebits.wiki.actionCompleted.followRedirect = false;
}
// Localized: Following "tagModeLoc" variable is defined to localize progress messages
// e.g. «برچسبزدن article» to «برچسبزدن مقاله»
// can't change initial "Twinkle.tag.mode" variable because
// it is used to define some parameters like the one in L-639
var tagModeLoc;
if (Twinkle.tag.mode === 'article') {
tagModeLoc = 'مقاله';
} else if (Twinkle.tag.mode === 'file') {
tagModeLoc = 'پرونده';
} else {
tagModeLoc = 'تغییرمسیر';
}
var wikipedia_page = new Morebits.wiki.page(Morebits.pageNameNorm, 'برچسبزدن ' + tagModeLoc);
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.tag.callbacks[Twinkle.tag.mode]);
};
})(jQuery);
// </nowiki>