summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/UniversalLanguageSelector/resources/js/ext.uls.ime.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/UniversalLanguageSelector/resources/js/ext.uls.ime.js')
-rw-r--r--www/wiki/extensions/UniversalLanguageSelector/resources/js/ext.uls.ime.js327
1 files changed, 327 insertions, 0 deletions
diff --git a/www/wiki/extensions/UniversalLanguageSelector/resources/js/ext.uls.ime.js b/www/wiki/extensions/UniversalLanguageSelector/resources/js/ext.uls.ime.js
new file mode 100644
index 00000000..653bcf1a
--- /dev/null
+++ b/www/wiki/extensions/UniversalLanguageSelector/resources/js/ext.uls.ime.js
@@ -0,0 +1,327 @@
+/*!
+ * ULS - jQuery IME integration
+ *
+ * Copyright (C) 2012 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
+ * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
+ * contributors. See CREDITS for a list.
+ *
+ * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
+ * have to do anything special to choose one license or the other and you don't
+ * have to notify anyone which license you are using. You are free to use
+ * UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @file
+ * @ingroup Extensions
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function () {
+ 'use strict';
+
+ var mwImeRulesPath, inputSelector, inputPreferences, ulsIMEPreferences, customHelpLink;
+
+ mwImeRulesPath = mw.config.get( 'wgExtensionAssetsPath' ) +
+ '/UniversalLanguageSelector/lib/jquery.ime/';
+ inputSelector = 'input:not([type]), input[type=text], input[type=search], textarea, [contenteditable]';
+
+ inputPreferences = mw.uls.preferences();
+
+ mw.ime = mw.ime || {};
+
+ mw.ime.getLanguagesWithIME = function () {
+ var language,
+ ulsLanguages = mw.config.get( 'wgULSLanguages' ) || {},
+ availableLanguages = {};
+
+ for ( language in $.ime.languages ) {
+ availableLanguages[ language ] = ulsLanguages[ language ] ||
+ $.uls.data.getAutonym( language );
+ }
+
+ return availableLanguages;
+ };
+
+ mw.ime.getIMELanguageList = function () {
+ var unique = [],
+ imeLanguageList,
+ previousIMELanguages;
+
+ previousIMELanguages = $.ime.preferences.getPreviousLanguages() || [];
+ imeLanguageList = previousIMELanguages.concat( mw.uls.getFrequentLanguageList() );
+
+ imeLanguageList.forEach( function ( lang ) {
+ if ( unique.indexOf( lang ) === -1 ) {
+ unique.push( lang );
+ }
+ } );
+
+ return unique.slice( 0, 6 );
+ };
+
+ ulsIMEPreferences = {
+
+ save: function ( callback ) {
+ if ( !this.registry.isDirty ) {
+ if ( callback ) {
+ callback.call( this, true );
+ }
+
+ return;
+ }
+ // we don't want to save isDirty field.
+ this.registry.isDirty = undefined;
+ // get updated copy of preferences
+ inputPreferences = mw.uls.preferences();
+ inputPreferences.set( 'ime', this.registry );
+ inputPreferences.save( callback );
+ // reset the dirty bit
+ this.registry.isDirty = false;
+ },
+
+ load: function () {
+ this.registry = inputPreferences.get( 'ime' ) || this.registry;
+ },
+
+ disable: function () {
+ this.registry.isDirty = true;
+ this.registry.enable = false;
+ },
+
+ enable: function () {
+ this.registry.isDirty = true;
+ this.registry.enable = true;
+ },
+
+ isEnabled: function () {
+ if ( this.registry.enable === undefined ) {
+ return mw.config.get( 'wgULSIMEEnabled' );
+ } else {
+ return this.registry.enable;
+ }
+ },
+
+ getDefaultLanguage: function () {
+ return mw.config.get( 'wgContentLanguage' );
+ }
+ };
+
+ function imeNotification() {
+ var notificationMsg = ( mw.config.get( 'wgULSPosition' ) === 'personal' ) ?
+ 'ext-uls-input-disable-notification-info-personal' :
+ 'ext-uls-input-disable-notification-info-interlanguage',
+ $notification = $( '<div>' )
+ .addClass( 'uls-ime-notification-bubble' )
+ .append(
+ $( '<div>' )
+ .attr( 'data-i18n', 'ext-uls-input-disable-notification' ),
+ $( '<div>' )
+ .addClass( 'link' )
+ .attr( 'data-i18n', 'ext-uls-input-disable-notification-undo' )
+ .on( 'click', function () {
+ $.ime.preferences.enable();
+ $.ime.preferences.save( function () {
+ mw.ime.setup();
+ } );
+ } ),
+ $( '<div>' ).attr( 'data-i18n', notificationMsg )
+ );
+
+ mw.notify( $notification.i18n() );
+ }
+
+ // Add a 'more settings' link that takes to input settings of ULS
+ customHelpLink = function () {
+ var $disableInputToolsLink, $moreSettingsLink,
+ imeselector = this;
+
+ $disableInputToolsLink = $( '<span>' )
+ .addClass( 'uls-ime-disable-link' )
+ .attr( 'data-i18n', 'ext-uls-input-disable' );
+
+ $moreSettingsLink = $( '<span>' )
+ .addClass( 'uls-ime-more-settings-link' );
+
+ // Apparently we depend on some styles which are loaded with
+ // these modules. This needs refactoring.
+ mw.loader.using( mw.uls.languageSettingsModules, function () {
+ $moreSettingsLink.languagesettings( {
+ defaultModule: 'input',
+ onClose: function () {
+ // on close of input settings, keep focus in input area.
+ imeselector.$element.trigger( 'focus' );
+ },
+ top: imeselector.$element.offset().top
+ } );
+ } );
+
+ // Hide the menu.
+ $moreSettingsLink.on( 'click', function ( e ) {
+ imeselector.hide();
+ e.stopPropagation();
+ } );
+
+ $disableInputToolsLink.i18n();
+
+ $disableInputToolsLink.on( 'click', function ( e ) {
+ $.ime.preferences.disable();
+ imeselector.hide();
+ imeselector.$imeSetting.hide();
+ $.ime.preferences.save( function () {
+ mw.ime.disable();
+ imeNotification();
+ mw.hook( 'mw.uls.ime.disable' ).fire( 'menu' );
+ } );
+ e.stopPropagation();
+ } );
+
+ // If the webfonts are loaded, apply webfonts to the selector
+ if ( $.fn.webfonts ) {
+ imeselector.$menu.webfonts();
+ }
+
+ return $( '<div>' )
+ .addClass( 'uls-ime-menu-settings-item' )
+ .append( $disableInputToolsLink, $moreSettingsLink );
+ };
+
+ mw.ime.disable = function () {
+ $( inputSelector ).trigger( 'destroy.ime' );
+ };
+
+ mw.ime.init = function () {
+ if ( !$.ime ) {
+ // jquery.ime not loaded yet.
+ return;
+ }
+ if ( $.ime.preferences.isEnabled ) {
+ // mw.ime already initialized.
+ return;
+ }
+ // Extend the ime preference system
+ $.extend( $.ime.preferences, ulsIMEPreferences );
+ // MediaWiki specific overrides for jquery.ime
+ $.extend( $.ime.defaults, {
+ imePath: mwImeRulesPath
+ } );
+
+ // Load the ime preferences
+ $.ime.preferences.load();
+
+ $.fn.imeselector.Constructor.prototype.helpLink = customHelpLink;
+
+ // Override the autonym function for the case that
+ // somebody tries to select a language for which there are
+ // no input methods, which is possible in MediaWiki
+ $.fn.imeselector.Constructor.prototype.getAutonym = function ( languageCode ) {
+ return $.uls.data.getAutonym( languageCode );
+ };
+ };
+
+ /**
+ * Binds the event listeners.
+ */
+ mw.ime.setup = function () {
+ var imeSelectors = mw.config.get( 'wgULSImeSelectors' ).join( ', ' );
+
+ mw.ime.init();
+ $( 'body' ).on( 'focus.ime', imeSelectors, function () {
+ mw.ime.handleFocus( $( this ) );
+ } );
+ };
+
+ /**
+ * Loads necessary dependencies, checks input for validity and
+ * adds the ime menu for elements that should have it.
+ *
+ * @param {jquery.Element} $input
+ * @since 2013.11
+ */
+ mw.ime.handleFocus = function ( $input ) {
+ var noImeSelectors;
+
+ if ( $input.is( '.noime' ) || $input.data( 'ime' ) ) {
+ // input does not need IME or already applied
+ return;
+ }
+
+ noImeSelectors = mw.config.get( 'wgULSNoImeSelectors' ).join( ', ' );
+ if ( noImeSelectors.length && $input.is( noImeSelectors ) ) {
+ $input.addClass( 'noime' );
+
+ return;
+ }
+
+ if ( !$.ime.preferences.isEnabled() ) {
+ return;
+ }
+
+ if ( $input.is( '[contenteditable]' ) && !window.rangy ) {
+ // For supporting content editable divs we need rangy library
+ mw.loader.using( 'rangy.core', function () {
+ mw.ime.addIme( $input );
+ } );
+
+ return;
+ }
+
+ mw.ime.addIme( $input );
+ };
+
+ /**
+ * Just adds ime menu to any input element.
+ *
+ * @param {jquery.Element} $input
+ * @since 2013.11
+ */
+ mw.ime.addIme = function ( $input ) {
+ var imeselector;
+
+ $input.ime( {
+ languages: mw.ime.getIMELanguageList(),
+ languageSelector: function () {
+ var $ulsTrigger;
+
+ $ulsTrigger = $( '<a>' ).text( '...' )
+ .addClass( 'ime-selector-more-languages selectable-row selectable-row-item' )
+ .attr( {
+ title: $.i18n( 'ext-uls-input-settings-more-languages-tooltip' )
+ } );
+ $ulsTrigger.uls( {
+ onSelect: function ( language ) {
+ $input.data( 'imeselector' ).selectLanguage( language );
+ $input.trigger( 'focus' );
+ },
+ languages: mw.ime.getLanguagesWithIME(),
+ ulsPurpose: 'ime-selector',
+ top: $input.offset().top
+ } );
+
+ return $ulsTrigger;
+ },
+ helpHandler: function ( ime ) {
+ return $( '<a>' )
+ .attr( {
+ href: mw.msg( 'uls-ime-helppage', ime ),
+ target: '_blank',
+ title: $.i18n( 'ext-uls-ime-help' )
+ } )
+ .addClass( 'ime-perime-help' )
+ .on( 'click', function ( event ) {
+ event.stopPropagation();
+ } );
+ }
+ } );
+
+ // Some fields may be uninitialized
+ imeselector = $input.data( 'imeselector' );
+ if ( imeselector ) {
+ imeselector.selectLanguage( imeselector.decideLanguage() );
+ imeselector.$element.on( 'setim.ime', function ( event, inputMethod ) {
+ mw.hook( 'mw.uls.ime.change' ).fire( inputMethod );
+ } );
+ }
+ };
+
+}() );