Jump to content

User:JPxG/TrackSum.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by JPxG (talk | contribs) at 23:57, 3 September 2021 (This should freakin' work.). 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.
// If you are editing a page, this script gives you a button to click and automatically sum up all the track lengths in [[Template:Tracklist]] to provide a total length.
// Skeleton of this code forked from Wikipedia:WikiProject User scripts/Scripts/Quick wikify
// - JPxG, 2021 September 3

function getIndices(strang, substrang) {
    var indices = [], i = -1;
    while ((i = strang.indexOf(substrang, i+1)) != -1){
        indices.push(i);
    } // Close loop to increment over the strang.
    return indices;
} // Function to get indices of a substring in a string.

function asMinSecs(input) {
	strangMins = Math.round(input / 60);
	strangSecs = input - (strangMins * 60);
	return strangMins.toString() + ":" + strangSecs.toString();
} // Function to put out a string of minutes and seconds, given seconds as input.

function doTracksum() {
	tbox = document.editform.wpTextbox1.value;
	// Get the text from the edit box and store it as "tbox".
	obox = "";
	// Initialize blank output string.
	var cursor = 0;
	var allTotal = 0;
	// Set cursor to zero.
	var indax = getIndices(tbox, "{{tracklist");
	indax = indax.concat(getIndices(tbox, "{{Tracklist"));
	indax = indax.concat(getIndices(tbox, "{{Track listing"));
	indax = indax.concat(getIndices(tbox, "{{Track Listing"));
	indax = indax.concat(getIndices(tbox, "{{track listing"));
	indax = indax.concat(getIndices(tbox, "{{Tracklisting"));
	indax = indax.concat(getIndices(tbox, "{{tracklisting"));
	indax = indax.concat(getIndices(tbox, "{{Soundtrack"));
	indax = indax.concat(getIndices(tbox, "{{soundtrack"));
	indax = indax.sort();
	// We now have an array, "indax", of every index where a tracklist template appears.
	obox = tbox.substring(0, indax[0]);
	// Store everything before the first tracklist template into obox.
	for (let i = 0; i < indax.length; i++){
		if (i == indax.length){
			j = indax.length;
		} else {
			j = indax[i+1];
		}
		slice = tbox.substring(indax[i], j);
		openbraces = getIndices(slice, "{{");
		closebraces = getIndices(slice, "}}");
		allbraces = openbraces.concat(closebraces).sort();
		lastbrace = allbraces[allbraces.length];
		// Get the last of all braces in the slice.
		braceStatus = 0;
		lastInSlice = 0;
		for(var incre = 0; incre < slice.length; incre++) {
			if(openbraces.includes(incre)) {braceStatus++}
			if(closebraces.includes(incre)) {braceStatus--}
			if(braceStatus == 0) {lastInSlice = incre;break}
		} // Try to find the closing brace of the whole darn slice. This is where we add the "total_length" param.
		total = "";
		lengths = getIndices(slice, "|length");
		lengths = lengths.concat(getIndices(slice, "| length"));
		lengths = lengths.concat(getIndices(slice, "|  length"));
		lengths = lengths.concat(getIndices(slice, "|   length"));
		lengths = lengths.concat(getIndices(slice, "|    length"));
		lengths = lengths.concat(getIndices(slice, "|     length"));
		lengths = lengths.concat(getIndices(slice, "|      length"));
		lengths = lengths.concat(getIndices(slice, "|       length"));
		lengths = lengths.concat(getIndices(slice, "|        length"));
		lengths = lengths.concat(getIndices(slice, "|         length"));
		lengths = lengths.concat(getIndices(slice, "|          length"));
		lengths = lengths.concat(getIndices(slice, "|           length"));
		lengths = lengths.concat(getIndices(slice, "|            length"));
		lengths = lengths.concat(getIndices(slice, "|             length"));
		lengths = lengths.concat(getIndices(slice, "|              length"));
		lengths = lengths.concat(getIndices(slice, "|               length"));
		lengths = lengths.concat(getIndices(slice, "|                length"));
		lengths = lengths.concat(getIndices(slice, "|                 length"));
		lengths = lengths.concat(getIndices(slice, "|                  length"));
		lengths = lengths.concat(getIndices(slice, "|                   length"));
		lengths = lengths.concat(getIndices(slice, "|                    length"));
		//                                           12345678901234567890
		lengths = lengths.sort();
		console.log(lengths);
		// Now we have every index of "| length" in the template.
		for(var len = 0; len < lengths.length; len++) {
			time = 0;
			lenstr = slice.substring(lengths[len], slice.indexOf("\n", lengths[len]));
			// The string we're looking at is between that instance of "length" and the next line return.
			lenstr = lenstr.substring(lenstr.indexOf("=")+1);
			// Everything in that string after the "=".
			lenstr = lenstr.trim();
			// Remove spaces. Now it will just be "32:04" or "9:45" or whatever.
			mins = lenstr.substring(0, lenstr.indexOf(":"));
			secs = lenstr.substring(lenstr.indexOf(":")+1);
			time = (parseInt(mins) * 60) + parseInt(secs);
			total = total + time;
		} // Read time out of the "length" parameter for every one we find.
		allTotal = allTotal + total;
		obox = obox + slice.substring(0,lastInSlice) + "| total_length    = " + asMinSecs(total) + "\n" + slice.substring(lastInSlice);
		// Reconstitute the tbox.
	} // Everything in the darn obox.
	//obox = obox + tbox.substring(indax[indax.length])
	// Add the last bit of the tbox into obox.
	obox = obox + "\n<!-- Total length of all tracks: " + asMinSecs(allTotal) + "-->"	
	document.editform.wpTextbox1.value = "Found at" + indax.toString() + obox;
	// document.editform.wpTextbox1.value = '{' + '{' + 'Wikify|date=' + '{' + '{' + 'subst:CURRENTMONTHNAME}} ' + '{' + '{' + 'subst:CURRENTYEAR}}}}\n\n' + document.editform.wpTextbox1.value;
	document.editform.wpSummary.value = "Automatically summed track lengths [script-assisted: JPxG's [[User:JPxG/tracksum.js|TrackSum]] V0.1]";
	document.editform.wpMinoredit.checked = true;
	//document.editform.submit();
} // function to replace the stuff with the other stuff

addOnloadHook(function() {
	if (document.editform) {
		addPortletLink("p-cactions", "javascript:doTracksum()", "Tracksum", "ca-tracksum", "Sum up track lengths in tracklist template", "");
	}
}); // onloadhook

// by [[User:Raylu|raylu]]
// </nowiki></pre>