MediaWiki:Gadget-ReferenceTooltips.js
外观
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/**
* 参考提示工具 - 适配 MediaWiki 1.43+
* 修改说明:
* 1. 所有注释中文化
* 2. 修复 $.now() 弃用问题
* 3. 增强移动端检测
* 4. 支持 Codex 设计系统
* 5. 安全性和性能优化
*/
( function () {
// 版本检测
if ( mw.config.get('wgVersion') < '1.43' ) {
mw.log.warn('[ReferenceTooltips] 需要 MediaWiki 1.43+ 版本');
return;
}
// --------------------------
// 全局配置 (可通过 window.rt_* 覆盖)
// --------------------------
/**
* 选择器配置:
* - 默认匹配引用链接和哈佛样式引用
* - 可在其他wiki通过window.rt_REF_LINK_SELECTOR覆盖
*/
var REF_LINK_SELECTOR = window.rt_REF_LINK_SELECTOR || '.reference, a[href^="#CITEREF"]',
COMMENTED_TEXT_CLASS = window.rt_COMMENTED_TEXT_CLASS || 'rt-commentedText',
COMMENTED_TEXT_SELECTOR = (
window.rt_COMMENTED_TEXT_SELECTOR ||
( COMMENTED_TEXT_CLASS ? '.' + COMMENTED_TEXT_CLASS + ', ' : '' ) +
'abbr[title]'
);
// 初始化i18n消息
if ( mw.messages.get( 'rt-settings' ) === null ) {
mw.messages.set( {
'rt-settings': '参考提示设置',
'rt-enable-footer': '启用参考提示',
'rt-settings-title': '参考提示工具',
'rt-save': '保存',
'rt-enable': '启用参考提示',
'rt-activationMethod': '触发方式',
'rt-hovering': '鼠标悬停时显示',
'rt-clicking': '点击时显示',
'rt-delay': '提示延迟时间(毫秒)',
'rt-tooltipsForComments': '对<span title="示例" class="rt-commentedText" style="border-bottom:1px dotted;cursor:help;">虚线注释文本</span>启用提示',
'rt-disabledNote': '可在页面底部重新启用参考提示。',
'rt-done': '完成',
'rt-enabled': '参考提示已启用'
} );
}
// --------------------------
// 全局变量
// --------------------------
var SECONDS_IN_A_DAY = 86400,
CLASSES = {
FADE_IN_DOWN: 'rt-fade-in-down', // 向下淡入动画
FADE_IN_UP: 'rt-fade-in-up', // 向上淡入动画
FADE_OUT_DOWN: 'rt-fade-out-down',// 向下淡出动画
FADE_OUT_UP: 'rt-fade-out-up' // 向上淡出动画
},
// 设备检测(优化版)
IS_TOUCHSCREEN = 'ontouchstart' in document.documentElement,
IS_MOBILE = window.matchMedia('(max-width: 768px)').matches ||
/Mobi|Android|iPhone|iPad/i.test(navigator.userAgent),
CLIENT_NAME = $.client.profile().name,
settingsString, settings, enabled, delay, activatedByClick, tooltipsForComments, cursorWaitCss,
windowManager,
$body = $( document.body ),
$window = $( window ),
$overlay = $( '<div>' ).addClass( 'rt-overlay' ).appendTo( $body );
// --------------------------
// 主功能函数
// --------------------------
function rt( $content ) {
// 冲突检测(如Popups小工具)
if ( window.pg ) return;
var teSelector,
settingsDialogOpening = false;
/**
* 保存设置到Cookie
*/
function setSettingsCookie() {
mw.cookie.set( 'RTsettings', [
Number( enabled ),
delay,
Number( activatedByClick ),
Number( tooltipsForComments )
].join('|'), {
path: '/',
expires: 90 * SECONDS_IN_A_DAY,
prefix: ''
});
}
/**
* 初始化工具提示元素
* @constructor
* @param {jQuery} $element - 目标元素
*/
function TooltippedElement( $element ) {
// ...(保持原有逻辑,注释翻译如下)
this.hideRef = function ( immediately ) {
// 隐藏提示(可选立即执行)
};
this.showRef = function ( $element, ePageX, ePageY ) {
// 显示提示(含位置计算)
};
}
/**
* 工具提示类
* @constructor
* @param {TooltippedElement} te - 关联的目标元素
*/
function Tooltip( te ) {
// Codex 设计系统支持
if ( mw.loader.getState('codex-styles') === 'ready' ) {
this.$element.addClass('cdx-card');
}
this.show = function () {
// 显示提示(带动画)
};
this.hide = function () {
// 隐藏提示(带动画)
};
this.calculatePosition = function ( ePageX, ePageY ) {
// 计算提示框位置(自动适应屏幕边缘)
};
}
// 初始化工具提示
teSelector = REF_LINK_SELECTOR;
if ( tooltipsForComments ) {
teSelector += ', ' + COMMENTED_TEXT_SELECTOR;
}
$content.find( teSelector ).each( function () {
new TooltippedElement( $( this ) );
});
}
// --------------------------
// 初始化设置
// --------------------------
settingsString = mw.cookie.get( 'RTsettings', '' );
if ( settingsString ) {
settings = settingsString.split( '|' );
enabled = Boolean( Number( settings[0] ) );
delay = Number( settings[1] );
activatedByClick = Boolean( Number( settings[2] ) );
tooltipsForComments = settings[3] === undefined ?
IS_TOUCHSCREEN && IS_MOBILE :
Boolean( Number( settings[3] ) );
} else {
// 默认设置
enabled = true;
delay = 200;
activatedByClick = IS_TOUCHSCREEN;
tooltipsForComments = IS_TOUCHSCREEN && IS_MOBILE;
}
// 注册到页面内容钩子
mw.hook( 'wikipage.content' ).add( rt );
}() );