MediaWiki:Common.js
From KAYŌ 💖 DAY
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') && !lang.startsWith('ja')) {
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"> </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)];
var fileTitle = decodeURIComponent(selectedImageLink.href.split('/').pop());
$.getJSON(mw.util.wikiScript('api'), {
action: 'query',
titles: fileTitle,
prop: 'imageinfo',
iiprop: 'url',
format: 'json'
}, function (data) {
var pages = data.query && data.query.pages;
if (pages) {
for (var id in pages) {
if (pages[id].imageinfo && pages[id].imageinfo[0]) {
pipingUrl = pages[id].imageinfo[0].url;
$('.top-bar').css({
'background': 'linear-gradient(to right, #000 20%, transparent 50%), url(' + pipingUrl + ') 100% center / 80% auto no-repeat'
});
break;
}
}
}
});
}
}
// 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');
}
}
});
});
