Actions

MediaWiki

MediaWiki:Common.js

From KAYŌ 💖 DAY

Revision as of 12:46, 26 July 2026 by Dachy (talk | contribs)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * 唱片 Credit 标签英文替换
 * 独立于 jQuery ready,尽早执行避免中文标签闪烁
 */
var lang = (navigator.language || navigator.userLanguage || '').toLowerCase();
if (lang.startsWith('zh')) {

    var LABEL_MAP = [
        { from: /词曲编/g, to: 'lyrics/music/arr.' },
        { from: /补作词/g, to: 'additional lyrics' },
        { from: /补作曲/g, to: 'additional music' },
        { from: /词曲/g,   to: 'lyrics/music' },
        { from: /作词/g,   to: 'lyrics' },
        { from: /作曲/g,   to: 'music' },
        { from: /编曲/g,   to: 'arr.' },
        { from: /构成/g,   to: 'Concept' }
    ];

    var EXTRA_MAP = [
        { from: /录音:/, to: 'Recording: ' },
        { from: /封面:/, to: 'Cover: ' },
        { from: /手绘:/, to: 'Illustration: ' },
        { from: /伴奏:/, to: 'Accompaniment: ' },
        { from: /演奏:/, to: 'Accompaniment: ' },
        { from: /混音:/, to: 'Mixing: ' },
        { from: /母带:/, to: 'Mastering: ' },
        { from: /制作:/, to: 'Produced by: ' },
        { from: /监制:/, to: 'Supervised by: ' },
        { from: /发行:/, to: 'Released: ' },
        { from: /备注:/, to: 'Notes: ' }
    ];

    var PROCESSED_ATTR = 'data-wiki-i18n-processed';

    function capitalize(str) {
        return str.charAt(0).toUpperCase() + str.slice(1);
    }

    function isInsideBlockquote(node) {
        var el = node.parentElement;
        while (el) {
            if (el.tagName.toLowerCase() === 'blockquote') return true;
            el = el.parentElement;
        }
        return false;
    }

    /** 纯术语替换,blockquote 内外共用 */
    function replaceTerms(val) {
        for (var j = 0; j < EXTRA_MAP.length; j++) {
            if (EXTRA_MAP[j].from.test(val)) val = val.replace(EXTRA_MAP[j].from, EXTRA_MAP[j].to);
        }
        for (var i = 0; i < LABEL_MAP.length; i++) {
            if (LABEL_MAP[i].from.test(val)) val = val.replace(LABEL_MAP[i].from, capitalize(LABEL_MAP[i].to));
        }
        return val;
    }

    /** 检查文本是否包含任一 MAP 术语 */
    function hasTerm(val) {
        for (var j = 0; j < EXTRA_MAP.length; j++) {
            if (EXTRA_MAP[j].from.test(val)) return true;
        }
        for (var i = 0; i < LABEL_MAP.length; i++) {
            if (LABEL_MAP[i].from.test(val)) return true;
        }
        return false;
    }

    function elementHasProcessedContent(el) {
        if (!el || el.nodeType !== Node.ELEMENT_NODE) return false;
        return el.hasAttribute(PROCESSED_ATTR) || !!el.querySelector('[' + PROCESSED_ATTR + ']');
    }

    function hasProcessedPrevSibling(node) {
        var prev = node.previousSibling;
        while (prev) {
            if (prev.nodeType === Node.TEXT_NODE && /^\s*$/.test(prev.nodeValue)) { prev = prev.previousSibling; continue; }
            if (prev.nodeType === Node.ELEMENT_NODE && prev.tagName.toLowerCase() === 'br') { prev = prev.previousSibling; continue; }
            var ancestor = prev, boundary = node.parentNode;
            while (ancestor && ancestor !== boundary) {
                if (elementHasProcessedContent(ancestor)) return true;
                ancestor = ancestor.parentNode;
            }
            return false;
        }
        return false;
    }

    var root = document.querySelector('.mw-body-content') || document.querySelector('.mw-parser-output');
    if (root) {
        var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
            acceptNode: function (node) {
                var parent = node.parentElement;
                if (!parent) return NodeFilter.FILTER_REJECT;
                var tag = parent.tagName.toLowerCase();
                if (tag === 'script' || tag === 'style' || tag === 'noscript') return NodeFilter.FILTER_REJECT;
                if (isInsideBlockquote(node)) return hasTerm(node.nodeValue) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
                return /[\u4e00-\u9fa5\u3001\uff0c\uff1a\u3002]/.test(node.nodeValue) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
            }
        }, false);

        var textNodes = [];
        while (walker.nextNode()) textNodes.push(walker.currentNode);

        textNodes.forEach(function (node) {
            var val = node.nodeValue;

            // ── blockquote 内:仅术语替换 ──
            if (isInsideBlockquote(node)) {
                var replaced = replaceTerms(val);
                if (replaced !== val) node.nodeValue = replaced;
                return;
            }

            // ── blockquote 外:完整流程 ──
            var original = val;
            var matched = false;

            val = val.replace(/^\uff0c\s*/, ', ')
                     .replace(/([\u4e00-\u9fa5])\uff0c([\u4e00-\u9fa5])/g, '$1, $2')
                     .replace(/([\u4e00-\u9fa5])\u3001([\u4e00-\u9fa5])/g, '$1/$2');

            var afterTerms = replaceTerms(val);
            if (afterTerms !== val) { val = afterTerms; matched = true; }

            if (matched) val = val.replace(/([A-Za-z.])\uff1a/g, '$1: ');

            if (matched) {
                val = val.replace(/\u3002(?=[^\u4e00-\u9fa5]|$)/g, '.');
            } else if (/^\u3002\s*$/.test(val.trim()) && hasProcessedPrevSibling(node)) {
                val = val.replace(/\u3002/, '.');
                matched = true;
            }

            if (val !== original) {
                if (!/\s$/.test(val)) val += ' ';
                node.nodeValue = val;
                var markTarget = node.parentElement;
                while (markTarget && markTarget !== root) {
                    markTarget.setAttribute(PROCESSED_ATTR, '1');
                    var t = markTarget.tagName.toLowerCase();
                    if (t === 'small' || t === 'span' || t === 'li' || /^(p|div|td|th|section)$/.test(t)) break;
                    markTarget = markTarget.parentElement;
                }
            }
        });
    }
}

