MediaWiki

MediaWiki:Dictionary.js

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献2025年10月3日 (五) 18:37的版本 (创建页面,内容为“(function() { 'use strict'; if (mw.config.get('wgPageName') !== 'MediaWiki:Dictionary') { return; } var API_URL = mw.util.wikiScript('api'); var dictionaryData = {}; // 加载词典数据 function loadDictionaryData() { $.ajax({ url: API_URL, data: { action: 'scribunto-console', title: 'Module:词典/data', question: 'return require…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
(function() {
    'use strict';
    
    if (mw.config.get('wgPageName') !== 'MediaWiki:Dictionary') {
        return;
    }
    
    var API_URL = mw.util.wikiScript('api');
    var dictionaryData = {};
    
    // 加载词典数据
    function loadDictionaryData() {
        $.ajax({
            url: API_URL,
            data: {
                action: 'scribunto-console',
                title: 'Module:词典/data',
                question: 'return require("Module:词典/data").dictionary',
                format: 'json'
            },
            dataType: 'json',
            success: function(response) {
                if (response && response.parse) {
                    try {
                        dictionaryData = JSON.parse(response.parse.text['*']);
                        renderDictionary();
                    } catch(e) {
                        console.error('解析数据失败:', e);
                    }
                }
            },
            error: function() {
                // 备用方案:直接从页面加载
                loadFromModulePage();
            }
        });
    }
    
    // 从模块页面加载数据
    function loadFromModulePage() {
        $.get(mw.util.getUrl('Module:词典/data', {action: 'raw'}), function(content) {
            try {
                dictionaryData = parseLuaTable(content);
                renderDictionary();
            } catch(e) {
                console.error('解析Lua失败:', e);
            }
        });
    }
    
    // 简单的Lua表解析器
    function parseLuaTable(luaContent) {
        var result = {};
        var dictMatch = luaContent.match(/data\.dictionary\s*=\s*\{([\s\S]*?)\}/);
        if (!dictMatch) return result;
        
        var content = dictMatch[1];
        var entryRegex = /\["([^"]+)"\]\s*=\s*\{([\s\S]*?)\},?\s*(?=\["|$)/g;
        var match;
        
        while ((match = entryRegex.exec(content)) !== null) {
            var key = match[1];
            var itemsContent = match[2];
            result[key] = [];
            
            var itemRegex = /\{([^}]+)\}/g;
            var itemMatch;
            while ((itemMatch = itemRegex.exec(itemsContent)) !== null) {
                var item = {};
                var props = itemMatch[1].split(',');
                props.forEach(function(prop) {
                    var propMatch = prop.match(/\["([^"]+)"\]\s*=\s*"([^"]*)"/);
                    if (propMatch) {
                        item[propMatch[1]] = propMatch[2];
                    }
                });
                result[key].push(item);
            }
        }
        return result;
    }
    
    // 渲染词典界面
    function renderDictionary() {
        var container = $('#dictionary-editor');
        if (!container.length) {
            container = $('<div>').attr('id', 'dictionary-editor').appendTo('#mw-content-text');
        }
        
        container.empty();
        
        // 添加标题和新建按钮
        var header = $('<div>').addClass('dict-header').appendTo(container);
        $('<div>').addClass('dict-title').text('词典编辑器').appendTo(header);
        $('<div>').addClass('dict-btn dict-btn-primary').text('+ 新建词条').click(showAddEntryDialog).appendTo(header);
        
        // 渲染词条列表
        var list = $('<div>').addClass('dict-list').appendTo(container);
        
        Object.keys(dictionaryData).sort().forEach(function(key) {
            var items = dictionaryData[key];
            items.forEach(function(item, index) {
                var entry = $('<div>').addClass('dict-entry').appendTo(list);
                
                var entryHeader = $('<div>').addClass('dict-entry-header').appendTo(entry);
                $('<div>').addClass('dict-entry-name').text(key).appendTo(entryHeader);
                
                var actions = $('<div>').addClass('dict-entry-actions').appendTo(entryHeader);
                $('<div>').addClass('dict-btn dict-btn-small').text('编辑')
                    .click(function() { showEditDialog(key, index); }).appendTo(actions);
                $('<div>').addClass('dict-btn dict-btn-small dict-btn-danger').text('删除')
                    .click(function() { deleteEntry(key, index); }).appendTo(actions);
                
                var entryBody = $('<div>').addClass('dict-entry-body').appendTo(entry);
                
                var colorClass = 'dict-color-' + (item['颜色'] || 'white');
                $('<div>').addClass('dict-field').html('<span class="dict-label">颜色:</span> <span class="' + colorClass + '">' + (item['颜色'] || '') + '</span>').appendTo(entryBody);
                $('<div>').addClass('dict-field').html('<span class="dict-label">类型:</span> ' + (item['类型'] || '')).appendTo(entryBody);
                $('<div>').addClass('dict-field').html('<span class="dict-label">图标:</span> ' + (item['icon'] || '')).appendTo(entryBody);
                $('<div>').addClass('dict-field').html('<span class="dict-label">描述:</span> ' + (item['描述'] || '')).appendTo(entryBody);
            });
        });
    }
    
    // 显示添加词条对话框
    function showAddEntryDialog() {
        showDialog('新建词条', {}, function(data) {
            var name = data.name;
            delete data.name;
            
            if (!dictionaryData[name]) {
                dictionaryData[name] = [];
            }
            dictionaryData[name].push(data);
            saveDictionary();
        }, true);
    }
    
    // 显示编辑对话框
    function showEditDialog(key, index) {
        var item = dictionaryData[key];
        var data = $.extend({name: key}, item[index]);
        
        showDialog('编辑词条', data, function(newData) {
            var newName = newData.name;
            delete newData.name;
            
            if (newName !== key) {
                // 名称改变,删除旧的
                dictionaryData[key].splice(index, 1);
                if (dictionaryData[key].length === 0) {
                    delete dictionaryData[key];
                }
                if (!dictionaryData[newName]) {
                    dictionaryData[newName] = [];
                }
                dictionaryData[newName].push(newData);
            } else {
                dictionaryData[key][index] = newData;
            }
            saveDictionary();
        }, false);
    }
    
    // 显示对话框
    function showDialog(title, data, callback, isNew) {
        var overlay = $('<div>').addClass('dict-overlay').appendTo('body');
        var dialog = $('<div>').addClass('dict-dialog').appendTo(overlay);
        
        $('<div>').addClass('dict-dialog-title').text(title).appendTo(dialog);
        
        var form = $('<div>').addClass('dict-form').appendTo(dialog);
        
        // 名称字段
        var nameField = createField('名称', 'text', data.name || '', isNew);
        form.append(nameField);
        
        // 类型字段(下拉)
        var typeField = createSelectField('类型', ['卡牌机制', '战斗员专属机制', 'buff', 'debuff'], data['类型'] || '');
        form.append(typeField);
        
        // 颜色字段(下拉)
        var colorField = createSelectField('颜色', ['白', '蓝', '红', '橙', '彩'], data['颜色'] || '');
        form.append(colorField);
        
        // 图标字段
        var iconField = createField('图标', 'text', data['icon'] || '', true);
        form.append(iconField);
        
        // 描述字段
        var descField = createField('描述', 'textarea', data['描述'] || '', true);
        form.append(descField);
        
        var actions = $('<div>').addClass('dict-dialog-actions').appendTo(dialog);
        $('<div>').addClass('dict-btn dict-btn-secondary').text('取消').click(function() {
            overlay.remove();
        }).appendTo(actions);
        
        $('<div>').addClass('dict-btn dict-btn-primary').text('保存').click(function() {
            var formData = {
                name: nameField.find('input').val(),
                '类型': typeField.find('.dict-select').attr('data-value'),
                '颜色': colorField.find('.dict-select').attr('data-value'),
                'icon': iconField.find('input').val(),
                '描述': descField.find('textarea').val()
            };
            
            if (!formData.name) {
                alert('请输入名称');
                return;
            }
            
            overlay.remove();
            callback(formData);
        }).appendTo(actions);
    }
    
    // 创建表单字段
    function createField(label, type, value, editable) {
        var field = $('<div>').addClass('dict-form-group');
        $('<div>').addClass('dict-form-label').text(label + ':').appendTo(field);
        
        var input;
        if (type === 'textarea') {
            input = $('<textarea>').addClass('dict-input').val(value).attr('rows', 3);
        } else {
            input = $('<input>').addClass('dict-input').attr('type', type).val(value);
        }
        
        if (!editable) {
            input.attr('readonly', 'readonly');
        }
        
        input.appendTo(field);
        return field;
    }
    
    // 创建下拉选择字段
    function createSelectField(label, options, value) {
        var field = $('<div>').addClass('dict-form-group');
        $('<div>').addClass('dict-form-label').text(label + ':').appendTo(field);
        
        var selectWrapper = $('<div>').addClass('dict-select-wrapper').appendTo(field);
        var selectDisplay = $('<div>').addClass('dict-select')
            .attr('data-value', value || options[0])
            .text(value || options[0])
            .appendTo(selectWrapper);
        
        var dropdown = $('<div>').addClass('dict-dropdown').appendTo(selectWrapper);
        
        options.forEach(function(opt) {
            $('<div>').addClass('dict-option').text(opt).click(function() {
                selectDisplay.text(opt).attr('data-value', opt);
                dropdown.hide();
            }).appendTo(dropdown);
        });
        
        selectDisplay.click(function(e) {
            e.stopPropagation();
            $('.dict-dropdown').hide();
            dropdown.toggle();
        });
        
        $(document).click(function() {
            dropdown.hide();
        });
        
        return field;
    }
    
    // 删除词条
    function deleteEntry(key, index) {
        if (!confirm('确定要删除这个词条吗?')) {
            return;
        }
        
        dictionaryData[key].splice(index, 1);
        if (dictionaryData[key].length === 0) {
            delete dictionaryData[key];
        }
        saveDictionary();
    }
    
    // 保存词典到模块
    function saveDictionary() {
        var luaCode = generateLuaCode();
        
        $.post(API_URL, {
            action: 'edit',
            title: 'Module:词典/data',
            text: luaCode,
            summary: '通过词典编辑器更新',
            token: mw.user.tokens.get('csrfToken'),
            format: 'json'
        }).done(function(response) {
            if (response.edit && response.edit.result === 'Success') {
                mw.notify('保存成功!', {type: 'success'});
                renderDictionary();
            } else {
                mw.notify('保存失败:' + (response.error ? response.error.info : '未知错误'), {type: 'error'});
            }
        }).fail(function() {
            mw.notify('保存失败:网络错误', {type: 'error'});
        });
    }
    
    // 生成Lua代码
    function generateLuaCode() {
        var lines = ['local data = {}', '', 'data.dictionary = {'];
        
        var keys = Object.keys(dictionaryData).sort();
        keys.forEach(function(key, keyIndex) {
            lines.push('    ["' + key + '"] = {');
            
            dictionaryData[key].forEach(function(item, itemIndex) {
                lines.push('        {');
                lines.push('            ["icon"] = "' + (item.icon || '') + '",');
                lines.push('            ["类型"] = "' + (item['类型'] || '') + '",');
                lines.push('            ["颜色"] = "' + (item['颜色'] || '') + '",');
                lines.push('            ["描述"] = "' + (item['描述'] || '') + '",');
                lines.push('        }' + (itemIndex < dictionaryData[key].length - 1 ? ',' : ''));
            });
            
            lines.push('    }' + (keyIndex < keys.length - 1 ? ',' : ''));
        });
        
        lines.push('}', '', 'return data', '');
        return lines.join('\n');
    }
    
    // 初始化
    $(function() {
        loadDictionaryData();
    });
})();