ميدياويكي:Gadget-auto-cite-shamela.js

من ويكيبيديا، الموسوعة الحرة

ملاحظة: بعد الحفظ، قد يلزمك إفراغ الكاش لرؤية التغييرات.

/**
 * Auto Cite Shamela
 * 
 * الاستشهاد الآلي بالشاملة
 * 
 * كتبها: حبيشان
 * by [[:ar:User:حبيشان]]
 * 
 * تتطلب [[:ar:Module:Cite Shamela]] [[:ar:Module:Cite Shamela/data.json]] [[:ar:قالب:استشهاد بالشاملة]]
 * 
 */
mw.hook( 've.activationComplete' ).add( function () {
	ve.ui.CitoidInspector.prototype._performLookup = ve.ui.CitoidInspector.prototype.performLookup;
	ve.ui.CitoidInspector.prototype.performLookup = function () {
		var inspector = this;
		// TODO: Add caching for requested urls
		if ( this.lookupPromise ) {
			// Abort existing lookup
			this.lookupPromise.abort();
			this.lookupPromise = null;
			this.lookupInput.popPending();
		}
		// Set as pending
		this.lookupButton.setDisabled( true );
		this.lookupInput.setDisabled( true ).pushPending();
	
		var search = this.lookupInput.getValue();
		// Common case: pasting a URI into this field. Citoid expects
		// minimally encoded input, so do some speculative decoding here to
		// avoid 404 fetches. T146539
		search = ve.safeDecodeURIComponent( search );
	
		// We have to first set up a get response so we can have
		// a proper xhr object with "abort" method, so we can
		// hand off this abort method to the jquery promise
		
		var xhr;
		if (search.indexOf("shamela.ws")>-1 || /^«[^»]+» \((ص)?[0-9 \/]+([^0-9]+)?\)/.test(search))
		{
			var params = {
			    action: "expandtemplates",
			    text: "{{استشهاد بالشاملة|" + search + "|expand=json}}",
			    prop: "wikitext",
			    format: "json"
			},
			
			xhr = new mw.Api().get(params);
		} else {
			return inspector._performLookup();
		}
	
	
		this.lookupPromise = xhr
			.then(
				// Success
				function ( searchResults ) {
					// Build results
					var rData = JSON.parse(searchResults.expandtemplates.wikitext)
					if (rData.error) {
						mw.notify( rData.error, { title: 'استشهاد بالشاملة', type:'error'});
						return inspector._performLookup();
					} else {
						var renderPromises = [],
						partPromises = [];
						var transclusionModel = new ve.dm.MWTransclusionModel();
											
						var result = {
							templateName: rData.template.target.wt,
							template: ve.dm.MWTemplateModel.newFromName( transclusionModel, rData.template.target.wt ),
							transclusionModel: transclusionModel
						};
						for (var param in rData.template.params) {
							result.template.addParameter(
								new ve.dm.MWParameterModel(
									result.template, param, rData.template.params[ param ].wt
								)
							);
						};
						inspector.results.push( result );
	
						partPromises.push(
							result.transclusionModel.addPart( result.template )
						)
						return ve.promiseAll( partPromises )
						.then( function () {
							console.log('after_partpromises')
							var sources = [],
								optionWidgets = [];
							// Create option widgets
							inspector.results.forEach( function ( result, i ) {
								var refWidget = new ve.ui.CitoidReferenceWidget(
									inspector.getFragment().getSurface().getDocument(),
									result.transclusionModel,
									{
										data: i,
										templateName: result.templateName,
										citeTools: inspector.citeTools
									} );
								var template = result.template;
								// T92428: Ignore empty templates
								if ( ve.isEmptyObject( template.getParameters() ) ) {
									console.log('empty');
									return;
								}
								sources.push( result.source ); // source may be undefined or Array of strings
								optionWidgets.push( refWidget );
								renderPromises.push( refWidget.getRenderPromise() );
							} );
							if ( optionWidgets.length > 0 ) {
								// Add citations to the select widget
								inspector.previewSelectWidget.addItems( optionWidgets );
								// Add credit for the first result only to the widget, currently for Zotero & WorldCat only
								return ve.promiseAll( renderPromises ).then( function () {
									inspector.setModePanel( 'auto', 'result' );
								}, function () {
									inspector.lookupFailed();
									return $.Deferred().resolve();
								} );
							}
							// failed, so go back
							return $.Deferred().reject();
						});
				
					}
				},
				// Fail
				function ( type, response ) {
					if ( response && response.textStatus === 'abort' ) {
						return $.Deferred().reject();
					}
					inspector.lookupFailed();
					// Restore focus to the input field.
					// Definitely don't do this on success and focusing a hidden input causes jQuery
					// to prevent it from being focused the next time the inspector is opened (T285626)
					inspector.lookupInput
						.setDisabled( false ).focus();
					return $.Deferred().resolve();
				} )
			.always( function () {
				inspector.lookupInput
					.setDisabled( false )
					.popPending();
				inspector.lookupButton.setDisabled( false );
			} )
			.promise( { abort: xhr.abort } );
		return this.lookupPromise;
	};
});