User:ZheiZhei/test.js:修订间差异

来自偶像大师中文维基
跳转到导航 跳转到搜索
无编辑摘要
无编辑摘要
第1行: 第1行:
/*
// <nowiki>
载入该插件后,将对wikitext语法所使用的符号和html标签进行成对的补全。
/* globals TranslateVariants:true */
该插件并不会计算整个源代码中的html标签配对情况,标签的补全仅发生在输入大于号(>)时,补全距离最近的html标签。
/**
在输入无其他信息的标签后(如:<div></div>),若按下退格(backspace)键,可以直接删除这一组标签。
* 使用說明請見 https://zh.wikipedia.org/wiki/User:Xiplus/js/TranslateVariants
注意:因为每次输入时都会对整个源代码进行查找匹配,为了防止卡顿,默认限制为500个字符,但这会导致当标签过长(例如在节点上添加了大量css代码)时,无法自动补全。
*/
过长的源代码会使输入时性能大幅下降,造成卡顿。当总字符数大于20000时,将自动关闭补全,请合理使用段落编辑的功能。
Promise.all( [
*/
$.ready,
mw.loader.using( [ 'ext.gadget.HanAssist', 'mediawiki.api', 'mediawiki.util', 'mediawiki.ForeignApi', 'mediawiki.diff.styles' ] ),
$(function(){
] ).then(
    if(/action=(edit|submit)/.test(location.href)){
function( [ _, require ] ) {
    var wpText = $('#wpTextbox1')
const { conv } = require('ext.gadget.HanAssist');
    console.log("Reloaded")
 
    if(wpText.val().length > 20000){
if (mw.config.get('wgPageName').match(/^MediaWiki:[^/]+(\/zh)?$/)) {
    mw.notify('因源代码过长,补全功能被关闭!', { type : 'warn' })
let link = mw.util.addPortletLink(
    return
'p-cactions',
    }
'#',
   
conv( { hans: '转换变体', hant: '轉換變體' } )
var retrospect = 500
);
var pattern = [
$(link).on('click', function() {
['-{', '}-'],
this.remove();
['[', ']'],
main();
['{', '}'],
});
["'", "'"],
} else {
['"', '"'],
return;
['(', ')'],
}
['<!--', '-->']
 
]
if (typeof (TranslateVariants) == 'undefined') {
TranslateVariants = {};
    //光标后插入信息
}
    function insertText(obj, str){
if (typeof (TranslateVariants.summary) != 'string') {
var content = obj.value,
TranslateVariants.summary = conv( { hans: '自动转换变体自', hant: '自動轉換變體自' } ) + '[[$1]] via [[User:Dabao_qian/TranslateVariants-zhwiki.js|TranslateVariants]]';
position = obj.selectionEnd,
}
left = content.substring(0, position),
 
right = content.substring(position)
async function main() {
obj.value = left + str + right
const langs = ['zh', 'zh-hans', 'zh-cn', 'zh-my', 'zh-sg', 'zh-hant', 'zh-hk', 'zh-mo', 'zh-tw'];
    }
const langname = {
'zh': '原始',
var original = null
'zh-hans': '简体',
wpText.one('click', function(){
'zh-cn': '大陆简体',
original = {
'zh-my': '大马简体',
code : wpText.val(),
'zh-sg': '新加坡简体',
start : wpText[0].selectionStart,
'zh-hant': '繁體',
end : wpText[0].selectionEnd
'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();
var end = 0,
 
thisLength = 0,
function process() {
lastLength = 0,
if (langqueue.length === 0) {
code = '',
return;
thisCode = '',
}
deletedKeyword = '',
 
var lang = langqueue.shift();
// 需要暂停补全的状态
var diffTable = $('<div id="TranslateVariants-diff-' + lang + '">').appendTo(table);
typewritingMode = false,
$('<hr>').appendTo(table);
cutPaste = false,
 
selectInput = false,
const basename = mw.config.get('wgPageName').replace(/\/zh$/, '');
selectDelete = false,
var targetTitle;
inputFinish = false
if (lang == 'zh') {
targetTitle = basename + '';
var codeSave = [{
} else {
code : wpText.val(),
targetTitle = basename + '/' + lang;
start : wpText[0].selectionStart,
end : wpText[0].selectionEnd
}],
inputMark = false
    function selectionReset(){
        end = wpText[0].selectionEnd
        lastLength = wpText.val().length
}
    wpText.click(function(){
        selectionReset()
    }).keyup(function(e){
        if(e.keyCode > 36 && e.keyCode < 41){
            selectionReset()
            code = ''
        }
    }).on('keydown keyup', function(e){
if(e.keyCode == 8){
var subStart = (this.selectionEnd - 1) < 0 ? 0 : (this.selectionEnd - 1)
var left = thisCode.substring(subStart, this.selectionEnd)
deletedKeyword = left
selectionReset()
}
}).on('compositionstart', function(){
typewritingMode = true
}).on('compositionend', function(){
typewritingMode = false
            inputFinish = true
            $(this).trigger('input')
            selectionReset()
}).on('cut paste', function(){
cutPaste = true
codeSave.push({
code : wpText.val(),
start : wpText[0].selectionStart,
end : wpText[0].selectionEnd
})
inputMark = false
setTimeout(selectionReset, 0)
}).on('keydown', function(e){
selectInput = !! document.getSelection().toString()
if(selectInput){ end = wpText[0].selectionStart}
if(selectInput && (e.keyCode == 8 || e.keyCode == 46)){ selectDelete = true }
}).on('input', function(){
;(function(_this){
                if(typewritingMode){ return }
                if(inputFinish){ inputFinish = false; return }
if(cutPaste){ cutPaste = false; return }
if(selectDelete){ selectDelete = false; return }
        thisCode = $(_this).val()
        var right = thisCode.substring(end)
        thisLength = $(_this).val().length
        if(thisLength - lastLength == 1 || selectInput){
code += right.substring(0, 1)
        }else{
            code = ''
           
            if(lastLength - thisLength == 1){
            var subStart = (_this.selectionEnd - 20) < 0 ? 0 : (_this.selectionEnd - 20),
            subEnd = (_this.selectionEnd + 20) > thisLength ? thisLength : (_this.selectionEnd + 20)
           
            var subLeft = thisCode.substring(0, subStart),
            subRight = thisCode.substring(subEnd)
           
            var left = thisCode.substring(subStart, _this.selectionEnd),
            right = thisCode.substring(_this.selectionEnd, subEnd),
            leftRE = /([\s\S]*)<(.+)$/,
rightRE = /^\'<\/(.+?)>([\s\S]*)/
            var tagLeft = left.replace(leftRE, '$2')
var tagRight = right.replace(rightRE, '$1')
            if(tagLeft == tagRight){
            var leftCode = left.replace(leftRE, '$1')
            var rightCode = right.replace(rightRE, '$2')
            $(_this).val(subLeft + leftCode + rightCode + subRight)
            var cursorPos = new String(subLeft + leftCode).length
            _this.selectionStart = _this.selectionEnd = cursorPos
            }
$.each(pattern, function(){
var $this = wpText[0]
if(lastLength - thisLength == 1){
var subStart = $this.selectionEnd < 0 ? 0 : $this.selectionEnd
var subEnd = ($this.selectionEnd + 1) > thisLength ? thisLength : ($this.selectionEnd + 1)
$this.selectionEnd == subEnd && subEnd++
var subLeft = thisCode.substring(0, $this.selectionEnd),
subRight = thisCode.substring(subEnd)
var left = thisCode.substring(subStart, $this.selectionEnd),
right = thisCode.substring($this.selectionEnd, subEnd)
if(deletedKeyword == this[0] && right == this[1]){
$($this).val(subLeft + subRight)
$this.selectionStart = $this.selectionEnd = subLeft.length
selectionReset()
}
}
})
            }
           
        }
        function pair(keyword, char, num){
            if(code.indexOf(keyword) != -1){
var num = num || char.length
var position = wpText[0].selectionEnd
                insertText(wpText[0], char)
                wpText[0].selectionStart = wpText[0].selectionEnd = position
                selectionReset()
                code = ''
            }
        }
 
        function addPair(arr){
        $.each(arr, function(){
pair(this[0], this[1], this[2])
})
        }
            selectionReset()
        addPair(pattern)
           
// 配对标签
            if(code.indexOf('>') != -1){
            var start = (end - retrospect) < 0 ? 0 : (end - retrospect)
                var left = wpText.val().substring(start, end)
                var ptn = /[\s\S]*<((?!br|hr|img|references|templatestyles|\!--|\/|\>)[^\s<>]+)[^>]*?>$/
                if(ptn.test(left)){
var tagEnd = '</' + left.replace(ptn, '$1') + '>'
var position = wpText[0].selectionEnd
                    insertText(wpText[0], tagEnd)
                wpText[0].selectionStart = wpText[0].selectionEnd = position
                    selectionReset()
                    code = ''                      
                }                
            }
})(this)
           
codeSave.push({
code : wpText.val(),
start : wpText[0].selectionStart,
end : wpText[0].selectionEnd
})
inputMark = true           
input = false
})
wpText.on('keydown', function(e){
if(e.ctrlKey && e.keyCode == 90){
e.preventDefault()
if(inputMark){
codeSave.pop()
inputMark = false
}
}
var history = codeSave.pop() || original
 
if(history){
var contentlang, newtext;
wpText.val(history.code).focus()
if (lang == 'zh') {
wpText[0].selectionStart = history.start
contentlang = 'zh-cn';
wpText[0].selectionEnd = history.end
} 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>

2025年9月17日 (三) 13:21的版本

// <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>