User:UncleDouggie/comments in local time.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:UncleDouggie/comments in local time. |
// This version has been merged back into the gadget at [[User:Gary King/comments in local time.js]].
// This file kept for the history and future enhancements.
/*
COMMENTS IN LOCAL TIME
Description: Changes [[Coordinated Universal Time|UTC]]-based times and dates, such as those used in signatures, to be relative to local time.
Documentation: [[Wikipedia:Comments in Local Time]]
Link: [[User:Gary King/comments in local time.js]]
TODO Make lines with more than one timestamp format all timestamps on the line.
*/
$(document).ready(commentsInLocalTime);
var language;
function commentsInLocalTime()
{
// wgCanonicalNamespace = unsafeWindow.wgCanonicalNamespace
/*
Language
LOCALIZING THIS SCRIPT
To localize this script, change the terms below, to the RIGHT of the colons,
to the correct term used in that language.
For example, in the French language,
'Today' : 'Today',
would be
'Today' : 'Aujourd’hui',
*/
language =
{
// relative terms
'Today' : 'Today',
'Yesterday' : 'Yesterday',
'Tomorrow' : 'Tomorrow',
'last' : 'last',
'this' : 'this',
// days of the week
'Sunday' : 'Sunday',
'Monday' : 'Monday',
'Tuesday' : 'Tuesday',
'Wednesday' : 'Wednesday',
'Thursday' : 'Thursday',
'Friday' : 'Friday',
'Saturday' : 'Saturday',
// months of the year
'January' : 'January',
'February' : 'February',
'March' : 'March',
'April' : 'April',
'May' : 'May',
'June' : 'June',
'July' : 'July',
'August' : 'August',
'September' : 'September',
'October' : 'October',
'November' : 'November',
'December' : 'December',
// difference words
'ago' : 'ago',
'from now' : 'from now',
// date phrases
'year' : 'year',
'years' : 'years',
'month' : 'month',
'months' : 'months',
'day' : 'day',
'days' : 'days'
};
/*
Settings
*/
if (typeof(LocalComments) == 'undefined')
LocalComments = {};
if (typeof(LocalComments.dateDifference) == 'undefined')
LocalComments.dateDifference = true;
if (typeof(LocalComments.dropDays) == 'undefined')
LocalComments.dropDays = 0;
if (typeof(LocalComments.dropMonths) == 'undefined')
LocalComments.dropMonths = 0;
if (typeof(LocalComments.dateFormat) == 'undefined')
{
// Deprecated: LocalizeConfig
if (typeof(LocalizeConfig) != 'undefined' && typeof(LocalizeConfig.dateFormat) != 'undefined' && LocalizeConfig.dateFormat != '')
LocalComments.dateFormat = LocalizeConfig.dateFormat;
else
LocalComments.dateFormat = 'dmy';
}
if (typeof(LocalComments.dayOfWeek) == 'undefined')
LocalComments.dayOfWeek = true;
if (typeof(LocalComments.timeFirst) == 'undefined')
LocalComments.timeFirst = true;
if (typeof(LocalComments.twentyFourHours) == 'undefined')
LocalComments.twentyFourHours = false;
/*
End Settings
*/
if (wgCanonicalNamespace == '' || wgCanonicalNamespace == 'MediaWiki' || wgCanonicalNamespace == 'Special' || wgAction == 'history')
return false;
replace_text(document.getElementById((wgAction == 'edit' || wgAction == 'submit') ? 'wikiPreview' : 'bodyContent'), /(\d\d):(\d\d), (\d{1,2}) ([A-Z][a-z]+) (\d{4}) \(UTC\)/g, adjust_time);
}
function add_leading_zero(number)
{
if (number < 10)
number = '0' + number;
return number;
}
function adjust_time(original_timestamp, old_hour, old_minute, old_day, old_month, old_year, offset)
{
var today = new Date(), yesterday = new Date(), tomorrow = new Date();
yesterday.setDate(yesterday.getDate() - 1);
tomorrow.setDate(tomorrow.getDate() + 1);
// set the date entered
var time = new Date();
time.setUTCFullYear(old_year, convert_month_to_number(old_month), old_day);
time.setUTCHours(old_hour);
time.setUTCMinutes(old_minute);
// determine the time offset
var utc_offset = -1 * time.getTimezoneOffset() / 60;
if (utc_offset >= 0)
utc_offset = '+' + utc_offset;
else
utc_offset = '−' + Math.abs(utc_offset);
// set the date bits to output
var year = time.getFullYear();
var month = add_leading_zero(time.getMonth() + 1);
var day = time.getDate();
var hour = parseInt(time.getHours());
var minute = add_leading_zero(time.getMinutes());
// output am or pm depending on the date
var ampm = '';
if (LocalComments.twentyFourHours)
hour = add_leading_zero(hour);
else
{
ampm = ' am';
if (hour > 11) ampm = ' pm';
if (hour > 12) hour -= 12;
if (hour == '00') hour = 12;
}
// return 'today' or 'yesterday' if that is the case
if (year == today.getFullYear() && month == add_leading_zero(today.getMonth() + 1) && day == today.getDate())
var date = language['Today'];
else if (year == yesterday.getFullYear() && month == add_leading_zero(yesterday.getMonth() + 1) && day == yesterday.getDate())
var date = language['Yesterday'];
else if (year == tomorrow.getFullYear() && month == add_leading_zero(tomorrow.getMonth() + 1) && day == tomorrow.getDate())
var date = language['Tomorrow'];
else
{
// calculate day of week
var day_names = new Array(language['Sunday'], language['Monday'], language['Tuesday'], language['Wednesday'], language['Thursday'], language['Friday'], language['Saturday']);
var day_of_the_week = day_names[time.getDay()];
var descriptive_difference = '';
var last = '';
if (LocalComments.dateDifference)
{
// calculate time difference from today
var milliseconds_ago = today.getTime() - time.getTime();
var days_ago = Math.abs(Math.round(milliseconds_ago / 1000 / 60 / 60 / 24));
var difference_word = '', last = '';
if (today.valueOf() >= time.valueOf())
{
difference_word = language['ago'];
if (days_ago <= 7)
last = language['last'] + ' ';
}
else
{
difference_word = language['from now'];
if (days_ago <= 7)
last = language['this'] + ' ';
}
// This method of computing the years & months is not exact.
// However, it's better than the previous method that used
// 1 January + delta days. That was usually quite off because
// it mapped the second delta month to February, which has only 28 days.
// This method is usually not more than one day off.
var months_ago = Math.floor(days_ago / 365 * 12); // close enough
var total_months_ago = months_ago;
var years_ago = Math.floor(months_ago / 12);
if (months_ago < LocalComments.dropMonths)
years_ago = 0;
else if (LocalComments.dropMonths > 0)
months_ago = 0;
else
months_ago = months_ago - years_ago * 12;
if (days_ago < LocalComments.dropDays)
{
months_ago = 0;
years_ago = 0;
}
else if (LocalComments.dropDays > 0)
days_ago = 0;
else
days_ago = days_ago - Math.floor(total_months_ago * 365 / 12);
var descriptive_parts = [];
if (years_ago > 0)
{
var fmt_years = years_ago + ' ' + pluralize(language['year'], years_ago, language['years']);
descriptive_parts.push(fmt_years);
}
if (months_ago > 0)
{
var fmt_months = months_ago + ' ' + pluralize(language['month'], months_ago, language['months']);
descriptive_parts.push(fmt_months);
}
if (days_ago > 0)
{
var fmt_days = days_ago + ' ' + pluralize(language['day'], days_ago, language['days']);
descriptive_parts.push(fmt_days);
}
descriptive_difference = ' (' + descriptive_parts.join(', ') + ' ' + difference_word + ')';
}
// format the date according to user preferences
var formatted_date = '', month_name = convert_number_to_month(time.getMonth());
switch (LocalComments.dateFormat.toLowerCase())
{
case 'dmy':
formatted_date = day + ' ' + month_name + ' ' + year;
break;
case 'mdy':
formatted_date = month_name + ' ' + day + ', ' + year;
break;
default:
formatted_date = year + '-' + month + '-' + add_leading_zero(day);
}
var formatted_day_of_the_week = '';
if (LocalComments.dayOfWeek)
formatted_day_of_the_week = ', ' + last + day_of_the_week;
var date = formatted_date + formatted_day_of_the_week + descriptive_difference;
}
var time = hour + ':' + minute + ampm;
if (LocalComments.timeFirst)
var return_date = time + ', ' + date + ' (UTC' + utc_offset + ')';
else
var return_date = date + ', ' + time + ' (UTC' + utc_offset + ')';
return return_date;
}
function convert_month_to_number(month)
{
var output = new Date(month + ' 1, 2001');
return output.getMonth();
}
function convert_number_to_month(number)
{
var month = new Array(language['January'], language['February'], language['March'], language['April'], language['May'], language['June'], language['July'], language['August'], language['September'], language['October'], language['November'], language['December']);
return month[number];
}
function pluralize(term, count, plural)
{
if (plural == null)
plural = term + 's';
return (count == 1 ? term : plural)
}
function replace_text(node, search, replace)
{
if (node != null && node.nodeType == 3)
{
var value = node.nodeValue;
var matches = value.match(search);
if (matches != null)
{
var node_parent_node = node.parentNode;
var old_node = node;
// old_node_list = node.parentNode.childNodes;
for (match = 0; match < matches.length; match++)
{
// Create <span class="localcomments" style="font-size: 95%; white-space: nowrap;" title="MATCHES[MATCH]">MATCHES[MATCH]</span>
var position;
if (after_match != null && length != null)
position = after_match.search(search) + before_match.length + length;
else
position = value.search(search);
var length = matches[match].toString().length;
var before_match = value.substring(0, position);
var after_match = value.substring(position + length);
var span = document.createElement('span');
span.setAttribute('class', 'localcomments');
span.style.fontSize = '95%';
span.style.whiteSpace = 'nowrap';
span.setAttribute('title', matches[match]);
span.appendChild(document.createTextNode(matches[match].toString().replace(search, replace)));
var new_node = document.createDocumentFragment();
new_node.appendChild(document.createTextNode(before_match));
new_node.appendChild(span);
new_node.appendChild(document.createTextNode(after_match));
node_parent_node.replaceChild(new_node, old_node);
break;
}
}
}
else if (node != null)
{
var children = [], child = node.firstChild;
while (child)
{
children[children.length] = child;
child = child.nextSibling;
}
for (var child = 0; child < children.length; child++)
replace_text(children[child], search, replace);
}
}