پرش به محتوا

کاربر:Jeeputer/GANNominator.js: تفاوت میان نسخه‌ها

از ویکی‌پدیا، دانشنامهٔ آزاد
محتوای حذف‌شده محتوای افزوده‌شده
بدون خلاصۀ ویرایش
مشکل مطرح‌شده در ویژه:پیوند دائمی/34392130#ابزار بستن درخواست ویرایش و ابزار نامزدی گمخ احتمالاً با این ویرایش باید رفع شود
خط ۲۱۴: خط ۲۱۴:
create = false;
create = false;
loadPage(page).then(function(content) {
loadPage(page).then(function(content) {
newContet = content.replace(lookupR, lookup + toAdd + '\n\n==');
newContet = content.replace(lookupR, lookup + toAdd);
return savePage(
return savePage(
page,
page,
خط ۳۰۳: خط ۳۰۳:
'به آنچه بالای این خط هست دست نزنید. پیش از نظردادن حتماً سردر وپ:گمخ را به‌دقت بخوانید. -->\n';
'به آنچه بالای این خط هست دست نزنید. پیش از نظردادن حتماً سردر وپ:گمخ را به‌دقت بخوانید. -->\n';


var talkPageLookupR = /}}\n+==/;
var talkPageLookupR = /^.*(}}\n*)/s;


var talkPageTemplate = '{{پیشنهاد خوبیدگی' + (templateContent[0][1] >= 2 ? '| نوبت = ' + convertNumber(templateContent[0][1]) : '') + '}}';
var talkPageTemplate = '{{پیشنهاد خوبیدگی' + (templateContent[0][1] >= 2 ? '| نوبت = ' + convertNumber(templateContent[0][1]) : '') + '}}';

نسخهٔ ‏۲۷ مارس ۲۰۲۲، ساعت ۱۶:۴۴

//<nowiki>
/************************************************************************************
 *				Gadget to easily nominate articles in WP:GAN (وپ:گمخ)				*
 *			   Original authors: User:Jeeputer & User:Ebrahim (fawiki)				*
 *						   Only tested on the Vector skin							*
 ***********************************************************************************/
mw.loader.using(["oojs-ui-core", "oojs-ui-windows", "oojs-ui-widgets"], function() {
    var config = mw.config.get([
        'wgPageName',
        'wgUserGroups',
        'wgNamespaceNumber',
        'wgTitle',
    ]);

    var advert = ' ([[کاربر:Jeeputer/GANNominator.js|ابزار گمخ]]';

    var GANnomFieldset = new OO.ui.FieldsetLayout({
        title: 'پیشاخوبیدگی',
        align: 'inline'
    });

    GANnomFieldset.addItems([
        new OO.ui.FieldLayout(new OO.ui.NumberInputWidget({
            min: 2
        }), {
            data: 'نوبت',
            align: 'top',
            label: 'نوبت نامزدی',
            help: new OO.ui.HtmlSnippet(['آیا مقاله در گذشته هم برای خوبیدگی نامزد شده؟<br />اگر بله، نوبت نامزدی جدید را در کادر زیر انتخاب کنید.']),
        }),
        new OO.ui.FieldLayout(new OO.ui.MultilineTextInputWidget({
            rows: 2,
            validate: 'non-empty',
            title: 'توضیحات پیرامون نامزدی؛ هر چند سطر که لازم است بنویسید',
            autosize: true,
            indicator: 'required'
        }), {
            data: 'توضیح',
            align: 'top',
            label: 'توضیحات',
            help: new OO.ui.HtmlSnippet(['در اینجا بنویسید که چرا فکر می‌کنید مقاله شایستهٔ خوبیدگی است. در تعداد سطرها محدودیتی وجود ندارد.<br />اگر بعداً خواستید مطلب دیگری هم در صفحهٔ نظرخواهی ذکر کنید، می‌توانید پس از ایجاد، به صفحهٔ نظرخواهی رفته و بر روی دکمهٔ «ویرایش» کلیک کنید.']),
        }),
        new OO.ui.FieldLayout(new OO.ui.ButtonSelectWidget({
            items: ['بله', 'خیر', 'تا حدودی'].map(function(x) {
                return new OO.ui.ButtonOptionWidget({
                    data: x,
                    label: x
                });
            })
        }), {
            data: 'ترجمه',
            label: 'آیا مقاله ترجمه‌ای از ویکی‌های دیگر است؟',
            align: 'left'
        })
    ]);


    GANnomFieldset.addItems([{
            data: 'بررسی املا و انشا',
            label: 'بررسی املا و انشا',
            help: 'نامزدکننده باید متن مقاله را بادقت از بالا تا پایین بخواند و مقاله را از لحاظ نبود اغلاط املایی و انشایی بررسی کند'
        },
        {
            data: 'دیباچه مناسب',
            label: 'نگارش دیباچهٔ مناسب',
            help: '<span>دیباچه مقالات ویکی‌پدیا خلاصه‌ای از مهم‌ترین مطالب مطرح‌شده در کل مقاله هستند. توضیحات بیشتر در <a href = "/wiki/وپ:بخش_آغازین">وپ:بخش آغازین</a></span>'
        },
        {
            data: 'منبع‌دارکردن',
            label: 'منبع‌دار کردن مطالب',
            help: 'همهٔ محتوای مقاله باید منبع‌دار باشد. البته بخش آغازین مقاله، و نیز جعبهٔ اطلاعات، اگر مطالبشان در جای دیگری از مقاله ذکر شده‌است معمولاً نیازی به ذکر منبع برایشان نیست.'
        },
        {
            data: 'یادکرد استاندارد',
            label: 'یادکردهای استاندارد',
            help: '<span>نخست <a href="/wiki/وپ:شام">شیوه ارجاع به منابع</a> را بخوانید و سپس یادکردها را با <a href="/wiki/رده:الگو:یادکرد">الگوهای یادکرد</a> استاندارد کنید. توضیحات هریک از الگوهای یادکرد را هم به‌دقت بخوانید</span>.'
        },
        {
            data: 'منابع معتبر',
            label: 'منابع معتبر',
            help: 'سایت‌های <a href="/wiki/ویکی">ویکی</a> (ازجمله ویکی‌پدیاهای زبان‌های دیگر)، سایت‌های <a href="/wiki/وپ:بلاگ">وبلاگی</a>، و ... منابع معتبری نیستند. اگر در مقاله از چنین منابعی استفاده شده‌است حتماً با منابعی معتبرتر جایگزینش کنید. اگر پیرامون اعتبار منبعی شک دارید در <a href="/wiki/ویکی‌پدیا:تابلوی_اعلانات_منابع_معتبر">تابلوی اعلانات منابع معتبر</a> مطرحش کنید. توضیحات کامل‌تر در <a href="/wiki/وپ:معتبر">وپ:معتبر</a>.'
        },
        {
            data: 'حق نشر',
            label: 'حق نشر',
            help: 'کپی کردن از متن وبگاه‌ها یا کتاب‌ها در مقاله‌های ویکی‌پدیا مجاز نیست. حتی ترجمهٔ تحت‌الفظی از متون خارجی نیز ناقض قانون حق نشر است. باید منبع را مطالعه کرد، سپس آن را بست و چکیده‌ای از مطالب را با انشای خود نوشت. توضیحات بیشتر در <a href="/wiki/وپ:حق_نشر">وپ:حق نشر</a>.'
        },
        {
            data: 'جعبه اطلاعات و جعبه گشتن',
            label: 'جعبه اطلاعات و ناوباکس',
            help: 'تقریباً هر مقاله‌ای می‌تواند یک (یا گاه چند) جعبهٔ اطلاعات داشته باشد. برای یافتن جعبهٔ مورد نظرتان <a href="/wiki/رده:الگو:جعبه‌های_اطلاعات">این رده</a> را ببینید. اگر جعبهٔ مورد نیازتان در ویکی‌پدیای فارسی موجود نبود در <a href="/wiki/وپ:دال">وپ:دال</a> یا <a href="/wiki/وپ:فنی">قهوه‌خانهٔ فنی</a> درخواست دهید تا ساخته شود.<br />منظور از جعبهٔ گشتن همان الگوهای جعبه‌ای است که در انتهای مقاله‌هاست. اگر الگویی مورد نیاز بود که در ویکی‌پدیای فارسی موجود نبود، مثل بالا درخواست دهید. همچنین می‌توانید از طریق میان‌ویکی‌ها مقاله‌های همسنگ در ویکی‌های زبان‌های دیگر را بررسی کنید تا ببینید آن‌ها از چه الگوهایی استفاده کرده‌اند.'
        },
        {
            data: 'رده و میان‌ویکی',
            label: 'رده‌بندی و میان‌ویکی',
            help: '<a href="/wiki/وپ:رده‌بندی">وپ:رده‌بندی</a> را بخوانید. خود رده‌هایی را هم که می‌افزایید بررسی کنید تا به‌خوبی رده‌بندی شده باشند. <br />میان‌ویکی‌ها باید به طور دستی بررسی شوند که آیا به مقالهٔ درستی می‌رسند یا نه. همچنین نباید تداخل میان‌ویکیایی وجود داشته باشد.'
        },
        {
            data: 'تصویر',
            label: 'تصویر',
            help: 'می‌توانید نخست از طریق میان‌ویکی‌ها مقاله‌های همسنگ در ویکی‌های دیگر را بررسی کنید تا تصاویر خوبی بیابید. سپس به <a href="https://commons.wikimedia.org/wiki/">ویکی‌انبار</a> بروید، آنجا انباری است از پرونده‌های چندرسانه‌ای آزاد. اگر تصویر مورد نیازتان موجود نبود، <a href="/wiki/وپ:درخواست_تصویر">اینجا</a> درخواست دهید. حواستان به <a href="/wiki/وپ:حق نشر">حق نشر</a> تصاویر نیز باشد.'
        },
        {
            data: 'پروژه‌های خواهر',
            label: 'پروژه‌های خواهر',
            help: 'منظور این نیست که فقط یک الگوی {{<a href="/wiki/الگو:جعبه_پیوند_به_پروژه‌های_خواهر">جعبه پیوند به پروژه‌های خواهر</a>}} به بخش «پیوند به بیرون» بیفزایید و تمام؛ بلکه باید خودتان شخصاً در پروژه‌های خواهر بگردید و محتوای مربوطه را بیابید، و عنوان آن را در الگوی {{<a href="/wiki/الگو:در_پروژه‌های_خواهر">در پروژه‌های خواهر</a>}} وارد کنید (این الگو با الگویی که پیشتر ذکر شد متفاوت است). اگر محتوایی وجود نداشت، گاه لازم است که ایجادش کنید.'
        }
    ].map(function(item) {
        return new OO.ui.FieldLayout(new OO.ui.ButtonSelectWidget({
            items: ['شد', 'نشد', 'در حال انجام'].map(function(x) {
                return new OO.ui.ButtonOptionWidget({
                    data: x,
                    label: x
                });
            })
        }), {
            data: item.data,
            label: item.label,
            align: 'left',
            help: new OO.ui.HtmlSnippet([item.help])
        });
    }));

    function convertNumber(number) {
        return mw.language.convertNumber(number);
    }

    function pageDoesntExist(page) {
        return new mw.Api().get({
            action: 'query',
            titles: page,
            format: 'json',
            formatversion: 2
        }).then(function(data) {
            return Object.values(data.query.pages)[0].missing;
        });
    }

    function loadPage(title) {
        return new mw.Api().get({
            action: 'query',
            prop: 'revisions',
            titles: title,
            rvprop: 'content',
            format: 'json'
        }).then(function(data) {
            return Object.values(data.query.pages)[0].revisions[0]['*'];
        });

    }

    function savePage(title, text, summary, create) {
        return new mw.Api().post({
            action: 'edit',
            title: title,
            text: text,
            summary: summary,
            createonly: create,
            minor: true,
            token: mw.user.tokens.get('csrfToken')
        });
    }


    function editAndSave(mode, page, lookup, lookupR, toAdd, summary, create) {
        // If there is something to look for and replace with something else, use lookup,
        // otherwise, set it to false
        // If the page has to be created, set create to true 

        // Discussion and preGAN pages: "create = true" & "lookup = false"
        // وپ:گمخ and الگو:قهوه‌خانه/خوب و برگزیده: "create: false" & "lookup: <some content>"
        // article talk page: depending on the page's existance

        var newContent;

        if (mode == 'preGAN' || mode == 'discussion') { // discussion and preGAN creation
            return savePage(
                page,
                toAdd,
                summary,
                create
            );
        } else if (mode == 'wpGAN') { // edit وپ:گمخ
            loadPage(page).then(function(content) {
                newContent = content.replace(lookup, lookup + toAdd);
                return savePage(
                    page,
                    newContent,
                    summary,
                    create
                );
            });
        } else if (mode == 'vp') { // edit الگو:قهوه‌خانه/خوب و برگزیده
            loadPage(page).then(function(content) {
                newContent = content.replace(lookup, toAdd + lookup);
                return savePage(
                    page,
                    newContent,
                    summary,
                    create
                );
            });
        } else if (mode == 'talk') {
            if (pageDoesntExist(page)) { // If the talk page does not exists
                create = true;
                newContent = '{{رتب}}\n{{بصب}}\n' + toAdd;
                savePage(
                    page,
                    newContent,
                    summary,
                    create // createonly: true
                );
            } else { // talk page exists, so just add the template to the top
                create = false;
                loadPage(page).then(function(content) {
                    newContet = content.replace(lookupR, lookup + toAdd);
                    return savePage(
                        page,
                        newContent,
                        summary,
                        create // createonly: false
                    );
                });
            }
        }
    }

    function GANnomProcessDialog(config) {
        GANnomProcessDialog.super.call(this, config);
    }
    OO.inheritClass(GANnomProcessDialog, OO.ui.ProcessDialog);

    GANnomProcessDialog.static.name = 'GANnomProcessDialog';
    GANnomProcessDialog.static.title = 'خوبیدگی «' + config.wgTitle + '»';
    GANnomProcessDialog.static.actions = [{
        action: 'save',
        label: 'تأیید',
        flags: 'primary'
    }, {
        label: 'لغو',
        flags: 'safe'
    }];

    GANnomProcessDialog.prototype.initialize = function() {
        GANnomProcessDialog.super.prototype.initialize.apply(this, arguments);
        this.content = new OO.ui.PanelLayout({
            scrollable: true,
            padded: true,
            expanded: false
        });
        this.content.$element.append(GANnomFieldset.$element);
        this.$body.append(this.content.$element);
    };
    GANnomProcessDialog.prototype.getActionProcess = function(action) {
        var dialog = this;
        if (action) {
            var templateContent = GANnomFieldset.items.map(function(item) {
                var value;
                if (item.fieldWidget.indicatorElement) value = item.fieldWidget.indicatorElement.value;
                else value = (item.fieldWidget.items.filter(function(option) {
                    return option.active;
                })[0] || {}).label;
                return [item.data, value];
            });

            var summaries = {
                talk: 'افزودن برچسب {{[[الگو:پیشنهاد خوبیدگی|پیشنهاد خوبیدگی]]}}' + advert,
                pregan: 'ایجاد صفحهٔ پیشاخوبیدگی جهت نامزدی مقاله در [[وپ:گمخ]]' + advert,
                discuss: 'ایجاد نظرخواهی' + advert,
                gan: 'تراگنجانش [[ویکی‌پدیا:گزیدن مقاله‌های خوب/' + config.wgTitle +
                    (templateContent[0][1] >= 2 ? ' ' + convertNumber(templateContent[0][1]) : '') +
                    '|نظرخواهی]] خوبیدگی برای [[' + config.wgTitle + ']]' + advert,
                vptemp: 'فهرست کردن  [[ویکی‌پدیا:گزیدن مقاله‌های خوب/' + config.wgTitle +
                    (templateContent[0][1] >= 2 ? ' ' + convertNumber(templateContent[0][1]) : '') +
                    '|نظرخواهی]] خوبیدگی برای [[' + config.wgTitle + ']]' + advert,
            };

            var preGANTemplate = '{{پیشاخوبیدگی ۲\n\n <!-- توسط نامزدکننده پر می‌شود: -->\n' +
                templateContent.slice(2).map(function(item) {
                    return '| ' + item[0] + ' = ' + item[1];
                }).join('\n') + '\n' +
                '<!-- توسط ربات یا ربات‌ران پر می‌شود: -->\n' +
                '| ربات = \n| توضیح ربات = \n\n' +
                '<!-- توسط ناظر پر می‌شود: -->\n' +
                '| بررسی املا و انشا-ناظر = \n' + '| دیباچه مناسب-ناظر = \n' +
                '| منبع‌دارکردن-ناظر = \n' + '| یادکرد استاندارد-ناظر = \n' +
                '| منابع معتبر-ناظر = \n' + '| حق نشر-ناظر = \n' +
                '| جعبه اطلاعات و جعبه گشتن-ناظر = \n' + '| رده و میان‌ویکی-ناظر = \n' +
                '| تصویر-ناظر = \n' + '| پروژه‌های خواهر-ناظر = \n' +
                '| ربات-ناظر = \n' + '| امضا-ناظر = \n' +
                '<!-- به این بخش دست نزنید: -->\n' +
                '| نام = {{subst:BASEPAGENAME}}\n| نام۲ = {{subst:BASEPAGENAMEE}}\n}}';

            var ganSubpageContentPreload = '== {{subst:SUBPAGENAME}} ==\n' +
                '{{گمخ/مقاله|{{subst:SUBPAGENAME}}|' +
                (templateContent[0][1] >= 2 ? convertNumber(templateContent[0][1]) : '') + '}}\n\n' +
                "'''نامزدکننده:''' " + '{{Userv|{{subst:REVISIONUSER}}}}\n\n' +
                "'''تاریخ نامزد کردن:''' " + '~~~~~\n' +
                '* {{قلم رنگ||طلایی|{{formatnum:{{سن به روز|{{جا:سال‌کنونی}}|{{جا:ماه}}|{{جا:روز۲}}}}}} روز پیش نامزد شده‌است.}}\n' +
                '* ' + templateContent[1][1] + ' ~~~~\n'
                '<!-- ***توجه***: لطفاً نظرتان را زیر این خط قرار دهید. صفحه را به موافق و مخالف بخش‌بندی نکنید. ' +
                'هر نظر جدید با ستاره (*) آغاز شود و زیر آخرین نظر آید. ' +
                'به آنچه بالای این خط هست دست نزنید. پیش از نظردادن حتماً سردر وپ:گمخ را به‌دقت بخوانید. -->\n';

            var talkPageLookupR = /^.*(}}\n*)/s;

            var talkPageTemplate = '{{پیشنهاد خوبیدگی' + (templateContent[0][1] >= 2 ? '| نوبت = ' + convertNumber(templateContent[0][1]) : '') + '}}';

            var ganMainPageLookup = 'تازه‌تر، بالاتر -->\n';

            var ganMainPageTransclude = '{{/' + config.wgTitle + (templateContent[0][1] >= 2 ? ' ' + convertNumber(templateContent[0][1]) : '') + '}}\n';

            var villagePumpHeaderLookup = '\n\n[[File:FA_candidate_gold.svg';

            var villagePumpTextToAdd = '\n{{•}} [[ویکی‌پدیا:گزیدن مقاله‌های خوب/' + config.wgTitle +
                (templateContent[0][1] >= 2 ? ' ' + convertNumber(templateContent[0][1]) : '') +
                '|' + config.wgTitle + (templateContent[0][1] >= 2 ? ' (' + convertNumber(templateContent[0][1]) + ')' : '') + ']]';

            // Edit article's talk page
            editAndSave(
            	'talk',
                'بحث:' + config.wgTitle,
                '}}\n',
                talkPageLookupR,
                talkPageTemplate + '\n',
                summaries.talk
            );

            // Create preGAN subpage: بحث:مقاله/پیشاخوبیدگی[ نوبت]
            editAndSave(
            	'preGAN',
                'بحث:' + config.wgTitle + '/پیشاخوبیدگی' + (templateContent[0][1] >= 2 ? ' ' + convertNumber(templateContent[0][1]) : ''),
                false,
                '',
                preGANTemplate,
                summaries.pregan,
                true
            );

            // Create discussion page
            editAndSave(
            	'discussion',
                'ویکی‌پدیا:گزیدن مقاله‌های خوب/' + config.wgTitle + (templateContent[0][1] >= 2 ? ' ' + convertNumber(templateContent[0][1]) : ''),
                false,
                '',
                ganSubpageContentPreload,
                summaries.discuss,
                true
            );

            // Edit وپ:گمخ and transclude the discussion page
            editAndSave(
            	'wpGAN',
                'ویکی‌پدیا:گزیدن مقاله‌های خوب',
                ganMainPageLookup,
                '',
                ganMainPageTransclude,
                summaries.gan,
                false
            );

            // Edit الگو:قهوه‌خانه/خوب و برگزیده and add link to the discussion page to the top
            editAndSave(
            	'vp',
                'الگو:قهوه‌خانه/خوب و برگزیده',
                villagePumpHeaderLookup,
                '',
                villagePumpTextToAdd,
                summaries.vptemp,
                false
            );

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

    var windowManager = new OO.ui.WindowManager();
    if (config.wgUserGroups.indexOf('autoconfirmed') != -1 && config.wgNamespaceNumber === 0 || config.wgNamespaceNumber === 1 || config.wgPageName == 'کاربر:Jeeputer/jsPractice2.js') { // Only on article and article talk pages
        $(mw.util.addPortletLink('p-cactions', '#', 'نامزدی در گمخ', 'ca-gan-nom', 'نامزد کردن مقاله برای خوبیدگی')).on('click', function(e) {
            e.preventDefault();
            $(document.body).append(windowManager.$element);
            var dialog = new GANnomProcessDialog();
            windowManager.addWindows([dialog]);
            windowManager.openWindow(dialog);
        });
    }
});
//</nowiki>