User:Evad37/TFDcloser.js and User:Evad37/TFDcloser/sandbox.js: Difference between pages

(Difference between pages)
Page 1
Page 2
Content deleted Content added
Remove functionality, superseded by XFDcloser (WP:XFDC). Source code remains available through the page history.
Tag: Replaced
 
m Fix requested on WP:IANB
 
Line 1: Line 1:
// <nowiki>
/*
//global vars
This script has been superseded by XFDcloser ([[WP:XFDC]]). Please use that script instead:
var TFDpath = "Wikipedia:Templates for discussion/Log/";
https://en.wikipedia.org/wiki/User:Evad37/XFDcloser


/* == Main function == */
This page is kept so that the source code remains available through page history:
$( function($) {
https://en.wikipedia.org/w/index.php?title=User:Evad37/TFDcloser.js&action=history

*/
// Only run in TFD/subpages, excluding holding cell
var thispage = mw.config.get( 'wgPageName' );
if ( !thispage.includes("Templates_for_discussion") || thispage.includes("Templates_for_discussion/Holding_cell") ) {
return;
}

$.getScript('https://en.wikipedia.org/w/index.php?title=User:Evad37/XFDcloserCommon.js&action=raw&ctype=text/javascript', function () {
// Make sure [[User:Evad37/XFDcloserCommon.js]] is loaded!

setSysopStatus();

/* ##### Sandbox usage only (remove when updating main script) ##### */
if ( mw.config.get("wgUserName") === "Evad37" ) {
isSysop = false;
console.log("isSysop: " + isSysop);
TFDpath = "User:Evad37/sandbox/Wikipedia:Templates for discussion/Log/";
}
/* ##### End of sandbox usage only (remove when updating main script) ##### */

// Add links to actions
$("h4 > span.mw-headline ").each(function( index ) {
$(".mw-headline-number", this).prependTo($(this).parent()); // fix for "Auto-number headings" preference
var template = $(":first-child", this).text();
if (!template) { // section header wasn't a link
template = $(this).text();
$(this).wrapInner("<span></span>"); // wrap with span so it can be styled later
}
var templatee = mw.util.wikiUrlencode(template); // "pretty"-encoded

//Check if already closed
var discussion_element_class = $(this).parent().next().attr("class");
if ( discussion_element_class ) { // only closed discussion have element with any class set
$(this).parent().addClass("boilerplate tfd vfd xfd-closed"); // add classes to enable hiding of closed section headers
} else {
var sectionlink = $(this).next().find("a").not(".mw-editsection-visualeditor").attr('href');
var editsection = sectionlink.split("section=")[1];
if ( editsection.search("T")<0 ) { // if true, we're on the subpage
nom_page = thispage;
} else { // if false, section is transcluded from a subpage
nom_page = sectionlink.split("title=")[1].split("&")[0];
editsection = editsection.substr(2); // remove "T-" from section number
}
if ( nom_page.includes("Templates_for_discussion/Holding_cell") ) return;

//Check for collapsed list, and pop out a non-visible copy if found
//var $collapsedlist = $(this).parent().next().next().find("ul");
//if ($collapsedlist.length > 0) {
// $collapsedlistitems = $collapsedlist.children().clone();
// $collapsedlistitems.css( "display", "none" )
// $(this).parent().next().append( $collapsedlistitems ).after( "<span style='font-size:85%;padding-left:1em;'>&thinsp;... collapsed list detected (" + $collapsedlistitems.length + " templates)</span>" );
//}

//Check if this is a multi-template dicussion
var $templates = $(this).parent().nextUntil("h4").find("li > span[id].plainlinks.nourlexpansion.1x").filter(":first-child").children("a").filter(":first-child");
console.log("$templates = ");
console.log($templates);
var templates = new Array($templates.length);
$templates.each(function( ii ) {
templates[ii] = $(this).text();
});
console.log("templates =");
console.log(templates);
var closing_options;
if ( templates.length > 1) {
// This is a multi-discussion
templates_e = templates.map(function(tname) {
var te = mw.util.wikiUrlencode(tname).replace(/,/g,"__COMMA__"); //"pretty"-encode, then encode commas encoded as __COMMA__
return te;
});
closing_options = "Closing options: " +
"<span style='margin-left:5px;'>[<a style='cursor:pointer;' onclick=multi_process_close_tfd('" + templates_e + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "Delete." + "','" + "delete" + "') title='QuickDelete (all)'>qD</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_close_tfd('" + templates_e + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "delete" + "') title='Delete, or other close that will result in the templates being deleted (e.g. Review, Convert, Substitute)'>Delete/other</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_process_close_tfd('" + templates_e + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "Keep." + "','" + "keep" + "') title='QuickKeep (all)'>qK</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_close_tfd('" + templates_e + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "keep" + "') title='Keep, or other close that will result in the template being kept (e.g. Redirect, No Consensus)'>Keep/other</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_close_tfd('" + templates_e + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "other" + "') title='Close requires different actions for one or more of the templates listed (e.g. Merge, Delete some but keep others)'>Other close</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_close_tfd('" + templates_e + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "relist" + "') title='Relist discussion'>Relist</a>]</span>";

} else if (templates[0] === undefined || !checkNS(template, 10)) {
// sanity check
templatee = mw.util.wikiUrlencode($(this).html().replace(/<[^>]*>/g,"")); //this is actually the section header
closing_options = "No templates detected. <span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_close_tfd('" + templatee + "','" + nom_page + "','" + templatee + "','" + editsection + "','" + "none_close_only" + "') title='Close with comments'>Close</a>]</span>";

} else {
// not a multi-discussion
closing_options = "Closing options: " +
"<span style='margin-left:5px;'>[<a style='cursor:pointer;' onclick=multi_process_close_tfd('" + templatee + "','" + nom_page + "'," + null + ",'" + editsection + "','" + "Delete." + "','" + "delete" + "') title='QuickDelete'>qD</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=close_tfd('" + templatee + "','" + nom_page + "','" + editsection + "','" + "delete" + "') title='Delete, or other close that will result in the template being deleted (e.g. Review, Convert, Substitute)'>Delete/other</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=multi_process_close_tfd('" + templatee + "','" + nom_page + "'," + null + ",'" + editsection + "','" + "Keep." + "','" + "keep" + "') title='QuickKeep'>qK</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=close_tfd('" + templatee + "','" + nom_page + "','" + editsection + "','" + "keep" + "') title='Keep, or other close that will result in the template being kept (e.g. Redirect, No Consensus)'>Keep/other</a>]</span>" +
"<span style='margin-left:13px;'>[<a style='cursor:pointer;' onclick=close_tfd('" + templatee + "','" + nom_page + "','" + editsection + "','" + "relist" + "') title='Relist discussion'>Relist</a>]</span>";
}
$(this).append("<span id=XFDClosing_" + templatee + " style='font-size:85%;margin-left:13px;font-weight:normal;'>" + closing_options + "</span>");
}
});
});

});