$(document).ready(function() {

    // 计算运行天数
    var now = new Date().getTime();
    var then = new Date('2007-07-27 22:19').getTime();
    var runningDays = Math.ceil((now - then) / 1000 / 86400);
    var runningYears = (runningDays / 365).toFixed(1);
    $('#running-days').text(runningDays);
    $('#running-years').text(runningYears);
    if (runningDays && runningYears) {
        $('#running').show().css('display', 'block');
    }

    // 引用播放器代码
    // $('head').append($("<script>").attr({
    //    type: 'text/javascript',
    //     src: 'https://cdnjs.cloudflare.com/ajax/libs/mediaelement/5.0.5/mediaelement-and-player.min.js'
    // }))

    // 删除 tagline
    $('#tagline').remove();
    $('#siteSub').remove();

    // 厂牌如果为空,删除十字架符号
    $('.record-label').each(function () {
        if ($(this).text() === '†') {
            $(this).remove();
        }
    });

    // 清除"监视本页""移动图像"选中状态
    if (window.location.href.toLowerCase().indexOf('edit') !== -1 || window.location.href.toLowerCase().indexOf('special') !== -1) {
        $('#wpWatchthis').prop('checked', false);
        $('#wpIgnoreWarning').prop('checked', true);
        $('[name=wpLeaveRedirect]').prop('checked', false);
        $('[name=wpLeaveRedirect]').each(function() {
            $(this).prop('checked', false);
        });
    }

    // 插入亚马逊链接
    // 修改链接的 href 属性
    $('.amz-link a.external.text').each(function() {
        var $this = $(this);
        var href = $this.attr('href');

        if (href) {
            var $dfn = $this.closest('.amz-link').find('dfn');
            if ($dfn.length > 0) {
                $dfn.find('small').remove();

                var dfnText = '';
                if ($dfn.find('a').length > 0) {
                    dfnText = $dfn.find('a').text().trim();
                } else {
                    dfnText = $dfn.text().trim();
                }

                if (dfnText) {
                    var encodedDfnText = encodeURIComponent(dfnText).replace(/%20/g, '+');

                    var newHref = href.replace(/(k=)([^&]*)/, function(match, p1, p2) {
                        return p1 + p2 + '+' + encodedDfnText;
                    });

                    $this.attr('href', newHref);
                    $dfn.remove();
                }
            }
        }
    });

    // 播放器
    // $('.btn-play-audio:not([data-file="none"])').addClass('show')
    // $('*[data-file="none"]').remove()
    // var playerCode = '<div id="player"><p class="track-title">&nbsp;</p></div>'
    // $('body').append(playerCode)
    // if ($.fn.mediaelementplayer) {
    //     $('video, audio').mediaelementplayer({
    //         pluginPath: 'https://cdnjs.com/libraries/mediaelement/',
    //         shimScriptAccess: 'always',
    //     })
    // }
    // $('.btn-play-audio').remove()
    // $('.btn-play-audio').on('click', function () {
    //     if ($.fn.mediaelementplayer) {
    //         $('video, audio').mediaelementplayer({
    //             pluginPath: 'https://cdnjs.com/libraries/mediaelement/',
    //             shimScriptAccess: 'always',
    //         })
    //     }
    //     var url = '/audio/' + $(this).attr('data-file') + '.mp3'
    //     var title = $(this).attr('data-file').split('-')[$(this).attr('data-file').split('-').length - 1]
    //     $('.btn-play-audio').removeClass('playing')
    //     $(this).addClass('playing')
    //     $('#player').addClass('show')
    //     $('#player .track-title').text(title)
    //     $('#player audio').attr('src', url)
    //     $('#player audio')[0].volume = 0.6
    //     $('#player audio')[0].play()
    //     if ($('#player audio')[0].paused) {
    //         $('.btn-play-audio').removeClass('playing')
    //     } else {
    //         $('.btn-play-audio').removeClass('playing')
    //     }
    // })

    // 导航加随机背景图
    var pipingUrl;
    if ($('.mw-default-size a').length > 0) {
        var imageLinks = $('.mw-default-size a').toArray();
        var validImageLinks = imageLinks.filter(function(link) { return !link.href.includes('Comingsoon.png'); });

        if (validImageLinks.length > 0) {
            var selectedImageLink = validImageLinks[Math.floor(Math.random() * validImageLinks.length)];

            $.get(selectedImageLink.href, function (data) {
                pipingUrl = $(data).find('.fullImageLink a').attr('href');

                $('.top-bar').css({
                    'background': 'linear-gradient(to right, #000 20%, transparent 50%), url(' + pipingUrl + ') 100% center / 80% auto no-repeat',
                });
            });
        }
    }

    // CDandLP 链接生成
    $('.cdandlp-link').each(function() {
        var $container = $(this);
        var $link = $container.find('a[data-value]');

        if ($link.length > 0) {
            var rawName = $link.data('value');

            if (rawName) {
                var urlName = rawName.replace(/ /g, '-');
                var finalUrl = 'https://www.cdandlp.com/en/' + urlName + '/artist/?affilie=dachy&utm_source=kayo.day&utm_medium=link&utm_campaign=affiliation';

                $link.attr('href', finalUrl).removeAttr('data-value');
            }
        }
    });

});
Twitter FLUX | pop