Jump to content

User:Mike Dillon/Scripts/imageLinksByNs.js

From Wikipedia, the free encyclopedia
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.
// Requires: [[User:Mike Dillon/Scripts/namespaces.js]]
// Requires: [[User:Mike Dillon/Scripts/easydom.js]]

//<pre><nowiki>

$(function () {
    var node = document.getElementById("filelinks");
    if (!node) return;

    // Find the first UL after the header with the id "filelinks"
    while (node = node.nextSibling) {
        if (node.tagName && node.tagName.match(/^[Uu][Ll]$/)) {
            break;
        }
    }

    // Couldn't find the node, so bail out
    if (!node) return;

    // Stash the parent and next sibling of the list for later
    var parent = node.parentNode;
    var nextSibling = node.nextSibling;

    // Remove list from parent to work offline
    parent.removeChild(node);

    // Hash to store per-namespace lists
    var namespaceLists = {};

    // Build up a list of links by namespace
    var fileLink;
    var fileLinks = node.getElementsByTagName("li");
    for (var i = 0; fileLink = fileLinks[i]; i++) {
        var ns = getNamespaceNumber(fileLink.firstChild.firstChild.data);
        if (!namespaceLists[ns]) {
            namespaceLists[ns] = new Array();
        }
        namespaceLists[ns].push(fileLink);
    }

    // Rebuild the new subdivided lists
    with (easydom) {
        var newList = ul();
        for (var ns in wgNamespaceNames) {
            var items = namespaceLists[ns];
            if (!items) continue;

            var nodeData = {};
            items.sort(function (a, b) {
                var aData = nodeData[a] ? nodeData[a] : a.firstChild.firstChild.data.toLowerCase();
                var bData = nodeData[b] ? nodeData[b] : b.firstChild.firstChild.data.toLowerCase();
                return aData > bData ? 1 : aData < bData ? -1 : 0;
            });

            var nsList = ul();
            for (var i in items) {
                nsList.appendChild(items[i]);
            }

            newList.appendChild(li(strong(wgNamespaceNames[ns]), nsList));
        }
    }

    // Put the new list back in the DOM in place of the original list
    if (nextSibling) {
        parent.insertBefore(newList, nextSibling);
    } else {
        parent.appendChild(newList);
    }
});

//</nowiki></pre>