gettext_i18n_rails_js 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e826dcad9f42c2d8174bc464a82311b316452392
4
- data.tar.gz: 903eea917ab8c3da12239881b08e4b535539f4d8
3
+ metadata.gz: edf990e13090b53daedd585fa7f63adbe35650c9
4
+ data.tar.gz: 69581dc8e6a90b3d976067a03ae6912ed2c1eb6d
5
5
  SHA512:
6
- metadata.gz: d01e882ca2b2d58357277a5248a24ef865ef939ea53d2233dd7d12ca5a6aeca495240e2ea77a859d667f23a61791c7016bc6a708bd3d880848e139fbf95c3dce
7
- data.tar.gz: e4f0055692e3a56bc5383c0d84397f921d33437680a05b6cc84ad8dc67ad2eea5557363e278a97d24625a71d26883688617158015f3bc60ef3b32f19b0656047
6
+ metadata.gz: 95521966ffbf0dcf118c1afb84f1e22d357a43f6a2e9a29816a19cb61c5e4e5318e4fcaf6ca1f388085a29f09720331d210569fd1c3b93afbc3d93db00444a0b
7
+ data.tar.gz: 910fc40c326924717f8ac9d9cb4dd12a0848d8ebbb04d7ec0b00aa9150ecd4f81ee675a1a0693afc2a4d014ad27636078b82f44e2546646cad9de007a7d7d213
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # Changelog
2
2
 
3
- ## [0.1.0](https://github.com/webhippie/gettext_i18n_rails_js/releases/tag/v0.1.0) - 2015-02-24
3
+ ## [1.0.1](https://github.com/webhippie/gettext_i18n_rails_js/releases/tag/v1.0.1) - 2015-02-24
4
+
5
+ * Added missing javascripts to the gemspec
6
+
7
+ ## [1.0.0](https://github.com/webhippie/gettext_i18n_rails_js/releases/tag/v1.0.0) - 2015-02-24
4
8
 
5
9
  * Transfer from github.com/nubis/gettext_i18n_rails_js
6
10
  * Added TravisCI, Rubocop and Coveralls
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright (c) 2012-2015 Dropmysite.com <https://dropmyemail.com>
3
+ // Copyright (c) 2015 Webhippie <http://www.webhippie.de>
4
+ //
5
+ // Permission is hereby granted, free of charge, to any person obtaining
6
+ // a copy of this software and associated documentation files (the
7
+ // "Software"), to deal in the Software without restriction, including
8
+ // without limitation the rights to use, copy, modify, merge, publish,
9
+ // distribute, sublicense, and/or sell copies of the Software, and to
10
+ // permit persons to whom the Software is furnished to do so, subject to
11
+ // the following conditions:
12
+ //
13
+ // The above copyright notice and this permission notice shall be
14
+ // included in all copies or substantial portions of the Software.
15
+ //
16
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ //
24
+
25
+ //= require gettext/jed
26
+ //= require_self
27
+
28
+ (function() {
29
+ var locales = locales || {};
30
+ var locale = document.getElementsByTagName('html')[0].lang;
31
+
32
+ if(!locale) {
33
+ console.warn('No locale found as an html attribute, using default.');
34
+ return;
35
+ }
36
+
37
+ var i18n = new Jed(locales[locale] || {});
38
+
39
+ window.__ = function() {
40
+ return i18n.gettext.apply(i18n, arguments);
41
+ };
42
+
43
+ window.n__ = function() {
44
+ return i18n.ngettext.apply(i18n, arguments);
45
+ };
46
+
47
+ window.s__ = function(key) {
48
+ return window.__(key).split('|').pop();
49
+ };
50
+
51
+ window.gettext = window.__;
52
+ window.ngettext = window.n__;
53
+ window.sgettext = window.s__;
54
+
55
+ window.i18n = i18n;
56
+ })();
@@ -27,7 +27,7 @@ module GettextI18nRailsJs
27
27
  class Version
28
28
  MAJOR = 1
29
29
  MINOR = 0
30
- PATCH = 0
30
+ PATCH = 1
31
31
 
32
32
  PRE = nil
33
33
 
