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