MediaWiki

Card.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
// MediaWiki:Card.js
(function() {
(function() {
    'use strict';
   
     // 加载CSS
     // 加载CSS
     mw.loader.load('/index.php?title=Template:Card/styles.css&action=raw&ctype=text/css', 'text/css');
     mw.loader.load('/index.php?title=Template:Card.css&action=raw&ctype=text/css', 'text/css');
     // 确保jQuery和MediaWiki API已加载
   
     mw.loader.using(['mediawiki.api', 'mediawiki.util', 'jquery.ui'], function() {
     // 主管理器对象
         $(document).ready(function() {
     const CardManager = {
             // 卡牌编辑器对象
        currentFighter: '',
             var CardEditor = {
        cardData: {},
                 characters: {}, // 存储所有角色的卡牌数据
        cardList: [],
                 currentCharacter: null, // 当前选中的角色
       
                 currentCard: null,
        init: function() {
                 currentVariantIndex: null,
            this.createInterface();
                 api: new mw.Api(),
            this.loadFighters();
 
            this.bindEvents();
                 init: function() {
        },
                     // 清空占位符
       
                     $('#mw-content-text').empty();
        createInterface: function() {
                    this.createUI();
            const container = $('<div>').attr('id', 'card-manager').addClass('card-manager-container');
                    this.bindEvents();
           
                     this.loadCharacterList();
            // 创建三列布局
            const leftPanel = this.createLeftPanel();
            const centerPanel = this.createCenterPanel();
            const rightPanel = this.createRightPanel();
           
            container.append(leftPanel, centerPanel, rightPanel);
            $('#mw-content-text').prepend(container);
        },
       
        createLeftPanel: function() {
            const panel = $('<div>').addClass('card-panel card-panel-left');
           
            // 战斗员选择
            const fighterSection = $('<div>').addClass('card-section');
            fighterSection.append(
                $('<div>').addClass('section-title').text('战斗员选择'),
                $('<div>').addClass('form-group').append(
                    $('<div>').addClass('form-label').text('当前战斗员:'),
                    $('<div>').attr('id', 'fighter-select').addClass('custom-select').append(
                        $('<div>').addClass('select-display').text('请选择战斗员'),
                        $('<div>').addClass('select-options').hide()
                    )
                )
            );
           
            // 默认信息区
            const defaultInfo = $('<div>').addClass('card-section');
            defaultInfo.append(
                $('<div>').addClass('section-title').text('默认信息'),
                this.createInput('card-order', '卡牌顺序', '灭,灭,救,虚无残影,消灭烙印,黑洞,虚妄的誓约,无忧的回声'),
                this.createInput('ego', '属性', '虚无')
            );
           
            // 卡牌数据输入区
            const cardDataSection = $('<div>').addClass('card-section');
            cardDataSection.append(
                $('<div>').addClass('section-title').text('卡牌数据'),
                this.createInput('card-name', '卡牌名称', '黑洞'),
                this.createInput('displayname', '显示名称', ''),
                this.createInput('art', '图片', 'unique_1064_02.png'),
                this.createDropdown('group', '卡组', ['自我意识技能', '起始卡牌', '独特卡牌', '灵光一闪', '神光一闪']),
                this.createDropdown('rarity', '稀有度', ['白', '蓝', '橙', '彩']),
                this.createDropdown('god', '神明', ['circen', 'diallos', 'nihilum', 'secred', 'vitor']),
                this.createInput('ap', 'AP', '2'),
                this.createDropdown('type', '卡牌类型', ['攻击', '技能', '强化']),
                this.createInput('dict', '机制', ''),
                this.createDescriptionInput(),
                this.createInput('sub', '衍生卡牌', ''),
                this.createCheckbox('isinspiration', '是否存在灵光一闪'),
                this.createCheckbox('god_inspiration', '是否存在神光一闪')
            );
           
            panel.append(fighterSection, defaultInfo, cardDataSection);
            return panel;
        },
       
        createCenterPanel: function() {
            const panel = $('<div>').addClass('card-panel card-panel-center');
           
            // 卡牌列表
            const cardListSection = $('<div>').addClass('card-section');
            cardListSection.append(
                $('<div>').addClass('section-title').text('卡牌列表'),
                $('<div>').attr('id', 'card-list').addClass('card-list')
            );
           
            // 灵光一闪列表
            const inspirationSection = $('<div>').addClass('card-section');
            inspirationSection.append(
                $('<div>').addClass('section-title').text('灵光一闪列表'),
                $('<div>').attr('id', 'inspiration-list').addClass('card-list')
            );
           
            // 神光一闪列表
            const godInspirationSection = $('<div>').addClass('card-section');
            godInspirationSection.append(
                $('<div>').addClass('section-title').text('神光一闪列表'),
                $('<div>').attr('id', 'god-inspiration-list').addClass('card-list')
            );
           
            // 操作按钮
            const buttonSection = $('<div>').addClass('card-section button-group');
            buttonSection.append(
                $('<div>').addClass('card-button button-add').text('添加卡牌'),
                $('<div>').addClass('card-button button-update').text('更新卡牌'),
                $('<div>').addClass('card-button button-delete').text('删除卡牌'),
                $('<div>').addClass('card-button button-save').text('保存到模块')
            );
           
            panel.append(cardListSection, inspirationSection, godInspirationSection, buttonSection);
            return panel;
        },
       
        createRightPanel: function() {
            const panel = $('<div>').addClass('card-panel card-panel-right');
           
            const previewSection = $('<div>').addClass('card-section');
            previewSection.append(
                $('<div>').addClass('section-title').text('Lua代码预览'),
                $('<div>').addClass('code-preview-wrapper').append(
                    $('<pre>').attr('id', 'lua-preview').addClass('lua-preview')
                )
            );
           
            panel.append(previewSection);
            return panel;
         },
       
        createInput: function(id, label, placeholder) {
            return $('<div>').addClass('form-group').append(
                $('<div>').addClass('form-label').text(label + ':'),
                $('<div>').attr('id', id).addClass('custom-input').attr('contenteditable', 'true')
                    .attr('data-placeholder', placeholder || '')
            );
        },
       
        createDropdown: function(id, label, options) {
             const dropdown = $('<div>').addClass('form-group').append(
                $('<div>').addClass('form-label').text(label + ':'),
                $('<div>').attr('id', id).addClass('custom-select').append(
                    $('<div>').addClass('select-display').text(options[0]),
                    $('<div>').addClass('select-options').hide()
                )
            );
           
            const optionsContainer = dropdown.find('.select-options');
             options.forEach(opt => {
                 optionsContainer.append(
                    $('<div>').addClass('select-option').text(opt)
                );
            });
           
            return dropdown;
        },
       
        createCheckbox: function(id, label) {
            return $('<div>').addClass('form-group').append(
                $('<div>').addClass('form-label').text(label + ':'),
                $('<div>').attr('id', id).addClass('custom-checkbox').append(
                    $('<div>').addClass('checkbox-box'),
                    $('<div>').addClass('checkbox-label').text('否')
                ).data('checked', false)
            );
        },
       
        createDescriptionInput: function() {
            const descGroup = $('<div>').addClass('form-group');
           
            // 工具栏
            const toolbar = $('<div>').addClass('desc-toolbar').append(
                $('<div>').addClass('toolbar-btn').text('蓝色文本').data('format', 'blue'),
                $('<div>').addClass('toolbar-btn').text('绿色文本').data('format', 'green'),
                $('<div>').addClass('toolbar-btn').text('绿色描边').data('format', 'outline'),
                $('<div>').addClass('toolbar-btn').text('词典').data('format', 'dict'),
                $('<div>').addClass('toolbar-btn').text('换行').data('format', 'br')
            );
           
            descGroup.append(
                 $('<div>').addClass('form-label').text('描述:'),
                toolbar,
                $('<div>').attr('id', 'desc_global').addClass('custom-textarea')
                    .attr('contenteditable', 'true')
                    .html('伤害{{文本|蓝|240}}%<br>按照消灭卡牌的数量,伤害量+{{文本|蓝|40}}%<br>(最多{{文本|蓝|10}}次)')
            );
           
            return descGroup;
        },
       
        loadFighters: function() {
            // 通过API加载战斗员分类的页面
            new mw.Api().get({
                action: 'query',
                list: 'categorymembers',
                 cmtitle: 'Category:战斗员',
                 cmlimit: 500,
                 format: 'json'
            }).done(function(data) {
                const fighterSelect = $('#fighter-select .select-options');
                fighterSelect.empty();
               
                data.query.categorymembers.forEach(function(member) {
                    fighterSelect.append(
                        $('<div>').addClass('select-option').text(member.title).data('fighter', member.title)
                    );
                 });
            });
        },
       
        bindEvents: function() {
            const self = this;
           
            // 下拉框事件
            $(document).on('click', '.custom-select', function(e) {
                e.stopPropagation();
                const options = $(this).find('.select-options');
                $('.select-options').not(options).hide();
                options.toggle();
            });
           
            $(document).on('click', '.select-option', function(e) {
                e.stopPropagation();
                const select = $(this).closest('.custom-select');
                const display = select.find('.select-display');
                display.text($(this).text());
                $(this).parent().hide();
               
                if (select.attr('id') === 'fighter-select') {
                     self.currentFighter = $(this).data('fighter');
                    self.loadFighterCards();
                }
            });
           
            // 复选框事件
            $(document).on('click', '.custom-checkbox', function() {
                const isChecked = !$(this).data('checked');
                $(this).data('checked', isChecked);
                $(this).find('.checkbox-box').toggleClass('checked');
                $(this).find('.checkbox-label').text(isChecked ? '是' : '否');
            });
           
            // 描述工具栏事件
            $(document).on('click', '.toolbar-btn', function() {
                const format = $(this).data('format');
                const textarea = $('#desc_global')[0];
                const selection = window.getSelection();
                const selectedText = selection.toString();
               
                let insertText = '';
                switch(format) {
                     case 'blue':
                        insertText = selectedText ? `{{文本|蓝|${selectedText}}}` : '{{文本|蓝|}}';
                        break;
                    case 'green':
                        insertText = selectedText ? `{{文本|绿|${selectedText}}}` : '{{文本|绿|}}';
                        break;
                    case 'outline':
                        insertText = selectedText ? `{{描边|绿|${selectedText}}}` : '{{描边|绿|}}';
                        break;
                    case 'dict':
                        insertText = selectedText ? `{{词典|${selectedText}}}` : '{{词典|}}';
                        break;
                    case 'br':
                        insertText = '<br>';
                        break;
                }
               
                document.execCommand('insertHTML', false, insertText);
            });
           
            // 按钮事件
            $('.button-add').on('click', function() {
                self.addCard();
            });
           
            $('.button-update').on('click', function() {
                self.updateCard();
            });
           
            $('.button-delete').on('click', function() {
                self.deleteCard();
            });
           
            $('.button-save').on('click', function() {
                self.saveToModule();
            });
           
            // 输入变化时更新预览
            $(document).on('input', '.custom-input, .custom-textarea', function() {
                self.updatePreview();
            });
           
            // 点击其他地方关闭下拉框
            $(document).on('click', function() {
                $('.select-options').hide();
            });
        },
       
        addCard: function() {
            const cardName = $('#card-name').text();
            if (!cardName) {
                mw.notify('请输入卡牌名称', {type: 'error'});
                return;
            }
           
            const cardData = this.getFormData();
            this.cardData[cardName] = cardData;
            this.updateCardList();
            this.updatePreview();
            mw.notify('卡牌添加成功', {type: 'success'});
        },
       
        updateCard: function() {
            const cardName = $('#card-name').text();
            if (!cardName || !this.cardData[cardName]) {
                mw.notify('请选择要更新的卡牌', {type: 'error'});
                return;
            }
           
            const cardData = this.getFormData();
            this.cardData[cardName] = cardData;
            this.updateCardList();
            this.updatePreview();
            mw.notify('卡牌更新成功', {type: 'success'});
        },
       
        deleteCard: function() {
            const cardName = $('#card-name').text();
            if (!cardName || !this.cardData[cardName]) {
                mw.notify('请选择要删除的卡牌', {type: 'error'});
                return;
            }
           
            delete this.cardData[cardName];
            this.updateCardList();
            this.updatePreview();
            this.clearForm();
            mw.notify('卡牌删除成功', {type: 'success'});
        },
       
        getFormData: function() {
            const data = {
                base: {
                    displayname: $('#displayname').text(),
                     art: $('#art').text(),
                    group: $('#group .select-display').text(),
                    rarity: $('#rarity .select-display').text(),
                    ap: $('#ap').text(),
                    type: $('#type .select-display').text(),
                    dict: $('#dict').text(),
                    desc_global: $('#desc_global').html(),
                    sub: $('#sub').text(),
                    isinspiration: $('#isinspiration').data('checked') ? 1 : 0,
                    god_inspiration: $('#god_inspiration').data('checked') ? 1 : 0
                 },
                 },
 
                 var: {}
                 createUI: function() {
            };
                    var html = [
           
                        '<div id="card-editor">',
            // 如果有灵光一闪,添加默认数据
                            '<div class="ce-container">',
            if (data.base.isinspiration) {
                                // 左侧输入区
                data.var.inspiration = [
                                '<div class="ce-left">',
                    { ap: 1 },
                                    // 角色选择区
                    { desc_global: data.base.desc_global },
                                    '<div class="ce-group">',
                    { desc_global: data.base.desc_global },
                                        '<div class="ce-group-title">战斗员选择</div>',
                    { ap: 3, desc_global: data.base.desc_global },
                                        '<div class="ce-row">',
                    { ap: 1, type: '强化', desc_global: data.base.desc_global }
                                            '<div class="ce-label">当前战斗员:</div>',
                ];
                                            '<div class="ce-select-wrapper">',
            }
                                                '<input type="text" id="ce-character-select" class="ce-select-input" placeholder="选择或输入新战斗员..." readonly>',
           
                                                '<div class="ce-select-dropdown" id="ce-character-dropdown" style="display:none;"></div>',
            // 如果有神光一闪,添加默认数据
                                            '</div>',
            if (data.base.god_inspiration) {
                                            '<span class="ce-btn ce-btn-small ce-btn-primary" id="ce-new-character" style="margin-left: 10px;">新建</span>',
                data.var.god_inspiration = {
                                        '</div>',
                    circen: [{ ap: 1 }],
                                    '</div>',
                    diallos: [{ ap: 1 }],
                                    '<div class="ce-group">',
                    nihilum: [{ ap: 1 }],
                                        '<div class="ce-group-title">卡牌数据</div>',
                    secred: [{ ap: 1 }],
                                        '<div class="ce-form">',
                    vitor: [{ ap: 1 }]
                                            // 名称
                };
                                            '<div class="ce-row">',
            }
                                                '<div class="ce-label">卡牌名称:</div>',
           
                                                '<input type="text" id="ce-name" class="ce-input" placeholder="请输入卡牌名称...">',
            return data;
                                            '</div>',
        },
                                            // 显示名称 - 新增字段
       
                                            '<div class="ce-row">',
        updateCardList: function() {
                                                '<div class="ce-label">显示名称:</div>',
            const cardList = $('#card-list');
                                                '<input type="text" id="ce-display-name" class="ce-input" placeholder="请输入显示名称(可选)...">',
            cardList.empty();
                                            '</div>',
           
                                            // 图片
            Object.keys(this.cardData).forEach(cardName => {
                                            '<div class="ce-row">',
                const card = this.cardData[cardName];
                                                '<div class="ce-label">图片文件:</div>',
                const cardItem = $('<div>').addClass('card-item').text(cardName);
                                                '<input type="text" id="ce-art" class="ce-input" placeholder="输入图片文件名...">',
                cardItem.on('click', () => this.loadCard(cardName));
                                            '</div>',
                cardList.append(cardItem);
                                            // 卡组
               
                                            '<div class="ce-row">',
                // 更新灵光一闪列表
                                                '<div class="ce-label">卡组类型:</div>',
                if (card.base.isinspiration) {
                                                '<div class="ce-select-wrapper">',
                    const inspirationItem = $('<div>').addClass('card-item inspiration-item')
                                                    '<input type="text" id="ce-deck" class="ce-select-input" placeholder="点击选择或输入..." readonly>',
                        .text(cardName + ' - 灵光一闪');
                                                    '<div class="ce-select-dropdown" id="ce-deck-dropdown" style="display:none;">',
                    $('#inspiration-list').append(inspirationItem);
                                                        '<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>',
                if (card.base.god_inspiration) {
                                                        '<div class="ce-select-option" data-value="衍生卡牌">衍生卡牌</div>',
                    const godItem = $('<div>').addClass('card-item god-item')
                                                        '<div class="ce-select-option" data-value="自我意识技能">自我意识技能</div>',
                        .text(cardName + ' - 神光一闪');
                                                    '</div>',
                    $('#god-inspiration-list').append(godItem);
                                                '</div>',
                }
                                            '</div>',
            });
                                            // 属性
        },
                                            '<div class="ce-row">',
       
                                                '<div class="ce-label">属性:</div>',
        loadCard: function(cardName) {
                                                '<div class="ce-select-wrapper">',
            const card = this.cardData[cardName];
                                                    '<input type="text" id="ce-attr" class="ce-select-input" placeholder="点击选择..." readonly>',
            if (!card) return;
                                                    '<div class="ce-select-dropdown" id="ce-attr-dropdown" style="display:none;">',
           
                                                        '<div class="ce-select-option" data-value="">请选择</div>',
            $('#card-name').text(cardName);
                                                        '<div class="ce-select-option" data-value="热情">热情</div>',
            $('#displayname').text(card.base.displayname || '');
                                                        '<div class="ce-select-option" data-value="秩序">秩序</div>',
            $('#art').text(card.base.art || '');
                                                        '<div class="ce-select-option" data-value="正义">正义</div>',
            $('#group .select-display').text(card.base.group || '');
                                                        '<div class="ce-select-option" data-value="本能">本能</div>',
            $('#rarity .select-display').text(card.base.rarity || '');
                                                        '<div class="ce-select-option" data-value="虚无">虚无</div>',
            $('#ap').text(card.base.ap || '');
                                                    '</div>',
            $('#type .select-display').text(card.base.type || '');
                                                '</div>',
            $('#dict').text(card.base.dict || '');
                                            '</div>',
            $('#desc_global').html(card.base.desc_global || '');
                                            // 稀有度
            $('#sub').text(card.base.sub || '');
                                            '<div class="ce-row">',
           
                                                '<div class="ce-label">稀有度:</div>',
            const inspirationChecked = card.base.isinspiration === 1;
                                                '<div class="ce-select-wrapper">',
            $('#isinspiration').data('checked', inspirationChecked);
                                                    '<input type="text" id="ce-rarity" class="ce-select-input" placeholder="点击选择..." readonly>',
            $('#isinspiration .checkbox-box').toggleClass('checked', inspirationChecked);
                                                    '<div class="ce-select-dropdown" id="ce-rarity-dropdown" style="display:none;">',
            $('#isinspiration .checkbox-label').text(inspirationChecked ? '' : '');
                                                        '<div class="ce-select-option" data-value="">请选择</div>',
           
                                                        '<div class="ce-select-option" data-value="白">白</div>',
            const godChecked = card.base.god_inspiration === 1;
                                                        '<div class="ce-select-option" data-value="蓝">蓝</div>',
            $('#god_inspiration').data('checked', godChecked);
                                                        '<div class="ce-select-option" data-value="橙">橙</div>',
            $('#god_inspiration .checkbox-box').toggleClass('checked', godChecked);
                                                        '<div class="ce-select-option" data-value="彩">彩</div>',
            $('#god_inspiration .checkbox-label').text(godChecked ? '是' : '否');
                                                    '</div>',
        },
                                                '</div>',
       
                                            '</div>',
        clearForm: function() {
                                            // AP
            $('.custom-input').text('');
                                            '<div class="ce-row">',
            $('.custom-textarea').html('');
                                                '<div class="ce-label">AP (行动点):</div>',
            $('.custom-checkbox').data('checked', false);
                                                '<input type="text" id="ce-ap" class="ce-input" placeholder="输入AP数值...">',
            $('.checkbox-box').removeClass('checked');
                                            '</div>',
            $('.checkbox-label').text('否');
                                            // 类型
        },
                                            '<div class="ce-row">',
       
                                                '<div class="ce-label">卡牌类型:</div>',
        updatePreview: function() {
                                                '<div class="ce-select-wrapper">',
            const cardOrder = $('#card-order').text();
                                                    '<input type="text" id="ce-type" class="ce-select-input" placeholder="点击选择..." readonly>',
            const ego = $('#ego').text();
                                                    '<div class="ce-select-dropdown" id="ce-type-dropdown" style="display:none;">',
           
                                                        '<div class="ce-select-option" data-value="">请选择</div>',
            let luaCode = 'local card = {}\n\n';
                                                        '<div class="ce-select-option" data-value="攻击">攻击</div>',
            luaCode += `card.order = { "${cardOrder}" }\n\n`;
                                                        '<div class="ce-select-option" data-value="技能">技能</div>',
            luaCode += 'card.info = {\n';
                                                        '<div class="ce-select-option" data-value="强化">强化</div>',
            luaCode += `    ego = "${ego}",\n`;
                                                        '<div class="ce-select-option" data-value="状态异常">状态异常</div>',
            luaCode += '}\n\n';
                                                    '</div>',
           
                                                '</div>',
            Object.keys(this.cardData).forEach(cardName => {
                                            '</div>',
                const card = this.cardData[cardName];
                                            // 机制
                luaCode += `card["${cardName}"] = {\n`;
                                            '<div class="ce-row">',
                luaCode += '   base = {\n';
                                                '<div class="ce-label">卡牌机制:</div>',
               
                                                '<input type="text" id="ce-mechanism" class="ce-input" placeholder="请输入卡牌机制...">',
                Object.keys(card.base).forEach(key => {
                                            '</div>',
                    const value = card.base[key];
                                            // 描述
                    if (value !== '' && value !== 0) {
                                            '<div class="ce-row">',
                        if (typeof value === 'number') {
                                                '<div class="ce-label">卡牌描述:</div>',
                            luaCode += `        ${key} = ${value},\n`;
                                                '<div class="ce-desc-wrapper">',
                                                    '<div class="ce-format-buttons">',
                                                        '<div class="ce-button-row">',
                                                            '<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-purple" id="ce-dictionary">词典</span>',
                                                        '</div>',
                                                        '<div class="ce-button-row">',
                                                            '<span class="ce-btn ce-btn-small ce-btn-blue-underline" id="ce-blue-underline">蓝色下划线</span>',
                                                            '<span class="ce-btn ce-btn-small ce-btn-green-underline" id="ce-green-underline">绿色下划线</span>',
                                                            '<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>',
                                                '</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">卡牌列表 <span class="ce-hint">(拖动调整顺序)</span></div>',
                                        '<div class="ce-list-container">',
                                            '<div id="ce-card-list" class="ce-list ce-sortable"></div>',
                                        '</div>',
                                    '</div>',
                                    '<div class="ce-group">',
                                        '<div class="ce-group-title">变体列表 <span class="ce-hint">(拖动调整顺序)</span></div>',
                                        '<div class="ce-list-container">',
                                            '<div id="ce-variant-list" class="ce-list ce-sortable"></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代码预览 - <span id="ce-code-character">未选择战斗员</span></div>',
                                        '<textarea id="ce-code-display" class="ce-code" readonly></textarea>',
                                    '</div>',
                                    '<div class="ce-buttons">',
                                        '<span class="ce-btn" id="ce-reload-character">重新加载</span>',
                                        '<span class="ce-btn ce-btn-primary" id="ce-save-to-wiki">保存到Wiki</span>',
                                        '<span class="ce-btn" id="ce-copy-code">复制代码</span>',
                                        '<span class="ce-btn ce-btn-danger" id="ce-delete-character">删除战斗员</span>',
                                    '</div>',
                                '</div>',
                            '</div>',
                        '</div>',
                        '<style>',
                            '.ce-hint { font-size: 12px; color: #666; font-weight: normal; }',
                            '.ce-list-item { position: relative; cursor: move; }',
                            '.ce-list-item.ui-sortable-helper { background: #e3f2fd; border: 2px solid #2196F3; }',
                            '.ce-list-item.ui-sortable-placeholder { background: #f5f5f5; border: 2px dashed #ccc; visibility: visible !important; }',
                            '.ce-list-item.selected { background: #e3f2fd; }',
                            '.ce-btn-purple { background-color: #9c27b0; color: white; }',
                            '.ce-btn-purple:hover { background-color: #7b1fa2; }',
                            '.ce-btn-blue-underline { background-color: #1976d2; color: white; }',
                            '.ce-btn-blue-underline:hover { background-color: #1565c0; }',
                            '.ce-btn-green-underline { background-color: #388e3c; color: white; }',
                            '.ce-btn-green-underline:hover { background-color: #2e7d32; }',
                        '</style>'
                    ].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', '#ce-character-dropdown .ce-select-option', function() {
                        var character = $(this).data('value');
                        self.selectCharacter(character);
                    });
 
                    // 点击其他地方关闭下拉框
                    $(document).on('click', function(e) {
                        if (!$(e.target).closest('.ce-select-wrapper').length) {
                            $('.ce-select-dropdown').hide();
                        }
                    });
 
                    // 按钮事件
                    $('#ce-new-character').on('click', function() { self.createNewCharacter(); });
                    $('#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-reload-character').on('click', function() { self.reloadCurrentCharacter(); });
                    $('#ce-save-to-wiki').on('click', function() { self.saveToWiki(); });
                    $('#ce-copy-code').on('click', function() { self.copyCode(); });
                    $('#ce-delete-character').on('click', function() { self.deleteCharacter(); });
 
                    // 文本格式化按钮
                    $('#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-dictionary').on('click', function() { self.insertDictionary(); });
                    $('#ce-blue-underline').on('click', function() { self.insertTextUnderline('蓝'); });
                    $('#ce-green-underline').on('click', function() { self.insertTextUnderline('绿'); });
                    $('#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);
                        }
                    });
 
                    // 初始化拖拽排序
                    this.initSortable();
                },
 
                initSortable: function() {
                    var self = this;
 
                    // 卡牌列表排序
                    $('#ce-card-list').sortable({
                        items: '.ce-list-item',
                        placeholder: 'ce-list-item ui-sortable-placeholder',
                        update: function(event, ui) {
                            self.onCardListReorder();
                        }
                    });
 
                    // 变体列表排序
                    $('#ce-variant-list').sortable({
                        items: '.ce-list-item:not(.ce-no-sort)',
                        placeholder: 'ce-list-item ui-sortable-placeholder',
                        update: function(event, ui) {
                            self.onVariantListReorder();
                        }
                    });
                },
 
                onCardListReorder: function() {
                    if (!this.currentCharacter) return;
 
                    var newOrder = [];
                    $('#ce-card-list .ce-list-item').each(function() {
                        var index = $(this).data('index');
                        newOrder.push(index);
                    });
 
                    // 重新排序卡牌数组
                    var cards = this.characters[this.currentCharacter];
                    var reorderedCards = [];
                    for (var i = 0; i < newOrder.length; i++) {
                        reorderedCards.push(cards[newOrder[i]]);
                    }
                    this.characters[this.currentCharacter] = reorderedCards;
 
                    // 更新当前选中的卡牌引用
                    if (this.currentCard) {
                        var currentCardIndex = reorderedCards.indexOf(this.currentCard);
                        if (currentCardIndex === -1) {
                            this.currentCard = null;
                            this.currentVariantIndex = null;
                        }
                    }
 
                    this.updateCardList();
                    this.updateCode();
                },
 
                onVariantListReorder: function() {
                    if (!this.currentCard) return;
 
                    var newOrder = [];
                    $('#ce-variant-list .ce-list-item').each(function() {
                        var index = $(this).data('index');
                        newOrder.push(index);
                    });
 
                    // 重新排序变体数组
                    var variants = this.currentCard.variants;
                    var reorderedVariants = [];
                    for (var i = 0; i < newOrder.length; i++) {
                        reorderedVariants.push(variants[newOrder[i]]);
                    }
                    this.currentCard.variants = reorderedVariants;
 
                    // 更新当前选中的变体索引
                    if (this.currentVariantIndex !== null) {
                        var oldVariant = variants[this.currentVariantIndex];
                        this.currentVariantIndex = reorderedVariants.indexOf(oldVariant);
                    }
 
                    this.updateVariantList();
                    this.updateCode();
                },
 
                selectCharacter: function(character) {
                    this.currentCharacter = character;
                    $('#ce-character-select').val(character);
                    $('#ce-code-character').text(character);
                   
                    // 清空当前数据
                    this.currentCard = null;
                    this.currentVariantIndex = null;
                    this.clearForm();
                   
                    // 更新显示
                    this.updateCardList();
                    this.updateVariantList();
                    this.updateCode();
                },
 
                createNewCharacter: function() {
                    var character = prompt('请输入新战斗员的名称:');
                    if (!character || character.trim() === '') return;
                   
                    character = character.trim();
                   
                    // 检查是否已存在
                    if (this.characters[character]) {
                        alert('战斗员 "' + character + '" 已存在!');
                        return;
                    }
                   
                    // 创建新战斗员
                    this.characters[character] = [];
                    this.updateCharacterDropdown();
                    this.selectCharacter(character);
                    alert('新战斗员 "' + character + '" 创建成功!');
                },
 
                deleteCharacter: function() {
                    if (!this.currentCharacter) {
                        alert('请先选择一个战斗员!');
                        return;
                    }
                   
                    if (!confirm('确定要删除战斗员 "' + this.currentCharacter + '" 及其所有卡牌吗?\n此操作不可恢复!')) {
                        return;
                    }
                   
                    delete this.characters[this.currentCharacter];
                    this.currentCharacter = null;
                    this.currentCard = null;
                    this.currentVariantIndex = null;
                   
                    $('#ce-character-select').val('');
                    $('#ce-code-character').text('未选择战斗员');
                   
                    this.updateCharacterDropdown();
                    this.clearForm();
                    this.updateCardList();
                    this.updateVariantList();
                    this.updateCode();
                   
                    alert('战斗员删除成功!');
                },
 
                loadCharacterList: function() {
                    var self = this;
                    $('#ce-character-dropdown').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;
                            var characterPromises = [];
                           
                            // 初始化空字典
                            self.characters = {};
                           
                            for (var i = 0; i < pages.length; i++) {
                                var title = pages[i].title;
                                var character = title.replace('模块:卡牌/', '');
                                self.characters[character] = [];
                               
                                // 加载每个角色的数据
                                characterPromises.push(self.loadCharacterData(character));
                            }
                           
                            // 等待所有角色数据加载完成
                            $.when.apply($, characterPromises).then(function() {
                                self.updateCharacterDropdown();
                            });
                         } else {
                         } else {
                             self.updateCharacterDropdown();
                             luaCode += `        ${key} = "${value}",\n`;
                         }
                         }
                    }).fail(function() {
                        $('#ce-character-dropdown').html('<div class="ce-error">加载失败,请稍后重试</div>');
                    });
                },
                loadCharacterData: function(character) {
                    var self = this;
                    var pageName = '模块:卡牌/' + character;
                   
                    return this.api.get({
                        action: 'query',
                        prop: 'revisions',
                        titles: pageName,
                        rvprop: 'content',
                        rvlimit: 1
                    }).then(function(data) {
                        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.characters[character] = self.parseCardData(content);
                                }
                            }
                        }
                    });
                },
                reloadCurrentCharacter: function() {
                    if (!this.currentCharacter) {
                        alert('请先选择一个战斗员!');
                        return;
                    }
                   
                    var self = this;
                    this.loadCharacterData(this.currentCharacter).then(function() {
                        self.updateCardList();
                        self.updateVariantList();
                        self.updateCode();
                        alert('战斗员 "' + self.currentCharacter + '" 的数据已重新加载!');
                    });
                },
                updateCharacterDropdown: function() {
                    var html = '<div class="ce-select-option" data-value="">请选择战斗员</div>';
                    var characters = Object.keys(this.characters).sort();
                   
                    for (var i = 0; i < characters.length; i++) {
                        var character = characters[i];
                        var cardCount = this.characters[character].length;
                        html += '<div class="ce-select-option" data-value="' + character + '">' +
                                character + ' (' + cardCount + ' 张卡牌)</div>';
                    }
                   
                    $('#ce-character-dropdown').html(html);
                },
                getCardData: function() {
                    var variant = {};
                   
                    // 显示名称 - 新增
                    var displayName = $('#ce-display-name').val().trim();
                    if (displayName) variant['显示名称'] = displayName;
                   
                    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-display-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-display-name').val(variant['显示名称'] || '');
                        $('#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-display-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() {
                    if (!this.currentCharacter) {
                        alert('请先选择或创建一个战斗员!');
                        return;
                    }
                   
                    var cardData = this.getCardData();
                    if (!cardData.name) {
                        alert('卡牌名称不能为空!');
                        return;
                    }
                   
                    this.characters[this.currentCharacter].push(cardData);
                    this.currentCard = cardData;
                    this.currentVariantIndex = 0;
                    this.updateCardList();
                    this.updateVariantList();
                    this.updateCode();
                    this.clearForm();
                    alert('卡牌 "' + cardData.name + '" 添加成功!');
                },
                addVariant: function() {
                    if (!this.currentCard) {
                        alert('请先选择一个卡牌!');
                        return;
                    }
                   
                    var variantData = this.getCardData();
                    var variant = variantData.variants[0];
                    variant['卡组'] = '灵光一闪';
                   
                    this.currentCard.variants.push(variant);
                    this.currentVariantIndex = this.currentCard.variants.length - 1;
                    this.updateVariantList();
                    this.updateCode();
                    alert('为 "' + this.currentCard.name + '" 添加变体成功!');
                },
                saveData: function() {
                    if (!this.currentCard || this.currentVariantIndex === null) {
                        alert('请先选择要保存的卡牌或变体!');
                        return;
                     }
                     }
                });
               
                luaCode += '    },\n';
               
                if (card.var && Object.keys(card.var).length > 0) {
                    luaCode += '    var = {\n';
                      
                      
                     var cardData = this.getCardData();
                     if (card.var.inspiration) {
                    var isVariant = this.currentVariantIndex > 0;
                         luaCode += '       inspiration = {\n';
                   
                         card.var.inspiration.forEach(insp => {
                    if (isVariant) {
                             luaCode += '           {\n';
                        var variant = cardData.variants[0];
                            Object.keys(insp).forEach(key => {
                        variant['卡组'] = '灵光一闪';
                                if (typeof insp[key] === 'number') {
                       
                                     luaCode += `                ${key} = ${insp[key]},\n`;
                        // 不再自动保留主卡牌的属性
                                } else {
                       
                                    luaCode += `                ${key} = "${insp[key]}",\n`;
                        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 || !this.currentCharacter) {
                         alert('请先选择要删除的卡牌!');
                        return;
                    }
                   
                    if (confirm('确定要删除卡牌 "' + this.currentCard.name + '" 吗?')) {
                        var cards = this.characters[this.currentCharacter];
                        var index = cards.indexOf(this.currentCard);
                        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) {
                    if (!this.currentCharacter) return;
                   
                    // 由于重排序后,index对应的是DOM中的位置,需要找到对应的实际卡牌
                    var $item = $('#ce-card-list .ce-list-item').eq(index);
                    var actualIndex = $item.data('original-index');
                   
                    this.currentCard = this.characters[this.currentCharacter][actualIndex];
                    this.currentVariantIndex = 0;
                    this.updateVariantList();
                    this.setCardData(this.currentCard, 0);
                },
 
                onVariantSelected: function(index) {
                    if (!this.currentCard) return;
                   
                    // 由于重排序后,index对应的是DOM中的位置,需要找到对应的实际变体
                    var $item = $('#ce-variant-list .ce-list-item').eq(index);
                    var actualIndex = $item.data('original-index');
                   
                    this.currentVariantIndex = actualIndex;
                    this.setCardData(this.currentCard, actualIndex);
                },
 
                updateCardList: function() {
                    var html = '';
                    if (this.currentCharacter && this.characters[this.currentCharacter]) {
                        var cards = this.characters[this.currentCharacter];
                        for (var i = 0; i < cards.length; i++) {
                             var card = cards[i];
                            var selected = (card === this.currentCard) ? ' selected' : '';
                            html += '<div class="ce-list-item' + selected + '" data-index="' + i +
                                    '" data-original-index="' + i + '">' +
                                    '<span class="ce-drag-handle">≡ </span>' +
                                    card.name + '</div>';
                        }
                    }
                   
                    if (html === '') {
                        html = '<div class="ce-loading">暂无卡牌数据</div>';
                    }
                   
                    $('#ce-card-list').html(html);
                   
                    // 重新初始化排序
                    $('#ce-card-list').sortable('refresh');
                },
 
                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' : '';
                            var noSort = i === 0 ? ' ce-no-sort' : ''; // 主卡牌不可排序
                            html += '<div class="ce-list-item' + selected + noSort +
                                     '" data-index="' + i +  
                                    '" data-original-index="' + i + '">' +
                                    (i > 0 ? '<span class="ce-drag-handle">≡ </span>' : '') +
                                    name + '</div>';
                        }
                    }
                    $('#ce-variant-list').html(html);
                   
                    // 重新初始化排序
                    $('#ce-variant-list').sortable('refresh');
                },
 
                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();
                },
 
                insertDictionary: 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();
                },
 
                insertTextUnderline: 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();
                },
 
                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.currentCharacter || !this.characters[this.currentCharacter]) {
                        return '-- 请先选择一个战斗员';
                    }
                   
                    var cards = this.characters[this.currentCharacter];
                    if (cards.length === 0) {
                        return '-- ' + this.currentCharacter + ' 暂无卡牌数据';
                    }
                   
                    var lua = 'local p = {}\n\n';
                   
                    // 生成 cardOrder
 
                    lua += 'local cardOrder = {\n';
                    for (var i = 0; i < cards.length; i++) {
                        var card = cards[i];
                        var deck = card.variants.length > 0 ? card.variants[0]['卡组'] : '';
                        // 排除衍生卡牌和自我意识技能
                        if (deck && deck !== '衍生卡牌' && deck !== '自我意识技能') {
                            lua += '    "' + this.escapeLuaString(card.name) + '",\n';
                        }
                    }
                    lua += '}\n\n';
 
                    // 生成 card 数据
                    lua += 'local card = {\n';
                    for (var i = 0; i < cards.length; i++) {
                        var card = 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', '机制', '类型', '描述', '衍生卡牌'];
                           
                            // 如果是变体卡牌(非第一个且卡组为灵光一闪),只输出有差异的字段
                            if (j > 0 && variant['卡组'] === '灵光一闪') {
                                var mainVariant = card.variants[0];
                               
                                for (var k = 0; k < fieldOrder.length; k++) {
                                    var field = fieldOrder[k];
                                   
                                    // 卡组字段必须输出
                                    if (field === '卡组') {
                                        lua += '            ["' + field + '"] = "灵光一闪",\n';
                                        continue;
                                    }
                                   
                                    // 只输出与主卡牌不同的字段
                                    if (variant[field] !== undefined && variant[field] !== null &&
                                        variant[field] !== mainVariant[field]) {
                                        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';
                                            }
                                        }
                                    }
                                 }
                                 }
                             } else {
                             });
                                // 主卡牌或非灵光一闪卡牌,输出所有非空字段
                            luaCode += '            },\n';
                                for (var k = 0; k < fieldOrder.length; k++) {
                        });
                                    var field = fieldOrder[k];
                        luaCode += '        },\n';
                                    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('代码已复制到剪贴板!');
                },
                parseCardData: function(luaContent) {
                    var cards = [];
                    var cardMap = {};
                      
                      
                     try {
                     if (card.var.god_inspiration) {
                        // 移除注释
                         luaCode += '        god_inspiration = {\n';
                        luaContent = luaContent.replace(/--[^\n]*/g, '');
                         Object.keys(card.var.god_inspiration).forEach(god => {
                       
                             luaCode += `            ${god} = {\n`;
                        // 提取 card
                             card.var.god_inspiration[god].forEach(godInsp => {
                        var cardMatch = luaContent.match(/local\s+card\s*=\s*\{([\s\S]*?)\n\}/);
                                 luaCode += '                {\n';
                         if (!cardMatch) return cards;
                                 Object.keys(godInsp).forEach(key => {
                       
                                     if (typeof godInsp[key] === 'number') {
                        var cardData = cardMatch[1];
                                         luaCode += `                    ${key} = ${godInsp[key]},\n`;
                       
                                     } else {
                        // 提取每个卡牌,使用改进的正则表达式来处理最后一个卡牌
                                         luaCode += `                    ${key} = "${godInsp[key]}",\n`;
                        var cardRegex = /\["([^"]+)"\]\s*=\s*\{([\s\S]*?)\n   \}(?:,|\s*$)/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]*?)\s*\}(?:,|\s*$)/g;
                             var variantMatch;
                           
                            while ((variantMatch = variantRegex.exec(variantsData)) !== null) {
                                var variant = {};
                                 var fields = variantMatch[1];
                               
                                // 提取字段,处理最后一个字段可能没有逗号的情况
                                var fieldRegex = /\["([^"]+)"\]\s*=\s*([^,\n]+)(?:,|(?=\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');
                                     }  
                                    // 处理 "X" 特殊情况
                                    else if (value === '"X"') {
                                         value = 'X';
                                    }
                                    // 处理数字
                                    else if (!isNaN(value)) {
                                        value = parseInt(value, 10);
                                     }
                                     }
                                   
                                 });
                                    variant[key] = value;
                                 luaCode += '                },\n';
                                 }
                               
                                if (Object.keys(variant).length > 0) {
                                    card.variants.push(variant);
                                 }
                            }
                           
                            if (card.variants.length > 0) {
                                cardMap[cardName] = card;
                            }
                        }
                       
                        // 提取 cardOrder 并按顺序排列
                        var orderMatch = luaContent.match(/local\s+cardOrder\s*=\s*\{([^}]+)\}/);
                        if (orderMatch) {
                            var orderData = orderMatch[1];
                            var order = [];
                           
                            var orderRegex = /"([^"]+)"/g;
                            var orderMatch2;
                            while ((orderMatch2 = orderRegex.exec(orderData)) !== null) {
                                order.push(orderMatch2[1]);
                            }
                           
                            // 按照 cardOrder 排序
                            order.forEach(function(cardName) {
                                if (cardMap[cardName]) {
                                    cards.push(cardMap[cardName]);
                                    delete cardMap[cardName];
                                }
                            });
                           
                            // 添加不在 cardOrder 中的卡牌(衍生卡牌等)
                            Object.keys(cardMap).forEach(function(cardName) {
                                cards.push(cardMap[cardName]);
                             });
                             });
                        } else {
                             luaCode += '           },\n';
                            // 如果没有 cardOrder,使用原始顺序
                         });
                            Object.keys(cardMap).forEach(function(cardName) {
                         luaCode += '       },\n';
                                cards.push(cardMap[cardName]);
                             });
                        }
                       
                        console.log('成功解析 ' + cards.length + ' 张卡牌');
                          
                    } catch (e) {
                         console.error('解析卡牌数据失败:', e);
                     }
                     }
                      
                      
                     return cards;
                     luaCode += '    },\n';
                 },
                 }
 
               
                 saveToWiki: function() {
                 luaCode += '}\n\n';
                    if (!this.currentCharacter) {
            });
                        alert('请先选择一个战斗员!');
           
                        return;
            luaCode += 'return card';
                    }
           
                   
            $('#lua-preview').text(luaCode);
                    var cards = this.characters[this.currentCharacter];
        },
                    if (cards.length === 0) {
       
                        alert('当前战斗员没有卡牌数据!');
        loadFighterCards: function() {
                        return;
            if (!this.currentFighter) return;
                    }
           
                   
            const moduleName = `模块:卡牌/${this.currentFighter}`;
                    var pageName = '模块:卡牌/' + this.currentCharacter;
           
                    var luaCode = this.generateLuaCode();
            new mw.Api().get({
                   
                action: 'query',
                    if (!confirm('确定要保存到 ' + pageName + ' 吗?\n这将覆盖现有内容!')) {
                prop: 'revisions',
                        return;
                titles: moduleName,
                    }
                rvprop: 'content',
                   
                format: 'json'
                    var self = this;
            }).done((data) => {
                    this.api.postWithToken('csrf', {
                const pages = data.query.pages;
                        action: 'edit',
                const pageId = Object.keys(pages)[0];
                        title: pageName,
               
                        text: luaCode,
                if (pageId !== '-1') {
                        summary: '通过卡牌编辑器更新 ' + this.currentCharacter + ' 的卡牌数据',
                    const content = pages[pageId].revisions[0]['*'];
                        recreate: true
                    // 这里需要解析Lua内容并加载到界面
                    }).done(function() {
                    this.parseLuaContent(content);
                        alert('保存成功!\n页面:' + pageName);
                }
                        // 更新下拉列表中的卡牌数量
            });
                        self.updateCharacterDropdown();
        },
                    }).fail(function(code, error) {
       
                        alert('保存失败:' + (error.error ? error.error.info : code));
        parseLuaContent: function(content) {
                    });
            // 简化的Lua解析,实际使用可能需要更复杂的解析器
            try {
                // 提取卡牌数据
                const cardMatches = content.matchAll(/card\["([^"]+)"\]\s*=\s*{([^}]+})}/gs);
               
                this.cardData = {};
                for (const match of cardMatches) {
                    const cardName = match[1];
                    // 这里需要更复杂的解析逻辑
                    // 暂时使用简化版本
                 }
                 }
             };
               
 
                this.updateCardList();
             // 初始化编辑器
                this.updatePreview();
             CardEditor.init();
            } catch (e) {
         });
                console.error('解析Lua内容失败:', e);
            }
        },
       
        saveToModule: function() {
             if (!this.currentFighter) {
                mw.notify('请先选择战斗员', {type: 'error'});
                return;
            }
           
             const moduleName = `模块:卡牌/${this.currentFighter}`;
            const luaContent = $('#lua-preview').text();
           
            new mw.Api().postWithToken('csrf', {
                action: 'edit',
                title: moduleName,
                text: luaContent,
                summary: '更新卡牌数据',
                format: 'json'
            }).done(function() {
                mw.notify('保存成功!', {type: 'success'});
            }).fail(function(error) {
                mw.notify('保存失败:' + error, {type: 'error'});
            });
        }
    };
   
    // 页面加载完成后初始化
    $(document).ready(function() {
        // 只在特定页面加载
        if (mw.config.get('wgPageName') === 'Special:CardManager' ||
             mw.config.get('wgPageName').indexOf('卡牌管理') !== -1) {
            CardManager.init();
         }
     });
     });
   
    // 添加到全局对象以便调试
    window.CardManager = CardManager;
})();
})();

