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.
// User:Quarl/autotag.js - automatically add custom tags to article

// requires: wikipage.js, wikiedit.js, shortcuts.js, addlilink.js, datetime.js

// quarl 2006-01-03 initial version
// quarl 2006-01-23 use wikiedit.js instead of automod.js

//<pre><nowiki>

// TODO: sort the tags by this order (note that these are primary names of tags since they all have many aliases;
// subsituted tags such as afd are tricky; support piped data such as db|reason)

//autotag_order = 'delete,afd,hoax,original research,npov,cleanup,importance'.split(',');

var autotag_mark_minor = true;

var autotag_shortcuts = Shortcuts({
    'cleanup,clean' : 'cleanup-date|' + datestampMonthYYYY(),
    'or,original' : 'original research',
    'afd,vfd' : 'subst:afd',
    'catz' : 'categorize',
    'cped' : 'copyedit',
    'wfy' : 'wikify' // equivalent, but easier for someone reading wikisource/history
});


function autotag_load() {
    if (wikiPage.nsSpecialP) return;

    addTab('javascript:autotag_query()', 'Tag', 'ca-autotag', "Add tag(s)");
}

function autotag_query() {
    var tags = window.prompt("Enter tags to add, separated by &&. Example: hoax && not verified && original research && npov && mergeto|another article, cleanup");
    autotag(tags);
}

function autotag_iscat(s) {
    return Boolean(s.match(/^category:/i));
}

function autotag_remove_braces(s) {
    // remove any brackets or braces
    s = s.replace(/^\{\{(.*)\}\}$/, '$1');
    s = s.replace(/^\[\[(.*)\]\]$/, '$1');
    return s;
}

function autotag_add_braces(s) {
    if (autotag_iscat(s)) {
        return '[['+s+']]';
    } else {
        return '{{'+s+'}}';
    }
}

function capitalizeFirstChar(s) {
    if (!s) return s;
    return s[0].toUpperCase() + s.substr(1);
}

function autotag_canonicalize_category(s) {
    if (s.match(/^cat(egory|egories)? *: */i)) {
        s = 'Category: ' + capitalizeFirstChar(RegExp.rightContext);
    }
    return s;
}

function autotag_expand_shortcuts(s) {
    s = autotag_shortcuts.subst(s);
    // common mistake: {{unverified}} is for images only
    if (!wikiPage.nsImageP) s = s.replace(/unverified/, 'not verified');
    s = autotag_canonicalize_category(s);
    // common mistake: {{d|reason}} should be {{db|reason}}
    s = s.replace(/^d\|/, 'db|');
    return s;
}

function autotag_tagAtTopP(t) {
    if (autotag_iscat(t)) return false;
    if (t.match(/stub$/)) return false; 
    return true;
}

function autotag(tags) {
    wikiPage.getEditorAsync(autotag_edit, tags);
}

function autotag_edit(editor, tags) {
    tags = tags.split(/&&/);
    //var ntags = Array();
    var ttags = Array();
    var ttags_top = Array();
    var ttags_bot = Array();
    for (i in tags) {
        var tag = tags[i];
        tag = autotag_expand_shortcuts(autotag_remove_braces(trimspaces(tag)));
        if (!tag) continue;
        var btag = autotag_add_braces(tag);
        //ntags.push(tag);
        ttags.push(btag);
        if (autotag_tagAtTopP(tag)) {
            ttags_top.push(btag);
        } else {
            ttags_bot.push(btag);
        }
    }
    if (!ttags.length) return;

    if (editor.refuseCreate()) return;
    var prepend = ttags_top.length ? (ttags_top.join('\n\n')+'\n\n') : '';
    var append = ttags_bot.length ? ('\n\n'+ttags_bot.join('\n\n')) : '';
    editor.wpTextbox1 = prepend + trim_lines(editor.wpTextbox1) + append;
    editor.wpSummary = 'Tagged as ' + ttags.join(', ');
    editor.wpMinoredit = autotag_mark_minor;
    editor.submit();
}

$(autotag_load);

//</nowiki></pre>