/* == CLOSING-related functions == */

/* -- Close single-TFD section (prompting for result/commment) -- */
function close_tfd(_templatename, _pagetitle, _sectionnum, _action) {
var prompt_text;
if ( _action === "relist" ) {
prompt_text = "Enter relist comment (optional)";
} else {
prompt_text = "Enter result and comment";
}
var result_comment = prompt(prompt_text);
if ( result_comment !== null ) {
multi_process_close_tfd(_templatename, _pagetitle, null, _sectionnum, result_comment, _action);
}
}

/* -- Close mulit-TFD section (prompting for result/commment) -- */
//Get comment
function multi_close_tfd(_templatearray, _pagetitle, _sectionheader, _sectionnum, _action) {
var prompt_text;
if ( _action === "relist" ) {
prompt_text = "Enter relist comment (optional)";
} else {
prompt_text = "Enter result and comment";
}
var result_comment = prompt(prompt_text);
if ( result_comment !== null ) {
multi_process_close_tfd(_templatearray, _pagetitle, _sectionheader, _sectionnum, result_comment, _action);
}
}

/* -- Process the close -- */
function multi_process_close_tfd(templatename, pagetitle, sectionheader, sectionnum, resultcomment, action) {

var editsum_template_or_section, template_or_null, _anchor, tfd_close_top, tfd_close_bottom, tfd_close_editsum, sig;
// Add REFUND to "soft delete"
resultcomment = resultcomment.trim().replace(/^soft delete\.?$/gi, "'''soft delete'''. [[WP:REFUND]] applies.");
// Wikitext used for close
if (sectionheader) {
editsum_template_or_section = "\"" + sectionheader + "\"";
template_or_null = null;
_anchor = sectionheader;
} else {
editsum_template_or_section = "for [[:" + templatename + "]]";
template_or_null = templatename;
_anchor = templatename;
}

deliverMsg( _anchor, "Started closing...", "working" );

if (isSysop) {
sig = "~~" + "~~";
} else {
sig = "<small>[[Wikipedia:NACD|(non-admin closure)]]</small> ~~" + "~~";
}

// Figure out if/where bold markup should be added
var bolding_info = adjustCommentBolding(resultcomment);
var bold1 = bolding_info[0];
var bold2 = bolding_info[1];
resultcomment = bolding_info[2];
var rc = bold1 + resultcomment + bold2;
var editsum_rc = rc.replace(/'''/g, "");
if (action == "relist") {
//get today's date
var d = new Date();
var mmm = getMonthName(d.getUTCMonth());
todays_subpage = d.getUTCFullYear() + " " + mmm + " " + d.getUTCDate();
tfd_close_top = "{" + "{subst:tfd top|'''Relisted'''}" + "} on [[" + TFDpath + todays_subpage + "#" + _anchor + "|" + todays_subpage + "]] " + sig;
tfd_close_bottom = "\n{" + "{subst:tfd bottom}" + "}";
tfd_close_editsum = "Relisted discussion " + editsum_template_or_section + " on [[" + TFDpath + todays_subpage + "#" + _anchor + "|" + todays_subpage + "]] (using [[User:Evad37/TFDcloser|TFDcloser]])";
} else {
tfd_close_top = "{" + "{subst:tfd top|" + bold1 + resultcomment + bold2 + "}" + "} " + sig;
tfd_close_bottom = "{" + "{subst:tfd bottom}" + "}";
tfd_close_editsum = "Closing discussion " + editsum_template_or_section + " as " + editsum_rc + " (using [[User:Evad37/TFDcloser|TFDcloser]])";
}

// Get page content and remove {Closing} template if present
new mw.Api().get( {
action: 'query',
titles: pagetitle,
prop: [ 'revisions', 'info' ],
rvprop: 'content',
indexpageids: 1,
rawcontinue: ''
} ).done( function( result, jqXHR ) {
var p_id = result.query.pageids;
var p_contents = result.query.pages[ p_id ].revisions[ 0 ][ '*' ];
var sections_array = p_contents.split("====");
var section_heading = sections_array[((sectionnum-1)*2-1)];
var section_contents = sections_array[((sectionnum-1)*2)].replace(/{{closing}}/gi, "");
var updated_section;

// Add relisted discussions to current day's TFD page
if (action == "relist") {
var tfdlinks = section_contents.match(/^\*\s*{{\s*Tfd links\s*\|[^\n]*/gim).join("\n");
if ( tfdlinks ) {
updated_section = "====" + section_heading + "====" + "\n" + tfd_close_top + "\n" + tfdlinks + tfd_close_bottom;
} else {
updated_section = "====" + section_heading + "====" + "\n" + tfd_close_top + tfd_close_bottom;
}
deliverMsg( _anchor, "Adding discussion to today's TFD subpage...", "working" );
var old_disc = "====" + section_heading + "====" + "\n" + section_contents.replace(/^\n+/,"");
relist_tfd_disc(template_or_null, old_disc, resultcomment, todays_subpage, sectionheader, _anchor);
} else {
updated_section = "====" + section_heading + "====" + "\n" + tfd_close_top + section_contents + tfd_close_bottom;
}

// Perform edit to close TFD discussion
new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: pagetitle,
section: sectionnum,
text: updated_section,
summary: tfd_close_editsum
} ).done( function( result, jqXHR ) {

// If successful, mark as closed & move onto next actions (deletes, or update tfd's if relisted, or do old tfd housekeepings)
var template_array, i, ii, last_one;
if (sectionheader) {
template_array = templatename.split(","); // templatename is a csv string (multiple items)
for (i = 0; i < template_array.length; i++) {
template_array[i] = decodeURIComponent(template_array[i]).replace(/__COMMA__/g,","); //unencode commas from __COMMA__
}
} else {
template_array = [decodeURIComponent(templatename)]; // templatename is a string (single item)
}
var template_array_length = template_array.length;

if ( action == "delete" ) {
//---Delete:---
markClosed(_anchor, rc);
deliverMsg( _anchor, "Waiting...", "working" );
delete_action_prompt(templatename, pagetitle, _anchor);

} else if ( action == "relist" ) {
//---Relist:---
markClosed(_anchor, "Relisted on <a href=//en.wikipedia.org/wiki/" + TFDpath.replace(/\s/gi,"_") + todays_subpage.replace(/\s/gi,"_") + "#" + _anchor +">" + todays_subpage + "</a>", true);
deliverMsg( _anchor, "Adding discussion to today's TFD subpage...", "working" );
for (ii = 0; ii < template_array.length; ii++) {
if (ii == template_array_length-1) {
last_one = true;
} else {
last_one = false;
}
update_template_tfd(template_array[ii], todays_subpage, _anchor, last_one);
}

} else if ( action == "none_close_only" ) {
//---No further action:---
markClosed(_anchor, rc);
return;

} else if ( action == "other" ) {
//---Other:---
markClosed(_anchor, rc);
for (ii = 0; ii < template_array.length; ii++) {
window.open("//en.wikipedia.org/w/index.php?title=" + template_array[ii] + "&action=edit", _anchor + ii);
}
return;

} else {
//---Keep:---
markClosed(_anchor, rc);
deliverMsg( _anchor, "Updating template description pages...", "working" );
var rescom = bold1 + resultcomment + bold2;
var res = rescom.split("'''")[1].trim().replace(/(?:\.|,|;|:)$/, "");
for (ii = 0; ii < template_array_length; ii++) {
if (ii == template_array_length-1) {
last_one = true;
} else {
last_one = false;
}

make_old_tfd(template_array[ii], res, pagetitle, sectionheader, _anchor, last_one);
}
}
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( _anchor, "Could not close discussion " + error_details, "error" );
} );

} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( _anchor, "Could not read contents of page " + pagetitle + "; could not close discussion " + error_details, "error" );
} );
}


