MediaWiki

Dictionary.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
/**
* MediaWiki词典编辑器
* 用于管理模块:词典/data中的词条数据
*/
(function() {
(function() {
     'use strict';
     'use strict';
      
      
     if (mw.config.get('wgPageName') !== 'MediaWiki:Dictionary') return;
    // 只在MediaWiki:Dictionary页面运行
     if (mw.config.get('wgPageName') !== 'MediaWiki:Dictionary') {
        return;
    }
      
      
     const API_URL = mw.util.wikiScript('api');
     var DictManager = {
    const MODULE_PAGE = '模块:词典/data';
        api: new mw.Api(),
   
        MODULE_PAGE: '模块:词典/data',
    let dictionaryData = {};
        dictionaryData: {},
    let currentEditKey = null;
        currentEditKey: null,
    let currentEditIndex = null;
        currentEditIndex: null,
   
       
    // 初始化
        // 类型选项
    function init() {
        typeOptions: ['', '卡牌机制', '战斗员专属机制', 'buff', 'debuff'],
         const content = document.createElement('div');
        colorOptions: ['', '白', '蓝', '红', '橙', '彩'],
        content.className = 'dict-editor';
       
        content.innerHTML = `
        // 初始化
            <div class="dict-controls">
        init: function() {
                 <div class="dict-btn dict-btn-success" id="dict-add-btn">添加新词条</div>
            this.createUI();
                <div class="dict-btn" id="dict-refresh-btn">刷新数据</div>
            this.loadData();
                <div class="dict-btn" id="dict-save-btn">保存到模块</div>
        },
            </div>
       
            <div id="dict-message"></div>
        // 创建UI
            <div id="dict-content" class="dict-loading">加载中...</div>
         createUI: function() {
            <div class="dict-overlay" id="dict-overlay"></div>
            var container = document.createElement('div');
            <div class="dict-form" id="dict-form">
            container.className = 'dict-editor';
                <h3 id="dict-form-title">添加词条</h3>
            container.innerHTML = `
                <div class="dict-form-group">
                 <div class="dict-section">
                     <label for="dict-name">词条名称</label>
                    <h3>词典管理器</h3>
                     <input type="text" id="dict-name" class="dict-input" />
                    <div id="dict-message"></div>
                </div>
                   
                <div class="dict-form-group">
                    <div class="dict-tabs">
                    <label for="dict-icon">图标</label>
                        <div class="dict-tab active" data-tab="list">词条列表</div>
                    <input type="text" id="dict-icon" class="dict-input" />
                        <div class="dict-tab" data-tab="edit">编辑/新建</div>
                </div>
                    </div>
                <div class="dict-form-group">
                      
                    <label for="dict-type">类型</label>
                     <div id="tab-list" class="dict-tab-content active">
                    <div class="dict-select" id="dict-type" data-value="">
                        <div class="dict-button success" id="dict-create-new">新建词条</div>
                        <div class="dict-select-display">请选择类型</div>
                        <div class="dict-button" id="dict-refresh">刷新数据</div>
                         <div class="dict-select-options">
                         <div class="dict-button secondary" id="dict-save-module">保存到模块</div>
                            <div class="dict-select-option" data-value="卡牌机制">卡牌机制</div>
                        <div id="dict-list-container" class="dict-loading">加载中...</div>
                            <div class="dict-select-option" data-value="战斗员专属机制">战斗员专属机制</div>
                            <div class="dict-select-option" data-value="buff">buff</div>
                            <div class="dict-select-option" data-value="debuff">debuff</div>
                        </div>
                     </div>
                     </div>
                </div>
                      
                <div class="dict-form-group">
                     <div id="tab-edit" class="dict-tab-content">
                     <label for="dict-color">颜色</label>
                         <div id="dict-editor-container"></div>
                     <div class="dict-select" id="dict-color" data-value="">
                        <div class="dict-select-display">请选择颜色</div>
                         <div class="dict-select-options">
                            <div class="dict-select-option" data-value="白">白</div>
                            <div class="dict-select-option" data-value="蓝">蓝</div>
                            <div class="dict-select-option" data-value="红">红</div>
                            <div class="dict-select-option" data-value="橙">橙</div>
                            <div class="dict-select-option" data-value="彩">彩</div>
                        </div>
                     </div>
                     </div>
                 </div>
                 </div>
                <div class="dict-form-group">
            `;
                    <label for="dict-desc">描述</label>
           
                    <textarea id="dict-desc" class="dict-textarea"></textarea>
            var content = document.getElementById('mw-content-text');
                </div>
            content.innerHTML = '';
                <div class="dict-form-actions">
            content.appendChild(container);
                    <div class="dict-btn" id="dict-cancel-btn">取消</div>
           
                    <div class="dict-btn dict-btn-success" id="dict-submit-btn">保存</div>
             this.bindEvents();
                </div>
         },
             </div>
         `;
          
          
         const container = document.getElementById('mw-content-text');
         // 绑定事件
        container.innerHTML = '';
        bindEvents: function() {
        container.appendChild(content);
            var self = this;
           
            // 标签切换
            document.querySelectorAll('.dict-tab').forEach(function(tab) {
                tab.addEventListener('click', function() {
                    self.switchTab(this.getAttribute('data-tab'));
                });
            });
           
            // 新建词条
            document.getElementById('dict-create-new').addEventListener('click', function() {
                self.createNew();
            });
           
            // 刷新数据
            document.getElementById('dict-refresh').addEventListener('click', function() {
                self.loadData();
            });
           
            // 保存到模块
            document.getElementById('dict-save-module').addEventListener('click', function() {
                self.saveToModule();
            });
        },
          
          
         initCustomSelect();
         // 切换标签
        bindEvents();
        switchTab: function(tabName) {
        loadData();
            document.querySelectorAll('.dict-tab').forEach(function(tab) {
    }
                tab.classList.remove('active');
   
             });
    // 自定义下拉选择器
            document.querySelectorAll('.dict-tab-content').forEach(function(content) {
    function initCustomSelect() {
                content.classList.remove('active');
        document.querySelectorAll('.dict-select').forEach(select => {
            });
            const display = select.querySelector('.dict-select-display');
             const options = select.querySelector('.dict-select-options');
              
              
             display.addEventListener('click', () => {
             document.querySelector('[data-tab="' + tabName + '"]').classList.add('active');
                select.classList.toggle('open');
            document.getElementById('tab-' + tabName).classList.add('active');
             });
        },
       
        // 加载数据
        loadData: function() {
             var self = this;
            self.showMessage('加载中...', 'info');
              
              
             select.querySelectorAll('.dict-select-option').forEach(option => {
             this.api.get({
                 option.addEventListener('click', () => {
                action: 'query',
                    const value = option.getAttribute('data-value');
                prop: 'revisions',
                     select.setAttribute('data-value', value);
                titles: this.MODULE_PAGE,
                     display.textContent = option.textContent;
                rvprop: 'content',
                    select.classList.remove('open');
                 rvslots: 'main',
                 });
                format: 'json'
            }).done(function(data) {
                var pages = data.query.pages;
                var pageId = Object.keys(pages)[0];
               
                if (pageId === '-1') {
                     self.showMessage('模块页面不存在', 'error');
                     return;
                }
               
                var content = pages[pageId].revisions[0].slots.main['*'];
                self.parseModuleData(content);
                self.renderList();
                self.showMessage('数据加载成功', 'success');
            }).fail(function() {
                 self.showMessage('加载失败', 'error');
             });
             });
         });
         },
          
          
         // 点击外部关闭
         // 解析模块数据
         document.addEventListener('click', (e) => {
         parseModuleData: function(content) {
            if (!e.target.closest('.dict-select')) {
            try {
                 document.querySelectorAll('.dict-select').forEach(s => s.classList.remove('open'));
                var match = content.match(/data\.dictionary\s*=\s*\{([\s\S]*?)\n\}/);
                if (!match) {
                    this.dictionaryData = {};
                    return;
                }
               
                var dictContent = match[1];
                this.dictionaryData = {};
               
                // 使用正则匹配每个词条
                var entryRegex = /$$"([^"]+)"$$\s*=\s*\{([\s\S]*?)\n\s{4}\}/g;
                 var entryMatch;
               
                while ((entryMatch = entryRegex.exec(dictContent)) !== null) {
                    var key = entryMatch[1];
                    var variantsContent = entryMatch[2];
                   
                    this.dictionaryData[key] = [];
                   
                    // 匹配每个变体
                    var variantRegex = /\{[\s\S]*?$$"icon"$$\s*=\s*"([^"]*)"[\s\S]*?$$"类型"$$\s*=\s*"([^"]*)"[\s\S]*?$$"颜色"$$\s*=\s*"([^"]*)"[\s\S]*?$$"描述"$$\s*=\s*"([^"]*)"[\s\S]*?\}/g;
                    var variantMatch;
                   
                    while ((variantMatch = variantRegex.exec(variantsContent)) !== null) {
                        this.dictionaryData[key].push({
                            icon: variantMatch[1],
                            类型: variantMatch[2],
                            颜色: variantMatch[3],
                            描述: variantMatch[4]
                        });
                    }
                }
               
                console.log('解析完成:', this.dictionaryData);
            } catch (e) {
                console.error('解析错误:', e);
                this.dictionaryData = {};
             }
             }
         });
         },
    }
   
    // 绑定事件
    function bindEvents() {
        document.getElementById('dict-add-btn').addEventListener('click', () => openForm());
        document.getElementById('dict-refresh-btn').addEventListener('click', () => loadData());
        document.getElementById('dict-save-btn').addEventListener('click', () => saveData());
        document.getElementById('dict-overlay').addEventListener('click', closeForm);
        document.getElementById('dict-cancel-btn').addEventListener('click', closeForm);
        document.getElementById('dict-submit-btn').addEventListener('click', submitForm);
    }
   
    // 加载数据
    function loadData() {
        showMessage('加载中...', 'loading');
          
          
         fetch(API_URL + '?' + new URLSearchParams({
         // 渲染列表
            action: 'query',
        renderList: function() {
            prop: 'revisions',
             var container = document.getElementById('dict-list-container');
            titles: MODULE_PAGE,
            rvprop: 'content',
            rvslots: 'main',
            format: 'json'
        }))
        .then(res => res.json())
        .then(data => {
             const pages = data.query.pages;
            const page = pages[Object.keys(pages)[0]];
              
              
             if (page.revisions) {
             if (Object.keys(this.dictionaryData).length === 0) {
                const content = page.revisions[0].slots.main['*'];
                 container.innerHTML = '<div class="dict-message info">暂无词条,点击"新建词条"开始创建</div>';
                parseModuleData(content);
                 return;
                 renderTable();
                showMessage('数据加载成功', 'success');
            } else {
                 showMessage('模块页面不存在', 'error');
             }
             }
        })
           
        .catch(err => {
            var html = '<div class="dict-grid">';
             showMessage('加载失败: ' + err.message, 'error');
             for (var key in this.dictionaryData) {
        });
                var variants = this.dictionaryData[key];
    }
                 html += '<div class="dict-list-item" data-key="' + mw.html.escape(key) + '">';
   
                html += '<strong>' + mw.html.escape(key) + '</strong>';
    // 解析模块数据
                html += '<div style="margin-top: 5px; font-size: 12px; color: #72777d;">';
    function parseModuleData(content) {
                 html += variants.length + ' 个变体';
        try {
                 html += '</div>';
            // 提取 dictionary 表的内容
                html += '</div>';
            const match = content.match(/data\.dictionary\s*=\s*(\{[\s\S]*?\n\})/);
            if (match) {
                 // 简单的Lua表转JSON (这是简化版本,可能需要更复杂的解析)
                let jsonStr = match[1]
                    .replace(/\["([^"]+)"\]\s*=/g, '"$1":')
                    .replace(/\[(\d+)\]\s*=/g, '')
                    .replace(/,(\s*[}\]])/g, '$1');
                  
                 dictionaryData = eval('(' + jsonStr + ')');
             }
             }
        } catch (e) {
             html += '</div>';
             console.error('解析错误:', e);
              
            dictionaryData = {};
            container.innerHTML = html;
        }
    }
   
    // 渲染表格
    function renderTable() {
        const content = document.getElementById('dict-content');
       
        if (Object.keys(dictionaryData).length === 0) {
            content.innerHTML = '<p>暂无数据</p>';
             return;
        }
       
        let html = '<table class="dict-table"><thead><tr><th>词条名称</th><th>变体</th><th>操作</th></tr></thead><tbody>';
       
        for (const [key, variants] of Object.entries(dictionaryData)) {
            html += `<tr><td rowspan="${variants.length + 1}"><strong>${key}</strong></td></tr>`;
              
              
             variants.forEach((variant, index) => {
             var self = this;
                const colorClass = getColorClass(variant.颜色);
            document.querySelectorAll('.dict-list-item').forEach(function(item) {
                html += `
                item.addEventListener('click', function() {
                    <tr>
                    var key = this.getAttribute('data-key');
                        <td>
                     self.editEntry(key);
                            <div class="dict-variant">
                 });
                                <div><span class="dict-badge ${colorClass}">${variant.类型}</span> <span class="dict-badge ${colorClass}">${variant.颜色}</span></div>
                                <div style="margin-top: 5px;">${variant.描述}</div>
                                ${variant.icon ? '<div>图标: ' + variant.icon + '</div>' : ''}
                            </div>
                        </td>
                        <td>
                            <div class="dict-btn" onclick="dictEdit('${key}', ${index})">编辑</div>
                            <div class="dict-btn dict-btn-danger" onclick="dictDelete('${key}', ${index})">删除</div>
                        </td>
                     </tr>
                 `;
             });
             });
         }
         },
          
          
         html += '</tbody></table>';
         // 新建词条
         content.innerHTML = html;
         createNew: function() {
    }
            this.currentEditKey = null;
   
             this.currentEditIndex = null;
    // 获取颜色类名
             this.switchTab('edit');
    function getColorClass(color) {
             this.renderEditor();
        const colorMap = {
             this.showMessage('请填写词条信息', 'info');
             '白': 'dict-badge-white',
         },
             '': 'dict-badge-blue',
             '红': 'dict-badge-red',
             '橙': 'dict-badge-orange',
            '': 'dict-badge-rainbow'
        };
         return colorMap[color] || 'dict-badge-white';
    }
   
    // 打开表单
    function openForm(key = null, index = null) {
        currentEditKey = key;
        currentEditIndex = index;
          
          
         const form = document.getElementById('dict-form');
         // 编辑词条
        const overlay = document.getElementById('dict-overlay');
        editEntry: function(key) {
        const title = document.getElementById('dict-form-title');
            this.currentEditKey = key;
            this.switchTab('edit');
            this.renderEditor();
        },
          
          
         if (key !== null && index !== null) {
         // 渲染编辑器
             title.textContent = '编辑词条';
        renderEditor: function() {
             const variant = dictionaryData[key][index];
             var self = this;
            document.getElementById('dict-name').value = key;
             var container = document.getElementById('dict-editor-container');
             document.getElementById('dict-name').disabled = true;
           
            document.getElementById('dict-icon').value = variant.icon || '';
            var html = '<h4>' + (this.currentEditKey ? '编辑词条: ' + mw.html.escape(this.currentEditKey) : '新建词条') + '</h4>';
            setSelectValue('dict-type', variant.类型);
              
            setSelectValue('dict-color', variant.颜色);
            if (!this.currentEditKey) {
            document.getElementById('dict-desc').value = variant.描述 || '';
                // 新建模式
        } else {
                html += '<div class="dict-form-group">';
            title.textContent = '添加词条';
                html += '<label>词条名称 *</label>';
            document.getElementById('dict-name').value = '';
                html += '<input type="text" class="dict-input" id="dict-entry-name" placeholder="例如: 粉碎">';
            document.getElementById('dict-name').disabled = false;
                html += '</div>';
            document.getElementById('dict-icon').value = '';
               
            setSelectValue('dict-type', '');
                html += '<h4>变体信息</h4>';
            setSelectValue('dict-color', '');
                html += '<div class="dict-field-row">';
             document.getElementById('dict-desc').value = '';
                html += this.renderField('icon', 'text', '图标', '');
         }
                html += this.renderField('type', 'select', '类型 *', '', this.typeOptions);
                html += this.renderField('color', 'select', '颜色 *', '', this.colorOptions);
                html += '</div>';
                html += this.renderField('desc', 'textarea', '描述 *', '');
               
                html += '<div style="margin-top: 20px;">';
                html += '<div class="dict-button success" id="dict-save-new">保存词条</div>';
                html += '<div class="dict-button secondary" id="dict-cancel-edit">取消</div>';
                html += '</div>';
            } else {
                // 编辑模式 - 显示所有变体
                var variants = this.dictionaryData[this.currentEditKey];
               
                html += '<div style="margin-bottom: 20px;">';
                html += '<div class="dict-button success" id="dict-add-variant">添加新变体</div>';
                html += '<div class="dict-button danger" id="dict-delete-entry">删除整个词条</div>';
                html += '<div class="dict-button secondary" id="dict-back-to-list">返回列表</div>';
                html += '</div>';
               
                html += '<h4>现有变体</h4>';
               
                variants.forEach(function(variant, index) {
                    var colorClass = self.getColorClass(variant.颜色);
                    html += '<div class="dict-variant" data-index="' + index + '">';
                    html += '<div class="dict-variant-header">';
                    html += '<span class="dict-badge ' + colorClass + '">' + mw.html.escape(variant.类型) + '</span>';
                    html += '<span class="dict-badge ' + colorClass + '">' + mw.html.escape(variant.颜色) + '</span>';
                    html += '<div class="dict-button" style="float: right; margin-left: 5px;" data-action="delete" data-index="' + index + '">删除</div>';
                    html += '<div class="dict-button" style="float: right;" data-action="edit" data-index="' + index + '">编辑</div>';
                    html += '</div>';
                    html += '<div class="dict-variant-desc">' + mw.html.escape(variant.描述) + '</div>';
                    if (variant.icon) {
                        html += '<div class="dict-variant-icon">图标: ' + mw.html.escape(variant.icon) + '</div>';
                    }
                    html += '</div>';
                });
             }
           
            html += '<div id="dict-preview-container"></div>';
           
            container.innerHTML = html;
           
            this.initCustomSelects();
            this.bindEditorEvents();
         },
          
          
         form.classList.add('active');
         // 渲染表单字段
        overlay.classList.add('active');
        renderField: function(id, type, label, value, options) {
    }
            var html = '<div class="dict-form-group">';
   
            html += '<label>' + mw.html.escape(label) + '</label>';
    // 设置选择器值
           
    function setSelectValue(id, value) {
            if (type === 'select') {
        const select = document.getElementById(id);
                html += '<div class="dict-custom-select" id="dict-' + id + '" data-value="' + mw.html.escape(value) + '">';
        select.setAttribute('data-value', value);
                html += '<div class="dict-select-display">' + (value || '请选择') + '</div>';
        const display = select.querySelector('.dict-select-display');
                html += '<div class="dict-select-options">';
        if (value) {
                options.forEach(function(opt) {
            display.textContent = value;
                    html += '<div class="dict-select-option" data-value="' + mw.html.escape(opt) + '">' +
        } else {
                            mw.html.escape(opt || '请选择') + '</div>';
            display.textContent = select.id === 'dict-type' ? '请选择类型' : '请选择颜色';
                });
        }
                html += '</div></div>';
    }
            } else if (type === 'textarea') {
   
                html += '<textarea class="dict-textarea" id="dict-' + id + '">' + mw.html.escape(value) + '</textarea>';
    // 关闭表单
            } else {
    function closeForm() {
                html += '<input type="text" class="dict-input" id="dict-' + id + '" value="' + mw.html.escape(value) + '">';
        document.getElementById('dict-form').classList.remove('active');
            }
        document.getElementById('dict-overlay').classList.remove('active');
           
    }
            html += '</div>';
   
            return html;
    // 提交表单
        },
    function submitForm() {
        const name = document.getElementById('dict-name').value.trim();
        const icon = document.getElementById('dict-icon').value.trim();
        const type = document.getElementById('dict-type').getAttribute('data-value');
        const color = document.getElementById('dict-color').getAttribute('data-value');
        const desc = document.getElementById('dict-desc').value.trim();
          
          
         if (!name || !type || !color || !desc) {
         // 初始化自定义选择器
             showMessage('请填写所有必填字段', 'error');
        initCustomSelects: function() {
             return;
            var self = this;
         }
           
            document.querySelectorAll('.dict-custom-select').forEach(function(select) {
                var display = select.querySelector('.dict-select-display');
               
                display.addEventListener('click', function(e) {
                    e.stopPropagation();
                    // 关闭其他选择器
                    document.querySelectorAll('.dict-custom-select').forEach(function(s) {
                        if (s !== select) s.classList.remove('open');
                    });
                    select.classList.toggle('open');
                });
               
                select.querySelectorAll('.dict-select-option').forEach(function(option) {
                    option.addEventListener('click', function(e) {
                        e.stopPropagation();
                        var value = this.getAttribute('data-value');
                        select.setAttribute('data-value', value);
                        display.textContent = this.textContent;
                        select.classList.remove('open');
                    });
                });
             });
           
            // 点击外部关闭
            document.addEventListener('click', function() {
                document.querySelectorAll('.dict-custom-select').forEach(function(s) {
                    s.classList.remove('open');
                });
             });
         },
          
          
         const variant = {
         // 绑定编辑器事件
             icon: icon,
        bindEditorEvents: function() {
             类型: type,
            var self = this;
            颜色: color,
           
             描述: desc
            var saveBtn = document.getElementById('dict-save-new');
         };
            if (saveBtn) {
                saveBtn.addEventListener('click', function() {
                    self.saveNewEntry();
                });
            }
           
            var cancelBtn = document.getElementById('dict-cancel-edit');
            if (cancelBtn) {
                cancelBtn.addEventListener('click', function() {
                    self.switchTab('list');
                });
            }
           
            var addVariantBtn = document.getElementById('dict-add-variant');
            if (addVariantBtn) {
                addVariantBtn.addEventListener('click', function() {
                    self.showVariantForm();
                });
            }
           
            var deleteEntryBtn = document.getElementById('dict-delete-entry');
            if (deleteEntryBtn) {
                deleteEntryBtn.addEventListener('click', function() {
                    if (confirm('确定要删除整个词条"' + self.currentEditKey + '"吗?')) {
                        delete self.dictionaryData[self.currentEditKey];
                        self.showMessage('已删除词条,请保存到模块', 'success');
                        self.switchTab('list');
                        self.renderList();
                    }
                });
            }
           
             var backBtn = document.getElementById('dict-back-to-list');
            if (backBtn) {
                backBtn.addEventListener('click', function() {
                    self.switchTab('list');
                });
            }
              
            // 变体操作按钮
            document.querySelectorAll('[data-action]').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    var action = this.getAttribute('data-action');
                    var index = parseInt(this.getAttribute('data-index'));
                   
                    if (action === 'edit') {
                        self.editVariant(index);
                    } else if (action === 'delete') {
                        if (confirm('确定要删除这个变体吗?')) {
                            self.dictionaryData[self.currentEditKey].splice(index, 1);
                            if (self.dictionaryData[self.currentEditKey].length === 0) {
                                delete self.dictionaryData[self.currentEditKey];
                                self.switchTab('list');
                            }
                            self.renderEditor();
                            self.showMessage('已删除变体,请保存到模块', 'success');
                        }
                    }
                });
             });
         },
          
          
         if (currentEditKey !== null && currentEditIndex !== null) {
         // 保存新词条
             // 编辑
        saveNewEntry: function() {
             dictionaryData[currentEditKey][currentEditIndex] = variant;
            var name = document.getElementById('dict-entry-name').value.trim();
        } else {
            var icon = document.getElementById('dict-icon').value.trim();
             // 新增
            var type = document.getElementById('dict-type').getAttribute('data-value');
             if (!dictionaryData[name]) {
             var color = document.getElementById('dict-color').getAttribute('data-value');
                 dictionaryData[name] = [];
             var desc = document.getElementById('dict-desc').value.trim();
              
             if (!name || !type || !color || !desc) {
                 this.showMessage('请填写所有必填字段', 'error');
                return;
             }
             }
             dictionaryData[name].push(variant);
              
         }
            var variant = {
                icon: icon,
                类型: type,
                颜色: color,
                描述: desc
            };
           
            if (!this.dictionaryData[name]) {
                this.dictionaryData[name] = [];
            }
           
            this.dictionaryData[name].push(variant);
            this.showMessage('词条已添加,请保存到模块', 'success');
            this.currentEditKey = name;
            this.renderEditor();
         },
          
          
         renderTable();
         // 显示变体表单
        closeForm();
        showVariantForm: function() {
        showMessage('操作成功,请点击"保存到模块"按钮保存更改', 'success');
            var self = this;
    }
            var preview = document.getElementById('dict-preview-container');
   
           
    // 删除
            var html = '<h4>添加新变体</h4>';
    window.dictDelete = function(key, index) {
            html += '<div class="dict-field-row">';
        if (!confirm('确定要删除这个变体吗?')) return;
            html += this.renderField('new-icon', 'text', '图标', '');
            html += this.renderField('new-type', 'select', '类型 *', '', this.typeOptions);
            html += this.renderField('new-color', 'select', '颜色 *', '', this.colorOptions);
            html += '</div>';
            html += this.renderField('new-desc', 'textarea', '描述 *', '');
            html += '<div style="margin-top: 10px;">';
            html += '<div class="dict-button success" id="dict-save-variant">保存变体</div>';
            html += '<div class="dict-button secondary" id="dict-cancel-variant">取消</div>';
            html += '</div>';
           
            preview.innerHTML = html;
           
            this.initCustomSelects();
           
            document.getElementById('dict-save-variant').addEventListener('click', function() {
                self.saveNewVariant();
            });
           
            document.getElementById('dict-cancel-variant').addEventListener('click', function() {
                preview.innerHTML = '';
            });
        },
          
          
         dictionaryData[key].splice(index, 1);
         // 保存新变体
        if (dictionaryData[key].length === 0) {
        saveNewVariant: function() {
             delete dictionaryData[key];
            var icon = document.getElementById('dict-new-icon').value.trim();
         }
            var type = document.getElementById('dict-new-type').getAttribute('data-value');
            var color = document.getElementById('dict-new-color').getAttribute('data-value');
            var desc = document.getElementById('dict-new-desc').value.trim();
           
            if (!type || !color || !desc) {
                this.showMessage('请填写所有必填字段', 'error');
                return;
            }
           
            var variant = {
                icon: icon,
                类型: type,
                颜色: color,
                描述: desc
            };
              
            this.dictionaryData[this.currentEditKey].push(variant);
            this.showMessage('变体已添加,请保存到模块', 'success');
            this.renderEditor();
         },
          
          
         renderTable();
         // 编辑变体
        showMessage('删除成功,请点击"保存到模块"按钮保存更改', 'success');
        editVariant: function(index) {
    };
            var self = this;
   
            var variant = this.dictionaryData[this.currentEditKey][index];
    // 编辑
            var preview = document.getElementById('dict-preview-container');
    window.dictEdit = function(key, index) {
           
        openForm(key, index);
            var html = '<h4>编辑变体</h4>';
    };
            html += '<div class="dict-field-row">';
   
            html += this.renderField('edit-icon', 'text', '图标', variant.icon);
    // 保存数据
            html += this.renderField('edit-type', 'select', '类型 *', variant.类型, this.typeOptions);
    function saveData() {
            html += this.renderField('edit-color', 'select', '颜色 *', variant.颜色, this.colorOptions);
        if (!confirm('确定要保存到模块吗?这将覆盖现有数据!')) return;
            html += '</div>';
            html += this.renderField('edit-desc', 'textarea', '描述 *', variant.描述);
            html += '<div style="margin-top: 10px;">';
            html += '<div class="dict-button success" id="dict-update-variant" data-index="' + index + '">更新变体</div>';
            html += '<div class="dict-button secondary" id="dict-cancel-edit-variant">取消</div>';
            html += '</div>';
           
            preview.innerHTML = html;
           
            this.initCustomSelects();
           
            document.getElementById('dict-update-variant').addEventListener('click', function() {
                var idx = parseInt(this.getAttribute('data-index'));
                self.updateVariant(idx);
            });
           
            document.getElementById('dict-cancel-edit-variant').addEventListener('click', function() {
                preview.innerHTML = '';
            });
        },
          
          
         const luaContent = generateLuaContent();
         // 更新变体
        updateVariant: function(index) {
            var icon = document.getElementById('dict-edit-icon').value.trim();
            var type = document.getElementById('dict-edit-type').getAttribute('data-value');
            var color = document.getElementById('dict-edit-color').getAttribute('data-value');
            var desc = document.getElementById('dict-edit-desc').value.trim();
           
            if (!type || !color || !desc) {
                this.showMessage('请填写所有必填字段', 'error');
                return;
            }
           
            this.dictionaryData[this.currentEditKey][index] = {
                icon: icon,
                类型: type,
                颜色: color,
                描述: desc
            };
           
            this.showMessage('变体已更新,请保存到模块', 'success');
            this.renderEditor();
        },
          
          
        showMessage('保存中...', 'loading');
         // 保存到模块
       
         saveToModule: function() {
         // 获取编辑令牌
             var self = this;
         fetch(API_URL + '?' + new URLSearchParams({
              
             action: 'query',
             if (!confirm('确定要保存到模块吗?这将覆盖现有数据!')) {
             meta: 'tokens',
                return;
             format: 'json'
            }
        }))
           
        .then(res => res.json())
            var luaContent = this.generateLuaContent();
        .then(data => {
           
            const token = data.query.tokens.csrftoken;
            this.showMessage('保存中...', 'info');
              
              
             // 保存页面
             this.api.postWithToken('csrf', {
            return fetch(API_URL, {
                 action: 'edit',
                 method: 'POST',
                 title: this.MODULE_PAGE,
                 headers: {
                text: luaContent,
                    'Content-Type': 'application/x-www-form-urlencoded',
                 summary: '通过词典管理器更新',
                 },
                 format: 'json'
                 body: new URLSearchParams({
            }).done(function() {
                    action: 'edit',
                self.showMessage('保存成功!', 'success');
                    title: MODULE_PAGE,
            }).fail(function(code, error) {
                    text: luaContent,
                console.error('保存失败:', code, error);
                    summary: '通过词典编辑器更新数据',
                self.showMessage('保存失败: ' + (error.error ? error.error.info : '未知错误'), 'error');
                    token: token,
                    format: 'json'
                })
             });
             });
         })
         },
        .then(res => res.json())
        .then(data => {
            if (data.edit && data.edit.result === 'Success') {
                showMessage('保存成功!', 'success');
            } else {
                showMessage('保存失败: ' + JSON.stringify(data), 'error');
            }
        })
        .catch(err => {
            showMessage('保存失败: ' + err.message, 'error');
        });
    }
   
    // 生成Lua内容
    function generateLuaContent() {
        let lua = 'local data = {}\n\ndata.dictionary = {\n';
          
          
         for (const [key, variants] of Object.entries(dictionaryData)) {
         // 生成Lua内容
            lua += `   ["${key}"] = {\n`;
        generateLuaContent: function() {
            variants.forEach(variant => {
            var lua = 'local data = {}\n\ndata.dictionary = {\n';
                lua += '        {\n';
           
                lua += `           ["icon"] = "${variant.icon || ''}",\n`;
            var entries = Object.keys(this.dictionaryData).sort();
                lua += `           ["类型"] = "${variant.类型}",\n`;
           
                lua += `           ["颜色"] = "${variant.颜色}",\n`;
            entries.forEach(function(key) {
                lua += `           ["描述"] = "${variant.描述}",\n`;
                var variants = this.dictionaryData[key];
                 lua += '       },\n';
                lua += '   ["' + key + '"] = {\n';
             });
               
             lua += '   },\n';
                variants.forEach(function(variant) {
         }
                    lua += '        {\n';
                    lua += '           ["icon"] = "' + (variant.icon || '') + '",\n';
                    lua += '           ["类型"] = "' + variant.类型 + '",\n';
                    lua += '           ["颜色"] = "' + variant.颜色 + '",\n';
                    lua += '           ["描述"] = "' + variant.描述 + '",\n';
                    lua += '        },\n';
                });
               
                 lua += '   },\n';
             }, this);
           
             lua += '}\n\nreturn data\n';
            return lua;
         },
          
          
         lua += '}\n\nreturn data\n';
         // 获取颜色类名
        return lua;
        getColorClass: function(color) {
    }
            var colorMap = {
   
                '白': 'dict-badge-white',
    // 显示消息
                '蓝': 'dict-badge-blue',
    function showMessage(msg, type) {
                '红': 'dict-badge-red',
        const msgDiv = document.getElementById('dict-message');
                '橙': 'dict-badge-orange',
        msgDiv.className = 'dict-' + type;
                '彩': 'dict-badge-rainbow'
         msgDiv.textContent = msg;
            };
            return colorMap[color] || 'dict-badge-white';
         },
          
          
         if (type === 'success' || type === 'error') {
         // 显示消息
            setTimeout(() => {
        showMessage: function(message, type) {
                msgDiv.textContent = '';
            var container = document.getElementById('dict-message');
                 msgDiv.className = '';
            container.innerHTML = '<div class="dict-message ' + type + '">' + mw.html.escape(message) + '</div>';
             }, 3000);
           
            if (type === 'success' || type === 'error') {
                setTimeout(function() {
                    container.innerHTML = '';
                 }, 5000);
             }
         }
         }
     }
     };
      
      
     // 页面加载完成后初始化
     // 页面加载完成后初始化
     if (document.readyState === 'loading') {
     $(function() {
         document.addEventListener('DOMContentLoaded', init);
         DictManager.init();
     } else {
     });
        init();
      
     }
})();
})();

