Equipment.js:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
(function() { | ( function () { | ||
'use strict'; | 'use strict'; | ||
// | mw.loader.using( ['mediawiki.api', 'mediawiki.util'], function () { | ||
if ( mw.config.get( 'wgPageName' ) !== 'MediaWiki:Equipment' ) { | |||
return; | |||
} | |||
mw.loader.load( mw.util.getUrl( 'MediaWiki:Equipment.css', { action: 'raw', ctype: 'text/css' } ), 'text/css' ); | |||
var api = new mw.Api(); | |||
var equipmentData = {}; | |||
// 固定选项 | // 固定选项 | ||
var AREA_OPTIONS = ['蓝壶', '双星之影', '雾之都市']; | |||
var RARITY_OPTIONS = ['蓝', '金', '彩']; | |||
var TYPE_OPTIONS = ['武器', '装甲', '戒指']; | |||
// 初始化 | // 初始化 | ||
init | function init() { | ||
loadEquipmentData(); | |||
} | |||
} | |||
// 加载装备数据 | // 加载装备数据 | ||
loadEquipmentData | function loadEquipmentData() { | ||
api.get({ | |||
action: 'raw', | |||
action: ' | title: 'Module:装备/data' | ||
}).done(function (data) { | |||
parseEquipmentData(data); | |||
renderUI(); | |||
}).fail(function () { | |||
}).done(function(data) { | mw.notify('加载装备数据失败', { type: 'error' }); | ||
}); | }); | ||
} | } | ||
// | // 解析 Lua 数据 | ||
parseEquipmentData | function parseEquipmentData(luaCode) { | ||
equipmentData = {}; | |||
// | |||
var | // 匹配每个装备条目 | ||
var pattern = /equipment\["([^"]+)"\]\s*=\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/g; | |||
var match; | var match; | ||
while ((match = | while ((match = pattern.exec(luaCode)) !== null) { | ||
var name = match[1]; | var name = match[1]; | ||
var | var content = match[2]; | ||
var item = { | |||
var | |||
name: name, | name: name, | ||
id: | id: extractValue(content, 'id'), | ||
area: | area: extractValue(content, 'area'), | ||
rarity: | rarity: extractValue(content, 'rarity'), | ||
type: | type: extractValue(content, 'type'), | ||
tag: | tag: extractValue(content, 'tag'), | ||
desc: | desc: extractDescArray(content) | ||
}; | }; | ||
equipmentData[name] = item; | |||
} | } | ||
} | } | ||
// | // 提取单个值 | ||
extractValue | function extractValue(content, key) { | ||
var regex = new RegExp(key + '\\s*=\\s* | var regex = new RegExp(key + '\\s*=\\s*"?([^",\\n]+)"?'); | ||
var match = content.match(regex); | |||
return match ? match[1].trim() : ''; | |||
} | |||
var match = | |||
return match ? match[1] : ''; | |||
} | |||
// 提取描述数组 | // 提取描述数组 | ||
extractDescArray | function extractDescArray(content) { | ||
var descMatch = | var descMatch = content.match(/desc\s*=\s*\{([^}]+)\}/); | ||
if (!descMatch) return []; | if (!descMatch) return ['', '', '', '', '']; | ||
var | var descContent = descMatch[1]; | ||
var | var items = []; | ||
var regex = /"([^"]+)"/g; | var regex = /"([^"]+)"/g; | ||
var match; | var match; | ||
while ((match = regex.exec( | while ((match = regex.exec(descContent)) !== null) { | ||
items.push(match[1]); | |||
} | |||
while (items.length < 5) { | |||
items.push(''); | |||
} | } | ||
return | return items.slice(0, 5); | ||
} | } | ||
// 渲染界面 | // 渲染界面 | ||
function renderUI() { | |||
var container = | var $container = $('<div>').addClass('equipment-manager'); | ||
// 标题 | |||
$container.append($('<div>').addClass('equipment-title').text('装备数据管理')); | |||
// 添加新装备按钮 | |||
var $addBtn = $('<div>').addClass('equipment-button equipment-button-primary') | |||
.text('添加新装备') | |||
.on('click', function () { | |||
showEditForm(null); | |||
var | }); | ||
$container.append($addBtn); | |||
var | // 装备列表 | ||
var $list = $('<div>').addClass('equipment-list'); | |||
for (var name in | for (var name in equipmentData) { | ||
$list.append(createEquipmentItem(equipmentData[name])); | |||
} | } | ||
$container.append($list); | |||
} | |||
// 插入到页面 | |||
// | $('#mw-content-text').empty().append($container); | ||
} | |||
var | |||
// 创建装备项 | |||
function createEquipmentItem(item) { | |||
var $item = $('<div>').addClass('equipment-item'); | |||
var $info = $('<div>').addClass('equipment-info'); | |||
$info.append($('<div>').addClass('equipment-name').text(item.name)); | |||
$info.append($('<div>').addClass('equipment-meta') | |||
.text('ID: ' + item.id + ' | ' + item.area + ' | ' + item.rarity + ' | ' + item.type)); | |||
$info.append($('<div>').addClass('equipment-tags').text('标签: ' + item.tag)); | |||
var $actions = $('<div>').addClass('equipment-actions'); | |||
$actions.append( | |||
$('<div>').addClass('equipment-button equipment-button-small').text('编辑') | |||
.on('click', function () { | |||
' | showEditForm(item); | ||
}) | |||
); | |||
$actions.append( | |||
$('<div>').addClass('equipment-button equipment-button-small equipment-button-danger').text('删除') | |||
.on('click', function () { | |||
deleteEquipment(item.name); | |||
}) | |||
); | |||
' | |||
// | $item.append($info).append($actions); | ||
$( | return $item; | ||
} | |||
// 显示编辑表单 | |||
function showEditForm(item) { | |||
var isEdit = item !== null; | |||
var $overlay = $('<div>').addClass('equipment-overlay'); | |||
var $modal = $('<div>').addClass('equipment-modal'); | |||
$modal.append($('<div>').addClass('equipment-modal-title') | |||
.text(isEdit ? '编辑装备' : '添加新装备')); | |||
var $form = $('<div>').addClass('equipment-form'); | |||
// 名称 | |||
$form.append(createFormField('名称', 'name', 'text', isEdit ? item.name : '', !isEdit)); | |||
// ID | |||
$form.append(createFormField('ID', 'id', 'number', isEdit ? item.id : '')); | |||
// 地区 | |||
$form.append(createFormSelect('地区', 'area', AREA_OPTIONS, isEdit ? item.area : '')); | |||
// | // 稀有度 | ||
$( | $form.append(createFormSelect('稀有度', 'rarity', RARITY_OPTIONS, isEdit ? item.rarity : '')); | ||
// | // 类型 | ||
$( | $form.append(createFormSelect('类型', 'type', TYPE_OPTIONS, isEdit ? item.type : '')); | ||
// | // 标签 | ||
$( | $form.append(createFormField('标签 (用逗号分隔)', 'tag', 'text', isEdit ? item.tag : '')); | ||
// | // 描述 (5个等级) | ||
for (var i = 1; i <= 5; i++) { | |||
$form.append(createFormField('描述等级 ' + i, 'desc' + i, 'text', | |||
isEdit ? item.desc[i - 1] : '')); | |||
} | |||
} | |||
var $actions = $('<div>').addClass('equipment-modal-actions'); | |||
$actions.append( | |||
$('<div>').addClass('equipment-button equipment-button-primary').text('保存') | |||
.on('click', function () { | |||
saveEquipment($form, isEdit); | |||
$overlay.remove(); | |||
}) | |||
); | |||
$actions.append( | |||
$('<div>').addClass('equipment-button').text('取消') | |||
.on('click', function () { | |||
$overlay.remove(); | |||
}) | |||
); | |||
$ | |||
$modal.append($form).append($actions); | |||
$overlay.append($modal); | |||
$('.form- | $('body').append($overlay); | ||
} | |||
// 创建表单字段 | |||
function createFormField(label, name, type, value, readonly) { | |||
var $field = $('<div>').addClass('equipment-form-field'); | |||
$field.append($('<div>').addClass('equipment-form-label').text(label)); | |||
var $input = $('<input>').addClass('equipment-form-input') | |||
.attr('type', type) | |||
.attr('name', name) | |||
.val(value || ''); | |||
if (readonly) { | |||
$input.attr('readonly', 'readonly'); | |||
} | |||
$field.append($input); | |||
return $field; | |||
} | |||
// 创建下拉选择框 | |||
function createFormSelect(label, name, options, value) { | |||
var $field = $('<div>').addClass('equipment-form-field'); | |||
$field.append($('<div>').addClass('equipment-form-label').text(label)); | |||
var $select = $('<select>').addClass('equipment-form-input').attr('name', name); | |||
$ | $select.append($('<option>').val('').text('请选择...')); | ||
options.forEach(function (opt) { | |||
$select.append($('<option>').val(opt).text(opt)); | |||
}); | |||
$select.val(value || ''); | |||
$field.append($select); | |||
return $field; | |||
} | |||
} | |||
// 保存装备 | // 保存装备 | ||
saveEquipment | function saveEquipment($form, isEdit) { | ||
var | var formData = {}; | ||
$form.find('input, select').each(function () { | |||
var $el = $(this); | |||
formData[$el.attr('name')] = $el.val(); | |||
}); | |||
var desc = []; | |||
for (var i = 1; i <= 5; i++) { | |||
desc.push(formData['desc' + i] || ''); | |||
} | } | ||
var | var newItem = { | ||
name: name, | name: formData.name, | ||
id: | id: formData.id, | ||
area: area, | area: formData.area, | ||
rarity: rarity, | rarity: formData.rarity, | ||
type: type, | type: formData.type, | ||
tag: tag, | tag: formData.tag, | ||
desc: desc | desc: desc | ||
}; | }; | ||
// | equipmentData[formData.name] = newItem; | ||
if ( | saveToModule(); | ||
} | |||
// 删除装备 | |||
function deleteEquipment(name) { | |||
if (!confirm('确定要删除装备 "' + name + '" 吗?')) { | |||
return; | |||
} | } | ||
delete equipmentData[name]; | |||
saveToModule(); | |||
} | |||
// 保存到模块 | |||
function saveToModule() { | |||
var luaCode = 'local equipment = {}\n\n'; | |||
} | |||
// | |||
var | |||
for (var name in | for (var name in equipmentData) { | ||
var | var item = equipmentData[name]; | ||
luaCode += 'equipment["' + name + '"] = {\n'; | |||
luaCode += ' id = ' + item.id + ',\n'; | |||
luaCode += '\tarea = "' + item.area + '",\n'; | |||
luaCode += ' rarity = "' + item.rarity + '",\n'; | |||
luaCode += ' type = "' + item.type + '",\n'; | |||
luaCode += ' tag = "' + item.tag + '",\n'; | |||
luaCode += ' desc = {\n'; | |||
for (var i = 0; i < 5; i++) { | |||
luaCode += ' "' + (item.desc[i] || '') + '"'; | |||
if (i < 4) luaCode += ','; | |||
} | luaCode += '\n'; | ||
} | |||
luaCode += ' }\n'; | |||
luaCode += '}\n\n'; | |||
} | } | ||
luaCode += 'return equipment\n'; | |||
api.postWithToken('csrf', { | |||
action: 'edit', | |||
title: 'Module:装备/data', | |||
text: luaCode, | |||
summary: '通过装备管理界面更新数据', | |||
contentmodel: 'Scribunto' | |||
}).done(function () { | |||
mw.notify('保存成功!', { type: 'success' }); | |||
loadEquipmentData(); | |||
}).fail(function () { | |||
mw.notify('保存失败!', { type: 'error' }); | |||
}); | }); | ||
} | } | ||
}; | |||
init(); | |||
}); | |||
})(); | })(); | ||
2025年10月17日 (五) 19:35的版本
( function () {
'use strict';
mw.loader.using( ['mediawiki.api', 'mediawiki.util'], function () {
if ( mw.config.get( 'wgPageName' ) !== 'MediaWiki:Equipment' ) {
return;
}
mw.loader.load( mw.util.getUrl( 'MediaWiki:Equipment.css', { action: 'raw', ctype: 'text/css' } ), 'text/css' );
var api = new mw.Api();
var equipmentData = {};
// 固定选项
var AREA_OPTIONS = ['蓝壶', '双星之影', '雾之都市'];
var RARITY_OPTIONS = ['蓝', '金', '彩'];
var TYPE_OPTIONS = ['武器', '装甲', '戒指'];
// 初始化
function init() {
loadEquipmentData();
}
// 加载装备数据
function loadEquipmentData() {
api.get({
action: 'raw',
title: 'Module:装备/data'
}).done(function (data) {
parseEquipmentData(data);
renderUI();
}).fail(function () {
mw.notify('加载装备数据失败', { type: 'error' });
});
}
// 解析 Lua 数据
function parseEquipmentData(luaCode) {
equipmentData = {};
// 匹配每个装备条目
var pattern = /equipment\["([^"]+)"\]\s*=\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/g;
var match;
while ((match = pattern.exec(luaCode)) !== null) {
var name = match[1];
var content = match[2];
var item = {
name: name,
id: extractValue(content, 'id'),
area: extractValue(content, 'area'),
rarity: extractValue(content, 'rarity'),
type: extractValue(content, 'type'),
tag: extractValue(content, 'tag'),
desc: extractDescArray(content)
};
equipmentData[name] = item;
}
}
// 提取单个值
function extractValue(content, key) {
var regex = new RegExp(key + '\\s*=\\s*"?([^",\\n]+)"?');
var match = content.match(regex);
return match ? match[1].trim() : '';
}
// 提取描述数组
function extractDescArray(content) {
var descMatch = content.match(/desc\s*=\s*\{([^}]+)\}/);
if (!descMatch) return ['', '', '', '', ''];
var descContent = descMatch[1];
var items = [];
var regex = /"([^"]+)"/g;
var match;
while ((match = regex.exec(descContent)) !== null) {
items.push(match[1]);
}
while (items.length < 5) {
items.push('');
}
return items.slice(0, 5);
}
// 渲染界面
function renderUI() {
var $container = $('<div>').addClass('equipment-manager');
// 标题
$container.append($('<div>').addClass('equipment-title').text('装备数据管理'));
// 添加新装备按钮
var $addBtn = $('<div>').addClass('equipment-button equipment-button-primary')
.text('添加新装备')
.on('click', function () {
showEditForm(null);
});
$container.append($addBtn);
// 装备列表
var $list = $('<div>').addClass('equipment-list');
for (var name in equipmentData) {
$list.append(createEquipmentItem(equipmentData[name]));
}
$container.append($list);
// 插入到页面
$('#mw-content-text').empty().append($container);
}
// 创建装备项
function createEquipmentItem(item) {
var $item = $('<div>').addClass('equipment-item');
var $info = $('<div>').addClass('equipment-info');
$info.append($('<div>').addClass('equipment-name').text(item.name));
$info.append($('<div>').addClass('equipment-meta')
.text('ID: ' + item.id + ' | ' + item.area + ' | ' + item.rarity + ' | ' + item.type));
$info.append($('<div>').addClass('equipment-tags').text('标签: ' + item.tag));
var $actions = $('<div>').addClass('equipment-actions');
$actions.append(
$('<div>').addClass('equipment-button equipment-button-small').text('编辑')
.on('click', function () {
showEditForm(item);
})
);
$actions.append(
$('<div>').addClass('equipment-button equipment-button-small equipment-button-danger').text('删除')
.on('click', function () {
deleteEquipment(item.name);
})
);
$item.append($info).append($actions);
return $item;
}
// 显示编辑表单
function showEditForm(item) {
var isEdit = item !== null;
var $overlay = $('<div>').addClass('equipment-overlay');
var $modal = $('<div>').addClass('equipment-modal');
$modal.append($('<div>').addClass('equipment-modal-title')
.text(isEdit ? '编辑装备' : '添加新装备'));
var $form = $('<div>').addClass('equipment-form');
// 名称
$form.append(createFormField('名称', 'name', 'text', isEdit ? item.name : '', !isEdit));
// ID
$form.append(createFormField('ID', 'id', 'number', isEdit ? item.id : ''));
// 地区
$form.append(createFormSelect('地区', 'area', AREA_OPTIONS, isEdit ? item.area : ''));
// 稀有度
$form.append(createFormSelect('稀有度', 'rarity', RARITY_OPTIONS, isEdit ? item.rarity : ''));
// 类型
$form.append(createFormSelect('类型', 'type', TYPE_OPTIONS, isEdit ? item.type : ''));
// 标签
$form.append(createFormField('标签 (用逗号分隔)', 'tag', 'text', isEdit ? item.tag : ''));
// 描述 (5个等级)
for (var i = 1; i <= 5; i++) {
$form.append(createFormField('描述等级 ' + i, 'desc' + i, 'text',
isEdit ? item.desc[i - 1] : ''));
}
var $actions = $('<div>').addClass('equipment-modal-actions');
$actions.append(
$('<div>').addClass('equipment-button equipment-button-primary').text('保存')
.on('click', function () {
saveEquipment($form, isEdit);
$overlay.remove();
})
);
$actions.append(
$('<div>').addClass('equipment-button').text('取消')
.on('click', function () {
$overlay.remove();
})
);
$modal.append($form).append($actions);
$overlay.append($modal);
$('body').append($overlay);
}
// 创建表单字段
function createFormField(label, name, type, value, readonly) {
var $field = $('<div>').addClass('equipment-form-field');
$field.append($('<div>').addClass('equipment-form-label').text(label));
var $input = $('<input>').addClass('equipment-form-input')
.attr('type', type)
.attr('name', name)
.val(value || '');
if (readonly) {
$input.attr('readonly', 'readonly');
}
$field.append($input);
return $field;
}
// 创建下拉选择框
function createFormSelect(label, name, options, value) {
var $field = $('<div>').addClass('equipment-form-field');
$field.append($('<div>').addClass('equipment-form-label').text(label));
var $select = $('<select>').addClass('equipment-form-input').attr('name', name);
$select.append($('<option>').val('').text('请选择...'));
options.forEach(function (opt) {
$select.append($('<option>').val(opt).text(opt));
});
$select.val(value || '');
$field.append($select);
return $field;
}
// 保存装备
function saveEquipment($form, isEdit) {
var formData = {};
$form.find('input, select').each(function () {
var $el = $(this);
formData[$el.attr('name')] = $el.val();
});
var desc = [];
for (var i = 1; i <= 5; i++) {
desc.push(formData['desc' + i] || '');
}
var newItem = {
name: formData.name,
id: formData.id,
area: formData.area,
rarity: formData.rarity,
type: formData.type,
tag: formData.tag,
desc: desc
};
equipmentData[formData.name] = newItem;
saveToModule();
}
// 删除装备
function deleteEquipment(name) {
if (!confirm('确定要删除装备 "' + name + '" 吗?')) {
return;
}
delete equipmentData[name];
saveToModule();
}
// 保存到模块
function saveToModule() {
var luaCode = 'local equipment = {}\n\n';
for (var name in equipmentData) {
var item = equipmentData[name];
luaCode += 'equipment["' + name + '"] = {\n';
luaCode += ' id = ' + item.id + ',\n';
luaCode += '\tarea = "' + item.area + '",\n';
luaCode += ' rarity = "' + item.rarity + '",\n';
luaCode += ' type = "' + item.type + '",\n';
luaCode += ' tag = "' + item.tag + '",\n';
luaCode += ' desc = {\n';
for (var i = 0; i < 5; i++) {
luaCode += ' "' + (item.desc[i] || '') + '"';
if (i < 4) luaCode += ',';
luaCode += '\n';
}
luaCode += ' }\n';
luaCode += '}\n\n';
}
luaCode += 'return equipment\n';
api.postWithToken('csrf', {
action: 'edit',
title: 'Module:装备/data',
text: luaCode,
summary: '通过装备管理界面更新数据',
contentmodel: 'Scribunto'
}).done(function () {
mw.notify('保存成功!', { type: 'success' });
loadEquipmentData();
}).fail(function () {
mw.notify('保存失败!', { type: 'error' });
});
}
init();
});
})();