/* == DELETE-relatated functions == */

/* -- Prompt -- */
function delete_action_prompt(template, TFD_page, anchor) {

var log_date = TFD_page.match(/\d{4}_\w*_\d{1,2}/)[0];

var holdingcellbuttons = "<span id='hc_sections'><button onclick=addToHoldingCell('" + template + "',2,'" + anchor + "','" + log_date + "')>Review</button> <button onclick=holdCellMergeSections('" + template + "','" + anchor + "','" + log_date + "')>Merge</button> <button onclick=addToHoldingCell('" + template + "',11,'" + anchor + "','" + log_date + "')>Convert</button> <button onclick=addToHoldingCell('" + template + "',12,'" + anchor + "','" + log_date + "')>Substitute</button> <button onclick=addToHoldingCell('" + template + "',13,'" + anchor + "','" + log_date + "')>Orphan</button> <button onclick=addToHoldingCell('" + template + "',14,'" + anchor + "','" + log_date + "')>Ready for deletion</button></span>";

var prompt_msg;
if (isSysop) {
var delReason = "["+"["+TFD_page+"#"+anchor+"]"+"]";
prompt_msg = "<button onclick=deleteNow('" + template + "','" + delReason + "','" + anchor + "')>Delete Now</button> or choose holding cell section: " + holdingcellbuttons;
} else {
prompt_msg = "Choose holding cell section: " + holdingcellbuttons;
}

deliverMsg( anchor, prompt_msg, "question");
}

