Skip to content

Commit

Permalink
Date: Handle date and time in the same skeleton
Browse files Browse the repository at this point in the history
Fixes #272
Closes #426
  • Loading branch information
manrajgrover authored and rxaviers committed Apr 14, 2015
1 parent fb6c6c5 commit c471268
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 18 deletions.
1 change: 1 addition & 0 deletions src/date.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ define([
function validateRequiredCldr( path, value ) {
validateCldr( path, value, {
skip: [
/dates\/calendars\/gregorian\/dateTimeFormats\/availableFormats/,
/dates\/calendars\/gregorian\/days\/.*\/short/,
/supplemental\/timeData\/(?!001)/,
/supplemental\/weekData\/(?!001)/
Expand Down
59 changes: 41 additions & 18 deletions src/date/expand-pattern.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,54 @@ define([
* - { datetime: "full" } returns "EEEE, MMMM d, y 'at' h:mm:ss a zzzz";
* - { pattern: "dd/mm" } returns "dd/mm";
*/

return function( pattern, cldr ) {
var result;
var dateSkeleton, result, skeleton, timeSkeleton, type;

function combineDateTime( type, datePattern, timePattern ) {
return formatMessage(
cldr.main([
"dates/calendars/gregorian/dateTimeFormats",
type
]),
[ timePattern, datePattern ]
);
}

if ( typeof pattern === "string" ) {
pattern = { skeleton: pattern };
}

switch ( true ) {
case "skeleton" in pattern:
skeleton = pattern.skeleton;
result = cldr.main([
"dates/calendars/gregorian/dateTimeFormats/availableFormats",
pattern.skeleton
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 pattern:
Expand All @@ -49,22 +84,10 @@ return function( pattern, cldr ) {
break;

case "datetime" in pattern:
result = cldr.main([
"dates/calendars/gregorian/dateTimeFormats",
pattern.datetime
]);
if ( result ) {
result = formatMessage( result, [
cldr.main([
"dates/calendars/gregorian/timeFormats",
pattern.datetime
]),
cldr.main([
"dates/calendars/gregorian/dateFormats",
pattern.datetime
])
]);
}
result = combineDateTime( pattern.datetime,
cldr.main([ "dates/calendars/gregorian/dateFormats", pattern.datetime ]),
cldr.main([ "dates/calendars/gregorian/timeFormats", pattern.datetime ])
);
break;

case "pattern" in pattern:
Expand Down
4 changes: 4 additions & 0 deletions test/functional/date/date-formatter.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ QUnit.test( "should return a formatter", function( assert ) {
extraSetup();

assert.equal( Globalize.dateFormatter( "GyMMMEd" )( date ), "Wed, Sep 15, 2010 AD" );
assert.equal( Globalize.dateFormatter( "dhms" )( date ), "15, 5:35:07 PM" );
assert.equal( Globalize.dateFormatter( "GyMMMEdhms" )( date ), "Wed, Sep 15, 2010 AD, 5:35:07 PM" );
assert.equal( Globalize.dateFormatter( "Ems" )( date ), "Wed, 35:07" );
assert.equal( Globalize.dateFormatter( "yQQQhm" )( date ), "Q3 2010, 5:35 PM" );
});

});

0 comments on commit c471268

Please sign in to comment.