打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

用户:卡介菌/common.js:修订间差异

来自Rizline中文维基
第1行: 第1行:
(function($) {
mw.loader.using(['mediawiki.util', 'jquery']).done(function() {
     mw.hook('wikipage.content').add(function($content) {
  $(function() {
         var $widget = $content.find('.js-bmv-widget');
     $('.bmv-container').each(function() {
         const container = $(this);
        const songName = container.data('song-name');
        const rawDifficulties = container.data('difficulties');


         if ($widget.length > 0) {
         // 在当前容器内查找元素
             console.log("Widget found. Data attributes are:", $widget.data());
        const difficultyDiv = container.find('.bmv-difficulty-btn');
         } else {
        const ratioDiv = container.find('.bmv-ratio-btn');
             console.log("Widget with class .js-bmv-widget NOT found.");
        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();
     });
     });
}(jQuery));
  });
});

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();
    });
  });
});