MediaWiki:Gadget-morfeusz-analyzer.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.
var MorfeuszLookup = require( 'ext.gadget.morfeusz-lookup' ).MorfeuszLookup,
	reLinkTrail = /^[a-zęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/,
	nonLinkableTags = [ 'ign', 'interp', 'sp' ];

function mapGerundForms( results ) {
	var mappings = {},
		// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat#Alternatives
		flattened = results.reduce( function ( acc, val ) {
			return acc.concat( val );
		}, [] ),
		baseGerunds = flattened.filter( function ( item ) {
			return item.tag.indexOf( 'ger:sg:nom.acc:n:' ) === 0;
		} ).map( function ( item ) {
			return item.form.slice( 0, item.form.length - 1 );
		} );
	
	flattened.filter( function ( item ) {
		return item.tag.indexOf( 'ger:' ) === 0;
	} ).forEach( function ( item ) {
		var baseGerund = baseGerunds.filter( function ( base ) {
				return item.form.indexOf( base ) === 0;
			} )[ 0 ] || null;
		
		if ( baseGerund ) {
			mappings[ item.form ] = baseGerund + 'e';
		}
	} );
	
	return mappings;
}

function makeWikilink( lemma, form ) {
	var trail;
	
	if ( form === lemma ) {
		return mw.format( '[[$1]]', lemma );
	} else if ( form.indexOf( lemma ) === 0 ) {
		trail = form.slice( lemma.length );
		
		if ( reLinkTrail.test( trail ) ) {
			return mw.format( '[[$1]]$2', lemma, trail );
		} else {
			return mw.format( '[[$1|$2]]', lemma, form );
		}
	} else {
		return mw.format( '[[$1|$2]]', lemma, form );
	}
}

function preInspectMorfeuszData( results, lookup ) {
	var request,
		infinitives = results.filter( function ( item ) {
			return item.tag.indexOf( 'ger:' ) === 0;
		} ).map( function ( item ) {
			return item.lemma.replace( /:.*/, '' );
		} ).filter( function ( gerund, index, arr ) {
			return arr.indexOf( gerund ) === index; // filter duplicates
		} );
	
	if ( infinitives.length ) {
		request = lookup.generate( infinitives );
		
		return request.done( function ( generationData ) {
			var gerundMappings = mapGerundForms( generationData.results );
			
			results.forEach( function ( item ) {
				if ( item.tag.indexOf( 'ger:' ) === 0 && item.form in gerundMappings ) {
					item.lemma = gerundMappings[ item.form ];
				}
			} );
		} ).promise( { abort: request.abort } );
	}
	
	return $().promise();
}

function processMorfeuszData( results ) {
	var item, currLemmas, lastObject, lastStart,
		out = [];
	
	results.forEach( function ( item ) {
		if ( nonLinkableTags.indexOf( item.tag ) !== -1 ) {
			out.push( $.extend( { form: item.form }, {
				unknown: item.tag === 'ign' ? true : undefined
			} ) );
			
			lastObject = null;
		} else {
			if ( !lastObject || lastStart !== item.start ) {
				currLemmas = [];
				lastStart = item.start;
				lastObject = { form: item.form, lemmas: currLemmas };
				
				out.push( lastObject );
			} else {
				currLemmas = lastObject.lemmas;
			}
			
			currLemmas.push( {
				lemma: item.lemma.replace( /:.*/, '' ),
				labels: item.labels,
				name: item.name,
				tag: item.tag
			} );
		}
	} );
	
	return out;
}

function MorfeuszAnalyzer() {
	var lookup = new MorfeuszLookup();
	
	lookup.setPastTenseSegmentation( 'composite' );
	lookup.setWhitespaceHandling( 'keep' );
	
	/**
	 * - non-linkable, known lemma: { .form }
	 * - non-linkable, unknown lemma: { .form, unknown: true }
	 * - linkable lemma: { .form, lemmas: [
	 *       { .lemma, .labels, .name, .tag },
	 *       ...
	 *   ] }
	 */
	this.analyze = function ( text ) {
		var metadata,
			request = lookup.analyze( text ); // has .abort()
		
		return request.then( function ( data ) {
			metadata = {
				copyrightNotice: data.copyright,
				dictionaryId: data.dictionaryId,
				libraryVersion: data.version
			};
			
			request = preInspectMorfeuszData( data.results, lookup ); // has .abort()
			
			return request.then( function () {
				return processMorfeuszData( data.results );
			} );
		} ).then( function ( items ) {
			return $.extend( { items: items }, metadata );
		} ).promise( {
			abort: request.abort
		} );
	};
}

MorfeuszAnalyzer.makeWikilink = makeWikilink;

module.exports = { MorfeuszAnalyzer: MorfeuszAnalyzer };