User:Gary/comment highlighter.js

// Generated by CoffeeScript 2.1.1

(function() {

/*

COMMENT HIGHLIGHTER

Description: Highlights recent comments yellow, while your own comments are

highlighted in blue.

(Requires User:Gary/comments in local time.js for now).

FIXME: Remove dependency on User:Gary/comments in local time.js.

FIXME: Fix on WP:RFA nominations (!votes, as in comments wrapped in

  • s).

    */

    var CommentHighlighter, runCHScript;

    CommentHighlighter = (function() {

    var now;

    class CommentHighlighter {

    static calculateColorRatio(maxTime, minPercentage, maxPercentage, timestamp) {

    var colorRatio;

    minPercentage = minPercentage / 100;

    maxPercentage = maxPercentage / 100;

    colorRatio = ((maxPercentage - minPercentage) * ((now.valueOf() - timestamp.valueOf()) / maxTime) + minPercentage) * 100;

    if (colorRatio < minPercentage) {

    colorRatio = minPercentage;

    }

    return colorRatio;

    }

    static getCommentParent(node, commentDivsExist) {

    var i, len, newParent, parent, possible, possibleParentNode, possibleParentNodes, possibleParents, possibleResults;

    possibleParentNodes = ['DD', 'DIV', 'LI', 'P'];

    parent = node.parent();

    if (parent.closest('.diff').length) {

    return $();

    } else if (commentDivsExist && $.inArray(parent[0].nodeName, possibleParentNodes) > -1) {

    return parent;

    }

    possibleParents = [];

    possibleResults = {};

    for (i = 0, len = possibleParentNodes.length; i < len; i++) {

    possibleParentNode = possibleParentNodes[i];

    possible = possibleParentNode.toLowerCase();

    possibleResults[possible] = node.parentsUntil(possible);

    possibleParents.push([possibleResults[possible].first().parent(), possibleResults[possible].length]);

    }

    // Get the closest parent node for a comment.

    possibleParents.sort(function(a, b) {

    return a[1] - b[1];

    });

    if (possibleParents[0][1]) {

    parent = possibleParents[0][0];

    }

    if (parent.length && !commentDivsExist && parent.contents().length) {

    newParent = $('

    ');

    parent.contents().each(function(index, element) {

    node = $(element);

    if (node[0].nodeName === 'DL') {

    return false;

    }

    return newParent.append(node);

    });

    parent.prepend(newParent);

    return newParent;

    } else {

    return parent;

    }

    }

    static highlightComment(timestamp, maxTime) {

    var colorRatio, parent, timestampValue;

    timestampValue = parseInt(timestamp.attr('timestamp'));

    parent = this.getCommentParent(timestamp, false);

    if (!parent.length) {

    return true;

    }

    parent.attr('title', timestamp.text());

    if (now.valueOf() - timestampValue < maxTime) {

    colorRatio = this.calculateColorRatio(maxTime, 50, 100, new Date(timestampValue));

    return parent.css('background-color', 'rgb(100%, 100%, ' + colorRatio + '%)');

    }

    }

    static highlightUsername(link, formattedUsername, secondUsername, usernameBackground) {

    var linkIsGood, parent, secondUsernameCheck, usernameCheck;

    linkIsGood = link && link.attr('href');

    usernameCheck = this.linkLinksToUsername(formattedUsername, link);

    if (secondUsername) {

    secondUsernameCheck = this.linkLinksToUsername(secondUsername, link);

    } else {

    secondUsernameCheck = false;

    }

    if (linkIsGood && (usernameCheck || secondUsernameCheck) && !link.closest('#contentSub').length) {

    parent = this.getCommentParent(link, true);

    if (!parent.length) {

    return true;

    }

    parent.css('background-color', usernameBackground);

    return link.parentsUntil('.mw-content-ltr').last().prevUntil('h2').last().prev().css('background-color', usernameBackground);

    }

    }

    static init() {

    var formattedUsername, maxTime, myUsername, secondUsername, usernameBackground;

    // 24 hours before we don't color a comment anymore

    maxTime = 1000 * 60 * 60 * 24;

    // Highlight messages posted today (REQUIRES WP:Comments in Local Time

    // SCRIPT)

    $('span.localcomments').each((index, element) => {

    return CommentHighlighter.highlightComment($(element), maxTime);

    });

    // Check to see if any comments contain comments. None of them should. But if

    // they do, then unwrap the parent .comment.

    $('.comment').find('.comment').each(function(index, element) {

    var childComment, parentComment;

    childComment = $(element);

    parentComment = childComment.parent().closest('.comment');

    return parentComment.children().first().unwrap();

    });

    // Highlight discussion sections that I am linked from (i.e. that I

    // participated or was mentioned in). Also highlight the line itself.

    myUsername = window.mw.config.get('wgUserName');

    if (myUsername != null) {

    formattedUsername = 'User:' + myUsername.replace(/\ /g, '_');

    usernameBackground = '#eef';

    if (myUsername === 'Gary') {

    secondUsername = 'User:Gary_King';

    }

    return $('#bodyContent a').each((index, element) => {

    return CommentHighlighter.highlightUsername($(element), formattedUsername, secondUsername, usernameBackground);

    });

    }

    }

    static linkLinksToUsername(username, link) {

    if (link.attr('href') && link.attr('href').indexOf(username) > -1 && link.attr('href').indexOf(username) === (link.attr('href').length - username.length)) {

    return true;

    } else {

    return false;

    }

    }

    };

    now = new Date();

    return CommentHighlighter;

    }).call(this);

    // This script depends on "Comments in Local Time", so it should run after that.

    runCHScript = function() {

    if (window.mw.config.get('wgAction') === 'view' && (typeof isDiscussionPage !== "undefined" && isDiscussionPage !== null) && isDiscussionPage) {

    return setTimeout(function() {

    return CommentHighlighter.init();

    }, 0);

    }

    };

    $(function() {

    return runCHScript();

    });

    }).call(this);