跳转到内容

User:Quest for Truth/comments in local time zh.js

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

这是本页的一个历史版本,由Quest for Truth留言 | 贡献2009年5月24日 (日) 20:37 建立内容为“Based on [[:en:Wikipedia:Comments in Local Time]]:​ addOnloadHook(function() { // wgCanonicalNamespace = unsafeWindow.wgCanonicalNamespace…”的新頁面)编辑。这可能和当前版本存在着巨大的差异。

(差异) ←上一修订 | 最后版本 (差异) | 下一修订→ (差异)
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/*
    Based on [[:en:Wikipedia:Comments in Local Time]]
*/

addOnloadHook(function()
{
    // wgCanonicalNamespace = unsafeWindow.wgCanonicalNamespace
    
    /*
        Settings
    */
    if (typeof(LocalComments) == 'undefined')
        LocalComments = {};
 
    if (typeof(LocalComments.dateFormat) == 'undefined')
    {
        // Deprecated: LocalizeConfig
        if (typeof(LocalizeConfig) != 'undefined' && typeof(LocalizeConfig.dateFormat) != 'undefined' && LocalizeConfig.dateFormat != '')
            LocalComments.dateFormat = LocalizeConfig.dateFormat;
        else
            LocalComments.dateFormat = '年月日';
    }
 
    if (typeof(LocalComments.timeFirst) == 'undefined')
        LocalComments.timeFirst = false;
        
    if (typeof(LocalComments.dateDifference) == 'undefined')
        LocalComments.dateDifference = true;
    /*
        End Settings
    */
 
    if (wgCanonicalNamespace == '' || wgCanonicalNamespace == 'MediaWiki' || wgCanonicalNamespace == 'Special')
        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_id = unique_url ? unique_url : 'bodyContent';
    replace_text(document.getElementById(element_id), /(\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.setUTCFullYear(old_year, 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 (hour > 11) ampm = '下午';
    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 = '今日';
    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 = 'from now';
                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() + '個月';
                descriptive_difference.push(months_ago);
            }
            if (difference.getDate() > 0)
            {
                var new_days_ago = difference.getDate() + '日';
                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());
        
        switch (LocalComments.dateFormat.toLowerCase())
        {
            case '年月日':
                formatted_date = year + '年' + month + '月' + day + '日';
                break;
            default:
                formatted_date = year + '-' + month + '-' + add_leading_zero(day);
        }
        
        var date = formatted_date + '(' + last + day_of_the_week + descriptive_difference + ')';
    }
    
    var time = ampm + ' ' + hour + ':' + minute;
    
    if (LocalComments.timeFirst)
        var return_date = time + ', ' + date + ' (UTC' + utc_offset + ')';
    else
        var return_date = date + time + '(UTC' + utc_offset + ')';

    return return_date;
}

/* Unnecessary function in Chinese Language

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('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', '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.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;
            
            for (match = 0; match < matches.length; match++)
            {
                if (after_match != null && length != null)
                    position = after_match.search(search) + before_match.length + length;
                else
                    position = value.search(search);
                
                length = matches[match].toString().length;
                before_match = value.substring(0, position);
                var after_match = value.substring(position + length);
                
                first_span = document.createElement('span');            
                first_span.setAttribute('style', 'font-size: 95%; white-space: nowrap;');
                
                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 = document.createDocumentFragment();
                new_node.appendChild(document.createTextNode(before_match));
                new_node.appendChild(first_span);
                new_node.appendChild(document.createTextNode(after_match));

                // new_node_list = new_node.childNodes;
                node_parent_node.replaceChild(new_node, old_node);
                // old_node_list = new_node_list;
                
                break;
            }
        }
    }
    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);
    }
}

});