function holdCellMergeSections(template, anchor, log_date) {
var mergebuttons = "Choose 'Merge' subsection: <button onclick=addToHoldingCell('" + template + "',4,'" + anchor + "','" + log_date + "')>Arts</button> <button onclick=addToHoldingCell('" + template + "',5,'" + anchor + "','" + log_date + "')>Geography, politics and governance</button> <button onclick=addToHoldingCell('" + template + "',6,'" + anchor + "','" + log_date + "')>Religion</button> <button onclick=addToHoldingCell('" + template + "',7,'" + anchor + "','" + log_date + "')>Sports</button> <button onclick=addToHoldingCell('" + template + "',8,'" + anchor + "','" + log_date + "')>Transport</button> <button onclick=addToHoldingCell('" + template + "',9,'" + anchor + "','" + log_date + "')>Other</button> <button onclick=addToHoldingCell('" + template + "',10,'" + anchor + "','" + log_date + "')>Meta</button>";
deliverMsg( anchor, mergebuttons, "question", true);
}


/* -- Perform delete action -- */
function deleteNow(template_string, thereason, anchor) {

var ii, isLast;

deliverMsg( anchor, null, null, true); // clears prompt buttons
deliverMsg( anchor, "Deleting...", "working", true ); // clears waiting messages

if ( template_string.includes(",Template:") ) { // template_string is a csv string (multiple items)
template_array = template_string.split(",");
for (i = 0; i < template_array.length; i++) {
template_array[i] = decodeURIComponent(template_array[i]).replace(/__COMMA__/g,","); //unencode commas from __COMMA__
}
} else { // template_string is a string (single item)
template_array = [decodeURIComponent(template_string)];
}

for (ii = 0; ii < template_array.length; ii++) {
if (ii == template_array.length-1) {
isLast = true;
} else {
isLast = false;
}
if ( !checkNS(template_array[ii], 10) ) {
deliverMsg( anchor, "\"" + template_array[ii] + "\" is not in Template: namespace, TFDcloser will not delete this page", "error", isLast, null, !isLast);
return;
}
perform_delete(template_array[ii], thereason, anchor, isLast);
}
}