2025年10月3日 (五) 19:21的版本

/**
 * MediaWiki词典编辑器
 * 用于管理模块:词典/data中的词条数据
 */
(function() {
    'use strict';
    
    // 只在MediaWiki:Dictionary页面运行
    if (mw.config.get('wgPageName') !== 'MediaWiki:Dictionary') {
        return;
    }
    
    var DictManager = {
        api: new mw.Api(),
        MODULE_PAGE: '模块:词典/data',
        dictionaryData: {},
        currentEditKey: null,
        currentEditIndex: null,
        
        // 类型选项
        typeOptions: ['', '卡牌机制', '战斗员专属机制', 'buff', 'debuff'],
        colorOptions: ['', '白', '蓝', '红', '橙', '彩'],
        
        // 初始化
        init: function() {
            this.createUI();
            this.loadData();
        },
        
        // 创建UI
        createUI: function() {
            var container = document.createElement('div');
            container.className = 'dict-editor';
            container.innerHTML = `
                <div class="dict-section">
                    <h3>词典管理器</h3>
                    <div id="dict-message"></div>
                    
                    <div class="dict-tabs">
                        <div class="dict-tab active" data-tab="list">词条列表</div>
                        <div class="dict-tab" data-tab="edit">编辑/新建</div>
                    </div>
                    
                    <div id="tab-list" class="dict-tab-content active">
                        <div class="dict-button success" id="dict-create-new">新建词条</div>
                        <div class="dict-button" id="dict-refresh">刷新数据</div>
                        <div class="dict-button secondary" id="dict-save-module">保存到模块</div>
                        <div id="dict-list-container" class="dict-loading">加载中...</div>
                    </div>
                    
                    <div id="tab-edit" class="dict-tab-content">
                        <div id="dict-editor-container"></div>
                    </div>
                </div>
            `;
            
            var content = document.getElementById('mw-content-text');
            content.innerHTML = '';
            content.appendChild(container);
            
            this.bindEvents();
        },
        
        // 绑定事件
        bindEvents: function() {
            var self = this;
            
            // 标签切换
            document.querySelectorAll('.dict-tab').forEach(function(tab) {
                tab.addEventListener('click', function() {
                    self.switchTab(this.getAttribute('data-tab'));
                });
            });
            
            // 新建词条
            document.getElementById('dict-create-new').addEventListener('click', function() {
                self.createNew();
            });
            
            // 刷新数据
            document.getElementById('dict-refresh').addEventListener('click', function() {
                self.loadData();
            });
            
            // 保存到模块
            document.getElementById('dict-save-module').addEventListener('click', function() {
                self.saveToModule();
            });
        },
        
        // 切换标签
        switchTab: function(tabName) {
            document.querySelectorAll('.dict-tab').forEach(function(tab) {
                tab.classList.remove('active');
            });
            document.querySelectorAll('.dict-tab-content').forEach(function(content) {
                content.classList.remove('active');
            });
            
            document.querySelector('[data-tab="' + tabName + '"]').classList.add('active');
            document.getElementById('tab-' + tabName).classList.add('active');
        },
        
        // 加载数据
        loadData: function() {
            var self = this;
            self.showMessage('加载中...', 'info');
            
            this.api.get({
                action: 'query',
                prop: 'revisions',
                titles: this.MODULE_PAGE,
                rvprop: 'content',
                rvslots: 'main',
                format: 'json'
            }).done(function(data) {
                var pages = data.query.pages;
                var pageId = Object.keys(pages)[0];
                
                if (pageId === '-1') {
                    self.showMessage('模块页面不存在', 'error');
                    return;
                }
                
                var content = pages[pageId].revisions[0].slots.main['*'];
                self.parseModuleData(content);
                self.renderList();
                self.showMessage('数据加载成功', 'success');
            }).fail(function() {
                self.showMessage('加载失败', 'error');
            });
        },
        
        // 解析模块数据
        parseModuleData: function(content) {
            try {
                var match = content.match(/data\.dictionary\s*=\s*\{([\s\S]*?)\n\}/);
                if (!match) {
                    this.dictionaryData = {};
                    return;
                }
                
                var dictContent = match[1];
                this.dictionaryData = {};
                
                // 使用正则匹配每个词条
                var entryRegex = /$$"([^"]+)"$$\s*=\s*\{([\s\S]*?)\n\s{4}\}/g;
                var entryMatch;
                
                while ((entryMatch = entryRegex.exec(dictContent)) !== null) {
                    var key = entryMatch[1];
                    var variantsContent = entryMatch[2];
                    
                    this.dictionaryData[key] = [];
                    
                    // 匹配每个变体
                    var variantRegex = /\{[\s\S]*?$$"icon"$$\s*=\s*"([^"]*)"[\s\S]*?$$"类型"$$\s*=\s*"([^"]*)"[\s\S]*?$$"颜色"$$\s*=\s*"([^"]*)"[\s\S]*?$$"描述"$$\s*=\s*"([^"]*)"[\s\S]*?\}/g;
                    var variantMatch;
                    
                    while ((variantMatch = variantRegex.exec(variantsContent)) !== null) {
                        this.dictionaryData[key].push({
                            icon: variantMatch[1],
                            类型: variantMatch[2],
                            颜色: variantMatch[3],
                            描述: variantMatch[4]
                        });
                    }
                }
                
                console.log('解析完成:', this.dictionaryData);
            } catch (e) {
                console.error('解析错误:', e);
                this.dictionaryData = {};
            }
        },
        
        // 渲染列表
        renderList: function() {
            var container = document.getElementById('dict-list-container');
            
            if (Object.keys(this.dictionaryData).length === 0) {
                container.innerHTML = '<div class="dict-message info">暂无词条,点击"新建词条"开始创建</div>';
                return;
            }
            
            var html = '<div class="dict-grid">';
            for (var key in this.dictionaryData) {
                var variants = this.dictionaryData[key];
                html += '<div class="dict-list-item" data-key="' + mw.html.escape(key) + '">';
                html += '<strong>' + mw.html.escape(key) + '</strong>';
                html += '<div style="margin-top: 5px; font-size: 12px; color: #72777d;">';
                html += variants.length + ' 个变体';
                html += '</div>';
                html += '</div>';
            }
            html += '</div>';
            
            container.innerHTML = html;
            
            var self = this;
            document.querySelectorAll('.dict-list-item').forEach(function(item) {
                item.addEventListener('click', function() {
                    var key = this.getAttribute('data-key');
                    self.editEntry(key);
                });
            });
        },
        
        // 新建词条
        createNew: function() {
            this.currentEditKey = null;
            this.currentEditIndex = null;
            this.switchTab('edit');
            this.renderEditor();
            this.showMessage('请填写词条信息', 'info');
        },
        
        // 编辑词条
        editEntry: function(key) {
            this.currentEditKey = key;
            this.switchTab('edit');
            this.renderEditor();
        },
        
        // 渲染编辑器
        renderEditor: function() {
            var self = this;
            var container = document.getElementById('dict-editor-container');
            
            var html = '<h4>' + (this.currentEditKey ? '编辑词条: ' + mw.html.escape(this.currentEditKey) : '新建词条') + '</h4>';
            
            if (!this.currentEditKey) {
                // 新建模式
                html += '<div class="dict-form-group">';
                html += '<label>词条名称 *</label>';
                html += '<input type="text" class="dict-input" id="dict-entry-name" placeholder="例如: 粉碎">';
                html += '</div>';
                
                html += '<h4>变体信息</h4>';
                html += '<div class="dict-field-row">';
                html += this.renderField('icon', 'text', '图标', '');
                html += this.renderField('type', 'select', '类型 *', '', this.typeOptions);
                html += this.renderField('color', 'select', '颜色 *', '', this.colorOptions);
                html += '</div>';
                html += this.renderField('desc', 'textarea', '描述 *', '');
                
                html += '<div style="margin-top: 20px;">';
                html += '<div class="dict-button success" id="dict-save-new">保存词条</div>';
                html += '<div class="dict-button secondary" id="dict-cancel-edit">取消</div>';
                html += '</div>';
            } else {
                // 编辑模式 - 显示所有变体
                var variants = this.dictionaryData[this.currentEditKey];
                
                html += '<div style="margin-bottom: 20px;">';
                html += '<div class="dict-button success" id="dict-add-variant">添加新变体</div>';
                html += '<div class="dict-button danger" id="dict-delete-entry">删除整个词条</div>';
                html += '<div class="dict-button secondary" id="dict-back-to-list">返回列表</div>';
                html += '</div>';
                
                html += '<h4>现有变体</h4>';
                
                variants.forEach(function(variant, index) {
                    var colorClass = self.getColorClass(variant.颜色);
                    html += '<div class="dict-variant" data-index="' + index + '">';
                    html += '<div class="dict-variant-header">';
                    html += '<span class="dict-badge ' + colorClass + '">' + mw.html.escape(variant.类型) + '</span>';
                    html += '<span class="dict-badge ' + colorClass + '">' + mw.html.escape(variant.颜色) + '</span>';
                    html += '<div class="dict-button" style="float: right; margin-left: 5px;" data-action="delete" data-index="' + index + '">删除</div>';
                    html += '<div class="dict-button" style="float: right;" data-action="edit" data-index="' + index + '">编辑</div>';
                    html += '</div>';
                    html += '<div class="dict-variant-desc">' + mw.html.escape(variant.描述) + '</div>';
                    if (variant.icon) {
                        html += '<div class="dict-variant-icon">图标: ' + mw.html.escape(variant.icon) + '</div>';
                    }
                    html += '</div>';
                });
            }
            
            html += '<div id="dict-preview-container"></div>';
            
            container.innerHTML = html;
            
            this.initCustomSelects();
            this.bindEditorEvents();
        },
        
        // 渲染表单字段
        renderField: function(id, type, label, value, options) {
            var html = '<div class="dict-form-group">';
            html += '<label>' + mw.html.escape(label) + '</label>';
            
            if (type === 'select') {
                html += '<div class="dict-custom-select" id="dict-' + id + '" data-value="' + mw.html.escape(value) + '">';
                html += '<div class="dict-select-display">' + (value || '请选择') + '</div>';
                html += '<div class="dict-select-options">';
                options.forEach(function(opt) {
                    html += '<div class="dict-select-option" data-value="' + mw.html.escape(opt) + '">' + 
                            mw.html.escape(opt || '请选择') + '</div>';
                });
                html += '</div></div>';
            } else if (type === 'textarea') {
                html += '<textarea class="dict-textarea" id="dict-' + id + '">' + mw.html.escape(value) + '</textarea>';
            } else {
                html += '<input type="text" class="dict-input" id="dict-' + id + '" value="' + mw.html.escape(value) + '">';
            }
            
            html += '</div>';
            return html;
        },
        
        // 初始化自定义选择器
        initCustomSelects: function() {
            var self = this;
            
            document.querySelectorAll('.dict-custom-select').forEach(function(select) {
                var display = select.querySelector('.dict-select-display');
                
                display.addEventListener('click', function(e) {
                    e.stopPropagation();
                    // 关闭其他选择器
                    document.querySelectorAll('.dict-custom-select').forEach(function(s) {
                        if (s !== select) s.classList.remove('open');
                    });
                    select.classList.toggle('open');
                });
                
                select.querySelectorAll('.dict-select-option').forEach(function(option) {
                    option.addEventListener('click', function(e) {
                        e.stopPropagation();
                        var value = this.getAttribute('data-value');
                        select.setAttribute('data-value', value);
                        display.textContent = this.textContent;
                        select.classList.remove('open');
                    });
                });
            });
            
            // 点击外部关闭
            document.addEventListener('click', function() {
                document.querySelectorAll('.dict-custom-select').forEach(function(s) {
                    s.classList.remove('open');
                });
            });
        },
        
        // 绑定编辑器事件
        bindEditorEvents: function() {
            var self = this;
            
            var saveBtn = document.getElementById('dict-save-new');
            if (saveBtn) {
                saveBtn.addEventListener('click', function() {
                    self.saveNewEntry();
                });
            }
            
            var cancelBtn = document.getElementById('dict-cancel-edit');
            if (cancelBtn) {
                cancelBtn.addEventListener('click', function() {
                    self.switchTab('list');
                });
            }
            
            var addVariantBtn = document.getElementById('dict-add-variant');
            if (addVariantBtn) {
                addVariantBtn.addEventListener('click', function() {
                    self.showVariantForm();
                });
            }
            
            var deleteEntryBtn = document.getElementById('dict-delete-entry');
            if (deleteEntryBtn) {
                deleteEntryBtn.addEventListener('click', function() {
                    if (confirm('确定要删除整个词条"' + self.currentEditKey + '"吗?')) {
                        delete self.dictionaryData[self.currentEditKey];
                        self.showMessage('已删除词条,请保存到模块', 'success');
                        self.switchTab('list');
                        self.renderList();
                    }
                });
            }
            
            var backBtn = document.getElementById('dict-back-to-list');
            if (backBtn) {
                backBtn.addEventListener('click', function() {
                    self.switchTab('list');
                });
            }
            
            // 变体操作按钮
            document.querySelectorAll('[data-action]').forEach(function(btn) {
                btn.addEventListener('click', function() {
                    var action = this.getAttribute('data-action');
                    var index = parseInt(this.getAttribute('data-index'));
                    
                    if (action === 'edit') {
                        self.editVariant(index);
                    } else if (action === 'delete') {
                        if (confirm('确定要删除这个变体吗?')) {
                            self.dictionaryData[self.currentEditKey].splice(index, 1);
                            if (self.dictionaryData[self.currentEditKey].length === 0) {
                                delete self.dictionaryData[self.currentEditKey];
                                self.switchTab('list');
                            }
                            self.renderEditor();
                            self.showMessage('已删除变体,请保存到模块', 'success');
                        }
                    }
                });
            });
        },
        
        // 保存新词条
        saveNewEntry: function() {
            var name = document.getElementById('dict-entry-name').value.trim();
            var icon = document.getElementById('dict-icon').value.trim();
            var type = document.getElementById('dict-type').getAttribute('data-value');
            var color = document.getElementById('dict-color').getAttribute('data-value');
            var desc = document.getElementById('dict-desc').value.trim();
            
            if (!name || !type || !color || !desc) {
                this.showMessage('请填写所有必填字段', 'error');
                return;
            }
            
            var variant = {
                icon: icon,
                类型: type,
                颜色: color,
                描述: desc
            };
            
            if (!this.dictionaryData[name]) {
                this.dictionaryData[name] = [];
            }
            
            this.dictionaryData[name].push(variant);
            this.showMessage('词条已添加,请保存到模块', 'success');
            this.currentEditKey = name;
            this.renderEditor();
        },
        
        // 显示变体表单
        showVariantForm: function() {
            var self = this;
            var preview = document.getElementById('dict-preview-container');
            
            var html = '<h4>添加新变体</h4>';
            html += '<div class="dict-field-row">';
            html += this.renderField('new-icon', 'text', '图标', '');
            html += this.renderField('new-type', 'select', '类型 *', '', this.typeOptions);
            html += this.renderField('new-color', 'select', '颜色 *', '', this.colorOptions);
            html += '</div>';
            html += this.renderField('new-desc', 'textarea', '描述 *', '');
            html += '<div style="margin-top: 10px;">';
            html += '<div class="dict-button success" id="dict-save-variant">保存变体</div>';
            html += '<div class="dict-button secondary" id="dict-cancel-variant">取消</div>';
            html += '</div>';
            
            preview.innerHTML = html;
            
            this.initCustomSelects();
            
            document.getElementById('dict-save-variant').addEventListener('click', function() {
                self.saveNewVariant();
            });
            
            document.getElementById('dict-cancel-variant').addEventListener('click', function() {
                preview.innerHTML = '';
            });
        },
        
        // 保存新变体
        saveNewVariant: function() {
            var icon = document.getElementById('dict-new-icon').value.trim();
            var type = document.getElementById('dict-new-type').getAttribute('data-value');
            var color = document.getElementById('dict-new-color').getAttribute('data-value');
            var desc = document.getElementById('dict-new-desc').value.trim();
            
            if (!type || !color || !desc) {
                this.showMessage('请填写所有必填字段', 'error');
                return;
            }
            
            var variant = {
                icon: icon,
                类型: type,
                颜色: color,
                描述: desc
            };
            
            this.dictionaryData[this.currentEditKey].push(variant);
            this.showMessage('变体已添加,请保存到模块', 'success');
            this.renderEditor();
        },
        
        // 编辑变体
        editVariant: function(index) {
            var self = this;
            var variant = this.dictionaryData[this.currentEditKey][index];
            var preview = document.getElementById('dict-preview-container');
            
            var html = '<h4>编辑变体</h4>';
            html += '<div class="dict-field-row">';
            html += this.renderField('edit-icon', 'text', '图标', variant.icon);
            html += this.renderField('edit-type', 'select', '类型 *', variant.类型, this.typeOptions);
            html += this.renderField('edit-color', 'select', '颜色 *', variant.颜色, this.colorOptions);
            html += '</div>';
            html += this.renderField('edit-desc', 'textarea', '描述 *', variant.描述);
            html += '<div style="margin-top: 10px;">';
            html += '<div class="dict-button success" id="dict-update-variant" data-index="' + index + '">更新变体</div>';
            html += '<div class="dict-button secondary" id="dict-cancel-edit-variant">取消</div>';
            html += '</div>';
            
            preview.innerHTML = html;
            
            this.initCustomSelects();
            
            document.getElementById('dict-update-variant').addEventListener('click', function() {
                var idx = parseInt(this.getAttribute('data-index'));
                self.updateVariant(idx);
            });
            
            document.getElementById('dict-cancel-edit-variant').addEventListener('click', function() {
                preview.innerHTML = '';
            });
        },
        
        // 更新变体
        updateVariant: function(index) {
            var icon = document.getElementById('dict-edit-icon').value.trim();
            var type = document.getElementById('dict-edit-type').getAttribute('data-value');
            var color = document.getElementById('dict-edit-color').getAttribute('data-value');
            var desc = document.getElementById('dict-edit-desc').value.trim();
            
            if (!type || !color || !desc) {
                this.showMessage('请填写所有必填字段', 'error');
                return;
            }
            
            this.dictionaryData[this.currentEditKey][index] = {
                icon: icon,
                类型: type,
                颜色: color,
                描述: desc
            };
            
            this.showMessage('变体已更新,请保存到模块', 'success');
            this.renderEditor();
        },
        
        // 保存到模块
        saveToModule: function() {
            var self = this;
            
            if (!confirm('确定要保存到模块吗?这将覆盖现有数据!')) {
                return;
            }
            
            var luaContent = this.generateLuaContent();
            
            this.showMessage('保存中...', 'info');
            
            this.api.postWithToken('csrf', {
                action: 'edit',
                title: this.MODULE_PAGE,
                text: luaContent,
                summary: '通过词典管理器更新',
                format: 'json'
            }).done(function() {
                self.showMessage('保存成功!', 'success');
            }).fail(function(code, error) {
                console.error('保存失败:', code, error);
                self.showMessage('保存失败: ' + (error.error ? error.error.info : '未知错误'), 'error');
            });
        },
        
        // 生成Lua内容
        generateLuaContent: function() {
            var lua = 'local data = {}\n\ndata.dictionary = {\n';
            
            var entries = Object.keys(this.dictionaryData).sort();
            
            entries.forEach(function(key) {
                var variants = this.dictionaryData[key];
                lua += '    ["' + key + '"] = {\n';
                
                variants.forEach(function(variant) {
                    lua += '        {\n';
                    lua += '            ["icon"] = "' + (variant.icon || '') + '",\n';
                    lua += '            ["类型"] = "' + variant.类型 + '",\n';
                    lua += '            ["颜色"] = "' + variant.颜色 + '",\n';
                    lua += '            ["描述"] = "' + variant.描述 + '",\n';
                    lua += '        },\n';
                });
                
                lua += '    },\n';
            }, this);
            
            lua += '}\n\nreturn data\n';
            return lua;
        },
        
        // 获取颜色类名
        getColorClass: function(color) {
            var colorMap = {
                '白': 'dict-badge-white',
                '蓝': 'dict-badge-blue',
                '红': 'dict-badge-red',
                '橙': 'dict-badge-orange',
                '彩': 'dict-badge-rainbow'
            };
            return colorMap[color] || 'dict-badge-white';
        },
        
        // 显示消息
        showMessage: function(message, type) {
            var container = document.getElementById('dict-message');
            container.innerHTML = '<div class="dict-message ' + type + '">' + mw.html.escape(message) + '</div>';
            
            if (type === 'success' || type === 'error') {
                setTimeout(function() {
                    container.innerHTML = '';
                }, 5000);
            }
        }
    };
    
    // 页面加载完成后初始化
    $(function() {
        DictManager.init();
    });
    
})();