MediaWiki:Card.js
来自卡厄思梦境WIKI
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
// MediaWiki:Card.js
(function() {
'use strict';
// 检查是否在正确的页面
if (mw.config.get('wgPageName') !== 'MediaWiki:Card') {
return;
}
var api = new mw.Api();
var cardData = {};
var currentCharacter = null;
// 获取所有"模块:卡牌/角色名"页面
function loadAllCardModules() {
api.get({
action: 'query',
list: 'allpages',
apprefix: '卡牌/',
apnamespace: 828, // Module namespace
aplimit: 'max'
}).done(function(data) {
var pages = data.query.allpages;
var select = $('#character-select');
select.empty();
select.append('<option value="">选择角色</option>');
pages.forEach(function(page) {
var characterName = page.title.replace('模块:卡牌/', '');
select.append($('<option>').val(characterName).text(characterName));
});
});
}
// 加载指定角色的卡牌数据
function loadCharacterCards(characterName) {
api.get({
action: 'query',
prop: 'revisions',
titles: '模块:卡牌/' + characterName,
rvprop: 'content',
rvslots: 'main'
}).done(function(data) {
var pages = data.query.pages;
for (var pageId in pages) {
if (pages[pageId].revisions) {
var content = pages[pageId].revisions[0].slots.main['*'];
parseModuleContent(content, characterName);
}
}
});
}
// 解析模块内容
function parseModuleContent(content, characterName) {
try {
// 提取card表和cardOrder数组
var cardMatch = content.match(/local\s+card\s*=\s*\{[\s\S]*?\n\}/);
var orderMatch = content.match(/local\s+cardOrder\s*=\s*\{[\s\S]*?\n\}/);
if (cardMatch && orderMatch) {
// 转换Lua表格式为JavaScript对象
var cardDataStr = cardMatch[0]
.replace(/local\s+card\s*=/, 'var cardData =')
.replace(/\["([^"]+)"\]/g, '"$1"')
.replace(/\[(\d+)\]/g, '$1')
.replace(/nil/g, 'null');
var orderDataStr = orderMatch[0]
.replace(/local\s+cardOrder\s*=/, 'var cardOrder =')
.replace(/"/g, '"');
eval(cardDataStr);
eval(orderDataStr);
currentCharacter = characterName;
displayCards(cardData, cardOrder);
}
} catch (e) {
console.error('解析失败:', e);
mw.notify('解析模块内容失败', { type: 'error' });
}
}
// 显示卡牌列表
function displayCards(cards, order) {
var container = $('#cards-container');
container.empty();
// 按照顺序显示卡牌
(order || Object.keys(cards)).forEach(function(cardName) {
if (cards[cardName]) {
var cardDiv = createCardElement(cardName, cards[cardName]);
container.append(cardDiv);
}
});
}
// 创建卡牌元素
function createCardElement(cardName, variants) {
var cardDiv = $('<div>').addClass('card-item');
var header = $('<h3>').text(cardName).click(function() {
$(this).next('.card-variants').toggle();
});
cardDiv.append(header);
var variantsDiv = $('<div>').addClass('card-variants');
variants.forEach(function(variant, index) {
var variantDiv = createVariantElement(cardName, variant, index);
variantsDiv.append(variantDiv);
});
// 添加新变体按钮
var addButton = $('<button>').text('添加变体').click(function() {
addCardVariant(cardName);
});
variantsDiv.append(addButton);
cardDiv.append(variantsDiv);
return cardDiv;
}
// 创建变体元素
function createVariantElement(cardName, variant, index) {
var variantDiv = $('<div>').addClass('card-variant');
var fields = [
{ key: 'art', label: '图片', type: 'text' },
{ key: '卡组', label: '卡组', type: 'select',
options: ['起始卡牌', '独特卡牌', '衍生卡牌', '灵光一闪', '神光一闪'] },
{ key: '属性', label: '属性', type: 'select',
options: ['热情', '秩序', '正义', '本能', '虚无'] },
{ key: '稀有度', label: '稀有度', type: 'select',
options: ['白', '蓝', '橙', '彩'] },
{ key: 'AP', label: 'AP', type: 'number' },
{ key: '类型', label: '类型', type: 'select',
options: ['攻击', '技能', '强化', '状态异常'] },
{ key: '机制', label: '机制', type: 'text' },
{ key: '描述', label: '描述', type: 'textarea' },
{ key: '衍生卡牌', label: '衍生卡牌', type: 'text' }
];
fields.forEach(function(field) {
var fieldDiv = $('<div>').addClass('field');
var label = $('<label>').text(field.label + ': ');
var input;
if (field.type === 'select') {
input = $('<select>');
$('<option>').val('').text('--选择--').appendTo(input);
field.options.forEach(function(opt) {
$('<option>').val(opt).text(opt).appendTo(input);
});
input.val(variant[field.key] || '');
} else if (field.type === 'textarea') {
input = $('<textarea>').val(variant[field.key] || '');
} else {
input = $('<input>').attr('type', field.type).val(variant[field.key] || '');
}
input.attr('data-card', cardName)
.attr('data-index', index)
.attr('data-field', field.key);
fieldDiv.append(label).append(input);
variantDiv.append(fieldDiv);
});
// 删除按钮
var deleteButton = $('<button>').text('删除').click(function() {
deleteCardVariant(cardName, index);
});
variantDiv.append(deleteButton);
return variantDiv;
}
// 添加新卡牌
function addNewCard() {
var cardName = prompt('输入新卡牌名称:');
if (!cardName) return;
cardData[cardName] = [{
art: '',
'卡组': '',
'属性': '',
'稀有度': '',
'AP': 1,
'类型': '',
'机制': '',
'描述': '',
'衍生卡牌': ''
}];
displayCards(cardData, Object.keys(cardData));
}
// 添加卡牌变体
function addCardVariant(cardName) {
if (!cardData[cardName]) {
cardData[cardName] = [];
}
cardData[cardName].push({
art: '',
'卡组': '',
'属性': '',
'稀有度': '',
'AP': 1,
'类型': '',
'机制': '',
'描述': '',
'衍生卡牌': ''
});
displayCards(cardData, Object.keys(cardData));
}
// 删除卡牌变体
function deleteCardVariant(cardName, index) {
if (confirm('确认删除这个变体?')) {
cardData[cardName].splice(index, 1);
if (cardData[cardName].length === 0) {
delete cardData[cardName];
}
displayCards(cardData, Object.keys(cardData));
}
}
// 保存数据
function saveCardData() {
if (!currentCharacter) {
mw.notify('请先选择角色', { type: 'warning' });
return;
}
// 收集表单数据更新cardData
$('#cards-container input, #cards-container select, #cards-container textarea').each(function() {
var $this = $(this);
var cardName = $this.data('card');
var index = $this.data('index');
var field = $this.data('field');
var value = $this.val();
if (cardData[cardName] && cardData[cardName][index]) {
if (field === 'AP') {
value = parseInt(value) || 0;
}
if (value) {
cardData[cardName][index][field] = value;
} else {
delete cardData[cardName][index][field];
}
}
});
var moduleContent = generateModuleContent(cardData);
api.postWithToken('csrf', {
action: 'edit',
title: '模块:卡牌/' + currentCharacter,
text: moduleContent,
summary: '通过卡牌管理器更新'
}).done(function() {
mw.notify('保存成功!', { type: 'success' });
}).fail(function(code, data) {
mw.notify('保存失败: ' + (data.error ? data.error.info : code), { type: 'error' });
});
}
// 生成模块内容
function generateModuleContent(data) {
var content = 'local p = {}\n\n';
// 生成cardOrder
content += 'local cardOrder = {\n';
Object.keys(data).forEach(function(cardName) {
content += ' "' + cardName + '",\n';
});
content += '}\n\n';
// 生成card表
content += 'local card = {\n';
Object.keys(data).forEach(function(cardName) {
content += ' ["' + cardName + '"] = {\n';
data[cardName].forEach(function(variant) {
content += ' {\n';
Object.keys(variant).forEach(function(key) {
var value = variant[key];
if (value !== null && value !== undefined && value !== '') {
if (key === 'AP' || !isNaN(value)) {
content += ' ["' + key + '"] = ' + value + ',\n';
} else {
content += ' ["' + key + '"] = "' + value.replace(/"/g, '\\"') + '",\n';
}
}
});
content += ' },\n';
});
content += ' },\n';
});
content += '}\n\n';
content += 'p.card = card\n';
content += 'p.cardOrder = cardOrder\n\n';
content += 'return p\n';
return content;
}
// 初始化页面
$(function() {
loadAllCardModules();
// 绑定事件
$('#character-select').on('change', function() {
var characterName = $(this).val();
if (characterName) {
loadCharacterCards(characterName);
}
});
$('#add-card-btn').click(addNewCard);
$('#save-btn').click(saveCardData);
$('#refresh-btn').click(loadAllCardModules);
});
})();