MediaWiki

MediaWiki:Equipment.js

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献2025年10月17日 (五) 18:52的版本 (创建页面,内容为“(function() { 'use strict'; // 等待页面加载完成 if (mw.config.get('wgPageName') !== 'MediaWiki:Equipment') { return; } // 加载 CSS mw.loader.load('/index.php?title=MediaWiki:Equipment.css&action=raw&ctype=text/css', 'text/css'); var EquipmentManager = { data: {}, currentEditKey: null, init: function() { this.loadData(); this.renderUI();…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

  • 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:Equipment') {
        return;
    }
    
    // 加载 CSS
    mw.loader.load('/index.php?title=MediaWiki:Equipment.css&action=raw&ctype=text/css', 'text/css');
    
    var EquipmentManager = {
        data: {},
        currentEditKey: null,
        
        init: function() {
            this.loadData();
            this.renderUI();
        },
        
        loadData: function() {
            // 通过 API 加载模块数据
            var self = this;
            $.ajax({
                url: mw.util.wikiScript('api'),
                data: {
                    action: 'scribunto-console',
                    title: '模块:装备/data',
                    question: 'return require("模块:装备/data")',
                    format: 'json'
                },
                success: function(response) {
                    if (response && response.print) {
                        self.parseData(response.print);
                    }
                }
            });
            
            // 备用:从页面解析
            this.loadFromPage();
        },
        
        loadFromPage: function() {
            var self = this;
            $.get(mw.util.wikiScript('index'), {
                title: '模块:装备/data',
                action: 'raw'
            }, function(content) {
                self.parseDataFromLua(content);
                self.renderTable();
            });
        },
        
        parseDataFromLua: function(luaContent) {
            // 简单的 Lua 解析
            var equipmentPattern = /equipment\["([^"]+)"\]\s*=\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/g;
            var match;
            
            while ((match = equipmentPattern.exec(luaContent)) !== null) {
                var name = match[1];
                var content = match[2];
                
                var item = {
                    name: name,
                    id: this.extractValue(content, 'id'),
                    rarity: this.extractValue(content, 'rarity'),
                    type: this.extractValue(content, 'type'),
                    tag: this.extractValue(content, 'tag'),
                    desc: this.extractArray(content, 'desc')
                };
                
                this.data[name] = item;
            }
        },
        
        extractValue: function(content, key) {
            var pattern = new RegExp(key + '\\s*=\\s*["\']?([^,"\'\\n]+)["\']?');
            var match = content.match(pattern);
            return match ? match[1].trim() : '';
        },
        
        extractArray: function(content, key) {
            var pattern = new RegExp(key + '\\s*=\\s*\\{([^}]+)\\}');
            var match = content.match(pattern);
            if (!match) return [];
            
            var items = match[1].match(/"([^"]+)"/g) || [];
            return items.map(function(item) {
                return item.replace(/"/g, '');
            });
        },
        
        renderUI: function() {
            var container = $('#mw-content-text');
            container.empty();
            
            var html = [
                '<div class="equipment-manager">',
                '  <div class="eq-header">',
                '    <h2>装备数据管理器</h2>',
                '    <div class="eq-btn eq-btn-primary" id="eq-add-new">新增装备</div>',
                '  </div>',
                '  <div id="eq-table-container"></div>',
                '  <div id="eq-form-modal" class="eq-modal" style="display:none;">',
                '    <div class="eq-modal-content">',
                '      <div class="eq-modal-header">',
                '        <h3 id="eq-form-title">新增装备</h3>',
                '        <span class="eq-close">&times;</span>',
                '      </div>',
                '      <div class="eq-modal-body">',
                '        <form id="eq-form">',
                '          <div class="eq-form-group">',
                '            <label>装备名称:</label>',
                '            <input type="text" name="name" class="eq-input" required />',
                '          </div>',
                '          <div class="eq-form-group">',
                '            <label>ID:</label>',
                '            <input type="number" name="id" class="eq-input" required />',
                '          </div>',
                '          <div class="eq-form-group">',
                '            <label>稀有度:</label>',
                '            <div class="eq-radio-group">',
                '              <label><input type="radio" name="rarity" value="蓝" /> 蓝</label>',
                '              <label><input type="radio" name="rarity" value="紫" /> 紫</label>',
                '              <label><input type="radio" name="rarity" value="橙" /> 橙</label>',
                '            </div>',
                '          </div>',
                '          <div class="eq-form-group">',
                '            <label>类型:</label>',
                '            <div class="eq-radio-group">',
                '              <label><input type="radio" name="type" value="武器" /> 武器</label>',
                '              <label><input type="radio" name="type" value="装甲" /> 装甲</label>',
                '              <label><input type="radio" name="type" value="戒指" /> 戒指</label>',
                '            </div>',
                '          </div>',
                '          <div class="eq-form-group">',
                '            <label>标签:</label>',
                '            <input type="text" name="tag" class="eq-input" placeholder="用逗号分隔" />',
                '          </div>',
                '          <div class="eq-form-group">',
                '            <label>描述(每行一个等级):</label>',
                '            <textarea name="desc" class="eq-textarea" rows="5"></textarea>',
                '          </div>',
                '          <div class="eq-form-actions">',
                '            <div class="eq-btn eq-btn-primary" id="eq-save">保存</div>',
                '            <div class="eq-btn eq-btn-secondary" id="eq-cancel">取消</div>',
                '          </div>',
                '        </form>',
                '      </div>',
                '    </div>',
                '  </div>',
                '</div>'
            ].join('');
            
            container.html(html);
            this.bindEvents();
            this.renderTable();
        },
        
        renderTable: function() {
            var tbody = [];
            var index = 1;
            
            for (var name in this.data) {
                var item = this.data[name];
                tbody.push([
                    '<div class="eq-table-row">',
                    '  <div class="eq-cell">' + index++ + '</div>',
                    '  <div class="eq-cell">' + mw.html.escape(name) + '</div>',
                    '  <div class="eq-cell">' + mw.html.escape(item.id) + '</div>',
                    '  <div class="eq-cell eq-rarity-' + item.rarity + '">' + mw.html.escape(item.rarity) + '</div>',
                    '  <div class="eq-cell">' + mw.html.escape(item.type) + '</div>',
                    '  <div class="eq-cell">' + mw.html.escape(item.tag) + '</div>',
                    '  <div class="eq-cell eq-actions">',
                    '    <span class="eq-link eq-edit" data-name="' + mw.html.escape(name) + '">编辑</span>',
                    '    <span class="eq-link eq-delete" data-name="' + mw.html.escape(name) + '">删除</span>',
                    '  </div>',
                    '</div>'
                ].join(''));
            }
            
            var html = [
                '<div class="eq-table">',
                '  <div class="eq-table-header">',
                '    <div class="eq-cell">序号</div>',
                '    <div class="eq-cell">名称</div>',
                '    <div class="eq-cell">ID</div>',
                '    <div class="eq-cell">稀有度</div>',
                '    <div class="eq-cell">类型</div>',
                '    <div class="eq-cell">标签</div>',
                '    <div class="eq-cell">操作</div>',
                '  </div>',
                '  <div class="eq-table-body">',
                tbody.join(''),
                '  </div>',
                '</div>'
            ].join('');
            
            $('#eq-table-container').html(html);
            this.bindTableEvents();
        },
        
        bindEvents: function() {
            var self = this;
            
            // 新增按钮
            $('#eq-add-new').on('click', function() {
                self.showForm('add');
            });
            
            // 关闭模态框
            $('.eq-close, #eq-cancel').on('click', function() {
                self.hideForm();
            });
            
            // 保存按钮
            $('#eq-save').on('click', function() {
                self.saveData();
            });
            
            // 点击模态框外部关闭
            $('#eq-form-modal').on('click', function(e) {
                if (e.target.id === 'eq-form-modal') {
                    self.hideForm();
                }
            });
        },
        
        bindTableEvents: function() {
            var self = this;
            
            // 编辑按钮
            $('.eq-edit').on('click', function() {
                var name = $(this).data('name');
                self.showForm('edit', name);
            });
            
            // 删除按钮
            $('.eq-delete').on('click', function() {
                var name = $(this).data('name');
                self.deleteItem(name);
            });
        },
        
        showForm: function(mode, name) {
            this.currentEditKey = name || null;
            var form = $('#eq-form')[0];
            form.reset();
            
            if (mode === 'add') {
                $('#eq-form-title').text('新增装备');
                $('input[name="name"]').prop('disabled', false);
            } else {
                $('#eq-form-title').text('编辑装备');
                var item = this.data[name];
                $('input[name="name"]').val(item.name).prop('disabled', true);
                $('input[name="id"]').val(item.id);
                $('input[name="rarity"][value="' + item.rarity + '"]').prop('checked', true);
                $('input[name="type"][value="' + item.type + '"]').prop('checked', true);
                $('input[name="tag"]').val(item.tag);
                $('textarea[name="desc"]').val(item.desc.join('\n'));
            }
            
            $('#eq-form-modal').fadeIn();
        },
        
        hideForm: function() {
            $('#eq-form-modal').fadeOut();
            this.currentEditKey = null;
        },
        
        saveData: function() {
            var form = $('#eq-form')[0];
            var name = $('input[name="name"]').val().trim();
            
            if (!name) {
                mw.notify('请输入装备名称', { type: 'error' });
                return;
            }
            
            var item = {
                name: name,
                id: $('input[name="id"]').val(),
                rarity: $('input[name="rarity"]:checked').val() || '蓝',
                type: $('input[name="type"]:checked').val() || '武器',
                tag: $('input[name="tag"]').val().trim(),
                desc: $('textarea[name="desc"]').val().split('\n').filter(function(line) {
                    return line.trim();
                })
            };
            
            this.data[name] = item;
            this.hideForm();
            this.renderTable();
            this.generateLuaCode();
        },
        
        deleteItem: function(name) {
            if (!confirm('确定要删除装备 "' + name + '" 吗?')) {
                return;
            }
            
            delete this.data[name];
            this.renderTable();
            this.generateLuaCode();
        },
        
        generateLuaCode: function() {
            var lines = ['local equipment = {}', ''];
            
            for (var name in this.data) {
                var item = this.data[name];
                lines.push('equipment["' + name + '"] = {');
                lines.push('    id = ' + item.id + ',');
                lines.push('    rarity = "' + item.rarity + '",');
                lines.push('    type = "' + item.type + '",');
                lines.push('    tag = "' + item.tag + '",');
                lines.push('    desc = {');
                
                item.desc.forEach(function(desc, index) {
                    var comma = index < item.desc.length - 1 ? ',' : '';
                    lines.push('        "' + desc.replace(/"/g, '\\"') + '"' + comma);
                });
                
                lines.push('    }');
                lines.push('}');
                lines.push('');
            }
            
            lines.push('return equipment');
            
            var code = lines.join('\n');
            
            // 显示生成的代码
            var codeBox = $('#eq-generated-code');
            if (codeBox.length === 0) {
                $('.equipment-manager').append([
                    '<div class="eq-code-section">',
                    '  <h3>生成的 Lua 代码</h3>',
                    '  <div class="eq-code-box" id="eq-generated-code"></div>',
                    '  <div class="eq-btn eq-btn-primary" id="eq-copy-code">复制代码</div>',
                    '</div>'
                ].join(''));
                
                $('#eq-copy-code').on('click', function() {
                    var text = $('#eq-generated-code').text();
                    navigator.clipboard.writeText(text).then(function() {
                        mw.notify('代码已复制到剪贴板', { type: 'success' });
                    });
                });
            }
            
            $('#eq-generated-code').text(code);
        }
    };
    
    // 初始化
    $(function() {
        EquipmentManager.init();
    });
    
})();