erbal 1.2.rc2 → 1.2.rc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -15,10 +15,14 @@ Erbal is a lightweight ERB parser that uses the Ragel State Machine Compiler (ht
15
15
  Erbal.new takes an optional 2nd argument which is a hash of options, available options are:
16
16
 
17
17
  * <b>:buffer</b> - The name of the output buffer. Default is '@output_buffer'.
18
+
18
19
  * <b>:buffer_initial_value</b> - The initial value of the output buffer. Default is a blank string.
19
- * <b>:safe_concat_method</b> - The method to call on the buffer when concatenating a string which doesn't need escaping, i.e text outside of ERB tags uses the safe concatenation method. Default is 'concat'.
20
+
20
21
  * <b>:unsafe_concat_method</b> - The method to call on the buffer when concatenating a string which DOES need escaping, i.e <%= some_method %> will result in the use of unsafe_concat_method. Default is 'concat'.
21
- * <b>:safe_concat_method</b> - Normally the '<%=' tag uses the unsafe_concat_method, with this option you can specify a keyword to signify that safe_concat_method should be used instead. For example if safe_concat_method is set to 'raw' then <%= raw some_method %> will result in a concatenation using the safe_concat_method. Default is blank, i.e no keyword is specified.
22
+
23
+ * <b>:safe_concat_method</b> - The method to call on the buffer when concatenating a string which doesn't need escaping, i.e text outside of ERB tags (your raw HTML) uses the safe concatenation method. Default is 'concat'.
24
+
25
+ * <b>:safe_concat_keyword</b> - By default the '<%=' tag uses the unsafe_concat_method, with this option you can specify a keyword to signify that the safe_concat_method should be used instead. For example if safe_concat_method is set to 'raw' then <%= raw some_method %> will result in a concatenation using the safe_concat_method. Be mindful that even thought the 'raw' keyword looks like a method call, it isn't. Erbal expects that the key is followed by one or more spaces, so a tag like '<%= raw(some_method) %>' will not be recognised by Erbal. Whitespace before the keyword is optional, so '<%=raw' is valid. The keyword can either be one or more a-z characters, or a single of the following: ! @ $ * = ^ & +. For example, given :safe_concat_keyword => '!' then the following is valid: '<%=! some_method %>'. Default is blank, i.e no keyword is specified.
22
26
 
23
27
  <b>NOTE: Erbal itself does NOT perform escaping, it is the responsibility of your unsafe_concat_method to escape the string passed to it.</b>
24
28
 
@@ -28,6 +32,27 @@ Create the file 'config/initializers/erbal.rb' containing:
28
32
 
29
33
  require 'erbal/rails'
30
34
 
35
+ === Rails 2.3 + rails_xss (https://github.com/rails/rails_xss)
36
+
37
+ If you're using the rails_xss plugin, use this in your initialiser instead:
38
+
39
+ require 'erbal'
40
+
41
+ class ErbalTemplateHandler < ActionView::TemplateHandler
42
+ include ActionView::TemplateHandlers::Compilable
43
+ def compile(template)
44
+ ::Erbal.new("<% __in_erb_template=true %>#{template.source}",
45
+ {:buffer => '@output_buffer',
46
+ :buffer_initial_value => 'ActiveSupport::SafeBuffer.new',
47
+ :safe_concat_method => 'safe_concat',
48
+ :unsafe_concat_method => 'concat',
49
+ :safe_concat_keyword => 'raw'}
50
+ ).parse
51
+ end
52
+ end
53
+
54
+ ActionView::Template.register_template_handler :erb, ErbalTemplateHandler
55
+
31
56
  == Rails 3
32
57
 
33
58
  I've not looked into yet.. patches are welcome! ;)
@@ -43,37 +68,37 @@ Erubis: 2.6.6
43
68
  Erbal: 1.1
44
69
 
45
70
  => Parsing Benchmark
46
-
71
+
47
72
  => Erb
48
73
  0.851 0.853 0.848 0.847 0.849 0.847
49
74
  => Average: 0.849
50
-
75
+
51
76
  => Erubis (using FastEruby engine)
52
77
  0.442 0.442 0.444 0.442 0.441 0.442
53
78
  => Average: 0.442
54
-
79
+
55
80
  => Erubis (using default Eruby engine)
56
81
  0.451 0.424 0.446 0.425 0.445 0.446
57
82
  => Average: 0.439
58
-
83
+
59
84
  => Erbal
60
85
  0.036 0.039 0.066 0.038 0.067 0.039
61
86
  => Average: 0.047
62
-
87
+
63
88
  => eval() Benchmark
64
-
89
+
65
90
  => Erb
66
91
  0.203 0.192 0.180 0.180 0.179 0.191
67
92
  => Average: 0.187
68
-
93
+
69
94
  => Erubis (using FastEruby engine)
70
95
  0.129 0.127 0.128 0.128 0.114 0.128
71
96
  => Average: 0.125
72
-
97
+
73
98
  => Erubis (using default Eruby engine)
74
99
  0.178 0.176 0.165 0.176 0.175 0.164
75
100
  => Average: 0.172
76
-
101
+
77
102
  => Erbal
78
103
  0.111 0.125 0.124 0.110 0.133 0.124
79
104
  => Average: 0.121
@@ -89,6 +114,6 @@ Erbal: 1.1
89
114
 
90
115
  Many thanks to Adrian Thurston for writing the Ragel State Machine Compiler (http://www.complang.org/ragel/)!
91
116
 
92
- == Copyright
117
+ == Copyrigh
93
118
 
94
- Copyright (c) 2010 Envato & Ian Leitch. See LICENSE for details.
119
+ Copyright (c) 2010-2011 Envato & Ian Leitch. See LICENSE for details.
data/ext/erbal/erbal.c CHANGED
@@ -7,11 +7,21 @@ void rb_erbal_free(erbal_parser *parser) {
7
7
  free(parser->state);
8
8
  free(parser);
9
9
  }
10
+ void rb_erbal_mark(erbal_parser *parser) {
11
+ rb_gc_mark_maybe(parser->str);
12
+ rb_gc_mark_maybe(parser->src);
13
+ rb_gc_mark_maybe(parser->buffer_name);
14
+ rb_gc_mark_maybe(parser->options);
15
+ rb_gc_mark_maybe(parser->safe_concat_method);
16
+ rb_gc_mark_maybe(parser->unsafe_concat_method);
17
+ rb_gc_mark_maybe(parser->keyword);
18
+ rb_gc_mark_maybe(parser->safe_concat_keyword);
19
+ }
10
20
 
11
21
  VALUE rb_erbal_alloc(VALUE klass) {
12
22
  erbal_parser *parser = ALLOC(erbal_parser);
13
23
  parser->state = ALLOC(parser_state);
14
- VALUE obj = Data_Wrap_Struct(klass, 0, rb_erbal_free, parser);
24
+ VALUE obj = Data_Wrap_Struct(klass, rb_erbal_mark, rb_erbal_free, parser);
15
25
  return obj;
16
26
  }
17
27
 
@@ -24,10 +34,6 @@ void rb_erbal_setup_option(VALUE self, erbal_parser* parser, VALUE* parser_optio
24
34
  } else {
25
35
  *(parser_option) = rb_str_new2(default_value);
26
36
  }
27
-
28
- VALUE ivar = rb_str_new2("@");
29
- ivar = rb_str_cat2(ivar, key);
30
- rb_iv_set(self, RSTRING(ivar)->ptr, *(parser_option));
31
37
  }
32
38
 
33
39
  VALUE rb_erbal_initialize(int argc, VALUE *argv, VALUE self) {
@@ -48,8 +54,6 @@ VALUE rb_erbal_initialize(int argc, VALUE *argv, VALUE self) {
48
54
  parser->options = options;
49
55
  }
50
56
 
51
- rb_iv_set(self, "@options", parser->options);
52
-
53
57
  if (rb_hash_aref(parser->options, ID2SYM(rb_intern("debug"))) == Qtrue) {
54
58
  parser->debug = 1;
55
59
  } else {
data/ext/erbal/parser.c CHANGED
@@ -9,11 +9,11 @@
9
9
 
10
10
 
11
11
  #line 12 "parser.c"
12
- static const int erbal_parser_start = 3;
13
- static const int erbal_parser_first_final = 3;
12
+ static const int erbal_parser_start = 4;
13
+ static const int erbal_parser_first_final = 4;
14
14
  static const int erbal_parser_error = -1;
15
15
 
16
- static const int erbal_parser_en_main = 3;
16
+ static const int erbal_parser_en_main = 4;
17
17
 
18
18
 
19
19
  #line 34 "parser.rl"
@@ -227,8 +227,6 @@ void erbal_parser_init(VALUE self, erbal_parser *parser) {
227
227
 
228
228
  parser->src = rb_str_dup(parser->buffer_name);
229
229
 
230
- rb_iv_set(self, "@src", parser->src);
231
-
232
230
  VALUE buffer_init_val = rb_hash_aref(parser->options, ID2SYM(rb_intern("buffer_initial_value")));
233
231
 
234
232
  if (!NIL_P(buffer_init_val)) {
@@ -241,7 +239,7 @@ void erbal_parser_init(VALUE self, erbal_parser *parser) {
241
239
  }
242
240
 
243
241
 
244
- #line 245 "parser.c"
242
+ #line 243 "parser.c"
245
243
  {
246
244
  cs = erbal_parser_start;
247
245
  ts = 0;
@@ -249,14 +247,14 @@ void erbal_parser_init(VALUE self, erbal_parser *parser) {
249
247
  act = 0;
250
248
  }
251
249
 
252
- #line 258 "parser.rl"
250
+ #line 256 "parser.rl"
253
251
  }
254
252
 
255
253
  void erbal_parser_exec(erbal_parser *parser) {
256
254
  p = RSTRING(parser->str)->ptr;
257
255
  pe = p + strlen(p);
258
256
 
259
- #line 260 "parser.c"
257
+ #line 258 "parser.c"
260
258
  {
261
259
  if ( p == pe )
262
260
  goto _test_eof;
@@ -265,83 +263,83 @@ void erbal_parser_exec(erbal_parser *parser) {
265
263
  tr0:
266
264
  #line 23 "parser.rl"
267
265
  {{p = ((te))-1;}{ erbal_parser_non_tag(parser); }}
268
- goto st3;
266
+ goto st4;
269
267
  tr1:
270
268
  #line 21 "parser.rl"
271
269
  {te = p+1;{ erbal_parser_tag_close_with_trim(parser); }}
272
- goto st3;
270
+ goto st4;
273
271
  tr2:
274
272
  #line 20 "parser.rl"
275
273
  {{p = ((te))-1;}{ erbal_parser_tag_open_for_unsafe_concat(parser); }}
276
- goto st3;
277
- tr7:
274
+ goto st4;
275
+ tr8:
278
276
  #line 23 "parser.rl"
279
277
  {te = p+1;{ erbal_parser_non_tag(parser); }}
280
- goto st3;
281
- tr11:
278
+ goto st4;
279
+ tr12:
282
280
  #line 23 "parser.rl"
283
281
  {te = p;p--;{ erbal_parser_non_tag(parser); }}
284
- goto st3;
285
- tr12:
282
+ goto st4;
283
+ tr13:
286
284
  #line 22 "parser.rl"
287
285
  {te = p+1;{ erbal_parser_tag_close(parser); }}
288
- goto st3;
289
- tr15:
286
+ goto st4;
287
+ tr16:
290
288
  #line 17 "parser.rl"
291
289
  {te = p;p--;{ erbal_parser_tag_open(parser); }}
292
- goto st3;
293
- tr16:
290
+ goto st4;
291
+ tr17:
294
292
  #line 19 "parser.rl"
295
293
  {te = p+1;{ erbal_parser_tag_open_for_comment(parser); }}
296
- goto st3;
297
- tr17:
294
+ goto st4;
295
+ tr18:
298
296
  #line 18 "parser.rl"
299
297
  {te = p+1;{ erbal_parser_tag_open_with_dash(parser); }}
300
- goto st3;
301
- tr19:
298
+ goto st4;
299
+ tr20:
302
300
  #line 20 "parser.rl"
303
301
  {te = p;p--;{ erbal_parser_tag_open_for_unsafe_concat(parser); }}
304
- goto st3;
305
- tr22:
302
+ goto st4;
303
+ tr24:
306
304
  #line 9 "parser.rl"
307
305
  { parser->keyword_trailing_whitespace = p; }
308
306
  #line 29 "parser.rl"
309
307
  {te = p;p--;{ erbal_parser_tag_open_choose_concat(parser); }}
310
- goto st3;
311
- st3:
308
+ goto st4;
309
+ st4:
312
310
  #line 1 "NONE"
313
311
  {ts = 0;}
314
312
  if ( ++p == pe )
315
- goto _test_eof3;
316
- case 3:
313
+ goto _test_eof4;
314
+ case 4:
317
315
  #line 1 "NONE"
318
316
  {ts = p;}
319
- #line 320 "parser.c"
317
+ #line 318 "parser.c"
320
318
  switch( (*p) ) {
321
- case 37: goto st4;
322
- case 45: goto tr9;
323
- case 60: goto st6;
319
+ case 37: goto st5;
320
+ case 45: goto tr10;
321
+ case 60: goto st7;
324
322
  }
325
- goto tr7;
326
- st4:
323
+ goto tr8;
324
+ st5:
327
325
  if ( ++p == pe )
328
- goto _test_eof4;
329
- case 4:
326
+ goto _test_eof5;
327
+ case 5:
330
328
  if ( (*p) == 62 )
331
- goto tr12;
332
- goto tr11;
333
- tr9:
329
+ goto tr13;
330
+ goto tr12;
331
+ tr10:
334
332
  #line 1 "NONE"
335
333
  {te = p+1;}
336
- goto st5;
337
- st5:
334
+ goto st6;
335
+ st6:
338
336
  if ( ++p == pe )
339
- goto _test_eof5;
340
- case 5:
341
- #line 342 "parser.c"
337
+ goto _test_eof6;
338
+ case 6:
339
+ #line 340 "parser.c"
342
340
  if ( (*p) == 37 )
343
341
  goto st0;
344
- goto tr11;
342
+ goto tr12;
345
343
  st0:
346
344
  if ( ++p == pe )
347
345
  goto _test_eof0;
@@ -349,38 +347,48 @@ case 0:
349
347
  if ( (*p) == 62 )
350
348
  goto tr1;
351
349
  goto tr0;
352
- st6:
353
- if ( ++p == pe )
354
- goto _test_eof6;
355
- case 6:
356
- if ( (*p) == 37 )
357
- goto st7;
358
- goto tr11;
359
350
  st7:
360
351
  if ( ++p == pe )
361
352
  goto _test_eof7;
362
353
  case 7:
354
+ if ( (*p) == 37 )
355
+ goto st8;
356
+ goto tr12;
357
+ st8:
358
+ if ( ++p == pe )
359
+ goto _test_eof8;
360
+ case 8:
363
361
  switch( (*p) ) {
364
- case 35: goto tr16;
365
- case 45: goto tr17;
366
- case 61: goto tr18;
362
+ case 35: goto tr17;
363
+ case 45: goto tr18;
364
+ case 61: goto tr19;
367
365
  }
368
- goto tr15;
369
- tr18:
366
+ goto tr16;
367
+ tr19:
370
368
  #line 1 "NONE"
371
369
  {te = p+1;}
372
- goto st8;
373
- st8:
370
+ goto st9;
371
+ st9:
374
372
  if ( ++p == pe )
375
- goto _test_eof8;
376
- case 8:
377
- #line 378 "parser.c"
378
- if ( (*p) == 32 )
379
- goto tr20;
380
- if ( 97 <= (*p) && (*p) <= 122 )
381
- goto tr21;
382
- goto tr19;
383
- tr20:
373
+ goto _test_eof9;
374
+ case 9:
375
+ #line 376 "parser.c"
376
+ switch( (*p) ) {
377
+ case 32: goto tr21;
378
+ case 33: goto tr22;
379
+ case 36: goto tr22;
380
+ case 38: goto tr22;
381
+ case 61: goto tr22;
382
+ case 64: goto tr22;
383
+ case 94: goto tr22;
384
+ }
385
+ if ( (*p) > 43 ) {
386
+ if ( 97 <= (*p) && (*p) <= 122 )
387
+ goto tr23;
388
+ } else if ( (*p) >= 42 )
389
+ goto tr22;
390
+ goto tr20;
391
+ tr21:
384
392
  #line 8 "parser.rl"
385
393
  { parser->keyword_preceding_whitespace = p; }
386
394
  goto st1;
@@ -388,17 +396,27 @@ st1:
388
396
  if ( ++p == pe )
389
397
  goto _test_eof1;
390
398
  case 1:
391
- #line 392 "parser.c"
392
- if ( (*p) == 32 )
393
- goto st1;
394
- if ( 97 <= (*p) && (*p) <= 122 )
399
+ #line 400 "parser.c"
400
+ switch( (*p) ) {
401
+ case 32: goto st1;
402
+ case 33: goto tr4;
403
+ case 36: goto tr4;
404
+ case 38: goto tr4;
405
+ case 61: goto tr4;
406
+ case 64: goto tr4;
407
+ case 94: goto tr4;
408
+ }
409
+ if ( (*p) > 43 ) {
410
+ if ( 97 <= (*p) && (*p) <= 122 )
411
+ goto tr5;
412
+ } else if ( (*p) >= 42 )
395
413
  goto tr4;
396
414
  goto tr2;
397
415
  tr4:
398
416
  #line 7 "parser.rl"
399
417
  { parser->keyword_start = p; }
400
418
  goto st2;
401
- tr21:
419
+ tr22:
402
420
  #line 8 "parser.rl"
403
421
  { parser->keyword_preceding_whitespace = p; }
404
422
  #line 7 "parser.rl"
@@ -408,57 +426,77 @@ st2:
408
426
  if ( ++p == pe )
409
427
  goto _test_eof2;
410
428
  case 2:
411
- #line 412 "parser.c"
429
+ #line 430 "parser.c"
412
430
  if ( (*p) == 32 )
413
- goto tr5;
414
- if ( 97 <= (*p) && (*p) <= 122 )
415
- goto st2;
431
+ goto tr6;
416
432
  goto tr2;
417
- tr5:
433
+ tr6:
418
434
  #line 11 "parser.rl"
419
435
  {
420
436
  parser->keyword_end = p;
421
437
  parser->keyword = rb_str_new(parser->keyword_start, (p - parser->keyword_start));
422
438
  }
423
- goto st9;
424
- st9:
439
+ goto st10;
440
+ st10:
425
441
  if ( ++p == pe )
426
- goto _test_eof9;
427
- case 9:
428
- #line 429 "parser.c"
442
+ goto _test_eof10;
443
+ case 10:
444
+ #line 445 "parser.c"
445
+ if ( (*p) == 32 )
446
+ goto st10;
447
+ goto tr24;
448
+ tr5:
449
+ #line 7 "parser.rl"
450
+ { parser->keyword_start = p; }
451
+ goto st3;
452
+ tr23:
453
+ #line 8 "parser.rl"
454
+ { parser->keyword_preceding_whitespace = p; }
455
+ #line 7 "parser.rl"
456
+ { parser->keyword_start = p; }
457
+ goto st3;
458
+ st3:
459
+ if ( ++p == pe )
460
+ goto _test_eof3;
461
+ case 3:
462
+ #line 463 "parser.c"
429
463
  if ( (*p) == 32 )
430
- goto st9;
431
- goto tr22;
464
+ goto tr6;
465
+ if ( 97 <= (*p) && (*p) <= 122 )
466
+ goto st3;
467
+ goto tr2;
432
468
  }
433
- _test_eof3: cs = 3; goto _test_eof;
434
469
  _test_eof4: cs = 4; goto _test_eof;
435
470
  _test_eof5: cs = 5; goto _test_eof;
436
- _test_eof0: cs = 0; goto _test_eof;
437
471
  _test_eof6: cs = 6; goto _test_eof;
472
+ _test_eof0: cs = 0; goto _test_eof;
438
473
  _test_eof7: cs = 7; goto _test_eof;
439
474
  _test_eof8: cs = 8; goto _test_eof;
475
+ _test_eof9: cs = 9; goto _test_eof;
440
476
  _test_eof1: cs = 1; goto _test_eof;
441
477
  _test_eof2: cs = 2; goto _test_eof;
442
- _test_eof9: cs = 9; goto _test_eof;
478
+ _test_eof10: cs = 10; goto _test_eof;
479
+ _test_eof3: cs = 3; goto _test_eof;
443
480
 
444
481
  _test_eof: {}
445
482
  if ( p == eof )
446
483
  {
447
484
  switch ( cs ) {
448
- case 4: goto tr11;
449
- case 5: goto tr11;
485
+ case 5: goto tr12;
486
+ case 6: goto tr12;
450
487
  case 0: goto tr0;
451
- case 6: goto tr11;
452
- case 7: goto tr15;
453
- case 8: goto tr19;
488
+ case 7: goto tr12;
489
+ case 8: goto tr16;
490
+ case 9: goto tr20;
454
491
  case 1: goto tr2;
455
492
  case 2: goto tr2;
456
- case 9: goto tr22;
493
+ case 10: goto tr24;
494
+ case 3: goto tr2;
457
495
  }
458
496
  }
459
497
 
460
498
  }
461
499
 
462
- #line 264 "parser.rl"
500
+ #line 262 "parser.rl"
463
501
  erbal_parser_finish(parser);
464
502
  }
data/ext/erbal/parser.rl CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  '<%=' (
26
26
  [ ]* >keyword_preceding_whitespace
27
- [a-z]+ >keyword_start %keyword_end
27
+ ([a-z]+|[!@$*=^&+]{1,1}) >keyword_start %keyword_end
28
28
  [ ]+ %keyword_trailing_whitespace
29
29
  ) => { erbal_parser_tag_open_choose_concat(parser); };
30
30
  *|;
@@ -241,8 +241,6 @@ void erbal_parser_init(VALUE self, erbal_parser *parser) {
241
241
 
242
242
  parser->src = rb_str_dup(parser->buffer_name);
243
243
 
244
- rb_iv_set(self, "@src", parser->src);
245
-
246
244
  VALUE buffer_init_val = rb_hash_aref(parser->options, ID2SYM(rb_intern("buffer_initial_value")));
247
245
 
248
246
  if (!NIL_P(buffer_init_val)) {
data/lib/erbal/rails.rb CHANGED
@@ -1,12 +1,12 @@
1
+ require 'action_pack'
1
2
  require 'erbal'
2
3
 
3
4
  class Erbal
4
5
  module Rails
5
- class Rails_2_3_10_TemplateHandler < ActionView::TemplateHandler
6
+ class Rails_2_3_TemplateHandler < ActionView::TemplateHandler
6
7
  include ActionView::TemplateHandlers::Compilable
7
8
  def compile(template)
8
- ::Erbal.new("<% __in_erb_template=true %>#{template.source}", {:buffer => '@output_buffer', :buffer_initial_value => 'ActiveSupport::SafeBuffer.new',
9
- :safe_concat_method => 'safe_concat', :unsafe_concat_method => 'concat', :safe_concat_keyword => 'raw'}).parse
9
+ ::Erbal.new("<% __in_erb_template=true %>#{template.source}", {:buffer => '@output_buffer'}).parse
10
10
  end
11
11
  end
12
12
 
@@ -14,12 +14,9 @@ class Erbal
14
14
  raise "Sorry, this version of Erbal doesn't support Rails #{ActionPack::VERSION::MAJOR}.#{ActionPack::VERSION::MINOR}.#{ActionPack::VERSION::TINY}."
15
15
  end
16
16
 
17
- def self.register_template_handler(handler_class)
18
- ActionView::Template.register_template_handler :erb, handler_class
19
- end
20
-
21
- def self.register_template_handler_for_2_3_10
22
- register_template_handler(Rails_2_3_10_TemplateHandler)
17
+ def self.register_template_handler_for_2_3
18
+ ActionView::Template.register_template_handler :erb, Rails_2_3_TemplateHandler
19
+ ActionView::Template.register_template_handler :rhtml, Rails_2_3_TemplateHandler
23
20
  end
24
21
  end
25
22
  end
@@ -28,15 +25,10 @@ case ActionPack::VERSION::MAJOR
28
25
  when 2
29
26
  case ActionPack::VERSION::MINOR
30
27
  when 3
31
- case ActionPack::VERSION::TINY
32
- when 10
33
- Erbal::Rails.register_template_handler_for_2_3_10
34
- else
35
- Erbal::Rails.version_unsupported
36
- end
28
+ Erbal::Rails.register_template_handler_for_2_3
37
29
  else
38
30
  Erbal::Rails.version_unsupported
39
31
  end
40
32
  else
41
33
  Erbal::Rails.version_unsupported
42
- end
34
+ end
data/spec/erbal_spec.rb CHANGED
@@ -144,6 +144,25 @@ describe Erbal do
144
144
  erbal_parse("1 + 1 is <%= raw 1 + 1 %>", :unsafe_concat_method => 'unsafe_concat', :safe_concat_keyword => nil).should == "@output_buffer = '';@output_buffer.concat(%Q`1 + 1 is `);@output_buffer.unsafe_concat(%Q`\#{ raw 1 + 1 }`);@output_buffer"
145
145
  end
146
146
 
147
+ it "should allow a non a-z character as the safe_concat_keyword" do
148
+ erbal_parse("<%=! 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '!').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
149
+ erbal_parse("<%=@ 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '@').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
150
+ erbal_parse("<%=$ 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '$').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
151
+ erbal_parse("<%=* 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '*').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
152
+ erbal_parse("<%== 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '=').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
153
+ erbal_parse("<%=^ 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '^').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
154
+ erbal_parse("<%=& 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '&').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
155
+ erbal_parse("<%=+ 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => '+').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
156
+ end
157
+
158
+ it "should not allow more than a single non a-z character as the safe_concat_keyword" do
159
+ erbal_parse("<%=!= 1 + 1 %>", :unsafe_concat_method => 'unsafe_concat', :safe_concat_keyword => '!=').should == "@output_buffer = '';@output_buffer.unsafe_concat(%Q`\#{!= 1 + 1 }`);@output_buffer"
160
+ end
161
+
162
+ it "should not allow a mix of a-z and non a-z characters as the safe_concat_keyword" do
163
+ erbal_parse("<%=!raw 1 + 1 %>", :unsafe_concat_method => 'unsafe_concat', :safe_concat_keyword => '!raw').should == "@output_buffer = '';@output_buffer.unsafe_concat(%Q`\#{!raw 1 + 1 }`);@output_buffer"
164
+ end
165
+
147
166
  it "should preserve the whitespace following the safe_concat_keyword" do
148
167
  erbal_parse("<%= raw 1 + 1 %>", :safe_concat_method => 'safe_concat', :safe_concat_keyword => 'raw').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`\#{ 1 + 1 }`);@output_buffer"
149
168
  end
@@ -160,6 +179,10 @@ describe Erbal do
160
179
  erbal_parse("omglololo <%=blah 1 + 1 %>", :unsafe_concat_method => 'unsafe_concat').should == "@output_buffer = '';@output_buffer.concat(%Q`omglololo `);@output_buffer.unsafe_concat(%Q`\#{blah 1 + 1 }`);@output_buffer"
161
180
  end
162
181
 
182
+ it "should not use the safe concat method if the it is used as a helper method call" do
183
+ erbal_parse("<%= raw(1 + 1) %>", :unsafe_concat_method => 'unsafe_concat', :safe_concat_keyword => 'raw').should == "@output_buffer = '';@output_buffer.unsafe_concat(%Q`\#{ raw(1 + 1) }`);@output_buffer"
184
+ end
185
+
163
186
  it "should end the current safe concat and begin a new unsafe concat" do
164
187
  erbal_parse("hello <%= \"world\" %>", :unsafe_concat_method => 'unsafe_concat', :safe_concat_method => 'safe_concat').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`hello `);@output_buffer.unsafe_concat(%Q`\#{ \"world\" }`);@output_buffer"
165
188
  end
@@ -188,6 +211,10 @@ describe Erbal do
188
211
  it "should use interpolation if we switch from an unsafe concat to a safe concat and then back again" do
189
212
  erbal_parse("omg <%= \"hello\" %> world", :unsafe_concat_method => 'concat', :safe_concat_method => 'concat').should == "@output_buffer = '';@output_buffer.concat(%Q`omg \#{ \"hello\" } world`);@output_buffer"
190
213
  end
214
+
215
+ it "should not use interpolation if the unsafe and safe concat methods are not the same" do
216
+ erbal_parse("omg <%= raw \"hello\" %> world", :unsafe_concat_method => 'concat', :safe_concat_method => 'safe_concat').should == "@output_buffer = '';@output_buffer.safe_concat(%Q`omg `);@output_buffer.concat(%Q`\#{ raw \"hello\" }`);@output_buffer.safe_concat(%Q` world`);@output_buffer"
217
+ end
191
218
  end
192
219
  end
193
220
  end
data/tasks/gem.rake CHANGED
@@ -2,7 +2,7 @@ require 'rake/gempackagetask'
2
2
  require 'yaml'
3
3
 
4
4
  WIN_SUFFIX = ENV['WIN_SUFFIX'] || 'i386-mswin32'
5
- ERBAL_VERSION = '1.2.rc2'
5
+ ERBAL_VERSION = '1.2.rc3'
6
6
 
7
7
  task :clean => :clobber_package
8
8
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erbal
3
3
  version: !ruby/object:Gem::Version
4
- hash: 977940511
4
+ hash: 977940508
5
5
  prerelease: true
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - rc2
10
- version: 1.2.rc2
9
+ - rc3
10
+ version: 1.2.rc3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ian Leitch
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-05 00:00:00 +11:00
18
+ date: 2011-01-08 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies: []
21
21