Comparing version 1.0.0-alpha.11 to 1.0.0-alpha.12
{ | ||
"name": "globalize", | ||
"version": "1.0.0-alpha.11", | ||
"version": "1.0.0-alpha.12", | ||
"license": "MIT", | ||
@@ -5,0 +5,0 @@ "ignore": [ |
/** | ||
* Globalize v1.0.0-alpha.11 | ||
* Globalize v1.0.0-alpha.12 | ||
* | ||
@@ -10,6 +10,6 @@ * http://github.com/jquery/globalize | ||
* | ||
* Date: 2014-12-03T12:09Z | ||
* Date: 2014-12-08T10:21Z | ||
*/ | ||
/*! | ||
* Globalize v1.0.0-alpha.11 2014-12-03T12:09Z Released under the MIT license | ||
* Globalize v1.0.0-alpha.12 2014-12-08T10:21Z Released under the MIT license | ||
* http://git.io/TrdQbw | ||
@@ -16,0 +16,0 @@ */ |
/** | ||
* Globalize v1.0.0-alpha.11 | ||
* Globalize v1.0.0-alpha.12 | ||
* | ||
@@ -10,6 +10,6 @@ * http://github.com/jquery/globalize | ||
* | ||
* Date: 2014-12-03T12:09Z | ||
* Date: 2014-12-08T10:21Z | ||
*/ | ||
/*! | ||
* Globalize v1.0.0-alpha.11 2014-12-03T12:09Z Released under the MIT license | ||
* Globalize v1.0.0-alpha.12 2014-12-08T10:21Z Released under the MIT license | ||
* http://git.io/TrdQbw | ||
@@ -26,2 +26,3 @@ */ | ||
"../globalize", | ||
"./number", | ||
"cldr/event", | ||
@@ -42,9 +43,13 @@ "cldr/supplemental" | ||
var createError = Globalize._createError, | ||
createErrorUnsupportedFeature = Globalize._createErrorUnsupportedFeature, | ||
formatMessage = Globalize._formatMessage, | ||
isPlainObject = Globalize._isPlainObject, | ||
numberSymbol = Globalize._numberSymbol, | ||
regexpEscape = Globalize._regexpEscape, | ||
stringPad = Globalize._stringPad, | ||
validateCldr = Globalize._validateCldr, | ||
validateDefaultLocale = Globalize._validateDefaultLocale, | ||
validateParameterPresence = Globalize._validateParameterPresence, | ||
validateParameterType = Globalize._validateParameterType; | ||
validateParameterType = Globalize._validateParameterType, | ||
validateParameterTypeString = Globalize._validateParameterTypeString; | ||
@@ -71,14 +76,2 @@ | ||
var validateParameterTypeString = function( value, name ) { | ||
validateParameterType( | ||
value, | ||
name, | ||
value === undefined || typeof value === "string", | ||
"a string" | ||
); | ||
}; | ||
var createErrorInvalidParameterValue = function( name, value ) { | ||
@@ -287,18 +280,4 @@ return createError( "E_INVALID_PAR_VALUE", "Invalid `{name}` value ({value}).", { | ||
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; | ||
}; | ||
/** | ||
* hourFormat( date, format ) | ||
* hourFormat( date, format, timeSeparator, formatNumber ) | ||
* | ||
@@ -311,15 +290,33 @@ * Return date's timezone offset according to the format passed. | ||
*/ | ||
var dateTimezoneHourFormat = function( date, format ) { | ||
var offset = date.getTimezoneOffset(); | ||
var dateTimezoneHourFormat = function( date, format, timeSeparator, formatNumber ) { | ||
var absOffset, | ||
offset = date.getTimezoneOffset(); | ||
// Pick the correct sign side (+ or -). | ||
format = format.split( ";" )[ offset > 0 ? 1 : 0 ]; | ||
absOffset = Math.abs( offset ); | ||
formatNumber = formatNumber || { | ||
1: function( value ) { | ||
return stringPad( value, 1 ); | ||
}, | ||
2: function( value ) { | ||
return stringPad( value, 2 ); | ||
} | ||
}; | ||
// Update hours offset. | ||
format = format.replace( /HH?/, function( match ) { | ||
return stringPad( Math.floor( Math.abs( offset ) / 60 ), match.length ); | ||
}); | ||
return format | ||
// Update minutes offset and return. | ||
return format.replace( /mm/, stringPad( Math.abs( offset ) % 60, 2 ) ); | ||
// Pick the correct sign side (+ or -). | ||
.split( ";" )[ offset > 0 ? 1 : 0 ] | ||
// Localize time separator | ||
.replace( ":", timeSeparator ) | ||
// Update hours offset. | ||
.replace( /HH?/, function( match ) { | ||
return formatNumber[ match.length ]( Math.floor( absOffset / 60 ) ); | ||
}) | ||
// Update minutes offset and return. | ||
.replace( /mm/, function() { | ||
return formatNumber[ 2 ]( absOffset % 60 ); | ||
}); | ||
}; | ||
@@ -342,4 +339,7 @@ | ||
var dateFormat = function( date, properties ) { | ||
var formatNumber = properties.formatNumber, | ||
timeSeparator = properties.timeSeparator; | ||
return properties.pattern.replace( datePatternRe, function( current ) { | ||
var pad, ret, | ||
var ret, | ||
chr = current.charAt( 0 ), | ||
@@ -384,6 +384,6 @@ length = current.length; | ||
// maximum length. | ||
ret = String( date.getFullYear() ); | ||
pad = true; | ||
ret = date.getFullYear(); | ||
if ( length === 2 ) { | ||
ret = ret.substr( ret.length - 2 ); | ||
ret = String( ret ); | ||
ret = +ret.substr( ret.length - 2 ); | ||
} | ||
@@ -404,6 +404,6 @@ break; | ||
); | ||
ret = String( ret.getFullYear() ); | ||
pad = true; | ||
ret = ret.getFullYear(); | ||
if ( length === 2 ) { | ||
ret = ret.substr( ret.length - 2 ); | ||
ret = String( ret ); | ||
ret = +ret.substr( ret.length - 2 ); | ||
} | ||
@@ -416,5 +416,3 @@ break; | ||
ret = Math.ceil( ( date.getMonth() + 1 ) / 3 ); | ||
if ( length <= 2 ) { | ||
pad = true; | ||
} else { | ||
if ( length > 2 ) { | ||
ret = properties.quarters[ chr ][ length ][ ret ]; | ||
@@ -428,5 +426,3 @@ } | ||
ret = date.getMonth() + 1; | ||
if ( length <= 2 ) { | ||
pad = true; | ||
} else { | ||
if ( length > 2 ) { | ||
ret = properties.months[ chr ][ length ][ ret ]; | ||
@@ -444,3 +440,2 @@ } | ||
( 7 - ret >= properties.minDays ? 0 : 1 ); | ||
pad = true; | ||
break; | ||
@@ -459,3 +454,2 @@ | ||
ret = date.getDate(); | ||
pad = true; | ||
break; | ||
@@ -465,3 +459,2 @@ | ||
ret = dateDayOfYear( date ) + 1; | ||
pad = true; | ||
break; | ||
@@ -481,3 +474,2 @@ | ||
ret = dateDayOfWeek( date, properties.firstDay ) + 1; | ||
pad = true; | ||
break; | ||
@@ -500,3 +492,2 @@ } | ||
ret = ( date.getHours() % 12 ) || 12; | ||
pad = true; | ||
break; | ||
@@ -506,3 +497,2 @@ | ||
ret = date.getHours(); | ||
pad = true; | ||
break; | ||
@@ -512,3 +502,2 @@ | ||
ret = date.getHours() % 12; | ||
pad = true; | ||
break; | ||
@@ -518,3 +507,2 @@ | ||
ret = date.getHours() || 24; | ||
pad = true; | ||
break; | ||
@@ -525,3 +513,2 @@ | ||
ret = date.getMinutes(); | ||
pad = true; | ||
break; | ||
@@ -532,3 +519,2 @@ | ||
ret = date.getSeconds(); | ||
pad = true; | ||
break; | ||
@@ -538,3 +524,2 @@ | ||
ret = Math.round( date.getMilliseconds() * Math.pow( 10, length - 3 ) ); | ||
pad = true; | ||
break; | ||
@@ -544,3 +529,2 @@ | ||
ret = Math.round( dateMillisecondsInDay( date ) * Math.pow( 10, length - 3 ) ); | ||
pad = true; | ||
break; | ||
@@ -558,3 +542,5 @@ | ||
date, | ||
length < 4 ? "+H;-H" : properties.tzLongHourFormat | ||
length < 4 ? "+H;-H" : properties.tzLongHourFormat, | ||
timeSeparator, | ||
formatNumber | ||
); | ||
@@ -578,5 +564,10 @@ ret = properties.gmtFormat.replace( /\{0\}/, ret ); | ||
ret = length === 1 ? "+HH;-HH" : ( length % 2 ? "+HH:mm;-HH:mm" : "+HHmm;-HHmm" ); | ||
ret = dateTimezoneHourFormat( date, ret ); | ||
ret = dateTimezoneHourFormat( date, ret, ":" ); | ||
break; | ||
// timeSeparator | ||
case ":": | ||
ret = timeSeparator; | ||
break; | ||
// ' literals. | ||
@@ -588,3 +579,4 @@ case "'": | ||
} | ||
return current; | ||
ret = current; | ||
break; | ||
@@ -594,6 +586,6 @@ // Anything else is considered a literal, including [ ,:/.@#], chinese, japonese, and | ||
default: | ||
return current; | ||
ret = current; | ||
} | ||
if ( pad ) { | ||
ret = stringPad( ret, length ); | ||
if ( typeof ret === "number" ) { | ||
ret = formatNumber[ length ]( ret ); | ||
} | ||
@@ -607,11 +599,2 @@ return ret; | ||
var createErrorUnsupportedFeature = function( feature ) { | ||
return createError( "E_UNSUPPORTED", "Unsupported {feature}.", { | ||
feature: feature | ||
}); | ||
}; | ||
/** | ||
@@ -630,8 +613,18 @@ * properties( pattern, cldr ) | ||
var dateFormatProperties = function( pattern, cldr ) { | ||
var properties = {}, | ||
var properties = { | ||
pattern: pattern, | ||
timeSeparator: numberSymbol( "timeSeparator", cldr ) | ||
}, | ||
widths = [ "abbreviated", "wide", "narrow" ]; | ||
properties.pattern = pattern; | ||
function setFormatNumberPattern( pad ) { | ||
if ( !properties.formatNumber ) { | ||
properties.formatNumber = {}; | ||
} | ||
properties.formatNumber[ pad ] = stringPad( "", pad ); | ||
} | ||
pattern.replace( datePatternRe, function( current ) { | ||
var chr = current.charAt( 0 ), | ||
var formatNumber, | ||
chr = current.charAt( 0 ), | ||
length = current.length; | ||
@@ -661,2 +654,8 @@ | ||
// Year | ||
case "y": | ||
// Plain year. | ||
formatNumber = true; | ||
break; | ||
case "Y": | ||
@@ -666,2 +665,3 @@ // Year in "Week of Year" | ||
properties.minDays = cldr.supplemental.weekData.minDays(); | ||
formatNumber = true; | ||
break; | ||
@@ -690,2 +690,4 @@ | ||
]); | ||
} else { | ||
formatNumber = true; | ||
} | ||
@@ -709,2 +711,4 @@ break; | ||
]); | ||
} else { | ||
formatNumber = true; | ||
} | ||
@@ -718,5 +722,12 @@ break; | ||
properties.minDays = cldr.supplemental.weekData.minDays(); | ||
formatNumber = true; | ||
break; | ||
// Day | ||
case "d": | ||
case "D": | ||
case "F": | ||
formatNumber = true; | ||
break; | ||
case "g": | ||
@@ -733,2 +744,3 @@ // Modified Julian day. Need to be implemented. | ||
properties.firstDay = dateFirstDayOfWeek( cldr ); | ||
formatNumber = true; | ||
break; | ||
@@ -776,2 +788,18 @@ } | ||
// 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 | ||
@@ -785,2 +813,9 @@ case "z": | ||
properties.tzLongHourFormat = cldr.main( "dates/timeZoneNames/hourFormat" ); | ||
/* falls through */ | ||
case "Z": | ||
case "X": | ||
case "x": | ||
setFormatNumberPattern( 1 ); | ||
setFormatNumberPattern( 2 ); | ||
break; | ||
@@ -793,3 +828,6 @@ | ||
}); | ||
} | ||
if ( formatNumber ) { | ||
setFormatNumberPattern( length ); | ||
} | ||
@@ -836,8 +874,11 @@ }); | ||
var dateParse = (function() { | ||
function outOfRange( value, low, high ) { | ||
var outOfRange = function( value, low, high ) { | ||
return value < low || value > high; | ||
} | ||
}; | ||
/** | ||
@@ -854,3 +895,3 @@ * parse( value, tokens, properties ) | ||
*/ | ||
return function( value, tokens, properties ) { | ||
var dateParse = function( value, tokens, properties ) { | ||
var amPm, era, hour, hour12, timezoneOffset, valid, | ||
@@ -899,3 +940,3 @@ YEAR = 0, | ||
case "y": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( length === 2 ) { | ||
@@ -931,3 +972,3 @@ if ( outOfRange( value, 0, 99 ) ) { | ||
if ( length <= 2 ) { | ||
value = +token.lexeme; | ||
value = token.value; | ||
} else { | ||
@@ -950,3 +991,3 @@ value = +token.value; | ||
case "d": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 31 ) ) { | ||
@@ -960,3 +1001,3 @@ return false; | ||
case "D": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 366 ) ) { | ||
@@ -990,3 +1031,3 @@ return false; | ||
case "h": // 1-12 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 12 ) ) { | ||
@@ -1001,3 +1042,3 @@ return false; | ||
case "K": // 0-11 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 11 ) ) { | ||
@@ -1012,3 +1053,3 @@ return false; | ||
case "k": // 1-24 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 24 ) ) { | ||
@@ -1023,3 +1064,3 @@ return false; | ||
case "H": // 0-23 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 23 ) ) { | ||
@@ -1035,3 +1076,3 @@ return false; | ||
case "m": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 59 ) ) { | ||
@@ -1046,3 +1087,3 @@ return false; | ||
case "s": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 59 ) ) { | ||
@@ -1062,3 +1103,3 @@ return false; | ||
case "S": | ||
value = Math.round( +token.lexeme * Math.pow( 10, 3 - length ) ); | ||
value = Math.round( token.value * Math.pow( 10, 3 - length ) ); | ||
date.setMilliseconds( value ); | ||
@@ -1076,3 +1117,2 @@ truncateAt.push( MILLISECONDS ); | ||
break; | ||
} | ||
@@ -1115,5 +1155,5 @@ | ||
}()); | ||
/** | ||
@@ -1136,2 +1176,15 @@ * parseProperties( cldr ) | ||
/** | ||
* Generated by: | ||
* | ||
* regenerate().add( require( "unicode-7.0.0/categories/N/symbols" ) ).toString(); | ||
* | ||
* https://github.com/mathiasbynens/regenerate | ||
* https://github.com/mathiasbynens/unicode-7.0.0 | ||
*/ | ||
var regexpN = /[0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D66-\u0D75\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]|\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDD16-\uDD1B\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDE60-\uDE7E]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9]|\uD806[\uDCE0-\uDCF2]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF]|\uD83C[\uDD00-\uDD0C]/; | ||
/** | ||
* tokenizer( value, pattern, properties ) | ||
@@ -1169,2 +1222,4 @@ * | ||
var valid, | ||
parseNumber = properties.parseNumber, | ||
timeSeparator = properties.timeSeparator, | ||
tokens = [], | ||
@@ -1174,7 +1229,10 @@ widths = [ "abbreviated", "wide", "narrow" ]; | ||
valid = properties.pattern.match( datePatternRe ).every(function( current ) { | ||
var chr, length, tokenRe, | ||
var chr, length, numeric, tokenRe, | ||
token = {}; | ||
function hourFormatParse( tokenRe ) { | ||
function hourFormatParse( tokenRe, parseNumber ) { | ||
var aux = value.match( tokenRe ); | ||
parseNumber = parseNumber || function( value ) { | ||
return +value; | ||
}; | ||
@@ -1186,9 +1244,11 @@ if ( !aux ) { | ||
// hourFormat containing H only, e.g., `+H;-H` | ||
if ( aux.length < 4 ) { | ||
token.value = ( aux[ 1 ] ? -aux[ 1 ] : +aux[ 2 ] ) * 60; | ||
if ( aux.length < 8 ) { | ||
token.value = | ||
( aux[ 1 ] ? -parseNumber( aux[ 1 ] ) : parseNumber( aux[ 4 ] ) ) * 60; | ||
// hourFormat containing H and m, e.g., `+HHmm;-HHmm` | ||
} else { | ||
token.value = ( aux[ 1 ] ? -aux[ 1 ] : +aux[ 3 ] ) * 60 + | ||
( aux[ 1 ] ? -aux[ 2 ] : +aux[ 4 ] ); | ||
token.value = | ||
( aux[ 1 ] ? -parseNumber( aux[ 1 ] ) : parseNumber( aux[ 7 ] ) ) * 60 + | ||
( aux[ 1 ] ? -parseNumber( aux[ 4 ] ) : parseNumber( aux[ 10 ] ) ); | ||
} | ||
@@ -1207,3 +1267,3 @@ | ||
// - "+H;-H" -> /GMT\+(\d\d?)|GMT-(\d\d?)/ | ||
function hourFormatRe( hourFormat, gmtFormat ) { | ||
function hourFormatRe( hourFormat, gmtFormat, timeSeparator ) { | ||
var re; | ||
@@ -1217,5 +1277,13 @@ | ||
.replace( "+", "\\+" ) | ||
.replace( /HH|mm/g, "(\\d\\d)" ) | ||
.replace( /H|m/g, "(\\d\\d?)" ); | ||
// Unicode equivalent to (\\d\\d) | ||
.replace( /HH|mm/g, "((" + regexpN.source + ")(" + regexpN.source + "))" ) | ||
// Unicode equivalent to (\\d\\d?) | ||
.replace( /H|m/g, "((" + regexpN.source + ")(" + regexpN.source + ")?)" ); | ||
if ( timeSeparator ) { | ||
re = re.replace( /:/g, timeSeparator ); | ||
} | ||
re = re.split( ";" ).map(function( part ) { | ||
@@ -1230,3 +1298,6 @@ return gmtFormat.replace( "{0}", part ); | ||
if ( length === 1 ) { | ||
return tokenRe = /\d/; | ||
// Unicode equivalent to /\d/ | ||
numeric = true; | ||
return tokenRe = regexpN; | ||
} | ||
@@ -1237,3 +1308,6 @@ } | ||
if ( length === 1 ) { | ||
return tokenRe = /\d\d?/; | ||
// Unicode equivalent to /\d\d?/ | ||
numeric = true; | ||
return tokenRe = new RegExp( "(" + regexpN.source + ")(" + regexpN.source + ")?" ); | ||
} | ||
@@ -1244,3 +1318,6 @@ } | ||
if ( length === 2 ) { | ||
return tokenRe = /\d\d/; | ||
// Unicode equivalent to /\d\d/ | ||
numeric = true; | ||
return tokenRe = new RegExp( "(" + regexpN.source + ")(" + regexpN.source + ")" ); | ||
} | ||
@@ -1300,9 +1377,17 @@ } | ||
case "Y": | ||
numeric = true; | ||
// number l=1:+, l=2:{2}, l=3:{3,}, l=4:{4,}, ... | ||
if ( length === 1 ) { | ||
tokenRe = /\d+/; | ||
// Unicode equivalent to /\d+/. | ||
tokenRe = new RegExp( "(" + regexpN.source + ")+" ); | ||
} else if ( length === 2 ) { | ||
tokenRe = /\d\d/; | ||
// Unicode equivalent to /\d\d/ | ||
tokenRe = new RegExp( "(" + regexpN.source + ")(" + regexpN.source + ")" ); | ||
} else { | ||
tokenRe = new RegExp( "\\d{" + length + ",}" ); | ||
// Unicode equivalent to /\d{length,}/ | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + length + ",}" ); | ||
} | ||
@@ -1339,3 +1424,6 @@ break; | ||
if ( length <= 3 ) { | ||
tokenRe = new RegExp( "\\d{" + length + ",3}" ); | ||
// Unicode equivalent to /\d{length,3}/ | ||
numeric = true; | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + length + ",3}" ); | ||
} | ||
@@ -1406,3 +1494,6 @@ break; | ||
// number {l}. | ||
tokenRe = new RegExp( "\\d{" + length + "}" ); | ||
// Unicode equivalent to /\d{length}/ | ||
numeric = true; | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + length + "}" ); | ||
break; | ||
@@ -1412,3 +1503,6 @@ | ||
// number {l+5}. | ||
tokenRe = new RegExp( "\\d{" + ( length + 5 ) + "}" ); | ||
// Unicode equivalent to /\d{length+5}/ | ||
numeric = true; | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + ( length + 5 ) + "}" ); | ||
break; | ||
@@ -1427,5 +1521,6 @@ | ||
length < 4 ? "+H;-H" : properties[ "timeZoneNames/hourFormat" ], | ||
properties[ "timeZoneNames/gmtFormat" ] | ||
properties[ "timeZoneNames/gmtFormat" ], | ||
timeSeparator | ||
); | ||
if ( !hourFormatParse( tokenRe ) ) { | ||
if ( !hourFormatParse( tokenRe, parseNumber ) ) { | ||
return null; | ||
@@ -1478,2 +1573,5 @@ } | ||
token.lexeme = lexeme; | ||
if ( numeric ) { | ||
token.value = parseNumber( lexeme ); | ||
} | ||
return ""; | ||
@@ -1507,3 +1605,4 @@ }); | ||
var properties = { | ||
pattern: pattern | ||
pattern: pattern, | ||
timeSeparator: numberSymbol( "timeSeparator", cldr ) | ||
}, | ||
@@ -1670,3 +1769,3 @@ widths = [ "abbreviated", "wide", "narrow" ]; | ||
Globalize.prototype.dateFormatter = function( pattern ) { | ||
var cldr, properties; | ||
var cldr, formatNumber, pad, properties; | ||
@@ -1685,2 +1784,11 @@ validateParameterPresence( pattern, "pattern" ); | ||
// Create needed number formatters. | ||
formatNumber = properties.formatNumber; | ||
for ( pad in formatNumber ) { | ||
formatNumber[ pad ] = this.numberFormatter({ | ||
pattern: formatNumber[ pad ] | ||
}); | ||
} | ||
properties.formatNumber = formatNumber; | ||
return function( value ) { | ||
@@ -1718,2 +1826,4 @@ validateParameterPresence( value, "value" ); | ||
tokenizerProperties.parseNumber = this.numberParser({ pattern: "0" }); | ||
return function( value ) { | ||
@@ -1720,0 +1830,0 @@ var tokens; |
/** | ||
* Globalize v1.0.0-alpha.11 | ||
* Globalize v1.0.0-alpha.12 | ||
* | ||
@@ -10,6 +10,6 @@ * http://github.com/jquery/globalize | ||
* | ||
* Date: 2014-12-03T12:09Z | ||
* Date: 2014-12-08T10:21Z | ||
*/ | ||
/*! | ||
* Globalize v1.0.0-alpha.11 2014-12-03T12:09Z Released under the MIT license | ||
* Globalize v1.0.0-alpha.12 2014-12-08T10:21Z Released under the MIT license | ||
* http://git.io/TrdQbw | ||
@@ -16,0 +16,0 @@ */ |
/** | ||
* Globalize v1.0.0-alpha.11 | ||
* Globalize v1.0.0-alpha.12 | ||
* | ||
@@ -10,6 +10,6 @@ * http://github.com/jquery/globalize | ||
* | ||
* Date: 2014-12-03T12:09Z | ||
* Date: 2014-12-08T10:21Z | ||
*/ | ||
/*! | ||
* Globalize v1.0.0-alpha.11 2014-12-03T12:09Z Released under the MIT license | ||
* Globalize v1.0.0-alpha.12 2014-12-08T10:21Z Released under the MIT license | ||
* http://git.io/TrdQbw | ||
@@ -50,2 +50,11 @@ */ | ||
var createErrorUnsupportedFeature = function( feature ) { | ||
return createError( "E_UNSUPPORTED", "Unsupported {feature}.", { | ||
feature: feature | ||
}); | ||
}; | ||
var validateParameterTypeNumber = function( value, name ) { | ||
@@ -198,11 +207,2 @@ validateParameterType( | ||
var createErrorUnsupportedFeature = function( feature ) { | ||
return createError( "E_UNSUPPORTED", "Unsupported {feature}.", { | ||
feature: feature | ||
}); | ||
}; | ||
/** | ||
@@ -1124,3 +1124,5 @@ * toPrecision( number, precision, round ) | ||
if ( !options.pattern ) { | ||
if ( options.pattern ) { | ||
pattern = options.pattern; | ||
} else { | ||
pattern = numberPattern( options.style || "decimal", cldr ); | ||
@@ -1186,3 +1188,5 @@ } | ||
if ( !options.pattern ) { | ||
if ( options.pattern ) { | ||
pattern = options.pattern; | ||
} else { | ||
pattern = numberPattern( options.style || "decimal", cldr ); | ||
@@ -1236,2 +1240,10 @@ } | ||
/** | ||
* Optimization to avoid duplicating some internal functions across modules. | ||
*/ | ||
Globalize._createErrorUnsupportedFeature = createErrorUnsupportedFeature; | ||
Globalize._numberSymbol = numberSymbol; | ||
Globalize._stringPad = stringPad; | ||
Globalize._validateParameterTypeString = validateParameterTypeString; | ||
return Globalize; | ||
@@ -1238,0 +1250,0 @@ |
/** | ||
* Globalize v1.0.0-alpha.11 | ||
* Globalize v1.0.0-alpha.12 | ||
* | ||
@@ -10,6 +10,6 @@ * http://github.com/jquery/globalize | ||
* | ||
* Date: 2014-12-03T12:09Z | ||
* Date: 2014-12-08T10:21Z | ||
*/ | ||
/*! | ||
* Globalize v1.0.0-alpha.11 2014-12-03T12:09Z Released under the MIT license | ||
* Globalize v1.0.0-alpha.12 2014-12-08T10:21Z Released under the MIT license | ||
* http://git.io/TrdQbw | ||
@@ -16,0 +16,0 @@ */ |
/*! | ||
* Globalize v1.0.0-alpha.11 | ||
* Globalize v1.0.0-alpha.12 | ||
* | ||
@@ -10,3 +10,3 @@ * http://github.com/jquery/globalize | ||
* | ||
* Date: 2014-12-03T12:09Z | ||
* Date: 2014-12-08T10:21Z | ||
*/ | ||
@@ -18,5 +18,7 @@ | ||
// Extent core with the following modules | ||
require( "./globalize/date" ); | ||
require( "./globalize/message" ); | ||
require( "./globalize/number" ); | ||
require( "./globalize/plural" ); | ||
// Load after globalize/number | ||
require( "./globalize/date" ); |
@@ -32,5 +32,5 @@ ## .formatDate( value, pattern ) | ||
```javascript | ||
var de = new Globalize( "de" ); | ||
de.formatDate( new Date( 2010, 10, 30, 17, 55 ), { datetime: "short" } ); | ||
// "30.11.10 17:55" | ||
var ar = new Globalize( "ar" ); | ||
ar.formatDate( new Date( 2010, 10, 30, 17, 55 ), { datetime: "short" } ); | ||
// "٣٠/١١/٢٠١٠ ٥،٥٥ م" | ||
``` | ||
@@ -44,6 +44,7 @@ | ||
| *en_GB* | `"01/11/2010 17:55"` | | ||
| *zh* | `"10/11/1 下午5:55"` | | ||
| *zh-u-nu-native* | `"一〇/一一/一 下午五:五五"` | | ||
| *es* | `"1/11/10 17:55"` | | ||
| *de* | `"01.11.10 17:55"` | | ||
| *zh* | `"10/11/1 下午5:55"` | | ||
| *ar* | `"1/11/2010 5:55 م"` | | ||
| *pt* | `"01/11/10 17:55"` | | ||
| *es* | `"1/11/10 17:55"` | | ||
| *ar* | `"١/١١/٢٠١٠ ٥،٥٥ م"` | |
@@ -37,5 +37,5 @@ ## .parseDate( value, pattern ) | ||
```javascript | ||
var es = new Globalize( "es" ); | ||
es.parseDate( "1/2/13", { date: "short" } ); | ||
// Fri Feb 01 2013 00:00:00 | ||
var ar = new Globalize( "ar" ); | ||
ar.parseDate( "٢/١/٢٠١٣ ١٢،٠٠ ص" , { date: "short" } ); | ||
// Wed Jan 02 2013 00:00:00 | ||
``` |
@@ -118,6 +118,5 @@ module.exports = function( grunt ) { | ||
// converted to a var declaration. | ||
// b) "Not as simple as a single return" means the define wrappers are replaced by | ||
// a function wrapper call and the returned value is assigned to a var. | ||
// c) "Module" means the define wrappers are removed, but content is untouched. | ||
// Only for root id's (the ones in src, not in src's subpaths). | ||
// b) "Module" means the define wrappers are removed, but content is untouched. | ||
// Only for root id's (the ones in src, not in src's subpaths). Note there's no | ||
// conditional code checking for this type. | ||
onBuildWrite: function( id, path, contents ) { | ||
@@ -170,8 +169,4 @@ var name = camelCase( id.replace( /util\/|common\//, "" ) ); | ||
// Type b (not as simple as a single return) | ||
if ( [ "date/parse" ].indexOf( id ) !== -1 ) { | ||
contents = "var " + name + " = (function() {" + | ||
contents + "}());"; | ||
// Type a (single return) | ||
} else if ( ( /\// ).test( id ) ) { | ||
if ( ( /\// ).test( id ) ) { | ||
contents = contents | ||
@@ -202,3 +197,3 @@ .replace( /\nreturn/, "\nvar " + name + " =" ); | ||
include: [ "date" ], | ||
exclude: [ "cldr", "cldr/supplemental", "./core" ], | ||
exclude: [ "cldr", "cldr/supplemental", "./core", "./number" ], | ||
create: true, | ||
@@ -205,0 +200,0 @@ override: { |
{ | ||
"name": "globalize", | ||
"version": "1.0.0-alpha.11", | ||
"version": "1.0.0-alpha.12", | ||
"description": "A JavaScript library for internationalization and localization that leverage the official Unicode CLDR JSON data.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -100,7 +100,6 @@ # Globalize | ||
| globalize.js | 1.1KB | [Core library](#core) | | ||
| globalize/date.js | +3.8KB | [Date module](#date_module) provides date formatting and parsing | | ||
| globalize/date.js | +4.8KB | [Date module](#date_module) provides date formatting and parsing | | ||
| globalize/message.js | +0.5KB | [Message module](#message_module) provides message translation | | ||
| globalize/number.js | +2.6KB | [Number module](#number_module) provides number formatting and parsing | | ||
| globalize/number.js | +3.0KB | [Number module](#number_module) provides number formatting and parsing | | ||
| globalize/plural.js | +1.7KB | [Plural module](#plural_module) provides pluralization support | | ||
<!--- By updating this table, also update its clone in #usage --> | ||
@@ -171,3 +170,3 @@ <a name="browser_support"></a> | ||
| Core module | cldr/supplemental/likelySubtags.json | | ||
| Date module | cldr/main/`locale`/ca-gregorian.json<br>cldr/main/`locale`/timeZoneNames.json<br>cldr/supplemental/timeData.json<br>cldr/supplemental/weekData.json | | ||
| Date module | cldr/main/`locale`/ca-gregorian.json<br>cldr/main/`locale`/timeZoneNames.json<br>cldr/supplemental/timeData.json<br>cldr/supplemental/weekData.json<br>+CLDR JSON files from number module | | ||
| Number module | cldr/main/`locale`/numbers.json<br>cldr/supplemental/numberingSystems.json | | ||
@@ -174,0 +173,0 @@ | Plural module | cldr/supplemental/plurals.json | |
@@ -25,2 +25,3 @@ /** | ||
"../globalize", | ||
"./number", | ||
"cldr/event", | ||
@@ -41,8 +42,12 @@ "cldr/supplemental" | ||
var createError = Globalize._createError, | ||
createErrorUnsupportedFeature = Globalize._createErrorUnsupportedFeature, | ||
formatMessage = Globalize._formatMessage, | ||
isPlainObject = Globalize._isPlainObject, | ||
numberSymbol = Globalize._numberSymbol, | ||
regexpEscape = Globalize._regexpEscape, | ||
stringPad = Globalize._stringPad, | ||
validateCldr = Globalize._validateCldr, | ||
validateDefaultLocale = Globalize._validateDefaultLocale, | ||
validateParameterPresence = Globalize._validateParameterPresence, | ||
validateParameterType = Globalize._validateParameterType; | ||
validateParameterType = Globalize._validateParameterType, | ||
validateParameterTypeString = Globalize._validateParameterTypeString; |
@@ -17,5 +17,7 @@ /*! | ||
// Extent core with the following modules | ||
require( "./globalize/date" ); | ||
require( "./globalize/message" ); | ||
require( "./globalize/number" ); | ||
require( "./globalize/plural" ); | ||
// Load after globalize/number | ||
require( "./globalize/date" ); |
@@ -19,3 +19,4 @@ define([ | ||
"cldr/event", | ||
"cldr/supplemental" | ||
"cldr/supplemental", | ||
"./number" | ||
], function( Cldr, validateCldr, validateDefaultLocale, validateParameterPresence, | ||
@@ -53,3 +54,3 @@ validateParameterTypeDataType, validateParameterTypeDate, validateParameterTypeDatePattern, | ||
Globalize.prototype.dateFormatter = function( pattern ) { | ||
var cldr, properties; | ||
var cldr, formatNumber, pad, properties; | ||
@@ -68,2 +69,11 @@ validateParameterPresence( pattern, "pattern" ); | ||
// Create needed number formatters. | ||
formatNumber = properties.formatNumber; | ||
for ( pad in formatNumber ) { | ||
formatNumber[ pad ] = this.numberFormatter({ | ||
pattern: formatNumber[ pad ] | ||
}); | ||
} | ||
properties.formatNumber = formatNumber; | ||
return function( value ) { | ||
@@ -101,2 +111,4 @@ validateParameterPresence( value, "value" ); | ||
tokenizerProperties.parseNumber = this.numberParser({ pattern: "0" }); | ||
return function( value ) { | ||
@@ -103,0 +115,0 @@ var tokens; |
define([ | ||
"./first-day-of-week", | ||
"./pattern-re", | ||
"../common/create-error/unsupported-feature" | ||
], function( dateFirstDayOfWeek, datePatternRe, createErrorUnsupportedFeature ) { | ||
"../common/create-error/unsupported-feature", | ||
"../number/symbol", | ||
"../util/string/pad" | ||
], function( dateFirstDayOfWeek, datePatternRe, createErrorUnsupportedFeature, numberSymbol, | ||
stringPad ) { | ||
@@ -20,8 +23,18 @@ /** | ||
return function( pattern, cldr ) { | ||
var properties = {}, | ||
var properties = { | ||
pattern: pattern, | ||
timeSeparator: numberSymbol( "timeSeparator", cldr ) | ||
}, | ||
widths = [ "abbreviated", "wide", "narrow" ]; | ||
properties.pattern = pattern; | ||
function setFormatNumberPattern( pad ) { | ||
if ( !properties.formatNumber ) { | ||
properties.formatNumber = {}; | ||
} | ||
properties.formatNumber[ pad ] = stringPad( "", pad ); | ||
} | ||
pattern.replace( datePatternRe, function( current ) { | ||
var chr = current.charAt( 0 ), | ||
var formatNumber, | ||
chr = current.charAt( 0 ), | ||
length = current.length; | ||
@@ -51,2 +64,8 @@ | ||
// Year | ||
case "y": | ||
// Plain year. | ||
formatNumber = true; | ||
break; | ||
case "Y": | ||
@@ -56,2 +75,3 @@ // Year in "Week of Year" | ||
properties.minDays = cldr.supplemental.weekData.minDays(); | ||
formatNumber = true; | ||
break; | ||
@@ -80,2 +100,4 @@ | ||
]); | ||
} else { | ||
formatNumber = true; | ||
} | ||
@@ -99,2 +121,4 @@ break; | ||
]); | ||
} else { | ||
formatNumber = true; | ||
} | ||
@@ -108,5 +132,12 @@ break; | ||
properties.minDays = cldr.supplemental.weekData.minDays(); | ||
formatNumber = true; | ||
break; | ||
// Day | ||
case "d": | ||
case "D": | ||
case "F": | ||
formatNumber = true; | ||
break; | ||
case "g": | ||
@@ -123,2 +154,3 @@ // Modified Julian day. Need to be implemented. | ||
properties.firstDay = dateFirstDayOfWeek( cldr ); | ||
formatNumber = true; | ||
break; | ||
@@ -166,2 +198,18 @@ } | ||
// 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 | ||
@@ -175,2 +223,9 @@ case "z": | ||
properties.tzLongHourFormat = cldr.main( "dates/timeZoneNames/hourFormat" ); | ||
/* falls through */ | ||
case "Z": | ||
case "X": | ||
case "x": | ||
setFormatNumberPattern( 1 ); | ||
setFormatNumberPattern( 2 ); | ||
break; | ||
@@ -183,3 +238,6 @@ | ||
}); | ||
} | ||
if ( formatNumber ) { | ||
setFormatNumberPattern( length ); | ||
} | ||
@@ -186,0 +244,0 @@ }); |
@@ -9,6 +9,5 @@ define([ | ||
"./timezone-hour-format", | ||
"./week-days", | ||
"../util/string/pad" | ||
"./week-days" | ||
], function( dateDayOfWeek, dateDayOfYear, dateFirstDayOfWeek, dateMillisecondsInDay, | ||
datePatternRe, dateStartOf, dateTimezoneHourFormat, dateWeekDays, stringPad ) { | ||
datePatternRe, dateStartOf, dateTimezoneHourFormat, dateWeekDays ) { | ||
@@ -27,4 +26,7 @@ /** | ||
return function( date, properties ) { | ||
var formatNumber = properties.formatNumber, | ||
timeSeparator = properties.timeSeparator; | ||
return properties.pattern.replace( datePatternRe, function( current ) { | ||
var pad, ret, | ||
var ret, | ||
chr = current.charAt( 0 ), | ||
@@ -69,6 +71,6 @@ length = current.length; | ||
// maximum length. | ||
ret = String( date.getFullYear() ); | ||
pad = true; | ||
ret = date.getFullYear(); | ||
if ( length === 2 ) { | ||
ret = ret.substr( ret.length - 2 ); | ||
ret = String( ret ); | ||
ret = +ret.substr( ret.length - 2 ); | ||
} | ||
@@ -89,6 +91,6 @@ break; | ||
); | ||
ret = String( ret.getFullYear() ); | ||
pad = true; | ||
ret = ret.getFullYear(); | ||
if ( length === 2 ) { | ||
ret = ret.substr( ret.length - 2 ); | ||
ret = String( ret ); | ||
ret = +ret.substr( ret.length - 2 ); | ||
} | ||
@@ -101,5 +103,3 @@ break; | ||
ret = Math.ceil( ( date.getMonth() + 1 ) / 3 ); | ||
if ( length <= 2 ) { | ||
pad = true; | ||
} else { | ||
if ( length > 2 ) { | ||
ret = properties.quarters[ chr ][ length ][ ret ]; | ||
@@ -113,5 +113,3 @@ } | ||
ret = date.getMonth() + 1; | ||
if ( length <= 2 ) { | ||
pad = true; | ||
} else { | ||
if ( length > 2 ) { | ||
ret = properties.months[ chr ][ length ][ ret ]; | ||
@@ -129,3 +127,2 @@ } | ||
( 7 - ret >= properties.minDays ? 0 : 1 ); | ||
pad = true; | ||
break; | ||
@@ -144,3 +141,2 @@ | ||
ret = date.getDate(); | ||
pad = true; | ||
break; | ||
@@ -150,3 +146,2 @@ | ||
ret = dateDayOfYear( date ) + 1; | ||
pad = true; | ||
break; | ||
@@ -166,3 +161,2 @@ | ||
ret = dateDayOfWeek( date, properties.firstDay ) + 1; | ||
pad = true; | ||
break; | ||
@@ -185,3 +179,2 @@ } | ||
ret = ( date.getHours() % 12 ) || 12; | ||
pad = true; | ||
break; | ||
@@ -191,3 +184,2 @@ | ||
ret = date.getHours(); | ||
pad = true; | ||
break; | ||
@@ -197,3 +189,2 @@ | ||
ret = date.getHours() % 12; | ||
pad = true; | ||
break; | ||
@@ -203,3 +194,2 @@ | ||
ret = date.getHours() || 24; | ||
pad = true; | ||
break; | ||
@@ -210,3 +200,2 @@ | ||
ret = date.getMinutes(); | ||
pad = true; | ||
break; | ||
@@ -217,3 +206,2 @@ | ||
ret = date.getSeconds(); | ||
pad = true; | ||
break; | ||
@@ -223,3 +211,2 @@ | ||
ret = Math.round( date.getMilliseconds() * Math.pow( 10, length - 3 ) ); | ||
pad = true; | ||
break; | ||
@@ -229,3 +216,2 @@ | ||
ret = Math.round( dateMillisecondsInDay( date ) * Math.pow( 10, length - 3 ) ); | ||
pad = true; | ||
break; | ||
@@ -243,3 +229,5 @@ | ||
date, | ||
length < 4 ? "+H;-H" : properties.tzLongHourFormat | ||
length < 4 ? "+H;-H" : properties.tzLongHourFormat, | ||
timeSeparator, | ||
formatNumber | ||
); | ||
@@ -263,5 +251,10 @@ ret = properties.gmtFormat.replace( /\{0\}/, ret ); | ||
ret = length === 1 ? "+HH;-HH" : ( length % 2 ? "+HH:mm;-HH:mm" : "+HHmm;-HHmm" ); | ||
ret = dateTimezoneHourFormat( date, ret ); | ||
ret = dateTimezoneHourFormat( date, ret, ":" ); | ||
break; | ||
// timeSeparator | ||
case ":": | ||
ret = timeSeparator; | ||
break; | ||
// ' literals. | ||
@@ -273,3 +266,4 @@ case "'": | ||
} | ||
return current; | ||
ret = current; | ||
break; | ||
@@ -279,6 +273,6 @@ // Anything else is considered a literal, including [ ,:/.@#], chinese, japonese, and | ||
default: | ||
return current; | ||
ret = current; | ||
} | ||
if ( pad ) { | ||
ret = stringPad( ret, length ); | ||
if ( typeof ret === "number" ) { | ||
ret = formatNumber[ length ]( ret ); | ||
} | ||
@@ -285,0 +279,0 @@ return ret; |
@@ -6,10 +6,7 @@ define([ | ||
"../util/date/set-date", | ||
"../util/date/set-month" | ||
"../util/date/set-month", | ||
"../util/out-of-range" | ||
], function( datePatternRe, dateStartOf, createErrorUnsupportedFeature, dateSetDate, | ||
dateSetMonth ) { | ||
dateSetMonth, outOfRange ) { | ||
function outOfRange( value, low, high ) { | ||
return value < low || value > high; | ||
} | ||
/** | ||
@@ -70,3 +67,3 @@ * parse( value, tokens, properties ) | ||
case "y": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( length === 2 ) { | ||
@@ -102,3 +99,3 @@ if ( outOfRange( value, 0, 99 ) ) { | ||
if ( length <= 2 ) { | ||
value = +token.lexeme; | ||
value = token.value; | ||
} else { | ||
@@ -121,3 +118,3 @@ value = +token.value; | ||
case "d": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 31 ) ) { | ||
@@ -131,3 +128,3 @@ return false; | ||
case "D": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 366 ) ) { | ||
@@ -161,3 +158,3 @@ return false; | ||
case "h": // 1-12 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 12 ) ) { | ||
@@ -172,3 +169,3 @@ return false; | ||
case "K": // 0-11 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 11 ) ) { | ||
@@ -183,3 +180,3 @@ return false; | ||
case "k": // 1-24 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 1, 24 ) ) { | ||
@@ -194,3 +191,3 @@ return false; | ||
case "H": // 0-23 | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 23 ) ) { | ||
@@ -206,3 +203,3 @@ return false; | ||
case "m": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 59 ) ) { | ||
@@ -217,3 +214,3 @@ return false; | ||
case "s": | ||
value = +token.lexeme; | ||
value = token.value; | ||
if ( outOfRange( value, 0, 59 ) ) { | ||
@@ -233,3 +230,3 @@ return false; | ||
case "S": | ||
value = Math.round( +token.lexeme * Math.pow( 10, 3 - length ) ); | ||
value = Math.round( token.value * Math.pow( 10, 3 - length ) ); | ||
date.setMilliseconds( value ); | ||
@@ -247,3 +244,2 @@ truncateAt.push( MILLISECONDS ); | ||
break; | ||
} | ||
@@ -250,0 +246,0 @@ |
@@ -6,3 +6,3 @@ define([ | ||
/** | ||
* hourFormat( date, format ) | ||
* hourFormat( date, format, timeSeparator, formatNumber ) | ||
* | ||
@@ -15,17 +15,35 @@ * Return date's timezone offset according to the format passed. | ||
*/ | ||
return function( date, format ) { | ||
var offset = date.getTimezoneOffset(); | ||
return function( date, format, timeSeparator, formatNumber ) { | ||
var absOffset, | ||
offset = date.getTimezoneOffset(); | ||
// Pick the correct sign side (+ or -). | ||
format = format.split( ";" )[ offset > 0 ? 1 : 0 ]; | ||
absOffset = Math.abs( offset ); | ||
formatNumber = formatNumber || { | ||
1: function( value ) { | ||
return stringPad( value, 1 ); | ||
}, | ||
2: function( value ) { | ||
return stringPad( value, 2 ); | ||
} | ||
}; | ||
// Update hours offset. | ||
format = format.replace( /HH?/, function( match ) { | ||
return stringPad( Math.floor( Math.abs( offset ) / 60 ), match.length ); | ||
}); | ||
return format | ||
// Update minutes offset and return. | ||
return format.replace( /mm/, stringPad( Math.abs( offset ) % 60, 2 ) ); | ||
// Pick the correct sign side (+ or -). | ||
.split( ";" )[ offset > 0 ? 1 : 0 ] | ||
// Localize time separator | ||
.replace( ":", timeSeparator ) | ||
// Update hours offset. | ||
.replace( /HH?/, function( match ) { | ||
return formatNumber[ match.length ]( Math.floor( absOffset / 60 ) ); | ||
}) | ||
// Update minutes offset and return. | ||
.replace( /mm/, function() { | ||
return formatNumber[ 2 ]( absOffset % 60 ); | ||
}); | ||
}; | ||
}); |
define([ | ||
"./pattern-re", | ||
"../common/create-error/unsupported-feature" | ||
], function( datePatternRe, createErrorUnsupportedFeature ) { | ||
"../common/create-error/unsupported-feature", | ||
"../number/symbol" | ||
], function( datePatternRe, createErrorUnsupportedFeature, numberSymbol ) { | ||
@@ -17,3 +18,4 @@ /** | ||
var properties = { | ||
pattern: pattern | ||
pattern: pattern, | ||
timeSeparator: numberSymbol( "timeSeparator", cldr ) | ||
}, | ||
@@ -20,0 +22,0 @@ widths = [ "abbreviated", "wide", "narrow" ]; |
define([ | ||
"./pattern-re", | ||
"../util/regexp/escape" | ||
], function( datePatternRe, regexpEscape ) { | ||
"../util/regexp/escape", | ||
"../util/regexp/n" | ||
], function( datePatternRe, regexpEscape, regexpN ) { | ||
@@ -39,2 +40,4 @@ /** | ||
var valid, | ||
parseNumber = properties.parseNumber, | ||
timeSeparator = properties.timeSeparator, | ||
tokens = [], | ||
@@ -44,7 +47,10 @@ widths = [ "abbreviated", "wide", "narrow" ]; | ||
valid = properties.pattern.match( datePatternRe ).every(function( current ) { | ||
var chr, length, tokenRe, | ||
var chr, length, numeric, tokenRe, | ||
token = {}; | ||
function hourFormatParse( tokenRe ) { | ||
function hourFormatParse( tokenRe, parseNumber ) { | ||
var aux = value.match( tokenRe ); | ||
parseNumber = parseNumber || function( value ) { | ||
return +value; | ||
}; | ||
@@ -56,9 +62,11 @@ if ( !aux ) { | ||
// hourFormat containing H only, e.g., `+H;-H` | ||
if ( aux.length < 4 ) { | ||
token.value = ( aux[ 1 ] ? -aux[ 1 ] : +aux[ 2 ] ) * 60; | ||
if ( aux.length < 8 ) { | ||
token.value = | ||
( aux[ 1 ] ? -parseNumber( aux[ 1 ] ) : parseNumber( aux[ 4 ] ) ) * 60; | ||
// hourFormat containing H and m, e.g., `+HHmm;-HHmm` | ||
} else { | ||
token.value = ( aux[ 1 ] ? -aux[ 1 ] : +aux[ 3 ] ) * 60 + | ||
( aux[ 1 ] ? -aux[ 2 ] : +aux[ 4 ] ); | ||
token.value = | ||
( aux[ 1 ] ? -parseNumber( aux[ 1 ] ) : parseNumber( aux[ 7 ] ) ) * 60 + | ||
( aux[ 1 ] ? -parseNumber( aux[ 4 ] ) : parseNumber( aux[ 10 ] ) ); | ||
} | ||
@@ -77,3 +85,3 @@ | ||
// - "+H;-H" -> /GMT\+(\d\d?)|GMT-(\d\d?)/ | ||
function hourFormatRe( hourFormat, gmtFormat ) { | ||
function hourFormatRe( hourFormat, gmtFormat, timeSeparator ) { | ||
var re; | ||
@@ -87,5 +95,13 @@ | ||
.replace( "+", "\\+" ) | ||
.replace( /HH|mm/g, "(\\d\\d)" ) | ||
.replace( /H|m/g, "(\\d\\d?)" ); | ||
// Unicode equivalent to (\\d\\d) | ||
.replace( /HH|mm/g, "((" + regexpN.source + ")(" + regexpN.source + "))" ) | ||
// Unicode equivalent to (\\d\\d?) | ||
.replace( /H|m/g, "((" + regexpN.source + ")(" + regexpN.source + ")?)" ); | ||
if ( timeSeparator ) { | ||
re = re.replace( /:/g, timeSeparator ); | ||
} | ||
re = re.split( ";" ).map(function( part ) { | ||
@@ -100,3 +116,6 @@ return gmtFormat.replace( "{0}", part ); | ||
if ( length === 1 ) { | ||
return tokenRe = /\d/; | ||
// Unicode equivalent to /\d/ | ||
numeric = true; | ||
return tokenRe = regexpN; | ||
} | ||
@@ -107,3 +126,6 @@ } | ||
if ( length === 1 ) { | ||
return tokenRe = /\d\d?/; | ||
// Unicode equivalent to /\d\d?/ | ||
numeric = true; | ||
return tokenRe = new RegExp( "(" + regexpN.source + ")(" + regexpN.source + ")?" ); | ||
} | ||
@@ -114,3 +136,6 @@ } | ||
if ( length === 2 ) { | ||
return tokenRe = /\d\d/; | ||
// Unicode equivalent to /\d\d/ | ||
numeric = true; | ||
return tokenRe = new RegExp( "(" + regexpN.source + ")(" + regexpN.source + ")" ); | ||
} | ||
@@ -170,9 +195,17 @@ } | ||
case "Y": | ||
numeric = true; | ||
// number l=1:+, l=2:{2}, l=3:{3,}, l=4:{4,}, ... | ||
if ( length === 1 ) { | ||
tokenRe = /\d+/; | ||
// Unicode equivalent to /\d+/. | ||
tokenRe = new RegExp( "(" + regexpN.source + ")+" ); | ||
} else if ( length === 2 ) { | ||
tokenRe = /\d\d/; | ||
// Unicode equivalent to /\d\d/ | ||
tokenRe = new RegExp( "(" + regexpN.source + ")(" + regexpN.source + ")" ); | ||
} else { | ||
tokenRe = new RegExp( "\\d{" + length + ",}" ); | ||
// Unicode equivalent to /\d{length,}/ | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + length + ",}" ); | ||
} | ||
@@ -209,3 +242,6 @@ break; | ||
if ( length <= 3 ) { | ||
tokenRe = new RegExp( "\\d{" + length + ",3}" ); | ||
// Unicode equivalent to /\d{length,3}/ | ||
numeric = true; | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + length + ",3}" ); | ||
} | ||
@@ -276,3 +312,6 @@ break; | ||
// number {l}. | ||
tokenRe = new RegExp( "\\d{" + length + "}" ); | ||
// Unicode equivalent to /\d{length}/ | ||
numeric = true; | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + length + "}" ); | ||
break; | ||
@@ -282,3 +321,6 @@ | ||
// number {l+5}. | ||
tokenRe = new RegExp( "\\d{" + ( length + 5 ) + "}" ); | ||
// Unicode equivalent to /\d{length+5}/ | ||
numeric = true; | ||
tokenRe = new RegExp( "(" + regexpN.source + "){" + ( length + 5 ) + "}" ); | ||
break; | ||
@@ -297,5 +339,6 @@ | ||
length < 4 ? "+H;-H" : properties[ "timeZoneNames/hourFormat" ], | ||
properties[ "timeZoneNames/gmtFormat" ] | ||
properties[ "timeZoneNames/gmtFormat" ], | ||
timeSeparator | ||
); | ||
if ( !hourFormatParse( tokenRe ) ) { | ||
if ( !hourFormatParse( tokenRe, parseNumber ) ) { | ||
return null; | ||
@@ -348,2 +391,5 @@ } | ||
token.lexeme = lexeme; | ||
if ( numeric ) { | ||
token.value = parseNumber( lexeme ); | ||
} | ||
return ""; | ||
@@ -350,0 +396,0 @@ }); |
define([ | ||
"./core", | ||
"./common/create-error/unsupported-feature", | ||
"./common/validate/cldr", | ||
@@ -15,7 +16,10 @@ "./common/validate/default-locale", | ||
"./number/pattern", | ||
"./number/symbol", | ||
"./util/string/pad", | ||
"cldr/event" | ||
], function( Globalize, validateCldr, validateDefaultLocale, validateParameterPresence, | ||
validateParameterRange, validateParameterTypeNumber, validateParameterTypePlainObject, | ||
validateParameterTypeString, numberFormat, numberFormatProperties, numberParse, | ||
numberParseProperties, numberPattern ) { | ||
], function( Globalize, createErrorUnsupportedFeature, validateCldr, validateDefaultLocale, | ||
validateParameterPresence, validateParameterRange, validateParameterTypeNumber, | ||
validateParameterTypePlainObject, validateParameterTypeString, numberFormat, | ||
numberFormatProperties, numberParse, numberParseProperties, numberPattern, numberSymbol, | ||
stringPad ) { | ||
@@ -46,3 +50,5 @@ /** | ||
if ( !options.pattern ) { | ||
if ( options.pattern ) { | ||
pattern = options.pattern; | ||
} else { | ||
pattern = numberPattern( options.style || "decimal", cldr ); | ||
@@ -108,3 +114,5 @@ } | ||
if ( !options.pattern ) { | ||
if ( options.pattern ) { | ||
pattern = options.pattern; | ||
} else { | ||
pattern = numberPattern( options.style || "decimal", cldr ); | ||
@@ -158,4 +166,12 @@ } | ||
/** | ||
* Optimization to avoid duplicating some internal functions across modules. | ||
*/ | ||
Globalize._createErrorUnsupportedFeature = createErrorUnsupportedFeature; | ||
Globalize._numberSymbol = numberSymbol; | ||
Globalize._stringPad = stringPad; | ||
Globalize._validateParameterTypeString = validateParameterTypeString; | ||
return Globalize; | ||
}); |
define([ | ||
"globalize", | ||
"json!cldr-data/main/en/numbers.json", | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
"json!cldr-data/supplemental/likelySubtags.json", | ||
"json!cldr-data/supplemental/numberingSystems.json", | ||
"json!cldr-data/supplemental/timeData.json", | ||
@@ -9,3 +11,4 @@ "json!cldr-data/supplemental/weekData.json", | ||
"globalize/date" | ||
], function( Globalize, enCaGregorian, likelySubtags, timeData, weekData, util ) { | ||
], function( Globalize, enNumbers, enCaGregorian, likelySubtags, numberingSystems, timeData, | ||
weekData, util ) { | ||
@@ -17,2 +20,4 @@ var date = new Date( 2010, 8, 15, 17, 35, 7, 369 ); | ||
enCaGregorian, | ||
enNumbers, | ||
numberingSystems, | ||
timeData, | ||
@@ -19,0 +24,0 @@ weekData |
@@ -5,4 +5,7 @@ define([ | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
"json!cldr-data/main/en/numbers.json", | ||
"json!cldr-data/main/pt/ca-gregorian.json", | ||
"json!cldr-data/main/pt/numbers.json", | ||
"json!cldr-data/supplemental/likelySubtags.json", | ||
"json!cldr-data/supplemental/numberingSystems.json", | ||
"json!cldr-data/supplemental/timeData.json", | ||
@@ -12,3 +15,4 @@ "json!cldr-data/supplemental/weekData.json", | ||
"globalize/date" | ||
], function( Globalize, startOf, enCaGregorian, ptCaGregorian, likelySubtags, timeData, weekData, util ) { | ||
], function( Globalize, startOf, enCaGregorian, enNumbers, ptCaGregorian, ptNumbers, likelySubtags, | ||
numberingSystems, timeData, weekData, util ) { | ||
@@ -22,3 +26,6 @@ function assertParseDate( assert, input, options, output ) { | ||
enCaGregorian, | ||
enNumbers, | ||
ptCaGregorian, | ||
ptNumbers, | ||
numberingSystems, | ||
timeData, | ||
@@ -25,0 +32,0 @@ weekData |
define([ | ||
"globalize", | ||
"json!cldr-data/main/ar/ca-gregorian.json", | ||
"json!cldr-data/main/ar/numbers.json", | ||
"json!cldr-data/main/ar/timeZoneNames.json", | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
"json!cldr-data/main/en/numbers.json", | ||
"json!cldr-data/main/en/timeZoneNames.json", | ||
"json!cldr-data/main/pt/ca-gregorian.json", | ||
"json!cldr-data/main/pt/numbers.json", | ||
"json!cldr-data/supplemental/likelySubtags.json", | ||
"json!cldr-data/supplemental/numberingSystems.json", | ||
"json!cldr-data/supplemental/timeData.json", | ||
@@ -10,10 +17,20 @@ "json!cldr-data/supplemental/weekData.json", | ||
"globalize/date" | ||
], function( Globalize, enCaGregorian, ptCaGregorian, likelySubtags, timeData, weekData, util ) { | ||
], function( Globalize, arCaGregorian, arNumbers, arTimeZoneNames, enCaGregorian, enNumbers, | ||
enTimeZoneNames, ptCaGregorian, ptNumbers, likelySubtags, numberingSystems, timeData, weekData, | ||
util ) { | ||
var date = new Date( 2010, 8, 15, 17, 35, 7, 369 ); | ||
var ar, | ||
date = new Date( 2010, 8, 15, 17, 35, 7, 369 ); | ||
function extraSetup() { | ||
Globalize.load( | ||
arCaGregorian, | ||
arNumbers, | ||
arTimeZoneNames, | ||
enCaGregorian, | ||
enNumbers, | ||
enTimeZoneNames, | ||
numberingSystems, | ||
ptCaGregorian, | ||
ptNumbers, | ||
timeData, | ||
@@ -63,2 +80,4 @@ weekData | ||
ar = Globalize( "ar" ); | ||
assert.equal( Globalize.formatDate( date, { skeleton: "d" } ), "15" ); | ||
@@ -70,5 +89,7 @@ assert.equal( Globalize.formatDate( date, { skeleton: "Ed" } ), "15 Wed" ); | ||
assert.equal( Globalize.formatDate( date, { skeleton: "yQQQ" } ), "Q3 2010" ); | ||
assert.equal( ar.formatDate( date, { skeleton: "yQQQ" } ), "الربع الثالث ٢٠١٠" ); | ||
// Passed as string | ||
assert.equal( Globalize.formatDate( date, "GyMMMEd" ), "Wed, Sep 15, 2010 AD" ); | ||
assert.equal( ar.formatDate( date, "GyMMMEd" ), "الأربعاء، ١٥ سبتمبر، ٢٠١٠ م" ); | ||
@@ -83,4 +104,9 @@ // Via instance .formatDate(). | ||
ar = Globalize( "ar" ); | ||
assert.equal( Globalize.formatDate( date, { time: "medium" } ), "5:35:07 PM" ); | ||
assert.equal( ar.formatDate( date, { time: "medium" } ), "٥،٣٥،٠٧ م" ); | ||
assert.equal( Globalize.formatDate( date, { time: "short" } ), "5:35 PM" ); | ||
assert.equal( ar.formatDate( date, { time: "short" } ), "٥،٣٥ م" ); | ||
}); | ||
@@ -87,0 +113,0 @@ |
define([ | ||
"globalize", | ||
"src/date/start-of", | ||
"json!cldr-data/main/ar/ca-gregorian.json", | ||
"json!cldr-data/main/ar/numbers.json", | ||
"json!cldr-data/main/ar/timeZoneNames.json", | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
"json!cldr-data/main/en/numbers.json", | ||
"json!cldr-data/main/en/timeZoneNames.json", | ||
"json!cldr-data/main/pt/ca-gregorian.json", | ||
"json!cldr-data/main/pt/numbers.json", | ||
"json!cldr-data/supplemental/likelySubtags.json", | ||
"json!cldr-data/supplemental/numberingSystems.json", | ||
"json!cldr-data/supplemental/timeData.json", | ||
@@ -12,12 +18,19 @@ "json!cldr-data/supplemental/weekData.json", | ||
"globalize/date" | ||
], function( Globalize, startOf, enCaGregorian, enTimeZoneNames, ptCaGregorian, likelySubtags, | ||
timeData, weekData, util ) { | ||
], function( Globalize, startOf, arCaGregorian, arNumbers, arTimeZoneNames, enCaGregorian, | ||
enNumbers, enTimeZoneNames, ptCaGregorian, ptNumbers, likelySubtags, numberingSystems, timeData, | ||
weekData, util ) { | ||
var date; | ||
var ar, date; | ||
function extraSetup() { | ||
Globalize.load( | ||
arCaGregorian, | ||
arNumbers, | ||
arTimeZoneNames, | ||
enCaGregorian, | ||
enNumbers, | ||
enTimeZoneNames, | ||
numberingSystems, | ||
ptCaGregorian, | ||
ptNumbers, | ||
timeData, | ||
@@ -36,4 +49,4 @@ weekData | ||
function assertParseDate( assert, input, options, output ) { | ||
assert.deepEqual( Globalize.parseDate( input, options ), output, JSON.stringify( options ) ); | ||
function assertParseDate( assert, input, options, output, globalize ) { | ||
assert.deepEqual( ( globalize || Globalize ).parseDate( input, options ), output, JSON.stringify( options ) ); | ||
} | ||
@@ -68,2 +81,4 @@ | ||
ar = Globalize( "ar" ); | ||
date = new Date(); | ||
@@ -86,2 +101,3 @@ date.setDate( 15 ); | ||
assertParseDate( assert, "9/15/2010", { skeleton: "yMd" }, date ); | ||
assertParseDate( assert, "الأربعاء، ١٥ سبتمبر، ٢٠١٠ م", "GyMMMEd", date, ar ); | ||
@@ -91,2 +107,3 @@ date = new Date( 2010, 0 ); | ||
assertParseDate( assert, "Q3 2010", { skeleton: "yQQQ" }, date ); | ||
assertParseDate( assert, "الربع الثالث ٢٠١٠", "yQQQ", date, ar ); | ||
@@ -100,2 +117,4 @@ // Via instance globalize.parseDate(). | ||
ar = Globalize( "ar" ); | ||
date = new Date(); | ||
@@ -107,4 +126,6 @@ date.setHours( 17 ); | ||
assertParseDate( assert, "5:35:07 PM", { time: "medium" }, date ); | ||
assertParseDate( assert, "٥،٣٥،٠٧ م", { time: "medium" }, date, ar ); | ||
date = startOf( date, "minute" ); | ||
assertParseDate( assert, "5:35 PM", { time: "short" }, date ); | ||
assertParseDate( assert, "٥،٣٥ م", { time: "short" }, date, ar ); | ||
}); | ||
@@ -146,7 +167,10 @@ | ||
ar = Globalize( "ar" ); | ||
date = new Date(); | ||
date = startOf( date, "minute" ); | ||
assert.deepEqual( Globalize.parseDate( Globalize.formatDate( date, { datetime: "full" } ), { datetime: "full" } ), date ); | ||
assert.deepEqual( ar.parseDate( ar.formatDate( date, { datetime: "full" } ), { datetime: "full" } ), date ); | ||
}); | ||
}); |
@@ -5,2 +5,3 @@ define([ | ||
"src/date/format-properties", | ||
"src/util/string/pad", | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
@@ -12,4 +13,4 @@ "json!cldr-data/main/en/timeZoneNames.json", | ||
"cldr/supplemental" | ||
], function( Cldr, format, properties, enCaGregorian, timeZoneNames, likelySubtags, timeData, | ||
weekData ) { | ||
], function( Cldr, format, formatProperties, stringPad, enCaGregorian, timeZoneNames, likelySubtags, | ||
timeData, weekData ) { | ||
@@ -28,2 +29,20 @@ var cldr, | ||
function simpleFormat( pad ) { | ||
return function( value ) { | ||
return stringPad( value, pad ); | ||
}; | ||
} | ||
function properties( pattern, cldr ) { | ||
var pad, | ||
aux = formatProperties( pattern, cldr ); | ||
// Create simple number formatters for this test purposes. | ||
for ( pad in aux.formatNumber ) { | ||
aux.formatNumber[ pad ] = simpleFormat( pad ); | ||
} | ||
return aux; | ||
} | ||
FakeDate.prototype.getTimezoneOffset = function() { | ||
@@ -30,0 +49,0 @@ return this.timezoneOffset * -60; |
@@ -9,2 +9,3 @@ define([ | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
"json!cldr-data/main/en/numbers.json", | ||
"json!cldr-data/supplemental/likelySubtags.json", | ||
@@ -14,4 +15,4 @@ "json!cldr-data/supplemental/timeData.json", | ||
"cldr/supplemental" | ||
], function( Cldr, parse, parseProperties, startOf, tokenizer, tokenizerProperties, enCaGregorian, | ||
likelySubtags, timeData, weekData ) { | ||
], function( Cldr, parse, parseProperties, startOf, tokenizer, numberTokenizerProperties, | ||
enCaGregorian, enNumbers, likelySubtags, timeData, weekData ) { | ||
@@ -21,3 +22,8 @@ var cldr, date1, date2, midnight; | ||
function assertParse( assert, stringDate, pattern, cldr, date ) { | ||
var tokens = tokenizer( stringDate, tokenizerProperties( pattern, cldr ) ); | ||
var tokenizerProperties, tokens; | ||
tokenizerProperties = numberTokenizerProperties( pattern, cldr ); | ||
tokenizerProperties.parseNumber = simpleParseNumber; | ||
tokens = tokenizer( stringDate, tokenizerProperties ); | ||
assert.deepEqual( parse( stringDate, tokens, parseProperties( cldr ) ), date ); | ||
@@ -27,8 +33,12 @@ } | ||
function assertParseTimezone( assert, stringDate, pattern, cldr, timezoneOffset ) { | ||
var parsedTimezoneOffset, parsedDate, tokens, | ||
var parsedTimezoneOffset, parsedDate, tokenizerProperties, tokens, | ||
testPattern = "HH:mm " + pattern, | ||
testStringDate = "00:00 " + stringDate; | ||
tokens = tokenizer( testStringDate, tokenizerProperties( testPattern, cldr ) ); | ||
tokenizerProperties = numberTokenizerProperties( testPattern, cldr ); | ||
tokenizerProperties.parseNumber = simpleParseNumber; | ||
tokens = tokenizer( testStringDate, tokenizerProperties ); | ||
parsedDate = parse( testStringDate, tokens, parseProperties( cldr ) ); | ||
parsedTimezoneOffset = ( parsedDate - midnight ) / 1000 / 60 + midnight.getTimezoneOffset(); | ||
assert.equal( parsedTimezoneOffset, timezoneOffset, "stringDate `" + stringDate + | ||
@@ -38,4 +48,10 @@ "` pattern `" + pattern + "`" ); | ||
// Simple number parser for this test purposes. | ||
function simpleParseNumber( value ) { | ||
return +value; | ||
} | ||
Cldr.load( | ||
enCaGregorian, | ||
enNumbers, | ||
likelySubtags, | ||
@@ -42,0 +58,0 @@ timeData, |
@@ -11,2 +11,6 @@ define([ | ||
function foo() { | ||
return "foo"; | ||
} | ||
FakeDate.prototype.getTimezoneOffset = function() { | ||
@@ -24,22 +28,25 @@ return this.timezoneOffset; | ||
QUnit.test( "should format +H;-H", function( assert ) { | ||
assert.equal( hourFormat( BRT, "+H;-H" ), "-3", "" ); | ||
assert.equal( hourFormat( UTC, "+H;-H" ), "+0", "" ); | ||
assert.equal( hourFormat( IST, "+H;-H" ), "+5", "" ); | ||
assert.equal( hourFormat( HST, "+H;-H" ), "+10", "" ); | ||
assert.equal( hourFormat( BRT, "+H;-H", ":" ), "-3", "" ); | ||
assert.equal( hourFormat( UTC, "+H;-H", ":" ), "+0", "" ); | ||
assert.equal( hourFormat( IST, "+H;-H", ":" ), "+5", "" ); | ||
assert.equal( hourFormat( HST, "+H;-H", ":" ), "+10", "" ); | ||
assert.equal( hourFormat( IST, "+H;-H", "،", { 1: foo } ), "+foo", "" ); | ||
}); | ||
QUnit.test( "should format +HHmm;-HHmm", function( assert ) { | ||
assert.equal( hourFormat( BRT, "+HHmm;-HHmm" ), "-0300", "" ); | ||
assert.equal( hourFormat( UTC, "+HHmm;-HHmm" ), "+0000", "" ); | ||
assert.equal( hourFormat( IST, "+HHmm;-HHmm" ), "+0530", "" ); | ||
assert.equal( hourFormat( HST, "+HHmm;-HHmm" ), "+1000", "" ); | ||
assert.equal( hourFormat( BRT, "+HHmm;-HHmm", ":" ), "-0300", "" ); | ||
assert.equal( hourFormat( UTC, "+HHmm;-HHmm", ":" ), "+0000", "" ); | ||
assert.equal( hourFormat( IST, "+HHmm;-HHmm", ":" ), "+0530", "" ); | ||
assert.equal( hourFormat( HST, "+HHmm;-HHmm", ":" ), "+1000", "" ); | ||
assert.equal( hourFormat( IST, "+HHmm;-HHmm", "،", { 2: foo } ), "+foofoo", "" ); | ||
}); | ||
QUnit.test( "should format +HH:mm;-HH:mm", function( assert ) { | ||
assert.equal( hourFormat( BRT, "+HH:mm;-HH:mm" ), "-03:00", "" ); | ||
assert.equal( hourFormat( UTC, "+HH:mm;-HH:mm" ), "+00:00", "" ); | ||
assert.equal( hourFormat( IST, "+HH:mm;-HH:mm" ), "+05:30", "" ); | ||
assert.equal( hourFormat( HST, "+HH:mm;-HH:mm" ), "+10:00", "" ); | ||
assert.equal( hourFormat( BRT, "+HH:mm;-HH:mm", ":" ), "-03:00", "" ); | ||
assert.equal( hourFormat( UTC, "+HH:mm;-HH:mm", ":" ), "+00:00", "" ); | ||
assert.equal( hourFormat( IST, "+HH:mm;-HH:mm", ":" ), "+05:30", "" ); | ||
assert.equal( hourFormat( HST, "+HH:mm;-HH:mm", ":" ), "+10:00", "" ); | ||
assert.equal( hourFormat( IST, "+HH:mm;-HH:mm", "،", { 2: foo } ), "+foo،foo", "" ); | ||
}); | ||
}); |
@@ -6,11 +6,25 @@ define([ | ||
"json!cldr-data/main/en/ca-gregorian.json", | ||
"json!cldr-data/main/en/numbers.json", | ||
"json!cldr-data/supplemental/likelySubtags.json", | ||
"json!cldr-data/supplemental/timeData.json", | ||
"json!cldr-data/supplemental/weekData.json" | ||
], function( Cldr, tokenizer, properties, enCaGregorian, likelySubtags, timeData, weekData ) { | ||
], function( Cldr, tokenizer, tokenizerProperties, enCaGregorian, enNumbers, likelySubtags, | ||
timeData, weekData ) { | ||
var cldr; | ||
function properties( pattern, cldr ) { | ||
var aux = tokenizerProperties( pattern, cldr ); | ||
// Simple number parser for this test purposes. | ||
aux.parseNumber = function( value ) { | ||
return +value; | ||
}; | ||
return aux; | ||
} | ||
Cldr.load( | ||
enCaGregorian, | ||
enNumbers, | ||
likelySubtags, | ||
@@ -70,3 +84,4 @@ timeData, | ||
type: "y", | ||
lexeme: "1982" | ||
lexeme: "1982", | ||
value: 1982 | ||
}] ); | ||
@@ -78,3 +93,4 @@ }); | ||
type: "yy", | ||
lexeme: "82" | ||
lexeme: "82", | ||
value: 82 | ||
}] ); | ||
@@ -86,7 +102,9 @@ }); | ||
type: "yyy", | ||
lexeme: "1982" | ||
lexeme: "1982", | ||
value: 1982 | ||
}] ); | ||
assert.deepEqual( tokenizer( "01982", properties( "yyyyy", cldr ) ), [{ | ||
type: "yyyyy", | ||
lexeme: "01982" | ||
lexeme: "01982", | ||
value: 1982 | ||
}] ); | ||
@@ -98,3 +116,4 @@ }); | ||
type: "Y", | ||
lexeme: "1982" | ||
lexeme: "1982", | ||
value: 1982 | ||
}] ); | ||
@@ -106,3 +125,4 @@ }); | ||
type: "YY", | ||
lexeme: "82" | ||
lexeme: "82", | ||
value: 82 | ||
}] ); | ||
@@ -114,7 +134,9 @@ }); | ||
type: "YYY", | ||
lexeme: "1982" | ||
lexeme: "1982", | ||
value: 1982 | ||
}] ); | ||
assert.deepEqual( tokenizer( "01982", properties( "YYYYY", cldr ) ), [{ | ||
type: "YYYYY", | ||
lexeme: "01982" | ||
lexeme: "01982", | ||
value: 1982 | ||
}] ); | ||
@@ -130,7 +152,9 @@ }); | ||
type: "Q", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
assert.deepEqual( tokenizer( "1", properties( "q", cldr ) ), [{ | ||
type: "q", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
@@ -142,7 +166,9 @@ }); | ||
type: "QQ", | ||
lexeme: "01" | ||
lexeme: "01", | ||
value: 1 | ||
}] ); | ||
assert.deepEqual( tokenizer( "01", properties( "qq", cldr ) ), [{ | ||
type: "qq", | ||
lexeme: "01" | ||
lexeme: "01", | ||
value: 1 | ||
}] ); | ||
@@ -184,7 +210,9 @@ }); | ||
type: "M", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
assert.deepEqual( tokenizer( "1", properties( "L", cldr ) ), [{ | ||
type: "L", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
@@ -196,7 +224,9 @@ }); | ||
type: "MM", | ||
lexeme: "01" | ||
lexeme: "01", | ||
value: 1 | ||
}] ); | ||
assert.deepEqual( tokenizer( "01", properties( "LL", cldr ) ), [{ | ||
type: "LL", | ||
lexeme: "01" | ||
lexeme: "01", | ||
value: 1 | ||
}] ); | ||
@@ -251,3 +281,4 @@ }); | ||
type: "w", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
@@ -259,3 +290,4 @@ }); | ||
type: "ww", | ||
lexeme: "01" | ||
lexeme: "01", | ||
value: 1 | ||
}] ); | ||
@@ -267,3 +299,4 @@ }); | ||
type: "W", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
@@ -279,3 +312,4 @@ }); | ||
type: "d", | ||
lexeme: "2" | ||
lexeme: "2", | ||
value: 2 | ||
}] ); | ||
@@ -287,3 +321,4 @@ }); | ||
type: "dd", | ||
lexeme: "02" | ||
lexeme: "02", | ||
value: 2 | ||
}] ); | ||
@@ -295,3 +330,4 @@ }); | ||
type: "D", | ||
lexeme: "2" | ||
lexeme: "2", | ||
value: 2 | ||
}] ); | ||
@@ -303,7 +339,9 @@ }); | ||
type: "DD", | ||
lexeme: "02" | ||
lexeme: "02", | ||
value: 2 | ||
}] ); | ||
assert.deepEqual( tokenizer( "002", properties( "DDD", cldr ) ), [{ | ||
type: "DDD", | ||
lexeme: "002" | ||
lexeme: "002", | ||
value: 2 | ||
}] ); | ||
@@ -315,3 +353,4 @@ }); | ||
type: "F", | ||
lexeme: "1" | ||
lexeme: "1", | ||
value: 1 | ||
}] ); | ||
@@ -327,7 +366,9 @@ }); | ||
type: "e", | ||
lexeme: "7" | ||
lexeme: "7", | ||
value: 7 | ||
}] ); | ||
assert.deepEqual( tokenizer( "7", properties( "c", cldr ) ), [{ | ||
type: "c", | ||
lexeme: "7" | ||
lexeme: "7", | ||
value: 7 | ||
}] ); | ||
@@ -339,7 +380,9 @@ }); | ||
type: "ee", | ||
lexeme: "07" | ||
lexeme: "07", | ||
value: 7 | ||
}] ); | ||
assert.deepEqual( tokenizer( "07", properties( "cc", cldr ) ), [{ | ||
type: "cc", | ||
lexeme: "07" | ||
lexeme: "07", | ||
value: 7 | ||
}] ); | ||
@@ -450,3 +493,4 @@ }); | ||
type: "h", | ||
lexeme: "9" | ||
lexeme: "9", | ||
value: 9 | ||
}] ); | ||
@@ -458,3 +502,4 @@ }); | ||
type: "hh", | ||
lexeme: "09" | ||
lexeme: "09", | ||
value: 9 | ||
}] ); | ||
@@ -466,3 +511,4 @@ }); | ||
type: "H", | ||
lexeme: "9" | ||
lexeme: "9", | ||
value: 9 | ||
}] ); | ||
@@ -474,3 +520,4 @@ }); | ||
type: "HH", | ||
lexeme: "09" | ||
lexeme: "09", | ||
value: 9 | ||
}] ); | ||
@@ -482,3 +529,4 @@ }); | ||
type: "K", | ||
lexeme: "9" | ||
lexeme: "9", | ||
value: 9 | ||
}] ); | ||
@@ -490,3 +538,4 @@ }); | ||
type: "KK", | ||
lexeme: "09" | ||
lexeme: "09", | ||
value: 9 | ||
}] ); | ||
@@ -498,3 +547,4 @@ }); | ||
type: "k", | ||
lexeme: "9" | ||
lexeme: "9", | ||
value: 9 | ||
}] ); | ||
@@ -506,3 +556,4 @@ }); | ||
type: "kk", | ||
lexeme: "09" | ||
lexeme: "09", | ||
value: 9 | ||
}] ); | ||
@@ -514,3 +565,4 @@ }); | ||
type: "j", | ||
lexeme: "9" | ||
lexeme: "9", | ||
value: 9 | ||
}] ); | ||
@@ -522,3 +574,4 @@ }); | ||
type: "jj", | ||
lexeme: "09" | ||
lexeme: "09", | ||
value: 9 | ||
}] ); | ||
@@ -534,3 +587,4 @@ }); | ||
type: "m", | ||
lexeme: "5" | ||
lexeme: "5", | ||
value: 5 | ||
}] ); | ||
@@ -542,3 +596,4 @@ }); | ||
type: "mm", | ||
lexeme: "05" | ||
lexeme: "05", | ||
value: 5 | ||
}] ); | ||
@@ -554,3 +609,4 @@ }); | ||
type: "s", | ||
lexeme: "59" | ||
lexeme: "59", | ||
value: 59 | ||
}] ); | ||
@@ -562,3 +618,4 @@ }); | ||
type: "ss", | ||
lexeme: "59" | ||
lexeme: "59", | ||
value: 59 | ||
}] ); | ||
@@ -570,19 +627,24 @@ }); | ||
type: "S", | ||
lexeme: "4" | ||
lexeme: "4", | ||
value: 4 | ||
}] ); | ||
assert.deepEqual( tokenizer( "37", properties( "SS", cldr ) ), [{ | ||
type: "SS", | ||
lexeme: "37" | ||
lexeme: "37", | ||
value: 37 | ||
}] ); | ||
assert.deepEqual( tokenizer( "369", properties( "SSS", cldr ) ), [{ | ||
type: "SSS", | ||
lexeme: "369" | ||
lexeme: "369", | ||
value: 369 | ||
}] ); | ||
assert.deepEqual( tokenizer( "3690", properties( "SSSS", cldr ) ), [{ | ||
type: "SSSS", | ||
lexeme: "3690" | ||
lexeme: "3690", | ||
value: 3690 | ||
}] ); | ||
assert.deepEqual( tokenizer( "36900", properties( "SSSSS", cldr ) ), [{ | ||
type: "SSSSS", | ||
lexeme: "36900" | ||
lexeme: "36900", | ||
value: 36900 | ||
}] ); | ||
@@ -594,19 +656,24 @@ }); | ||
type: "A", | ||
lexeme: "633074" | ||
lexeme: "633074", | ||
value: 633074 | ||
}] ); | ||
assert.deepEqual( tokenizer( "6330737", properties( "AA", cldr ) ), [{ | ||
type: "AA", | ||
lexeme: "6330737" | ||
lexeme: "6330737", | ||
value: 6330737 | ||
}] ); | ||
assert.deepEqual( tokenizer( "63307369", properties( "AAA", cldr ) ), [{ | ||
type: "AAA", | ||
lexeme: "63307369" | ||
lexeme: "63307369", | ||
value: 63307369 | ||
}] ); | ||
assert.deepEqual( tokenizer( "633073690", properties( "AAAA", cldr ) ), [{ | ||
type: "AAAA", | ||
lexeme: "633073690" | ||
lexeme: "633073690", | ||
value: 633073690 | ||
}] ); | ||
assert.deepEqual( tokenizer( "6330736900", properties( "AAAAA", cldr ) ), [{ | ||
type: "AAAAA", | ||
lexeme: "6330736900" | ||
lexeme: "6330736900", | ||
value: 6330736900 | ||
}] ); | ||
@@ -613,0 +680,0 @@ }); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
403812
173
10560
482