MediaWiki:Gadget-CommentsinLocalTime.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

//Gary King, "User:Gary King/comments in local time.js," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=User:Gary_King/comments_in_local_time.js&oldid=281324481 (accessed May 28, 2009).
(function($, mw) {
	const langConv = require('ext.gadget.HanAssist').conv;
	var CommentsInLocalTime = function() {
		// mw.config.get('wgCanonicalNamespace') = unsafeWindow.mw.config.get('wgCanonicalNamespace')

		/*
		Settings
		 */
		var LocalComments = window.LocalComments || {};

		if (typeof(LocalComments.dateFormat) === 'undefined') {
			// Deprecated: LocalizeConfig
			if (typeof(window.LocalizeConfig) !== 'undefined' && typeof(window.LocalizeConfig.dateFormat) !== 'undefined' && window.LocalizeConfig.dateFormat !== '') {
				LocalComments.dateFormat = LocalizeConfig.dateFormat;
			} else {
				LocalComments.dateFormat = 'ymd';
			}
		}

		if (typeof(LocalComments.timeFirst) === 'undefined') LocalComments.timeFirst = false;
		if (typeof(LocalComments.dateDifference) === 'undefined') LocalComments.dateDifference = true;
		if (typeof(LocalComments.twentyFourHours) === 'undefined') LocalComments.twentyFourHours = false;
		if (typeof(LocalComments.dayOfWeek) === 'undefined') LocalComments.dayOfWeek = true;
		if (typeof(LocalComments.utcOffset) !== 'number') LocalComments.utcOffset = -1 * new Date().getTimezoneOffset() / 60;
		if (typeof(LocalComments.disablePages) !== 'function') {
			LocalComments.disablePages = function() {
				return false;
			};
		}
		/*
		End Settings
		 */

		if (mw.config.get('wgCanonicalNamespace') === '' || mw.config.get('wgCanonicalNamespace') === 'MediaWiki' || mw.config.get('wgCanonicalNamespace') === 'Special' || LocalComments.disablePages()) return;

		var disabled_urls = new Array('action=history'),
			unique_url = false,
			wikiPreview = new Array('action=edit', 'action=submit');
		for (var i = 0; i < disabled_urls.length; i++) {
			if (document.location.href.indexOf(disabled_urls[i]) !== -1) return;
		}
		for (var i = 0; i < wikiPreview.length; i++) {
			if (document.location.href.indexOf(wikiPreview[i]) != -1) unique_url = 'wikiPreview';
		}

		var element_class = unique_url ? unique_url : '.mw-body-content .mw-parser-output';
		replace_text(document.querySelector(element_class), /(\d{4})年(\d{1,2})月(\d{1,2})日 \([一二三四五六日]\) (\d\d):(\d\d) \(UTC\)/g, adjust_time);

		function add_leading_zero(number) {
			if (number < 10) number = '0' + number;
			return number;
		}

		function adjust_time(original_timestamp, old_year, old_month, old_day, old_hour, old_minute, 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.setFullYear(old_year, old_month - 1, old_day);
			time.setHours(old_hour);
			time.setMinutes(old_minute);

			// determine the time offset
			var utc_offset = LocalComments.utcOffset;
			if (utc_offset >= 0) {
				utc_offset = '+' + utc_offset;
			} else {
				utc_offset = '−' + Math.abs(utc_offset);
			}
			
			time = new Date( +time + LocalComments.utcOffset * 36e5 );

			// 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 and user config settings
			ampm = '';
			if (!LocalComments.twentyFourHours) {
				ampm = hour <= 11 ? ' am' : ' pm';
				if (hour > 12) {
					hour -= 12;
				} else if (hour === 0) {
					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 = '今天';
			} else if (year == yesterday.getFullYear() && month == add_leading_zero(yesterday.getMonth() + 1) && day == yesterday.getDate()) {
				var date = '昨天';
			} else if (year == tomorrow.getFullYear() && month == add_leading_zero(tomorrow.getMonth() + 1) && day == tomorrow.getDate()) {
				var date = '明天';
			} else {
				// calculate day of week
				day_names = new Array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
				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());

					milliseconds_ago = today.getTime() - time.getTime();
					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 = '前';
						if (days_ago <= 7) last = '';
					} else {
						difference = new Date(time.valueOf() - today.valueOf());
						difference_word = langConv({
							hans: '后',
							hant: '後'
						});
						if (days_ago >= -7) last = '';
					}
					var descriptive_difference = [];

					if (difference.getYear() - 70 > 0) {
						var years_ago = (difference.getYear() - 70) + '年';
						descriptive_difference.push(years_ago);
					}
					if (difference.getMonth() > 0) {
						var months_ago = difference.getMonth() + langConv({
							hans: '个月',
							hant: '個月'
						});
						descriptive_difference.push(months_ago);
					}
					if (difference.getDate() > 0) {
						var new_days_ago = difference.getDate() - 1 + '日';
						descriptive_difference.push(new_days_ago);
					}

					descriptive_difference = ' (' + descriptive_difference.join('') + difference_word + ')';
				} else {
					descriptive_difference = '';
					last = '';
				}

				// format the date according to user preferences
				var formatted_date = '',
					month_name = convert_number_to_month(time.getMonth()),
					month = time.getMonth() + 1;

				switch (LocalComments.dateFormat.toLowerCase()) {
				case 'ymd':
					formatted_date = year + '年' + month + '月' + day + '日';
					break;
				case 'ymd0':
					formatted_date = year + '年' + add_leading_zero(month) + '月' + add_leading_zero(day) + '日';
					break;
				case 'dmy':
					formatted_date = day + ' ' + month_name + ' ' + year;
					break;
				case 'mdy':
					formatted_date = month_name + ' ' + day + ', ' + year;
					break;
				default:
					formatted_date = year + '-' + add_leading_zero(month) + '-' + add_leading_zero(day);
				}

				var date = '';
				if (LocalComments.dayOfWeek) {
					date = formatted_date + ', ' + last + day_of_the_week + descriptive_difference;
				} else {
					date = formatted_date + ', ' + descriptive_difference;
				}
			}

			var time = add_leading_zero(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('一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月');
			return month[number];
		}

		function replace_text(node, search, replace) {
			if (!node) {
				return;
			} else if (node.nodeType == 3) {
				value = node.nodeValue;
				matches = value.match(search);

				if (matches != null) {
					node_parent_node = node.parentNode;
					old_node = node;
					// old_node_list = node.parentNode.childNodes;

					new_node = document.createDocumentFragment();

					var after_match = value;

					for (match = 0; match < matches.length; match++) {
						var position = after_match.search(search);
						var length = matches[match].toString().length;
						var before_match = after_match.substring(0, position);
						after_match = after_match.substring(position + length);

						first_span = document.createElement('span');
						first_span.setAttribute('style', 'font-size: 85%;');

						second_span = document.createElement('span');
						second_span.setAttribute('class', 'localcomments');
						second_span.setAttribute('title', matches[match]);
						second_span.appendChild(document.createTextNode(matches[match].toString().replace(search, replace)));

						first_span.appendChild(second_span);

						new_node.appendChild(document.createTextNode(before_match));
						new_node.appendChild(first_span);

						// new_node_list = new_node.childNodes;
						// old_node_list = new_node_list;
					}

					new_node.appendChild(document.createTextNode(after_match));
					node_parent_node.replaceChild(new_node, old_node);
				}
			} else {
				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);
			}
		}
	};

	window.CommentsinLocalTime = CommentsInLocalTime;
	$(function() {
		if ($('.mw-graph').length === 0) {
			mw.hook('wikipage.content').add(function($item) {
				if ($item.attr('id') === 'mw-content-text' && window.location.href.indexOf('&disable=loco') === -1) CommentsInLocalTime();
			});
		} else {
			$(window).ready(function() {
				window.setTimeout(function() {
					mw.hook('wikipage.content').add(function($item) {
						if ($item.attr('id') === 'mw-content-text' && window.location.href.indexOf('&disable=loco') === -1) CommentsInLocalTime();
					});
				}, 2000);
			});
		}
	});
})(jQuery, mw);