@@ -0,0 +1,1022 @@
1
+ /**
2
+ * @preserve jed.js https://github.com/SlexAxton/Jed
3
+ */
4
+ /*
5
+ -----------
6
+ A gettext compatible i18n library for modern JavaScript Applications
7
+
8
+ by Alex Sexton - AlexSexton [at] gmail - @SlexAxton
9
+ WTFPL license for use
10
+ Dojo CLA for contributions
11
+
12
+ Jed offers the entire applicable GNU gettext spec'd set of
13
+ functions, but also offers some nicer wrappers around them.
14
+ The api for gettext was written for a language with no function
15
+ overloading, so Jed allows a little more of that.
16
+
17
+ Many thanks to Joshua I. Miller - unrtst@cpan.org - who wrote
18
+ gettext.js back in 2008. I was able to vet a lot of my ideas
19
+ against his. I also made sure Jed passed against his tests
20
+ in order to offer easy upgrades -- jsgettext.berlios.de
21
+ */
22
+ (function (root, undef) {
23
+
24
+ // Set up some underscore-style functions, if you already have
25
+ // underscore, feel free to delete this section, and use it
26
+ // directly, however, the amount of functions used doesn't
27
+ // warrant having underscore as a full dependency.
28
+ // Underscore 1.3.0 was used to port and is licensed
29
+ // under the MIT License by Jeremy Ashkenas.
30
+ var ArrayProto = Array.prototype,
31
+ ObjProto = Object.prototype,
32
+ slice = ArrayProto.slice,
33
+ hasOwnProp = ObjProto.hasOwnProperty,
34
+ nativeForEach = ArrayProto.forEach,
35
+ breaker = {};
36
+
37
+ // We're not using the OOP style _ so we don't need the
38
+ // extra level of indirection. This still means that you
39
+ // sub out for real `_` though.
40
+ var _ = {
41
+ forEach : function( obj, iterator, context ) {
42
+ var i, l, key;
43
+ if ( obj === null ) {
44
+ return;
45
+ }
46
+
47
+ if ( nativeForEach && obj.forEach === nativeForEach ) {
48
+ obj.forEach( iterator, context );
49
+ }
50
+ else if ( obj.length === +obj.length ) {
51
+ for ( i = 0, l = obj.length; i < l; i++ ) {
52
+ if ( i in obj && iterator.call( context, obj[i], i, obj ) === breaker ) {
53
+ return;
54
+ }
55
+ }
56
+ }
57
+ else {
58
+ for ( key in obj) {
59
+ if ( hasOwnProp.call( obj, key ) ) {
60
+ if ( iterator.call (context, obj[key], key, obj ) === breaker ) {
61
+ return;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ },
67
+ extend : function( obj ) {
68
+ this.forEach( slice.call( arguments, 1 ), function ( source ) {
69
+ for ( var prop in source ) {
70
+ obj[prop] = source[prop];
71
+ }
72
+ });
73
+ return obj;
74
+ }
75
+ };
76
+ // END Miniature underscore impl
77
+
78
+ // Jed is a constructor function
79
+ var Jed = function ( options ) {
80
+ // Some minimal defaults
81
+ this.defaults = {
82
+ "locale_data" : {
83
+ "messages" : {
84
+ "" : {
85
+ "domain" : "messages",
86
+ "lang" : "en",
87
+ "plural_forms" : "nplurals=2; plural=(n != 1);"
88
+ }
89
+ // There are no default keys, though
90
+ }
91
+ },
92
+ // The default domain if one is missing
93
+ "domain" : "messages",
94
+ // enable debug mode to log untranslated strings to the console
95
+ "debug" : false
96
+ };
97
+
98
+ // Mix in the sent options with the default options
99
+ this.options = _.extend( {}, this.defaults, options );
100
+ this.textdomain( this.options.domain );
101
+
102
+ if ( options.domain && ! this.options.locale_data[ this.options.domain ] ) {
103
+ throw new Error('Text domain set to non-existent domain: `' + options.domain + '`');
104
+ }
105
+ };
106
+
107
+ // The gettext spec sets this character as the default
108
+ // delimiter for context lookups.
109
+ // e.g.: context\u0004key
110
+ // If your translation company uses something different,
111
+ // just change this at any time and it will use that instead.
112
+ Jed.context_delimiter = String.fromCharCode( 4 );
113
+
114
+ function getPluralFormFunc ( plural_form_string ) {
115
+ return Jed.PF.compile( plural_form_string || "nplurals=2; plural=(n != 1);");
116
+ }
117
+
118
+ function Chain( key, i18n ){
119
+ this._key = key;
120
+ this._i18n = i18n;
121
+ }
122
+
123
+ // Create a chainable api for adding args prettily
124
+ _.extend( Chain.prototype, {
125
+ onDomain : function ( domain ) {
126
+ this._domain = domain;
127
+ return this;
128
+ },
129
+ withContext : function ( context ) {
130
+ this._context = context;
131
+ return this;
132
+ },
133
+ ifPlural : function ( num, pkey ) {
134
+ this._val = num;
135
+ this._pkey = pkey;
136
+ return this;
137
+ },
138
+ fetch : function ( sArr ) {
139
+ if ( {}.toString.call( sArr ) != '[object Array]' ) {
140
+ sArr = [].slice.call(arguments, 0);
141
+ }
142
+ return ( sArr && sArr.length ? Jed.sprintf : function(x){ return x; } )(
143
+ this._i18n.dcnpgettext(this._domain, this._context, this._key, this._pkey, this._val),
144
+ sArr
145
+ );
146
+ }
147
+ });
148
+
149
+ // Add functions to the Jed prototype.
150
+ // These will be the functions on the object that's returned
151
+ // from creating a `new Jed()`
152
+ // These seem redundant, but they gzip pretty well.
153
+ _.extend( Jed.prototype, {
154
+ // The sexier api start point
155
+ translate : function ( key ) {
156
+ return new Chain( key, this );
157
+ },
158
+
159
+ textdomain : function ( domain ) {
160
+ if ( ! domain ) {
161
+ return this._textdomain;
162
+ }
163
+ this._textdomain = domain;
164
+ },
165
+
166
+ gettext : function ( key ) {
167
+ return this.dcnpgettext.call( this, undef, undef, key );
168
+ },
169
+
170
+ dgettext : function ( domain, key ) {
171
+ return this.dcnpgettext.call( this, domain, undef, key );
172
+ },
173
+
174
+ dcgettext : function ( domain , key /*, category */ ) {
175
+ // Ignores the category anyways
176
+ return this.dcnpgettext.call( this, domain, undef, key );
177
+ },
178
+
179
+ ngettext : function ( skey, pkey, val ) {
180
+ return this.dcnpgettext.call( this, undef, undef, skey, pkey, val );
181
+ },
182
+
183
+ dngettext : function ( domain, skey, pkey, val ) {
184
+ return this.dcnpgettext.call( this, domain, undef, skey, pkey, val );
185
+ },
186
+
187
+ dcngettext : function ( domain, skey, pkey, val/*, category */) {
188
+ return this.dcnpgettext.call( this, domain, undef, skey, pkey, val );
189
+ },
190
+
191
+ pgettext : function ( context, key ) {
192
+ return this.dcnpgettext.call( this, undef, context, key );
193
+ },
194
+
195
+ dpgettext : function ( domain, context, key ) {
196
+ return this.dcnpgettext.call( this, domain, context, key );
197
+ },
198
+
199
+ dcpgettext : function ( domain, context, key/*, category */) {
200
+ return this.dcnpgettext.call( this, domain, context, key );
201
+ },
202
+
203
+ npgettext : function ( context, skey, pkey, val ) {
204
+ return this.dcnpgettext.call( this, undef, context, skey, pkey, val );
205
+ },
206
+
207
+ dnpgettext : function ( domain, context, skey, pkey, val ) {
208
+ return this.dcnpgettext.call( this, domain, context, skey, pkey, val );
209
+ },
210
+
211
+ // The most fully qualified gettext function. It has every option.
212
+ // Since it has every option, we can use it from every other method.
213
+ // This is the bread and butter.
214
+ // Technically there should be one more argument in this function for 'Category',
215
+ // but since we never use it, we might as well not waste the bytes to define it.
216
+ dcnpgettext : function ( domain, context, singular_key, plural_key, val ) {
217
+ // Set some defaults
218
+
219
+ plural_key = plural_key || singular_key;
220
+
221
+ // Use the global domain default if one
222
+ // isn't explicitly passed in
223
+ domain = domain || this._textdomain;
224
+
225
+ var fallback;
226
+
227
+ // Handle special cases
228
+
229
+ // No options found
230
+ if ( ! this.options ) {
231
+ // There's likely something wrong, but we'll return the correct key for english
232
+ // We do this by instantiating a brand new Jed instance with the default set
233
+ // for everything that could be broken.
234
+ fallback = new Jed();
235
+ return fallback.dcnpgettext.call( fallback, undefined, undefined, singular_key, plural_key, val );
236
+ }
237
+
238
+ // No translation data provided
239
+ if ( ! this.options.locale_data ) {
240
+ throw new Error('No locale data provided.');
241
+ }
242
+
243
+ if ( ! this.options.locale_data[ domain ] ) {
244
+ throw new Error('Domain `' + domain + '` was not found.');
245
+ }
246
+
247
+ if ( ! this.options.locale_data[ domain ][ "" ] ) {
248
+ throw new Error('No locale meta information provided.');
249
+ }
250
+
251
+ // Make sure we have a truthy key. Otherwise we might start looking
252
+ // into the empty string key, which is the options for the locale
253
+ // data.
254
+ if ( ! singular_key ) {
255
+ throw new Error('No translation key found.');
256
+ }
257
+
258
+ var key = context ? context + Jed.context_delimiter + singular_key : singular_key,
259
+ locale_data = this.options.locale_data,
260
+ dict = locale_data[ domain ],
261
+ defaultConf = (locale_data.messages || this.defaults.locale_data.messages)[""],
262
+ pluralForms = dict[""].plural_forms || dict[""]["Plural-Forms"] || dict[""]["plural-forms"] || defaultConf.plural_forms || defaultConf["Plural-Forms"] || defaultConf["plural-forms"],
263
+ val_list,
264
+ res;
265
+
266
+ var val_idx;
267
+ if (val === undefined) {
268
+ // No value passed in; assume singular key lookup.
269
+ val_idx = 0;
270
+
271
+ } else {
272
+ // Value has been passed in; use plural-forms calculations.
273
+
274
+ // Handle invalid numbers, but try casting strings for good measure
275
+ if ( typeof val != 'number' ) {
276
+ val = parseInt( val, 10 );
277
+
278
+ if ( isNaN( val ) ) {
279
+ throw new Error('The number that was passed in is not a number.');
280
+ }
281
+ }
282
+
283
+ val_idx = getPluralFormFunc(pluralForms)(val);
284
+ }
285
+
286
+ // Throw an error if a domain isn't found
287
+ if ( ! dict ) {
288
+ throw new Error('No domain named `' + domain + '` could be found.');
289
+ }
290
+
291
+ val_list = dict[ key ];
292
+
293
+ // If there is no match, then revert back to
294
+ // english style singular/plural with the keys passed in.
295
+ if ( ! val_list || val_idx > val_list.length ) {
296
+ if (this.options.missing_key_callback) {
297
+ this.options.missing_key_callback(key, domain);
298
+ }
299
+ res = [ singular_key, plural_key ];
300
+
301
+ // collect untranslated strings
302
+ if (this.options.debug===true) {
303
+ console.log(res[ getPluralFormFunc(pluralForms)( val ) ]);
304
+ }
305
+ return res[ getPluralFormFunc()( val ) ];
306
+ }
307
+
308
+ res = val_list[ val_idx ];
309
+
310
+ // This includes empty strings on purpose
311
+ if ( ! res ) {
312
+ res = [ singular_key, plural_key ];
313
+ return res[ getPluralFormFunc()( val ) ];
314
+ }
315
+ return res;
316
+ }
317
+ });
318
+
319
+
320
+ // We add in sprintf capabilities for post translation value interolation
321
+ // This is not internally used, so you can remove it if you have this
322
+ // available somewhere else, or want to use a different system.
323
+
324
+ // We _slightly_ modify the normal sprintf behavior to more gracefully handle
325
+ // undefined values.
326
+
327
+ /**
328
+ sprintf() for JavaScript 0.7-beta1
329
+ http://www.diveintojavascript.com/projects/javascript-sprintf
330
+
331
+ Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
332
+ All rights reserved.
333
+
334
+ Redistribution and use in source and binary forms, with or without
335
+ modification, are permitted provided that the following conditions are met:
336
+ * Redistributions of source code must retain the above copyright
337
+ notice, this list of conditions and the following disclaimer.
338
+ * Redistributions in binary form must reproduce the above copyright
339
+ notice, this list of conditions and the following disclaimer in the
340
+ documentation and/or other materials provided with the distribution.
341
+ * Neither the name of sprintf() for JavaScript nor the
342
+ names of its contributors may be used to endorse or promote products
343
+ derived from this software without specific prior written permission.
344
+
345
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
346
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
347
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
348
+ DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
349
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
350
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
351
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
352
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
353
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
354
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
355
+ */
356
+ var sprintf = (function() {
357
+ function get_type(variable) {
358
+ return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
359
+ }
360
+ function str_repeat(input, multiplier) {
361
+ for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
362
+ return output.join('');
363
+ }
364
+
365
+ var str_format = function() {
366
+ if (!str_format.cache.hasOwnProperty(arguments[0])) {
367
+ str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
368
+ }
369
+ return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
370
+ };
371
+
372
+ str_format.format = function(parse_tree, argv) {
373
+ var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
374
+ for (i = 0; i < tree_length; i++) {
375
+ node_type = get_type(parse_tree[i]);
376
+ if (node_type === 'string') {
377
+ output.push(parse_tree[i]);
378
+ }
379
+ else if (node_type === 'array') {
380
+ match = parse_tree[i]; // convenience purposes only
381
+ if (match[2]) { // keyword argument
382
+ arg = argv[cursor];
383
+ for (k = 0; k < match[2].length; k++) {
384
+ if (!arg.hasOwnProperty(match[2][k])) {
385
+ throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
386
+ }
387
+ arg = arg[match[2][k]];
388
+ }
389
+ }
390
+ else if (match[1]) { // positional argument (explicit)
391
+ arg = argv[match[1]];
392
+ }
393
+ else { // positional argument (implicit)
394
+ arg = argv[cursor++];
395
+ }
396
+
397
+ if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
398
+ throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
399
+ }
400
+
401
+ // Jed EDIT
402
+ if ( typeof arg == 'undefined' || arg === null ) {
403
+ arg = '';
404
+ }
405
+ // Jed EDIT
406
+
407
+ switch (match[8]) {
408
+ case 'b': arg = arg.toString(2); break;
409
+ case 'c': arg = String.fromCharCode(arg); break;
410
+ case 'd': arg = parseInt(arg, 10); break;
411
+ case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
412
+ case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
413
+ case 'o': arg = arg.toString(8); break;
414
+ case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
415
+ case 'u': arg = Math.abs(arg); break;
416
+ case 'x': arg = arg.toString(16); break;
417
+ case 'X': arg = arg.toString(16).toUpperCase(); break;
418
+ }
419
+ arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
420
+ pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
421
+ pad_length = match[6] - String(arg).length;
422
+ pad = match[6] ? str_repeat(pad_character, pad_length) : '';
423
+ output.push(match[5] ? arg + pad : pad + arg);
424
+ }
425
+ }
426
+ return output.join('');
427
+ };
428
+
429
+ str_format.cache = {};
430
+
431
+ str_format.parse = function(fmt) {
432
+ var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
433
+ while (_fmt) {
434
+ if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
435
+ parse_tree.push(match[0]);
436
+ }
437
+ else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
438
+ parse_tree.push('%');
439
+ }
440
+ else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
441
+ if (match[2]) {
442
+ arg_names |= 1;
443
+ var field_list = [], replacement_field = match[2], field_match = [];
444
+ if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
445
+ field_list.push(field_match[1]);
446
+ while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
447
+ if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
448
+ field_list.push(field_match[1]);
449
+ }
450
+ else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
451
+ field_list.push(field_match[1]);
452
+ }
453
+ else {
454
+ throw('[sprintf] huh?');
455
+ }
456
+ }
457
+ }
458
+ else {
459
+ throw('[sprintf] huh?');
460
+ }
461
+ match[2] = field_list;
462
+ }
463
+ else {
464
+ arg_names |= 2;
465
+ }
466
+ if (arg_names === 3) {
467
+ throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
468
+ }
469
+ parse_tree.push(match);
470
+ }
471
+ else {
472
+ throw('[sprintf] huh?');
473
+ }
474
+ _fmt = _fmt.substring(match[0].length);
475
+ }
476
+ return parse_tree;
477
+ };
478
+
479
+ return str_format;
480
+ })();
481
+
482
+ var vsprintf = function(fmt, argv) {
483
+ argv.unshift(fmt);
484
+ return sprintf.apply(null, argv);
485
+ };
486
+
487
+ Jed.parse_plural = function ( plural_forms, n ) {
488
+ plural_forms = plural_forms.replace(/n/g, n);
489
+ return Jed.parse_expression(plural_forms);
490
+ };
491
+
492
+ Jed.sprintf = function ( fmt, args ) {
493
+ if ( {}.toString.call( args ) == '[object Array]' ) {
494
+ return vsprintf( fmt, [].slice.call(args) );
495
+ }
496
+ return sprintf.apply(this, [].slice.call(arguments) );
497
+ };
498
+
499
+ Jed.prototype.sprintf = function () {
500
+ return Jed.sprintf.apply(this, arguments);
501
+ };
502
+ // END sprintf Implementation
503
+
504
+ // Start the Plural forms section
505
+ // This is a full plural form expression parser. It is used to avoid
506
+ // running 'eval' or 'new Function' directly against the plural
507
+ // forms.
508
+ //
509
+ // This can be important if you get translations done through a 3rd
510
+ // party vendor. I encourage you to use this instead, however, I
511
+ // also will provide a 'precompiler' that you can use at build time
512
+ // to output valid/safe function representations of the plural form
513
+ // expressions. This means you can build this code out for the most
514
+ // part.
515
+ Jed.PF = {};
516
+
517
+ Jed.PF.parse = function ( p ) {
518
+ var plural_str = Jed.PF.extractPluralExpr( p );
519
+ return Jed.PF.parser.parse.call(Jed.PF.parser, plural_str);
520
+ };
521
+
522
+ Jed.PF.compile = function ( p ) {
523
+ // Handle trues and falses as 0 and 1
524
+ function imply( val ) {
525
+ return (val === true ? 1 : val ? val : 0);
526
+ }
527
+
528
+ var ast = Jed.PF.parse( p );
529
+ return function ( n ) {
530
+ return imply( Jed.PF.interpreter( ast )( n ) );
531
+ };
532
+ };
533
+
534
+ Jed.PF.interpreter = function ( ast ) {
535
+ return function ( n ) {
536
+ var res;
537
+ switch ( ast.type ) {
538
+ case 'GROUP':
539
+ return Jed.PF.interpreter( ast.expr )( n );
540
+ case 'TERNARY':
541
+ if ( Jed.PF.interpreter( ast.expr )( n ) ) {
542
+ return Jed.PF.interpreter( ast.truthy )( n );
543
+ }
544
+ return Jed.PF.interpreter( ast.falsey )( n );
545
+ case 'OR':
546
+ return Jed.PF.interpreter( ast.left )( n ) || Jed.PF.interpreter( ast.right )( n );
547
+ case 'AND':
548
+ return Jed.PF.interpreter( ast.left )( n ) && Jed.PF.interpreter( ast.right )( n );
549
+ case 'LT':
550
+ return Jed.PF.interpreter( ast.left )( n ) < Jed.PF.interpreter( ast.right )( n );
551
+ case 'GT':
552
+ return Jed.PF.interpreter( ast.left )( n ) > Jed.PF.interpreter( ast.right )( n );
553
+ case 'LTE':
554
+ return Jed.PF.interpreter( ast.left )( n ) <= Jed.PF.interpreter( ast.right )( n );
555
+ case 'GTE':
556
+ return Jed.PF.interpreter( ast.left )( n ) >= Jed.PF.interpreter( ast.right )( n );
557
+ case 'EQ':
558
+ return Jed.PF.interpreter( ast.left )( n ) == Jed.PF.interpreter( ast.right )( n );
559
+ case 'NEQ':
560
+ return Jed.PF.interpreter( ast.left )( n ) != Jed.PF.interpreter( ast.right )( n );
561
+ case 'MOD':
562
+ return Jed.PF.interpreter( ast.left )( n ) % Jed.PF.interpreter( ast.right )( n );
563
+ case 'VAR':
564
+ return n;
565
+ case 'NUM':
566
+ return ast.val;
567
+ default:
568
+ throw new Error("Invalid Token found.");
569
+ }
570
+ };
571
+ };
572
+
573
+ Jed.PF.extractPluralExpr = function ( p ) {
574
+ // trim first
575
+ p = p.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
576
+
577
+ if (! /;\s*$/.test(p)) {
578
+ p = p.concat(';');
579
+ }
580
+
581
+ var nplurals_re = /nplurals\=(\d+);/,
582
+ plural_re = /plural\=(.*);/,
583
+ nplurals_matches = p.match( nplurals_re ),
584
+ res = {},
585
+ plural_matches;
586
+
587
+ // Find the nplurals number
588
+ if ( nplurals_matches.length > 1 ) {
589
+ res.nplurals = nplurals_matches[1];
590
+ }
591
+ else {
592
+ throw new Error('nplurals not found in plural_forms string: ' + p );
593
+ }
594
+
595
+ // remove that data to get to the formula
596
+ p = p.replace( nplurals_re, "" );
597
+ plural_matches = p.match( plural_re );
598
+
599
+ if (!( plural_matches && plural_matches.length > 1 ) ) {
600
+ throw new Error('`plural` expression not found: ' + p);
601
+ }
602
+ return plural_matches[ 1 ];
603
+ };
604
+
605
+ /* Jison generated parser */
606
+ Jed.PF.parser = (function(){
607
+
608
+ var parser = {trace: function trace() { },
609
+ yy: {},
610
+ symbols_: {"error":2,"expressions":3,"e":4,"EOF":5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,"n":19,"NUMBER":20,"$accept":0,"$end":1},
611
+ terminals_: {2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},
612
+ productions_: [0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],
613
+ performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
614
+
615
+ var $0 = $$.length - 1;
616
+ switch (yystate) {
617
+ case 1: return { type : 'GROUP', expr: $$[$0-1] };
618
+ break;
619
+ case 2:this.$ = { type: 'TERNARY', expr: $$[$0-4], truthy : $$[$0-2], falsey: $$[$0] };
620
+ break;
621
+ case 3:this.$ = { type: "OR", left: $$[$0-2], right: $$[$0] };
622
+ break;
623
+ case 4:this.$ = { type: "AND", left: $$[$0-2], right: $$[$0] };
624
+ break;
625
+ case 5:this.$ = { type: 'LT', left: $$[$0-2], right: $$[$0] };
626
+ break;
627
+ case 6:this.$ = { type: 'LTE', left: $$[$0-2], right: $$[$0] };
628
+ break;
629
+ case 7:this.$ = { type: 'GT', left: $$[$0-2], right: $$[$0] };
630
+ break;
631
+ case 8:this.$ = { type: 'GTE', left: $$[$0-2], right: $$[$0] };
632
+ break;
633
+ case 9:this.$ = { type: 'NEQ', left: $$[$0-2], right: $$[$0] };
634
+ break;
635
+ case 10:this.$ = { type: 'EQ', left: $$[$0-2], right: $$[$0] };
636
+ break;
637
+ case 11:this.$ = { type: 'MOD', left: $$[$0-2], right: $$[$0] };
638
+ break;
639
+ case 12:this.$ = { type: 'GROUP', expr: $$[$0-1] };
640
+ break;
641
+ case 13:this.$ = { type: 'VAR' };
642
+ break;
643
+ case 14:this.$ = { type: 'NUM', val: Number(yytext) };
644
+ break;
645
+ }
646
+ },
647
+ table: [{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],
648
+ defaultActions: {6:[2,1]},
649
+ parseError: function parseError(str, hash) {
650
+ throw new Error(str);
651
+ },
652
+ parse: function parse(input) {
653
+ var self = this,
654
+ stack = [0],
655
+ vstack = [null], // semantic value stack
656
+ lstack = [], // location stack
657
+ table = this.table,
658
+ yytext = '',
659
+ yylineno = 0,
660
+ yyleng = 0,
661
+ recovering = 0,
662
+ TERROR = 2,
663
+ EOF = 1;
664
+
665
+ //this.reductionCount = this.shiftCount = 0;
666
+
667
+ this.lexer.setInput(input);
668
+ this.lexer.yy = this.yy;
669
+ this.yy.lexer = this.lexer;
670
+ if (typeof this.lexer.yylloc == 'undefined')
671
+ this.lexer.yylloc = {};
672
+ var yyloc = this.lexer.yylloc;
673
+ lstack.push(yyloc);
674
+
675
+ if (typeof this.yy.parseError === 'function')
676
+ this.parseError = this.yy.parseError;
677
+
678
+ function popStack (n) {
679
+ stack.length = stack.length - 2*n;
680
+ vstack.length = vstack.length - n;
681
+ lstack.length = lstack.length - n;
682
+ }
683
+
684
+ function lex() {
685
+ var token;
686
+ token = self.lexer.lex() || 1; // $end = 1
687
+ // if token isn't its numeric value, convert
688
+ if (typeof token !== 'number') {
689
+ token = self.symbols_[token] || token;
690
+ }
691
+ return token;
692
+ }
693
+
694
+ var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;
695
+ while (true) {
696
+ // retreive state number from top of stack
697
+ state = stack[stack.length-1];
698
+
699
+ // use default actions if available
700
+ if (this.defaultActions[state]) {
701
+ action = this.defaultActions[state];
702
+ } else {
703
+ if (symbol == null)
704
+ symbol = lex();
705
+ // read action for current state and first input
706
+ action = table[state] && table[state][symbol];
707
+ }
708
+
709
+ // handle parse error
710
+ _handle_error:
711
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
712
+
713
+ if (!recovering) {
714
+ // Report error
715
+ expected = [];
716
+ for (p in table[state]) if (this.terminals_[p] && p > 2) {
717
+ expected.push("'"+this.terminals_[p]+"'");
718
+ }
719
+ var errStr = '';
720
+ if (this.lexer.showPosition) {
721
+ errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'";
722
+ } else {
723
+ errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
724
+ (symbol == 1 /*EOF*/ ? "end of input" :
725
+ ("'"+(this.terminals_[symbol] || symbol)+"'"));
726
+ }
727
+ this.parseError(errStr,
728
+ {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
729
+ }
730
+
731
+ // just recovered from another error
732
+ if (recovering == 3) {
733
+ if (symbol == EOF) {
734
+ throw new Error(errStr || 'Parsing halted.');
735
+ }
736
+
737
+ // discard current lookahead and grab another
738
+ yyleng = this.lexer.yyleng;
739
+ yytext = this.lexer.yytext;
740
+ yylineno = this.lexer.yylineno;
741
+ yyloc = this.lexer.yylloc;
742
+ symbol = lex();
743
+ }
744
+
745
+ // try to recover from error
746
+ while (1) {
747
+ // check for error recovery rule in this state
748
+ if ((TERROR.toString()) in table[state]) {
749
+ break;
750
+ }
751
+ if (state == 0) {
752
+ throw new Error(errStr || 'Parsing halted.');
753
+ }
754
+ popStack(1);
755
+ state = stack[stack.length-1];
756
+ }
757
+
758
+ preErrorSymbol = symbol; // save the lookahead token
759
+ symbol = TERROR; // insert generic error symbol as new lookahead
760
+ state = stack[stack.length-1];
761
+ action = table[state] && table[state][TERROR];
762
+ recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
763
+ }
764
+
765
+ // this shouldn't happen, unless resolve defaults are off
766
+ if (action[0] instanceof Array && action.length > 1) {
767
+ throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
768
+ }
769
+
770
+ switch (action[0]) {
771
+
772
+ case 1: // shift
773
+ //this.shiftCount++;
774
+
775
+ stack.push(symbol);
776
+ vstack.push(this.lexer.yytext);
777
+ lstack.push(this.lexer.yylloc);
778
+ stack.push(action[1]); // push state
779
+ symbol = null;
780
+ if (!preErrorSymbol) { // normal execution/no error
781
+ yyleng = this.lexer.yyleng;
782
+ yytext = this.lexer.yytext;
783
+ yylineno = this.lexer.yylineno;
784
+ yyloc = this.lexer.yylloc;
785
+ if (recovering > 0)
786
+ recovering--;
787
+ } else { // error just occurred, resume old lookahead f/ before error
788
+ symbol = preErrorSymbol;
789
+ preErrorSymbol = null;
790
+ }
791
+ break;
792
+
793
+ case 2: // reduce
794
+ //this.reductionCount++;
795
+
796
+ len = this.productions_[action[1]][1];
797
+
798
+ // perform semantic action
799
+ yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
800
+ // default location, uses first token for firsts, last for lasts
801
+ yyval._$ = {
802
+ first_line: lstack[lstack.length-(len||1)].first_line,
803
+ last_line: lstack[lstack.length-1].last_line,
804
+ first_column: lstack[lstack.length-(len||1)].first_column,
805
+ last_column: lstack[lstack.length-1].last_column
806
+ };
807
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
808
+
809
+ if (typeof r !== 'undefined') {
810
+ return r;
811
+ }
812
+
813
+ // pop off stack
814
+ if (len) {
815
+ stack = stack.slice(0,-1*len*2);
816
+ vstack = vstack.slice(0, -1*len);
817
+ lstack = lstack.slice(0, -1*len);
818
+ }
819
+
820
+ stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)
821
+ vstack.push(yyval.$);
822
+ lstack.push(yyval._$);
823
+ // goto new state = table[STATE][NONTERMINAL]
824
+ newState = table[stack[stack.length-2]][stack[stack.length-1]];
825
+ stack.push(newState);
826
+ break;
827
+
828
+ case 3: // accept
829
+ return true;
830
+ }
831
+
832
+ }
833
+
834
+ return true;
835
+ }};/* Jison generated lexer */
836
+ var lexer = (function(){
837
+
838
+ var lexer = ({EOF:1,
839
+ parseError:function parseError(str, hash) {
840
+ if (this.yy.parseError) {
841
+ this.yy.parseError(str, hash);
842
+ } else {
843
+ throw new Error(str);
844
+ }
845
+ },
846
+ setInput:function (input) {
847
+ this._input = input;
848
+ this._more = this._less = this.done = false;
849
+ this.yylineno = this.yyleng = 0;
850
+ this.yytext = this.matched = this.match = '';
851
+ this.conditionStack = ['INITIAL'];
852
+ this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
853
+ return this;
854
+ },
855
+ input:function () {
856
+ var ch = this._input[0];
857
+ this.yytext+=ch;
858
+ this.yyleng++;
859
+ this.match+=ch;
860
+ this.matched+=ch;
861
+ var lines = ch.match(/\n/);
862
+ if (lines) this.yylineno++;
863
+ this._input = this._input.slice(1);
864
+ return ch;
865
+ },
866
+ unput:function (ch) {
867
+ this._input = ch + this._input;
868
+ return this;
869
+ },
870
+ more:function () {
871
+ this._more = true;
872
+ return this;
873
+ },
874
+ pastInput:function () {
875
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
876
+ return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
877
+ },
878
+ upcomingInput:function () {
879
+ var next = this.match;
880
+ if (next.length < 20) {
881
+ next += this._input.substr(0, 20-next.length);
882
+ }
883
+ return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
884
+ },
885
+ showPosition:function () {
886
+ var pre = this.pastInput();
887
+ var c = new Array(pre.length + 1).join("-");
888
+ return pre + this.upcomingInput() + "\n" + c+"^";
889
+ },
890
+ next:function () {
891
+ if (this.done) {
892
+ return this.EOF;
893
+ }
894
+ if (!this._input) this.done = true;
895
+
896
+ var token,
897
+ match,
898
+ col,
899
+ lines;
900
+ if (!this._more) {
901
+ this.yytext = '';
902
+ this.match = '';
903
+ }
904
+ var rules = this._currentRules();
905
+ for (var i=0;i < rules.length; i++) {
906
+ match = this._input.match(this.rules[rules[i]]);
907
+ if (match) {
908
+ lines = match[0].match(/\n.*/g);
909
+ if (lines) this.yylineno += lines.length;
910
+ this.yylloc = {first_line: this.yylloc.last_line,
911
+ last_line: this.yylineno+1,
912
+ first_column: this.yylloc.last_column,
913
+ last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
914
+ this.yytext += match[0];
915
+ this.match += match[0];
916
+ this.matches = match;
917
+ this.yyleng = this.yytext.length;
918
+ this._more = false;
919
+ this._input = this._input.slice(match[0].length);
920
+ this.matched += match[0];
921
+ token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);
922
+ if (token) return token;
923
+ else return;
924
+ }
925
+ }
926
+ if (this._input === "") {
927
+ return this.EOF;
928
+ } else {
929
+ this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
930
+ {text: "", token: null, line: this.yylineno});
931
+ }
932
+ },
933
+ lex:function lex() {
934
+ var r = this.next();
935
+ if (typeof r !== 'undefined') {
936
+ return r;
937
+ } else {
938
+ return this.lex();
939
+ }
940
+ },
941
+ begin:function begin(condition) {
942
+ this.conditionStack.push(condition);
943
+ },
944
+ popState:function popState() {
945
+ return this.conditionStack.pop();
946
+ },
947
+ _currentRules:function _currentRules() {
948
+ return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
949
+ },
950
+ topState:function () {
951
+ return this.conditionStack[this.conditionStack.length-2];
952
+ },
953
+ pushState:function begin(condition) {
954
+ this.begin(condition);
955
+ }});
956
+ lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
957
+
958
+ var YYSTATE=YY_START;
959
+ switch($avoiding_name_collisions) {
960
+ case 0:/* skip whitespace */
961
+ break;
962
+ case 1:return 20
963
+ break;
964
+ case 2:return 19
965
+ break;
966
+ case 3:return 8
967
+ break;
968
+ case 4:return 9
969
+ break;
970
+ case 5:return 6
971
+ break;
972
+ case 6:return 7
973
+ break;
974
+ case 7:return 11
975
+ break;
976
+ case 8:return 13
977
+ break;
978
+ case 9:return 10
979
+ break;
980
+ case 10:return 12
981
+ break;
982
+ case 11:return 14
983
+ break;
984
+ case 12:return 15
985
+ break;
986
+ case 13:return 16
987
+ break;
988
+ case 14:return 17
989
+ break;
990
+ case 15:return 18
991
+ break;
992
+ case 16:return 5
993
+ break;
994
+ case 17:return 'INVALID'
995
+ break;
996
+ }
997
+ };
998
+ lexer.rules = [/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./];
999
+ lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}};return lexer;})()
1000
+ parser.lexer = lexer;
1001
+ return parser;
1002
+ })();
1003
+ // End parser
1004
+
1005
+ // Handle node, amd, and global systems
1006
+ if (typeof exports !== 'undefined') {
1007
+ if (typeof module !== 'undefined' && module.exports) {
1008
+ exports = module.exports = Jed;
1009
+ }
1010
+ exports.Jed = Jed;
1011
+ }
1012
+ else {
1013
+ if (typeof define === 'function' && define.amd) {
1014
+ define(function() {
1015
+ return Jed;
1016
+ });
1017
+ }
1018
+ // Leak a global regardless of module system
1019
+ root['Jed'] = Jed;
1020
+ }
1021
+
1022
+ })(this);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gettext_i18n_rails_js
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Boerger
@@ -15,112 +15,112 @@ dependencies:
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: yard
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rails
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: 3.2.0
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: 3.2.0
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: gettext
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: 3.0.2
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: 3.0.2
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: gettext_i18n_rails
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: 0.7.1
105
105
  type: :runtime
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: 0.7.1
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: po_to_json
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: 0.1.0
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: 0.1.0
126
126
  description: |2
