跳转到内容

MediaWiki:Gadget-ReferenceTooltips.js

勤求古训,博采众方
鹿野耕云留言 | 贡献2025年11月2日 (日) 15:39的版本 (创建页面,内容为“* * 参考提示工具 - 适配 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_* 覆盖…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-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 );
}() );