User:Ucucha/HarvErrors2.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.
if(window.checkLinksToCitations === undefined) {
    window.checkLinksToCitations = true;
}

jQuery(document).ready(function($) {
    // keep track of whether there are any Harv citations; if there are none,
    // the second check is useless.
    var hasHarvs = false;

    // first check: do links in Harvard citations point to a valid citation?
    var links = document.links;
    for (var i = 0; i < links.length; i++) {
        var href = links[i].getAttribute('href');
        if (href.indexOf('#CITEREF') === 0) {
            hasHarvs = true;
            if (document.getElementById(href.substring(1)) === null) {
                links[i].parentNode.innerHTML +=
                    " <strong class=error>Harv error: link to " +
                    href +
                    " doesn't point to any citation.</strong>";
            }
        }
    }

    // second check: do CITEREF IDs have Harvard citations pointing to them?
    if(hasHarvs && window.checkLinksToCitations) {
        // limit ourselves to citations inside reference sections
        var refheaders = [
            "References", "Bibliography", "Literature cited", "Works cited",
            "Citations", "Sources", "Notes"
        ];
        var query = refheaders
            .map(function(val) { return "#" + val; })
            .join(", ");
        var refsection = jQuery(query).parent().next();
        var cites = refsection.find('.citation');
        for(var i = 0; i < cites.length; i++) {
            var id = cites[i].getAttribute('id');
            // we only need to check citations with a CITEREF
            if(!id || id.indexOf('CITEREF') !== 0) {
                continue;
            }
            // don't do cites that are inside a ref
            var parentid = cites[i].parentNode.parentNode.getAttribute('id');
            if(parentid && parentid.indexOf('cite_note') === 0) {
                continue;
            }
            // check for links to this citation
            var query = 'a[href|="#' + id + '"]';
            if(jQuery(query).length === 0) {
                cites[i].innerHTML +=
                    " <strong class=warning>Harv warning: There is no link pointing to this citation.</strong>";
            }
        }
    }
});