@@ -136,24 +136,26 @@ extensions: []
136
136
  extra_rdoc_files: []
137
137
  files:
138
138
  - CHANGELOG.md
139
- - README.md
140
139
  - LICENSE
141
- - lib/tasks/gettext_i18n_rails_js_tasks.rake
140
+ - README.md
141
+ - lib/assets/javascripts/gettext/all.js
142
142
  - lib/gettext_i18n_rails_js.rb
143
- - lib/gettext_i18n_rails_js/version.rb
144
143
  - lib/gettext_i18n_rails_js/engine.rb
144
+ - lib/gettext_i18n_rails_js/parser.rb
145
145
  - lib/gettext_i18n_rails_js/parser/base.rb
146
146
  - lib/gettext_i18n_rails_js/parser/handlebars.rb
147
147
  - lib/gettext_i18n_rails_js/parser/javascript.rb
148
- - lib/gettext_i18n_rails_js/parser.rb
149
- - spec/spec_helper.rb
148
+ - lib/gettext_i18n_rails_js/version.rb
149
+ - lib/tasks/gettext_i18n_rails_js_tasks.rake
150
150
  - spec/fixtures/example.coffee
151
- - spec/fixtures/example.js
152
151
  - spec/fixtures/example.handlebars
153
- - spec/support/with_file.rb
154
- - spec/gettext_i18n_rails_js_spec.rb
152
+ - spec/fixtures/example.js
155
153
  - spec/gettext_i18n_rails_js/parser/handlebars_spec.rb
