MediaWiki

Card.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
// MediaWiki:Card.js
window.CardEditor = {
// 卡牌管理系统
    cards: [],
    currentCard: null,
    currentVariantIndex: null,
    api: new mw.Api(),


(function() {
    init: function() {
    'use strict';
        this.createUI();
      
        this.bindEvents();
    // 检查是否在正确的页面
        this.loadAllCards();
     if (mw.config.get('wgPageName') !== 'MediaWiki:Card') {
     },
        return;
 
    }
     createUI: function() {
   
        var html =  
    // 卡牌数据存储
        '<div id="card-editor">' +
    var cardData = {
            '<div class="ce-container">' +
        cards: [],
                // 左侧输入区
        currentCard: null,
                '<div class="ce-left">' +
        currentVariantIndex: null
                    '<div class="ce-group">' +
    };
                        '<div class="ce-group-title">卡牌数据</div>' +
   
                        '<div class="ce-form">' +
    // 字段定义
                            // 名称
    var fieldDefinitions = {
                            '<div class="ce-row">' +
        cardOrder: ['art', '卡组', '属性', '稀有度', 'AP', '机制', '类型', '描述', '衍生卡牌'],
                                '<div class="ce-label">卡牌名称:</div>' +
        deckTypes: ['', '起始卡牌', '独特卡牌', '灵光一闪', '衍生卡牌', '神光一闪'],
                                '<input type="text" id="ce-name" class="ce-input" placeholder="请输入卡牌名称...">' +
        attributes: ['', '热情', '秩序', '正义', '本能', '虚无'],
                            '</div>' +
        rarities: ['', '白', '蓝', '橙', '彩'],
                            // 卡组
        types: ['', '攻击', '技能', '强化', '状态异常']
                            '<div class="ce-row">' +
    };
                                '<div class="ce-label">卡组类型:</div>' +
   
                                '<div class="ce-select-wrapper">' +
    // 创建下拉选择框
                                    '<input type="text" id="ce-deck" class="ce-select-input" placeholder="点击选择或输入..." readonly>' +
    function createDropdown(options, value, placeholder) {
                                    '<div class="ce-select-dropdown" id="ce-deck-dropdown">' +
        var container = $('<div>').addClass('card-dropdown-container');
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
        var input = $('<input>')
                                        '<div class="ce-select-option" data-value="起始卡牌">起始卡牌</div>' +
            .addClass('card-dropdown-input')
                                        '<div class="ce-select-option" data-value="独特卡牌">独特卡牌</div>' +
            .attr('placeholder', placeholder || '点击选择或输入...')
                                        '<div class="ce-select-option" data-value="灵光一闪">灵光一闪</div>' +
            .val(value || '');
                                        '<div class="ce-select-option" data-value="衍生卡牌">衍生卡牌</div>' +
       
                                    '</div>' +
        var dropdown = $('<div>').addClass('card-dropdown-list').hide();
                                '</div>' +
          
                            '</div>' +
         options.forEach(function(opt) {
                            // 图片
             $('<div>')
                            '<div class="ce-row">' +
                .addClass('card-dropdown-item')
                                '<div class="ce-label">图片文件:</div>' +
                .text(opt || '(空)')
                                '<input type="text" id="ce-art" class="ce-input" placeholder="输入图片文件名...">' +
                .click(function() {
                            '</div>' +
                    input.val(opt);
                            // 属性
                    dropdown.hide();
                            '<div class="ce-row">' +
                })
                                '<div class="ce-label">属性:</div>' +
                .appendTo(dropdown);
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-attr" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-attr-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="热情">热情</div>' +
                                        '<div class="ce-select-option" data-value="秩序">秩序</div>' +
                                        '<div class="ce-select-option" data-value="正义">正义</div>' +
                                        '<div class="ce-select-option" data-value="本能">本能</div>' +
                                        '<div class="ce-select-option" data-value="虚无">虚无</div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // 稀有度
                            '<div class="ce-row">' +
                                '<div class="ce-label">稀有度:</div>' +
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-rarity" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-rarity-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="">白</div>' +
                                        '<div class="ce-select-option" data-value="蓝"></div>' +
                                        '<div class="ce-select-option" data-value="">橙</div>' +
                                        '<div class="ce-select-option" data-value="彩"></div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // AP
                            '<div class="ce-row">' +
                                '<div class="ce-label">AP (行动点):</div>' +
                                '<input type="text" id="ce-ap" class="ce-input" placeholder="输入AP数值...">' +
                            '</div>' +
                            // 类型
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌类型:</div>' +
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-type" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-type-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="攻击">攻击</div>' +
                                        '<div class="ce-select-option" data-value="技能">技能</div>' +
                                        '<div class="ce-select-option" data-value="强化">强化</div>' +
                                        '<div class="ce-select-option" data-value="状态异常">状态异常</div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // 机制
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌机制:</div>' +
                                '<input type="text" id="ce-mechanism" class="ce-input" placeholder="请输入卡牌机制...">' +
                            '</div>' +
                            // 描述
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌描述:</div>' +
                                '<div class="ce-desc-wrapper">' +
                                    '<div class="ce-format-buttons">' +
                                        '<div class="ce-btn ce-btn-small ce-btn-blue" id="ce-blue-text">蓝色文本</div>' +
                                        '<div class="ce-btn ce-btn-small ce-btn-green" id="ce-green-text">绿色文本</div>' +
                                        '<div class="ce-btn ce-btn-small ce-btn-lime" id="ce-green-stroke">绿色描边</div>' +
                                        '<div class="ce-btn ce-btn-small ce-btn-orange" id="ce-insert-br">插入换行</div>' +
                                    '</div>' +
                                    '<textarea id="ce-desc" class="ce-textarea" placeholder="请输入卡牌描述..."></textarea>' +
                                '</div>' +
                            '</div>' +
                            // 衍生卡牌
                            '<div class="ce-row">' +
                                '<div class="ce-label">衍生卡牌:</div>' +
                                '<input type="text" id="ce-derived" class="ce-input" placeholder="请输入衍生卡牌...">' +
                            '</div>' +
                        '</div>' +
                    '</div>' +
                    // 按钮区
                    '<div class="ce-buttons">' +
                        '<div class="ce-btn ce-btn-primary" id="ce-add-card">添加卡牌</div>' +
                        '<div class="ce-btn ce-btn-primary" id="ce-add-variant">添加变体</div>' +
                        '<div class="ce-btn" id="ce-save-data">保存数据</div>' +
                        '<div class="ce-btn" id="ce-clear-form">清空表单</div>' +
                    '</div>' +
                '</div>' +
                // 中间列表区
                '<div class="ce-middle">' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">卡牌列表</div>' +
                        '<div class="ce-list-container">' +
                            '<div id="ce-card-list" class="ce-list"></div>' +
                        '</div>' +
                    '</div>' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">变体列表</div>' +
                        '<div class="ce-list-container">' +
                            '<div id="ce-variant-list" class="ce-list"></div>' +
                        '</div>' +
                    '</div>' +
                    '<div class="ce-buttons">' +
                        '<div class="ce-btn ce-btn-danger" id="ce-delete-card">删除卡牌</div>' +
                        '<div class="ce-btn ce-btn-danger" id="ce-delete-variant">删除变体</div>' +
                    '</div>' +
                '</div>' +
                // 右侧代码区
                '<div class="ce-right">' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">Lua代码预览</div>' +
                        '<textarea id="ce-code-display" class="ce-code" readonly></textarea>' +
                    '</div>' +
                    '<div class="ce-buttons">' +
                        '<div class="ce-btn" id="ce-load-cards">加载卡牌数据</div>' +
                        '<div class="ce-btn" id="ce-save-to-wiki">保存到Wiki</div>' +
                        '<div class="ce-btn" id="ce-copy-code">复制代码</div>' +
                    '</div>' +
                '</div>' +
            '</div>' +
        '</div>';
 
        $('#mw-content-text').html(html);
    },
 
    bindEvents: function() {
        var self = this;
 
         // 自定义下拉框点击事件
         $('.ce-select-input').on('click', function() {
             var dropdown = $(this).siblings('.ce-select-dropdown');
            $('.ce-select-dropdown').not(dropdown).hide();
            dropdown.toggle();
         });
         });
       
 
         input.on('focus click', function(e) {
         $('.ce-select-option').on('click', function() {
             e.stopPropagation();
             var value = $(this).data('value');
             $('.card-dropdown-list').hide();
            var text = $(this).text();
             dropdown.show();
             var input = $(this).parent().siblings('.ce-select-input');
            input.val(value || '');
            input.data('value', value);
             $(this).parent().hide();
         });
         });
          
 
         $(document).click(function() {
         // 点击其他地方关闭下拉框
             dropdown.hide();
         $(document).on('click', function(e) {
             if (!$(e.target).closest('.ce-select-wrapper').length) {
                $('.ce-select-dropdown').hide();
            }
         });
         });
       
 
         container.append(input, dropdown);
         // 按钮事件
        return container;
         $('#ce-add-card').on('click', function() { self.addCard(); });
    }
         $('#ce-add-variant').on('click', function() { self.addVariant(); });
   
         $('#ce-save-data').on('click', function() { self.saveData(); });
    // 创建表单字段
         $('#ce-clear-form').on('click', function() { self.clearForm(); });
    function createFormField(label, inputElement) {
         $('#ce-delete-card').on('click', function() { self.deleteCard(); });
         return $('<div>').addClass('card-form-field')
         $('#ce-delete-variant').on('click', function() { self.deleteVariant(); });
            .append($('<div>').addClass('card-form-label').text(label))
        $('#ce-load-cards').on('click', function() { self.loadAllCards(); });
            .append($('<div>').addClass('card-form-input').append(inputElement));
        $('#ce-save-to-wiki').on('click', function() { self.saveToWiki(); });
    }
         $('#ce-copy-code').on('click', function() { self.copyCode(); });
   
 
    // 初始化界面
         // 文本格式化按钮
    function initUI() {
         $('#ce-blue-text').on('click', function() { self.insertTextFormat(''); });
        var container = $('<div>').attr('id', 'card-editor-container');
         $('#ce-green-text').on('click', function() { self.insertTextFormat('绿'); });
       
         $('#ce-green-stroke').on('click', function() { self.insertStrokeFormat(); });
        // 左侧:输入区
         $('#ce-insert-br').on('click', function() { self.insertBr(); });
        var leftPanel = $('<div>').addClass('card-panel card-input-panel');
 
         var formGroup = $('<div>').addClass('card-group').append($('<div>').addClass('card-group-title').text('卡牌数据'));
         // 列表项点击事件
       
         $(document).on('click', '.ce-list-item', function() {
        // 创建表单字段
            var $this = $(this);
        var nameInput = $('<input>').attr('id', 'card-name').attr('placeholder', '请输入卡牌名称...');
             var listId = $this.parent().attr('id');
        formGroup.append(createFormField('卡牌名称:', nameInput));
           
       
             $('.ce-list-item').removeClass('selected');
        var deckDropdown = createDropdown(fieldDefinitions.deckTypes, '', '点击选择或输入...');
            $this.addClass('selected');
        formGroup.append(createFormField('卡组类型:', deckDropdown));
 
          
             if (listId === 'ce-card-list') {
        var artContainer = $('<div>').addClass('card-art-container');
                var index = $this.data('index');
        var artInput = $('<input>').attr('id', 'card-art').attr('placeholder', '输入图片文件名...');
                self.onCardSelected(index);
        artContainer.append(artInput);
            } else if (listId === 'ce-variant-list') {
        formGroup.append(createFormField('图片文件:', artContainer));
                var index = $this.data('index');
          
                self.onVariantSelected(index);
        var attrDropdown = createDropdown(fieldDefinitions.attributes, '', '点击选择...');
             }
        formGroup.append(createFormField('属性:', attrDropdown));
       
        var rarityDropdown = createDropdown(fieldDefinitions.rarities, '', '点击选择...');
        formGroup.append(createFormField('稀有度:', rarityDropdown));
       
        var apInput = $('<input>').attr('id', 'card-ap').attr('placeholder', '输入AP数值...');
        formGroup.append(createFormField('AP (行动点):', apInput));
       
        var typeDropdown = createDropdown(fieldDefinitions.types, '', '点击选择...');
         formGroup.append(createFormField('卡牌类型:', typeDropdown));
       
        var mechanismInput = $('<input>').attr('id', 'card-mechanism').attr('placeholder', '请输入卡牌机制...');
        formGroup.append(createFormField('卡牌机制:', mechanismInput));
       
        // 描述区域
        var descContainer = $('<div>').addClass('card-desc-container');
         var descHeader = $('<div>').addClass('card-desc-header')
            .append($('<span>').text('卡牌描述:'))
            .append($('<div>').addClass('card-desc-buttons')
                .append($('<div>').addClass('card-button card-button-small card-button-blue').text('蓝色文本').click(function() { insertTextFormat('蓝'); }))
                .append($('<div>').addClass('card-button card-button-small card-button-green').text('绿色文本').click(function() { insertTextFormat('绿'); }))
                .append($('<div>').addClass('card-button card-button-small card-button-stroke').text('绿色描边').click(insertStrokeFormat))
                .append($('<div>').addClass('card-button card-button-small card-button-br').text('插入换行').click(insertBr))
            );
       
        var descTextarea = $('<textarea>').attr('id', 'card-desc').attr('placeholder', '请输入卡牌描述...');
        descContainer.append(descHeader, descTextarea);
        formGroup.append(descContainer);
          
        var derivedInput = $('<input>').attr('id', 'card-derived').attr('placeholder', '请输入衍生卡牌...');
        formGroup.append(createFormField('衍生卡牌:', derivedInput));
       
        leftPanel.append(formGroup);
       
         // 按钮区
         var buttonContainer = $('<div>').addClass('card-button-container');
        buttonContainer.append(
            $('<div>').addClass('card-button card-button-add').text('添加卡牌').click(addCard),
            $('<div>').addClass('card-button card-button-add').text('添加变体').click(addVariant),
            $('<div>').addClass('card-button').text('保存数据').click(saveData),
            $('<div>').addClass('card-button').text('清空表单').click(clearForm)
        );
        leftPanel.append(buttonContainer);
          
        // 中间:列表区
        var middlePanel = $('<div>').addClass('card-panel card-list-panel');
       
        var cardListGroup = $('<div>').addClass('card-group')
            .append($('<div>').addClass('card-group-title').text('卡牌列表'))
            .append($('<div>').attr('id', 'card-list').addClass('card-list'));
        middlePanel.append(cardListGroup);
          
        var variantListGroup = $('<div>').addClass('card-group')
            .append($('<div>').addClass('card-group-title').text('变体列表'))
            .append($('<div>').attr('id', 'variant-list').addClass('card-list'));
        middlePanel.append(variantListGroup);
       
        var deleteButtons = $('<div>').addClass('card-button-container');
         deleteButtons.append(
            $('<div>').addClass('card-button card-button-delete').text('删除卡牌').click(deleteCard),
            $('<div>').addClass('card-button card-button-delete').text('删除变体').click(deleteVariant)
        );
        middlePanel.append(deleteButtons);
       
         // 右侧:代码显示区
         var rightPanel = $('<div>').addClass('card-panel card-code-panel');
       
        var codeGroup = $('<div>').addClass('card-group')
             .append($('<div>').addClass('card-group-title').text('Lua代码预览'))
             .append($('<textarea>').attr('id', 'code-display').addClass('card-code-display').attr('readonly', true));
        rightPanel.append(codeGroup);
       
        var codeButtons = $('<div>').addClass('card-button-container');
        codeButtons.append(
             $('<div>').addClass('card-button').text('复制代码').click(copyCode),
            $('<div>').addClass('card-button').text('加载数据').click(loadFromWiki),
            $('<div>').addClass('card-button').text('保存到Wiki').click(saveToWiki)
        );
        rightPanel.append(codeButtons);
       
        container.append(leftPanel, middlePanel, rightPanel);
        $('#mw-content-text').empty().append(container);
       
        // 初始化拖拽排序
        initSortable();
    }
   
    // 初始化拖拽排序
    function initSortable() {
        mw.loader.using('jquery.ui', function() {
            $('#card-list').sortable({
                update: function(event, ui) {
                    updateCardOrder();
                }
             });
         });
         });
     }
     },
   
 
    // 文本格式化函数
     getCardData: function() {
    function insertTextFormat(color) {
        var textarea = $('#card-desc')[0];
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value;
        var selectedText = text.substring(start, end);
       
        var newText = text.substring(0, start) +
                      '{{文本|' + color + '|' + selectedText + '}}' +
                      text.substring(end);
       
        textarea.value = newText;
        textarea.focus();
        textarea.setSelectionRange(start + 6 + color.length, start + 6 + color.length + selectedText.length);
    }
   
    function insertStrokeFormat() {
        var textarea = $('#card-desc')[0];
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value;
        var selectedText = text.substring(start, end);
       
        var newText = text.substring(0, start) +
                      '{{描边|绿|' + selectedText + '}}' +
                      text.substring(end);
       
        textarea.value = newText;
        textarea.focus();
        textarea.setSelectionRange(start + 7, start + 7 + selectedText.length);
    }
   
    function insertBr() {
        var textarea = $('#card-desc')[0];
        var pos = textarea.selectionStart;
        var text = textarea.value;
       
        var newText = text.substring(0, pos) + '<br>' + text.substring(pos);
        textarea.value = newText;
        textarea.focus();
        textarea.setSelectionRange(pos + 4, pos + 4);
    }
   
    // 获取表单数据
     function getFormData() {
         var variant = {};
         var variant = {};
          
          
         var art = $('#card-art').val().trim();
         var art = $('#ce-art').val().trim();
         if (art) variant.art = art;
         if (art) variant.art = art;
          
          
         var deck = $('.card-dropdown-container').eq(0).find('input').val().trim();
         var deck = $('#ce-deck').val().trim();
         if (deck) variant['卡组'] = deck;
         if (deck) variant['卡组'] = deck;
          
          
         var attr = $('.card-dropdown-container').eq(1).find('input').val().trim();
         var attr = $('#ce-attr').val().trim();
         if (attr) variant['属性'] = attr;
         if (attr) variant['属性'] = attr;
          
          
         var rarity = $('.card-dropdown-container').eq(2).find('input').val().trim();
         var rarity = $('#ce-rarity').val().trim();
         if (rarity) variant['稀有度'] = rarity;
         if (rarity) variant['稀有度'] = rarity;
          
          
         var ap = $('#card-ap').val().trim();
         var ap = $('#ce-ap').val().trim();
         if (ap) {
         if (ap) {
             variant.AP = isNaN(ap) ? ap : parseInt(ap);
             if (ap.toUpperCase() === 'X') {
                variant.AP = 'X';
            } else if (/^\d+$/.test(ap)) {
                variant.AP = parseInt(ap);
            } else {
                variant.AP = ap;
            }
         }
         }
          
          
         var type = $('.card-dropdown-container').eq(3).find('input').val().trim();
         var mechanism = $('#ce-mechanism').val().trim();
        if (mechanism) variant['机制'] = mechanism;
       
        var type = $('#ce-type').val().trim();
         if (type) variant['类型'] = type;
         if (type) variant['类型'] = type;
          
          
        var mechanism = $('#card-mechanism').val().trim();
         var desc = $('#ce-desc').val().trim();
        if (mechanism) variant['机制'] = mechanism;
       
         var desc = $('#card-desc').val().trim();
         if (desc) variant['描述'] = desc;
         if (desc) variant['描述'] = desc;
          
          
         var derived = $('#card-derived').val().trim();
         var derived = $('#ce-derived').val().trim();
         if (derived) variant['衍生卡牌'] = derived;
         if (derived) variant['衍生卡牌'] = derived;
       
 
         return {
         return {
             name: $('#card-name').val().trim(),
             name: $('#ce-name').val().trim(),
             variants: [variant]
             variants: [variant]
         };
         };
     }
     },
   
 
    // 设置表单数据
     setCardData: function(card, variantIndex) {
     function setFormData(card, variantIndex) {
         variantIndex = variantIndex || 0;
         variantIndex = variantIndex || 0;
         $('#card-name').val(card.name);
       
         $('#ce-name').val(card.name);
          
          
         if (variantIndex < card.variants.length) {
         if (variantIndex < card.variants.length) {
            var variant = card.variants[variantIndex];
             var isVariant = variant['卡组'] === '灵光一闪';
             var isVariant = variant['卡组'] === '灵光一闪';
              
              
             // 设置字段是否可编辑
             // 设置字段是否可编辑
             $('#card-name').prop('disabled', isVariant);
             $('#ce-name').prop('disabled', isVariant);
             $('#card-art').prop('disabled', isVariant);
             $('#ce-art').prop('disabled', isVariant);
             $('.card-dropdown-container').eq(1).find('input').prop('disabled', isVariant);
             $('#ce-attr').prop('disabled', isVariant);
             $('.card-dropdown-container').eq(2).find('input').prop('disabled', isVariant);
             $('#ce-rarity').prop('disabled', isVariant);
             $('#card-derived').prop('disabled', isVariant);
             $('#ce-derived').prop('disabled', isVariant);
              
              
             // 设置值
             // 设置值
             $('#card-art').val(variant.art || '');
             $('#ce-art').val(variant.art || '');
             $('.card-dropdown-container').eq(0).find('input').val(variant['卡组'] || '');
             $('#ce-deck').val(variant['卡组'] || '');
             $('.card-dropdown-container').eq(1).find('input').val(variant['属性'] || '');
             $('#ce-attr').val(variant['属性'] || '');
             $('.card-dropdown-container').eq(2).find('input').val(variant['稀有度'] || '');
             $('#ce-rarity').val(variant['稀有度'] || '');
             $('#card-ap').val(variant.AP !== undefined ? variant.AP : '');
           
             $('.card-dropdown-container').eq(3).find('input').val(variant['类型'] || '');
            var ap = variant.AP;
             $('#card-mechanism').val(variant['机制'] || '');
             $('#ce-ap').val(ap !== undefined ? String(ap) : '');
             $('#card-desc').val(variant['描述'] || '');
           
             $('#card-derived').val(variant['衍生卡牌'] || '');
             $('#ce-mechanism').val(variant['机制'] || '');
             $('#ce-type').val(variant['类型'] || '');
             $('#ce-desc').val(variant['描述'] || '');
             $('#ce-derived').val(variant['衍生卡牌'] || '');
         }
         }
     }
     },
   
 
    // 清空表单
     clearForm: function() {
     function clearForm() {
         $('#ce-name').val('').prop('disabled', false);
         $('#card-name').val('').prop('disabled', false);
         $('#ce-art').val('').prop('disabled', false);
         $('#card-art').val('').prop('disabled', false);
         $('#ce-deck').val('');
         $('#card-ap').val('');
         $('#ce-attr').val('').prop('disabled', false);
         $('#card-mechanism').val('');
         $('#ce-rarity').val('').prop('disabled', false);
         $('#card-desc').val('');
         $('#ce-ap').val('');
         $('#card-derived').val('').prop('disabled', false);
        $('#ce-mechanism').val('');
         $('.card-dropdown-input').val('').prop('disabled', false);
         $('#ce-type').val('');
       
        $('#ce-desc').val('');
        cardData.currentCard = null;
        $('#ce-derived').val('').prop('disabled', false);
        cardData.currentVariantIndex = null;
     },
     }
 
   
     addCard: function() {
    // 添加卡牌
         var cardData = this.getCardData();
     function addCard() {
         if (!cardData.name) {
         var data = getFormData();
             alert('卡牌名称不能为空!');
         if (!data.name) {
             mw.notify('卡牌名称不能为空!', {type: 'warn'});
             return;
             return;
         }
         }
          
          
         cardData.cards.push(data);
         this.cards.push(cardData);
         cardData.currentCard = data;
         this.currentCard = cardData;
         cardData.currentVariantIndex = 0;
         this.currentVariantIndex = 0;
         updateCardList();
         this.updateCardList();
         updateVariantList();
         this.updateVariantList();
         updateCode();
         this.updateCode();
         clearForm();
         this.clearForm();
         mw.notify('卡牌添加成功!', {type: 'success'});
         alert('卡牌 "' + cardData.name + '" 添加成功!');
     }
     },
   
 
    // 添加变体
     addVariant: function() {
     function addVariant() {
         if (!this.currentCard) {
         if (!cardData.currentCard) {
             alert('请先选择一个卡牌!');
             mw.notify('请先选择一个卡牌!', {type: 'warn'});
             return;
             return;
         }
         }
          
          
         var data = getFormData();
         var variantData = this.getCardData();
         var variant = data.variants[0];
         var variant = variantData.variants[0];
         variant['卡组'] = '灵光一闪';
         variant['卡组'] = '灵光一闪';
          
          
         cardData.currentCard.variants.push(variant);
         this.currentCard.variants.push(variant);
         cardData.currentVariantIndex = cardData.currentCard.variants.length - 1;
         this.currentVariantIndex = this.currentCard.variants.length - 1;
         updateVariantList();
         this.updateVariantList();
         updateCode();
         this.updateCode();
         mw.notify('变体添加成功!', {type: 'success'});
         alert('为 "' + this.currentCard.name + '" 添加变体成功!');
     }
     },
   
 
    // 保存数据
     saveData: function() {
     function saveData() {
         if (!this.currentCard || this.currentVariantIndex === null) {
         if (!cardData.currentCard || cardData.currentVariantIndex === null) {
             alert('请先选择要保存的卡牌或变体!');
             mw.notify('请先选择要保存的卡牌或变体!', {type: 'warn'});
             return;
             return;
         }
         }
          
          
         var data = getFormData();
         var cardData = this.getCardData();
         var isVariant = cardData.currentVariantIndex > 0;
         var isVariant = this.currentVariantIndex > 0;
          
          
         if (isVariant) {
         if (isVariant) {
             var variant = data.variants[0];
             var variant = cardData.variants[0];
             variant['卡组'] = '灵光一闪';
             variant['卡组'] = '灵光一闪';
             cardData.currentCard.variants[cardData.currentVariantIndex] = variant;
             this.currentCard.variants[this.currentVariantIndex] = variant;
         } else {
         } else {
             cardData.currentCard.name = data.name;
             this.currentCard.name = cardData.name;
             cardData.currentCard.variants[0] = data.variants[0];
             this.currentCard.variants[0] = cardData.variants[0];
         }
         }
          
          
         updateCardList();
         this.updateCardList();
         updateVariantList();
         this.updateVariantList();
         updateCode();
         this.updateCode();
         mw.notify('数据保存成功!', {type: 'success'});
         alert('数据保存成功!');
     }
     },
   
 
    // 删除卡牌
     deleteCard: function() {
     function deleteCard() {
         if (!this.currentCard) {
         if (!cardData.currentCard) {
             alert('请先选择要删除的卡牌!');
             mw.notify('请先选择要删除的卡牌!', {type: 'warn'});
             return;
             return;
         }
         }
          
          
         if (!confirm('确定要删除卡牌 "' + cardData.currentCard.name + '" 吗?')) {
         if (confirm('确定要删除卡牌 "' + this.currentCard.name + '" 吗?')) {
            var index = this.cards.indexOf(this.currentCard);
            this.cards.splice(index, 1);
            this.currentCard = null;
            this.currentVariantIndex = null;
            this.updateCardList();
            this.updateVariantList();
            this.updateCode();
            this.clearForm();
            alert('卡牌删除成功!');
        }
    },
 
    deleteVariant: function() {
        if (!this.currentCard || this.currentVariantIndex === null) {
            alert('请先选择要删除的变体!');
             return;
             return;
         }
         }
          
          
        var index = cardData.cards.indexOf(cardData.currentCard);
         if (this.currentVariantIndex === 0) {
        if (index > -1) {
             alert('不能删除主卡牌变体!');
            cardData.cards.splice(index, 1);
        }
       
        cardData.currentCard = null;
        cardData.currentVariantIndex = null;
        updateCardList();
        updateVariantList();
        updateCode();
        clearForm();
        mw.notify('卡牌删除成功!', {type: 'success'});
    }
   
    // 删除变体
    function deleteVariant() {
         if (!cardData.currentCard || cardData.currentVariantIndex === null) {
             mw.notify('请先选择要删除的变体!', {type: 'warn'});
             return;
             return;
         }
         }
          
          
         if (cardData.currentVariantIndex === 0) {
         if (confirm('确定要删除这个变体吗?')) {
             mw.notify('不能删除主卡牌变体!', {type: 'warn'});
            this.currentCard.variants.splice(this.currentVariantIndex, 1);
             return;
            this.currentVariantIndex = 0;
            this.updateVariantList();
            this.updateCode();
             this.setCardData(this.currentCard, 0);
             alert('变体删除成功!');
         }
         }
          
    },
         if (!confirm('确定要删除这个变体吗?')) {
 
             return;
    onCardSelected: function(index) {
         this.currentCard = this.cards[index];
        this.currentVariantIndex = 0;
        this.updateVariantList();
        this.setCardData(this.currentCard, 0);
    },
 
    onVariantSelected: function(index) {
         if (!this.currentCard) return;
        this.currentVariantIndex = index;
        this.setCardData(this.currentCard, index);
    },
 
    updateCardList: function() {
        var html = '';
        for (var i = 0; i < this.cards.length; i++) {
             html += '<div class="ce-list-item" data-index="' + i + '">' +
                    this.cards[i].name + '</div>';
         }
         }
          
         $('#ce-card-list').html(html);
        cardData.currentCard.variants.splice(cardData.currentVariantIndex, 1);
     },
        cardData.currentVariantIndex = 0;
 
        updateVariantList();
     updateVariantList: function() {
        updateCode();
         var html = '';
        setFormData(cardData.currentCard, 0);
         if (this.currentCard) {
        mw.notify('变体删除成功!', {type: 'success'});
             for (var i = 0; i < this.currentCard.variants.length; i++) {
     }
                 var variant = this.currentCard.variants[i];
   
                var deck = variant['卡组'] || '未知';
    // 更新卡牌列表
                 var name = i === 0 ? '主卡牌 (' + deck + ')' : '变体 ' + i + ' (灵光一闪)';
     function updateCardList() {
                 html += '<div class="ce-list-item" data-index="' + i + '">' + name + '</div>';
         var list = $('#card-list').empty();
         cardData.cards.forEach(function(card, index) {
             var item = $('<div>')
                 .addClass('card-list-item')
                .attr('data-index', index)
                 .text(card.name)
                .click(function() {
                    onCardSelected(index);
                 });
           
            if (cardData.currentCard === card) {
                item.addClass('card-list-item-selected');
             }
             }
           
            list.append(item);
        });
    }
   
    // 更新变体列表
    function updateVariantList() {
        var list = $('#variant-list').empty();
        if (cardData.currentCard) {
            cardData.currentCard.variants.forEach(function(variant, index) {
                var deck = variant['卡组'] || '未知';
                var text = index === 0 ? '主卡牌 (' + deck + ')' : '变体 ' + index + ' (灵光一闪)';
               
                var item = $('<div>')
                    .addClass('card-list-item')
                    .text(text)
                    .click(function() {
                        onVariantSelected(index);
                    });
               
                if (cardData.currentVariantIndex === index) {
                    item.addClass('card-list-item-selected');
                }
               
                list.append(item);
            });
        }
    }
   
    // 卡牌选择事件
    function onCardSelected(index) {
        cardData.currentCard = cardData.cards[index];
        cardData.currentVariantIndex = 0;
        updateCardList();
        updateVariantList();
        setFormData(cardData.currentCard, 0);
    }
   
    // 变体选择事件
    function onVariantSelected(index) {
        if (!cardData.currentCard) return;
        cardData.currentVariantIndex = index;
        updateVariantList();
        setFormData(cardData.currentCard, index);
    }
   
    // 更新卡牌顺序
    function updateCardOrder() {
        var newCards = [];
        $('#card-list .card-list-item').each(function() {
            var index = $(this).attr('data-index');
            newCards.push(cardData.cards[index]);
        });
        cardData.cards = newCards;
        updateCardList();
        updateCode();
    }
   
    // 转义Lua字符串
    function escapeLuaString(str) {
        if (typeof str !== 'string') return str;
        return str.replace(/\\/g, '\\\\')
                  .replace(/"/g, '\\"')
                  .replace(/\n/g, '\\n');
    }
   
    // 生成Lua代码
    function generateLuaCode() {
        if (cardData.cards.length === 0) {
            return '-- 暂无数据';
         }
         }
        $('#ce-variant-list').html(html);
    },
    insertTextFormat: function(color) {
        var textarea = document.getElementById('ce-desc');
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value;
        var selectedText = text.substring(start, end);
       
        var newText = '{{文本|' + color + '|' + selectedText + '}}';
        textarea.value = text.substring(0, start) + newText + text.substring(end);
       
        // 设置光标位置
        var cursorPos = start + newText.length;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },
    insertStrokeFormat: function() {
        var textarea = document.getElementById('ce-desc');
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value;
        var selectedText = text.substring(start, end);
       
        var newText = '{{描边|绿|' + selectedText + '}}';
        textarea.value = text.substring(0, start) + newText + text.substring(end);
       
        var cursorPos = start + newText.length;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },
    insertBr: function() {
        var textarea = document.getElementById('ce-desc');
        var start = textarea.selectionStart;
        var text = textarea.value;
       
        textarea.value = text.substring(0, start) + '<br>' + text.substring(start);
       
        var cursorPos = start + 4;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },
    escapeLuaString: function(s) {
        if (typeof s !== 'string') return s;
        return s.replace(/\\/g, '\\\\')
              .replace(/"/g, '\\"')
              .replace(/\n/g, '\\n');
    },
    generateLuaCode: function() {
        if (this.cards.length === 0) return '-- 暂无数据';
          
          
         var lua = 'local p = {}\n\n';
         var lua = 'local p = {}\n\n';
          
          
         // 生成 cardOrder(不包含衍生卡牌)
         // 生成 cardOrder
         lua += 'local cardOrder = {\n';
         lua += 'local cardOrder = {\n';
         cardData.cards.forEach(function(card) {
         for (var i = 0; i < this.cards.length; i++) {
             if (card.variants[0] && card.variants[0]['卡组'] !== '衍生卡牌') {
            var card = this.cards[i];
                 lua += '    "' + escapeLuaString(card.name) + '",\n';
             if (card.variants.length > 0 && card.variants[0]['卡组'] !== '衍生卡牌') {
                 lua += '    "' + this.escapeLuaString(card.name) + '",\n';
             }
             }
         });
         }
         lua += '}\n\n';
         lua += '}\n\n';
          
          
         // 生成 card 数据
         // 生成 card 数据
         lua += 'local card = {\n';
         lua += 'local card = {\n';
          
         for (var i = 0; i < this.cards.length; i++) {
        cardData.cards.forEach(function(card) {
            var card = this.cards[i];
             lua += '    ["' + escapeLuaString(card.name) + '"] = {\n';
             lua += '    ["' + this.escapeLuaString(card.name) + '"] = {\n';
              
              
             card.variants.forEach(function(variant) {
             for (var j = 0; j < card.variants.length; j++) {
                var variant = card.variants[j];
                 lua += '        {\n';
                 lua += '        {\n';
                  
                  
                 // 按固定顺序输出字段
                 var fieldOrder = ['art', '卡组', '属性', '稀有度', 'AP', '机制', '类型', '描述', '衍生卡牌'];
                 fieldDefinitions.cardOrder.forEach(function(field) {
                 for (var k = 0; k < fieldOrder.length; k++) {
                     if (variant.hasOwnProperty(field) && variant[field] !== null && variant[field] !== '') {
                    var field = fieldOrder[k];
                     if (variant[field] !== undefined && variant[field] !== null) {
                         var value = variant[field];
                         var value = variant[field];
                         if (typeof value === 'string') {
                         if (typeof value === 'string' && value.trim() !== '') {
                             lua += '            ["' + field + '"] = "' + escapeLuaString(value) + '",\n';
                             lua += '            ["' + field + '"] = "' + this.escapeLuaString(value) + '",\n';
                         } else if (typeof value === 'number') {
                         } else if (typeof value === 'number') {
                             lua += '            ["' + field + '"] = ' + value + ',\n';
                             lua += '            ["' + field + '"] = ' + value + ',\n';
                         }
                         }
                     }
                     }
                 });
                 }
                  
                  
                 lua += '        },\n';
                 lua += '        },\n';
             });
             }
              
              
             lua += '    },\n';
             lua += '    },\n';
         });
         }
        lua += '}\n\n';
          
          
        lua += '}\n\n';
         lua += 'p.card = card\n';
         lua += 'p.card = card\n';
         lua += 'p.cardOrder = cardOrder\n\n';
         lua += 'p.cardOrder = cardOrder\n\n';
第554行: 第544行:
          
          
         return lua;
         return lua;
     }
     },
   
 
    // 更新代码显示
     updateCode: function() {
     function updateCode() {
         var code = this.generateLuaCode();
         var code = generateLuaCode();
         $('#ce-code-display').val(code);
         $('#code-display').val(code);
     },
     }
 
   
     copyCode: function() {
    // 复制代码
         var codeDisplay = document.getElementById('ce-code-display');
     function copyCode() {
         codeDisplay.select();
         var code = $('#code-display');
         code.select();
         document.execCommand('copy');
         document.execCommand('copy');
         mw.notify('代码已复制到剪贴板!', {type: 'success'});
         alert('代码已复制到剪贴板!');
     }
     },
   
 
    // 从Wiki加载数据
     loadAllCards: function() {
     function loadFromWiki() {
         var self = this;
         mw.notify('正在加载数据...', {type: 'info'});
          
          
         // 获取所有模块:卡牌/开头的页面
         // 搜索所有 模块:卡牌/+角色名 的页面
         new mw.Api().get({
         this.api.get({
             action: 'query',
             action: 'query',
             list: 'allpages',
             list: 'allpages',
             apprefix: '卡牌/',
             apprefix: '卡牌/',
             apnamespace: 828, // Module namespace
             apnamespace: 828, // Module namespace
             aplimit: 500
             aplimit: 'max'
         }).done(function(data) {
         }).done(function(data) {
             if (!data.query || !data.query.allpages || data.query.allpages.length === 0) {
             if (data.query && data.query.allpages) {
                 mw.notify('未找到卡牌模块!', {type: 'warn'});
                 var pages = data.query.allpages;
                return;
                var loadPromises = [];
            }
               
           
                pages.forEach(function(page) {
            var pages = data.query.allpages;
                    loadPromises.push(self.loadCardModule(page.title));
            var loadedCards = [];
                });
            var loadCount = 0;
           
            pages.forEach(function(page) {
                var pageName = page.title;
                  
                  
                 // 加载每个模块的内容
                 $.when.apply($, loadPromises).done(function() {
                new mw.Api().get({
                     self.updateCardList();
                    action: 'query',
                     self.updateCode();
                    prop: 'revisions',
                     alert('成功加载 ' + self.cards.length + ' 张卡牌!');
                    titles: pageName,
                    rvprop: 'content',
                    rvslots: 'main'
                }).done(function(moduleData) {
                     loadCount++;
                   
                    var pageId = Object.keys(moduleData.query.pages)[0];
                     var content = moduleData.query.pages[pageId].revisions[0].slots.main['*'];
                   
                    // 解析Lua内容
                    var parsed = parseLuaContent(content);
                     if (parsed && parsed.length > 0) {
                        loadedCards = loadedCards.concat(parsed);
                    }
                   
                    // 所有页面加载完成
                    if (loadCount === pages.length) {
                        cardData.cards = loadedCards;
                        cardData.currentCard = null;
                        cardData.currentVariantIndex = null;
                        updateCardList();
                        updateVariantList();
                        updateCode();
                        clearForm();
                        mw.notify('成功加载 ' + loadedCards.length + ' 张卡牌!', {type: 'success'});
                    }
                 });
                 });
             });
             }
        });
    },
 
    loadCardModule: function(pageName) {
        var self = this;
        var deferred = $.Deferred();
       
        this.api.get({
            action: 'query',
            prop: 'revisions',
            titles: pageName,
            rvprop: 'content',
            rvslots: 'main'
        }).done(function(data) {
            var pages = data.query.pages;
            for (var pageId in pages) {
                var page = pages[pageId];
                if (page.revisions && page.revisions[0]) {
                    var content = page.revisions[0].slots.main['*'];
                    var cards = self.parseLuaModule(content);
                    self.cards = self.cards.concat(cards);
                }
            }
            deferred.resolve();
         }).fail(function() {
         }).fail(function() {
             mw.notify('加载失败!', {type: 'error'});
             deferred.resolve();
         });
         });
     }
       
   
        return deferred.promise();
    // 解析Lua内容
     },
     function parseLuaContent(content) {
 
     parseLuaModule: function(content) {
         var cards = [];
         var cards = [];
          
          
         try {
         try {
             // 提取 cardOrder
             // 提取卡牌数据
             var cardOrderMatch = content.match(/local\s+cardOrder\s*=\s*\{([^}]+)\}/s);
             var cardMatch = content.match(/local\s+card\s*=\s*\{([\s\S]*?)\}/);
            var cardOrder = [];
             if (!cardMatch) return cards;
             if (cardOrderMatch) {
                var orderContent = cardOrderMatch[1];
                var nameMatches = orderContent.match(/"([^"]+)"/g);
                if (nameMatches) {
                    cardOrder = nameMatches.map(function(m) { return m.slice(1, -1); });
                }
            }
              
              
            // 提取 card 表
             var cardContent = cardMatch[1];
             var cardTableMatch = content.match(/local\s+card\s*=\s*\{(.+)\}\s*p\.card/s);
            if (!cardTableMatch) return cards;
              
              
            var cardContent = cardTableMatch[1];
             // 简化的解析逻辑 - 提取卡牌名称
           
             var nameMatches = cardContent.match(/\["([^"]+)"\]\s*=\s*\{/g);
             // 提取所有卡牌名称
             if (nameMatches) {
             var allCardNames = [];
                 nameMatches.forEach(function(match) {
            var namePattern = /\["([^"]+)"\]\s*=\s*\{/g;
                     var name = match.match(/\["([^"]+)"\]/)[1];
             var match;
            while ((match = namePattern.exec(cardContent)) !== null) {
                var name = match[1];
                if (allCardNames.indexOf(name) === -1) {
                    allCardNames.push(name);
                 }
            }
           
            // 合并cardOrder和实际卡牌名称
            var finalCardNames = [];
            cardOrder.forEach(function(name) {
                if (allCardNames.indexOf(name) !== -1) {
                     finalCardNames.push(name);
                    allCardNames.splice(allCardNames.indexOf(name), 1);
                }
            });
            finalCardNames = finalCardNames.concat(allCardNames);
           
            // 解析每个卡牌
            finalCardNames.forEach(function(cardName) {
                var variants = extractCardVariants(cardContent, cardName);
                if (variants.length > 0) {
                     cards.push({
                     cards.push({
                         name: cardName,
                         name: name,
                         variants: variants
                         variants: [{}] // 简化处理
                     });
                     });
                 }
                 });
            });
             }
              
         } catch (e) {
         } catch (e) {
             console.error('解析错误:', e);
             console.error('解析错误:', e);
第690行: 第640行:
          
          
         return cards;
         return cards;
     }
     },
   
 
    // 提取卡牌变体
     saveToWiki: function() {
    function extractCardVariants(content, cardName) {
         if (this.cards.length === 0) {
        var variants = [];
             alert('没有数据可保存!');
        var escapedName = cardName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
        var pattern = new RegExp('\\["' + escapedName + '"\\]\\s*=\\s*\\{', 'g');
        var match = pattern.exec(content);
       
        if (!match) return variants;
       
        var startPos = match.index + match[0].length;
        var cardBlock = extractBalancedBraces(content, startPos);
       
        if (!cardBlock) return variants;
       
        // 解析所有变体
        var pos = 0;
        while (pos < cardBlock.length) {
            while (pos < cardBlock.length && /\s/.test(cardBlock[pos])) pos++;
            if (pos >= cardBlock.length) break;
           
            if (cardBlock[pos] === '{') {
                var variantContent = extractBalancedBraces(cardBlock, pos + 1);
                if (variantContent) {
                    var variant = parseVariant(variantContent);
                    if (Object.keys(variant).length > 0) {
                        variants.push(variant);
                    }
                    pos += variantContent.length + 2;
                } else {
                    pos++;
                }
            } else {
                pos++;
            }
        }
       
        return variants;
     }
   
    // 提取平衡的大括号内容
    function extractBalancedBraces(text, startPos) {
        var braceCount = 1;
        var pos = startPos;
        var inString = false;
        var escapeNext = false;
        var result = [];
       
        while (pos < text.length && braceCount > 0) {
            var char = text[pos];
           
            if (escapeNext) {
                result.push(char);
                escapeNext = false;
                pos++;
                continue;
            }
           
            if (char === '\\' && inString) {
                result.push(char);
                escapeNext = true;
                pos++;
                continue;
            }
           
            if (char === '"') {
                inString = !inString;
                result.push(char);
                pos++;
                continue;
            }
           
            if (!inString) {
                if (char === '{') {
                    braceCount++;
                } else if (char === '}') {
                    braceCount--;
                    if (braceCount === 0) break;
                }
            }
           
            result.push(char);
            pos++;
        }
       
        return braceCount === 0 ? result.join('') : null;
    }
   
    // 解析变体
    function parseVariant(content) {
        var variant = {};
        var pos = 0;
       
        while (pos < content.length) {
            while (pos < content.length && /[\s,]/.test(content[pos])) pos++;
            if (pos >= content.length) break;
           
            if (content[pos] === '[') {
                var fieldMatch = content.substring(pos).match(/\["([^"]+)"\]\s*=\s*/);
                if (fieldMatch) {
                    var fieldName = fieldMatch[1];
                    pos += fieldMatch[0].length;
                   
                    var result = extractFieldValue(content, pos);
                    if (result.value !== null) {
                        variant[fieldName] = result.value;
                        pos += result.length;
                    } else {
                        pos++;
                    }
                } else {
                    pos++;
                }
            } else {
                pos++;
            }
        }
       
        return variant;
    }
   
    // 提取字段值
    function extractFieldValue(text, startPos) {
        var pos = startPos;
       
        while (pos < text.length && /\s/.test(text[pos])) pos++;
        if (pos >= text.length) return {value: null, length: 0};
       
        // 字符串值
        if (text[pos] === '"') {
            pos++;
            var valueChars = [];
            var escapeNext = false;
           
            while (pos < text.length) {
                var char = text[pos];
               
                if (escapeNext) {
                    if (char === 'n') valueChars.push('\n');
                    else if (char === 't') valueChars.push('\t');
                    else if (char === '\\') valueChars.push('\\');
                    else if (char === '"') valueChars.push('"');
                    else valueChars.push(char);
                    escapeNext = false;
                    pos++;
                    continue;
                }
               
                if (char === '\\') {
                    escapeNext = true;
                    pos++;
                    continue;
                }
               
                if (char === '"') {
                    pos++;
                    break;
                }
               
                valueChars.push(char);
                pos++;
            }
           
            return {
                value: valueChars.join(''),
                length: pos - startPos
            };
        }
        // 数字或其他值
        else {
            var valueMatch = text.substring(pos).match(/([^,\n}\]]+)/);
            if (valueMatch) {
                var valueStr = valueMatch[1].trim();
                var length = valueMatch[0].length;
               
                if (/^\d+$/.test(valueStr) || /^-\d+$/.test(valueStr)) {
                    return {value: parseInt(valueStr), length: length};
                } else {
                    return {value: valueStr, length: length};
                }
            }
        }
       
        return {value: null, length: 0};
    }
   
    // 保存到Wiki
    function saveToWiki() {
         if (cardData.cards.length === 0) {
             mw.notify('没有数据可保存!', {type: 'warn'});
            return;
        }
       
        if (!confirm('确定要保存数据到Wiki吗?这将覆盖现有的模块页面!')) {
             return;
             return;
         }
         }
          
          
         mw.notify('正在保存数据...', {type: 'info'});
         var self = this;
        var characterName = prompt('请输入角色名称(将保存为"模块:卡牌/角色名"):');
          
          
         // 按角色名分组卡牌
         if (!characterName) return;
        var groupedCards = {};
        cardData.cards.forEach(function(card) {
            // 这里需要用户手动指定角色名,简化处理,可以提示用户
            // 暂时使用第一个卡牌的art文件名推测角色
            var characterName = prompt('请为卡牌 "' + card.name + '" 指定角色名:', '');
            if (!characterName) {
                characterName = '未分类';
            }
           
            if (!groupedCards[characterName]) {
                groupedCards[characterName] = [];
            }
            groupedCards[characterName].push(card);
        });
       
        // 保存每个角色的模块
        var saveCount = 0;
        var totalModules = Object.keys(groupedCards).length;
       
        Object.keys(groupedCards).forEach(function(characterName) {
            var cards = groupedCards[characterName];
            var luaCode = generateLuaCodeForCharacter(cards);
            var pageName = '模块:卡牌/' + characterName;
           
            new mw.Api().postWithToken('csrf', {
                action: 'edit',
                title: pageName,
                text: luaCode,
                summary: '通过卡牌编辑器更新',
                contentmodel: 'Scribunto'
            }).done(function() {
                saveCount++;
                if (saveCount === totalModules) {
                    mw.notify('所有数据保存成功!', {type: 'success'});
                }
            }).fail(function() {
                mw.notify('保存 ' + pageName + ' 失败!', {type: 'error'});
            });
        });
    }
   
    // 为特定角色生成Lua代码
    function generateLuaCodeForCharacter(cards) {
        var lua = 'local p = {}\n\n';
          
          
         lua += 'local cardOrder = {\n';
         var pageName = '模块:卡牌/' + characterName;
         cards.forEach(function(card) {
         var content = this.generateLuaCode();
            if (card.variants[0] && card.variants[0]['卡组'] !== '衍生卡牌') {
                lua += '    "' + escapeLuaString(card.name) + '",\n';
            }
        });
        lua += '}\n\n';
          
          
         lua += 'local card = {\n';
         this.api.postWithToken('csrf', {
        cards.forEach(function(card) {
             action: 'edit',
             lua += '   ["' + escapeLuaString(card.name) + '"] = {\n';
             title: pageName,
              
             text: content,
             card.variants.forEach(function(variant) {
            summary: '通过卡牌编辑器更新'
                lua += '       {\n';
        }).done(function() {
               
            alert('成功保存到 ' + pageName + '');
                fieldDefinitions.cardOrder.forEach(function(field) {
        }).fail(function(error) {
                    if (variant.hasOwnProperty(field) && variant[field] !== null && variant[field] !== '') {
            alert('保存失败:' + error);
                        var value = variant[field];
                        if (typeof value === 'string') {
                            lua += '            ["' + field + '"] = "' + escapeLuaString(value) + '",\n';
                        } else if (typeof value === 'number') {
                            lua += '            ["' + field + '"] = ' + value + ',\n';
                        }
                    }
                });
               
                lua += '        },\n';
            });
           
            lua += '    },\n';
         });
         });
        lua += '}\n\n';
       
        lua += 'p.card = card\n';
        lua += 'p.cardOrder = cardOrder\n\n';
        lua += 'return p\n';
       
        return lua;
     }
     }
   
};
    // 初始化
    $(function() {
        initUI();
    });
   
})();

