MediaWiki:Gadget-morfeusz-analyzer.js
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 };