function perform_delete(template, del_reason, _anchor, _isLast){
new mw.Api().postWithToken( 'delete', {
action: 'delete',
title: template,
reason: del_reason,
} ).done( function( result, jqXHR ) {
deliverMsg( _anchor, "Deleted " + template, "deleted", null, null, true );
if (_isLast) {
deliverMsg( _anchor, null, null, true ); // remove "Deleting..." message
}
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( _anchor, "Could not delete " + template + " " + error_details, "warning", null, null, true );
if (_isLast) {
deliverMsg( _anchor, null, null, true ); //remove "Deleting..." message
}
} );
}

/* -- Holding cell -- */
function addToHoldingCell(template_string, holdCellSection, anchor, log_date) {

var i, isLast, delete_param, tag_speedy, section_param, hc_editsum, last_one;


deliverMsg( anchor, null, null, true); // clears prompt buttons
deliverMsg( anchor, "Listing at holding cell...", "working", true ); // clears waiting message

//Build up wikitext for edit

if ( holdCellSection === 14 ) { // 14 is "Ready for deletion"
delete_param = "|delete=1";
tag_speedy = true;
} else {
delete_param = "";
tag_speedy = false;
}
if ( template_string === anchor ) {
section_param = "";
} else {
section_param = "|section=" + anchor;
}
var wikitext_append = "";
if ( template_string.includes(",Template:") ) { // template_string is a csv string (multiple items)
template_array = template_string.split(",");
for (i = 0; i < template_array.length; i++) {
if (i === template_array.length-1) {
last_one = true;
} else {
last_one = false;
}
template_array[i] = decodeURIComponent(template_array[i]).replace(/__COMMA__/g,",");
addBeingDeleted(template_array[i], anchor, log_date, last_one, tag_speedy);
wikitext_append = wikitext_append + "*{" + "{tfdl|" + template_array[i].replace(/_/g," ").slice(9) + "|" + log_date.replace(/_/g," ") + section_param + delete_param + "}}\n";
hc_editsum = "Listing templates per [[" + TFDpath + log_date + "#" + anchor + "]] (using [[User:Evad37/TFDcloser|TFDcloser]])";
}
} else { // template_string is a string (single item)
addBeingDeleted(decodeURIComponent(template_string), anchor, log_date, true, tag_speedy);
wikitext_append = "*{" + "{tfdl|" + decodeURIComponent(template_string).replace(/_/g," ").slice(9) + "|" + log_date.replace(/_/g," ") + section_param + delete_param + "}}\n";
hc_editsum = "Listing [[" + decodeURIComponent(template_string) + "]] per [[" + TFDpath + log_date + "#" + anchor + "]] (using [[User:Evad37/TFDcloser|TFDcloser]])";
}

// ... make api call to append wikitext to the section ...
var holdingcellpagetitle = TFDpath.slice(0,-4) + "Holding cell";
new mw.Api().get( {
action: 'query',
titles: holdingcellpagetitle,
prop: [ 'revisions', 'info' ],
rvprop: 'content',
indexpageids: 1,
rawcontinue: ''
} ).done( function( result, jqXHR ) {
var p_id = result.query.pageids;
var p_contents = result.query.pages[ p_id ].revisions[ 0 ][ '*' ].replace(/====/gi, "==="); //make all headings level 3 so sections can be counted
var sections_array = p_contents.split("===");
var section_heading = sections_array[(holdCellSection*2-1)];
var section_contents = sections_array[(holdCellSection*2)];
//remove "* ''None currently''" if after end of, or before beginning of, <!--html comment-->
section_contents = section_contents.replace(/-->\n*\*\s*''None currently''/gi, "-->").replace(/\*\s*''None currently''\n*<!--/gi, "<!--");
var heading_level;
if ( (4 <= holdCellSection) && ( holdCellSection <= 10) ) { //Merge subsections
heading_level = "====";
} else {
heading_level = "===";
}
var updated_section = heading_level + section_heading + heading_level + "\n" + section_contents.trim() + "\n" + wikitext_append;

new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: holdingcellpagetitle,
section: holdCellSection,
text: updated_section,
summary: hc_editsum
} ).done( function( result, jqXHR ) {
deliverMsg( anchor, "Listed at holding cell", "is_done", null, null, true );
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, "Could not edit holding cell " + error_details, "error", null, null, true);
} );

} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( _anchor, "Could not read contents of page " + holdingcellpagetitle + "; could not add templates to holding cell " + error_details, "error", null, null, true);
} );
}

