User:Gary/comment highlighter.js: Difference between revisions

Content deleted Content added
f
fix
 
(27 intermediate revisions by 2 users not shown)
Line 1:
// 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 King/comments in local time.js]] for now).
COMMENT HIGHLIGHTER
Description: Highlights recent comments yellow, while your own comments are
FIXME Remove dependency on [[User:Gary King/comments in local time.js]].
highlighted in blue.
FIXME Fix on [[WP:RFA]] nominations (!votes, as in comments wrapped in <li>s).
*/
 
(Requires [[User:Gary/comments in local time.js]] for now).
if (typeof(unsafeWindow) != 'undefined')
{
var addOnloadHook = unsafeWindow.addOnloadHook;
var mw = unsafeWindow.mw;
}
 
FIXME: Remove dependency on [[User:Gary/comments in local time.js]].
addOnloadHook(commentHighlighter);
FIXME: Fix on [[WP:RFA]] nominations (!votes, as in comments wrapped in
function commentHighlighter()
<li>s).
{
*/
// Mirrored from [[User:Gary King/monobook.js]]
var CommentHighlighter, runCHScript;
var discussionPages =
[
'Wikipedia:Articles for deletion',
'Wikipedia:Featured article candidates',
'Wikipedia:Featured article review',
'Wikipedia:Featured list candidates',
'Wikipedia:Featured list removal candidates',
'Wikipedia:Featured picture candidates',
'Wikipedia:Valued picture candidates',
'Wikipedia:Requests for adminship'
];
 
CommentHighlighter = (function() {
var isDiscussionPage = ($.inArray(mw.config.get('wgPageName').split('/')[0].replace(/_/g, ' '), discussionPages) != -1 || mw.config.get('wgCanonicalNamespace').indexOf('talk') != -1 || mw.config.get('wgCanonicalNamespace').indexOf('Talk') != -1) || ($('#ca-addsection').length ? true : false);
var now;
if (!isDiscussionPage || mw.config.get('wgAction') != 'view') return false;
// Get the closest parent node for a comment.
function sortParents(a, b)
{
return a[1] - b[1];
}
 
class CommentHighlighter {
function getCommentParent(node, commentDivsExist)
static calculateColorRatio(maxTime, minPercentage, maxPercentage, timestamp) {
{
var colorRatio;
var parent = node.parent();
minPercentage = minPercentage / 100;
if (commentDivsExist && (parent[0].nodeName == 'DD' || parent[0].nodeName == 'P' || parent[0].nodeName == 'DIV')) return parent;
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 div = node.parentsUntil('div');
var i, len, newParent, parent, possible, possibleParentNode, possibleParentNodes, possibleParents, possibleResults;
var dd = node.parentsUntil('dd');
possibleParentNodes = ['DD', 'DIV', 'LI', 'P'];
var p = node.parentsUntil('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 = $('<div class="comment"></div>');
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 possibleParents = [[div.eq(0).parent(), div.length], [dd.eq(0).parent(), dd.length], [p.eq(0).parent(), p.length]];
var colorRatio, parent, timestampValue;
possibleParents.sort(sortParents);
timestampValue = parseInt(timestamp.attr('timestamp'));
if (possibleParents[0][1]) parent = possibleParents[0][0];
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) {
if (parent.parentsUntil('.diff').parent().hasClass('diff')) return $();
var linkIsGood, parent, secondUsernameCheck, usernameCheck;
else if (parent.length && !commentDivsExist && parent.contents().length)
linkIsGood = link && link.attr('href');
{
usernameCheck = this.linkLinksToUsername(formattedUsername, link);
var newParent = $('<div class="comment"></div>');
if (secondUsername) {
parent.contents().each(function()
secondUsernameCheck = this.linkLinksToUsername(secondUsername, link);
{
} else {
var node = $(this);
secondUsernameCheck = false;
if (node[0].nodeName == 'DL') return false;
}
newParent.append(node);
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() {
parent.prepend(newParent);
var formattedUsername, maxTime, myUsername, secondUsername, usernameBackground;
return newParent;
// 24 hours before we don't color a comment anymore
}
maxTime = 1000 * 60 * 60 * 24;
else return parent;
// 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) {
function calculateColorRatio(maxTime, minPercentage, maxPercentage, timestamp)
if (link.attr('href') && link.attr('href').indexOf(username) > -1 && link.attr('href').indexOf(username) === (link.attr('href').length - username.length)) {
{
return true;
var today = new Date();
} else {
minPercentage = minPercentage / 100;
return false;
maxPercentage = maxPercentage / 100;
}
var colorRatio = ((maxPercentage - minPercentage) * ((today.getTime() - timestamp.getTime()) / maxTime) + minPercentage) * 100;
}
if (colorRatio < minPercentage) colorRatio = minPercentage;
return colorRatio;
}
 
};
var maxTime = 1000 * 60 * 60 * 24;
 
now = new Date();
// Highlight messages posted today. (REQUIRES [[WP:COMMENTS IN LOCAL TIME]] SCRIPT)
$('span.localcomments').each(function()
{
var timestamp = $(this);
var timestampValue = parseInt(timestamp.attr('timestamp'));
var parent = getCommentParent(timestamp);
parent.attr('title', timestamp.text());
 
return CommentHighlighter;
if ((new Date()).getTime() - timestampValue < maxTime)
{
var colorRatio = calculateColorRatio(maxTime, 50, 100, new Date(timestampValue));
parent.css('background-color', 'rgb(100%, 100%, ' + colorRatio + '%)');
}
});
 
}).call(this);
// Highlight discussion sections that I am linked from (i.e. that I participated or was mentioned in).
// Also highlight the line itself.
var formattedUsername = 'User:' + mw.config.get('wgUserName').replace(/ /g, '_');
var blueBackground = '#eef';
 
// This script depends on "Comments in Local Time", so it should run after that.
$('#bodyContent a').each(function()
runCHScript = function() {
{
if (window.mw.config.get('wgAction') === 'view' && (typeof isDiscussionPage !== "undefined" && isDiscussionPage !== null) && isDiscussionPage) {
var link = $(this);
return setTimeout(function() {
if (link.attr('href').indexOf(formattedUsername) != -1 && link.attr('href').indexOf(formattedUsername) == (link.attr('href').length - formattedUsername.length) && !link.parents('#contentSub').length)
return CommentHighlighter.init();
{
}, 0);
var parent = getCommentParent(link, true);
}
parent.css('background-color', blueBackground);
};
link.parentsUntil('#bodyContent').last().prevUntil('h2').last().prev().css('background-color', blueBackground);
 
}
$(function() {
});
return runCHScript();
}
});
 
}).call(this);