mirror of
https://github.com/jquery/jquery-ui.git
synced 2025-01-07 20:34:24 +00:00
Calendar: Use globalize-runtime with compiled locales
This commit is contained in:
parent
1566cf1b39
commit
c43149d8a4
39
Gruntfile.js
39
Gruntfile.js
@ -234,9 +234,9 @@ grunt.initConfig({
|
|||||||
"cldrjs/cldr/supplemental.js": "cldrjs/dist/cldr/supplemental.js",
|
"cldrjs/cldr/supplemental.js": "cldrjs/dist/cldr/supplemental.js",
|
||||||
"cldrjs/LICENSE-MIT": "cldrjs/LICENSE-MIT",
|
"cldrjs/LICENSE-MIT": "cldrjs/LICENSE-MIT",
|
||||||
|
|
||||||
"globalize/globalize.js": "globalize/dist/globalize.js",
|
"globalize/globalize-runtime.js": "globalize/dist/globalize-runtime.js",
|
||||||
"globalize/globalize/number.js": "globalize/dist/globalize/number.js",
|
"globalize/globalize-runtime/number.js": "globalize/dist/globalize-runtime/number.js",
|
||||||
"globalize/globalize/date.js": "globalize/dist/globalize/date.js",
|
"globalize/globalize-runtime/date.js": "globalize/dist/globalize-runtime/date.js",
|
||||||
"globalize/LICENSE.txt": "globalize/LICENSE.txt",
|
"globalize/LICENSE.txt": "globalize/LICENSE.txt",
|
||||||
|
|
||||||
"qunit/qunit.js": "qunit/qunit/qunit.js",
|
"qunit/qunit.js": "qunit/qunit/qunit.js",
|
||||||
@ -400,6 +400,39 @@ grunt.registerTask( "update-authors", function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
grunt.registerTask( "compile-globalize", function() {
|
||||||
|
var formatters,
|
||||||
|
Globalize = require( "globalize" ),
|
||||||
|
globalizeCompiler = require( "globalize-compiler" ),
|
||||||
|
cldrData = require( "cldr-data" ),
|
||||||
|
languages = [ "ar", "en", "de", "es", "zh" ];
|
||||||
|
|
||||||
|
Globalize.load( cldrData.entireMainFor.apply( this, languages ) );
|
||||||
|
Globalize.load( cldrData.entireSupplemental() );
|
||||||
|
|
||||||
|
formatters = languages.reduce( function( ret, language ) {
|
||||||
|
var globalize = Globalize( language );
|
||||||
|
|
||||||
|
ret = ret.concat([
|
||||||
|
globalize.dateFormatter( { raw: "EEEEEE" } ),
|
||||||
|
globalize.dateFormatter( { raw: "EEEEE" } ),
|
||||||
|
globalize.dateFormatter( { raw: "EEEE" } ),
|
||||||
|
globalize.dateFormatter( { raw: "MMMM" } ),
|
||||||
|
globalize.dateFormatter( { raw: "w" } ),
|
||||||
|
globalize.dateFormatter( { raw: "c" } ),
|
||||||
|
globalize.dateFormatter( { date: "short" } ),
|
||||||
|
globalize.dateParser( { date: "short" } ),
|
||||||
|
globalize.dateFormatter( { date: "long" } ),
|
||||||
|
globalize.dateParser( { date: "long" } ),
|
||||||
|
globalize.numberParser()
|
||||||
|
]);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}, [] );
|
||||||
|
|
||||||
|
grunt.file.write( "external/localization.js", globalizeCompiler.compile( formatters ) );
|
||||||
|
});
|
||||||
|
|
||||||
grunt.registerTask( "default", [ "lint", "requirejs", "test" ]);
|
grunt.registerTask( "default", [ "lint", "requirejs", "test" ]);
|
||||||
grunt.registerTask( "lint", [ "asciilint", "jshint", "jscs", "csslint", "htmllint" ]);
|
grunt.registerTask( "lint", [ "asciilint", "jshint", "jscs", "csslint", "htmllint" ]);
|
||||||
grunt.registerTask( "test", [ "qunit" ]);
|
grunt.registerTask( "test", [ "qunit" ]);
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
"qunit-assert-close": "JamesMGreene/qunit-assert-close#v1.1.1",
|
"qunit-assert-close": "JamesMGreene/qunit-assert-close#v1.1.1",
|
||||||
"qunit-composite": "JamesMGreene/qunit-composite#v1.1.0",
|
"qunit-composite": "JamesMGreene/qunit-composite#v1.1.0",
|
||||||
"requirejs": "2.1.14",
|
"requirejs": "2.1.14",
|
||||||
"globalize": "1.0.0",
|
"globalize": "globalize#1.1.0-rc.6",
|
||||||
|
|
||||||
"jquery-1.7.0": "jquery#1.7.0",
|
"jquery-1.7.0": "jquery#1.7.0",
|
||||||
"jquery-1.7.1": "jquery#1.7.1",
|
"jquery-1.7.1": "jquery#1.7.1",
|
||||||
|
7
demos/bootstrap.js
vendored
7
demos/bootstrap.js
vendored
@ -80,11 +80,16 @@ require.config( {
|
|||||||
baseUrl: window.location.pathname.indexOf( "demos/" ) !== -1 ? "../../ui" : "../../../ui",
|
baseUrl: window.location.pathname.indexOf( "demos/" ) !== -1 ? "../../ui" : "../../../ui",
|
||||||
paths: {
|
paths: {
|
||||||
cldr: "../external/cldrjs/cldr",
|
cldr: "../external/cldrjs/cldr",
|
||||||
globalize: "../external/globalize/globalize",
|
"globalize-runtime": "../external/globalize/globalize-runtime",
|
||||||
"globalize-locales": "../external/localization",
|
"globalize-locales": "../external/localization",
|
||||||
jquery: "../external/jquery/jquery",
|
jquery: "../external/jquery/jquery",
|
||||||
external: "../external/"
|
external: "../external/"
|
||||||
},
|
},
|
||||||
|
map: {
|
||||||
|
"*": {
|
||||||
|
"globalize": "globalize-runtime"
|
||||||
|
}
|
||||||
|
},
|
||||||
shim: {
|
shim: {
|
||||||
"external/globalize-old/globalize.culture.de-DE": [ "external/globalize-old/globalize" ],
|
"external/globalize-old/globalize.culture.de-DE": [ "external/globalize-old/globalize" ],
|
||||||
"external/globalize-old/globalize.culture.ja-JP": [ "external/globalize-old/globalize" ]
|
"external/globalize-old/globalize.culture.ja-JP": [ "external/globalize-old/globalize" ]
|
||||||
|
13
external/cldrjs/cldr.js
vendored
13
external/cldrjs/cldr.js
vendored
@ -1,15 +1,15 @@
|
|||||||
/**
|
/**
|
||||||
* CLDR JavaScript Library v0.4.1
|
* CLDR JavaScript Library v0.4.3
|
||||||
* http://jquery.com/
|
* http://jquery.com/
|
||||||
*
|
*
|
||||||
* Copyright 2013 Rafael Xavier de Souza
|
* Copyright 2013 Rafael Xavier de Souza
|
||||||
* Released under the MIT license
|
* Released under the MIT license
|
||||||
* http://jquery.org/license
|
* http://jquery.org/license
|
||||||
*
|
*
|
||||||
* Date: 2015-02-25T13:51Z
|
* Date: 2015-08-24T01:00Z
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
* CLDR JavaScript Library v0.4.1 2015-02-25T13:51Z MIT license © Rafael Xavier
|
* CLDR JavaScript Library v0.4.3 2015-08-24T01:00Z MIT license © Rafael Xavier
|
||||||
* http://git.io/h4lmVg
|
* http://git.io/h4lmVg
|
||||||
*/
|
*/
|
||||||
(function( root, factory ) {
|
(function( root, factory ) {
|
||||||
@ -463,12 +463,7 @@
|
|||||||
arrayForEach( sources, function( source ) {
|
arrayForEach( sources, function( source ) {
|
||||||
var prop;
|
var prop;
|
||||||
for ( prop in source ) {
|
for ( prop in source ) {
|
||||||
if ( prop in destination && arrayIsArray( destination[ prop ] ) ) {
|
if ( prop in destination && typeof destination[ prop ] === "object" && !arrayIsArray( destination[ prop ] ) ) {
|
||||||
|
|
||||||
// Concat Arrays
|
|
||||||
destination[ prop ] = destination[ prop ].concat( source[ prop ] );
|
|
||||||
|
|
||||||
} else if ( prop in destination && typeof destination[ prop ] === "object" ) {
|
|
||||||
|
|
||||||
// Merge Objects
|
// Merge Objects
|
||||||
destination[ prop ] = merge( destination[ prop ], source[ prop ] );
|
destination[ prop ] = merge( destination[ prop ], source[ prop ] );
|
||||||
|
6
external/cldrjs/cldr/event.js
vendored
6
external/cldrjs/cldr/event.js
vendored
@ -1,15 +1,15 @@
|
|||||||
/**
|
/**
|
||||||
* CLDR JavaScript Library v0.4.1
|
* CLDR JavaScript Library v0.4.3
|
||||||
* http://jquery.com/
|
* http://jquery.com/
|
||||||
*
|
*
|
||||||
* Copyright 2013 Rafael Xavier de Souza
|
* Copyright 2013 Rafael Xavier de Souza
|
||||||
* Released under the MIT license
|
* Released under the MIT license
|
||||||
* http://jquery.org/license
|
* http://jquery.org/license
|
||||||
*
|
*
|
||||||
* Date: 2015-02-25T13:51Z
|
* Date: 2015-08-24T01:00Z
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
* CLDR JavaScript Library v0.4.1 2015-02-25T13:51Z MIT license © Rafael Xavier
|
* CLDR JavaScript Library v0.4.3 2015-08-24T01:00Z MIT license © Rafael Xavier
|
||||||
* http://git.io/h4lmVg
|
* http://git.io/h4lmVg
|
||||||
*/
|
*/
|
||||||
(function( factory ) {
|
(function( factory ) {
|
||||||
|
6
external/cldrjs/cldr/supplemental.js
vendored
6
external/cldrjs/cldr/supplemental.js
vendored
@ -1,15 +1,15 @@
|
|||||||
/**
|
/**
|
||||||
* CLDR JavaScript Library v0.4.1
|
* CLDR JavaScript Library v0.4.3
|
||||||
* http://jquery.com/
|
* http://jquery.com/
|
||||||
*
|
*
|
||||||
* Copyright 2013 Rafael Xavier de Souza
|
* Copyright 2013 Rafael Xavier de Souza
|
||||||
* Released under the MIT license
|
* Released under the MIT license
|
||||||
* http://jquery.org/license
|
* http://jquery.org/license
|
||||||
*
|
*
|
||||||
* Date: 2015-02-25T13:51Z
|
* Date: 2015-08-24T01:00Z
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
* CLDR JavaScript Library v0.4.1 2015-02-25T13:51Z MIT license © Rafael Xavier
|
* CLDR JavaScript Library v0.4.3 2015-08-24T01:00Z MIT license © Rafael Xavier
|
||||||
* http://git.io/h4lmVg
|
* http://git.io/h4lmVg
|
||||||
*/
|
*/
|
||||||
(function( factory ) {
|
(function( factory ) {
|
||||||
|
236
external/globalize/globalize-runtime.js
vendored
Normal file
236
external/globalize/globalize-runtime.js
vendored
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
/**
|
||||||
|
* Globalize Runtime v1.1.0-rc.6
|
||||||
|
*
|
||||||
|
* http://github.com/jquery/globalize
|
||||||
|
*
|
||||||
|
* Copyright jQuery Foundation and other contributors
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* Date: 2015-11-18T10:38Z
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* Globalize Runtime v1.1.0-rc.6 2015-11-18T10:38Z Released under the MIT license
|
||||||
|
* http://git.io/TrdQbw
|
||||||
|
*/
|
||||||
|
(function( root, factory ) {
|
||||||
|
|
||||||
|
// UMD returnExports
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
|
||||||
|
// AMD
|
||||||
|
define( factory );
|
||||||
|
} else if ( typeof exports === "object" ) {
|
||||||
|
|
||||||
|
// Node, CommonJS
|
||||||
|
module.exports = factory();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Globalize
|
||||||
|
root.Globalize = factory();
|
||||||
|
}
|
||||||
|
}( this, function() {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A toString method that outputs meaningful values for objects or arrays and
|
||||||
|
* still performs as fast as a plain string in case variable is string, or as
|
||||||
|
* fast as `"" + number` in case variable is a number.
|
||||||
|
* Ref: http://jsperf.com/my-stringify
|
||||||
|
*/
|
||||||
|
var toString = function( variable ) {
|
||||||
|
return typeof variable === "string" ? variable : ( typeof variable === "number" ? "" +
|
||||||
|
variable : JSON.stringify( variable ) );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* formatMessage( message, data )
|
||||||
|
*
|
||||||
|
* @message [String] A message with optional {vars} to be replaced.
|
||||||
|
*
|
||||||
|
* @data [Array or JSON] Object with replacing-variables content.
|
||||||
|
*
|
||||||
|
* Return the formatted message. For example:
|
||||||
|
*
|
||||||
|
* - formatMessage( "{0} second", [ 1 ] ); // 1 second
|
||||||
|
*
|
||||||
|
* - formatMessage( "{0}/{1}", ["m", "s"] ); // m/s
|
||||||
|
*
|
||||||
|
* - formatMessage( "{name} <{email}>", {
|
||||||
|
* name: "Foo",
|
||||||
|
* email: "bar@baz.qux"
|
||||||
|
* }); // Foo <bar@baz.qux>
|
||||||
|
*/
|
||||||
|
var formatMessage = function( message, data ) {
|
||||||
|
|
||||||
|
// Replace {attribute}'s
|
||||||
|
message = message.replace( /{[0-9a-zA-Z-_. ]+}/g, function( name ) {
|
||||||
|
name = name.replace( /^{([^}]*)}$/, "$1" );
|
||||||
|
return toString( data[ name ] );
|
||||||
|
});
|
||||||
|
|
||||||
|
return message;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var objectExtend = function() {
|
||||||
|
var destination = arguments[ 0 ],
|
||||||
|
sources = [].slice.call( arguments, 1 );
|
||||||
|
|
||||||
|
sources.forEach(function( source ) {
|
||||||
|
var prop;
|
||||||
|
for ( prop in source ) {
|
||||||
|
destination[ prop ] = source[ prop ];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return destination;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var createError = function( code, message, attributes ) {
|
||||||
|
var error;
|
||||||
|
|
||||||
|
message = code + ( message ? ": " + formatMessage( message, attributes ) : "" );
|
||||||
|
error = new Error( message );
|
||||||
|
error.code = code;
|
||||||
|
|
||||||
|
objectExtend( error, attributes );
|
||||||
|
|
||||||
|
return error;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Based on http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery
|
||||||
|
var stringHash = function( str ) {
|
||||||
|
return [].reduce.call( str, function( hash, i ) {
|
||||||
|
var chr = i.charCodeAt( 0 );
|
||||||
|
hash = ( ( hash << 5 ) - hash ) + chr;
|
||||||
|
return hash | 0;
|
||||||
|
}, 0 );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var runtimeKey = function( fnName, locale, args, argsStr ) {
|
||||||
|
var hash;
|
||||||
|
argsStr = argsStr || JSON.stringify( args );
|
||||||
|
hash = stringHash( fnName + locale + argsStr );
|
||||||
|
return hash > 0 ? "a" + hash : "b" + Math.abs( hash );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var validate = function( code, message, check, attributes ) {
|
||||||
|
if ( !check ) {
|
||||||
|
throw createError( code, message, attributes );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var validateParameterPresence = function( value, name ) {
|
||||||
|
validate( "E_MISSING_PARAMETER", "Missing required parameter `{name}`.",
|
||||||
|
value !== undefined, { name: name });
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var validateParameterType = function( value, name, check, expected ) {
|
||||||
|
validate(
|
||||||
|
"E_INVALID_PAR_TYPE",
|
||||||
|
"Invalid `{name}` parameter ({value}). {expected} expected.",
|
||||||
|
check,
|
||||||
|
{
|
||||||
|
expected: expected,
|
||||||
|
name: name,
|
||||||
|
value: value
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var validateParameterTypeString = function( value, name ) {
|
||||||
|
validateParameterType(
|
||||||
|
value,
|
||||||
|
name,
|
||||||
|
value === undefined || typeof value === "string",
|
||||||
|
"a string"
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions?redirectlocale=en-US&redirectslug=JavaScript%2FGuide%2FRegular_Expressions
|
||||||
|
var regexpEscape = function( string ) {
|
||||||
|
return string.replace( /([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1" );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var stringPad = function( str, count, right ) {
|
||||||
|
var length;
|
||||||
|
if ( typeof str !== "string" ) {
|
||||||
|
str = String( str );
|
||||||
|
}
|
||||||
|
for ( length = str.length; length < count; length += 1 ) {
|
||||||
|
str = ( right ? ( str + "0" ) : ( "0" + str ) );
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function Globalize( locale ) {
|
||||||
|
if ( !( this instanceof Globalize ) ) {
|
||||||
|
return new Globalize( locale );
|
||||||
|
}
|
||||||
|
|
||||||
|
validateParameterPresence( locale, "locale" );
|
||||||
|
validateParameterTypeString( locale, "locale" );
|
||||||
|
|
||||||
|
this._locale = locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
Globalize.locale = function( locale ) {
|
||||||
|
validateParameterTypeString( locale, "locale" );
|
||||||
|
|
||||||
|
if ( arguments.length ) {
|
||||||
|
this._locale = locale;
|
||||||
|
}
|
||||||
|
return this._locale;
|
||||||
|
};
|
||||||
|
|
||||||
|
Globalize._createError = createError;
|
||||||
|
Globalize._formatMessage = formatMessage;
|
||||||
|
Globalize._regexpEscape = regexpEscape;
|
||||||
|
Globalize._runtimeKey = runtimeKey;
|
||||||
|
Globalize._stringPad = stringPad;
|
||||||
|
Globalize._validateParameterPresence = validateParameterPresence;
|
||||||
|
Globalize._validateParameterTypeString = validateParameterTypeString;
|
||||||
|
Globalize._validateParameterType = validateParameterType;
|
||||||
|
|
||||||
|
return Globalize;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}));
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Globalize v1.0.0
|
* Globalize Runtime v1.1.0-rc.6
|
||||||
*
|
*
|
||||||
* http://github.com/jquery/globalize
|
* http://github.com/jquery/globalize
|
||||||
*
|
*
|
||||||
@ -7,10 +7,10 @@
|
|||||||
* Released under the MIT license
|
* Released under the MIT license
|
||||||
* http://jquery.org/license
|
* http://jquery.org/license
|
||||||
*
|
*
|
||||||
* Date: 2015-04-23T12:02Z
|
* Date: 2015-11-18T10:38Z
|
||||||
*/
|
*/
|
||||||
/*!
|
/*!
|
||||||
* Globalize v1.0.0 2015-04-23T12:02Z Released under the MIT license
|
* Globalize Runtime v1.1.0-rc.6 2015-11-18T10:38Z Released under the MIT license
|
||||||
* http://git.io/TrdQbw
|
* http://git.io/TrdQbw
|
||||||
*/
|
*/
|
||||||
(function( root, factory ) {
|
(function( root, factory ) {
|
||||||
@ -20,34 +20,29 @@
|
|||||||
|
|
||||||
// AMD
|
// AMD
|
||||||
define([
|
define([
|
||||||
"cldr",
|
"../globalize-runtime",
|
||||||
"../globalize",
|
"./number"
|
||||||
"./number",
|
|
||||||
"cldr/event",
|
|
||||||
"cldr/supplemental"
|
|
||||||
], factory );
|
], factory );
|
||||||
} else if ( typeof exports === "object" ) {
|
} else if ( typeof exports === "object" ) {
|
||||||
|
|
||||||
// Node, CommonJS
|
// Node, CommonJS
|
||||||
module.exports = factory( require( "cldrjs" ), require( "globalize" ) );
|
module.exports = factory(
|
||||||
|
require( "../globalize-runtime" ),
|
||||||
|
require( "./number" )
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Extend global
|
// Extend global
|
||||||
factory( root.Cldr, root.Globalize );
|
factory( root.Globalize );
|
||||||
}
|
}
|
||||||
}(this, function( Cldr, Globalize ) {
|
}(this, function( Globalize ) {
|
||||||
|
|
||||||
var createError = Globalize._createError,
|
var createErrorUnsupportedFeature = Globalize._createErrorUnsupportedFeature,
|
||||||
createErrorUnsupportedFeature = Globalize._createErrorUnsupportedFeature,
|
|
||||||
formatMessage = Globalize._formatMessage,
|
|
||||||
numberSymbol = Globalize._numberSymbol,
|
|
||||||
regexpEscape = Globalize._regexpEscape,
|
regexpEscape = Globalize._regexpEscape,
|
||||||
|
runtimeKey = Globalize._runtimeKey,
|
||||||
stringPad = Globalize._stringPad,
|
stringPad = Globalize._stringPad,
|
||||||
validateCldr = Globalize._validateCldr,
|
|
||||||
validateDefaultLocale = Globalize._validateDefaultLocale,
|
|
||||||
validateParameterPresence = Globalize._validateParameterPresence,
|
validateParameterPresence = Globalize._validateParameterPresence,
|
||||||
validateParameterType = Globalize._validateParameterType,
|
validateParameterType = Globalize._validateParameterType,
|
||||||
validateParameterTypePlainObject = Globalize._validateParameterTypePlainObject,
|
|
||||||
validateParameterTypeString = Globalize._validateParameterTypeString;
|
validateParameterTypeString = Globalize._validateParameterTypeString;
|
||||||
|
|
||||||
|
|
||||||
@ -58,116 +53,6 @@ var validateParameterTypeDate = function( value, name ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
var createErrorInvalidParameterValue = function( name, value ) {
|
|
||||||
return createError( "E_INVALID_PAR_VALUE", "Invalid `{name}` value ({value}).", {
|
|
||||||
name: name,
|
|
||||||
value: value
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* expandPattern( options, cldr )
|
|
||||||
*
|
|
||||||
* @options [Object] if String, it's considered a skeleton. Object accepts:
|
|
||||||
* - skeleton: [String] lookup availableFormat;
|
|
||||||
* - date: [String] ( "full" | "long" | "medium" | "short" );
|
|
||||||
* - time: [String] ( "full" | "long" | "medium" | "short" );
|
|
||||||
* - datetime: [String] ( "full" | "long" | "medium" | "short" );
|
|
||||||
* - raw: [String] For more info see datetime/format.js.
|
|
||||||
*
|
|
||||||
* @cldr [Cldr instance].
|
|
||||||
*
|
|
||||||
* Return the corresponding pattern.
|
|
||||||
* Eg for "en":
|
|
||||||
* - "GyMMMd" returns "MMM d, y G";
|
|
||||||
* - { skeleton: "GyMMMd" } returns "MMM d, y G";
|
|
||||||
* - { date: "full" } returns "EEEE, MMMM d, y";
|
|
||||||
* - { time: "full" } returns "h:mm:ss a zzzz";
|
|
||||||
* - { datetime: "full" } returns "EEEE, MMMM d, y 'at' h:mm:ss a zzzz";
|
|
||||||
* - { raw: "dd/mm" } returns "dd/mm";
|
|
||||||
*/
|
|
||||||
|
|
||||||
var dateExpandPattern = function( options, cldr ) {
|
|
||||||
var dateSkeleton, result, skeleton, timeSkeleton, type;
|
|
||||||
|
|
||||||
function combineDateTime( type, datePattern, timePattern ) {
|
|
||||||
return formatMessage(
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/dateTimeFormats",
|
|
||||||
type
|
|
||||||
]),
|
|
||||||
[ timePattern, datePattern ]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ( true ) {
|
|
||||||
case "skeleton" in options:
|
|
||||||
skeleton = options.skeleton;
|
|
||||||
result = cldr.main([
|
|
||||||
"dates/calendars/gregorian/dateTimeFormats/availableFormats",
|
|
||||||
skeleton
|
|
||||||
]);
|
|
||||||
if ( !result ) {
|
|
||||||
timeSkeleton = skeleton.split( /[^hHKkmsSAzZOvVXx]/ ).slice( -1 )[ 0 ];
|
|
||||||
dateSkeleton = skeleton.split( /[^GyYuUrQqMLlwWdDFgEec]/ )[ 0 ];
|
|
||||||
if ( /(MMMM|LLLL).*[Ec]/.test( dateSkeleton ) ) {
|
|
||||||
type = "full";
|
|
||||||
} else if ( /MMMM/g.test( dateSkeleton ) ) {
|
|
||||||
type = "long";
|
|
||||||
} else if ( /MMM/g.test( dateSkeleton ) || /LLL/g.test( dateSkeleton ) ) {
|
|
||||||
type = "medium";
|
|
||||||
} else {
|
|
||||||
type = "short";
|
|
||||||
}
|
|
||||||
result = combineDateTime( type,
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/dateTimeFormats/availableFormats",
|
|
||||||
dateSkeleton
|
|
||||||
]),
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/dateTimeFormats/availableFormats",
|
|
||||||
timeSkeleton
|
|
||||||
])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "date" in options:
|
|
||||||
case "time" in options:
|
|
||||||
result = cldr.main([
|
|
||||||
"dates/calendars/gregorian",
|
|
||||||
"date" in options ? "dateFormats" : "timeFormats",
|
|
||||||
( options.date || options.time )
|
|
||||||
]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "datetime" in options:
|
|
||||||
result = combineDateTime( options.datetime,
|
|
||||||
cldr.main([ "dates/calendars/gregorian/dateFormats", options.datetime ]),
|
|
||||||
cldr.main([ "dates/calendars/gregorian/timeFormats", options.datetime ])
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "raw" in options:
|
|
||||||
result = options.raw;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw createErrorInvalidParameterValue({
|
|
||||||
name: "options",
|
|
||||||
value: options
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dayOfWeek( date, firstDay )
|
* dayOfWeek( date, firstDay )
|
||||||
*
|
*
|
||||||
@ -249,25 +134,11 @@ var dateDayOfYear = function( date ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
var dateWeekDays = [ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* firstDayOfWeek
|
|
||||||
*/
|
|
||||||
var dateFirstDayOfWeek = function( cldr ) {
|
|
||||||
return dateWeekDays.indexOf( cldr.supplemental.weekData.firstDay() );
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* millisecondsInDay
|
* millisecondsInDay
|
||||||
*/
|
*/
|
||||||
var dateMillisecondsInDay = function( date ) {
|
var dateMillisecondsInDay = function( date ) {
|
||||||
|
|
||||||
// TODO Handle daylight savings discontinuities
|
// TODO Handle daylight savings discontinuities
|
||||||
return date - dateStartOf( date, "day" );
|
return date - dateStartOf( date, "day" );
|
||||||
};
|
};
|
||||||
@ -325,6 +196,11 @@ var dateTimezoneHourFormat = function( date, format, timeSeparator, formatNumber
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var dateWeekDays = [ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* format( date, properties )
|
* format( date, properties )
|
||||||
*
|
*
|
||||||
@ -345,12 +221,14 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
length = current.length;
|
length = current.length;
|
||||||
|
|
||||||
if ( chr === "j" ) {
|
if ( chr === "j" ) {
|
||||||
|
|
||||||
// Locale preferred hHKk.
|
// Locale preferred hHKk.
|
||||||
// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data
|
// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data
|
||||||
chr = properties.preferredTime;
|
chr = properties.preferredTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( chr === "Z" ) {
|
if ( chr === "Z" ) {
|
||||||
|
|
||||||
// Z..ZZZ: same as "xxxx".
|
// Z..ZZZ: same as "xxxx".
|
||||||
if ( length < 4 ) {
|
if ( length < 4 ) {
|
||||||
chr = "x";
|
chr = "x";
|
||||||
@ -377,6 +255,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
|
|
||||||
// Year
|
// Year
|
||||||
case "y":
|
case "y":
|
||||||
|
|
||||||
// Plain year.
|
// Plain year.
|
||||||
// The length specifies the padding, but for two letters it also specifies the
|
// The length specifies the padding, but for two letters it also specifies the
|
||||||
// maximum length.
|
// maximum length.
|
||||||
@ -388,6 +267,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "Y":
|
case "Y":
|
||||||
|
|
||||||
// Year in "Week of Year"
|
// Year in "Week of Year"
|
||||||
// The length specifies the padding, but for two letters it also specifies the
|
// The length specifies the padding, but for two letters it also specifies the
|
||||||
// maximum length.
|
// maximum length.
|
||||||
@ -426,6 +306,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
|
|
||||||
// Week
|
// Week
|
||||||
case "w":
|
case "w":
|
||||||
|
|
||||||
// Week of Year.
|
// Week of Year.
|
||||||
// woy = ceil( ( doy + dow of 1/1 ) / 7 ) - minDaysStuff ? 1 : 0.
|
// woy = ceil( ( doy + dow of 1/1 ) / 7 ) - minDaysStuff ? 1 : 0.
|
||||||
// TODO should pad on ww? Not documented, but I guess so.
|
// TODO should pad on ww? Not documented, but I guess so.
|
||||||
@ -435,6 +316,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "W":
|
case "W":
|
||||||
|
|
||||||
// Week of Month.
|
// Week of Month.
|
||||||
// wom = ceil( ( dom + dow of `1/month` ) / 7 ) - minDaysStuff ? 1 : 0.
|
// wom = ceil( ( dom + dow of `1/month` ) / 7 ) - minDaysStuff ? 1 : 0.
|
||||||
ret = dateDayOfWeek( dateStartOf( date, "month" ), properties.firstDay );
|
ret = dateDayOfWeek( dateStartOf( date, "month" ), properties.firstDay );
|
||||||
@ -452,6 +334,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "F":
|
case "F":
|
||||||
|
|
||||||
// Day of Week in month. eg. 2nd Wed in July.
|
// Day of Week in month. eg. 2nd Wed in July.
|
||||||
ret = Math.floor( date.getDate() / 7 ) + 1;
|
ret = Math.floor( date.getDate() / 7 ) + 1;
|
||||||
break;
|
break;
|
||||||
@ -460,6 +343,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
case "e":
|
case "e":
|
||||||
case "c":
|
case "c":
|
||||||
if ( length <= 2 ) {
|
if ( length <= 2 ) {
|
||||||
|
|
||||||
// Range is [1-7] (deduced by example provided on documentation)
|
// Range is [1-7] (deduced by example provided on documentation)
|
||||||
// TODO Should pad with zeros (not specified in the docs)?
|
// TODO Should pad with zeros (not specified in the docs)?
|
||||||
ret = dateDayOfWeek( date, properties.firstDay ) + 1;
|
ret = dateDayOfWeek( date, properties.firstDay ) + 1;
|
||||||
@ -515,6 +399,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
// Zone
|
// Zone
|
||||||
case "z":
|
case "z":
|
||||||
case "O":
|
case "O":
|
||||||
|
|
||||||
// O: "{gmtFormat}+H;{gmtFormat}-H" or "{gmtZeroFormat}", eg. "GMT-8" or "GMT".
|
// O: "{gmtFormat}+H;{gmtFormat}-H" or "{gmtZeroFormat}", eg. "GMT-8" or "GMT".
|
||||||
// OOOO: "{gmtFormat}{hourFormat}" or "{gmtZeroFormat}", eg. "GMT-08:00" or "GMT".
|
// OOOO: "{gmtFormat}{hourFormat}" or "{gmtZeroFormat}", eg. "GMT-08:00" or "GMT".
|
||||||
if ( date.getTimezoneOffset() === 0 ) {
|
if ( date.getTimezoneOffset() === 0 ) {
|
||||||
@ -531,6 +416,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "X":
|
case "X":
|
||||||
|
|
||||||
// Same as x*, except it uses "Z" for zero offset.
|
// Same as x*, except it uses "Z" for zero offset.
|
||||||
if ( date.getTimezoneOffset() === 0 ) {
|
if ( date.getTimezoneOffset() === 0 ) {
|
||||||
ret = "Z";
|
ret = "Z";
|
||||||
@ -539,6 +425,7 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
|
|
||||||
/* falls through */
|
/* falls through */
|
||||||
case "x":
|
case "x":
|
||||||
|
|
||||||
// x: hourFormat("+HH;-HH")
|
// x: hourFormat("+HH;-HH")
|
||||||
// xx or xxxx: hourFormat("+HHmm;-HHmm")
|
// xx or xxxx: hourFormat("+HHmm;-HHmm")
|
||||||
// xxx or xxxxx: hourFormat("+HH:mm;-HH:mm")
|
// xxx or xxxxx: hourFormat("+HH:mm;-HH:mm")
|
||||||
@ -575,233 +462,14 @@ var dateFormat = function( date, numberFormatters, properties ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
var dateFormatterFn = function( numberFormatters, properties ) {
|
||||||
* properties( pattern, cldr )
|
return function dateFormatter( value ) {
|
||||||
*
|
validateParameterPresence( value, "value" );
|
||||||
* @pattern [String] raw pattern.
|
validateParameterTypeDate( value, "value" );
|
||||||
* ref: http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns
|
|
||||||
*
|
|
||||||
* @cldr [Cldr instance].
|
|
||||||
*
|
|
||||||
* Return the properties given the pattern and cldr.
|
|
||||||
*
|
|
||||||
* TODO Support other calendar types.
|
|
||||||
*/
|
|
||||||
var dateFormatProperties = function( pattern, cldr ) {
|
|
||||||
var properties = {
|
|
||||||
pattern: pattern,
|
|
||||||
timeSeparator: numberSymbol( "timeSeparator", cldr )
|
|
||||||
},
|
|
||||||
widths = [ "abbreviated", "wide", "narrow" ];
|
|
||||||
|
|
||||||
function setNumberFormatterPattern( pad ) {
|
return dateFormat( value, numberFormatters, properties );
|
||||||
if ( !properties.numberFormatters ) {
|
};
|
||||||
properties.numberFormatters = {};
|
|
||||||
}
|
|
||||||
properties.numberFormatters[ pad ] = stringPad( "", pad );
|
|
||||||
}
|
|
||||||
|
|
||||||
pattern.replace( datePatternRe, function( current ) {
|
|
||||||
var formatNumber,
|
|
||||||
chr = current.charAt( 0 ),
|
|
||||||
length = current.length;
|
|
||||||
|
|
||||||
if ( chr === "j" ) {
|
|
||||||
// Locale preferred hHKk.
|
|
||||||
// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data
|
|
||||||
properties.preferredTime = chr = cldr.supplemental.timeData.preferred();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZZZZ: same as "OOOO".
|
|
||||||
if ( chr === "Z" && length === 4 ) {
|
|
||||||
chr = "O";
|
|
||||||
length = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ( chr ) {
|
|
||||||
|
|
||||||
// Era
|
|
||||||
case "G":
|
|
||||||
properties.eras = cldr.main([
|
|
||||||
"dates/calendars/gregorian/eras",
|
|
||||||
length <= 3 ? "eraAbbr" : ( length === 4 ? "eraNames" : "eraNarrow" )
|
|
||||||
]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Year
|
|
||||||
case "y":
|
|
||||||
// Plain year.
|
|
||||||
formatNumber = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "Y":
|
|
||||||
// Year in "Week of Year"
|
|
||||||
properties.firstDay = dateFirstDayOfWeek( cldr );
|
|
||||||
properties.minDays = cldr.supplemental.weekData.minDays();
|
|
||||||
formatNumber = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "u": // Extended year. Need to be implemented.
|
|
||||||
case "U": // Cyclic year name. Need to be implemented.
|
|
||||||
throw createErrorUnsupportedFeature({
|
|
||||||
feature: "year pattern `" + chr + "`"
|
|
||||||
});
|
|
||||||
|
|
||||||
// Quarter
|
|
||||||
case "Q":
|
|
||||||
case "q":
|
|
||||||
if ( length > 2 ) {
|
|
||||||
if ( !properties.quarters ) {
|
|
||||||
properties.quarters = {};
|
|
||||||
}
|
|
||||||
if ( !properties.quarters[ chr ] ) {
|
|
||||||
properties.quarters[ chr ] = {};
|
|
||||||
}
|
|
||||||
properties.quarters[ chr ][ length ] = cldr.main([
|
|
||||||
"dates/calendars/gregorian/quarters",
|
|
||||||
chr === "Q" ? "format" : "stand-alone",
|
|
||||||
widths[ length - 3 ]
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
formatNumber = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Month
|
|
||||||
case "M":
|
|
||||||
case "L":
|
|
||||||
if ( length > 2 ) {
|
|
||||||
if ( !properties.months ) {
|
|
||||||
properties.months = {};
|
|
||||||
}
|
|
||||||
if ( !properties.months[ chr ] ) {
|
|
||||||
properties.months[ chr ] = {};
|
|
||||||
}
|
|
||||||
properties.months[ chr ][ length ] = cldr.main([
|
|
||||||
"dates/calendars/gregorian/months",
|
|
||||||
chr === "M" ? "format" : "stand-alone",
|
|
||||||
widths[ length - 3 ]
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
formatNumber = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Week - Week of Year (w) or Week of Month (W).
|
|
||||||
case "w":
|
|
||||||
case "W":
|
|
||||||
properties.firstDay = dateFirstDayOfWeek( cldr );
|
|
||||||
properties.minDays = cldr.supplemental.weekData.minDays();
|
|
||||||
formatNumber = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Day
|
|
||||||
case "d":
|
|
||||||
case "D":
|
|
||||||
case "F":
|
|
||||||
formatNumber = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "g":
|
|
||||||
// Modified Julian day. Need to be implemented.
|
|
||||||
throw createErrorUnsupportedFeature({
|
|
||||||
feature: "Julian day pattern `g`"
|
|
||||||
});
|
|
||||||
|
|
||||||
// Week day
|
|
||||||
case "e":
|
|
||||||
case "c":
|
|
||||||
if ( length <= 2 ) {
|
|
||||||
properties.firstDay = dateFirstDayOfWeek( cldr );
|
|
||||||
formatNumber = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* falls through */
|
|
||||||
case "E":
|
|
||||||
if ( !properties.days ) {
|
|
||||||
properties.days = {};
|
|
||||||
}
|
|
||||||
if ( !properties.days[ chr ] ) {
|
|
||||||
properties.days[ chr ] = {};
|
|
||||||
}
|
|
||||||
if ( length === 6 ) {
|
|
||||||
|
|
||||||
// If short day names are not explicitly specified, abbreviated day names are
|
|
||||||
// used instead.
|
|
||||||
// http://www.unicode.org/reports/tr35/tr35-dates.html#months_days_quarters_eras
|
|
||||||
// http://unicode.org/cldr/trac/ticket/6790
|
|
||||||
properties.days[ chr ][ length ] = cldr.main([
|
|
||||||
"dates/calendars/gregorian/days",
|
|
||||||
chr === "c" ? "stand-alone" : "format",
|
|
||||||
"short"
|
|
||||||
]) || cldr.main([
|
|
||||||
"dates/calendars/gregorian/days",
|
|
||||||
chr === "c" ? "stand-alone" : "format",
|
|
||||||
"abbreviated"
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
properties.days[ chr ][ length ] = cldr.main([
|
|
||||||
"dates/calendars/gregorian/days",
|
|
||||||
chr === "c" ? "stand-alone" : "format",
|
|
||||||
widths[ length < 3 ? 0 : length - 3 ]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Period (AM or PM)
|
|
||||||
case "a":
|
|
||||||
properties.dayPeriods = cldr.main(
|
|
||||||
"dates/calendars/gregorian/dayPeriods/format/wide"
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Hour
|
|
||||||
case "h": // 1-12
|
|
||||||
case "H": // 0-23
|
|
||||||
case "K": // 0-11
|
|
||||||
case "k": // 1-24
|
|
||||||
|
|
||||||
// Minute
|
|
||||||
case "m":
|
|
||||||
|
|
||||||
// Second
|
|
||||||
case "s":
|
|
||||||
case "S":
|
|
||||||
case "A":
|
|
||||||
formatNumber = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Zone
|
|
||||||
case "z":
|
|
||||||
case "O":
|
|
||||||
// O: "{gmtFormat}+H;{gmtFormat}-H" or "{gmtZeroFormat}", eg. "GMT-8" or "GMT".
|
|
||||||
// OOOO: "{gmtFormat}{hourFormat}" or "{gmtZeroFormat}", eg. "GMT-08:00" or "GMT".
|
|
||||||
properties.gmtFormat = cldr.main( "dates/timeZoneNames/gmtFormat" );
|
|
||||||
properties.gmtZeroFormat = cldr.main( "dates/timeZoneNames/gmtZeroFormat" );
|
|
||||||
properties.tzLongHourFormat = cldr.main( "dates/timeZoneNames/hourFormat" );
|
|
||||||
|
|
||||||
/* falls through */
|
|
||||||
case "Z":
|
|
||||||
case "X":
|
|
||||||
case "x":
|
|
||||||
setNumberFormatterPattern( 1 );
|
|
||||||
setNumberFormatterPattern( 2 );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "v":
|
|
||||||
case "V":
|
|
||||||
throw createErrorUnsupportedFeature({
|
|
||||||
feature: "timezone pattern `" + chr + "`"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( formatNumber ) {
|
|
||||||
setNumberFormatterPattern( length );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return properties;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -908,6 +576,7 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
var century, chr, value, length;
|
var century, chr, value, length;
|
||||||
|
|
||||||
if ( token.type === "literal" ) {
|
if ( token.type === "literal" ) {
|
||||||
|
|
||||||
// continue
|
// continue
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -916,6 +585,7 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
length = token.type.length;
|
length = token.type.length;
|
||||||
|
|
||||||
if ( chr === "j" ) {
|
if ( chr === "j" ) {
|
||||||
|
|
||||||
// Locale preferred hHKk.
|
// Locale preferred hHKk.
|
||||||
// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data
|
// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data
|
||||||
chr = properties.preferredTimeData;
|
chr = properties.preferredTimeData;
|
||||||
@ -936,6 +606,7 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
if ( outOfRange( value, 0, 99 ) ) {
|
if ( outOfRange( value, 0, 99 ) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// mimic dojo/date/locale: choose century to apply, according to a sliding
|
// mimic dojo/date/locale: choose century to apply, according to a sliding
|
||||||
// window of 80 years before and 20 years after present year.
|
// window of 80 years before and 20 years after present year.
|
||||||
century = Math.floor( date.getFullYear() / 100 ) * 100;
|
century = Math.floor( date.getFullYear() / 100 ) * 100;
|
||||||
@ -990,6 +661,7 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "F":
|
case "F":
|
||||||
|
|
||||||
// Day of Week in month. eg. 2nd Wed in July.
|
// Day of Week in month. eg. 2nd Wed in July.
|
||||||
// Skip
|
// Skip
|
||||||
break;
|
break;
|
||||||
@ -998,6 +670,7 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
case "e":
|
case "e":
|
||||||
case "c":
|
case "c":
|
||||||
case "E":
|
case "E":
|
||||||
|
|
||||||
// Skip.
|
// Skip.
|
||||||
// value = arrayIndexOf( dateWeekDays, token.value );
|
// value = arrayIndexOf( dateWeekDays, token.value );
|
||||||
break;
|
break;
|
||||||
@ -1104,6 +777,7 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( era === 0 ) {
|
if ( era === 0 ) {
|
||||||
|
|
||||||
// 1 BC = year 0
|
// 1 BC = year 0
|
||||||
date.setFullYear( date.getFullYear() * -1 + 1 );
|
date.setFullYear( date.getFullYear() * -1 + 1 );
|
||||||
}
|
}
|
||||||
@ -1141,22 +815,6 @@ var dateParse = function( value, tokens, properties ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* parseProperties( cldr )
|
|
||||||
*
|
|
||||||
* @cldr [Cldr instance].
|
|
||||||
*
|
|
||||||
* Return parser properties.
|
|
||||||
*/
|
|
||||||
var dateParseProperties = function( cldr ) {
|
|
||||||
return {
|
|
||||||
preferredTimeData: cldr.supplemental.timeData.preferred()
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generated by:
|
* Generated by:
|
||||||
*
|
*
|
||||||
@ -1319,6 +977,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
length = current.length;
|
length = current.length;
|
||||||
|
|
||||||
if ( chr === "Z" ) {
|
if ( chr === "Z" ) {
|
||||||
|
|
||||||
// Z..ZZZ: same as "xxxx".
|
// Z..ZZZ: same as "xxxx".
|
||||||
if ( length < 4 ) {
|
if ( length < 4 ) {
|
||||||
chr = "x";
|
chr = "x";
|
||||||
@ -1370,6 +1029,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
// Quarter
|
// Quarter
|
||||||
case "Q":
|
case "Q":
|
||||||
case "q":
|
case "q":
|
||||||
|
|
||||||
// number l=1:{1}, l=2:{2}.
|
// number l=1:{1}, l=2:{2}.
|
||||||
// lookup l=3...
|
// lookup l=3...
|
||||||
oneDigitIfLengthOne() || twoDigitsIfLengthTwo() || lookup([
|
oneDigitIfLengthOne() || twoDigitsIfLengthTwo() || lookup([
|
||||||
@ -1382,6 +1042,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
// Month
|
// Month
|
||||||
case "M":
|
case "M":
|
||||||
case "L":
|
case "L":
|
||||||
|
|
||||||
// number l=1:{1,2}, l=2:{2}.
|
// number l=1:{1,2}, l=2:{2}.
|
||||||
// lookup l=3...
|
// lookup l=3...
|
||||||
oneOrTwoDigitsIfLengthOne() || twoDigitsIfLengthTwo() || lookup([
|
oneOrTwoDigitsIfLengthOne() || twoDigitsIfLengthTwo() || lookup([
|
||||||
@ -1393,6 +1054,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
|
|
||||||
// Day
|
// Day
|
||||||
case "D":
|
case "D":
|
||||||
|
|
||||||
// number {l,3}.
|
// number {l,3}.
|
||||||
if ( length <= 3 ) {
|
if ( length <= 3 ) {
|
||||||
|
|
||||||
@ -1404,6 +1066,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
|
|
||||||
case "W":
|
case "W":
|
||||||
case "F":
|
case "F":
|
||||||
|
|
||||||
// number l=1:{1}.
|
// number l=1:{1}.
|
||||||
oneDigitIfLengthOne();
|
oneDigitIfLengthOne();
|
||||||
break;
|
break;
|
||||||
@ -1411,6 +1074,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
// Week day
|
// Week day
|
||||||
case "e":
|
case "e":
|
||||||
case "c":
|
case "c":
|
||||||
|
|
||||||
// number l=1:{1}, l=2:{2}.
|
// number l=1:{1}, l=2:{2}.
|
||||||
// lookup for length >=3.
|
// lookup for length >=3.
|
||||||
if ( length <= 2 ) {
|
if ( length <= 2 ) {
|
||||||
@ -1421,6 +1085,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
/* falls through */
|
/* falls through */
|
||||||
case "E":
|
case "E":
|
||||||
if ( length === 6 ) {
|
if ( length === 6 ) {
|
||||||
|
|
||||||
// Note: if short day names are not explicitly specified, abbreviated day
|
// Note: if short day names are not explicitly specified, abbreviated day
|
||||||
// names are used instead http://www.unicode.org/reports/tr35/tr35-dates.html#months_days_quarters_eras
|
// names are used instead http://www.unicode.org/reports/tr35/tr35-dates.html#months_days_quarters_eras
|
||||||
lookup([
|
lookup([
|
||||||
@ -1458,11 +1123,13 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
case "j":
|
case "j":
|
||||||
case "m":
|
case "m":
|
||||||
case "s":
|
case "s":
|
||||||
|
|
||||||
// number l1:{1,2}, l2:{2}.
|
// number l1:{1,2}, l2:{2}.
|
||||||
oneOrTwoDigitsIfLengthOne() || twoDigitsIfLengthTwo();
|
oneOrTwoDigitsIfLengthOne() || twoDigitsIfLengthTwo();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "S":
|
case "S":
|
||||||
|
|
||||||
// number {l}.
|
// number {l}.
|
||||||
|
|
||||||
// Unicode equivalent to /\d{length}/
|
// Unicode equivalent to /\d{length}/
|
||||||
@ -1471,6 +1138,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "A":
|
case "A":
|
||||||
|
|
||||||
// number {l+5}.
|
// number {l+5}.
|
||||||
|
|
||||||
// Unicode equivalent to /\d{length+5}/
|
// Unicode equivalent to /\d{length+5}/
|
||||||
@ -1481,6 +1149,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
// Zone
|
// Zone
|
||||||
case "z":
|
case "z":
|
||||||
case "O":
|
case "O":
|
||||||
|
|
||||||
// O: "{gmtFormat}+H;{gmtFormat}-H" or "{gmtZeroFormat}", eg. "GMT-8" or "GMT".
|
// O: "{gmtFormat}+H;{gmtFormat}-H" or "{gmtZeroFormat}", eg. "GMT-8" or "GMT".
|
||||||
// OOOO: "{gmtFormat}{hourFormat}" or "{gmtZeroFormat}", eg. "GMT-08:00" or "GMT".
|
// OOOO: "{gmtFormat}{hourFormat}" or "{gmtZeroFormat}", eg. "GMT-08:00" or "GMT".
|
||||||
if ( value === properties[ "timeZoneNames/gmtZeroFormat" ] ) {
|
if ( value === properties[ "timeZoneNames/gmtZeroFormat" ] ) {
|
||||||
@ -1499,6 +1168,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "X":
|
case "X":
|
||||||
|
|
||||||
// Same as x*, except it uses "Z" for zero offset.
|
// Same as x*, except it uses "Z" for zero offset.
|
||||||
if ( value === "Z" ) {
|
if ( value === "Z" ) {
|
||||||
token.value = 0;
|
token.value = 0;
|
||||||
@ -1508,6 +1178,7 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
|
|
||||||
/* falls through */
|
/* falls through */
|
||||||
case "x":
|
case "x":
|
||||||
|
|
||||||
// x: hourFormat("+HH;-HH")
|
// x: hourFormat("+HH;-HH")
|
||||||
// xx or xxxx: hourFormat("+HHmm;-HHmm")
|
// xx or xxxx: hourFormat("+HHmm;-HHmm")
|
||||||
// xxx or xxxxx: hourFormat("+HH:mm;-HH:mm")
|
// xxx or xxxxx: hourFormat("+HH:mm;-HH:mm")
|
||||||
@ -1560,239 +1231,8 @@ var dateTokenizer = function( value, numberParser, properties ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
var dateParserFn = function( numberParser, parseProperties, tokenizerProperties ) {
|
||||||
* tokenizerProperties( pattern, cldr )
|
return function dateParser( value ) {
|
||||||
*
|
|
||||||
* @pattern [String] raw pattern.
|
|
||||||
*
|
|
||||||
* @cldr [Cldr instance].
|
|
||||||
*
|
|
||||||
* Return Object with data that will be used by tokenizer.
|
|
||||||
*/
|
|
||||||
var dateTokenizerProperties = function( pattern, cldr ) {
|
|
||||||
var properties = {
|
|
||||||
pattern: pattern,
|
|
||||||
timeSeparator: numberSymbol( "timeSeparator", cldr )
|
|
||||||
},
|
|
||||||
widths = [ "abbreviated", "wide", "narrow" ];
|
|
||||||
|
|
||||||
function populateProperties( path, value ) {
|
|
||||||
|
|
||||||
// The `dates` and `calendars` trim's purpose is to reduce properties' key size only.
|
|
||||||
properties[ path.replace( /^.*\/dates\//, "" ).replace( /calendars\//, "" ) ] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
cldr.on( "get", populateProperties );
|
|
||||||
|
|
||||||
pattern.match( datePatternRe ).forEach(function( current ) {
|
|
||||||
var chr, length;
|
|
||||||
|
|
||||||
chr = current.charAt( 0 ),
|
|
||||||
length = current.length;
|
|
||||||
|
|
||||||
if ( chr === "Z" && length < 5 ) {
|
|
||||||
chr = "O";
|
|
||||||
length = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ( chr ) {
|
|
||||||
|
|
||||||
// Era
|
|
||||||
case "G":
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/eras",
|
|
||||||
length <= 3 ? "eraAbbr" : ( length === 4 ? "eraNames" : "eraNarrow" )
|
|
||||||
]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Year
|
|
||||||
case "u": // Extended year. Need to be implemented.
|
|
||||||
case "U": // Cyclic year name. Need to be implemented.
|
|
||||||
throw createErrorUnsupportedFeature({
|
|
||||||
feature: "year pattern `" + chr + "`"
|
|
||||||
});
|
|
||||||
|
|
||||||
// Quarter
|
|
||||||
case "Q":
|
|
||||||
case "q":
|
|
||||||
if ( length > 2 ) {
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/quarters",
|
|
||||||
chr === "Q" ? "format" : "stand-alone",
|
|
||||||
widths[ length - 3 ]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Month
|
|
||||||
case "M":
|
|
||||||
case "L":
|
|
||||||
// number l=1:{1,2}, l=2:{2}.
|
|
||||||
// lookup l=3...
|
|
||||||
if ( length > 2 ) {
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/months",
|
|
||||||
chr === "M" ? "format" : "stand-alone",
|
|
||||||
widths[ length - 3 ]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Day
|
|
||||||
case "g":
|
|
||||||
// Modified Julian day. Need to be implemented.
|
|
||||||
throw createErrorUnsupportedFeature({
|
|
||||||
feature: "Julian day pattern `g`"
|
|
||||||
});
|
|
||||||
|
|
||||||
// Week day
|
|
||||||
case "e":
|
|
||||||
case "c":
|
|
||||||
// lookup for length >=3.
|
|
||||||
if ( length <= 2 ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* falls through */
|
|
||||||
case "E":
|
|
||||||
if ( length === 6 ) {
|
|
||||||
// Note: if short day names are not explicitly specified, abbreviated day
|
|
||||||
// names are used instead http://www.unicode.org/reports/tr35/tr35-dates.html#months_days_quarters_eras
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/days",
|
|
||||||
[ chr === "c" ? "stand-alone" : "format" ],
|
|
||||||
"short"
|
|
||||||
]) || cldr.main([
|
|
||||||
"dates/calendars/gregorian/days",
|
|
||||||
[ chr === "c" ? "stand-alone" : "format" ],
|
|
||||||
"abbreviated"
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/days",
|
|
||||||
[ chr === "c" ? "stand-alone" : "format" ],
|
|
||||||
widths[ length < 3 ? 0 : length - 3 ]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Period (AM or PM)
|
|
||||||
case "a":
|
|
||||||
cldr.main([
|
|
||||||
"dates/calendars/gregorian/dayPeriods/format/wide"
|
|
||||||
]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Zone
|
|
||||||
case "z":
|
|
||||||
case "O":
|
|
||||||
cldr.main( "dates/timeZoneNames/gmtFormat" );
|
|
||||||
cldr.main( "dates/timeZoneNames/gmtZeroFormat" );
|
|
||||||
cldr.main( "dates/timeZoneNames/hourFormat" );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "v":
|
|
||||||
case "V":
|
|
||||||
throw createErrorUnsupportedFeature({
|
|
||||||
feature: "timezone pattern `" + chr + "`"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cldr.off( "get", populateProperties );
|
|
||||||
|
|
||||||
return properties;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function validateRequiredCldr( path, value ) {
|
|
||||||
validateCldr( path, value, {
|
|
||||||
skip: [
|
|
||||||
/dates\/calendars\/gregorian\/dateTimeFormats\/availableFormats/,
|
|
||||||
/dates\/calendars\/gregorian\/days\/.*\/short/,
|
|
||||||
/supplemental\/timeData\/(?!001)/,
|
|
||||||
/supplemental\/weekData\/(?!001)/
|
|
||||||
]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* .dateFormatter( options )
|
|
||||||
*
|
|
||||||
* @options [Object] see date/expand_pattern for more info.
|
|
||||||
*
|
|
||||||
* Return a date formatter function (of the form below) according to the given options and the
|
|
||||||
* default/instance locale.
|
|
||||||
*
|
|
||||||
* fn( value )
|
|
||||||
*
|
|
||||||
* @value [Date]
|
|
||||||
*
|
|
||||||
* Return a function that formats a date according to the given `format` and the default/instance
|
|
||||||
* locale.
|
|
||||||
*/
|
|
||||||
Globalize.dateFormatter =
|
|
||||||
Globalize.prototype.dateFormatter = function( options ) {
|
|
||||||
var cldr, numberFormatters, pad, pattern, properties;
|
|
||||||
|
|
||||||
validateParameterTypePlainObject( options, "options" );
|
|
||||||
|
|
||||||
cldr = this.cldr;
|
|
||||||
options = options || { skeleton: "yMd" };
|
|
||||||
|
|
||||||
validateDefaultLocale( cldr );
|
|
||||||
|
|
||||||
cldr.on( "get", validateRequiredCldr );
|
|
||||||
pattern = dateExpandPattern( options, cldr );
|
|
||||||
properties = dateFormatProperties( pattern, cldr );
|
|
||||||
cldr.off( "get", validateRequiredCldr );
|
|
||||||
|
|
||||||
// Create needed number formatters.
|
|
||||||
numberFormatters = properties.numberFormatters;
|
|
||||||
delete properties.numberFormatters;
|
|
||||||
for ( pad in numberFormatters ) {
|
|
||||||
numberFormatters[ pad ] = this.numberFormatter({
|
|
||||||
raw: numberFormatters[ pad ]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return function( value ) {
|
|
||||||
validateParameterPresence( value, "value" );
|
|
||||||
validateParameterTypeDate( value, "value" );
|
|
||||||
return dateFormat( value, numberFormatters, properties );
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* .dateParser( options )
|
|
||||||
*
|
|
||||||
* @options [Object] see date/expand_pattern for more info.
|
|
||||||
*
|
|
||||||
* Return a function that parses a string date according to the given `formats` and the
|
|
||||||
* default/instance locale.
|
|
||||||
*/
|
|
||||||
Globalize.dateParser =
|
|
||||||
Globalize.prototype.dateParser = function( options ) {
|
|
||||||
var cldr, numberParser, parseProperties, pattern, tokenizerProperties;
|
|
||||||
|
|
||||||
validateParameterTypePlainObject( options, "options" );
|
|
||||||
|
|
||||||
cldr = this.cldr;
|
|
||||||
options = options || { skeleton: "yMd" };
|
|
||||||
|
|
||||||
validateDefaultLocale( cldr );
|
|
||||||
|
|
||||||
cldr.on( "get", validateRequiredCldr );
|
|
||||||
pattern = dateExpandPattern( options, cldr );
|
|
||||||
tokenizerProperties = dateTokenizerProperties( pattern, cldr );
|
|
||||||
parseProperties = dateParseProperties( cldr );
|
|
||||||
cldr.off( "get", validateRequiredCldr );
|
|
||||||
|
|
||||||
numberParser = this.numberParser({ raw: "0" });
|
|
||||||
|
|
||||||
return function( value ) {
|
|
||||||
var tokens;
|
var tokens;
|
||||||
|
|
||||||
validateParameterPresence( value, "value" );
|
validateParameterPresence( value, "value" );
|
||||||
@ -1803,15 +1243,28 @@ Globalize.prototype.dateParser = function( options ) {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* .formatDate( value, options )
|
|
||||||
*
|
|
||||||
* @value [Date]
|
Globalize._dateFormatterFn = dateFormatterFn;
|
||||||
*
|
Globalize._dateParserFn = dateParserFn;
|
||||||
* @options [Object] see date/expand_pattern for more info.
|
Globalize._dateFormat = dateFormat;
|
||||||
*
|
Globalize._dateParser = dateParse;
|
||||||
* Formats a date or number according to the given options string and the default/instance locale.
|
Globalize._dateTokenizer = dateTokenizer;
|
||||||
*/
|
Globalize._validateParameterTypeDate = validateParameterTypeDate;
|
||||||
|
|
||||||
|
Globalize.dateFormatter =
|
||||||
|
Globalize.prototype.dateFormatter = function( options ) {
|
||||||
|
options = options || { skeleton: "yMd" };
|
||||||
|
return Globalize[ runtimeKey( "dateFormatter", this._locale, [ options ] ) ];
|
||||||
|
};
|
||||||
|
|
||||||
|
Globalize.dateParser =
|
||||||
|
Globalize.prototype.dateParser = function( options ) {
|
||||||
|
options = options || { skeleton: "yMd" };
|
||||||
|
return Globalize[ runtimeKey( "dateParser", this._locale, [ options ] ) ];
|
||||||
|
};
|
||||||
|
|
||||||
Globalize.formatDate =
|
Globalize.formatDate =
|
||||||
Globalize.prototype.formatDate = function( value, options ) {
|
Globalize.prototype.formatDate = function( value, options ) {
|
||||||
validateParameterPresence( value, "value" );
|
validateParameterPresence( value, "value" );
|
||||||
@ -1820,15 +1273,6 @@ Globalize.prototype.formatDate = function( value, options ) {
|
|||||||
return this.dateFormatter( options )( value );
|
return this.dateFormatter( options )( value );
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* .parseDate( value, options )
|
|
||||||
*
|
|
||||||
* @value [String]
|
|
||||||
*
|
|
||||||
* @options [Object] see date/expand_pattern for more info.
|
|
||||||
*
|
|
||||||
* Return a Date instance or null.
|
|
||||||
*/
|
|
||||||
Globalize.parseDate =
|
Globalize.parseDate =
|
||||||
Globalize.prototype.parseDate = function( value, options ) {
|
Globalize.prototype.parseDate = function( value, options ) {
|
||||||
validateParameterPresence( value, "value" );
|
validateParameterPresence( value, "value" );
|
682
external/globalize/globalize-runtime/number.js
vendored
Normal file
682
external/globalize/globalize-runtime/number.js
vendored
Normal file
@ -0,0 +1,682 @@
|
|||||||
|
/**
|
||||||
|
* Globalize Runtime v1.1.0-rc.6
|
||||||
|
*
|
||||||
|
* http://github.com/jquery/globalize
|
||||||
|
*
|
||||||
|
* Copyright jQuery Foundation and other contributors
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://jquery.org/license
|
||||||
|
*
|
||||||
|
* Date: 2015-11-18T10:38Z
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* Globalize Runtime v1.1.0-rc.6 2015-11-18T10:38Z Released under the MIT license
|
||||||
|
* http://git.io/TrdQbw
|
||||||
|
*/
|
||||||
|
(function( root, factory ) {
|
||||||
|
|
||||||
|
// UMD returnExports
|
||||||
|
if ( typeof define === "function" && define.amd ) {
|
||||||
|
|
||||||
|
// AMD
|
||||||
|
define([
|
||||||
|
"../globalize-runtime"
|
||||||
|
], factory );
|
||||||
|
} else if ( typeof exports === "object" ) {
|
||||||
|
|
||||||
|
// Node, CommonJS
|
||||||
|
module.exports = factory( require( "../globalize-runtime" ) );
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Extend global
|
||||||
|
factory( root.Globalize );
|
||||||
|
}
|
||||||
|
}(this, function( Globalize ) {
|
||||||
|
|
||||||
|
var createError = Globalize._createError,
|
||||||
|
regexpEscape = Globalize._regexpEscape,
|
||||||
|
runtimeKey = Globalize._runtimeKey,
|
||||||
|
stringPad = Globalize._stringPad,
|
||||||
|
validateParameterType = Globalize._validateParameterType,
|
||||||
|
validateParameterPresence = Globalize._validateParameterPresence,
|
||||||
|
validateParameterTypeString = Globalize._validateParameterTypeString;
|
||||||
|
|
||||||
|
|
||||||
|
var createErrorUnsupportedFeature = function( feature ) {
|
||||||
|
return createError( "E_UNSUPPORTED", "Unsupported {feature}.", {
|
||||||
|
feature: feature
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var validateParameterTypeNumber = function( value, name ) {
|
||||||
|
validateParameterType(
|
||||||
|
value,
|
||||||
|
name,
|
||||||
|
value === undefined || typeof value === "number",
|
||||||
|
"Number"
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* goupingSeparator( number, primaryGroupingSize, secondaryGroupingSize )
|
||||||
|
*
|
||||||
|
* @number [Number].
|
||||||
|
*
|
||||||
|
* @primaryGroupingSize [Number]
|
||||||
|
*
|
||||||
|
* @secondaryGroupingSize [Number]
|
||||||
|
*
|
||||||
|
* Return the formatted number with group separator.
|
||||||
|
*/
|
||||||
|
var numberFormatGroupingSeparator = function( number, primaryGroupingSize, secondaryGroupingSize ) {
|
||||||
|
var index,
|
||||||
|
currentGroupingSize = primaryGroupingSize,
|
||||||
|
ret = "",
|
||||||
|
sep = ",",
|
||||||
|
switchToSecondary = secondaryGroupingSize ? true : false;
|
||||||
|
|
||||||
|
number = String( number ).split( "." );
|
||||||
|
index = number[ 0 ].length;
|
||||||
|
|
||||||
|
while ( index > currentGroupingSize ) {
|
||||||
|
ret = number[ 0 ].slice( index - currentGroupingSize, index ) +
|
||||||
|
( ret.length ? sep : "" ) + ret;
|
||||||
|
index -= currentGroupingSize;
|
||||||
|
if ( switchToSecondary ) {
|
||||||
|
currentGroupingSize = secondaryGroupingSize;
|
||||||
|
switchToSecondary = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
number[ 0 ] = number[ 0 ].slice( 0, index ) + ( ret.length ? sep : "" ) + ret;
|
||||||
|
return number.join( "." );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* integerFractionDigits( number, minimumIntegerDigits, minimumFractionDigits,
|
||||||
|
* maximumFractionDigits, round, roundIncrement )
|
||||||
|
*
|
||||||
|
* @number [Number]
|
||||||
|
*
|
||||||
|
* @minimumIntegerDigits [Number]
|
||||||
|
*
|
||||||
|
* @minimumFractionDigits [Number]
|
||||||
|
*
|
||||||
|
* @maximumFractionDigits [Number]
|
||||||
|
*
|
||||||
|
* @round [Function]
|
||||||
|
*
|
||||||
|
* @roundIncrement [Function]
|
||||||
|
*
|
||||||
|
* Return the formatted integer and fraction digits.
|
||||||
|
*/
|
||||||
|
var numberFormatIntegerFractionDigits = function( number, minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, round,
|
||||||
|
roundIncrement ) {
|
||||||
|
|
||||||
|
// Fraction
|
||||||
|
if ( maximumFractionDigits ) {
|
||||||
|
|
||||||
|
// Rounding
|
||||||
|
if ( roundIncrement ) {
|
||||||
|
number = round( number, roundIncrement );
|
||||||
|
|
||||||
|
// Maximum fraction digits
|
||||||
|
} else {
|
||||||
|
number = round( number, { exponent: -maximumFractionDigits } );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Minimum fraction digits
|
||||||
|
if ( minimumFractionDigits ) {
|
||||||
|
number = String( number ).split( "." );
|
||||||
|
number[ 1 ] = stringPad( number[ 1 ] || "", minimumFractionDigits, true );
|
||||||
|
number = number.join( "." );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
number = round( number );
|
||||||
|
}
|
||||||
|
|
||||||
|
number = String( number );
|
||||||
|
|
||||||
|
// Minimum integer digits
|
||||||
|
if ( minimumIntegerDigits ) {
|
||||||
|
number = number.split( "." );
|
||||||
|
number[ 0 ] = stringPad( number[ 0 ], minimumIntegerDigits );
|
||||||
|
number = number.join( "." );
|
||||||
|
}
|
||||||
|
|
||||||
|
return number;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* toPrecision( number, precision, round )
|
||||||
|
*
|
||||||
|
* @number (Number)
|
||||||
|
*
|
||||||
|
* @precision (Number) significant figures precision (not decimal precision).
|
||||||
|
*
|
||||||
|
* @round (Function)
|
||||||
|
*
|
||||||
|
* Return number.toPrecision( precision ) using the given round function.
|
||||||
|
*/
|
||||||
|
var numberToPrecision = function( number, precision, round ) {
|
||||||
|
var roundOrder;
|
||||||
|
|
||||||
|
// Get number at two extra significant figure precision.
|
||||||
|
number = number.toPrecision( precision + 2 );
|
||||||
|
|
||||||
|
// Then, round it to the required significant figure precision.
|
||||||
|
roundOrder = Math.ceil( Math.log( Math.abs( number ) ) / Math.log( 10 ) );
|
||||||
|
roundOrder -= precision;
|
||||||
|
|
||||||
|
return round( number, { exponent: roundOrder } );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* toPrecision( number, minimumSignificantDigits, maximumSignificantDigits, round )
|
||||||
|
*
|
||||||
|
* @number [Number]
|
||||||
|
*
|
||||||
|
* @minimumSignificantDigits [Number]
|
||||||
|
*
|
||||||
|
* @maximumSignificantDigits [Number]
|
||||||
|
*
|
||||||
|
* @round [Function]
|
||||||
|
*
|
||||||
|
* Return the formatted significant digits number.
|
||||||
|
*/
|
||||||
|
var numberFormatSignificantDigits = function( number, minimumSignificantDigits, maximumSignificantDigits, round ) {
|
||||||
|
var atMinimum, atMaximum;
|
||||||
|
|
||||||
|
// Sanity check.
|
||||||
|
if ( minimumSignificantDigits > maximumSignificantDigits ) {
|
||||||
|
maximumSignificantDigits = minimumSignificantDigits;
|
||||||
|
}
|
||||||
|
|
||||||
|
atMinimum = numberToPrecision( number, minimumSignificantDigits, round );
|
||||||
|
atMaximum = numberToPrecision( number, maximumSignificantDigits, round );
|
||||||
|
|
||||||
|
// Use atMaximum only if it has more significant digits than atMinimum.
|
||||||
|
number = +atMinimum === +atMaximum ? atMinimum : atMaximum;
|
||||||
|
|
||||||
|
// Expand integer numbers, eg. 123e5 to 12300.
|
||||||
|
number = ( +number ).toString( 10 );
|
||||||
|
|
||||||
|
if ( ( /e/ ).test( number ) ) {
|
||||||
|
throw createErrorUnsupportedFeature({
|
||||||
|
feature: "integers out of (1e21, 1e-7)"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add trailing zeros if necessary.
|
||||||
|
if ( minimumSignificantDigits - number.replace( /^0+|\./g, "" ).length > 0 ) {
|
||||||
|
number = number.split( "." );
|
||||||
|
number[ 1 ] = stringPad( number[ 1 ] || "", minimumSignificantDigits - number[ 0 ].replace( /^0+/, "" ).length, true );
|
||||||
|
number = number.join( "." );
|
||||||
|
}
|
||||||
|
|
||||||
|
return number;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* format( number, properties )
|
||||||
|
*
|
||||||
|
* @number [Number].
|
||||||
|
*
|
||||||
|
* @properties [Object] Output of number/format-properties.
|
||||||
|
*
|
||||||
|
* Return the formatted number.
|
||||||
|
* ref: http://www.unicode.org/reports/tr35/tr35-numbers.html
|
||||||
|
*/
|
||||||
|
var numberFormat = function( number, properties ) {
|
||||||
|
var infinitySymbol, maximumFractionDigits, maximumSignificantDigits, minimumFractionDigits,
|
||||||
|
minimumIntegerDigits, minimumSignificantDigits, nanSymbol, nuDigitsMap, padding, prefix,
|
||||||
|
primaryGroupingSize, pattern, ret, round, roundIncrement, secondaryGroupingSize, suffix,
|
||||||
|
symbolMap;
|
||||||
|
|
||||||
|
padding = properties[ 1 ];
|
||||||
|
minimumIntegerDigits = properties[ 2 ];
|
||||||
|
minimumFractionDigits = properties[ 3 ];
|
||||||
|
maximumFractionDigits = properties[ 4 ];
|
||||||
|
minimumSignificantDigits = properties[ 5 ];
|
||||||
|
maximumSignificantDigits = properties[ 6 ];
|
||||||
|
roundIncrement = properties[ 7 ];
|
||||||
|
primaryGroupingSize = properties[ 8 ];
|
||||||
|
secondaryGroupingSize = properties[ 9 ];
|
||||||
|
round = properties[ 15 ];
|
||||||
|
infinitySymbol = properties[ 16 ];
|
||||||
|
nanSymbol = properties[ 17 ];
|
||||||
|
symbolMap = properties[ 18 ];
|
||||||
|
nuDigitsMap = properties[ 19 ];
|
||||||
|
|
||||||
|
// NaN
|
||||||
|
if ( isNaN( number ) ) {
|
||||||
|
return nanSymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( number < 0 ) {
|
||||||
|
pattern = properties[ 12 ];
|
||||||
|
prefix = properties[ 13 ];
|
||||||
|
suffix = properties[ 14 ];
|
||||||
|
} else {
|
||||||
|
pattern = properties[ 11 ];
|
||||||
|
prefix = properties[ 0 ];
|
||||||
|
suffix = properties[ 10 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Infinity
|
||||||
|
if ( !isFinite( number ) ) {
|
||||||
|
return prefix + infinitySymbol + suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = prefix;
|
||||||
|
|
||||||
|
// Percent
|
||||||
|
if ( pattern.indexOf( "%" ) !== -1 ) {
|
||||||
|
number *= 100;
|
||||||
|
|
||||||
|
// Per mille
|
||||||
|
} else if ( pattern.indexOf( "\u2030" ) !== -1 ) {
|
||||||
|
number *= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Significant digit format
|
||||||
|
if ( !isNaN( minimumSignificantDigits * maximumSignificantDigits ) ) {
|
||||||
|
number = numberFormatSignificantDigits( number, minimumSignificantDigits,
|
||||||
|
maximumSignificantDigits, round );
|
||||||
|
|
||||||
|
// Integer and fractional format
|
||||||
|
} else {
|
||||||
|
number = numberFormatIntegerFractionDigits( number, minimumIntegerDigits,
|
||||||
|
minimumFractionDigits, maximumFractionDigits, round, roundIncrement );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the possible number minus sign
|
||||||
|
number = number.replace( /^-/, "" );
|
||||||
|
|
||||||
|
// Grouping separators
|
||||||
|
if ( primaryGroupingSize ) {
|
||||||
|
number = numberFormatGroupingSeparator( number, primaryGroupingSize,
|
||||||
|
secondaryGroupingSize );
|
||||||
|
}
|
||||||
|
|
||||||
|
ret += number;
|
||||||
|
|
||||||
|
// Scientific notation
|
||||||
|
// TODO implement here
|
||||||
|
|
||||||
|
// Padding/'([^']|'')+'|''|[.,\-+E%\u2030]/g
|
||||||
|
// TODO implement here
|
||||||
|
|
||||||
|
ret += suffix;
|
||||||
|
|
||||||
|
return ret.replace( /('([^']|'')+'|'')|./g, function( character, literal ) {
|
||||||
|
|
||||||
|
// Literals
|
||||||
|
if ( literal ) {
|
||||||
|
literal = literal.replace( /''/, "'" );
|
||||||
|
if ( literal.length > 2 ) {
|
||||||
|
literal = literal.slice( 1, -1 );
|
||||||
|
}
|
||||||
|
return literal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Symbols
|
||||||
|
character = character.replace( /[.,\-+E%\u2030]/, function( symbol ) {
|
||||||
|
return symbolMap[ symbol ];
|
||||||
|
});
|
||||||
|
|
||||||
|
// Numbering system
|
||||||
|
if ( nuDigitsMap ) {
|
||||||
|
character = character.replace( /[0-9]/, function( digit ) {
|
||||||
|
return nuDigitsMap[ +digit ];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return character;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var numberFormatterFn = function( properties ) {
|
||||||
|
return function numberFormatter( value ) {
|
||||||
|
validateParameterPresence( value, "value" );
|
||||||
|
validateParameterTypeNumber( value, "value" );
|
||||||
|
|
||||||
|
return numberFormat( value, properties );
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EBNF representation:
|
||||||
|
*
|
||||||
|
* number_pattern_re = prefix_including_padding?
|
||||||
|
* number
|
||||||
|
* scientific_notation?
|
||||||
|
* suffix?
|
||||||
|
*
|
||||||
|
* number = integer_including_group_separator fraction_including_decimal_separator
|
||||||
|
*
|
||||||
|
* integer_including_group_separator =
|
||||||
|
* regexp([0-9,]*[0-9]+)
|
||||||
|
*
|
||||||
|
* fraction_including_decimal_separator =
|
||||||
|
* regexp((\.[0-9]+)?)
|
||||||
|
|
||||||
|
* prefix_including_padding = non_number_stuff
|
||||||
|
*
|
||||||
|
* scientific_notation = regexp(E[+-]?[0-9]+)
|
||||||
|
*
|
||||||
|
* suffix = non_number_stuff
|
||||||
|
*
|
||||||
|
* non_number_stuff = regexp([^0-9]*)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Regexp groups:
|
||||||
|
*
|
||||||
|
* 0: number_pattern_re
|
||||||
|
* 1: prefix
|
||||||
|
* 2: integer_including_group_separator fraction_including_decimal_separator
|
||||||
|
* 3: integer_including_group_separator
|
||||||
|
* 4: fraction_including_decimal_separator
|
||||||
|
* 5: scientific_notation
|
||||||
|
* 6: suffix
|
||||||
|
*/
|
||||||
|
var numberNumberRe = ( /^([^0-9]*)(([0-9,]*[0-9]+)(\.[0-9]+)?)(E[+-]?[0-9]+)?([^0-9]*)$/ );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse( value, properties )
|
||||||
|
*
|
||||||
|
* @value [String].
|
||||||
|
*
|
||||||
|
* @properties [Object] Parser properties is a reduced pre-processed cldr
|
||||||
|
* data set returned by numberParserProperties().
|
||||||
|
*
|
||||||
|
* Return the parsed Number (including Infinity) or NaN when value is invalid.
|
||||||
|
* ref: http://www.unicode.org/reports/tr35/tr35-numbers.html
|
||||||
|
*/
|
||||||
|
var numberParse = function( value, properties ) {
|
||||||
|
var aux, infinitySymbol, invertedNuDigitsMap, invertedSymbolMap, localizedDigitRe,
|
||||||
|
localizedSymbolsRe, negativePrefix, negativeSuffix, number, prefix, suffix;
|
||||||
|
|
||||||
|
infinitySymbol = properties[ 0 ];
|
||||||
|
invertedSymbolMap = properties[ 1 ];
|
||||||
|
negativePrefix = properties[ 2 ];
|
||||||
|
negativeSuffix = properties[ 3 ];
|
||||||
|
invertedNuDigitsMap = properties[ 4 ];
|
||||||
|
|
||||||
|
// Infinite number.
|
||||||
|
if ( aux = value.match( infinitySymbol ) ) {
|
||||||
|
|
||||||
|
number = Infinity;
|
||||||
|
prefix = value.slice( 0, aux.length );
|
||||||
|
suffix = value.slice( aux.length + 1 );
|
||||||
|
|
||||||
|
// Finite number.
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// TODO: Create it during setup, i.e., make it a property.
|
||||||
|
localizedSymbolsRe = new RegExp(
|
||||||
|
Object.keys( invertedSymbolMap ).map(function( localizedSymbol ) {
|
||||||
|
return regexpEscape( localizedSymbol );
|
||||||
|
}).join( "|" ),
|
||||||
|
"g"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Reverse localized symbols.
|
||||||
|
value = value.replace( localizedSymbolsRe, function( localizedSymbol ) {
|
||||||
|
return invertedSymbolMap[ localizedSymbol ];
|
||||||
|
});
|
||||||
|
|
||||||
|
// Reverse localized numbering system.
|
||||||
|
if ( invertedNuDigitsMap ) {
|
||||||
|
|
||||||
|
// TODO: Create it during setup, i.e., make it a property.
|
||||||
|
localizedDigitRe = new RegExp(
|
||||||
|
Object.keys( invertedNuDigitsMap ).map(function( localizedDigit ) {
|
||||||
|
return regexpEscape( localizedDigit );
|
||||||
|
}).join( "|" ),
|
||||||
|
"g"
|
||||||
|
);
|
||||||
|
value = value.replace( localizedDigitRe, function( localizedDigit ) {
|
||||||
|
return invertedNuDigitsMap[ localizedDigit ];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add padding zero to leading decimal.
|
||||||
|
if ( value.charAt( 0 ) === "." ) {
|
||||||
|
value = "0" + value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is it a valid number?
|
||||||
|
value = value.match( numberNumberRe );
|
||||||
|
if ( !value ) {
|
||||||
|
|
||||||
|
// Invalid number.
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix = value[ 1 ];
|
||||||
|
suffix = value[ 6 ];
|
||||||
|
|
||||||
|
// Remove grouping separators.
|
||||||
|
number = value[ 2 ].replace( /,/g, "" );
|
||||||
|
|
||||||
|
// Scientific notation
|
||||||
|
if ( value[ 5 ] ) {
|
||||||
|
number += value[ 5 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
number = +number;
|
||||||
|
|
||||||
|
// Is it a valid number?
|
||||||
|
if ( isNaN( number ) ) {
|
||||||
|
|
||||||
|
// Invalid number.
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Percent
|
||||||
|
if ( value[ 0 ].indexOf( "%" ) !== -1 ) {
|
||||||
|
number /= 100;
|
||||||
|
suffix = suffix.replace( "%", "" );
|
||||||
|
|
||||||
|
// Per mille
|
||||||
|
} else if ( value[ 0 ].indexOf( "\u2030" ) !== -1 ) {
|
||||||
|
number /= 1000;
|
||||||
|
suffix = suffix.replace( "\u2030", "" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Negative number
|
||||||
|
// "If there is an explicit negative subpattern, it serves only to specify the negative prefix
|
||||||
|
// and suffix. If there is no explicit negative subpattern, the negative subpattern is the
|
||||||
|
// localized minus sign prefixed to the positive subpattern" UTS#35
|
||||||
|
if ( prefix === negativePrefix && suffix === negativeSuffix ) {
|
||||||
|
number *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return number;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var numberParserFn = function( properties ) {
|
||||||
|
return function numberParser( value ) {
|
||||||
|
validateParameterPresence( value, "value" );
|
||||||
|
validateParameterTypeString( value, "value" );
|
||||||
|
|
||||||
|
return numberParse( value, properties );
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var numberTruncate = function( value ) {
|
||||||
|
if ( isNaN( value ) ) {
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
return Math[ value < 0 ? "ceil" : "floor" ]( value );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* round( method )
|
||||||
|
*
|
||||||
|
* @method [String] with either "round", "ceil", "floor", or "truncate".
|
||||||
|
*
|
||||||
|
* Return function( value, incrementOrExp ):
|
||||||
|
*
|
||||||
|
* @value [Number] eg. 123.45.
|
||||||
|
*
|
||||||
|
* @incrementOrExp [Number] optional, eg. 0.1; or
|
||||||
|
* [Object] Either { increment: <value> } or { exponent: <value> }
|
||||||
|
*
|
||||||
|
* Return the rounded number, eg:
|
||||||
|
* - round( "round" )( 123.45 ): 123;
|
||||||
|
* - round( "ceil" )( 123.45 ): 124;
|
||||||
|
* - round( "floor" )( 123.45 ): 123;
|
||||||
|
* - round( "truncate" )( 123.45 ): 123;
|
||||||
|
* - round( "round" )( 123.45, 0.1 ): 123.5;
|
||||||
|
* - round( "round" )( 123.45, 10 ): 120;
|
||||||
|
*
|
||||||
|
* Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
||||||
|
* Ref: #376
|
||||||
|
*/
|
||||||
|
var numberRound = function( method ) {
|
||||||
|
method = method || "round";
|
||||||
|
method = method === "truncate" ? numberTruncate : Math[ method ];
|
||||||
|
|
||||||
|
return function( value, incrementOrExp ) {
|
||||||
|
var exp, increment;
|
||||||
|
|
||||||
|
value = +value;
|
||||||
|
|
||||||
|
// If the value is not a number, return NaN.
|
||||||
|
if ( isNaN( value ) ) {
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exponent given.
|
||||||
|
if ( typeof incrementOrExp === "object" && incrementOrExp.exponent ) {
|
||||||
|
exp = +incrementOrExp.exponent;
|
||||||
|
increment = 1;
|
||||||
|
|
||||||
|
if ( exp === 0 ) {
|
||||||
|
return method( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the exp is not an integer, return NaN.
|
||||||
|
if ( !( typeof exp === "number" && exp % 1 === 0 ) ) {
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment given.
|
||||||
|
} else {
|
||||||
|
increment = +incrementOrExp || 1;
|
||||||
|
|
||||||
|
if ( increment === 1 ) {
|
||||||
|
return method( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the increment is not a number, return NaN.
|
||||||
|
if ( isNaN( increment ) ) {
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
increment = increment.toExponential().split( "e" );
|
||||||
|
exp = +increment[ 1 ];
|
||||||
|
increment = +increment[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shift & Round
|
||||||
|
value = value.toString().split( "e" );
|
||||||
|
value[ 0 ] = +value[ 0 ] / increment;
|
||||||
|
value[ 1 ] = value[ 1 ] ? ( +value[ 1 ] - exp ) : -exp;
|
||||||
|
value = method( +( value[ 0 ] + "e" + value[ 1 ] ) );
|
||||||
|
|
||||||
|
// Shift back
|
||||||
|
value = value.toString().split( "e" );
|
||||||
|
value[ 0 ] = +value[ 0 ] * increment;
|
||||||
|
value[ 1 ] = value[ 1 ] ? ( +value[ 1 ] + exp ) : exp;
|
||||||
|
return +( value[ 0 ] + "e" + value[ 1 ] );
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Globalize._createErrorUnsupportedFeature = createErrorUnsupportedFeature;
|
||||||
|
Globalize._numberFormat = numberFormat;
|
||||||
|
Globalize._numberFormatterFn = numberFormatterFn;
|
||||||
|
Globalize._numberParse = numberParse;
|
||||||
|
Globalize._numberParserFn = numberParserFn;
|
||||||
|
Globalize._numberRound = numberRound;
|
||||||
|
Globalize._validateParameterPresence = validateParameterPresence;
|
||||||
|
Globalize._validateParameterTypeNumber = validateParameterTypeNumber;
|
||||||
|
Globalize._validateParameterTypeString = validateParameterTypeString;
|
||||||
|
|
||||||
|
Globalize.numberFormatter =
|
||||||
|
Globalize.prototype.numberFormatter = function( options ) {
|
||||||
|
options = options || {};
|
||||||
|
return Globalize[ runtimeKey( "numberFormatter", this._locale, [ options ] ) ];
|
||||||
|
};
|
||||||
|
|
||||||
|
Globalize.numberParser =
|
||||||
|
Globalize.prototype.numberParser = function( options ) {
|
||||||
|
options = options || {};
|
||||||
|
return Globalize[ runtimeKey( "numberParser", this._locale, [ options ] ) ];
|
||||||
|
};
|
||||||
|
|
||||||
|
Globalize.formatNumber =
|
||||||
|
Globalize.prototype.formatNumber = function( value, options ) {
|
||||||
|
validateParameterPresence( value, "value" );
|
||||||
|
validateParameterTypeNumber( value, "value" );
|
||||||
|
|
||||||
|
return this.numberFormatter( options )( value );
|
||||||
|
};
|
||||||
|
|
||||||
|
Globalize.parseNumber =
|
||||||
|
Globalize.prototype.parseNumber = function( value, options ) {
|
||||||
|
validateParameterPresence( value, "value" );
|
||||||
|
validateParameterTypeString( value, "value" );
|
||||||
|
|
||||||
|
return this.numberParser( options )( value );
|
||||||
|
};
|
||||||
|
|
||||||
|
return Globalize;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}));
|
1266
external/globalize/globalize/number.js
vendored
1266
external/globalize/globalize/number.js
vendored
File diff suppressed because it is too large
Load Diff
5440
external/localization.js
vendored
5440
external/localization.js
vendored
File diff suppressed because it is too large
Load Diff
@ -52,7 +52,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"cldr-data": ">=26",
|
||||||
"commitplease": "2.0.0",
|
"commitplease": "2.0.0",
|
||||||
|
"globalize-compiler": "0.1.1",
|
||||||
"grunt": "0.4.2",
|
"grunt": "0.4.2",
|
||||||
"grunt-bowercopy": "1.1.0",
|
"grunt-bowercopy": "1.1.0",
|
||||||
"grunt-compare-size": "0.4.0",
|
"grunt-compare-size": "0.4.0",
|
||||||
|
Loading…
Reference in New Issue
Block a user