/* -- Add Being deleted (or Db-xfd) template -- */
function addBeingDeleted(template, anchor, log_date, last, speedy) {

if ( !checkNS(template, 10) ) {
deliverMsg( anchor, "\"" + template + "\" is not in Template: namespace, TFDcloser will not edit this page", "error", last, null, !last);
return;
}

var updated_content, uc_template, uc_template_name, uc_editsum;
if ( speedy ) {
uc_template_name = "Db-xfd";
uc_editsum = "[[WP:G6|G6]] Speedy deletion nomination, per close at [[" + TFDpath + log_date + "#" + anchor + "]]";
uc_template = "{" + "{db-xfd|votepage=/Log/" + log_date + "#" + anchor + "}" + "}";
} else {
uc_template_name = "Being deleted";
uc_editsum = "Per close at [[" + TFDpath + log_date + "#" + anchor + "]], added {" + "{being deleted}" + "} (using [[User:Evad37/TFDcloser|TFDcloser]])";
uc_template = "{" + "{Being deleted|" + log_date + "|" + anchor + "}" + "}";
}

//replace {Template for discussion/dated} or {Tfm/dated} (which may or may not be noincluded) with noincluded {Being deleted}
new mw.Api().get( {
action: 'query',
titles: template,
prop: [ 'revisions', 'info' ],
rvprop: 'content',
indexpageids: 1,
rawcontinue: ''
} ).done( function( result, jqXHR ) {
var t_id = result.query.pageids;
var t_contents = result.query.pages[ t_id ].revisions[ 0 ][ '*' ];
if ( t_contents.search(/{{(Template for discussion|Tfm)\/dated[^}}]*}{2,4}/gi) < 0 ) {
updated_content = "<no" + "include>" + uc_template + "</no" + "include>" + t_contents;
} else {
updated_content = t_contents.replace(/(?:<noinclude>[\n\s]*)*{{(Template for discussion|Tfm)\/dated[^}}]*}{2,4}(?:[\n\s]*<\/noinclude>)*/gi, "<no" + "include>" + uc_template + "</no" + "include>");
}

//Perform edit
new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: template,
text: updated_content,
summary: uc_editsum
} ).done( function( result, jqXHR ) {
deliverMsg(anchor, "{" + "{" + uc_template_name + "}" + "} added to " + template, "is_done", last, null, !last);
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg(anchor, "Could not add {" + "{" + uc_template_name + "}" + "} to " + template + " " + error_details, "error", last, null, !last);
} );

} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, template + " not found; could not add {" + "{" + uc_template_name + "}" + "} " + error_details, "warning", last, null, !last);
} );

}


