用户:卡介菌/common.js:修订间差异
来自Rizline中文维基
更多操作
< 用户:卡介菌
| 第1行: | 第1行: | ||
(function($) { | mw.loader.using(['mediawiki.util', 'jquery']).done(function() { | ||
$(function() { | |||
$('.bmv-container').each(function() { | |||
const container = $(this); | |||
const songName = container.data('song-name'); | |||
const rawDifficulties = container.data('difficulties'); | |||
if ($ | // 在当前容器内查找元素 | ||
const difficultyDiv = container.find('.bmv-difficulty-btn'); | |||
} | const ratioDiv = container.find('.bmv-ratio-btn'); | ||
const outputSpan = container.find('.bmv-output'); | |||
// 难度颜色映射 | |||
const difficultyColors = { | |||
"EZ": "#57E4C4", | |||
"HD": "#FDBA61", | |||
"IN": "#FE8661", | |||
"AT": "#4C364B" | |||
}; | |||
// 解析并设置难度数据 | |||
function parseDifficulties(input) { | |||
if (!input || typeof input !== 'string') return null; | |||
try { | |||
return input.split(',').map(item => { | |||
const match = item.trim().match(/^([A-Za-z]+)\s*(\d+)$/); | |||
if (!match) throw new Error('Invalid format'); | |||
return `${match[1].toUpperCase()} ${match[2]}`; | |||
}); | |||
} catch (e) { | |||
console.error("Error parsing difficulties:", input, e); | |||
return null; | |||
} | |||
} | |||
const difficultyStates = parseDifficulties(rawDifficulties); | |||
// 检查参数是否有效 | |||
if (!songName || !difficultyStates || difficultyStates.length === 0) { | |||
// 在容器内显示错误信息,而不是替换整个表格 | |||
container.css('text-align', 'center').html('<div style="color:red; padding:20px; font-weight:bold;">模板错误:缺少或无效的 songName/difficulties 参数。</div>'); | |||
return; | |||
} | |||
difficultyDiv.attr('data-states', JSON.stringify(difficultyStates)); | |||
// 更新视频输出 | |||
function updateOutput() { | |||
const difficulty = difficultyDiv.text().split(' ')[0]; | |||
const ratio = ratioDiv.text().replace(':', '-'); | |||
const encodedSongName = encodeURIComponent(songName); | |||
const videoUrl = `https://pan.rizwiki.cn/d/${ratio}_${encodedSongName}_${difficulty}.mp4`; | |||
const videoElement = $('<video>', { | |||
class: 'html5media-video', | |||
src: videoUrl, | |||
controls: true, | |||
preload: 'metadata', | |||
loading: 'lazy', | |||
style: 'height:100%; width:100%; object-fit:contain;' | |||
}); | |||
outputSpan.html(videoElement); | |||
} | |||
// 切换难度 | |||
function cycleDifficulty() { | |||
const states = JSON.parse(difficultyDiv.attr('data-states')); | |||
let current = parseInt(difficultyDiv.attr('data-current'), 10); | |||
current = (current + 1) % states.length; | |||
const nextState = states[current]; | |||
const difficultyType = nextState.split(' ')[0]; | |||
const color = difficultyColors[difficultyType] || '#FFFFFF'; | |||
difficultyDiv.text(nextState).attr('data-current', current); | |||
difficultyDiv.parent().css('background-color', color); // 注意这里是父元素td | |||
updateOutput(); | |||
} | |||
// 切换宽高比 | |||
function cycleRatio() { | |||
const states = JSON.parse(ratioDiv.attr('data-states')); | |||
let current = parseInt(ratioDiv.attr('data-current'), 10); | |||
current = (current + 1) % states.length; | |||
ratioDiv.text(states[current]).attr('data-current', current); | |||
updateOutput(); | |||
} | |||
// 绑定事件 | |||
difficultyDiv.on('click', cycleDifficulty); | |||
ratioDiv.parent().on('click', cycleRatio); | |||
// 初始化 | |||
function initialize() { | |||
const firstDiff = difficultyStates[0]; | |||
const diffType = firstDiff.split(' ')[0]; | |||
difficultyDiv.text(firstDiff); | |||
difficultyDiv.parent().css('background-color', difficultyColors[diffType]); | |||
updateOutput(); | |||
} | } | ||
initialize(); | |||
}); | }); | ||
} | }); | ||
}); | |||
2025年7月11日 (五) 11:32的版本
mw.loader.using(['mediawiki.util', 'jquery']).done(function() {
$(function() {
$('.bmv-container').each(function() {
const container = $(this);
const songName = container.data('song-name');
const rawDifficulties = container.data('difficulties');
// 在当前容器内查找元素
const difficultyDiv = container.find('.bmv-difficulty-btn');
const ratioDiv = container.find('.bmv-ratio-btn');
const outputSpan = container.find('.bmv-output');
// 难度颜色映射
const difficultyColors = {
"EZ": "#57E4C4",
"HD": "#FDBA61",
"IN": "#FE8661",
"AT": "#4C364B"
};
// 解析并设置难度数据
function parseDifficulties(input) {
if (!input || typeof input !== 'string') return null;
try {
return input.split(',').map(item => {
const match = item.trim().match(/^([A-Za-z]+)\s*(\d+)$/);
if (!match) throw new Error('Invalid format');
return `${match[1].toUpperCase()} ${match[2]}`;
});
} catch (e) {
console.error("Error parsing difficulties:", input, e);
return null;
}
}
const difficultyStates = parseDifficulties(rawDifficulties);
// 检查参数是否有效
if (!songName || !difficultyStates || difficultyStates.length === 0) {
// 在容器内显示错误信息,而不是替换整个表格
container.css('text-align', 'center').html('<div style="color:red; padding:20px; font-weight:bold;">模板错误:缺少或无效的 songName/difficulties 参数。</div>');
return;
}
difficultyDiv.attr('data-states', JSON.stringify(difficultyStates));
// 更新视频输出
function updateOutput() {
const difficulty = difficultyDiv.text().split(' ')[0];
const ratio = ratioDiv.text().replace(':', '-');
const encodedSongName = encodeURIComponent(songName);
const videoUrl = `https://pan.rizwiki.cn/d/${ratio}_${encodedSongName}_${difficulty}.mp4`;
const videoElement = $('<video>', {
class: 'html5media-video',
src: videoUrl,
controls: true,
preload: 'metadata',
loading: 'lazy',
style: 'height:100%; width:100%; object-fit:contain;'
});
outputSpan.html(videoElement);
}
// 切换难度
function cycleDifficulty() {
const states = JSON.parse(difficultyDiv.attr('data-states'));
let current = parseInt(difficultyDiv.attr('data-current'), 10);
current = (current + 1) % states.length;
const nextState = states[current];
const difficultyType = nextState.split(' ')[0];
const color = difficultyColors[difficultyType] || '#FFFFFF';
difficultyDiv.text(nextState).attr('data-current', current);
difficultyDiv.parent().css('background-color', color); // 注意这里是父元素td
updateOutput();
}
// 切换宽高比
function cycleRatio() {
const states = JSON.parse(ratioDiv.attr('data-states'));
let current = parseInt(ratioDiv.attr('data-current'), 10);
current = (current + 1) % states.length;
ratioDiv.text(states[current]).attr('data-current', current);
updateOutput();
}
// 绑定事件
difficultyDiv.on('click', cycleDifficulty);
ratioDiv.parent().on('click', cycleRatio);
// 初始化
function initialize() {
const firstDiff = difficultyStates[0];
const diffType = firstDiff.split(' ')[0];
difficultyDiv.text(firstDiff);
difficultyDiv.parent().css('background-color', difficultyColors[diffType]);
updateOutput();
}
initialize();
});
});
});