2025年10月23日 (四) 15:58的版本

// MediaWiki:Card.js
(function() {
    'use strict';
    
    // 加载CSS
    mw.loader.load('/index.php?title=Template:Card.css&action=raw&ctype=text/css', 'text/css');
    
    // 主管理器对象
    const CardManager = {
        currentFighter: '',
        cardData: {},
        cardList: [],
        
        init: function() {
            this.createInterface();
            this.loadFighters();
            this.bindEvents();
        },
        
        createInterface: function() {
            const container = $('<div>').attr('id', 'card-manager').addClass('card-manager-container');
            
            // 创建三列布局
            const leftPanel = this.createLeftPanel();
            const centerPanel = this.createCenterPanel();
            const rightPanel = this.createRightPanel();
            
            container.append(leftPanel, centerPanel, rightPanel);
            $('#mw-content-text').prepend(container);
        },
        
        createLeftPanel: function() {
            const panel = $('<div>').addClass('card-panel card-panel-left');
            
            // 战斗员选择
            const fighterSection = $('<div>').addClass('card-section');
            fighterSection.append(
                $('<div>').addClass('section-title').text('战斗员选择'),
                $('<div>').addClass('form-group').append(
                    $('<div>').addClass('form-label').text('当前战斗员:'),
                    $('<div>').attr('id', 'fighter-select').addClass('custom-select').append(
                        $('<div>').addClass('select-display').text('请选择战斗员'),
                        $('<div>').addClass('select-options').hide()
                    )
                )
            );
            
            // 默认信息区
            const defaultInfo = $('<div>').addClass('card-section');
            defaultInfo.append(
                $('<div>').addClass('section-title').text('默认信息'),
                this.createInput('card-order', '卡牌顺序', '灭,灭,救,虚无残影,消灭烙印,黑洞,虚妄的誓约,无忧的回声'),
                this.createInput('ego', '属性', '虚无')
            );
            
            // 卡牌数据输入区
            const cardDataSection = $('<div>').addClass('card-section');
            cardDataSection.append(
                $('<div>').addClass('section-title').text('卡牌数据'),
                this.createInput('card-name', '卡牌名称', '黑洞'),
                this.createInput('displayname', '显示名称', ''),
                this.createInput('art', '图片', 'unique_1064_02.png'),
                this.createDropdown('group', '卡组', ['自我意识技能', '起始卡牌', '独特卡牌', '灵光一闪', '神光一闪']),
                this.createDropdown('rarity', '稀有度', ['白', '蓝', '橙', '彩']),
                this.createDropdown('god', '神明', ['circen', 'diallos', 'nihilum', 'secred', 'vitor']),
                this.createInput('ap', 'AP', '2'),
                this.createDropdown('type', '卡牌类型', ['攻击', '技能', '强化']),
                this.createInput('dict', '机制', ''),
                this.createDescriptionInput(),
                this.createInput('sub', '衍生卡牌', ''),
                this.createCheckbox('isinspiration', '是否存在灵光一闪'),
                this.createCheckbox('god_inspiration', '是否存在神光一闪')
            );
            
            panel.append(fighterSection, defaultInfo, cardDataSection);
            return panel;
        },
        
        createCenterPanel: function() {
            const panel = $('<div>').addClass('card-panel card-panel-center');
            
            // 卡牌列表
            const cardListSection = $('<div>').addClass('card-section');
            cardListSection.append(
                $('<div>').addClass('section-title').text('卡牌列表'),
                $('<div>').attr('id', 'card-list').addClass('card-list')
            );
            
            // 灵光一闪列表
            const inspirationSection = $('<div>').addClass('card-section');
            inspirationSection.append(
                $('<div>').addClass('section-title').text('灵光一闪列表'),
                $('<div>').attr('id', 'inspiration-list').addClass('card-list')
            );
            
            // 神光一闪列表
            const godInspirationSection = $('<div>').addClass('card-section');
            godInspirationSection.append(
                $('<div>').addClass('section-title').text('神光一闪列表'),
                $('<div>').attr('id', 'god-inspiration-list').addClass('card-list')
            );
            
            // 操作按钮
            const buttonSection = $('<div>').addClass('card-section button-group');
            buttonSection.append(
                $('<div>').addClass('card-button button-add').text('添加卡牌'),
                $('<div>').addClass('card-button button-update').text('更新卡牌'),
                $('<div>').addClass('card-button button-delete').text('删除卡牌'),
                $('<div>').addClass('card-button button-save').text('保存到模块')
            );
            
            panel.append(cardListSection, inspirationSection, godInspirationSection, buttonSection);
            return panel;
        },
        
        createRightPanel: function() {
            const panel = $('<div>').addClass('card-panel card-panel-right');
            
            const previewSection = $('<div>').addClass('card-section');
            previewSection.append(
                $('<div>').addClass('section-title').text('Lua代码预览'),
                $('<div>').addClass('code-preview-wrapper').append(
                    $('<pre>').attr('id', 'lua-preview').addClass('lua-preview')
                )
            );
            
            panel.append(previewSection);
            return panel;
        },
        
        createInput: function(id, label, placeholder) {
            return $('<div>').addClass('form-group').append(
                $('<div>').addClass('form-label').text(label + ':'),
                $('<div>').attr('id', id).addClass('custom-input').attr('contenteditable', 'true')
                    .attr('data-placeholder', placeholder || '')
            );
        },
        
        createDropdown: function(id, label, options) {
            const dropdown = $('<div>').addClass('form-group').append(
                $('<div>').addClass('form-label').text(label + ':'),
                $('<div>').attr('id', id).addClass('custom-select').append(
                    $('<div>').addClass('select-display').text(options[0]),
                    $('<div>').addClass('select-options').hide()
                )
            );
            
            const optionsContainer = dropdown.find('.select-options');
            options.forEach(opt => {
                optionsContainer.append(
                    $('<div>').addClass('select-option').text(opt)
                );
            });
            
            return dropdown;
        },
        
        createCheckbox: function(id, label) {
            return $('<div>').addClass('form-group').append(
                $('<div>').addClass('form-label').text(label + ':'),
                $('<div>').attr('id', id).addClass('custom-checkbox').append(
                    $('<div>').addClass('checkbox-box'),
                    $('<div>').addClass('checkbox-label').text('否')
                ).data('checked', false)
            );
        },
        
        createDescriptionInput: function() {
            const descGroup = $('<div>').addClass('form-group');
            
            // 工具栏
            const toolbar = $('<div>').addClass('desc-toolbar').append(
                $('<div>').addClass('toolbar-btn').text('蓝色文本').data('format', 'blue'),
                $('<div>').addClass('toolbar-btn').text('绿色文本').data('format', 'green'),
                $('<div>').addClass('toolbar-btn').text('绿色描边').data('format', 'outline'),
                $('<div>').addClass('toolbar-btn').text('词典').data('format', 'dict'),
                $('<div>').addClass('toolbar-btn').text('换行').data('format', 'br')
            );
            
            descGroup.append(
                $('<div>').addClass('form-label').text('描述:'),
                toolbar,
                $('<div>').attr('id', 'desc_global').addClass('custom-textarea')
                    .attr('contenteditable', 'true')
                    .html('伤害{{文本|蓝|240}}%<br>按照消灭卡牌的数量,伤害量+{{文本|蓝|40}}%<br>(最多{{文本|蓝|10}}次)')
            );
            
            return descGroup;
        },
        
        loadFighters: function() {
            // 通过API加载战斗员分类的页面
            new mw.Api().get({
                action: 'query',
                list: 'categorymembers',
                cmtitle: 'Category:战斗员',
                cmlimit: 500,
                format: 'json'
            }).done(function(data) {
                const fighterSelect = $('#fighter-select .select-options');
                fighterSelect.empty();
                
                data.query.categorymembers.forEach(function(member) {
                    fighterSelect.append(
                        $('<div>').addClass('select-option').text(member.title).data('fighter', member.title)
                    );
                });
            });
        },
        
        bindEvents: function() {
            const self = this;
            
            // 下拉框事件
            $(document).on('click', '.custom-select', function(e) {
                e.stopPropagation();
                const options = $(this).find('.select-options');
                $('.select-options').not(options).hide();
                options.toggle();
            });
            
            $(document).on('click', '.select-option', function(e) {
                e.stopPropagation();
                const select = $(this).closest('.custom-select');
                const display = select.find('.select-display');
                display.text($(this).text());
                $(this).parent().hide();
                
                if (select.attr('id') === 'fighter-select') {
                    self.currentFighter = $(this).data('fighter');
                    self.loadFighterCards();
                }
            });
            
            // 复选框事件
            $(document).on('click', '.custom-checkbox', function() {
                const isChecked = !$(this).data('checked');
                $(this).data('checked', isChecked);
                $(this).find('.checkbox-box').toggleClass('checked');
                $(this).find('.checkbox-label').text(isChecked ? '是' : '否');
            });
            
            // 描述工具栏事件
            $(document).on('click', '.toolbar-btn', function() {
                const format = $(this).data('format');
                const textarea = $('#desc_global')[0];
                const selection = window.getSelection();
                const selectedText = selection.toString();
                
                let insertText = '';
                switch(format) {
                    case 'blue':
                        insertText = selectedText ? `{{文本|蓝|${selectedText}}}` : '{{文本|蓝|}}';
                        break;
                    case 'green':
                        insertText = selectedText ? `{{文本|绿|${selectedText}}}` : '{{文本|绿|}}';
                        break;
                    case 'outline':
                        insertText = selectedText ? `{{描边|绿|${selectedText}}}` : '{{描边|绿|}}';
                        break;
                    case 'dict':
                        insertText = selectedText ? `{{词典|${selectedText}}}` : '{{词典|}}';
                        break;
                    case 'br':
                        insertText = '<br>';
                        break;
                }
                
                document.execCommand('insertHTML', false, insertText);
            });
            
            // 按钮事件
            $('.button-add').on('click', function() {
                self.addCard();
            });
            
            $('.button-update').on('click', function() {
                self.updateCard();
            });
            
            $('.button-delete').on('click', function() {
                self.deleteCard();
            });
            
            $('.button-save').on('click', function() {
                self.saveToModule();
            });
            
            // 输入变化时更新预览
            $(document).on('input', '.custom-input, .custom-textarea', function() {
                self.updatePreview();
            });
            
            // 点击其他地方关闭下拉框
            $(document).on('click', function() {
                $('.select-options').hide();
            });
        },
        
        addCard: function() {
            const cardName = $('#card-name').text();
            if (!cardName) {
                mw.notify('请输入卡牌名称', {type: 'error'});
                return;
            }
            
            const cardData = this.getFormData();
            this.cardData[cardName] = cardData;
            this.updateCardList();
            this.updatePreview();
            mw.notify('卡牌添加成功', {type: 'success'});
        },
        
        updateCard: function() {
            const cardName = $('#card-name').text();
            if (!cardName || !this.cardData[cardName]) {
                mw.notify('请选择要更新的卡牌', {type: 'error'});
                return;
            }
            
            const cardData = this.getFormData();
            this.cardData[cardName] = cardData;
            this.updateCardList();
            this.updatePreview();
            mw.notify('卡牌更新成功', {type: 'success'});
        },
        
        deleteCard: function() {
            const cardName = $('#card-name').text();
            if (!cardName || !this.cardData[cardName]) {
                mw.notify('请选择要删除的卡牌', {type: 'error'});
                return;
            }
            
            delete this.cardData[cardName];
            this.updateCardList();
            this.updatePreview();
            this.clearForm();
            mw.notify('卡牌删除成功', {type: 'success'});
        },
        
        getFormData: function() {
            const data = {
                base: {
                    displayname: $('#displayname').text(),
                    art: $('#art').text(),
                    group: $('#group .select-display').text(),
                    rarity: $('#rarity .select-display').text(),
                    ap: $('#ap').text(),
                    type: $('#type .select-display').text(),
                    dict: $('#dict').text(),
                    desc_global: $('#desc_global').html(),
                    sub: $('#sub').text(),
                    isinspiration: $('#isinspiration').data('checked') ? 1 : 0,
                    god_inspiration: $('#god_inspiration').data('checked') ? 1 : 0
                },
                var: {}
            };
            
            // 如果有灵光一闪,添加默认数据
            if (data.base.isinspiration) {
                data.var.inspiration = [
                    { ap: 1 },
                    { desc_global: data.base.desc_global },
                    { desc_global: data.base.desc_global },
                    { ap: 3, desc_global: data.base.desc_global },
                    { ap: 1, type: '强化', desc_global: data.base.desc_global }
                ];
            }
            
            // 如果有神光一闪,添加默认数据
            if (data.base.god_inspiration) {
                data.var.god_inspiration = {
                    circen: [{ ap: 1 }],
                    diallos: [{ ap: 1 }],
                    nihilum: [{ ap: 1 }],
                    secred: [{ ap: 1 }],
                    vitor: [{ ap: 1 }]
                };
            }
            
            return data;
        },
        
        updateCardList: function() {
            const cardList = $('#card-list');
            cardList.empty();
            
            Object.keys(this.cardData).forEach(cardName => {
                const card = this.cardData[cardName];
                const cardItem = $('<div>').addClass('card-item').text(cardName);
                cardItem.on('click', () => this.loadCard(cardName));
                cardList.append(cardItem);
                
                // 更新灵光一闪列表
                if (card.base.isinspiration) {
                    const inspirationItem = $('<div>').addClass('card-item inspiration-item')
                        .text(cardName + ' - 灵光一闪');
                    $('#inspiration-list').append(inspirationItem);
                }
                
                // 更新神光一闪列表
                if (card.base.god_inspiration) {
                    const godItem = $('<div>').addClass('card-item god-item')
                        .text(cardName + ' - 神光一闪');
                    $('#god-inspiration-list').append(godItem);
                }
            });
        },
        
        loadCard: function(cardName) {
            const card = this.cardData[cardName];
            if (!card) return;
            
            $('#card-name').text(cardName);
            $('#displayname').text(card.base.displayname || '');
            $('#art').text(card.base.art || '');
            $('#group .select-display').text(card.base.group || '');
            $('#rarity .select-display').text(card.base.rarity || '');
            $('#ap').text(card.base.ap || '');
            $('#type .select-display').text(card.base.type || '');
            $('#dict').text(card.base.dict || '');
            $('#desc_global').html(card.base.desc_global || '');
            $('#sub').text(card.base.sub || '');
            
            const inspirationChecked = card.base.isinspiration === 1;
            $('#isinspiration').data('checked', inspirationChecked);
            $('#isinspiration .checkbox-box').toggleClass('checked', inspirationChecked);
            $('#isinspiration .checkbox-label').text(inspirationChecked ? '是' : '否');
            
            const godChecked = card.base.god_inspiration === 1;
            $('#god_inspiration').data('checked', godChecked);
            $('#god_inspiration .checkbox-box').toggleClass('checked', godChecked);
            $('#god_inspiration .checkbox-label').text(godChecked ? '是' : '否');
        },
        
        clearForm: function() {
            $('.custom-input').text('');
            $('.custom-textarea').html('');
            $('.custom-checkbox').data('checked', false);
            $('.checkbox-box').removeClass('checked');
            $('.checkbox-label').text('否');
        },
        
        updatePreview: function() {
            const cardOrder = $('#card-order').text();
            const ego = $('#ego').text();
            
            let luaCode = 'local card = {}\n\n';
            luaCode += `card.order = { "${cardOrder}" }\n\n`;
            luaCode += 'card.info = {\n';
            luaCode += `    ego = "${ego}",\n`;
            luaCode += '}\n\n';
            
            Object.keys(this.cardData).forEach(cardName => {
                const card = this.cardData[cardName];
                luaCode += `card["${cardName}"] = {\n`;
                luaCode += '    base = {\n';
                
                Object.keys(card.base).forEach(key => {
                    const value = card.base[key];
                    if (value !== '' && value !== 0) {
                        if (typeof value === 'number') {
                            luaCode += `        ${key} = ${value},\n`;
                        } else {
                            luaCode += `        ${key} = "${value}",\n`;
                        }
                    }
                });
                
                luaCode += '    },\n';
                
                if (card.var && Object.keys(card.var).length > 0) {
                    luaCode += '    var = {\n';
                    
                    if (card.var.inspiration) {
                        luaCode += '        inspiration = {\n';
                        card.var.inspiration.forEach(insp => {
                            luaCode += '            {\n';
                            Object.keys(insp).forEach(key => {
                                if (typeof insp[key] === 'number') {
                                    luaCode += `                ${key} = ${insp[key]},\n`;
                                } else {
                                    luaCode += `                ${key} = "${insp[key]}",\n`;
                                }
                            });
                            luaCode += '            },\n';
                        });
                        luaCode += '        },\n';
                    }
                    
                    if (card.var.god_inspiration) {
                        luaCode += '        god_inspiration = {\n';
                        Object.keys(card.var.god_inspiration).forEach(god => {
                            luaCode += `            ${god} = {\n`;
                            card.var.god_inspiration[god].forEach(godInsp => {
                                luaCode += '                {\n';
                                Object.keys(godInsp).forEach(key => {
                                    if (typeof godInsp[key] === 'number') {
                                        luaCode += `                    ${key} = ${godInsp[key]},\n`;
                                    } else {
                                        luaCode += `                    ${key} = "${godInsp[key]}",\n`;
                                    }
                                });
                                luaCode += '                },\n';
                            });
                            luaCode += '            },\n';
                        });
                        luaCode += '        },\n';
                    }
                    
                    luaCode += '    },\n';
                }
                
                luaCode += '}\n\n';
            });
            
            luaCode += 'return card';
            
            $('#lua-preview').text(luaCode);
        },
        
        loadFighterCards: function() {
            if (!this.currentFighter) return;
            
            const moduleName = `模块:卡牌/${this.currentFighter}`;
            
            new mw.Api().get({
                action: 'query',
                prop: 'revisions',
                titles: moduleName,
                rvprop: 'content',
                format: 'json'
            }).done((data) => {
                const pages = data.query.pages;
                const pageId = Object.keys(pages)[0];
                
                if (pageId !== '-1') {
                    const content = pages[pageId].revisions[0]['*'];
                    // 这里需要解析Lua内容并加载到界面
                    this.parseLuaContent(content);
                }
            });
        },
        
        parseLuaContent: function(content) {
            // 简化的Lua解析,实际使用可能需要更复杂的解析器
            try {
                // 提取卡牌数据
                const cardMatches = content.matchAll(/card\["([^"]+)"\]\s*=\s*{([^}]+})}/gs);
                
                this.cardData = {};
                for (const match of cardMatches) {
                    const cardName = match[1];
                    // 这里需要更复杂的解析逻辑
                    // 暂时使用简化版本
                }
                
                this.updateCardList();
                this.updatePreview();
            } catch (e) {
                console.error('解析Lua内容失败:', e);
            }
        },
        
        saveToModule: function() {
            if (!this.currentFighter) {
                mw.notify('请先选择战斗员', {type: 'error'});
                return;
            }
            
            const moduleName = `模块:卡牌/${this.currentFighter}`;
            const luaContent = $('#lua-preview').text();
            
            new mw.Api().postWithToken('csrf', {
                action: 'edit',
                title: moduleName,
                text: luaContent,
                summary: '更新卡牌数据',
                format: 'json'
            }).done(function() {
                mw.notify('保存成功!', {type: 'success'});
            }).fail(function(error) {
                mw.notify('保存失败:' + error, {type: 'error'});
            });
        }
    };
    
    // 页面加载完成后初始化
    $(document).ready(function() {
        // 只在特定页面加载
        if (mw.config.get('wgPageName') === 'Special:CardManager' || 
            mw.config.get('wgPageName').indexOf('卡牌管理') !== -1) {
            CardManager.init();
        }
    });
    
    // 添加到全局对象以便调试
    window.CardManager = CardManager;
})();