%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/init/sa/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/src/init/sa/ve.init.sa.Platform.js |
/*!
* VisualEditor Standalone Initialization Platform class.
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
/**
* Initialization Standalone platform.
*
* @example
* var platform = new ve.init.sa.Platform( ve.messagePaths );
* platform.initialize().done( function () {
* $( 'body' ).append( $( '<p>' ).text(
* platform.getMessage( 'visualeditor' )
* ) );
* } );
*
* @class
* @extends ve.init.Platform
*
* @constructor
* @param {string[]} [messagePaths] Message folder paths
*/
ve.init.sa.Platform = function VeInitSaPlatform( messagePaths ) {
// Parent constructor
ve.init.Platform.call( this );
// Properties
this.externalLinkUrlProtocolsRegExp = /^https?\:\/\//i;
this.unanchoredExternalLinkUrlProtocolsRegExp = /https?\:\/\//i;
this.messagePaths = messagePaths || [];
this.parsedMessages = {};
this.userLanguages = [ 'en' ];
};
/* Inheritance */
OO.inheritClass( ve.init.sa.Platform, ve.init.Platform );
/* Methods */
/** @inheritdoc */
ve.init.sa.Platform.prototype.getExternalLinkUrlProtocolsRegExp = function () {
return this.externalLinkUrlProtocolsRegExp;
};
/** @inheritdoc */
ve.init.sa.Platform.prototype.getUnanchoredExternalLinkUrlProtocolsRegExp = function () {
return this.unanchoredExternalLinkUrlProtocolsRegExp;
};
/**
* Get message folder paths
*
* @return {string[]} Message folder paths
*/
ve.init.sa.Platform.prototype.getMessagePaths = function () {
return this.messagePaths;
};
/** @inheritdoc */
ve.init.sa.Platform.prototype.addMessages = function ( messages ) {
$.i18n().load( messages, $.i18n().locale );
};
/**
* @method
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getMessage = $.i18n;
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getConfig = function () {
/* Standalone has no config yet */
return null;
};
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getUserConfig = function ( keys ) {
var i, l, values;
if ( Array.isArray( keys ) ) {
values = {};
for ( i = 0, l = keys.length; i < l; i++ ) {
values[ keys[ i ] ] = this.getUserConfig( keys[ i ] );
}
} else {
return JSON.parse( localStorage.getItem( 've-' + keys ) );
}
return values;
};
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.setUserConfig = function ( keyOrValueMap, value ) {
var i;
if ( typeof keyOrValueMap === 'object' ) {
for ( i in keyOrValueMap ) {
if ( keyOrValueMap.hasOwnProperty( i ) ) {
this.setUserConfig( i, keyOrValueMap[ i ] );
}
}
} else {
localStorage.setItem( 've-' + keyOrValueMap, JSON.stringify( value ) );
}
return true;
};
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.addParsedMessages = function ( messages ) {
var key;
for ( key in messages ) {
this.parsedMessages[ key ] = messages[ key ];
}
};
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getParsedMessage = function ( key ) {
if ( Object.prototype.hasOwnProperty.call( this.parsedMessages, key ) ) {
return this.parsedMessages[ key ];
}
// Fallback to regular messages, html escaping applied.
return this.getMessage( key ).replace( /['"<>&]/g, function escapeCallback( s ) {
switch ( s ) {
case '\'':
return ''';
case '"':
return '"';
case '<':
return '<';
case '>':
return '>';
case '&':
return '&';
}
} );
};
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getLanguageCodes = function () {
return Object.keys( $.uls.data.getAutonyms() );
};
/**
* @method
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getLanguageName = $.uls.data.getAutonym;
/**
* @method
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getLanguageAutonym = $.uls.data.getAutonym;
/**
* @method
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getLanguageDirection = $.uls.data.getDir;
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.getUserLanguages = function () {
return this.userLanguages;
};
/**
* @inheritdoc
*/
ve.init.sa.Platform.prototype.initialize = function () {
var i, iLen, j, jLen, partialLocale, localeParts, filename, deferred,
messagePaths = this.getMessagePaths(),
locale = $.i18n().locale,
languages = [ locale, 'en' ], // Always use 'en' as the final fallback
languagesCovered = {},
promises = [],
fallbacks = $.i18n.fallbacks[ locale ];
if ( !VisualEditorSupportCheck() ) {
return $.Deferred().reject().promise();
}
if ( !fallbacks ) {
// Try to find something that has fallbacks (which means it's a language we know about)
// by stripping things from the end. But collect all the intermediate ones in case we
// go past languages that don't have fallbacks but do exist.
localeParts = locale.split( '-' );
localeParts.pop();
while ( localeParts.length && !fallbacks ) {
partialLocale = localeParts.join( '-' );
languages.push( partialLocale );
fallbacks = $.i18n.fallbacks[ partialLocale ];
localeParts.pop();
}
}
if ( fallbacks ) {
languages = languages.concat( fallbacks );
}
this.userLanguages = languages;
for ( i = 0, iLen = languages.length; i < iLen; i++ ) {
if ( languagesCovered[ languages[ i ] ] ) {
continue;
}
languagesCovered[ languages[ i ] ] = true;
// Lower-case the language code for the filename. jQuery.i18n does not case-fold
// language codes, so we should not case-fold the second argument in #load.
filename = languages[ i ].toLowerCase() + '.json';
for ( j = 0, jLen = messagePaths.length; j < jLen; j++ ) {
deferred = $.Deferred();
$.i18n().load( messagePaths[ j ] + filename, languages[ i ] )
.always( deferred.resolve );
promises.push( deferred.promise() );
}
}
return $.when.apply( $, promises );
};