/* == KEEP-relatated functions == */

function make_old_tfd(templatename, resultcomment, tfdpage, sectionheader, anchor, last) {

var disc_param, nomdate, templatetalkpage, oldtfd_wikitext;

if ( !checkNS(templatename, 10) ) {
deliverMsg( anchor, "\"" + templatename + "\" is not in Template: namespace, TFDcloser will not edit this page or its talk page", "error", lasttemplate, null, !lasttemplate);
return;
}

if (sectionheader) {
disc_param = "|disc=" + sectionheader;
} else {
disc_param = "";
}

nomdate = tfdpage.split(TFDpath.replace(/\s/gi,"_"))[1].replace(/_/gi," "); //unencode spaces from _
templatetalkpage = templatename.replace("Template", "Template_talk");
oldtfd_wikitext = "{" + "{oldtfdfull|date=" + nomdate + "|result=" + resultcomment + disc_param + " }" + "}\n";

new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: templatetalkpage,
prependtext: oldtfd_wikitext,
summary: "Old TFD – " + nomdate + ": " + resultcomment + " (using [[User:Evad37/TFDcloser|TFDcloser]])"
} ).done( function( result, jqXHR ) {
deliverMsg( anchor, "Updated " + templatetalkpage, "is_done", null, null, true );

//Get template description page, remove tfd template
new mw.Api().get( {
action: 'query',
titles: templatename,
prop: [ 'revisions', 'info' ],
rvprop: 'content',
indexpageids: 1,
rawcontinue: ''
} ).done( function( result, jqXHR ) {
var t_id = result.query.pageids;
var t_contents = result.query.pages[ t_id ].revisions[ 0 ][ '*' ];
var updated_template_content = t_contents.replace(/(?:<noinclude>[\n\s]*)*{{(Template for discussion|Tfm)\/dated[^}}]*}{2,4}(?:[\n\s]*<\/noinclude>)*/gi, "");

//Perform edit to remove tfd template
new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: templatename,
text: updated_template_content,
summary: "TFD closed as " + resultcomment + " (using [[User:Evad37/TFDcloser|TFDcloser]])"
} ).done( function( result, jqXHR ) {
deliverMsg( anchor, "Removed {{Template for discussion/dated}} (or {{Tfm/dated}}) from " + templatename, "is_done", last, null, !last);
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, "Could not remove {{Template for discussion/dated}} (or {{Tfm/dated}}) from " + templatename + " " + error_details, "warning", last, null, !last);
} );

} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, templatename + " not found; could not remove {{Template for discussion/dated}} (or {{Tfm/dated}}) " + error_details, "warning", last, null, !last);
} );

} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, "Could not edit " + templatetalkpage + " " + error_details, "warning", last, null, !last);
} );

}


/* == RELIST-related functions == */

