MediaWiki:Gadget-edit-form-automator.js

Z Wikisłownika – wolnego słownika wielojęzycznego

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.
EAutomator = {
	/*
	* Zwraca kody wersji językowej z aktywnej sekcji + domyślnych
	*/
	getActiveLangs: function () {
		var ret = EConstants.USED_WIKTIONARIES.slice( 0 ),
		act = EUtil.getActiveLangCode();

		if (
			ret.indexOf( act ) === -1 &&
			act !== 'pl' &&
			EConstants.ALL_WIKTIONARIES.indexOf( act ) !== -1
		) {
			ret.push( act );
		}
		
		return ret;
	},

	/*
	* Zwraca kody wszystkich wersji językowych z sekcji + domyślnych
	*/
	getAllLangs: function () {
		var id, code,
		ret = EConstants.USED_WIKTIONARIES.slice( 0 );

		for ( id in Ed.content.sections ) {
			if ( Ed.content.sections.hasOwnProperty( id ) ) {
				code = Ed.content.sections[ id ].code;
				
				if ( code !== undefined ) {
					code = code.replace( /-.*/, '' );
					
					if (
						code.length > 1 &&
						code.length < 7 &&
						code !== 'pl' &&
						ret.indexOf( code ) === -1
					) {
						ret.push( code );
					}
				}
			}
		}
		
		return $.grep( ret, function ( val ) {
			return ( EConstants.ALL_WIKTIONARIES.indexOf( val ) !== -1 );
		} );
	},

	getInterwikiLangs: function () {
		var arr, el, res = [],
		str = $( '#ed_0000_' ).val(),
		re = /\[\[(\w+):.*?\]\]/g;

		while ( ( arr = re.exec( str ) ) !== null ) {
			el = $.trim( arr[ 1 ] );
			
			if (
				el &&
				( el !== 'simple' || EUtil.getActiveLangCode() === 'en' )
			) {
				res.push( el );
			}
			//TODO sortuj wg wielkości projektu
		}
		
		return res;
	},

	getActiveAndInterwikiLangs: function () {
		return $.merge(
			EAutomator.getActiveLangs(),
			EAutomator.getInterwikiLangs().slice( 0, 50 )
		);
	},

	getIPA: function () {
		var query, queries = [];

		query = {
			titles:  mw.config.get( 'wgTitle' ),
			prop:    'revisions',
			rvprop:  'content',
			rvslots: 'main'
		};
		
		$.each( EAutomator.getActiveAndInterwikiLangs(), function ( _, lang ) {
			queries.push( {
				data: query,
				external: {
					lang: lang
				}
			} );
		} );
		
		return EApi.process( queries, EAutomator.getIPARe );
	},
	
	getIPARe: function () {
		var ipas = {},
		error = EStr.NO_IPA_FOUND;

		$.each( arguments, function () {
			var lang,
			res = this[ 0 ];

			if (
				res.query === undefined ||
				res.query.pages === undefined
			) {
				return false;
			}
			
			lang = res.query.general.lang;
			
			$.each( res.query.pages, function ( j, val ) {
				var content, ipa;

				if (
					j === '-1' ||
					!val.revisions ||
					!val.revisions[ 0 ]
				) {
					return false;
				}
				
				content = val.revisions[ 0 ].slots.main.content;
				ipa = EAutomator.extractIPA( content, lang );
				
				if ( ipa !== undefined && ipa.length ) {
					ipas[ lang ] = ipa;
					error = undefined;
				}
			} );
		} );
		
		EApi.display( EConstants.MODE_IPA, ipas, 'wymowa', error );
	},

	extractFirstArgsFromTemplates: function ( str, template, lang ) {
		var arr, el, results = [],
		re = new RegExp( '\\{\\{' + template + '\\s*\\|\\s*([^\\{\\}\\|<=]+)[\\}\\|<]', 'gi' );

		$.each( EParser.getSections( str, lang ), function () {
			while ( ( arr = re.exec( this.content ) ) !== null ) {
				el = $.trim( arr[ 1 ] );
				
				if (
					el &&
					EConstants.FORBIDDEN_IPA_CONTENT.indexOf( el ) === -1 &&
					results.indexOf( el ) === -1
				) {
					results.push( {
						ipa:    el,
						header: this.title
					} );
				}
			}
		} );
		
		return results;
	},

	extractSecondArgsFromTemplates: function ( str, template, lang ) {
		var arr, el, results = [],
		re = new RegExp( '\\{\\{' + template + '\\s*\\|\\s*([^\\{\\}\\|]*)\\|\\s*[\\/\\]]?([^\\{\\}\\/\\|<=]+)[\\}\\|\\/<\\]]', 'gi' );

		$.each( EParser.getSections( str, lang ), function () {
			while ( ( arr = re.exec( this.content ) ) !== null ) {
				el = $.trim( arr[ 2 ] );
				
				if (
					el &&
					EConstants.FORBIDDEN_IPA_CONTENT.indexOf( el ) === -1 &&
					results.indexOf( el ) === -1
				) {
					results.push( {
						ipa:    el,
						header: this.title
					} );
				}
			}
		} );
		
		return results;
	},

	extractAllArgsFromTemplates: function ( str, template, lang ) {
		var arr, el, params, i, results = [],
		re = new RegExp( '\\{\\{' + template + '\\s*\\|\\s*([^\\{\\}]*)\\}\\}', 'gi' );

		$.each( EParser.getSections( str, lang ), function () {
			while ( ( arr = re.exec( this.content ) ) !== null ) {
				params = arr[ 1 ].split( '|' );
				
				for ( i = 0; i < params.length; i += 1 ) {
					el = $.trim( params[ i ].replace( /^.*?=/, '' ) );
					
					if (
						el &&
						EConstants.FORBIDDEN_IPA_CONTENT.indexOf( el ) === -1 &&
						results.indexOf( el ) === -1
					) {
						results.push( {
							ipa:    el,
							header: this.title
						} );
					}
				}
			}
		} );

		return results;
	},

	extractIPA: function ( str, lang ) {
		switch ( lang ) {
			case 'en':
			case 'cs':
			case 'sk':
			case 'it':
			case 'af':
			case 'ko':
			case 'nl':
			case 'co':
			case 'vi':
			case 'simple':
			case 'ga':
			case 'is':
			case 'li':
			case 'lv':
			case 'no':
			case 'sl':
			case 'ja':
				return EAutomator.extractFirstArgsFromTemplates( str, 'IPA', lang );
			case 'fr':
			case 'mg':
			case 'oc':
				return EAutomator.extractFirstArgsFromTemplates( str, 'pron', lang );
			case 'de':
				return EAutomator.extractFirstArgsFromTemplates( str, 'Lautschrift', lang );
			case 'es':
				return EAutomator.extractAllArgsFromTemplates( str, 'pronunciación', lang );
			case 'ca':
				return EAutomator.extractSecondArgsFromTemplates( str, 'pron', lang );
			case 'ro':
				return EAutomator.extractFirstArgsFromTemplates( str, 'AFI', lang );
			case 'et':
				return EAutomator.extractFirstArgsFromTemplates( str, 'hääldus', lang );
			case 'el':
				return EAutomator.extractFirstArgsFromTemplates( str, 'ΔΦΑ', lang );
			case 'eo':
				return EAutomator.extractFirstArgsFromTemplates( str, 'IFA', lang );
			case 'tl':
				return EAutomator.extractFirstArgsFromTemplates( str, 'API', lang );
			case 'ru':
				return EAutomator.extractIPA_ru( str );
			default:
				return [];
		}
	},

	extractIPA_ru: function ( str ) {
		var arr, el,
		results = EAutomator.extractFirstArgsFromTemplates( str, 'transcription', 'ru' ),
		re = /\{\{transcriptions\s*\|\s*([^\}\|]*)\s*\|\s*([^\}\|]*)\s*\}\}/g;

		$.each( EParser.getSections( str, 'ru' ), function () {
			while ( ( arr = re.exec( this.content ) ) !== null ) {
				el = $.trim( arr[ 1 ] );
				
				if (
					el &&
					EConstants.FORBIDDEN_IPA_CONTENT.indexOf( el ) === -1 &&
					results.indexOf( el ) === -1
				) {
					results.push( {
						ipa:    el,
						header: this.title
					} );
				}
				
				el = $.trim( arr[ 2 ] );
				
				if (
					el &&
					EConstants.FORBIDDEN_IPA_CONTENT.indexOf( el ) === -1 &&
					results.indexOf( el ) === -1
				) {
					results.push( {
						ipa:    el,
						header: this.title
					} );
				}
			}
		} );
		
		return results;
	},

	addTransliteration: function ( sectionName, sectionCode ) {
		var textarea = $( '#ed_' + sectionName + '_transliteracja' );
		
		if ( EConstants.TRANSLIT_SUPPORTED.indexOf( sectionCode ) === -1 ) {
			return;
		}
		
		if ( textarea.val() ) {
			return;
		}
		
		textarea.val( '{' + '{translit|' + sectionCode + '}}' );
	},

	getPicture: function () {
		var query, queries = [];

		query = {
			titles:  mw.config.get( 'wgTitle' ),
			prop:    'revisions',
			rvprop:  'content',
			rvslots: 'main'
		};
		
		$.each( EAutomator.getActiveAndInterwikiLangs(), function ( _, lang ) {
			queries.push( {
				data: query,
				external: {
					lang: lang
				}
			} );
		} );
		
		return EApi.process( queries, EAutomator.getPictureRe );
	},
	
	getPictureRe: function () {
		var pics = {},
		error = EStr.NO_PICTURE_FOUND;

		$.each( arguments, function () {
			var lang,
			res = this[ 0 ];

			if (
				res.query === undefined ||
				res.query.pages === undefined
			) {
				return false;
			}
			
			lang = res.query.general.lang;
			
			$.each( res.query.pages, function ( j, val ) {
				var content, pic;

				if (
					j === '-1' ||
					!val.revisions ||
					!val.revisions[ 0 ]
				) {
					return false;
				}
				
				content = val.revisions[ 0 ].slots.main.content;
				pic = EAutomator.extractPicture( content );
				
				if ( pic !== undefined && pic.length ) {
					pics[ lang ] = pic;
					error = undefined;
				}
			} );
		} );
		
		EApi.display( EConstants.MODE_PICTURE, pics, '', error );
		EAutomator.getPictureUrls( pics ).done( EPrinter.setPictureTooltips );
	},

	extractPicture: function ( str ) {
		var arr, el, results = [],
		re = /[:=\|]([^\|\]:=]+?\.(jpg|png|gif|svg))/gi;

		while ( ( arr = re.exec( str ) ) !== null ) {
			el = $.trim( arr[ 1 ] ).replace( /_/g, ' ' );
			
			if ( el && results.indexOf( el ) === -1 ) {
				el = el.charAt( 0 ).toUpperCase() + el.substr( 1 );
				results.push( el );
			}
		}
		
		return results;
	},

	imageCache: {},

	getPictureUrls: function ( results ) {
		var allImages = [],
		query;

		$.each( results, function () {
			$.each( this, function () {
				if ( this && allImages.indexOf( this ) === -1 ) {
					allImages.push( 'File:' + this );
				}
			} );
		} );
		
		query = {
			data: {
				titles:      allImages,
				prop:        'imageinfo',
				iiprop:      'url',
				iiurlwidth:  150,
				iiurlheight: 150
			},
			external: {
				project: EConstants.WIKIMEDIA
			}
		};
		
		return EApi.process( query, EAutomator.getPictureUrlsRe );
	},

	getPictureUrlsRe: function ( results ) {
		if (
			!results ||
			!results.query ||
			!results.query.pages
		) {
			return false;
		}
		
		$.each( results.query.pages, function () {
			var loader;

			if ( !this.imageinfo || !this.imageinfo[ 0 ] ) {
				return true;
			}
			
			EAutomator.imageCache[ this.title ] = '<img src="' + this.imageinfo[ 0 ].thumburl + '"/>';
			loader = $( EAutomator.imageCache[ this.title ] );
		} );
	},

	getAudio: function () {
		var code, lang, query, titles = [], queries = [];

		query = {
			titles:  mw.config.get( 'wgTitle' ),
			prop:    'revisions',
			rvprop:  'content',
			rvslots: 'main'
		};
		
		$.each( EAutomator.getActiveAndInterwikiLangs(), function ( _, lang ) {
			queries.push( {
				data: query,
				external: {
					lang: lang
				}
			} );
		} );
		
		code = EUtil.getActiveLangCode();
		lang = code.charAt( 0 ).toUpperCase() + code.slice( 1 );
		titles.push( 'File:' + lang + '-' + mw.config.get( 'wgTitle' ) + '.ogg' );
		
		if ( lang === 'En' ) {
			titles.push(
				'File:' + lang + '-uk-' + mw.config.get( 'wgTitle' ) + '.ogg',
				'File:' + lang + '-us-' + mw.config.get( 'wgTitle' ) + '.ogg',
				'File:' + lang + '-au-' + mw.config.get( 'wgTitle' ) + '.ogg'
			);
		}
		
		if ( lang === 'De' ) {
			titles.push( 'File:' + lang + '-at-' + mw.config.get( 'wgTitle' ) + '.ogg' );
		}

		queries.push( {
			data: {
				titles: titles,
				prop:   'info'
			},
			external: {
				project: EConstants.WIKIMEDIA
			}
		} );
		
		return EApi.process( queries, EAutomator.getAudioRe );
	},
	
	getAudioRe: function () {
		var oggs = {},
		error = EStr.NO_AUDIO_FOUND;

		$.each( arguments, function () {
			var lang,
			res = this[ 0 ];

			if (
				res.query === undefined ||
				res.query.pages === undefined
			) {
				return false;
			}
			
			lang = res.query.general.lang;
			
			$.each( res.query.pages, function ( j, val ) {
				var content, ogg;

				if ( j === '-1' ) {
					return false;
				}
				
				if ( res.query.general.wikiid === 'commonswiki' ) {
					ogg = val.title.replace( /^File:/, '' );
					
					if ( oggs.commons === undefined ) {
						oggs.commons = [];
					}
					
					oggs.commons.push( ogg );
					error = undefined;
				} else {
					if ( !val.revisions || !val.revisions[ 0 ] ) {
						return false;
					}
					
					content = val.revisions[ 0 ].slots.main.content;
					ogg = EAutomator.extractAudio( content );
					
					if ( ogg !== undefined && ogg.length ) {
						oggs[ lang ] = ogg;
						error = undefined;
					}
				}
			} );
		} );
		
		EApi.display( EConstants.MODE_AUDIO, oggs, 'wymowa', error );
	},

	extractAudio: function ( str ) {
		var arr, el, results = [],
		re = /[\|:=]([^\|\]:=]+?\.ogg)/gi;

		while ( ( arr = re.exec( str ) ) !== null ) {
			el = $.trim( arr[ 1 ] ).replace( /_/g, ' ' );
			
			if ( el && results.indexOf( el ) === -1 ) {
				el = el.charAt( 0 ).toUpperCase() + el.substr( 1 );
				results.push( el );
			}
		}
		
		return results;
	},

	getInternalExample: function () {
		var query;
		
		query = {
			generator:    'backlinks',
			gbltitle:     mw.config.get( 'wgTitle' ),
			gbllimit:     50,
			gblnamespace: 0,
			prop:         'revisions',
			rvprop:       'content',
			rvslots:      'main'
		};
		
		return EApi.process( query, EAutomator.getInternalExampleRe );
	},

	getInternalExampleRe: function ( result ) {
		var examples = {},
		error = EStr.NO_INTERNAL_EXAMPLE_FOUND,
		re = new RegExp( "^:\\s*\\(\\d+\\.\\d+\\)\\s*('*[^\\n]*\\[\\[" + mw.config.get( 'wgTitle' ) + "[\\|\\]][^\\n]*)", 'm' ),
		code = EUtil.getActiveLangCode(),
		delim = code === 'pl'
			? "''"
			: '';

		if (
			result &&
			result.query &&
			result.query.pages
		) {
			$.each( result.query.pages, function () {
				var content, ex, arr;

				if ( this.title === mw.config.get( 'wgTitle' ) ) {
					return true;
				}
				
				content = EParser.extractSubsections(
					this.revisions[ 0 ].slots.main.content,
					'przykłady',
					code === 'pl' ? null : code
				);
				
				if ( ( arr = re.exec( content ) ) !== null ) {
					if ( code === 'pl' ) {
						ex = arr[ 1 ].replace( /(.*→\s*|'''?)/g, '' );
						ex = ( re.exec( ": (1.1) ''" + ex ) === null ) ? null : ex;
					} else {
						ex = arr[ 1 ].replace( /'''/g, '' );
					}
					
					if ( ex ) {
						examples[ this.title ] = delim + $.trim( ex ) + delim;
						error = undefined;
					}
				}
			} );
		}
		
		EApi.display( EConstants.MODE_INTERNAL_EXAMPLE, examples, 'przykłady', error );
	}
};