MediaWiki:Gadget-veKeepParameters.js

Z Wikipedii, wolnej encyklopedii

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
/* global mediaWiki, ve */
(function(mw) {
	/**
	 * Override for template editor serialization.
	 * 
	 * Adding suggested params for infoboxes. 
	 * 
	 * Based on code from [[mw:Extension:VisualEditor]]
	 * https://github.com/wikimedia/mediawiki-extensions-VisualEditor/blob/master/modules/ve-mw/dm/models/ve.dm.MWTemplateModel.js#L345
	 * More permanent solution:
	 * https://phabricator.wikimedia.org/T280078#7490484
	 */
	function override() {
		if (!(typeof ve === 'object' && 'dm' in ve && 'MWTemplateModel' in ve.dm)) {
			//console.log('[veKeepParameters] override ve.dm.MWTemplateModel skipped');
			return;
		}
		//console.log('[veKeepParameters] override ve.dm.MWTemplateModel');
		
		/**
		 * @inheritdoc
		 */
		ve.dm.MWTemplateModel.prototype.serialize = function () {
			var origData = this.originalData || {},
				origParams = origData.params || {},
				template = { target: this.target, params: {} },
				spec = this.spec,
				params = this.params;

			//console.log('[serialize]', {template:template, spec:spec});

			var keepSuggested = false;
			if (typeof spec == 'object'
				&& typeof spec.template == 'object'
				&& typeof spec.template.title == 'string'
				&& spec.template.title.indexOf('infobox')>=0) {
				keepSuggested = true;
			}

			for ( var name in params ) {
				if ( name === '' ) {
					continue;
				}

				// removing empty parameters
				try {
					if (
						// Don't add empty parameters (T101075)
						params[ name ].getValue() === '' &&
						// …unless they were present before the edit
						!Object.prototype.hasOwnProperty.call( origParams, name ) &&
						// …unless they are required (T276989)
						!spec.isParameterRequired( name ) &&
						// …unless keeping suggested
						!(spec.isParameterSuggested( name ) && keepSuggested)
					) {
						continue;
					}
				} catch(e) {
					console.error('[veKeepParameters]', 'override failed this needs to be fixed', e)
				}

				var origName = params[ name ].getOriginalName();
				template.params[ origName ] = ve.extendObject(
					{},
					origParams[ origName ],
					{ wt: params[ name ].getValue() }
				);

			}

			// Performs a non-deep extend, so this won't reintroduce
			// deleted parameters (T75134)
			template = ve.extendObject( {}, origData, template );
			return { template: template };
		};

	}
	
	//console.log('[veKeepParameters] loaded, adding hook');
	mw.hook('ve.activationComplete').add(function () {
		//console.log('[veKeepParameters] hooked');
		override();
	});
})(mediaWiki);