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);