/* -- Relist discussion on current day's TFD subpage -- */
function relist_tfd_disc(templatename, discussion, relistcomment, todaysdate, sectionheader, anchor) {

var relist_editsum, relists, num_relists, rc_if_any, newdiscussion;

//Edit summary varies based on if sectionheader is defined or not
if ( sectionheader ) {
relist_editsum = "Relisting \"" + sectionheader + "\" (using [[User:Evad37/TFDcloser|TFDcloser]])";
} else {
relist_editsum = "Relisting [[:" + templatename + "]] (using [[User:Evad37/TFDcloser|TFDcloser]])";
}

//Check for number of relists, append {relist} template
relists = discussion.match("[[Wikipedia:Deletion process#Relisting discussions|Relisted]]");
if ( relists ) {
num_relists = relists.length + 1;
} else {
num_relists = 1;
}
if ( relistcomment !== "" ) {
rc_if_any = relistcomment;
} else {
rc_if_any = "";
}
newdiscussion = discussion.trim() + "\n{" + "{subst:Relist|" + rc_if_any + "|" + num_relists + "}}\n";

//Check if any discussion already listed
new mw.Api().get( {
action: 'query',
titles: TFDpath + todaysdate,
prop: [ 'revisions', 'info' ],
rvprop: 'content',
indexpageids: 1,
rawcontinue: ''
} ).done( function( result, jqXHR ) {
var _id = result.query.pageids;
var _contents = result.query.pages[ _id ].revisions[ 0 ][ '*' ];
var _h4 = _contents.match("====");
if ( _h4 ) { // there is at least 1 level 4 heading on page - can prepend to section #2
new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: TFDpath + todaysdate,
section: 2,
prependtext: newdiscussion,
summary: relist_editsum
} ).done( function( result, jqXHR ) {
deliverMsg( anchor, null, null, true ); // remove working message
window.open("//en.wikipedia.org/wiki/" + TFDpath.replace(/\s/gi,"_") + todaysdate.replace(/\s/gi,"_"), "tfdtoday");
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, "Could not relist discussion " + error_details, "error", true);

} );
} else { // there are no level 4 headings on page - can append to section #1
new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: TFDpath + todaysdate,
section: 1,
appendtext: "\n" + newdiscussion,
summary: relist_editsum
} ).done( function( result, jqXHR ) {
deliverMsg( anchor, null, null, true ); // remove working message
window.open("//en.wikipedia.org/wiki/" + TFDpath.replace(/\s/gi,"_") + todaysdate.replace(/\s/gi,"_"), "tfdtoday");
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, "Could not relist discussion " + error_details, "error", true );
} );
}
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, TFDpath + todaysdate + " not found; could not relist discussion " + error_details, "error", true );
} );
}


/* -- Update template tfd template (after relisting) -- */
function update_template_tfd(templatename, today_subpage, anchor, lasttemplate) {
if ( !checkNS(templatename, 10) ) {
deliverMsg( anchor, "\"" + templatename + "\" is not in Template: namespace, TFDcloser will not edit this page", "error", lasttemplate, null, !lasttemplate);
return;
}
new mw.Api().get( {
action: 'query',
titles: templatename,
prop: [ 'revisions', 'info' ],
rvprop: 'content',
indexpageids: 1,
rawcontinue: ''
} ).done( function( result, jqXHR ) {
var template_id = result.query.pageids;
var template_contents = result.query.pages[ template_id ].revisions[ 0 ][ '*' ];
var new_template_contents = template_contents.replace(/Wikipedia:Templates(_|\s){1}for(_|\s){1}discussion\/Log\/\d{4}(_|\s){1}\w*(_|\s){1}\d{1,2}#(?=[^}]*}{2})/gi, "Wikipedia:Templates for discussion/Log/" + today_subpage + "#" );
new mw.Api().postWithToken( 'edit', {
action: 'edit',
title: templatename,
text: new_template_contents,
summary: "Updating {{tfd}} template: template was relisted (using [[User:Evad37/TFDcloser|TFDcloser]])"
} ).done( function( result, jqXHR ) {
deliverMsg( anchor, "Updated {{Template for discussion/dated}} (or {{Tfm/dated}}) on " + templatename, "is_done", lasttemplate, null, !lasttemplate);
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, "Could not update {{Template for discussion/dated}} (or {{Tfm/dated}}) on " + templatename + " " + error_details, "warning", lasttemplate, null, !lasttemplate);
} );
} ).fail( function( code, result ) {
var error_details = apifailed( code, result );
deliverMsg( anchor, templatename + " not found; could not update {{Template for discussion/dated}} (or {{Tfm/dated}}) " + error_details, "warning", lasttemplate, null, !lasttemplate);
} );

}
// </nowiki>