2025年10月2日 (四) 10:43的版本

window.CardEditor = {
    cards: [],
    currentCard: null,
    currentVariantIndex: null,
    api: new mw.Api(),

    init: function() {
        this.createUI();
        this.bindEvents();
        this.loadAllCards();
    },

    createUI: function() {
        var html = 
        '<div id="card-editor">' +
            '<div class="ce-container">' +
                // 左侧输入区
                '<div class="ce-left">' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">卡牌数据</div>' +
                        '<div class="ce-form">' +
                            // 名称
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌名称:</div>' +
                                '<input type="text" id="ce-name" class="ce-input" placeholder="请输入卡牌名称...">' +
                            '</div>' +
                            // 卡组
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡组类型:</div>' +
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-deck" class="ce-select-input" placeholder="点击选择或输入..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-deck-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="起始卡牌">起始卡牌</div>' +
                                        '<div class="ce-select-option" data-value="独特卡牌">独特卡牌</div>' +
                                        '<div class="ce-select-option" data-value="灵光一闪">灵光一闪</div>' +
                                        '<div class="ce-select-option" data-value="衍生卡牌">衍生卡牌</div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // 图片
                            '<div class="ce-row">' +
                                '<div class="ce-label">图片文件:</div>' +
                                '<input type="text" id="ce-art" class="ce-input" placeholder="输入图片文件名...">' +
                            '</div>' +
                            // 属性
                            '<div class="ce-row">' +
                                '<div class="ce-label">属性:</div>' +
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-attr" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-attr-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="热情">热情</div>' +
                                        '<div class="ce-select-option" data-value="秩序">秩序</div>' +
                                        '<div class="ce-select-option" data-value="正义">正义</div>' +
                                        '<div class="ce-select-option" data-value="本能">本能</div>' +
                                        '<div class="ce-select-option" data-value="虚无">虚无</div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // 稀有度
                            '<div class="ce-row">' +
                                '<div class="ce-label">稀有度:</div>' +
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-rarity" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-rarity-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="白">白</div>' +
                                        '<div class="ce-select-option" data-value="蓝">蓝</div>' +
                                        '<div class="ce-select-option" data-value="橙">橙</div>' +
                                        '<div class="ce-select-option" data-value="彩">彩</div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // AP
                            '<div class="ce-row">' +
                                '<div class="ce-label">AP (行动点):</div>' +
                                '<input type="text" id="ce-ap" class="ce-input" placeholder="输入AP数值...">' +
                            '</div>' +
                            // 类型
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌类型:</div>' +
                                '<div class="ce-select-wrapper">' +
                                    '<input type="text" id="ce-type" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                    '<div class="ce-select-dropdown" id="ce-type-dropdown">' +
                                        '<div class="ce-select-option" data-value="">请选择</div>' +
                                        '<div class="ce-select-option" data-value="攻击">攻击</div>' +
                                        '<div class="ce-select-option" data-value="技能">技能</div>' +
                                        '<div class="ce-select-option" data-value="强化">强化</div>' +
                                        '<div class="ce-select-option" data-value="状态异常">状态异常</div>' +
                                    '</div>' +
                                '</div>' +
                            '</div>' +
                            // 机制
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌机制:</div>' +
                                '<input type="text" id="ce-mechanism" class="ce-input" placeholder="请输入卡牌机制...">' +
                            '</div>' +
                            // 描述
                            '<div class="ce-row">' +
                                '<div class="ce-label">卡牌描述:</div>' +
                                '<div class="ce-desc-wrapper">' +
                                    '<div class="ce-format-buttons">' +
                                        '<div class="ce-btn ce-btn-small ce-btn-blue" id="ce-blue-text">蓝色文本</div>' +
                                        '<div class="ce-btn ce-btn-small ce-btn-green" id="ce-green-text">绿色文本</div>' +
                                        '<div class="ce-btn ce-btn-small ce-btn-lime" id="ce-green-stroke">绿色描边</div>' +
                                        '<div class="ce-btn ce-btn-small ce-btn-orange" id="ce-insert-br">插入换行</div>' +
                                    '</div>' +
                                    '<textarea id="ce-desc" class="ce-textarea" placeholder="请输入卡牌描述..."></textarea>' +
                                '</div>' +
                            '</div>' +
                            // 衍生卡牌
                            '<div class="ce-row">' +
                                '<div class="ce-label">衍生卡牌:</div>' +
                                '<input type="text" id="ce-derived" class="ce-input" placeholder="请输入衍生卡牌...">' +
                            '</div>' +
                        '</div>' +
                    '</div>' +
                    // 按钮区
                    '<div class="ce-buttons">' +
                        '<div class="ce-btn ce-btn-primary" id="ce-add-card">添加卡牌</div>' +
                        '<div class="ce-btn ce-btn-primary" id="ce-add-variant">添加变体</div>' +
                        '<div class="ce-btn" id="ce-save-data">保存数据</div>' +
                        '<div class="ce-btn" id="ce-clear-form">清空表单</div>' +
                    '</div>' +
                '</div>' +
                // 中间列表区
                '<div class="ce-middle">' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">卡牌列表</div>' +
                        '<div class="ce-list-container">' +
                            '<div id="ce-card-list" class="ce-list"></div>' +
                        '</div>' +
                    '</div>' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">变体列表</div>' +
                        '<div class="ce-list-container">' +
                            '<div id="ce-variant-list" class="ce-list"></div>' +
                        '</div>' +
                    '</div>' +
                    '<div class="ce-buttons">' +
                        '<div class="ce-btn ce-btn-danger" id="ce-delete-card">删除卡牌</div>' +
                        '<div class="ce-btn ce-btn-danger" id="ce-delete-variant">删除变体</div>' +
                    '</div>' +
                '</div>' +
                // 右侧代码区
                '<div class="ce-right">' +
                    '<div class="ce-group">' +
                        '<div class="ce-group-title">Lua代码预览</div>' +
                        '<textarea id="ce-code-display" class="ce-code" readonly></textarea>' +
                    '</div>' +
                    '<div class="ce-buttons">' +
                        '<div class="ce-btn" id="ce-load-cards">加载卡牌数据</div>' +
                        '<div class="ce-btn" id="ce-save-to-wiki">保存到Wiki</div>' +
                        '<div class="ce-btn" id="ce-copy-code">复制代码</div>' +
                    '</div>' +
                '</div>' +
            '</div>' +
        '</div>';

        $('#mw-content-text').html(html);
    },

    bindEvents: function() {
        var self = this;

        // 自定义下拉框点击事件
        $('.ce-select-input').on('click', function() {
            var dropdown = $(this).siblings('.ce-select-dropdown');
            $('.ce-select-dropdown').not(dropdown).hide();
            dropdown.toggle();
        });

        $('.ce-select-option').on('click', function() {
            var value = $(this).data('value');
            var text = $(this).text();
            var input = $(this).parent().siblings('.ce-select-input');
            input.val(value || '');
            input.data('value', value);
            $(this).parent().hide();
        });

        // 点击其他地方关闭下拉框
        $(document).on('click', function(e) {
            if (!$(e.target).closest('.ce-select-wrapper').length) {
                $('.ce-select-dropdown').hide();
            }
        });

        // 按钮事件
        $('#ce-add-card').on('click', function() { self.addCard(); });
        $('#ce-add-variant').on('click', function() { self.addVariant(); });
        $('#ce-save-data').on('click', function() { self.saveData(); });
        $('#ce-clear-form').on('click', function() { self.clearForm(); });
        $('#ce-delete-card').on('click', function() { self.deleteCard(); });
        $('#ce-delete-variant').on('click', function() { self.deleteVariant(); });
        $('#ce-load-cards').on('click', function() { self.loadAllCards(); });
        $('#ce-save-to-wiki').on('click', function() { self.saveToWiki(); });
        $('#ce-copy-code').on('click', function() { self.copyCode(); });

        // 文本格式化按钮
        $('#ce-blue-text').on('click', function() { self.insertTextFormat('蓝'); });
        $('#ce-green-text').on('click', function() { self.insertTextFormat('绿'); });
        $('#ce-green-stroke').on('click', function() { self.insertStrokeFormat(); });
        $('#ce-insert-br').on('click', function() { self.insertBr(); });

        // 列表项点击事件
        $(document).on('click', '.ce-list-item', function() {
            var $this = $(this);
            var listId = $this.parent().attr('id');
            
            $('.ce-list-item').removeClass('selected');
            $this.addClass('selected');

            if (listId === 'ce-card-list') {
                var index = $this.data('index');
                self.onCardSelected(index);
            } else if (listId === 'ce-variant-list') {
                var index = $this.data('index');
                self.onVariantSelected(index);
            }
        });
    },

    getCardData: function() {
        var variant = {};
        
        var art = $('#ce-art').val().trim();
        if (art) variant.art = art;
        
        var deck = $('#ce-deck').val().trim();
        if (deck) variant['卡组'] = deck;
        
        var attr = $('#ce-attr').val().trim();
        if (attr) variant['属性'] = attr;
        
        var rarity = $('#ce-rarity').val().trim();
        if (rarity) variant['稀有度'] = rarity;
        
        var ap = $('#ce-ap').val().trim();
        if (ap) {
            if (ap.toUpperCase() === 'X') {
                variant.AP = 'X';
            } else if (/^\d+$/.test(ap)) {
                variant.AP = parseInt(ap);
            } else {
                variant.AP = ap;
            }
        }
        
        var mechanism = $('#ce-mechanism').val().trim();
        if (mechanism) variant['机制'] = mechanism;
        
        var type = $('#ce-type').val().trim();
        if (type) variant['类型'] = type;
        
        var desc = $('#ce-desc').val().trim();
        if (desc) variant['描述'] = desc;
        
        var derived = $('#ce-derived').val().trim();
        if (derived) variant['衍生卡牌'] = derived;

        return {
            name: $('#ce-name').val().trim(),
            variants: [variant]
        };
    },

    setCardData: function(card, variantIndex) {
        variantIndex = variantIndex || 0;
        
        $('#ce-name').val(card.name);
        
        if (variantIndex < card.variants.length) {
            var isVariant = variant['卡组'] === '灵光一闪';
            
            // 设置字段是否可编辑
            $('#ce-name').prop('disabled', isVariant);
            $('#ce-art').prop('disabled', isVariant);
            $('#ce-attr').prop('disabled', isVariant);
            $('#ce-rarity').prop('disabled', isVariant);
            $('#ce-derived').prop('disabled', isVariant);
            
            // 设置值
            $('#ce-art').val(variant.art || '');
            $('#ce-deck').val(variant['卡组'] || '');
            $('#ce-attr').val(variant['属性'] || '');
            $('#ce-rarity').val(variant['稀有度'] || '');
            
            var ap = variant.AP;
            $('#ce-ap').val(ap !== undefined ? String(ap) : '');
            
            $('#ce-mechanism').val(variant['机制'] || '');
            $('#ce-type').val(variant['类型'] || '');
            $('#ce-desc').val(variant['描述'] || '');
            $('#ce-derived').val(variant['衍生卡牌'] || '');
        }
    },

    clearForm: function() {
        $('#ce-name').val('').prop('disabled', false);
        $('#ce-art').val('').prop('disabled', false);
        $('#ce-deck').val('');
        $('#ce-attr').val('').prop('disabled', false);
        $('#ce-rarity').val('').prop('disabled', false);
        $('#ce-ap').val('');
        $('#ce-mechanism').val('');
        $('#ce-type').val('');
        $('#ce-desc').val('');
        $('#ce-derived').val('').prop('disabled', false);
    },

    addCard: function() {
        var cardData = this.getCardData();
        if (!cardData.name) {
            alert('卡牌名称不能为空!');
            return;
        }
        
        this.cards.push(cardData);
        this.currentCard = cardData;
        this.currentVariantIndex = 0;
        this.updateCardList();
        this.updateVariantList();
        this.updateCode();
        this.clearForm();
        alert('卡牌 "' + cardData.name + '" 添加成功!');
    },

    addVariant: function() {
        if (!this.currentCard) {
            alert('请先选择一个卡牌!');
            return;
        }
        
        var variantData = this.getCardData();
        var variant = variantData.variants[0];
        variant['卡组'] = '灵光一闪';
        
        this.currentCard.variants.push(variant);
        this.currentVariantIndex = this.currentCard.variants.length - 1;
        this.updateVariantList();
        this.updateCode();
        alert('为 "' + this.currentCard.name + '" 添加变体成功!');
    },

    saveData: function() {
        if (!this.currentCard || this.currentVariantIndex === null) {
            alert('请先选择要保存的卡牌或变体!');
            return;
        }
        
        var cardData = this.getCardData();
        var isVariant = this.currentVariantIndex > 0;
        
        if (isVariant) {
            var variant = cardData.variants[0];
            variant['卡组'] = '灵光一闪';
            this.currentCard.variants[this.currentVariantIndex] = variant;
        } else {
            this.currentCard.name = cardData.name;
            this.currentCard.variants[0] = cardData.variants[0];
        }
        
        this.updateCardList();
        this.updateVariantList();
        this.updateCode();
        alert('数据保存成功!');
    },

    deleteCard: function() {
        if (!this.currentCard) {
            alert('请先选择要删除的卡牌!');
            return;
        }
        
        if (confirm('确定要删除卡牌 "' + this.currentCard.name + '" 吗?')) {
            var index = this.cards.indexOf(this.currentCard);
            this.cards.splice(index, 1);
            this.currentCard = null;
            this.currentVariantIndex = null;
            this.updateCardList();
            this.updateVariantList();
            this.updateCode();
            this.clearForm();
            alert('卡牌删除成功!');
        }
    },

    deleteVariant: function() {
        if (!this.currentCard || this.currentVariantIndex === null) {
            alert('请先选择要删除的变体!');
            return;
        }
        
        if (this.currentVariantIndex === 0) {
            alert('不能删除主卡牌变体!');
            return;
        }
        
        if (confirm('确定要删除这个变体吗?')) {
            this.currentCard.variants.splice(this.currentVariantIndex, 1);
            this.currentVariantIndex = 0;
            this.updateVariantList();
            this.updateCode();
            this.setCardData(this.currentCard, 0);
            alert('变体删除成功!');
        }
    },

    onCardSelected: function(index) {
        this.currentCard = this.cards[index];
        this.currentVariantIndex = 0;
        this.updateVariantList();
        this.setCardData(this.currentCard, 0);
    },

    onVariantSelected: function(index) {
        if (!this.currentCard) return;
        this.currentVariantIndex = index;
        this.setCardData(this.currentCard, index);
    },

    updateCardList: function() {
        var html = '';
        for (var i = 0; i < this.cards.length; i++) {
            html += '<div class="ce-list-item" data-index="' + i + '">' + 
                    this.cards[i].name + '</div>';
        }
        $('#ce-card-list').html(html);
    },

    updateVariantList: function() {
        var html = '';
        if (this.currentCard) {
            for (var i = 0; i < this.currentCard.variants.length; i++) {
                var variant = this.currentCard.variants[i];
                var deck = variant['卡组'] || '未知';
                var name = i === 0 ? '主卡牌 (' + deck + ')' : '变体 ' + i + ' (灵光一闪)';
                html += '<div class="ce-list-item" data-index="' + i + '">' + name + '</div>';
            }
        }
        $('#ce-variant-list').html(html);
    },

    insertTextFormat: function(color) {
        var textarea = document.getElementById('ce-desc');
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value;
        var selectedText = text.substring(start, end);
        
        var newText = '{{文本|' + color + '|' + selectedText + '}}';
        textarea.value = text.substring(0, start) + newText + text.substring(end);
        
        // 设置光标位置
        var cursorPos = start + newText.length;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },

    insertStrokeFormat: function() {
        var textarea = document.getElementById('ce-desc');
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value;
        var selectedText = text.substring(start, end);
        
        var newText = '{{描边|绿|' + selectedText + '}}';
        textarea.value = text.substring(0, start) + newText + text.substring(end);
        
        var cursorPos = start + newText.length;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },

    insertBr: function() {
        var textarea = document.getElementById('ce-desc');
        var start = textarea.selectionStart;
        var text = textarea.value;
        
        textarea.value = text.substring(0, start) + '<br>' + text.substring(start);
        
        var cursorPos = start + 4;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },

    escapeLuaString: function(s) {
        if (typeof s !== 'string') return s;
        return s.replace(/\\/g, '\\\\')
               .replace(/"/g, '\\"')
               .replace(/\n/g, '\\n');
    },

    generateLuaCode: function() {
        if (this.cards.length === 0) return '-- 暂无数据';
        
        var lua = 'local p = {}\n\n';
        
        // 生成 cardOrder
        lua += 'local cardOrder = {\n';
        for (var i = 0; i < this.cards.length; i++) {
            var card = this.cards[i];
            if (card.variants.length > 0 && card.variants[0]['卡组'] !== '衍生卡牌') {
                lua += '    "' + this.escapeLuaString(card.name) + '",\n';
            }
        }
        lua += '}\n\n';
        
        // 生成 card 数据
        lua += 'local card = {\n';
        for (var i = 0; i < this.cards.length; i++) {
            var card = this.cards[i];
            lua += '    ["' + this.escapeLuaString(card.name) + '"] = {\n';
            
            for (var j = 0; j < card.variants.length; j++) {
                var variant = card.variants[j];
                lua += '        {\n';
                
                var fieldOrder = ['art', '卡组', '属性', '稀有度', 'AP', '机制', '类型', '描述', '衍生卡牌'];
                for (var k = 0; k < fieldOrder.length; k++) {
                    var field = fieldOrder[k];
                    if (variant[field] !== undefined && variant[field] !== null) {
                        var value = variant[field];
                        if (typeof value === 'string' && value.trim() !== '') {
                            lua += '            ["' + field + '"] = "' + this.escapeLuaString(value) + '",\n';
                        } else if (typeof value === 'number') {
                            lua += '            ["' + field + '"] = ' + value + ',\n';
                        }
                    }
                }
                
                lua += '        },\n';
            }
            
            lua += '    },\n';
        }
        lua += '}\n\n';
        
        lua += 'p.card = card\n';
        lua += 'p.cardOrder = cardOrder\n\n';
        lua += 'return p\n';
        
        return lua;
    },

    updateCode: function() {
        var code = this.generateLuaCode();
        $('#ce-code-display').val(code);
    },

    copyCode: function() {
        var codeDisplay = document.getElementById('ce-code-display');
        codeDisplay.select();
        document.execCommand('copy');
        alert('代码已复制到剪贴板!');
    },

    loadAllCards: function() {
        var self = this;
        
        // 搜索所有 模块:卡牌/+角色名 的页面
        this.api.get({
            action: 'query',
            list: 'allpages',
            apprefix: '卡牌/',
            apnamespace: 828, // Module namespace
            aplimit: 'max'
        }).done(function(data) {
            if (data.query && data.query.allpages) {
                var pages = data.query.allpages;
                var loadPromises = [];
                
                pages.forEach(function(page) {
                    loadPromises.push(self.loadCardModule(page.title));
                });
                
                $.when.apply($, loadPromises).done(function() {
                    self.updateCardList();
                    self.updateCode();
                    alert('成功加载 ' + self.cards.length + ' 张卡牌!');
                });
            }
        });
    },

    loadCardModule: function(pageName) {
        var self = this;
        var deferred = $.Deferred();
        
        this.api.get({
            action: 'query',
            prop: 'revisions',
            titles: pageName,
            rvprop: 'content',
            rvslots: 'main'
        }).done(function(data) {
            var pages = data.query.pages;
            for (var pageId in pages) {
                var page = pages[pageId];
                if (page.revisions && page.revisions[0]) {
                    var content = page.revisions[0].slots.main['*'];
                    var cards = self.parseLuaModule(content);
                    self.cards = self.cards.concat(cards);
                }
            }
            deferred.resolve();
        }).fail(function() {
            deferred.resolve();
        });
        
        return deferred.promise();
    },

    parseLuaModule: function(content) {
        var cards = [];
        
        try {
            // 提取卡牌数据
            var cardMatch = content.match(/local\s+card\s*=\s*\{([\s\S]*?)\}/);
            if (!cardMatch) return cards;
            
            var cardContent = cardMatch[1];
            
            // 简化的解析逻辑 - 提取卡牌名称
            var nameMatches = cardContent.match(/\["([^"]+)"\]\s*=\s*\{/g);
            if (nameMatches) {
                nameMatches.forEach(function(match) {
                    var name = match.match(/\["([^"]+)"\]/)[1];
                    cards.push({
                        name: name,
                        variants: [{}] // 简化处理
                    });
                });
            }
        } catch (e) {
            console.error('解析错误:', e);
        }
        
        return cards;
    },

    saveToWiki: function() {
        if (this.cards.length === 0) {
            alert('没有数据可保存!');
            return;
        }
        
        var self = this;
        var characterName = prompt('请输入角色名称(将保存为"模块:卡牌/角色名"):');
        
        if (!characterName) return;
        
        var pageName = '模块:卡牌/' + characterName;
        var content = this.generateLuaCode();
        
        this.api.postWithToken('csrf', {
            action: 'edit',
            title: pageName,
            text: content,
            summary: '通过卡牌编辑器更新'
        }).done(function() {
            alert('成功保存到 ' + pageName + '!');
        }).fail(function(error) {
            alert('保存失败:' + error);
        });
    }
};