Jump to content

User:SD0001/RFUD-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by SD0001 (talk | contribs) at 07:06, 16 May 2019 (add nowiki). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/**
 * ****** STILL UNDER DEVELOPMENT ******
 *
 * Script to easily respond to requests made at [[Wp:Requests for undeletion]]
 * (WP:RFUD). When accepting a request, the script would do the following:
 * - Post a response below the request
 * - Undelete the page
 * - Remove any deletion tags from the page
 * - Undelete the talk page if it existed
 * - If is a WP/WT:AFC subpage, move it to draft namespace
 * - Offer to userfy the page instead of restoring to source
 *
 */

// <nowiki>
$( function() {

if (mw.config.get('wgPageName') !== 'Wikipedia:Requests_for_undeletion') {
    return;
}

// Load morebits.js library if not already present
importScript('Mediawiki:Gadget-Morebits.js');

var rfud = {};

rfud.config = {
    advert: ' ([[User:SD0001/rfud-helper.js|rfud-helper]])',
    version: '1.0.0'
};

var pageName;

$('h2').next().each(function(i,e) {
    var a = $(e).find('li .sysop-show a');
    var link = '<a class=rfud-undel>undelete</a>'
    a.after(' | ' + link);

});

rfud.callback = function(e) {
    pageName = e.target.parentElement.firstChild.nextElementSibling.title.slice(17).replace(/_/g,' ');
    console.log(pageName);

    var Window = new Morebits.simpleWindow( 700, 350 );
	//Window.setTitle( "Undelete page" );
	Window.setScriptName( "RFUD helper" );
	Window.addFooterLink( "Administrator instructions", "Wikipedia:Requests for undeletion/Administrator instructions" );
	// Window.addFooterLink( "Script documentation", "WP:RFUDHELPER" );

    var form = new Morebits.quickForm( rfud.evaluate );
    var field = form.append({
        type: 'field',
        label: 'Response'
    });

    field.append({
        type: 'radio',
        name: 'response',
        list: [
            {
                label: 'Accept',
                value: 'accept',
                checked: true
            },
            {
                label: 'Decline',
                value: 'decline'
            }
        ],
        event: rfud.toggleResponse
    });

    form.append( {
        type: 'field',
        label: 'Work area',
        name: 'work_area'
    } );

    // code here is copied off [[Mediawiki:Gadget-Twinklexfd.js]]
    var previewlink = document.createElement( 'a' );
	$(previewlink).click(function(){
		rfud.preview(result);  // |result| is defined below
	});
	previewlink.style.cursor = "pointer";
	previewlink.textContent = 'Preview';
	form.append( { type: 'div', id: 'rfudpreview', label: [ previewlink ] } );
	form.append( { type: 'div', id: 'rfud-previewbox', style: 'display: none' } );

    form.append( { type:'submit' } );

    var result = form.render();
	Window.setContent( result );
    Window.display();
    result.previewer = new Morebits.wiki.preview($(result).find('div#rfud-previewbox').last()[0]);

    // We must init the controls
	var evt = document.createEvent( "Event" );
	evt.initEvent( 'change', true, true );
	result.response[0].dispatchEvent( evt );

};

rfud.preview = function(result) {
    var templatetext = result.template.value.replace(/^\{\{/,'{{subst:') + ' ' + result.comments.value + ' ~~~~';
    result.previewer.beginRender(templatetext, "WP:RFUD"); // Force wikitext
}

rfud.toggleResponse = function(e) {
    //var form = e.target.form;
    var work_area;

    if (e.target.value === 'accept') {

        work_area = new Morebits.quickForm.element({
            type: 'field',
            label: 'Accept request',
            name: 'work_area'
        });

        var title = new mw.Title(pageName);
        if (! title.isTalkPage()) {
            work_area.append({
                type: 'checkbox',
                list: [ {
                    label: 'Undelete talk page',
                    name: 'undeletetalk',
                    value: 'undeletetalk',
                    checked: true
                } ]
            });
        }

        if (pageName.startsWith('Wikipedia talk:Articles for creation/')) {
            work_area.append({
                type: 'checkbox',
                list: [ {
                    label: 'Move to draft namespace',
                    name: 'movetodraft',
                    value: 'movetodraft',
                    checked: true
                } ]
            });
        }

    } else if (e.target.value === 'decline') {

        work_area = new Morebits.quickForm.element({
            type: 'field',
            label: 'Decline request',
            name: 'work_area'
        });

    }

    var template_responses = work_area.append({
        type: 'select',
        label: 'Select a templated response',
        name: 'template',
    });

    $.each(rfud.template_responses[e.target.value], function(i, e) {
        template_responses.append({ type: 'option', value: i, label: i + ': ' + e });
    });

    work_area.append({
        type: 'textarea',
        label: 'Comments',
        tooltip: 'Any comments in addition to the template response',
        name: 'comments'
    });


    var old_area = $("[name=work_area]")[0];
    var result = work_area.render();
	old_area.replaceWith( result );


};

rfud.template_responses = {
    accept: {
        '' : "No template response",
        '{{UND|Done}}' : "Done",
        '{{UND|prod}}' : "contested proposed deletion",
        '{{UND|g13}}' : "draft deleted under G13",
        '{{UND|afc}}' : "for G13s where {{AFC submission}} was used and the draft was submitted and declined",
        '{{UND|afc-ns}}' : "for G13s where {{AFC submission}} was used and where the draft was never submitted",
        '{{UND|g13-draft}}' : "for G13s of draft namespace pages never part of the AfC process"

    },
    decline: {
        '' : "No template response",
        '{{UND|notdone}}' : "Not done",
        '{{UND|notdone2}}' : "Not done and will not be done",
        '{{UND|doesnotexist}}' : "No deleted page with this name",
        '{{UND|notdonecompany}}' : "Company article failing NCORP",
        '{{UND|notdoneperson}}' : "Biographical article failing NBIO",
        '{{UND|g11}}' : "Blatant advertisement",
        '{{UND|discussion}}' : "Article deleted at a discussion", //needs subgroup
        '{{UND|csd}}' : "Article deleted per CSD criteria", // needs subgroup
        '{{UND|copyvio}}' : "Copyright violation" //

    }
};

rfud.evaluate = function(e) {

    var form = e.target.form;

    var undeletetalk = form.undeletetalk && form.undeletetalk.checked;
    var movetodraft = form.movetodraft && form.movetodraft.checked;
    var template = form.template.value;
    var comments = form.comments.value;

    var p = new Morebits.wiki.page(pageName);
    p.setEditSummary('Undelete per request at [[WP:RFUD]]' + rfud.config.advert);
    p.undeletePage(function(e) {

        // Undelete talk page
        if (undeletetalk) {
            // code here is copied off [[Mediawiki:Gadget-Twinklebatchdelete.js]], written by [[User:Amorymeltzer]]
            var talkpagename = new mw.Title(pageName).getTalkPage().getPrefixedText();
            var query = {
                'action': 'query',
                'prop': 'deletedrevisions',
                'drvprop': 'ids',
                'drvlimit': 1,
                'titles': talkpagename
            };
            var wikipedia_api = new Morebits.wiki.api( 'Checking talk page for deleted revisions', query, function talk_undel( apiobj ) {
                var xml = apiobj.responseXML;
                var exists = $(xml).find('page:not([missing])').length > 0;
                var delrevs = $(xml).find('rev').attr('revid');

                if( exists || !delrevs ) {
                    // page exists or has no deleted revisions; forget about it
                    return;
                }

                var talkpage = new Morebits.wiki.page(apiobj.query.titles, "Undeleting talk page of " + pageName);
                talkpage.setEditSummary('Undeleting [[Help:Talk page|talk page]] of "' + pageName + '"' + rfud.config.advert);
                talkpage.undeletePage();
            } );
            wikipedia_api.post();
        }


        // Move WT:AFC pages to Draft: space
        if (movetodraft) {
            p.setMoveDestination(pageName.replace('Wikipedia talk:Articles for creation/','Draft:'));
            p.setEditSummary('Moving to new location for drafts' + rfud.config.advert);
            p.movePage();
        }

        // Remove deletion tags
        p.load(function(e) {
            var pageText = e.getPageText();

            var newPageText = pageText.replace(
                // Regex courtesy: [[Mediawiki:Gadget-friendlytag.js]]
                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.*\\}\\}\\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\\n(?:\\s+\\|(?:concern|user|timestamp|help).*)+|' +
                    // 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'), ''
            );

            if (newPageText !== pageText) {
                p.setPageText(pageText);
                p.setEditSummary('Removing deletion tags from undeleted page' + rfud.config.advert);
                p.save();
            }

        });
    });
};

$('.rfud-undel').click(rfud.callback);

} );
// </nowiki>