MediaWiki:Gadget-yandex-speechrecognition.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
JS-код ниже относится к гаджету «Распознавание речи (при редактировании текстов) с использованием SpeechKit Cloud API от Яндекса (используются сторонние скрипты и сервисы)» (править описание). Его использует около 700 учётных записей.

После сохранения или недавних изменений очистите кэш браузера.

( function() {

	function addOldToolbarButton() {
		var $toolbar = $( '#gadget-toolbar' );
		if ( !$toolbar.length ) {
			$toolbar = $( '#toolbar' );
		}
		$( '<div>' ) //
		.addClass( 'mw-toolbar-editbutton' ) //
		.attr( 'id', 'mw-editbutton-gadget-speechrecognition' ) //
		.attr( 'alt', 'Распознавание речи' ) //
		.attr( 'title', 'Распознавание речи (Yandex SpeechKit Cloud)' ) //
		.css( 'background-image', 'url(/upwiki/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/200px-Loudspeaker.svg.png) ' ) //
		.appendTo( $toolbar ) //
		.on( 'click', switchRecognition );
	}

	function addNewToolbarButton() {
		$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
			'section': 'main',
			'group': 'format',
			'tools': {
				'wikilinker': {
					label: 'Распознавание речи (Yandex SpeechKit Cloud)',
					type: 'button',
					icon: '/upwiki/wikipedia/commons/thumb/8/8a/Loudspeaker.svg/200px-Loudspeaker.svg.png',
					action: {
						type: 'callback',
						execute: function() {
							switchRecognition();
						}
					}
				}
			}
		} );
	}

	if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
		mediaWiki.loader.load( '//download.yandex.ru/webspeechkit/webspeechkit-1.0.0.js' );

		mw.loader.using( [ 'user.options', 'jquery.textSelection' ], function() {
			if ( mw.user.options.get( 'usebetatoolbar' ) === 1 ) {
				if ( mw.user.options.get( 'showtoolbar' ) === 1 ) {
					$.when( mw.loader.using( [ 'ext.wikiEditor', 'schema.Edit' ] ), $.ready ).then( addNewToolbarButton );
				}
			} else {
				mw.loader.using( 'mediawiki.toolbar', function() {
					$( addOldToolbarButton );
				} );
			}
		} );
	}

	var started = false;
	var speechRecognition = null;

	function switchRecognition() {

		if ( speechRecognition === null ) {
			speechRecognition = new ya.speechkit.SpeechRecognition();
		}

		if ( !started ) {
			speechRecognition.start( {
				apiKey: '5c49c6a8-bbd1-4429-9aec-b8d1d49f7edd',
				initCallback: function( sessionId, code ) {
					console.log( "[Yandex.SpeechRecognition Gadget] Session ID: " + sessionId );
					console.log( "[Yandex.SpeechRecognition Gadget] Code: " + code );
				},
				dataCallback: function( text, uttr, merge ) {
					console.log( "[Yandex.SpeechRecognition Gadget] Text: " + text );
					console.log( "[Yandex.SpeechRecognition Gadget] Uttr: " + uttr );
					console.log( "[Yandex.SpeechRecognition Gadget] Merge: " + merge );

					if ( uttr ) {
						$( '#wpTextbox1' ).textSelection( 'encapsulateSelection', {
							peri: text,
							replace: true
						} ).textSelection( 'scrollToCaretPosition' ).focus();
					} else {
						// not the end of statement, reselect after replace
						var pos = $( '#wpTextbox1' ).textSelection( 'getCaretPosition' );
						var newLength = text.length;

						$( '#wpTextbox1' ).textSelection( 'encapsulateSelection', {
							peri: text,
							replace: true
						} ).textSelection( 'setSelection', {
							start: pos,
							end: pos + newLength
						} );

					}
				},
				errorCallback: function( msg ) {
					console.log( "[Yandex.SpeechRecognition Gadget] Error: " + msg );
					started = false;
				},
				punctuation: true
			} );
			started = true;
			mw.notify( 'Распознавание текста запущено', {
				tag: 'speechRecognition'
			} );
		} else {
			speechRecognition.stop();
			started = false;
			mw.notify( 'Распознавание текста остановлено', {
				tag: 'speechRecognition'
			} );
		}
	}

} )();