MediaWikiGadget-CommentsInLocalTime.js
外觀
注意:儲存之後,可能不會立即進行更改,單擊此處瞭解如何繞過瀏覽器的快取。
- Mozilla / Firefox / Safari: 按住 Shift 點選 重新載入,或按 Ctrl-Shift-R(Apple Mac 上為 Cmd-Shift-R);
- Internet Explorer: 按住 Ctrl 點選 重新整理,或按 Ctrl-F5;
- Konqueror: 只需單擊 重新載入 按鈕或按 F5;
- Opera 使用者可能需要在 工具→偏好設定 中完全清除其快取。
// Generated by CoffeeScript 1.8.0
/**
* 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:
* English Wikibooks documentation: [[Wikibooks:Comments in Local Time]]
*/
var CommentsInLocalTime, runScript;
CommentsInLocalTime = (function() {
var LocalComments, language;
function CommentsInLocalTime() {}
language = '';
LocalComments = {};
CommentsInLocalTime.settings = function() {
if (window.LocalComments != null) {
LocalComments = window.LocalComments;
}
/*
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",
*/
return LocalComments.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'
};
};
/*
APPLICATION
*/
CommentsInLocalTime.init = function() {
/*
Settings
*/
var contentText, namespace, pageAction;
this.settings();
if (LocalComments.language == null) {
return false;
}
language = this.setDefaultSetting('language', LocalComments.language);
this.setDefaultSetting({
'dateDifference': true,
'dateFormat': 'dmy',
'dayOfWeek': true,
'dropDays': 0,
'dropMonths': 0,
'timeFirst': true,
'twentyFourHours': false
});
/*
End Settings
*/
namespace = mw.config.get('wgCanonicalNamespace');
pageAction = mw.config.get('wgAction');
if (['', 'MediaWiki', 'Special'].indexOf(namespace) > -1 || pageAction === 'history') {
return false;
}
contentText = document.getElementById('mw-content-text');
if (mw.config.get('wgAction') !== 'view' || (contentText == null)) {
return false;
}
return this.replaceText(contentText, /(\d{1,2}):(\d{2}), (\d{1,2}) ([A-Z][a-z]+) (\d{4}) \(UTC\)/);
};
CommentsInLocalTime.replaceText = function(node, search) {
var after, afterMatch, before, beforeMatch, child, children, length, match, matches, parent, parentNodeName, position, span, timeArray, timestamp, value, _i, _len, _results;
if (!node) {
return false;
}
if (node.nodeType === 3) {
parent = node.parentNode;
parentNodeName = parent.nodeName;
if (['CODE', 'PRE'].indexOf(parentNodeName) > -1) {
return false;
}
value = node.nodeValue;
matches = value.match(search);
if (matches != null) {
match = matches[0];
position = value.search(search);
length = match.toString().length;
beforeMatch = value.substring(0, position);
afterMatch = value.substring(position + length);
timeArray = this.adjustTime(match.toString(), search);
timestamp = timeArray[1] ? timeArray[1].getTime() : '';
span = document.createElement('span');
span.className = 'localcomments';
span.style.fontSize = '95%';
span.style.whiteSpace = 'nowrap';
span.setAttribute('timestamp', timestamp);
span.title = match;
span.appendChild(document.createTextNode(timeArray[0]));
parent = node.parentNode;
parent.replaceChild(span, node);
before = document.createElement('span');
before.className = 'before-localcomments';
before.appendChild(document.createTextNode(beforeMatch));
after = document.createElement('span');
after.className = 'after-localcomments';
after.appendChild(document.createTextNode(afterMatch));
parent.insertBefore(before, span);
return parent.insertBefore(after, span.nextSibling);
}
} else {
children = [];
child = node.childNodes[0];
while (child) {
children.push(child);
child = child.nextSibling;
}
_results = [];
for (_i = 0, _len = children.length; _i < _len; _i++) {
child = children[_i];
_results.push(this.replaceText(child, search));
}
return _results;
}
};
CommentsInLocalTime.adjustTime = function(originalTimestamp, search) {
var ampm, date, day, dayNames, dayOfTheWeek, descriptiveDifference, finalTime, formattedDate, formattedDayOfTheWeek, hour, last, minute, month, monthName, oldDay, oldHour, oldMinute, oldMonth, oldYear, returnDate, time, today, tomorrow, utcOffset, year, yesterday, _ref, _ref1;
time = originalTimestamp.match(search);
_ref = [time[1], time[2], time[3], time[4], time[5]], oldHour = _ref[0], oldMinute = _ref[1], oldDay = _ref[2], oldMonth = _ref[3], oldYear = _ref[4];
today = new Date();
yesterday = new Date();
tomorrow = new Date();
yesterday.setDate(yesterday.getDate() - 1);
tomorrow.setDate(tomorrow.getDate() + 1);
time = new Date();
time.setUTCFullYear(oldYear, this.convertMonthToNumber(oldMonth), oldDay);
time.setUTCHours(oldHour);
time.setUTCMinutes(oldMinute);
if (isNaN(time)) {
return [originalTimestamp, ''];
}
utcOffset = -1 * time.getTimezoneOffset() / 60;
utcOffset = utcOffset >= 0 ? '+' + utcOffset : '−' + Math.abs(utcOffset);
year = time.getFullYear();
month = this.addLeadingZero(time.getMonth() + 1);
day = time.getDate();
hour = parseInt(time.getHours());
minute = this.addLeadingZero(time.getMinutes());
ampm = '';
if (LocalComments.twentyFourHours) {
hour = this.addLeadingZero(hour);
} else {
ampm = hour <= 11 ? ' am' : ' pm';
if (hour > 12) {
hour -= 12;
} else if (hour === 0) {
hour = 12;
}
}
if (year === today.getFullYear() && month === this.addLeadingZero(today.getMonth() + 1) && day === today.getDate()) {
date = language['Today'];
} else if (year === yesterday.getFullYear() && month === this.addLeadingZero(yesterday.getMonth() + 1) && day === yesterday.getDate()) {
date = language['Yesterday'];
} else if (year === tomorrow.getFullYear() && month === this.addLeadingZero(tomorrow.getMonth() + 1) && day === tomorrow.getDate()) {
date = language['Tomorrow'];
} else {
dayNames = [language['Sunday'], language['Monday'], language['Tuesday'], language['Wednesday'], language['Thursday'], language['Friday'], language['Saturday']];
dayOfTheWeek = dayNames[time.getDay()];
descriptiveDifference = '';
last = '';
if (LocalComments.dateDifference) {
_ref1 = this.createRelativeDate(today, time), descriptiveDifference = _ref1.descriptiveDifference, last = _ref1.last;
}
formattedDate = '';
monthName = this.convertNumberToMonth(time.getMonth());
formattedDate = (function() {
switch (LocalComments.dateFormat.toLowerCase()) {
case 'dmy':
return day + ' ' + monthName + ' ' + year;
case 'mdy':
return monthName + ' ' + day + ', ' + year;
default:
return year + '-' + month + '-' + this.addLeadingZero(day);
}
}).call(this);
formattedDayOfTheWeek = '';
if (LocalComments.dayOfWeek) {
formattedDayOfTheWeek = ', ' + last + dayOfTheWeek;
}
date = formattedDate + formattedDayOfTheWeek + descriptiveDifference;
}
finalTime = hour + ':' + minute + ampm;
if (LocalComments.timeFirst) {
returnDate = finalTime + ', ' + date + ' (UTC' + utcOffset + ')';
} else {
returnDate = date + ', ' + finalTime + ' (UTC' + utcOffset + ')';
}
return [returnDate, time];
};
CommentsInLocalTime.createRelativeDate = function(today, time) {
var daysAgo, descriptiveParts, differenceWord, fmtDays, fmtMonths, fmtYears, last, millisecondsAgo, monthsAgo, totalMonthsAgo, yearsAgo;
millisecondsAgo = today.getTime() - time.getTime();
daysAgo = Math.abs(Math.round(millisecondsAgo / 1000 / 60 / 60 / 24));
differenceWord = '';
last = '';
if (millisecondsAgo >= 0) {
differenceWord = language['ago'];
if (daysAgo <= 7) {
last = language['last'] + ' ';
}
} else {
differenceWord = language['from now'];
if (daysAgo <= 7) {
last = language['this'] + ' ';
}
}
monthsAgo = Math.floor(daysAgo / 365 * 12);
totalMonthsAgo = monthsAgo;
yearsAgo = Math.floor(monthsAgo / 12);
if (monthsAgo < LocalComments.dropMonths) {
yearsAgo = 0;
} else if (LocalComments.dropMonths > 0) {
monthsAgo = 0;
} else {
monthsAgo = monthsAgo - yearsAgo * 12;
}
if (daysAgo < LocalComments.dropDays) {
monthsAgo = 0;
yearsAgo = 0;
} else if (LocalComments.dropDays > 0) {
daysAgo = 0;
} else {
daysAgo = daysAgo - Math.floor(totalMonthsAgo * 365 / 12);
}
descriptiveParts = [];
if (yearsAgo > 0) {
fmtYears = yearsAgo + ' ' + this.pluralize(language['year'], yearsAgo, language['years']);
descriptiveParts.push(fmtYears);
}
if (monthsAgo > 0) {
fmtMonths = monthsAgo + ' ' + this.pluralize(language['month'], monthsAgo, language['months']);
descriptiveParts.push(fmtMonths);
}
if (daysAgo > 0) {
fmtDays = daysAgo + ' ' + this.pluralize(language['day'], daysAgo, language['days']);
descriptiveParts.push(fmtDays);
}
return {
descriptiveDifference: ' (' + descriptiveParts.join(', ') + ' ' + differenceWord + ')',
last: last
};
};
/*
HELPERS
*/
CommentsInLocalTime.addLeadingZero = function(number) {
if (number < 10) {
number = '0' + number;
}
return number;
};
CommentsInLocalTime.convertMonthToNumber = function(month) {
return (new Date(month + ' 1, 2001')).getMonth();
};
CommentsInLocalTime.convertNumberToMonth = function(number) {
return [language['January'], language['February'], language['March'], language['April'], language['May'], language['June'], language['July'], language['August'], language['September'], language['October'], language['November'], language['December']][number];
};
CommentsInLocalTime.pluralize = function(term, count, plural) {
if (plural === null) {
plural = term + 's';
}
if (count === 1) {
return term;
} else {
return plural;
}
};
CommentsInLocalTime.setDefaultSetting = function() {
var defaultSetting, name, settings;
if (!arguments.length) {
return false;
}
if (typeof arguments[0] === 'object') {
settings = arguments[0];
for (name in settings) {
defaultSetting = settings[name];
if (LocalComments[name] == null) {
LocalComments[name] = defaultSetting;
}
}
return settings;
} else if (typeof arguments[0] === 'string') {
name = arguments[0];
defaultSetting = arguments[1];
if (LocalComments[name] == null) {
LocalComments[name] = defaultSetting;
}
return LocalComments[name];
}
};
return CommentsInLocalTime;
})();
runScript = function() {
return $(window).on( 'load', function() {
if (window.location.href.indexOf('&disable=loco') === -1) {
return CommentsInLocalTime.init();
}
});
};
if (typeof waitForScripts === 'function') {
waitForScripts(runScript);
} else {
runScript();
}