MediaWiki:Dictionary.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:Dictionary') {
return;
}
var API_URL = mw.util.wikiScript('api');
var dictionaryData = {};
// 加载词典数据
function loadDictionaryData() {
$.ajax({
url: API_URL,
data: {
action: 'scribunto-console',
title: 'Module:词典/data',
question: 'return require("Module:词典/data").dictionary',
format: 'json'
},
dataType: 'json',
success: function(response) {
if (response && response.parse) {
try {
dictionaryData = JSON.parse(response.parse.text['*']);
renderDictionary();
} catch(e) {
console.error('解析数据失败:', e);
}
}
},
error: function() {
// 备用方案:直接从页面加载
loadFromModulePage();
}
});
}
// 从模块页面加载数据
function loadFromModulePage() {
$.get(mw.util.getUrl('Module:词典/data', {action: 'raw'}), function(content) {
try {
dictionaryData = parseLuaTable(content);
renderDictionary();
} catch(e) {
console.error('解析Lua失败:', e);
}
});
}
// 简单的Lua表解析器
function parseLuaTable(luaContent) {
var result = {};
var dictMatch = luaContent.match(/data\.dictionary\s*=\s*\{([\s\S]*?)\}/);
if (!dictMatch) return result;
var content = dictMatch[1];
var entryRegex = /\["([^"]+)"\]\s*=\s*\{([\s\S]*?)\},?\s*(?=\["|$)/g;
var match;
while ((match = entryRegex.exec(content)) !== null) {
var key = match[1];
var itemsContent = match[2];
result[key] = [];
var itemRegex = /\{([^}]+)\}/g;
var itemMatch;
while ((itemMatch = itemRegex.exec(itemsContent)) !== null) {
var item = {};
var props = itemMatch[1].split(',');
props.forEach(function(prop) {
var propMatch = prop.match(/\["([^"]+)"\]\s*=\s*"([^"]*)"/);
if (propMatch) {
item[propMatch[1]] = propMatch[2];
}
});
result[key].push(item);
}
}
return result;
}
// 渲染词典界面
function renderDictionary() {
var container = $('#dictionary-editor');
if (!container.length) {
container = $('<div>').attr('id', 'dictionary-editor').appendTo('#mw-content-text');
}
container.empty();
// 添加标题和新建按钮
var header = $('<div>').addClass('dict-header').appendTo(container);
$('<div>').addClass('dict-title').text('词典编辑器').appendTo(header);
$('<div>').addClass('dict-btn dict-btn-primary').text('+ 新建词条').click(showAddEntryDialog).appendTo(header);
// 渲染词条列表
var list = $('<div>').addClass('dict-list').appendTo(container);
Object.keys(dictionaryData).sort().forEach(function(key) {
var items = dictionaryData[key];
items.forEach(function(item, index) {
var entry = $('<div>').addClass('dict-entry').appendTo(list);
var entryHeader = $('<div>').addClass('dict-entry-header').appendTo(entry);
$('<div>').addClass('dict-entry-name').text(key).appendTo(entryHeader);
var actions = $('<div>').addClass('dict-entry-actions').appendTo(entryHeader);
$('<div>').addClass('dict-btn dict-btn-small').text('编辑')
.click(function() { showEditDialog(key, index); }).appendTo(actions);
$('<div>').addClass('dict-btn dict-btn-small dict-btn-danger').text('删除')
.click(function() { deleteEntry(key, index); }).appendTo(actions);
var entryBody = $('<div>').addClass('dict-entry-body').appendTo(entry);
var colorClass = 'dict-color-' + (item['颜色'] || 'white');
$('<div>').addClass('dict-field').html('<span class="dict-label">颜色:</span> <span class="' + colorClass + '">' + (item['颜色'] || '') + '</span>').appendTo(entryBody);
$('<div>').addClass('dict-field').html('<span class="dict-label">类型:</span> ' + (item['类型'] || '')).appendTo(entryBody);
$('<div>').addClass('dict-field').html('<span class="dict-label">图标:</span> ' + (item['icon'] || '')).appendTo(entryBody);
$('<div>').addClass('dict-field').html('<span class="dict-label">描述:</span> ' + (item['描述'] || '')).appendTo(entryBody);
});
});
}
// 显示添加词条对话框
function showAddEntryDialog() {
showDialog('新建词条', {}, function(data) {
var name = data.name;
delete data.name;
if (!dictionaryData[name]) {
dictionaryData[name] = [];
}
dictionaryData[name].push(data);
saveDictionary();
}, true);
}
// 显示编辑对话框
function showEditDialog(key, index) {
var item = dictionaryData[key];
var data = $.extend({name: key}, item[index]);
showDialog('编辑词条', data, function(newData) {
var newName = newData.name;
delete newData.name;
if (newName !== key) {
// 名称改变,删除旧的
dictionaryData[key].splice(index, 1);
if (dictionaryData[key].length === 0) {
delete dictionaryData[key];
}
if (!dictionaryData[newName]) {
dictionaryData[newName] = [];
}
dictionaryData[newName].push(newData);
} else {
dictionaryData[key][index] = newData;
}
saveDictionary();
}, false);
}
// 显示对话框
function showDialog(title, data, callback, isNew) {
var overlay = $('<div>').addClass('dict-overlay').appendTo('body');
var dialog = $('<div>').addClass('dict-dialog').appendTo(overlay);
$('<div>').addClass('dict-dialog-title').text(title).appendTo(dialog);
var form = $('<div>').addClass('dict-form').appendTo(dialog);
// 名称字段
var nameField = createField('名称', 'text', data.name || '', isNew);
form.append(nameField);
// 类型字段(下拉)
var typeField = createSelectField('类型', ['卡牌机制', '战斗员专属机制', 'buff', 'debuff'], data['类型'] || '');
form.append(typeField);
// 颜色字段(下拉)
var colorField = createSelectField('颜色', ['白', '蓝', '红', '橙', '彩'], data['颜色'] || '');
form.append(colorField);
// 图标字段
var iconField = createField('图标', 'text', data['icon'] || '', true);
form.append(iconField);
// 描述字段
var descField = createField('描述', 'textarea', data['描述'] || '', true);
form.append(descField);
var actions = $('<div>').addClass('dict-dialog-actions').appendTo(dialog);
$('<div>').addClass('dict-btn dict-btn-secondary').text('取消').click(function() {
overlay.remove();
}).appendTo(actions);
$('<div>').addClass('dict-btn dict-btn-primary').text('保存').click(function() {
var formData = {
name: nameField.find('input').val(),
'类型': typeField.find('.dict-select').attr('data-value'),
'颜色': colorField.find('.dict-select').attr('data-value'),
'icon': iconField.find('input').val(),
'描述': descField.find('textarea').val()
};
if (!formData.name) {
alert('请输入名称');
return;
}
overlay.remove();
callback(formData);
}).appendTo(actions);
}
// 创建表单字段
function createField(label, type, value, editable) {
var field = $('<div>').addClass('dict-form-group');
$('<div>').addClass('dict-form-label').text(label + ':').appendTo(field);
var input;
if (type === 'textarea') {
input = $('<textarea>').addClass('dict-input').val(value).attr('rows', 3);
} else {
input = $('<input>').addClass('dict-input').attr('type', type).val(value);
}
if (!editable) {
input.attr('readonly', 'readonly');
}
input.appendTo(field);
return field;
}
// 创建下拉选择字段
function createSelectField(label, options, value) {
var field = $('<div>').addClass('dict-form-group');
$('<div>').addClass('dict-form-label').text(label + ':').appendTo(field);
var selectWrapper = $('<div>').addClass('dict-select-wrapper').appendTo(field);
var selectDisplay = $('<div>').addClass('dict-select')
.attr('data-value', value || options[0])
.text(value || options[0])
.appendTo(selectWrapper);
var dropdown = $('<div>').addClass('dict-dropdown').appendTo(selectWrapper);
options.forEach(function(opt) {
$('<div>').addClass('dict-option').text(opt).click(function() {
selectDisplay.text(opt).attr('data-value', opt);
dropdown.hide();
}).appendTo(dropdown);
});
selectDisplay.click(function(e) {
e.stopPropagation();
$('.dict-dropdown').hide();
dropdown.toggle();
});
$(document).click(function() {
dropdown.hide();
});
return field;
}
// 删除词条
function deleteEntry(key, index) {
if (!confirm('确定要删除这个词条吗?')) {
return;
}
dictionaryData[key].splice(index, 1);
if (dictionaryData[key].length === 0) {
delete dictionaryData[key];
}
saveDictionary();
}
// 保存词典到模块
function saveDictionary() {
var luaCode = generateLuaCode();
$.post(API_URL, {
action: 'edit',
title: 'Module:词典/data',
text: luaCode,
summary: '通过词典编辑器更新',
token: mw.user.tokens.get('csrfToken'),
format: 'json'
}).done(function(response) {
if (response.edit && response.edit.result === 'Success') {
mw.notify('保存成功!', {type: 'success'});
renderDictionary();
} else {
mw.notify('保存失败:' + (response.error ? response.error.info : '未知错误'), {type: 'error'});
}
}).fail(function() {
mw.notify('保存失败:网络错误', {type: 'error'});
});
}
// 生成Lua代码
function generateLuaCode() {
var lines = ['local data = {}', '', 'data.dictionary = {'];
var keys = Object.keys(dictionaryData).sort();
keys.forEach(function(key, keyIndex) {
lines.push(' ["' + key + '"] = {');
dictionaryData[key].forEach(function(item, itemIndex) {
lines.push(' {');
lines.push(' ["icon"] = "' + (item.icon || '') + '",');
lines.push(' ["类型"] = "' + (item['类型'] || '') + '",');
lines.push(' ["颜色"] = "' + (item['颜色'] || '') + '",');
lines.push(' ["描述"] = "' + (item['描述'] || '') + '",');
lines.push(' }' + (itemIndex < dictionaryData[key].length - 1 ? ',' : ''));
});
lines.push(' }' + (keyIndex < keys.length - 1 ? ',' : ''));
});
lines.push('}', '', 'return data', '');
return lines.join('\n');
}
// 初始化
$(function() {
loadDictionaryData();
});
})();