跳转到内容

维基百科讨论:HanAssist

页面内容不支持其他语言。
添加话题
维基百科,自由的百科全书
Dabao qian在话题“在其他wiki上使用”中的最新留言:21天前

HanAssist第四版

[编辑]
下列討論已經關閉,請勿修改。如有任何意見,請在合適的討論頁提出,而非再次編輯本討論。

HanAssist是一个wgULS及类似函数的替代品。旧版本文档请参见Wikipedia:HanAssist。 仓库地址:https://github.com/diskdance/HanAssist 第四版API本体变化不大,主要是调用方式:

  1. 杜绝了污染全局空间的问题。原先API会暴露到全局空间(mw.libs),现在采用了ResourceLoader的模块化设计。小工具需要先添加HanAssist的依赖,然后按照如下方式使用:
    const { conv, convByVar, batchConv } = require('ext.gadget.HanAssist'); // 注意大小写
    // 对应wgULS
    conv( { hans: '一天一苹果,医生远离我。', hant: '一天一蘋果,醫生遠離我。' } );
    // 对应wgUVS
    convByVar( { hans: '一天一苹果,医生远离我。', hant: '一天一蘋果,醫生遠離我。' } );
    // 批量处理
    mw.messages.set( batchConv( {
    	'article': { hans: '条目', hant: '條目' },
    	'category': { hans: '分类', hant: '分類' },
    	'categories': { hans: '分类', hant: '分類' },
    	'image': { hans: '文件', hant: '檔案' },
    	'images': { hans: '文件', hant: '檔案' },
    	'minute': '分',
    	'minutes': '分',
    	'second': '秒',
    	'seconds': '秒',
    	'week': '周',
    	'weeks': '周',
    	'search': { hans: '搜索', hant: '搜尋' },
    	'SearchHint': { hans: '搜索包含$1的页面', hant: '搜尋包含$1的頁面' },
    	'web': { hans: '站点', hant: '站點' },
    } ) );
    mw.msg( 'categories' );
    mw.msg( 'SearchHint', 'Apple' );
    
    用户脚本则需要动态加载:
    mw.loader.using( 'ext.gadget.HanAssist' ).then( ( require ) => {
    	const { conv, convByVar } = require( 'ext.gadget.HanAssist' );
    	// 在此处使用
    } );
    
    其他的加载方式不保证可用。
  2. 函数采用更直观的命名方式。
  3. 现在在传入不合法的参数的时候会给出警告信息。

以上。--碟之舞📀💿 2023年7月26日 (三) 10:20 (UTC)回复

小工具已经部署到中文Beta Cluster,各位可以先试试效果。--碟之舞📀💿 2023年7月26日 (三) 10:22 (UTC)回复
“其他的加载方式不保证可用。”意味着旧脚本需要维护更新?会有人来做吗。--YFdyh000(留言) 2023年7月26日 (三) 15:22 (UTC)回复
不是这个意思。--碟之舞📀💿 2023年7月27日 (四) 03:33 (UTC)回复
(-)反对,使用v4的載入法將導致該腳本必須以非常糟糕的方式(技術細節:v4載入法必然需要將HanAssist注入ResourceLoader才能使用,變成如果要在無此小工具的站點載入將必須汙染ResourceLoader)才能被站外引用,這顯然不是一個合適的作法--SunAfterRain 2023年7月27日 (四) 15:15 (UTC)回复
@SunAfterRain:已经解决。--碟之舞📀💿 2023年7月28日 (五) 04:38 (UTC)回复
(+)支持--Taeas(留言) 2023年7月28日 (五) 05:36 (UTC)回复
上方所述的问题已经解决,如果没有问题的话能否开始公示?--碟之舞📀💿 2023年8月2日 (三) 13:21 (UTC)回复
我觉得可以。--Taeas(留言) 2023年8月3日 (四) 02:04 (UTC)回复
部署方案:
  1. 从中文维基百科测试集群处复制此小工具的源代码和小工具定义。
  2. 移除site-lib中wgU*S的相关内容,由HanAssist接管,可参考测试集群配置。
  3. 将ext.gadget.HanAssist添加为site-lib的依赖项。
公示7日,2023年8月11日 (五) 03:44 (UTC) 結束,抄送@Xiplus、@安忆
以上。--碟之舞📀💿 2023年8月4日 (五) 03:43 (UTC)回复
公示结束且期间无异议。--碟之舞📀💿 2023年8月11日 (五) 03:58 (UTC)回复
MediaWiki_talk:Gadget-HanAssist.js#編輯請求_2023-08-11。--碟之舞📀💿 2023年8月11日 (五) 04:06 (UTC)回复
@Xiplus、@AnYiLin:见上。--碟之舞📀💿 2023年8月11日 (五) 04:08 (UTC)回复

本討論已關閉,請勿修改。如有任何意見,請在合適的討論頁提出,而非再次編輯本討論。

在其他wiki上使用

[编辑]

有些wiki项目(例如中文维基教科书)仍然采用老旧的wgU*S作为脚本字词转换系统,如果在这些项目上按照文档中的用法直接跨站加载中文维基百科的HanAssist,则用户工具就会因为无法改写wgULS全局变量而报错退出。针对这种跨维基使用的脚本,目前建议的做法是自行加载SunAfterRain放在元维基的HanAssist分支版本。例如:

function implWrapper( ...args ) {
	if ( typeof mw.loader.impl === 'function' ) {
		return mw.loader.impl( function () {
			return args;
		} );
	}

	return mw.loader.implement.apply( mw.loader, args );
}
async function loadHanAssist() {
	const moduleName = 'userscript.MyGadget.HanAssist';

	if ( mw.loader.getState( 'ext.gadget.HanAssist' ) ) {
		mw.loader.register( moduleName, null, [ 'ext.gadget.HanAssist' ] );

		await mw.loader.using( 'ext.gadget.HanAssist' );

		implWrapper(
			moduleName + '@',
			{
				main: 'index.js',
				files: {
					'index.js': ( require, module ) => {
						module.exports = require( 'ext.gadget.HanAssist' );
					}
				}
			}
		);

		if ( mw.loader.getState( moduleName ) === 'missing' ) {
			mw.loader.state( { [ moduleName ]: 'loaded' } );
		}
	} else {
		mw.loader.register( moduleName, null, [] );

		implWrapper(
			moduleName + '@',
			[ 'https://meta.wikimedia.org/w/index.php?title=User:SunAfterRain/js/HanAssist.js&action=raw&ctype=text/javascript' ]
		);

		await mw.loader.using( moduleName );
	}

	const require = await mw.loader.using( moduleName );

	return require( moduleName );
}
( async () => {
	const { conv } = await loadHanAssist();
	// 在此处使用
} )();

(这里的内容就当我随手记的笔记吧)--Dabao qian℡ 2026年10月18日 (日) 19:30 (UTC)回复

@Dabao qian:千萬別學我去hack mw.loader啊,mw.loader.register、mw.loader.state、mw.loader.impl(及以前的mw.loader.implement)都是private api啊 囧rz……--SunAfterRain 2026年10月19日 (一) 16:28 (UTC)回复
改成原生fetch就可以确保100%不污染RL以及不使用私有API。--Dabao qian℡ 2026年10月21日 (三) 21:22 (UTC)回复