User:PresN/timecomments.js
/*
EDITED VERSION OF:
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.
TODO All instances of "new Date(today.getYear()" should be changed to "new Date(today.getFullYear()"
*/
$(function()
{
// 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',
*/
var 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.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.timeFirst) == 'undefined')
LocalComments.timeFirst = true;
if (typeof(LocalComments.twentyFourHours) == 'undefined')
LocalComments.twentyFourHours = false;
/*
End Settings
*/
var wgCanonicalNamespace = mw.config.get('wgCanonicalNamespace');
var wgAction = mw.config.get('wgAction');
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(), month = add_leading_zero(time.getMonth() + 1);
var day = time.getDate();
var hour = parseInt(time.getHours()), minute = add_leading_zero(time.getMinutes());
// output am or pm depending on the date
var ampm = '';
if (!LocalComments.twentyFourHours)
{
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()];
if (LocalComments.dateDifference)
{
// calculate time difference from today and the timestamp
today = new Date(today.getYear(), today.getMonth(), today.getDate());
time = new Date(time.getYear(), time.getMonth(), time.getDate());
var milliseconds_ago = today.getTime() - time.getTime();
var days_ago = Math.round(milliseconds_ago / 1000 / 60 / 60 / 24);
var difference, difference_word = '', last = '';
if (today.valueOf() >= time.valueOf())
{
difference = new Date(today.valueOf() - time.valueOf());
difference_word = language['ago'];
if (days_ago <= 7)
last = language['last'] + ' ';
}
else
{
difference = new Date(time.valueOf() - today.valueOf());
difference_word = language['from now'];
if (days_ago >= -7)
last = language['this'] + ' ';
}
var descriptive_difference = [];
if (difference.getYear() - 70 > 0)
{
var years_ago = (difference.getYear() - 70) + ' ' + pluralize(language['year'], difference.getYear() - 70, language['years']);
descriptive_difference.push(years_ago);
}
if (difference.getMonth() > 0)
{
var months_ago = difference.getMonth() + ' ' + pluralize(language['month'], difference.getMonth(), language['months']);
descriptive_difference.push(months_ago);
}
if (difference.getDate() > 0)
{
var new_days_ago = difference.getDate() + ' ' + pluralize(language['day'], difference.getDate(), language['days']);
descriptive_difference.push(new_days_ago);
}
descriptive_difference = ' (' + descriptive_difference.join(', ') + ' ' + difference_word + ')';
}
else
{
descriptive_difference = '';
last = '';
day_of_the_week = '';
}
// format the date according to user preferences
var formatted_date = '', month_name = convert_number_to_month(time.getMonth());
if (year == today.getFullYear())
{
year = '';
}
switch (LocalComments.dateFormat.toLowerCase())
{
case 'dmy':
formatted_date = day + ' ' + month_name + ' ' + year;
break;
case 'mdy':
if (year == '')
{
formatted_date = month_name + ' ' + day;
}
else
{
formatted_date = month_name + ' ' + day + ', ' + year;
}
break;
default:
formatted_date = year + '-' + month + '-' + add_leading_zero(day);
}
var date = formatted_date + last + day_of_the_week + descriptive_difference;
}
var time = hour + ':' + minute + ampm;
if (LocalComments.timeFirst)
var return_date = time + ', ' + date;
else
var return_date = date + ', ' + time;
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);
}
}
});
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.