User:Wugapodes/DYK promoter.js

console.log("A script to automatically promote DYK hooks to prep."); var masterList = [];

function getHooks(wikiText) { var re = /('''ALT.+?)?(\.\.\..*)\?/g; var hooks = wikiText.match(re); return hooks; }

function displayHooks { // Called when portlet button is clicked. Gets the hooks from the //  nomination by calling getHooks, parses the wikitext, and then //  calls formatEditNotice to display them. var wikiText = document.getElementById('wpTextbox1').innerHTML; var hooks = getHooks(wikiText); api.get({		"action": "parse",		"format": "json",		"text": "*".concat(hooks.join("\n*")),		"contentmodel": "wikitext"	}).done(function(data) {		formatEditNotice(data);	}); // doStuffToNom; }

function formatEditNotice(data) { // The real work horse of the program. hookHTML = $.parseHTML(data["parse"]["text"]['*']); console.log(hookHTML[0]); var listItems = hookHTML[0].getElementsByTagName("li"); var radioDiv = document.createElement("div"); var i;	for (i = 0; i < listItems.length; i++) { makeRadioButton(i,listItems,radioDiv,"hooks"); }	for ( i = 0; i < prepDiv.length; i++) { loadPrepSet(i); }	var editNotice = document.getElementById('editnotice-area'); editNotice.innerHTML = ""; editNotice.appendChild(radioDiv); // Add buttons to do stuff console.log(masterList); var inputDiv = document.createElement("div"); var prepSelect = document.createElement("select"); prepSelect.setAttribute("id","dyk-prepSelect"); for (i=0;i < masterList.length;i++) { var option = document.createElement("option"); option.setAttribute("value",i); var slotText = ", ".concat(masterList[i].slots).concat(" open slots"); option.innerText = masterList[i].name.concat(slotText); prepSelect.appendChild(option); }	inputDiv.appendChild(prepSelect); var selectButton = document.createElement("input"); selectButton.setAttribute("id","dyk-selectButton"); selectButton.setAttribute("type","button"); selectButton.setAttribute("value","Show this prep"); selectButton.setAttribute("onclick","showPrep"); inputDiv.appendChild(selectButton); editNotice.appendChild(inputDiv); }

function getPrepId(pD) { var prepTitle = $(pD).find('#firstHeading')[0].innerText; console.log(prepTitle); if (prepTitle.includes("Preparation area 1")) { return 1; } else if (prepTitle.includes("Preparation area 2")) { return 2; } else if (prepTitle.includes("Preparation area 3")) { return 3; } else if (prepTitle.includes("Preparation area 4")) { return 4; } else if (prepTitle.includes("Preparation area 5")) { return 5; } else if (prepTitle.includes("Preparation area 6")){ return 6; } else { return -1; } }

function loadPrepSet(ix) { var j = getPrepId(prepDiv[ix]); console.log("Loaded prep ".concat(j)); //prepDiv = prepDiv[0] console.log(prepDiv[ix]); var hookObject = getPrepHooks(prepDiv[ix]); if (hookObject.slots > 0) { var hookSection = hookObject.hooks; hookSection.firstChild.setAttribute("style","list-style-type: none; list-style-image: none;"); prepDiv[ix].appendChild(hookSection); prepDiv[ix].setAttribute("class","prep"); prepDiv[ix].setAttribute("id","prep-".concat(j)); hookObject.div = prepDiv[ix]; hookObject.name = "Prep ".concat(j); masterList.push(hookObject); } }

function addPortletLink(f, text) { var portletLink = mw.util.addPortletLink('p-cactions', '#', text); $(portletLink).click(function (e) {       e.preventDefault;        f;    }); }

function showPrep { var editNotice = document.getElementById('editnotice-area'); var dropdown = document.getElementById("dyk-prepSelect"); var i = dropdown.options[dropdown.selectedIndex].value; var previewAbsent = document.getElementById("dyk-prepPreview"); // console.log(!previewAbsent); var preview; if (!previewAbsent) { preview = document.createElement("div"); preview.setAttribute("id","dyk-prepPreview"); preview.setAttribute("class","prep"); preview.appendChild(masterList[i].hooks); editNotice.appendChild(preview); } else { preview = document.getElementById('dyk-prepPreview'); preview.innerHTML = ""; preview.appendChild(masterList[i].hooks); }	var selectButton = document.createElement("input"); selectButton.setAttribute("id","dyk-moveToPrepButton"); selectButton.setAttribute("type","button"); selectButton.setAttribute("value","Move to prep"); selectButton.setAttribute("onclick","addToPrep"); preview.appendChild(selectButton); }

function makeRadioButton(i,listItems,radioDiv,name) { var radioPara = document.createElement("p"); var radioButton = document.createElement("input"); radioButton.setAttribute("type","radio"); radioButton.setAttribute("id",name.concat(i)); radioButton.setAttribute("name",name); radioButton.setAttribute("value",i); radioPara.appendChild(radioButton); var radioLabel = document.createElement("label"); radioLabel.setAttribute("for",i); radioLabel.innerHTML = listItems[i].innerHTML; radioPara.appendChild(radioLabel); radioDiv.appendChild(radioPara); console.log(listItems[i].innerText); }

function getPrepHooks(pD) { console.log(pD); var hookSection = $(pD).find('ul')[2]; // If order of stuff on prep changes, this may no longer work console.log(hookSection); var hooks = $(hookSection).find('li'); console.log(hooks); var i;	var hookNum = 0; for (i = 0; i < hooks.length; i++) { var hookText = hooks[i].innerText; console.log(hookText); if (hookText.includes("... that ...")) { hookNum = hookNum+1; }	}	hookSection = addRadioButtons(hookSection) var emptySlots = hookNum; var hookObject = { hooks: hookSection, slots: emptySlots };	console.log(hookObject); return hookObject; }

function closeNom { var wikiText = document.getElementById('wpTextbox1').innerHTML; wikiText.replace("{{DYKsubpage","{{subst:DYKsubpage"); // Ideally only if passed... but that will be done later wikiText.replace("","yes") // Edit summary should say what Prep area it went to	// API edit request here }

function getPrepFromName(name) { if (name.includes("Prep 1")) { return 1; } else if (name.includes("Prep 2")) { return 2; } else if (name.includes("Prep 3")) { return 3; } else if (name.includes("Prep 4")) { return 4; } else if (name.includes("Prep 5")) { return 5; } else if (name.includes("Prep 6")) { return 6; } else { return -1; } }

function addToPrep { // Need a way for users to select the prep and position for a hook to	//  be moved to, this info then needs to make its way to the closeNom //  function so that the edit summary is accurate. var editNotice = document.getElementById('editnotice-area'); var dropdown = document.getElementById("dyk-prepSelect"); var prepName = dropdown.options[dropdown.selectedIndex].innerText; var prepNum = getPrepFromName(prepName); var chosenPrepUrl = "https://en.wikipedia.org/w/index.php?title=Template:Did_you_know/Preparation_area_".concat(prepNum); var prepEditUrl = chosenPrepUrl.concat("&action=edit"); var prepEditDiv = document.createElement('div'); var prepPosition = parseInt($('input[name="prep"]:checked').val)+1; $( prepEditDiv ).load( prepEditUrl, function {		var prepSlot = $("input[name='prep']:checked").val;		var hookIndex = parseInt($("input[name='hooks']:checked").val);		var wikiText = document.getElementById('wpTextbox1').innerHTML;		var hooks = getHooks(wikiText);		console.log(hooks);		var hookWikiText = hooks[hookIndex];		console.log(hookWikiText);		var prepWikiText = $(prepEditDiv).find("#wpTextbox1").text		var prepTextPieces = prepWikiText.split(/\* \.\.\. that /)		prepTextPieces[prepPosition] = hookWikiText.replace('... that ','').concat('\n')		//console.log(hookIndex+2)		console.log(prepTextPieces)		var newWikiText = prepTextPieces.join('* ... that ')		console.log(newWikiText)	}); return; }

function addRadioButtons(hookSection) { var listItems = hookSection.children var i;	var item; var prepRadioDiv = document.createElement("div") for (i = 0; i < listItems.length; i++) { makeRadioButton(i,listItems,prepRadioDiv,"prep") if (listItems[i].childElementCount > 0) { $(prepRadioDiv).find('#prep'.concat(i))[0].disabled = 'disabled'; }	}	return prepRadioDiv; }

// On page load var i; var prepURL = 'https://en.wikipedia.org/wiki/Template:Did_you_know/Preparation_area_'; var prepDiv = []; var pageIsDykNom = mw.config.values.wgTitle.includes("Did you know nominations/"); for (i=0;i<6;i++) { // Only load preps if page is a DYK nom for performance reasons if (pageIsDykNom === true) { prepDiv[i] = document.createElement("div"); $( prepDiv[i] ).load( prepURL.concat(i+1), function{}); } }

var wgAction = mw.config.values.wgAction; var wgTitle = mw.config.values.wgTitle;

if (document.title.includes("Editing Template:Did you know nominations/")) { addPortletLink(displayHooks, "Close DYK Nom"); }

var api = new mw.Api;

//var contentText = document.getElementById('mw-content-text'); //var firstHeading = document.getElementById('firstHeading'); //var redirMsg = contentText.getElementsByClassName('redirectMsg')[0]; //var uiWrapper = el('div'); //var edittoken = null;