Skip to content

Commit b946b53

Browse files
committed
Message: add date raw and skeleton support.
1 parent 6da191b commit b946b53

File tree

6 files changed

+62
-8
lines changed

6 files changed

+62
-8
lines changed

src/core.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ define([
1717
"./util/object/extend",
1818
"./util/regexp/escape",
1919
"./util/string/pad",
20+
"./util/formatterfn/options",
2021

2122
"cldr/event"
2223
], function( Cldr, createError, formatMessage, runtimeBind, validate, validateCldr,
2324
validateDefaultLocale, validateParameterPresence, validateParameterRange, validateParameterType,
2425
validateParameterTypeLocale, validateParameterTypePlainObject, alwaysArray, alwaysCldr,
25-
isPlainObject, objectExtend, regexpEscape, stringPad ) {
26+
isPlainObject, objectExtend, regexpEscape, stringPad, formatterfnOptions ) {
2627

2728
function validateLikelySubtags( cldr ) {
2829
cldr.once( "get", validateCldr );
@@ -88,8 +89,8 @@ Globalize.locale = function( locale ) {
8889

8990
Globalize._messageFmts = {};
9091

91-
Globalize.addMessageFormatterFunction = function( name, fn ) {
92-
Globalize._messageFmts[name] = fn;
92+
Globalize.addMessageFormatterFunction = function( name, fn, options ) {
93+
Globalize._messageFmts[name] = formatterfnOptions( fn, options );
9394
};
9495

9596
/**

src/date.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,14 @@ function validateOptionsPreset( options ) {
5555
validateOptionsPresetEach( "datetime", options );
5656
}
5757

58+
var presets = [ "short", "medium", "long", "full" ];
59+
5860
function validateOptionsPresetEach( type, options ) {
5961
var value = options[ type ];
6062
validate(
6163
"E_INVALID_OPTIONS",
6264
"Invalid `{{type}: \"{value}\"}`.",
63-
value === undefined || [ "short", "medium", "long", "full" ].indexOf( value ) !== -1,
65+
value === undefined || presets.indexOf( value ) !== -1,
6466
{ type: type, value: value }
6567
);
6668
}
@@ -214,10 +216,18 @@ Globalize.prototype.dateToPartsFormatter = function( options ) {
214216
Globalize.addMessageFormatterFunction( type, function( p ) {
215217
var options = {};
216218
if ( p ) {
217-
options[type] = p;
219+
var trimmed = p.trim();
220+
if ( presets.indexOf( trimmed ) !== -1 ) {
221+
options[type] = trimmed;
222+
} else if ( trimmed.indexOf( "skeleton" ) === 0 && trimmed.indexOf( "," ) !== -1 ) {
223+
var splitArgs = p.split( ",", 2 );
224+
options.skeleton = splitArgs[1].trim();
225+
} else {
226+
options.raw = p;
227+
}
218228
}
219229
return this.dateFormatter( options );
220-
});
230+
}, { split: false, trim: false });
221231
});
222232

223233
/**

src/message/compiler.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,10 @@ Compiler.prototype.compile = function( src, lc ) {
198198

199199
// TODO: pc is only needed for validation, disable for now.
200200
var pc = { cardinal: [], ordinal: [] };
201+
202+
// Enable icu-compatible function parameter parsing so that commas
203+
// can be used inside custom date formats.
204+
pc.strictFunctionParams = true;
201205
var r = Parser.parse( src, pc ).map( function( token ) { return this.token( token ); }, this );
202206
return "function(d) { return " + ( r.join( " + " ) || "\"\"" ) + "; }";
203207
};

src/util/formatterfn/options.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
define(function() {
2+
3+
return function( fn, options ) {
4+
options = options || {};
5+
return function( ) {
6+
var args = [].slice.call( arguments, 0 );
7+
if ( args.length === 1 && ( options.split === undefined || options.split === true ) ) {
8+
args = args[0].split( "," );
9+
}
10+
if ( options.trim === undefined || options.trim === true ) {
11+
args = args.map( function( v ) {
12+
return v.trim();
13+
});
14+
}
15+
return fn.apply( this, args );
16+
};
17+
};
18+
19+
});

test/compiler/cases/message.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,11 @@ module.exports = {
6262
date: {
6363
date: "date: {x, date, long}",
6464
time: "time: {x, time, long}",
65-
datetime: "datetime: {x, datetime, long}"
65+
datetime: "datetime: {x, datetime, long}",
66+
raw: "date raw: {x, date, y-M-d HH:mm:ss zzzz }",
67+
rawComma: "date raw comma: {x, date, y-M-d, HH:mm:ss zzzz }",
68+
skeleton: "date skeleton: {x, date, skeleton, GyMMMEdhms}",
69+
skeletonInvalid: "date skeleton: {x, date, skeleton}"
6670
},
6771
relativetime: {
6872
default: "relativetime: {x, relativetime, minute}",

test/functional/message/message-formatter.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,11 @@ QUnit.module( ".messageFormatter( path )", {
9999
date: {
100100
date: "date: {x, date, long}",
101101
time: "time: {x, time, long}",
102-
datetime: "datetime: {x, datetime, long}"
102+
datetime: "datetime: {x, datetime, long}",
103+
raw: "date raw: {x, date, y-M-d HH:mm:ss zzzz }",
104+
rawComma: "date raw comma: {x, date, y-M-d, HH:mm:ss zzzz }",
105+
skeleton: "date skeleton: {x, date, skeleton, GyMMMEdhms}",
106+
skeletonInvalid: "date skeleton: {x, date, skeleton}"
103107
},
104108
relativetime: {
105109
default: "relativetime: {x, relativetime, minute}",
@@ -266,6 +270,18 @@ QUnit.test( "should support formatters in messages", function( assert ) {
266270
assert.messageFormatter( "en", "date/datetime", {
267271
x: date,
268272
}, "datetime: September 15, 2010 at 5:35:07 PM GMT+2" );
273+
assert.messageFormatter( "en", "date/raw", {
274+
x: date,
275+
}, "date raw: 2010-9-15 17:35:07 GMT+02:00 " );
276+
assert.messageFormatter( "en", "date/rawComma", {
277+
x: date,
278+
}, "date raw comma: 2010-9-15, 17:35:07 GMT+02:00 " );
279+
assert.messageFormatter( "en", "date/skeleton", {
280+
x: date,
281+
}, "date skeleton: Wed, Sep 15, 2010 AD, 5:35:07 PM" );
282+
assert.messageFormatter( "en", "date/skeletonInvalid", {
283+
x: date,
284+
}, "date skeleton: 7174l4ton" );
269285

270286
assert.messageFormatter( "en", "relativetime/default", {
271287
x: 2,

0 commit comments

Comments
 (0)