MediaWiki

Card.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
window.CardEditor = {
(function() {
    cards: [],
    // 确保jQuery和MediaWiki API已加载
    currentCard: null,
    mw.loader.using(['mediawiki.api', 'mediawiki.util', 'jquery.ui'], function() {
    currentVariantIndex: null,
        $(document).ready(function() {
    api: new mw.Api(),
            // 卡牌编辑器对象
            var CardEditor = {
                cards: [],
                currentCard: null,
                currentVariantIndex: null,
                api: new mw.Api(),


    init: function() {
                init: function() {
        this.createUI();
                    // 清空占位符
        this.bindEvents();
                    $('#mw-content-text').empty();
        this.loadAllCards();
                    this.createUI();
    },
                    this.bindEvents();
                    this.loadAllCards();
                },


    createUI: function() {
                createUI: function() {
        var html =  
                    var html = [
        '<div id="card-editor">' +
                        '<div id="card-editor">',
            '<div class="ce-container">' +
                            '<div class="ce-container">',
                // 左侧输入区
                                // 左侧输入区
                '<div class="ce-left">' +
                                '<div class="ce-left">',
                    '<div class="ce-group">' +
                                    '<div class="ce-group">',
                        '<div class="ce-group-title">卡牌数据</div>' +
                                        '<div class="ce-group-title">卡牌数据</div>',
                        '<div class="ce-form">' +
                                        '<div class="ce-form">',
                            // 名称
                                            // 名称
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">卡牌名称:</div>' +
                                                '<div class="ce-label">卡牌名称:</div>',
                                '<input type="text" id="ce-name" class="ce-input" placeholder="请输入卡牌名称...">' +
                                                '<input type="text" id="ce-name" class="ce-input" placeholder="请输入卡牌名称...">',
                            '</div>' +
                                            '</div>',
                            // 卡组
                                            // 卡组
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">卡组类型:</div>' +
                                                '<div class="ce-label">卡组类型:</div>',
                                '<div class="ce-select-wrapper">' +
                                                '<div class="ce-select-wrapper">',
                                    '<input type="text" id="ce-deck" class="ce-select-input" placeholder="点击选择或输入..." readonly>' +
                                                    '<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-dropdown" id="ce-deck-dropdown" style="display:none;">',
                                        '<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 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>',
                            '</div>' +
                                            '</div>',
                            // 图片
                                            // 图片
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">图片文件:</div>' +
                                                '<div class="ce-label">图片文件:</div>',
                                '<input type="text" id="ce-art" class="ce-input" placeholder="输入图片文件名...">' +
                                                '<input type="text" id="ce-art" class="ce-input" placeholder="输入图片文件名...">',
                            '</div>' +
                                            '</div>',
                            // 属性
                                            // 属性
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">属性:</div>' +
                                                '<div class="ce-label">属性:</div>',
                                '<div class="ce-select-wrapper">' +
                                                '<div class="ce-select-wrapper">',
                                    '<input type="text" id="ce-attr" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                                    '<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-dropdown" id="ce-attr-dropdown" style="display:none;">',
                                        '<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 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>',
                            '</div>' +
                                            '</div>',
                            // 稀有度
                                            // 稀有度
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">稀有度:</div>' +
                                                '<div class="ce-label">稀有度:</div>',
                                '<div class="ce-select-wrapper">' +
                                                '<div class="ce-select-wrapper">',
                                    '<input type="text" id="ce-rarity" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                                    '<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-dropdown" id="ce-rarity-dropdown" style="display:none;">',
                                        '<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 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>',
                            '</div>' +
                                            '</div>',
                            // AP
                                            // AP
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">AP (行动点):</div>' +
                                                '<div class="ce-label">AP (行动点):</div>',
                                '<input type="text" id="ce-ap" class="ce-input" placeholder="输入AP数值...">' +
                                                '<input type="text" id="ce-ap" class="ce-input" placeholder="输入AP数值...">',
                            '</div>' +
                                            '</div>',
                            // 类型
                                            // 类型
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">卡牌类型:</div>' +
                                                '<div class="ce-label">卡牌类型:</div>',
                                '<div class="ce-select-wrapper">' +
                                                '<div class="ce-select-wrapper">',
                                    '<input type="text" id="ce-type" class="ce-select-input" placeholder="点击选择..." readonly>' +
                                                    '<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-dropdown" id="ce-type-dropdown" style="display:none;">',
                                        '<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 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>',
                            '</div>' +
                                            '</div>',
                            // 机制
                                            // 机制
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">卡牌机制:</div>' +
                                                '<div class="ce-label">卡牌机制:</div>',
                                '<input type="text" id="ce-mechanism" class="ce-input" placeholder="请输入卡牌机制...">' +
                                                '<input type="text" id="ce-mechanism" class="ce-input" placeholder="请输入卡牌机制...">',
                            '</div>' +
                                            '</div>',
                            // 描述
                                            // 描述
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">卡牌描述:</div>' +
                                                '<div class="ce-label">卡牌描述:</div>',
                                '<div class="ce-desc-wrapper">' +
                                                '<div class="ce-desc-wrapper">',
                                    '<div class="ce-format-buttons">' +
                                                    '<div class="ce-format-buttons">',
                                        '<div class="ce-btn ce-btn-small ce-btn-blue" id="ce-blue-text">蓝色文本</div>' +
                                                        '<span class="ce-btn ce-btn-small ce-btn-blue" id="ce-blue-text">蓝色文本</span>',
                                        '<div class="ce-btn ce-btn-small ce-btn-green" id="ce-green-text">绿色文本</div>' +
                                                        '<span class="ce-btn ce-btn-small ce-btn-green" id="ce-green-text">绿色文本</span>',
                                        '<div class="ce-btn ce-btn-small ce-btn-lime" id="ce-green-stroke">绿色描边</div>' +
                                                        '<span class="ce-btn ce-btn-small ce-btn-lime" id="ce-green-stroke">绿色描边</span>',
                                        '<div class="ce-btn ce-btn-small ce-btn-orange" id="ce-insert-br">插入换行</div>' +
                                                        '<span class="ce-btn ce-btn-small ce-btn-orange" id="ce-insert-br">插入换行</span>',
                                    '</div>' +
                                                    '</div>',
                                    '<textarea id="ce-desc" class="ce-textarea" placeholder="请输入卡牌描述..."></textarea>' +
                                                    '<textarea id="ce-desc" class="ce-textarea" placeholder="请输入卡牌描述..."></textarea>',
                                '</div>' +
                                                '</div>',
                            '</div>' +
                                            '</div>',
                            // 衍生卡牌
                                            // 衍生卡牌
                            '<div class="ce-row">' +
                                            '<div class="ce-row">',
                                '<div class="ce-label">衍生卡牌:</div>' +
                                                '<div class="ce-label">衍生卡牌:</div>',
                                '<input type="text" id="ce-derived" class="ce-input" placeholder="请输入衍生卡牌...">' +
                                                '<input type="text" id="ce-derived" class="ce-input" placeholder="请输入衍生卡牌...">',
                            '</div>' +
                                            '</div>',
                        '</div>' +
                                        '</div>',
                    '</div>' +
                                    '</div>',
                    // 按钮区
                                    // 按钮区
                    '<div class="ce-buttons">' +
                                    '<div class="ce-buttons">',
                        '<div class="ce-btn ce-btn-primary" id="ce-add-card">添加卡牌</div>' +
                                        '<span class="ce-btn ce-btn-primary" id="ce-add-card">添加卡牌</span>',
                        '<div class="ce-btn ce-btn-primary" id="ce-add-variant">添加变体</div>' +
                                        '<span class="ce-btn ce-btn-primary" id="ce-add-variant">添加变体</span>',
                        '<div class="ce-btn" id="ce-save-data">保存数据</div>' +
                                        '<span class="ce-btn" id="ce-save-data">保存数据</span>',
                        '<div class="ce-btn" id="ce-clear-form">清空表单</div>' +
                                        '<span class="ce-btn" id="ce-clear-form">清空表单</span>',
                    '</div>' +
                                    '</div>',
                '</div>' +
                                '</div>',
                // 中间列表区
                                // 中间列表区
                '<div class="ce-middle">' +
                                '<div class="ce-middle">',
                    '<div class="ce-group">' +
                                    '<div class="ce-group">',
                        '<div class="ce-group-title">卡牌列表</div>' +
                                        '<div class="ce-group-title">卡牌列表</div>',
                        '<div class="ce-list-container">' +
                                        '<div class="ce-list-container">',
                            '<div id="ce-card-list" class="ce-list"></div>' +
                                            '<div id="ce-card-list" class="ce-list"></div>',
                        '</div>' +
                                        '</div>',
                    '</div>' +
                                    '</div>',
                    '<div class="ce-group">' +
                                    '<div class="ce-group">',
                        '<div class="ce-group-title">变体列表</div>' +
                                        '<div class="ce-group-title">变体列表</div>',
                        '<div class="ce-list-container">' +
                                        '<div class="ce-list-container">',
                            '<div id="ce-variant-list" class="ce-list"></div>' +
                                            '<div id="ce-variant-list" class="ce-list"></div>',
                        '</div>' +
                                        '</div>',
                    '</div>' +
                                    '</div>',
                    '<div class="ce-buttons">' +
                                    '<div class="ce-buttons">',
                        '<div class="ce-btn ce-btn-danger" id="ce-delete-card">删除卡牌</div>' +
                                        '<span class="ce-btn ce-btn-danger" id="ce-delete-card">删除卡牌</span>',
                        '<div class="ce-btn ce-btn-danger" id="ce-delete-variant">删除变体</div>' +
                                        '<span class="ce-btn ce-btn-danger" id="ce-delete-variant">删除变体</span>',
                    '</div>' +
                                    '</div>',
                '</div>' +
                                '</div>',
                // 右侧代码区
                                // 右侧代码区
                '<div class="ce-right">' +
                                '<div class="ce-right">',
                    '<div class="ce-group">' +
                                    '<div class="ce-group">',
                        '<div class="ce-group-title">Lua代码预览</div>' +
                                        '<div class="ce-group-title">Lua代码预览</div>',
                        '<textarea id="ce-code-display" class="ce-code" readonly></textarea>' +
                                        '<textarea id="ce-code-display" class="ce-code" readonly></textarea>',
                    '</div>' +
                                    '</div>',
                    '<div class="ce-buttons">' +
                                    '<div class="ce-buttons">',
                        '<div class="ce-btn" id="ce-load-cards">加载卡牌数据</div>' +
                                        '<span class="ce-btn" id="ce-load-cards">加载卡牌数据</span>',
                        '<div class="ce-btn" id="ce-save-to-wiki">保存到Wiki</div>' +
                                        '<span class="ce-btn" id="ce-save-to-wiki">保存到Wiki</span>',
                        '<div class="ce-btn" id="ce-copy-code">复制代码</div>' +
                                        '<span class="ce-btn" id="ce-copy-code">复制代码</span>',
                    '</div>' +
                                    '</div>',
                '</div>' +
                                '</div>',
            '</div>' +
                            '</div>',
        '</div>';
                        '</div>'
                    ].join('');


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


    bindEvents: function() {
                bindEvents: function() {
        var self = this;
                    var self = this;


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


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


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


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


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


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


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


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


        return {
                setCardData: function(card, variantIndex) {
            name: $('#ce-name').val().trim(),
                    $('#ce-name').val(card.name || '');
            variants: [variant]
                   
        };
                    if (card.variants && card.variants[variantIndex]) {
    },
                        var variant = card.variants[variantIndex];
                        var isVariant = variant['卡组'] === '灵光一闪' && variantIndex > 0;
                       
                        // 设置字段是否可编辑
                        $('#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['衍生卡牌'] || '');
                    }
                },


    setCardData: function(card, variantIndex) {
                clearForm: function() {
        variantIndex = variantIndex || 0;
                    $('#ce-name').val('').prop('disabled', false);
       
                    $('#ce-art').val('').prop('disabled', false);
        $('#ce-name').val(card.name);
                    $('#ce-deck').val('');
       
                    $('#ce-attr').val('').prop('disabled', false);
        if (variantIndex < card.variants.length) {
                    $('#ce-rarity').val('').prop('disabled', false);
            var variant = card.variants[variantIndex];
                    $('#ce-ap').val('');
            var isVariant = variant['卡组'] === '灵光一闪';
                    $('#ce-mechanism').val('');
           
                    $('#ce-type').val('');
            // 设置字段是否可编辑
                    $('#ce-desc').val('');
            $('#ce-name').prop('disabled', isVariant);
                    $('#ce-derived').val('').prop('disabled', false);
            $('#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() {
                addCard: function() {
        $('#ce-name').val('').prop('disabled', false);
                    var cardData = this.getCardData();
        $('#ce-art').val('').prop('disabled', false);
                    if (!cardData.name) {
        $('#ce-deck').val('');
                        alert('卡牌名称不能为空!');
        $('#ce-attr').val('').prop('disabled', false);
                        return;
        $('#ce-rarity').val('').prop('disabled', false);
                    }
        $('#ce-ap').val('');
                   
        $('#ce-mechanism').val('');
                    this.cards.push(cardData);
        $('#ce-type').val('');
                    this.currentCard = cardData;
        $('#ce-desc').val('');
                    this.currentVariantIndex = 0;
        $('#ce-derived').val('').prop('disabled', false);
                    this.updateCardList();
    },
                    this.updateVariantList();
                    this.updateCode();
                    this.clearForm();
                    alert('卡牌 "' + cardData.name + '" 添加成功!');
                },


    addCard: function() {
                addVariant: function() {
        var cardData = this.getCardData();
                    if (!this.currentCard) {
        if (!cardData.name) {
                        alert('请先选择一个卡牌!');
            alert('卡牌名称不能为空!');
                        return;
            return;
                    }
        }
                   
       
                    var variantData = this.getCardData();
        this.cards.push(cardData);
                    var variant = variantData.variants[0];
        this.currentCard = cardData;
                    variant['卡组'] = '灵光一闪';
        this.currentVariantIndex = 0;
                   
        this.updateCardList();
                    // 复制主卡牌的某些属性
        this.updateVariantList();
                    var mainVariant = this.currentCard.variants[0];
        this.updateCode();
                    if (!variant.art && mainVariant.art) variant.art = mainVariant.art;
        this.clearForm();
                    if (!variant['属性'] && mainVariant['属性']) variant['属性'] = mainVariant['属性'];
        alert('卡牌 "' + cardData.name + '" 添加成功!');
                    if (!variant['稀有度'] && mainVariant['稀有度']) variant['稀有度'] = mainVariant['稀有度'];
    },
                    if (!variant['衍生卡牌'] && mainVariant['衍生卡牌']) variant['衍生卡牌'] = mainVariant['衍生卡牌'];
                   
                    this.currentCard.variants.push(variant);
                    this.currentVariantIndex = this.currentCard.variants.length - 1;
                    this.updateVariantList();
                    this.updateCode();
                    alert('"' + this.currentCard.name + '" 添加变体成功!');
                },


    addVariant: function() {
                saveData: function() {
        if (!this.currentCard) {
                    if (!this.currentCard || this.currentVariantIndex === null) {
            alert('请先选择一个卡牌!');
                        alert('请先选择要保存的卡牌或变体!');
            return;
                        return;
        }
                    }
       
                   
        var variantData = this.getCardData();
                    var cardData = this.getCardData();
        var variant = variantData.variants[0];
                    var isVariant = this.currentVariantIndex > 0;
        variant['卡组'] = '灵光一闪';
                   
       
                    if (isVariant) {
        this.currentCard.variants.push(variant);
                        var variant = cardData.variants[0];
        this.currentVariantIndex = this.currentCard.variants.length - 1;
                        variant['卡组'] = '灵光一闪';
        this.updateVariantList();
                       
        this.updateCode();
                        // 保留主卡牌的某些属性
        alert('为 "' + this.currentCard.name + '" 添加变体成功!');
                        var mainVariant = this.currentCard.variants[0];
    },
                        if (!variant.art) variant.art = mainVariant.art;
                        if (!variant['属性']) variant['属性'] = mainVariant['属性'];
                        if (!variant['稀有度']) variant['稀有度'] = mainVariant['稀有度'];
                        if (!variant['衍生卡牌']) variant['衍生卡牌'] = mainVariant['衍生卡牌'];
                       
                        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('数据保存成功!');
                },


    saveData: function() {
                deleteCard: function() {
        if (!this.currentCard || this.currentVariantIndex === null) {
                    if (!this.currentCard) {
            alert('请先选择要保存的卡牌或变体!');
                        alert('请先选择要删除的卡牌!');
            return;
                        return;
        }
                    }
       
                   
        var cardData = this.getCardData();
                    if (confirm('确定要删除卡牌 "' + this.currentCard.name + '" 吗?')) {
        var isVariant = this.currentVariantIndex > 0;
                        var index = this.cards.indexOf(this.currentCard);
       
                        this.cards.splice(index, 1);
        if (isVariant) {
                        this.currentCard = null;
            var variant = cardData.variants[0];
                        this.currentVariantIndex = null;
            variant['卡组'] = '灵光一闪';
                        this.updateCardList();
            this.currentCard.variants[this.currentVariantIndex] = variant;
                        this.updateVariantList();
        } else {
                        this.updateCode();
            this.currentCard.name = cardData.name;
                        this.clearForm();
            this.currentCard.variants[0] = cardData.variants[0];
                        alert('卡牌删除成功!');
        }
                    }
       
                },
        this.updateCardList();
        this.updateVariantList();
        this.updateCode();
        alert('数据保存成功!');
    },


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


    deleteVariant: function() {
                onCardSelected: function(index) {
        if (!this.currentCard || this.currentVariantIndex === null) {
                    this.currentCard = this.cards[index];
            alert('请先选择要删除的变体!');
                    this.currentVariantIndex = 0;
            return;
                    this.updateVariantList();
        }
                    this.setCardData(this.currentCard, 0);
       
                },
        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) {
                onVariantSelected: function(index) {
        this.currentCard = this.cards[index];
                    if (!this.currentCard) return;
        this.currentVariantIndex = 0;
                    this.currentVariantIndex = index;
        this.updateVariantList();
                    this.setCardData(this.currentCard, index);
        this.setCardData(this.currentCard, 0);
                },
    },


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


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


    updateVariantList: function() {
                insertTextFormat: function(color) {
        var html = '';
                    var textarea = document.getElementById('ce-desc');
        if (this.currentCard) {
                    var start = textarea.selectionStart;
            for (var i = 0; i < this.currentCard.variants.length; i++) {
                    var end = textarea.selectionEnd;
                var variant = this.currentCard.variants[i];
                    var text = textarea.value;
                var deck = variant['卡组'] || '未知';
                    var selectedText = text.substring(start, end);
                var name = i === 0 ? '主卡牌 (' + deck + ')' : '变体 ' + i + ' (灵光一闪)';
                   
                html += '<div class="ce-list-item" data-index="' + i + '">' + name + '</div>';
                    var newText = '{{文本|' + color + '|' + selectedText + '}}';
            }
                    textarea.value = text.substring(0, start) + newText + text.substring(end);
        }
                   
        $('#ce-variant-list').html(html);
                    // 设置光标位置
    },
                    var cursorPos = start + newText.length;
                    textarea.setSelectionRange(cursorPos, cursorPos);
                    textarea.focus();
                },


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


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


    insertBr: function() {
                escapeLuaString: function(s) {
        var textarea = document.getElementById('ce-desc');
                    if (typeof s !== 'string') return s;
        var start = textarea.selectionStart;
                    return s.replace(/\\/g, '\\\\')
        var text = textarea.value;
                          .replace(/"/g, '\\"')
       
                          .replace(/\n/g, '\\n');
        textarea.value = text.substring(0, start) + '<br>' + text.substring(start);
                },
       
        var cursorPos = start + 4;
        textarea.setSelectionRange(cursorPos, cursorPos);
        textarea.focus();
    },


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


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


    copyCode: function() {
                loadAllCards: function() {
        var codeDisplay = document.getElementById('ce-code-display');
                    var self = this;
        codeDisplay.select();
                    $('#ce-card-list').html('<div class="ce-loading">正在加载卡牌数据...</div>');
        document.execCommand('copy');
                   
        alert('代码已复制到剪贴板!');
                    // 搜索所有 模块:卡牌/+角色名 的页面
    },
                    this.api.get({
                        action: 'query',
                        list: 'allpages',
                        apprefix: '卡牌/',
                        apnamespace: 828, // Module namespace
                        aplimit: 'max'
                    }).then(function(data) {
                        if (data.query && data.query.allpages) {
                            var pages = data.query.allpages;
                            if (pages.length > 0) {
                                return self.loadCardsFromPages(pages);
                            }
                        }
                        $('#ce-card-list').html('<div class="ce-loading">暂无卡牌数据</div>');
                    }).fail(function() {
                        $('#ce-card-list').html('<div class="ce-error">加载失败,请稍后重试</div>');
                    });
                },


    loadAllCards: function() {
                loadCardsFromPages: function(pages) {
        var self = this;
                    var self = this;
       
                    var promises = [];
        // 搜索所有 模块:卡牌/+角色名 的页面
                   
        this.api.get({
                    for (var i = 0; i < pages.length; i++) {
            action: 'query',
                        promises.push(this.api.get({
            list: 'allpages',
                            action: 'query',
            apprefix: '卡牌/',
                            prop: 'revisions',
            apnamespace: 828, // Module namespace
                            titles: pages[i].title,
            aplimit: 'max'
                            rvprop: 'content',
        }).done(function(data) {
                            rvlimit: 1
            if (data.query && data.query.allpages) {
                        }));
                var pages = data.query.allpages;
                    }
                var loadPromises = [];
                   
               
                    return $.when.apply($, promises).then(function() {
                pages.forEach(function(page) {
                        self.cards = [];
                    loadPromises.push(self.loadCardModule(page.title));
                        var results = arguments;
                });
                       
               
                        for (var i = 0; i < results.length; i++) {
                $.when.apply($, loadPromises).done(function() {
                            var data = results[i][0];
                    self.updateCardList();
                            if (data.query && data.query.pages) {
                    self.updateCode();
                                for (var pageId in data.query.pages) {
                    alert('成功加载 ' + self.cards.length + ' 张卡牌!');
                                    var page = data.query.pages[pageId];
                });
                                    if (page.revisions && page.revisions[0]) {
            }
                                        var content = page.revisions[0]['*'];
        });
                                        self.parseCardData(content);
    },
                                    }
                                }
                            }
                        }
                       
                        self.updateCardList();
                        self.updateVariantList();
                        self.updateCode();
                    });
                },


    loadCardModule: function(pageName) {
                parseCardData: function(luaContent) {
        var self = this;
                    try {
        var deferred = $.Deferred();
                        // 提取 card 表
       
                        var cardMatch = luaContent.match(/local\s+card\s*=\s*\{([\s\S]*?)\n\}/);
        this.api.get({
                        if (!cardMatch) return;
            action: 'query',
                       
            prop: 'revisions',
                        var cardData = cardMatch[1];
            titles: pageName,
                       
            rvprop: 'content',
                        // 提取每个卡牌
            rvslots: 'main'
                        var cardRegex = /\["(.+?)"\]\s*=\s*\{([\s\S]*?)\n    \},/g;
        }).done(function(data) {
                        var match;
            var pages = data.query.pages;
                       
            for (var pageId in pages) {
                        while ((match = cardRegex.exec(cardData)) !== null) {
                var page = pages[pageId];
                            var cardName = match[1].replace(/\\"/g, '"').replace(/\\\\/g, '\\');
                if (page.revisions && page.revisions[0]) {
                            var variantsData = match[2];
                    var content = page.revisions[0].slots.main['*'];
                           
                    var cards = self.parseLuaModule(content);
                            var card = {
                    self.cards = self.cards.concat(cards);
                                name: cardName,
                }
                                variants: []
            }
                            };
            deferred.resolve();
                           
        }).fail(function() {
                            // 提取变体
            deferred.resolve();
                            var variantRegex = /\{([\s\S]*?)\},/g;
        });
                            var variantMatch;
       
                           
        return deferred.promise();
                            while ((variantMatch = variantRegex.exec(variantsData)) !== null) {
    },
                                var variant = {};
                                var fields = variantMatch[1];
                               
                                // 提取字段
                                var fieldRegex = /\["(.+?)"\]\s*=\s*(.+?),/g;
                                var fieldMatch;
                               
                                while ((fieldMatch = fieldRegex.exec(fields)) !== null) {
                                    var key = fieldMatch[1];
                                    var value = fieldMatch[2].trim();
                                   
                                    // 处理字符串值
                                    if (value.startsWith('"') && value.endsWith('"')) {
                                        value = value.slice(1, -1)
                                                  .replace(/\\"/g, '"')
                                                  .replace(/\\\\/g, '\\')
                                                  .replace(/\\n/g, '\n');
                                    } else if (!isNaN(value)) {
                                        value = parseInt(value, 10);
                                    }
                                   
                                    variant[key] = value;
                                }
                               
                                card.variants.push(variant);
                            }
                           
                            if (card.variants.length > 0) {
                                this.cards.push(card);
                            }
                        }
                    } catch (e) {
                        console.error('解析卡牌数据失败:', e);
                    }
                },


    parseLuaModule: function(content) {
                saveToWiki: function() {
        var cards = [];
                    var self = this;
       
                   
        try {
                    // 检查数据
            // 提取卡牌数据
                    if (this.cards.length === 0) {
            var cardMatch = content.match(/local\s+card\s*=\s*\{([\s\S]*?)\}/);
                        alert('没有数据可供保存!');
            if (!cardMatch) return cards;
                        return;
           
                    }
            var cardContent = cardMatch[1];
                   
           
                    // 按角色分组卡牌
            // 简化的解析逻辑 - 提取卡牌名称
                    var cardsByCharacter = {};
            var nameMatches = cardContent.match(/\["([^"]+)"\]\s*=\s*\{/g);
                    for (var i = 0; i < this.cards.length; i++) {
            if (nameMatches) {
                        var card = this.cards[i];
                nameMatches.forEach(function(match) {
                        var character = '未分类'; // 默认分类
                     var name = match.match(/\["([^"]+)"\]/)[1];
                       
                     cards.push({
                        // 这里可以根据卡牌名称推断角色
                         name: name,
                        // 例如:if (card.name.includes('角色名')) character = '角色名';
                         variants: [{}] // 简化处理
                       
                        if (!cardsByCharacter[character]) {
                            cardsByCharacter[character] = [];
                        }
                        cardsByCharacter[character].push(card);
                    }
                   
                    // 选择要保存的角色
                    var characters = Object.keys(cardsByCharacter);
                    if (characters.length === 0) {
                        alert('没有角色数据!');
                        return;
                    }
                   
                    var character = prompt('请输入要保存的角色名称(用于创建 模块:卡牌/角色名):', characters[0]);
                    if (!character) return;
                   
                    // 生成该角色的Lua代码
                    var oldCards = this.cards;
                    this.cards = cardsByCharacter[character] || this.cards;
                    var luaCode = this.generateLuaCode();
                    this.cards = oldCards;
                   
                    // 保存到Wiki
                     var pageName = '模块:卡牌/' + character;
                   
                    if (!confirm('确定要保存到 ' + pageName + ' 吗?\n这将覆盖现有内容!')) {
                        return;
                     }
                   
                    this.api.postWithToken('csrf', {
                         action: 'edit',
                        title: pageName,
                        text: luaCode,
                        summary: '通过卡牌编辑器更新卡牌数据',
                         recreate: true
                    }).done(function() {
                        alert('保存成功!\n页面:' + pageName);
                    }).fail(function(code, error) {
                        alert('保存失败:' + (error.error ? error.error.info : code));
                     });
                     });
                 });
                 }
            }
             };
        } catch (e) {
             console.error('解析错误:', e);
        }
       
        return cards;
    },


    saveToWiki: function() {
             // 初始化编辑器
        if (this.cards.length === 0) {
             CardEditor.init();
            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);
         });
         });
     }
     });
};
})();

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

(function() {
    // 确保jQuery和MediaWiki API已加载
    mw.loader.using(['mediawiki.api', 'mediawiki.util', 'jquery.ui'], function() {
        $(document).ready(function() {
            // 卡牌编辑器对象
            var CardEditor = {
                cards: [],
                currentCard: null,
                currentVariantIndex: null,
                api: new mw.Api(),

                init: function() {
                    // 清空占位符
                    $('#mw-content-text').empty();
                    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" style="display:none;">',
                                                        '<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" style="display:none;">',
                                                        '<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" style="display:none;">',
                                                        '<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" style="display:none;">',
                                                        '<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">',
                                                        '<span class="ce-btn ce-btn-small ce-btn-blue" id="ce-blue-text">蓝色文本</span>',
                                                        '<span class="ce-btn ce-btn-small ce-btn-green" id="ce-green-text">绿色文本</span>',
                                                        '<span class="ce-btn ce-btn-small ce-btn-lime" id="ce-green-stroke">绿色描边</span>',
                                                        '<span class="ce-btn ce-btn-small ce-btn-orange" id="ce-insert-br">插入换行</span>',
                                                    '</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">',
                                        '<span class="ce-btn ce-btn-primary" id="ce-add-card">添加卡牌</span>',
                                        '<span class="ce-btn ce-btn-primary" id="ce-add-variant">添加变体</span>',
                                        '<span class="ce-btn" id="ce-save-data">保存数据</span>',
                                        '<span class="ce-btn" id="ce-clear-form">清空表单</span>',
                                    '</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">',
                                        '<span class="ce-btn ce-btn-danger" id="ce-delete-card">删除卡牌</span>',
                                        '<span class="ce-btn ce-btn-danger" id="ce-delete-variant">删除变体</span>',
                                    '</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">',
                                        '<span class="ce-btn" id="ce-load-cards">加载卡牌数据</span>',
                                        '<span class="ce-btn" id="ce-save-to-wiki">保存到Wiki</span>',
                                        '<span class="ce-btn" id="ce-copy-code">复制代码</span>',
                                    '</div>',
                                '</div>',
                            '</div>',
                        '</div>'
                    ].join('');

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

                bindEvents: function() {
                    var self = this;

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

                    $(document).on('click', '.ce-select-option', 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, 10);
                        }
                    }
                    
                    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) {
                    $('#ce-name').val(card.name || '');
                    
                    if (card.variants && card.variants[variantIndex]) {
                        var variant = card.variants[variantIndex];
                        var isVariant = variant['卡组'] === '灵光一闪' && variantIndex > 0;
                        
                        // 设置字段是否可编辑
                        $('#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['卡组'] = '灵光一闪';
                    
                    // 复制主卡牌的某些属性
                    var mainVariant = this.currentCard.variants[0];
                    if (!variant.art && mainVariant.art) variant.art = mainVariant.art;
                    if (!variant['属性'] && mainVariant['属性']) variant['属性'] = mainVariant['属性'];
                    if (!variant['稀有度'] && mainVariant['稀有度']) variant['稀有度'] = mainVariant['稀有度'];
                    if (!variant['衍生卡牌'] && mainVariant['衍生卡牌']) variant['衍生卡牌'] = mainVariant['衍生卡牌'];
                    
                    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['卡组'] = '灵光一闪';
                        
                        // 保留主卡牌的某些属性
                        var mainVariant = this.currentCard.variants[0];
                        if (!variant.art) variant.art = mainVariant.art;
                        if (!variant['属性']) variant['属性'] = mainVariant['属性'];
                        if (!variant['稀有度']) variant['稀有度'] = mainVariant['稀有度'];
                        if (!variant['衍生卡牌']) variant['衍生卡牌'] = mainVariant['衍生卡牌'];
                        
                        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++) {
                        var card = this.cards[i];
                        var selected = (card === this.currentCard) ? ' selected' : '';
                        html += '<div class="ce-list-item' + selected + '" data-index="' + i + '">' + 
                                card.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 + ' (灵光一闪)';
                            var selected = (i === this.currentVariantIndex) ? ' selected' : '';
                            html += '<div class="ce-list-item' + selected + '" 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' || value === 'X') {
                                        if (value === 'X') {
                                            lua += '            ["' + field + '"] = "X",\n';
                                        } else {
                                            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;
                    $('#ce-card-list').html('<div class="ce-loading">正在加载卡牌数据...</div>');
                    
                    // 搜索所有 模块:卡牌/+角色名 的页面
                    this.api.get({
                        action: 'query',
                        list: 'allpages',
                        apprefix: '卡牌/',
                        apnamespace: 828, // Module namespace
                        aplimit: 'max'
                    }).then(function(data) {
                        if (data.query && data.query.allpages) {
                            var pages = data.query.allpages;
                            if (pages.length > 0) {
                                return self.loadCardsFromPages(pages);
                            }
                        }
                        $('#ce-card-list').html('<div class="ce-loading">暂无卡牌数据</div>');
                    }).fail(function() {
                        $('#ce-card-list').html('<div class="ce-error">加载失败,请稍后重试</div>');
                    });
                },

                loadCardsFromPages: function(pages) {
                    var self = this;
                    var promises = [];
                    
                    for (var i = 0; i < pages.length; i++) {
                        promises.push(this.api.get({
                            action: 'query',
                            prop: 'revisions',
                            titles: pages[i].title,
                            rvprop: 'content',
                            rvlimit: 1
                        }));
                    }
                    
                    return $.when.apply($, promises).then(function() {
                        self.cards = [];
                        var results = arguments;
                        
                        for (var i = 0; i < results.length; i++) {
                            var data = results[i][0];
                            if (data.query && data.query.pages) {
                                for (var pageId in data.query.pages) {
                                    var page = data.query.pages[pageId];
                                    if (page.revisions && page.revisions[0]) {
                                        var content = page.revisions[0]['*'];
                                        self.parseCardData(content);
                                    }
                                }
                            }
                        }
                        
                        self.updateCardList();
                        self.updateVariantList();
                        self.updateCode();
                    });
                },

                parseCardData: function(luaContent) {
                    try {
                        // 提取 card 表
                        var cardMatch = luaContent.match(/local\s+card\s*=\s*\{([\s\S]*?)\n\}/);
                        if (!cardMatch) return;
                        
                        var cardData = cardMatch[1];
                        
                        // 提取每个卡牌
                        var cardRegex = /\["(.+?)"\]\s*=\s*\{([\s\S]*?)\n    \},/g;
                        var match;
                        
                        while ((match = cardRegex.exec(cardData)) !== null) {
                            var cardName = match[1].replace(/\\"/g, '"').replace(/\\\\/g, '\\');
                            var variantsData = match[2];
                            
                            var card = {
                                name: cardName,
                                variants: []
                            };
                            
                            // 提取变体
                            var variantRegex = /\{([\s\S]*?)\},/g;
                            var variantMatch;
                            
                            while ((variantMatch = variantRegex.exec(variantsData)) !== null) {
                                var variant = {};
                                var fields = variantMatch[1];
                                
                                // 提取字段
                                var fieldRegex = /\["(.+?)"\]\s*=\s*(.+?),/g;
                                var fieldMatch;
                                
                                while ((fieldMatch = fieldRegex.exec(fields)) !== null) {
                                    var key = fieldMatch[1];
                                    var value = fieldMatch[2].trim();
                                    
                                    // 处理字符串值
                                    if (value.startsWith('"') && value.endsWith('"')) {
                                        value = value.slice(1, -1)
                                                   .replace(/\\"/g, '"')
                                                   .replace(/\\\\/g, '\\')
                                                   .replace(/\\n/g, '\n');
                                    } else if (!isNaN(value)) {
                                        value = parseInt(value, 10);
                                    }
                                    
                                    variant[key] = value;
                                }
                                
                                card.variants.push(variant);
                            }
                            
                            if (card.variants.length > 0) {
                                this.cards.push(card);
                            }
                        }
                    } catch (e) {
                        console.error('解析卡牌数据失败:', e);
                    }
                },

                saveToWiki: function() {
                    var self = this;
                    
                    // 检查数据
                    if (this.cards.length === 0) {
                        alert('没有数据可供保存!');
                        return;
                    }
                    
                    // 按角色分组卡牌
                    var cardsByCharacter = {};
                    for (var i = 0; i < this.cards.length; i++) {
                        var card = this.cards[i];
                        var character = '未分类'; // 默认分类
                        
                        // 这里可以根据卡牌名称推断角色
                        // 例如:if (card.name.includes('角色名')) character = '角色名';
                        
                        if (!cardsByCharacter[character]) {
                            cardsByCharacter[character] = [];
                        }
                        cardsByCharacter[character].push(card);
                    }
                    
                    // 选择要保存的角色
                    var characters = Object.keys(cardsByCharacter);
                    if (characters.length === 0) {
                        alert('没有角色数据!');
                        return;
                    }
                    
                    var character = prompt('请输入要保存的角色名称(用于创建 模块:卡牌/角色名):', characters[0]);
                    if (!character) return;
                    
                    // 生成该角色的Lua代码
                    var oldCards = this.cards;
                    this.cards = cardsByCharacter[character] || this.cards;
                    var luaCode = this.generateLuaCode();
                    this.cards = oldCards;
                    
                    // 保存到Wiki
                    var pageName = '模块:卡牌/' + character;
                    
                    if (!confirm('确定要保存到 ' + pageName + ' 吗?\n这将覆盖现有内容!')) {
                        return;
                    }
                    
                    this.api.postWithToken('csrf', {
                        action: 'edit',
                        title: pageName,
                        text: luaCode,
                        summary: '通过卡牌编辑器更新卡牌数据',
                        recreate: true
                    }).done(function() {
                        alert('保存成功!\n页面:' + pageName);
                    }).fail(function(code, error) {
                        alert('保存失败:' + (error.error ? error.error.info : code));
                    });
                }
            };

            // 初始化编辑器
            CardEditor.init();
        });
    });
})();