MediaWiki:Common.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */ // Function to sort leaderboard async function sortLeaderboard() { var table = document.querySelector('.edit-leaderboard'); // Target the specific class // Check if the table exists if (!table) { console.log('No leaderboard table found with the specified class.'); return; // Exit if the table doesn't exist } // Select all rows excluding the header row var rows = Array.from(table.querySelectorAll('tr')).filter(row => row.cells.length > 0 && row !== table.rows[0]); // Filter to ensure rows are valid console.log('Rows found:', rows.length); // Log the number of rows found // Calculate and display total edits in the last column for each row rows.forEach(row => { var totalEdits = calculateTotalEdits(row); // Calculate total edits if (row.cells[4]) { row.cells[4].innerHTML = `<strong>${formatNumber(totalEdits)}</strong>`; // Update the Total Edits column with bold formatting and comma separation } }); // Sort rows by the edit count (column index 4 for Total Edits) rows.sort((rowA, rowB) => { var editA = calculateTotalEdits(rowA); // Use the new function to get total edits var editB = calculateTotalEdits(rowB); // Use the new function to get total edits return editB - editA; // Sort descending by total edit count }); console.log('Rows sorted by edit count.'); // Log after sorting // Update ranks after sorting, handling ties let currentRank = 1; // Start from rank 1 let lastCount = -1; // Initialize lastCount to a value that won't match any edit count rows.forEach((row) => { var editCount = calculateTotalEdits(row); // Get current total edit count // Assign rank: if current edit count is the same as the last, keep the same rank if (editCount !== lastCount) { row.cells[0].innerHTML = `<strong>${currentRank}</strong>`; // Assign current rank with bold formatting lastCount = editCount; // Update lastCount to the current edit count currentRank++; // Increment rank for the next unique entry } else { row.cells[0].innerHTML = `<strong>${currentRank - 1}</strong>`; // Keep the same rank for ties } }); console.log('Ranks updated.'); // Log after updating ranks // Clear the table and re-add sorted rows while (table.rows.length > 1) { table.deleteRow(1); // Remove existing rows except for the header console.log('Row removed. Remaining rows:', table.rows.length); // Log remaining rows } // Append sorted rows back to the table rows.forEach((row) => { table.appendChild(row); // Re-add the sorted row to the table }); console.log('Sorted rows added back to the table.'); // Log after adding rows console.log('Leaderboard sorted and ranks updated.'); } // Execute the sorting function sortLeaderboard(); // Function to calculate total edits for a row function calculateTotalEdits(row) { var username = row.cells[1] ? row.cells[1].innerText : ""; // Get the username safely console.log(`Calculating total edits for user: ${username}`); // Log the username // Initialize total edits var totalEdits = 0; // Check if the username contains any numbers if (/\d/.test(username)) { // If the username contains numbers, use this logic var editCountText = row.cells[2] ? row.cells[2].innerHTML.trim() : ""; // Safely access the cell console.log(`Edit count text: ${editCountText}`); // Log the edit count text // Extract numbers from the edit count text (ignoring {{Special:Editcount/...}}) var editCountMatch = editCountText.match(/>(\d+)<\/a>/g); // Match all edit count occurrences var edits = editCountMatch ? editCountMatch.map(match => parseInt(match.match(/>(\d+)<\/a>/)[1], 10)).reduce((a, b) => a + b, 0) : 0; // Sum all edits // Get fandom edits from the "Fandom edits" cell (index 3) var fandomEdits = row.cells[3] ? parseInt(row.cells[3].innerHTML.trim().replace(/[^0-9]/g, ''), 10) || 0 : 0; // Safely access the cell // Return the total edits return edits + fandomEdits; // Return total edits } else { // If the username does not contain numbers, use this logic // Split the edit counts by line breaks and parse them var editCounts = row.cells[2] ? row.cells[2].innerHTML.trim().split('<br>').map(userEdit => { return parseInt(userEdit.replace(/[^0-9]/g, ''), 10) || 0; // Parse the current edits }) : []; // Safely access the cell var fandomEdits = row.cells[3] ? parseInt(row.cells[3].innerHTML.trim().replace(/[^0-9]/g, ''), 10) || 0 : 0; // Safely access the cell // Sum the edits for all users and add fandom edits totalEdits = editCounts.reduce((acc, count) => acc + count, 0) + fandomEdits; return totalEdits; // Return the total edits } } // Function to format numbers with commas function formatNumber(num) { return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); // Format number with commas }