MediaWiki:Gadget-defaultsummaries.js
外观
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
(() => {
'use strict';
const SUMMARY_OPTIONS = [
'新条目',
'修饰语句',
'修正笔误',
'内容扩充',
'排版(调整格式)',
'图片(添加/修改/删除)', // 补充第一段的高频选项
'模板(添加/调整)', // 补充第一段的高频选项
'来源(增加/调整参考资料)',
'内部链接(增加/调整)',
'分类(增加/调整)',
'消歧义',
'维基化(适配维基格式)',
'维护清理',
'回退(撤销错误编辑)' // 补充第一段的高频选项
];
// 样式调整:移除圆角,贴近MediaWiki原生风格(方角、浅灰背景、无阴影)
const STYLES = {
dropdownContainer: {
width: '100%',
margin: '6px 0', // 原生控件常见间距
fontSize: '0.9em' // 匹配原生文字大小
},
dropdown: `
.summary-helper-dropdown .oo-ui-dropdownWidget-handle {
border: 1px solid #aaa; /* 原生控件边框色 */
padding: 3px 8px; /* 紧凑内边距,贴近原生 */
background: #f8f9fa; /* 原生浅灰背景 */
transition: border-color 0.2s; /* 仅保留边框过渡 */
}
.summary-helper-dropdown .oo-ui-dropdownWidget-handle:hover {
border-color: #777; /* hover时边框加深,原生常见效果 */
background: #f0f0f0;
}
.summary-helper-dropdown .oo-ui-menuOptionWidget {
padding: 4px 10px; /* 原生选项间距 */
color: #000; /* 原生文字色 */
}
.summary-helper-dropdown .oo-ui-menuOptionWidget:hover {
background: #e5f1ff; /* 维基原生hover浅蓝 */
color: #0645ad; /* 维基链接蓝,保持一致性 */
}
.summary-helper-dropdown .oo-ui-menuOptionWidget.oo-ui-selected {
background: #c8e4fd; /* 选中时稍深的蓝色,贴近原生选中态 */
}
`
};
class SummaryHelper {
constructor() {
this.summaryBox = $('#wpSummary');
this.initialized = false;
this.init();
}
init() {
if (this.initialized) return;
this.injectStyles();
this.setupVisualEditorHook();
this.setupWikiEditor();
this.initialized = true;
}
injectStyles() {
const style = document.createElement('style');
style.textContent = STYLES.dropdown;
document.head.appendChild(style);
}
setupVisualEditorHook() {
mw.hook('ve.saveDialog.stateChanged').add(() => {
if ($('body').hasClass('has-summary-dropdowns')) return;
const target = ve.init.target;
const $saveOptions = target.saveDialog.$saveOptions;
this.summaryBox = target.saveDialog.editSummaryInput.$input;
if (!$saveOptions.length) return;
$('body').addClass('has-summary-dropdowns');
$saveOptions.before(this.createDropdown());
});
}
setupWikiEditor() {
Promise.all([
mw.loader.using('oojs-ui-core'),
$.ready
]).then(() => {
const $editCheckboxes = $('.editCheckboxes');
if (!$editCheckboxes.length) return;
$editCheckboxes.before(
this.createDropdown().css(STYLES.dropdownContainer)
);
});
}
createDropdown() {
const dropdown = new OO.ui.DropdownWidget({
label: '快捷摘要', // 更贴近原生控件的标题
classes: ['summary-helper-dropdown']
});
dropdown.menu.on('select', this.handleSummarySelect.bind(this));
this.addOptionsToDropdown(dropdown, SUMMARY_OPTIONS);
return dropdown.$element;
}
addOptionsToDropdown(dropdown, optionTexts) {
dropdown.menu.addItems(
optionTexts.map(text => new OO.ui.MenuOptionWidget({ label: text }))
);
}
// 保留轻量反馈,避免突兀
handleSummarySelect(option) {
const originalValue = this.summaryBox.val();
const newSummary = originalValue.length && !originalValue.endsWith(' ')
? `${originalValue} ${option.getLabel()}`
: originalValue + option.getLabel();
this.summaryBox.val(newSummary).trigger('change');
// 弱化反馈:仅轻微高亮边框,更贴近原生
this.summaryBox.css('border-color', '#72b3ff');
setTimeout(() => {
this.summaryBox.css('border-color', '');
}, 400);
}
}
$(() => new SummaryHelper());
})();