<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-PreviewWithVariant2017.js</id>
	<title>MediaWiki:Gadget-PreviewWithVariant2017.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-PreviewWithVariant2017.js"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=MediaWiki:Gadget-PreviewWithVariant2017.js&amp;action=history"/>
	<updated>2026-07-12T11:18:59Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=MediaWiki:Gadget-PreviewWithVariant2017.js&amp;diff=3756391&amp;oldid=prev</id>
		<title>imported&gt;AnYiLin 来自 2023年12月31日 (日) 08:31</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=MediaWiki:Gadget-PreviewWithVariant2017.js&amp;diff=3756391&amp;oldid=prev"/>
		<updated>2023-12-31T08:31:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * @file Allow user to preview with different variant in the 2017 wikitext editor.&lt;br /&gt;
 * Note that this file&amp;#039;s implementation is a bit hacky, and if it is broken in the&lt;br /&gt;
 * future, please be bold to remove or fix it.&lt;br /&gt;
 * @author [[zh:User:Diskdance]]&lt;br /&gt;
 * @license MIT&lt;br /&gt;
 */&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
	var batchConv = require( &amp;#039;ext.gadget.HanAssist&amp;#039; ).batchConv;&lt;br /&gt;
	var DATA = [&lt;br /&gt;
		{ var: &amp;#039;zh&amp;#039;, htmlLang: &amp;#039;zh&amp;#039;, msg: &amp;#039;pwv-2017-zh&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-hans&amp;#039;, htmlLang: &amp;#039;zh-Hans&amp;#039;, msg: &amp;#039;pwv-2017-zh-hans&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-hant&amp;#039;, htmlLang: &amp;#039;zh-Hant&amp;#039;, msg: &amp;#039;pwv-2017-zh-hant&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-cn&amp;#039;, htmlLang: &amp;#039;zh-Hans-CN&amp;#039;, msg: &amp;#039;pwv-2017-zh-cn&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-hk&amp;#039;, htmlLang: &amp;#039;zh-Hant-HK&amp;#039;, msg: &amp;#039;pwv-2017-zh-hk&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-mo&amp;#039;, htmlLang: &amp;#039;zh-Hant-MO&amp;#039;, msg: &amp;#039;pwv-2017-zh-mo&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-my&amp;#039;, htmlLang: &amp;#039;zh-Hans-MY&amp;#039;, msg: &amp;#039;pwv-2017-zh-my&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-sg&amp;#039;, htmlLang: &amp;#039;zh-Hans-SG&amp;#039;, msg: &amp;#039;pwv-2017-zh-sg&amp;#039; },&lt;br /&gt;
		{ var: &amp;#039;zh-tw&amp;#039;, htmlLang: &amp;#039;zh-Hant-TW&amp;#039;, msg: &amp;#039;pwv-2017-zh-tw&amp;#039; }&lt;br /&gt;
	];&lt;br /&gt;
	var isInitialized = false;&lt;br /&gt;
&lt;br /&gt;
	mw.messages.set( batchConv( {&lt;br /&gt;
		&amp;#039;pwv-2017-caption&amp;#039;: { hans: &amp;#039;选择语言变体&amp;#039;, hant: &amp;#039;選擇語言變體&amp;#039; },&lt;br /&gt;
		&amp;#039;pwv-2017-zh&amp;#039;: { hans: &amp;#039;不转换&amp;#039;, hant: &amp;#039;不轉換&amp;#039; },&lt;br /&gt;
		&amp;#039;pwv-2017-zh-hans&amp;#039;: &amp;#039;简体&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-hant&amp;#039;: &amp;#039;繁體&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-cn&amp;#039;: &amp;#039;大陆简体&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-hk&amp;#039;: &amp;#039;香港繁體&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-mo&amp;#039;: &amp;#039;澳門繁體&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-my&amp;#039;: &amp;#039;大马简体&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-sg&amp;#039;: &amp;#039;新加坡简体&amp;#039;,&lt;br /&gt;
		&amp;#039;pwv-2017-zh-tw&amp;#039;: &amp;#039;臺灣正體&amp;#039;&lt;br /&gt;
	} ) );&lt;br /&gt;
&lt;br /&gt;
	function PendingStackLayout( config ) {&lt;br /&gt;
		PendingStackLayout.super.call( this, config );&lt;br /&gt;
		OO.ui.mixin.PendingElement.call( this );&lt;br /&gt;
		this.$element.addClass( &amp;#039;pwv-2017-pendingStackLayout&amp;#039; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	OO.inheritClass( PendingStackLayout, OO.ui.StackLayout );&lt;br /&gt;
	OO.mixinClass( PendingStackLayout, OO.ui.mixin.PendingElement );&lt;br /&gt;
&lt;br /&gt;
	function entryPoint() {&lt;br /&gt;
		var variant, target, dialog, dropdown, stackLayout,&lt;br /&gt;
			panelLayouts, windowManager, errorDialog;&lt;br /&gt;
&lt;br /&gt;
		function constructDocument( title, wikitext, categories ) {&lt;br /&gt;
			var $result = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;mw-body mw-body-content&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
			if ( mw.config.get( &amp;#039;skin&amp;#039; ) === &amp;#039;vector&amp;#039; ) {&lt;br /&gt;
				// Additional classes required in vector to get correct appearance&lt;br /&gt;
				$result.addClass( &amp;#039;vector-body&amp;#039; );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$result.append(&lt;br /&gt;
				$( &amp;#039;&amp;lt;h1&amp;gt;&amp;#039; ).addClass( &amp;#039;firstHeading&amp;#039; ).html( title ),&lt;br /&gt;
				// Classes used here:&lt;br /&gt;
				// * mw-content-ltr&lt;br /&gt;
				// * mw-content-rtl&lt;br /&gt;
				$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
					.addClass( &amp;#039;mw-content-&amp;#039; + mw.config.get( &amp;#039;wgVisualEditor&amp;#039; ).pageLanguageDir )&lt;br /&gt;
					.attr(&lt;br /&gt;
						&amp;#039;lang&amp;#039;,&lt;br /&gt;
						DATA.filter( function ( item ) {&lt;br /&gt;
							return item.var === variant;&lt;br /&gt;
						} )[ 0 ].htmlLang&lt;br /&gt;
					)&lt;br /&gt;
					.html( wikitext ),&lt;br /&gt;
				$.parseHTML( categories )&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			// Make other things like Reference Tooltip function&lt;br /&gt;
			mw.hook( &amp;#039;wikipage.content&amp;#039; ).fire( $result );&lt;br /&gt;
			ve.targetLinksToNewWindow( $result[ 0 ] );&lt;br /&gt;
			return $result;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function fetchPreview() {&lt;br /&gt;
			var deferred = $.Deferred();&lt;br /&gt;
			// Currently (Aug 2021), Parsoid API does not have full LC functionality,&lt;br /&gt;
			// hence use parse API instead.&lt;br /&gt;
			target.getContentApi().post( {&lt;br /&gt;
				action: &amp;#039;parse&amp;#039;,&lt;br /&gt;
				disableeditsection: true,&lt;br /&gt;
				errorformat: &amp;#039;html&amp;#039;,&lt;br /&gt;
				errorlang: mw.config.get( &amp;#039;wgUserLanguage&amp;#039; ),&lt;br /&gt;
				errorsuselocal: true,&lt;br /&gt;
				formatversion: 2,&lt;br /&gt;
				prop: &amp;#039;text|indicators|displaytitle|categorieshtml|parsewarningshtml&amp;#039;,&lt;br /&gt;
				pst: true,&lt;br /&gt;
				preview: true,&lt;br /&gt;
				title: target.getPageName(),&lt;br /&gt;
				text: target.getDocToSave(),&lt;br /&gt;
				uselang: mw.config.get( &amp;#039;wgUserLanguage&amp;#039; ),&lt;br /&gt;
				variant: variant&lt;br /&gt;
			} ).then(&lt;br /&gt;
				function ( response ) {&lt;br /&gt;
					deferred.resolve( constructDocument(&lt;br /&gt;
						response.parse.displaytitle,&lt;br /&gt;
						response.parse.text,&lt;br /&gt;
						response.parse.categorieshtml&lt;br /&gt;
					) );&lt;br /&gt;
				},&lt;br /&gt;
				function ( errorCode, detail ) {&lt;br /&gt;
					deferred.reject( detail );&lt;br /&gt;
				} );&lt;br /&gt;
			return deferred;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function changeVariant( val ) {&lt;br /&gt;
			dialog.previewPanel.$element[ 0 ].focus();&lt;br /&gt;
			variant = val;&lt;br /&gt;
&lt;br /&gt;
			var targetPanel = stackLayout.findItemFromData( variant );&lt;br /&gt;
			if ( targetPanel.$element.children().length ) {&lt;br /&gt;
				stackLayout.setItem( targetPanel );&lt;br /&gt;
			} else {&lt;br /&gt;
				stackLayout.pushPending();&lt;br /&gt;
				dropdown.setDisabled( true );&lt;br /&gt;
&lt;br /&gt;
				fetchPreview().then( function ( $previewContainer ) {&lt;br /&gt;
					targetPanel.$element.append( $previewContainer );&lt;br /&gt;
					stackLayout.setItem( targetPanel );&lt;br /&gt;
				}, function ( detail ) {&lt;br /&gt;
					windowManager.openWindow( errorDialog, {&lt;br /&gt;
						title: OO.ui.msg( &amp;#039;ooui-dialog-process-error&amp;#039; ),&lt;br /&gt;
						message: ve.init.target.getContentApi().getErrorMessage( detail ),&lt;br /&gt;
						actions: [&lt;br /&gt;
							{&lt;br /&gt;
								action: &amp;#039;reject&amp;#039;,&lt;br /&gt;
								label: OO.ui.deferMsg( &amp;#039;ooui-dialog-message-reject&amp;#039; ),&lt;br /&gt;
								flags: &amp;#039;safe&amp;#039;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								action: &amp;#039;retry&amp;#039;,&lt;br /&gt;
								label: OO.ui.deferMsg( &amp;#039;ooui-dialog-process-retry&amp;#039; ),&lt;br /&gt;
								flags: [ &amp;#039;primary&amp;#039;, &amp;#039;progressive&amp;#039; ]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					} ).closed.then( function ( data ) {&lt;br /&gt;
						if ( data &amp;amp;&amp;amp; data.action === &amp;#039;retry&amp;#039; ) {&lt;br /&gt;
							// Do not use setValue() since it will not trigger event&lt;br /&gt;
							changeVariant( variant );&lt;br /&gt;
						} else {&lt;br /&gt;
							// &amp;quot;variant&amp;quot; will be set by event handler&lt;br /&gt;
							dropdown.setValue( stackLayout.getCurrentItem().getData() );&lt;br /&gt;
						}&lt;br /&gt;
					} );&lt;br /&gt;
				} ).always( function () {&lt;br /&gt;
					stackLayout.popPending();&lt;br /&gt;
					dropdown.setDisabled( false );&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function previewWithVariant() {&lt;br /&gt;
			var currentPanel = stackLayout.getCurrentItem();&lt;br /&gt;
&lt;br /&gt;
			if ( currentPanel.$element.children().length ) {&lt;br /&gt;
				dialog.swapPanel( &amp;#039;preview&amp;#039; );&lt;br /&gt;
				dialog.previewPanel.$element.prepend( dropdown.$element );&lt;br /&gt;
			} else {&lt;br /&gt;
				target.emit( &amp;#039;savePreview&amp;#039; );&lt;br /&gt;
				dialog.pushPending();&lt;br /&gt;
&lt;br /&gt;
				fetchPreview().then( function ( $previewContent ) {&lt;br /&gt;
					target.getSurface().getModel().getDocument().once( &amp;#039;transact&amp;#039;, function () {&lt;br /&gt;
						panelLayouts.forEach( function ( item ) {&lt;br /&gt;
							item.$element.empty();&lt;br /&gt;
						} );&lt;br /&gt;
					} );&lt;br /&gt;
					dialog.swapPanel( &amp;#039;preview&amp;#039; );&lt;br /&gt;
					currentPanel.$element.append( $previewContent );&lt;br /&gt;
					stackLayout.setItem( stackLayout.findItemFromData( variant ) );&lt;br /&gt;
					dialog.previewPanel.$element.prepend( dropdown.$element );&lt;br /&gt;
				}, function ( detail ) {&lt;br /&gt;
					dialog.showErrors(&lt;br /&gt;
						new OO.ui.Error(&lt;br /&gt;
							ve.init.target.getContentApi().getErrorMessage( detail ),&lt;br /&gt;
							{ recoverable: true }&lt;br /&gt;
						)&lt;br /&gt;
					);&lt;br /&gt;
				} ).always( function () {&lt;br /&gt;
					dialog.popPending();&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function init() {&lt;br /&gt;
			variant = mw.config.get( &amp;#039;wgUserVariant&amp;#039; );&lt;br /&gt;
			target = ve.init.target;&lt;br /&gt;
			dialog = target.saveDialog;&lt;br /&gt;
			dropdown = new OO.ui.DropdownInputWidget( {&lt;br /&gt;
				$overlay: dialog.$overlay,&lt;br /&gt;
				classes: [ &amp;#039;pwv-2017-variant&amp;#039; ],&lt;br /&gt;
				options:&lt;br /&gt;
					[ {&lt;br /&gt;
						optgroup: mw.msg( &amp;#039;pwv-2017-caption&amp;#039; )&lt;br /&gt;
					} ].concat( DATA.map( function ( item ) {&lt;br /&gt;
						return {&lt;br /&gt;
							data: item.var,&lt;br /&gt;
							label: mw.msg( item.msg ) /* eslint-disable-line mediawiki/msg-doc */&lt;br /&gt;
						};&lt;br /&gt;
					} ) ),&lt;br /&gt;
				value: variant&lt;br /&gt;
			} );&lt;br /&gt;
			dropdown.on( &amp;#039;change&amp;#039;, changeVariant );&lt;br /&gt;
			panelLayouts = DATA.map( function ( item ) {&lt;br /&gt;
				return new OO.ui.PanelLayout( {&lt;br /&gt;
					expanded: false,&lt;br /&gt;
					data: item.var&lt;br /&gt;
				} );&lt;br /&gt;
			} );&lt;br /&gt;
			stackLayout = new PendingStackLayout( {&lt;br /&gt;
				expanded: false,&lt;br /&gt;
				items: panelLayouts&lt;br /&gt;
			} );&lt;br /&gt;
			stackLayout.setItem( stackLayout.findItemFromData( variant ) );&lt;br /&gt;
			dialog.previewPanel.$element.append( stackLayout.$element );&lt;br /&gt;
			errorDialog = new OO.ui.MessageDialog();&lt;br /&gt;
			windowManager = new OO.ui.WindowManager();&lt;br /&gt;
			windowManager.addWindows( [ errorDialog ] );&lt;br /&gt;
			$( document.body ).append( windowManager.$element );&lt;br /&gt;
&lt;br /&gt;
			var handlerToRemove = &amp;#039;onSaveDialogPreview&amp;#039;;&lt;br /&gt;
			dialog.off( &amp;#039;preview&amp;#039;, handlerToRemove, target )&lt;br /&gt;
				.on( &amp;#039;preview&amp;#039;, previewWithVariant );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( !isInitialized ) {&lt;br /&gt;
			init();&lt;br /&gt;
			isInitialized = true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;ve.saveDialog.stateChanged&amp;#039; ).add( entryPoint );&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;ve.activationComplete&amp;#039; ).add( function () {&lt;br /&gt;
		if ( isInitialized ) {&lt;br /&gt;
			// Switching between VE and NWE, requires to be reinitialized&lt;br /&gt;
			isInitialized = false;&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;AnYiLin</name></author>
	</entry>
</feed>