跳转到内容

User:ZheiZhei/test.js

来自偶像大师中文维基
ZheiZhei留言 | 贡献2025年9月17日 (三) 13:21的版本

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

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
// <nowiki>
/* globals TranslateVariants:true */
/**
 * 使用說明請見 https://zh.wikipedia.org/wiki/User:Xiplus/js/TranslateVariants
 */
Promise.all( [
	$.ready,
	mw.loader.using( [ 'ext.gadget.HanAssist', 'mediawiki.api', 'mediawiki.util', 'mediawiki.ForeignApi', 'mediawiki.diff.styles' ] ),
] ).then(
	function( [ _, require ] ) {
		const { conv } = require('ext.gadget.HanAssist');

		if (mw.config.get('wgPageName').match(/^MediaWiki:[^/]+(\/zh)?$/)) {
			let link = mw.util.addPortletLink(
				'p-cactions',
				'#',
				conv( { hans: '转换变体', hant: '轉換變體' } )
			);
			$(link).on('click', function() {
				this.remove();
				main();
			});
		} else {
			return;
		}

		if (typeof (TranslateVariants) == 'undefined') {
			TranslateVariants = {};
		}
		if (typeof (TranslateVariants.summary) != 'string') {
			TranslateVariants.summary = conv( { hans: '自动转换变体自', hant: '自動轉換變體自' } ) + '[[$1]] via [[User:Dabao_qian/TranslateVariants-zhwiki.js|TranslateVariants]]';
		}

		async function main() {
			const langs = ['zh', 'zh-hans', 'zh-cn', 'zh-my', 'zh-sg', 'zh-hant', 'zh-hk', 'zh-mo', 'zh-tw'];
			const langname = {
				'zh': '原始',
				'zh-hans': '简体',
				'zh-cn': '大陆简体',
				'zh-my': '大马简体',
				'zh-sg': '新加坡简体',
				'zh-hant': '繁體',
				'zh-hk': '香港繁體',
				'zh-mo': '澳門繁體',
				'zh-tw': '臺灣正體',
			};
			let result = {};

			var api = new mw.Api();
			var zhwpapi;
			if (mw.config.get('wgDBname') === 'zhwiki') {
				zhwpapi = new mw.Api();
			} else {
				zhwpapi = new mw.ForeignApi('//zh.wikipedia.org/w/api.php');
			}
			var basepagetext = '';
			let table = $('<div id="TranslateVariants">').prependTo('#bodyContent');

			let submitall = $('<button>' + conv( { hans: '保存所有更改', hant: '儲存所有變更' } ) + '</button>');
			submitall.on('click', function() {
				let buttons = $('.TranslateVariants-publish-changes');
				if (buttons.length === 0) {
					mw.notify(conv( { hans: '没有任何更改可保存', hant: '沒有任何變更可儲存' } ), { type: 'error' });
					return;
				}
				if (!confirm(conv( { hans: '保存 ', hant: '儲存 ' } ) + buttons.length + conv( { hans: ' 个更改?', hant: ' 個變更?' } ))) {
					mw.notify(conv( { hans: '已取消保存', hant: '已取消儲存' } ), { type: 'warn' });
					return;
				}
				buttons.each(function(_, button) {
					$(button).click();
				});
			});
			table.append($('<div style="text-align: right;">').append(submitall));

			$('<div style="color:red">' + conv( { hans: '提醒:TranslateVariants工具使用IT、MediaWiki及specialpages三个转换组进行自动转换,请确认转换结果是否正确!', hant: '提醒:TranslateVariants工具使用IT、MediaWiki及specialpages三個轉換組進行自動轉換,請確認轉換結果是否正確!' } ) + '</div>').appendTo(table);

			var defaultlangs = 'zh,zh-hans,zh-hant';
			var runlangs = prompt(conv( { hans: '转换以下语言(以逗号隔开):', hant: '轉換以下語言(以逗號隔開):' } ), defaultlangs);
			if (runlangs === null) {
				runlangs = defaultlangs;
			}

			var langqueue = runlangs.split(',').map(function(lang) {
				return lang.trim();
			}).filter(function(lang) {
				return langs.indexOf(lang) !== -1;
			});

			let text;
			if ($('#wpTextbox1').length === 1) {
				text = $('#wpTextbox1').val();
			} else {
				let data = await api.get({
					action: 'query',
					prop: 'revisions',
					rvprop: ['content', 'timestamp'],
					titles: [mw.config.get('wgPageName')],
					formatversion: '2',
					curtimestamp: true,
				});
				if (!data.query || !data.query.pages) {
					alert('unknown error');
					return;
				}
				let page = data.query.pages[0];
				if (!page || page.invalid) {
					alert('invalidtitle');
					return;
				}
				if (page.missing) {
					alert('nocreate-missing');
					return;
				}
				let revision = page.revisions[0];
				text = revision.content;
			}
			result.zh = text;

			text = text.replace(/[[\]{}<>|:*'_#&\s]/gim, function(s) {
				return "&#" + s.charCodeAt(0) + ";";
			});
			text = text.replace(/(&#91;&#91;)((?:(?!&#124;)(?!&#93;).)+?)(&#124;(?:(?!&#93;).)+?&#93;&#93;)/g, '$1-{$2}-$3');
			text = text.replace(/-&#123;(.*?)&#125;-/g, function(s) {
				return s
					.replace('-&#123;', '-{')
					.replace('&#125;-', '}-')
					.replace(/&#124;/g, '|')
					.replace(/&#32;/g, ' ')
					.replace(/&#61;/g, '=')
					.replace(/&#62;/g, '>')
					.replace(/&#58;/g, ':');
			});
			basepagetext = text;
	
			process();

			function process() {
				if (langqueue.length === 0) {
					return;
				}

				var lang = langqueue.shift();
				var diffTable = $('<div id="TranslateVariants-diff-' + lang + '">').appendTo(table);
				$('<hr>').appendTo(table);

				const basename = mw.config.get('wgPageName').replace(/\/zh$/, '');
				var targetTitle;
				if (lang == 'zh') {
					targetTitle = basename + '';
				} else {
					targetTitle = basename + '/' + lang;
				}

				var contentlang, newtext;
				if (lang == 'zh') {
					contentlang = 'zh-cn';
				} else if (lang == 'zh-hans') {
					contentlang = 'zh-cn';
				} else if (lang == 'zh-hant') {
					contentlang = 'zh-tw';
				} else {
					contentlang = lang;
				}

				zhwpapi.parse(
					'{{NoteTA|G1=IT|G2=MediaWiki|G3=specialpages}}<div id="TVcontent">' + basepagetext + '</div>',
					{
						'uselang': contentlang,
						'prop': 'text',
					}
				).then(function(data) {
					newtext = $('<div/>').html(data).find('#TVcontent').text();

					return api.post({
						action: 'query',
						prop: 'revisions',
						titles: [targetTitle],
						rvdifftotext: newtext,
						formatversion: '2',
					});
				}, function(err) {
					mw.notify('解析' + lang + conv( { hans: '时发生错误:', hant: '時發生錯誤:' } ) + err);
				}).then(function(data) {
					let tool = $('<div><a href="' + mw.util.getUrl(targetTitle) + '">' + lang + '(' + langname[lang] + ')</a>(<a href="' + mw.util.getUrl(targetTitle, { action: 'edit' }) + '">' + conv( { hans: '编', hant: '編' } ) + '</a>)</div>').appendTo(diffTable);
					let page = data.query.pages[0];
					if (page.missing) {
						let submit = $('<button style="float: right;">' + conv( { hans: '保存页面', hant: '儲存頁面' } ) + '</button>').appendTo(tool);
						submit.on('click', function() {
							this.remove();
							api.create(
								targetTitle,
								{ summary: TranslateVariants.summary.replace(/\$1/g, mw.config.get('wgPageName')) },
								newtext
							).then(function() {
								mw.notify(conv( { hans: '已编辑 ', hant: '已編輯 ' } ) + targetTitle);
							}, function(e) {
								mw.notify(conv( { hans: '编辑 ', hant: '編輯 ' } ) + targetTitle + conv( { hans: ' 发生错误:', hant: ' 發生錯誤:' } ) + e);
							});
						});
						$('<pre>').html(newtext.replace(/[<>&]/gim, function(s) {
							return "&#" + s.charCodeAt(0) + ";";
						})).appendTo(diffTable);
						return;
					}
					let diff = page.revisions[0].diff.body;
					if (diff == '') {
						$('<span style="float: right;">' + conv( { hans: '无更改', hant: '無變更' } ) + '</span>').appendTo(tool);
					} else {
						let submit = $('<button class="TranslateVariants-publish-changes" style="float: right;">' + conv( { hans: '保存更改', hant: '儲存變更' } ) + '</button>').appendTo(tool);
						submit.on('click', function() {
							this.remove();
							api.edit(
								targetTitle,
								function() {
									return {
										text: newtext,
										summary: TranslateVariants.summary.replace(/\$1/g, mw.config.get('wgPageName')),
										nocreate: false,
									};
								}
							).then(function() {
								mw.notify(conv( { hans: '已编辑 ', hant: '已編輯 ' } ) + targetTitle);
							}, function(e) {
								mw.notify(conv( { hans: '编辑 ', hant: '編輯 ' } ) + targetTitle + conv( { hans: ' 发生错误:', hant: ' 發生錯誤:' } ) + e);
							});
						});
						$('<table class="diff">').html(diff).prepend('<colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup>').appendTo(diffTable);
					}
				}, function(err) {
					mw.notify(conv( { hans: '获取', hant: '取得' } ) + lang + conv( { hans: '差异时发生错误:', hant: '差異時發生錯誤:' } ) + err);
				}).always(function() {
					process();
				});
			}
		}

	},
);
// </nowiki>