Warcraft Logs Number Abbreviator

Abbreviate big numbers in the event log using K,M,B suffixes.

// ==UserScript==
// @name         Warcraft Logs Number Abbreviator
// @namespace    athei
// @author       Alexander Theißen
// @version      1.0.0
// @description  Abbreviate big numbers in the event log using K,M,B suffixes.
// @match        http://*.warcraftlogs.com/*
// @match        https://*.warcraftlogs.com/*
// @grant        none
// @license      GPL3
// ==/UserScript==

// Process nodes that exist at load time of this script.
if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', processNodes);
} else {
    processNodes();
}

// Process nodes that are added after this script is run.
const observer = new MutationObserver(mutations => {
    mutations.forEach(mutation => {
        mutation.addedNodes.forEach(node => {
            // Only process element nodes.
            if (node.nodeType === Node.ELEMENT_NODE) {
                // If the added node itself is a span, process it.
                if (node.tagName.toLowerCase() === 'span') {
                    processElement(node);
                }
                // Process any span descendants of the added node.
                processNodes(node);
            }
        });
    });
});
observer.observe(document.body, { childList: true, subtree: true });

function processNodes(root = document) {
    root.querySelectorAll('.event-description-cell span').forEach(span => {
        processElement(span);
    });
}

// Process a given element if its text is a pure number.
function processElement(el) {
    // There are other characters in the cell with the raw numbers
    // in case of healing or dots.
    let newText = el.textContent.replace(/(\d+(\.\d+)?)/g, function(match) {
        let num = parseInt(match);
        if (num >= 1000) {
            return abbreviateNumber(num);
        } else {
            return match;
        }
    });
    if (newText !== el.textContent) {
        el.textContent = newText;
    }
}

// Abbreviates numbers (e.g., 2358046 → 2.4M) if they're large enough.
function abbreviateNumber(num) {
    if (num >= 1e9) return (num / 1e9).toFixed(1) + "B";
    if (num >= 1e6) return (num / 1e6).toFixed(1) + "M";
    if (num >= 1e3) return (num / 1e3).toFixed(1) + "K";
    return num.toString();
}