156
154
  - spec/gettext_i18n_rails_js/parser/javascript_spec.rb
155
+ - spec/gettext_i18n_rails_js_spec.rb
156
+ - spec/spec_helper.rb
157
+ - spec/support/with_file.rb
158
+ - vendor/assets/javascripts/gettext/jed.js
157
159
  homepage: https://github.com/webhippie/gettext_i18n_rails_js
158
160
  licenses:
159
161
  - MIT
@@ -164,28 +166,28 @@ require_paths:
164
166
  - lib
165
167
  required_ruby_version: !ruby/object:Gem::Requirement
166
168
  requirements:
167
- - - '>='
169
+ - - ">="
168
170
  - !ruby/object:Gem::Version
169
171
  version: 1.9.3
170
172
  required_rubygems_version: !ruby/object:Gem::Requirement
171
173
  requirements:
172
- - - '>='
174
+ - - ">="
173
175
  - !ruby/object:Gem::Version
174
176
  version: '0'
175
177
  requirements: []
176
178
  rubyforge_project:
177
- rubygems_version: 2.0.3
179
+ rubygems_version: 2.4.5
178
180
  signing_key:
179
181
  specification_version: 4
180
182
  summary: Extends gettext_i18n_rails making your .po files available to client side
181
183
  javascript as JSON
182
184
  test_files:
183
- - spec/spec_helper.rb
184
185
  - spec/fixtures/example.coffee
185
- - spec/fixtures/example.js
186
186
  - spec/fixtures/example.handlebars
187
- - spec/support/with_file.rb
188
- - spec/gettext_i18n_rails_js_spec.rb
187
+ - spec/fixtures/example.js
189
188
  - spec/gettext_i18n_rails_js/parser/handlebars_spec.rb
190
189
  - spec/gettext_i18n_rails_js/parser/javascript_spec.rb
190
+ - spec/gettext_i18n_rails_js_spec.rb
191
+ - spec/spec_helper.rb
192
+ - spec/support/with_file.rb
191
193
  has_rdoc: