baby_erubis 1.0.0 → 2.0.0
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.
- checksums.yaml +7 -0
- data/README.md +58 -2
- data/Rakefile +1 -1
- data/baby_erubis.gemspec +5 -3
- data/bin/baby_erubis +10 -8
- data/lib/baby_erubis.rb +59 -31
- data/lib/baby_erubis/rails.rb +53 -0
- data/test/context_test.rb +1 -1
- data/test/rails_test.rb +106 -0
- data/test/run_all.rb +2 -2
- data/test/script_test.rb +54 -16
- data/test/template_test.rb +62 -6
- metadata +13 -18
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 86a6cc722ec2c51e207330c70c8202f7f6108b07
|
4
|
+
data.tar.gz: 9f0062ca834b2954323f772dc65e9cb4d8ba5055
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8f716b9a9866e7d4d9787208f5323cdf58e1c1c22d79ed1a605f4fc4b10f2ae98b3eb6d5a30c5125061497fa91448d2cfd51dd9ac5c9f7e2a960506c24efbc42
|
7
|
+
data.tar.gz: 2f2753b15878d8ae7dad9eaf3673e972ce970ec04aa1f1c4769c983fbe26ea2f4b354708eebbbb8cd29660d1180fa57906630b8d14016f610718246c65f2f29d
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
BabyErubis.rb
|
2
2
|
=============
|
3
3
|
|
4
|
-
$Release:
|
4
|
+
$Release: 2.0.0 $
|
5
5
|
|
6
6
|
BabyErubis is an yet another eRuby implementation, based on Erubis.
|
7
7
|
|
@@ -9,6 +9,7 @@ BabyErubis is an yet another eRuby implementation, based on Erubis.
|
|
9
9
|
* Easy to customize
|
10
10
|
* Supports HTML as well as plain text
|
11
11
|
* Accepts both template file and template string
|
12
|
+
* Supports Ruby on Rails template
|
12
13
|
|
13
14
|
BabyErubis supports Ruby >= 1.8 and Rubinius >= 2.0.
|
14
15
|
|
@@ -77,6 +78,19 @@ Expression in `<%= ... %>` is escaped according to template class.
|
|
77
78
|
(Experimental) `<%- ... -%>` and `<%-= ... -%>` are handled same as
|
78
79
|
`<% ... %>` and `<%= ... %>` respectively.
|
79
80
|
|
81
|
+
(Experimental) Block argument expression supported since version 2.0.
|
82
|
+
Example:
|
83
|
+
|
84
|
+
## template
|
85
|
+
<%== form_for(:article) do |f| %>
|
86
|
+
...
|
87
|
+
<% end %>
|
88
|
+
|
89
|
+
## compiled ruby code
|
90
|
+
_buf << form_for(:article) do |f| _buf << '
|
91
|
+
...
|
92
|
+
'; end;
|
93
|
+
|
80
94
|
|
81
95
|
|
82
96
|
Advanced Topics
|
@@ -151,6 +165,40 @@ And you can control whether to use freeze() or not.
|
|
151
165
|
# '.freeze; _buf.to_s
|
152
166
|
|
153
167
|
|
168
|
+
Ruby on Rails Template
|
169
|
+
----------------------
|
170
|
+
|
171
|
+
`BabyErubis::RailsTemplate` class generates Rails-style ruby code.
|
172
|
+
|
173
|
+
require 'baby_erubis'
|
174
|
+
require 'baby_erubis/rails'
|
175
|
+
|
176
|
+
t = BabyErubis::RailsTemplate.new.from_str <<'END'
|
177
|
+
<div>
|
178
|
+
<%= form_for :article do |f| %>
|
179
|
+
...
|
180
|
+
<% end %>
|
181
|
+
</div>
|
182
|
+
END
|
183
|
+
print t.src
|
184
|
+
|
185
|
+
Result:
|
186
|
+
|
187
|
+
@output_buffer = output_buffer || ActionView::OutputBuffer.new;@output_buffer.safe_append='<div>
|
188
|
+
';@output_buffer.append= form_for :article do |f| ;@output_buffer.safe_append='
|
189
|
+
...
|
190
|
+
'.freeze; end;
|
191
|
+
@output_buffer.safe_append='</div>
|
192
|
+
';@output_buffer.to_s
|
193
|
+
|
194
|
+
You can check syntax of Rails template in command-line:
|
195
|
+
|
196
|
+
$ baby_erubis -Rx app/views/articles/index.html.erb | ruby -wc
|
197
|
+
|
198
|
+
|
199
|
+
(TODO: How to use BabyErubis in Ruby on Rails instead of Erubis)
|
200
|
+
|
201
|
+
|
154
202
|
|
155
203
|
Customizing
|
156
204
|
===========
|
@@ -313,7 +361,7 @@ Sample code:
|
|
313
361
|
Todo
|
314
362
|
====
|
315
363
|
|
316
|
-
* Support Rails syntax (= `<%= form_for do |f| %>`)
|
364
|
+
* [Done] Support Rails syntax (= `<%= form_for do |f| %>`)
|
317
365
|
|
318
366
|
|
319
367
|
|
@@ -321,6 +369,14 @@ Changes
|
|
321
369
|
=======
|
322
370
|
|
323
371
|
|
372
|
+
Release 2.0.0 (2014-12-09)
|
373
|
+
--------------------------
|
374
|
+
|
375
|
+
* [enhance] Ruby on Rails template support
|
376
|
+
* [enhance] Block argument expression support
|
377
|
+
* [enhance] New command-line option '-R' and '--format=rails'
|
378
|
+
|
379
|
+
|
324
380
|
Release 1.0.0 (2014-05-17)
|
325
381
|
--------------------------
|
326
382
|
|
data/Rakefile
CHANGED
data/baby_erubis.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
###
|
4
|
-
### $Release:
|
4
|
+
### $Release: 2.0.0 $
|
5
5
|
### $License: MIT License $
|
6
6
|
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
7
7
|
###
|
@@ -13,7 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.name = "baby_erubis"
|
14
14
|
s.author = "makoto kuwata"
|
15
15
|
s.email = "kwa(at)kuwata-lab.com"
|
16
|
-
s.version = "$Release:
|
16
|
+
s.version = "$Release: 2.0.0 $".split()[1]
|
17
|
+
s.license = "MIT License"
|
17
18
|
s.platform = Gem::Platform::RUBY
|
18
19
|
s.homepage = "https://github.com/kwatch/BabyErubis/tree/ruby"
|
19
20
|
s.summary = "yet another eRuby implementation based on Erubis"
|
@@ -30,7 +31,8 @@ END
|
|
30
31
|
|
31
32
|
## files
|
32
33
|
files = []
|
33
|
-
files
|
34
|
+
files << 'lib/baby_erubis.rb'
|
35
|
+
files << 'lib/baby_erubis/rails.rb'
|
34
36
|
files += Dir.glob('test/*.rb')
|
35
37
|
files += ['bin/baby_erubis']
|
36
38
|
files += %w[README.md MIT-LICENSE setup.rb baby_erubis.gemspec Rakefile]
|
data/bin/baby_erubis
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
|
4
4
|
###
|
5
|
-
### $Release:
|
5
|
+
### $Release: 2.0.0 $
|
6
6
|
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
7
7
|
### $License: MIT License $
|
8
8
|
###
|
@@ -245,10 +245,9 @@ module BabyErubis
|
|
245
245
|
|
246
246
|
module HideTextEnhander
|
247
247
|
|
248
|
-
def
|
249
|
-
|
248
|
+
def add_text(src, text)
|
249
|
+
src << text.to_s.gsub(/^.*\n/, "\n").gsub(/./, ' ')
|
250
250
|
end
|
251
|
-
alias _t build_text
|
252
251
|
|
253
252
|
end
|
254
253
|
|
@@ -284,7 +283,8 @@ class Main
|
|
284
283
|
return
|
285
284
|
end
|
286
285
|
#
|
287
|
-
|
286
|
+
format = options['format'] || (options['H'] && 'html') || (options['R'] && 'rails')
|
287
|
+
klass = handle_format(format)
|
288
288
|
if options['X']
|
289
289
|
klass = Class.new(klass)
|
290
290
|
klass.class_eval { include BabyErubis::HideTextEnhander }
|
@@ -330,8 +330,9 @@ class Main
|
|
330
330
|
parser.option("-c context : context string (yaml inline style or ruby code)")
|
331
331
|
parser.option("-f file : context data file (*.yaml, *.json, or *.rb)")
|
332
332
|
parser.option("-H : same as --format=html")
|
333
|
-
parser.option("
|
334
|
-
|
333
|
+
parser.option("-R : same as --format=rails")
|
334
|
+
parser.option(" --format=format : 'text', 'html' or 'rails' (default: text)")\
|
335
|
+
.validation {|arg| "'text', 'html' or 'rails' expected" if arg !~ /\A(text|html|rails)\z/ }
|
335
336
|
parser.option(" --encoding=name : encoding (default: utf-8)")
|
336
337
|
parser.option(" --freeze={true|false} : use String#freeze() or not")\
|
337
338
|
.validation {|arg| "'true' or 'false' expected" if arg !~ /\A(true|false)\z/ }
|
@@ -341,7 +342,7 @@ class Main
|
|
341
342
|
|
342
343
|
def build_help_message(parser)
|
343
344
|
s = "Usage: #{@cmdname} [..options..] [erubyfile]\n"
|
344
|
-
s << parser.help_message(
|
345
|
+
s << parser.help_message(28)
|
345
346
|
s << "\n"
|
346
347
|
s << <<"END"
|
347
348
|
Example:
|
@@ -365,6 +366,7 @@ END
|
|
365
366
|
when nil ; return BabyErubis::Text
|
366
367
|
when 'text'; return BabyErubis::Text
|
367
368
|
when 'html'; return BabyErubis::Html
|
369
|
+
when 'rails'; require 'baby_erubis/rails'; return BabyErubis::RailsTemplate
|
368
370
|
else
|
369
371
|
raise "** unreachable: format=#{format.inspect}"
|
370
372
|
end
|
data/lib/baby_erubis.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
###
|
4
|
-
### $Release:
|
4
|
+
### $Release: 2.0.0 $
|
5
5
|
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
6
6
|
### $License: MIT License $
|
7
7
|
###
|
@@ -25,7 +25,7 @@
|
|
25
25
|
|
26
26
|
module BabyErubis
|
27
27
|
|
28
|
-
RELEASE = '$Release:
|
28
|
+
RELEASE = '$Release: 2.0.0 $'.split(' ')[1]
|
29
29
|
|
30
30
|
|
31
31
|
class Template
|
@@ -54,8 +54,8 @@ module BabyErubis
|
|
54
54
|
|
55
55
|
attr_reader :src
|
56
56
|
|
57
|
-
#PATTERN = /(^[ \t]*)?<%(
|
58
|
-
PATTERN = /(^[ \t]*)?<%-?(
|
57
|
+
#PATTERN = /(^[ \t]*)?<%(\#)?(==?)?(.*?)%>([ \t]*\r?\n)?/m
|
58
|
+
PATTERN = /(^[ \t]*)?<%-?(\#)?(==?)? ?(.*?) ?-?%>([ \t]*\r?\n)?/m
|
59
59
|
|
60
60
|
def pattern
|
61
61
|
return self.class.const_get(:PATTERN)
|
@@ -68,32 +68,37 @@ module BabyErubis
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def parse(input)
|
71
|
-
src = "
|
71
|
+
src = ""
|
72
|
+
add_preamble(src) # preamble
|
73
|
+
spc = ""
|
72
74
|
pos = 0
|
73
|
-
input.scan(pattern()) do |lspace, ch, code, rspace|
|
75
|
+
input.scan(pattern()) do |lspace, sharp, ch, code, rspace|
|
74
76
|
match = Regexp.last_match
|
75
77
|
text = input[pos, match.begin(0) - pos]
|
76
78
|
pos = match.end(0)
|
77
|
-
|
78
|
-
|
79
|
-
if lspace && rspace
|
80
|
-
src
|
81
|
-
|
82
|
-
|
79
|
+
if sharp # comment
|
80
|
+
code = ("\n" * code.count("\n"))
|
81
|
+
if ! ch && lspace && rspace # trimmed statement
|
82
|
+
add_text(src, "#{spc}#{text}"); add_stmt(src, "#{code}#{rspace}")
|
83
|
+
rspace = ""
|
84
|
+
else # other statement or expression
|
85
|
+
add_text(src, "#{spc}#{text}#{lspace}"); add_stmt(src, code)
|
83
86
|
end
|
84
|
-
elsif ch == '=' # expression (escaping)
|
85
|
-
src << _t(lspace) << " _buf << #{escaped_expr(code)};" << _t(rspace)
|
86
|
-
elsif ch == '==' # expression (without escaping)
|
87
|
-
src << _t(lspace) << " _buf << (#{code}).to_s;" << _t(rspace)
|
88
|
-
elsif ch == '#' # comment
|
89
|
-
src << _t(lspace) << ("\n" * code.count("\n")) << _t(rspace)
|
90
87
|
else
|
91
|
-
|
88
|
+
if ch # expression
|
89
|
+
add_text(src, "#{spc}#{text}#{lspace}"); add_expr(src, code, ch)
|
90
|
+
elsif lspace && rspace # statement (trimming)
|
91
|
+
add_text(src, "#{spc}#{text}"); add_stmt(src, "#{lspace} #{code};#{rspace}")
|
92
|
+
rspace = ""
|
93
|
+
else # statement (without trimming)
|
94
|
+
add_text(src, "#{spc}#{text}#{lspace}"); add_stmt(src, " #{code};")
|
95
|
+
end
|
92
96
|
end
|
97
|
+
spc = rspace
|
93
98
|
end
|
94
99
|
text = pos == 0 ? input : input[pos..-1] # or $' || input
|
95
|
-
src
|
96
|
-
src
|
100
|
+
add_text(src, "#{spc}#{text}")
|
101
|
+
add_postamble(src) # postamble
|
97
102
|
return src
|
98
103
|
end
|
99
104
|
|
@@ -108,24 +113,47 @@ module BabyErubis
|
|
108
113
|
|
109
114
|
protected
|
110
115
|
|
111
|
-
def
|
112
|
-
|
116
|
+
def add_preamble(src)
|
117
|
+
src << "_buf = '';"
|
113
118
|
end
|
114
119
|
|
115
|
-
|
120
|
+
def add_postamble(src)
|
121
|
+
src << " _buf.to_s\n"
|
122
|
+
end
|
116
123
|
|
117
|
-
def
|
124
|
+
def add_text(src, text)
|
125
|
+
return if !text || text.empty?
|
118
126
|
freeze = @freeze ? '.freeze' : ''
|
119
|
-
|
120
|
-
|
127
|
+
text.gsub!(/['\\]/, '\\\\\&')
|
128
|
+
src << " _buf << '#{text}'#{freeze};"
|
129
|
+
end
|
130
|
+
|
131
|
+
def add_stmt(src, stmt)
|
132
|
+
return if !stmt || stmt.empty?
|
133
|
+
src << stmt
|
134
|
+
end
|
135
|
+
|
136
|
+
def add_expr(src, expr, indicator)
|
137
|
+
return if !expr || expr.empty?
|
138
|
+
if expr_has_block(expr)
|
139
|
+
src << " _buf << #{expr}"
|
140
|
+
elsif indicator == '=' # escaping
|
141
|
+
src << " _buf << #{escaped_expr(expr)};"
|
142
|
+
else # without escaping
|
143
|
+
src << " _buf << (#{expr}).to_s;"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def escaped_expr(code)
|
148
|
+
return "(#{code}).to_s"
|
121
149
|
end
|
122
|
-
alias _t build_text
|
123
150
|
|
124
|
-
def
|
125
|
-
return
|
126
|
-
#return text.gsub!(/[`\\]/, '\\\\\&') || text
|
151
|
+
def expr_has_block(expr)
|
152
|
+
return expr =~ /(\bdo|\{)\s*(\|[^|]*?\|\s*)?\z/
|
127
153
|
end
|
128
154
|
|
155
|
+
private
|
156
|
+
|
129
157
|
def empty_binding
|
130
158
|
return binding()
|
131
159
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
###
|
4
|
+
### $Release: 2.0.0 $
|
5
|
+
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
6
|
+
### $License: MIT License $
|
7
|
+
###
|
8
|
+
|
9
|
+
require 'baby_erubis'
|
10
|
+
|
11
|
+
|
12
|
+
module BabyErubis
|
13
|
+
|
14
|
+
|
15
|
+
class RailsTemplate < Template
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def add_preamble(src)
|
20
|
+
src << "@output_buffer = output_buffer || ActionView::OutputBuffer.new;"
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_postamble(src)
|
24
|
+
src << "@output_buffer.to_s\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_text(src, text)
|
28
|
+
return if !text || text.empty?
|
29
|
+
freeze = @freeze ? '.freeze' : ''
|
30
|
+
text.gsub!(/['\\]/, '\\\\\&')
|
31
|
+
src << "@output_buffer.safe_append='#{text}'#{freeze};"
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_stmt(src, stmt)
|
35
|
+
return if !stmt || stmt.empty?
|
36
|
+
src << stmt
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_expr(src, expr, indicator)
|
40
|
+
return if !expr || expr.empty?
|
41
|
+
l = '('; r = ')'
|
42
|
+
l = r = ' ' if expr_has_block(expr)
|
43
|
+
if indicator == '=' # escaping
|
44
|
+
src << "@output_buffer.append=#{l}#{expr}#{r};"
|
45
|
+
else # without escaping
|
46
|
+
src << "@output_buffer.safe_append=#{l}#{expr}#{r};"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
data/test/context_test.rb
CHANGED
data/test/rails_test.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
###
|
4
|
+
### $Release: 2.0.0 $
|
5
|
+
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
6
|
+
### $License: MIT License $
|
7
|
+
###
|
8
|
+
|
9
|
+
libpath = File.class_eval { join(dirname(dirname(__FILE__)), 'lib') }
|
10
|
+
$: << libpath unless $:.include?(libpath)
|
11
|
+
|
12
|
+
require 'minitest/autorun'
|
13
|
+
|
14
|
+
require 'baby_erubis/rails'
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
describe 'BabyErubis::RailsTemplate' do
|
19
|
+
|
20
|
+
let(:tmpl) { BabyErubis::RailsTemplate.new }
|
21
|
+
|
22
|
+
def _modify(ruby_code)
|
23
|
+
if (''.freeze).equal?(''.freeze)
|
24
|
+
return ruby_code.gsub(/([^'])';/m, "\\1'.freeze;")
|
25
|
+
else
|
26
|
+
return ruby_code
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
eruby_template = <<'END'
|
31
|
+
<h1>New Article</h1>
|
32
|
+
|
33
|
+
<%= form_for :article, url: articles_path do |f| %>
|
34
|
+
<p>
|
35
|
+
<%= f.label :title %><br>
|
36
|
+
<%= f.text_field :title %>
|
37
|
+
</p>
|
38
|
+
|
39
|
+
<p>
|
40
|
+
<%= f.label :text %><br>
|
41
|
+
<%= f.text_area :text %>
|
42
|
+
</p>
|
43
|
+
|
44
|
+
<p>
|
45
|
+
<%= f.submit %>
|
46
|
+
</p>
|
47
|
+
<% end %>
|
48
|
+
END
|
49
|
+
|
50
|
+
ruby_code = <<'END'
|
51
|
+
@output_buffer = output_buffer || ActionView::OutputBuffer.new;@output_buffer.safe_append='<h1>New Article</h1>
|
52
|
+
|
53
|
+
';@output_buffer.append= form_for :article, url: articles_path do |f| ;@output_buffer.safe_append='
|
54
|
+
<p>
|
55
|
+
';@output_buffer.append=(f.label :title);@output_buffer.safe_append='<br>
|
56
|
+
';@output_buffer.append=(f.text_field :title);@output_buffer.safe_append='
|
57
|
+
</p>
|
58
|
+
|
59
|
+
<p>
|
60
|
+
';@output_buffer.append=(f.label :text);@output_buffer.safe_append='<br>
|
61
|
+
';@output_buffer.append=(f.text_area :text);@output_buffer.safe_append='
|
62
|
+
</p>
|
63
|
+
|
64
|
+
<p>
|
65
|
+
';@output_buffer.append=(f.submit);@output_buffer.safe_append='
|
66
|
+
</p>
|
67
|
+
'; end;
|
68
|
+
@output_buffer.to_s
|
69
|
+
END
|
70
|
+
|
71
|
+
|
72
|
+
describe '#parse()' do
|
73
|
+
|
74
|
+
it "converts eRuby template into ruby code with Rails style." do
|
75
|
+
tmpl = BabyErubis::RailsTemplate.new.from_str(eruby_template)
|
76
|
+
expected = _modify(ruby_code)
|
77
|
+
assert_equal expected, tmpl.src
|
78
|
+
end
|
79
|
+
|
80
|
+
it "can understand block such as <%= form_for do |x| %>." do
|
81
|
+
s = <<-'END'
|
82
|
+
<%= (1..3).each do %>
|
83
|
+
Hello
|
84
|
+
<% end %>
|
85
|
+
END
|
86
|
+
tmpl = BabyErubis::RailsTemplate.new.from_str(s)
|
87
|
+
assert_match /\@output_buffer.append= \(1\.\.3\)\.each do ;/, tmpl.src
|
88
|
+
#
|
89
|
+
s = <<-'END'
|
90
|
+
<%= (1..3).each do |x, y|%>
|
91
|
+
Hello
|
92
|
+
<% end %>
|
93
|
+
END
|
94
|
+
tmpl = BabyErubis::RailsTemplate.new.from_str(s)
|
95
|
+
assert_match /\@output_buffer.append= \(1\.\.3\)\.each do \|x, y\| ;/, tmpl.src
|
96
|
+
end
|
97
|
+
|
98
|
+
it "doesn't misunderstand <%= @todo %> as block" do
|
99
|
+
tmpl = BabyErubis::RailsTemplate.new.from_str("<b><%= @todo %></b>")
|
100
|
+
assert_match /\@output_buffer\.append=\(\@todo\);/, tmpl.src
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
end
|
data/test/run_all.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
###
|
4
|
-
### $Release:
|
4
|
+
### $Release: 2.0.0 $
|
5
5
|
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
6
6
|
### $License: MIT License $
|
7
7
|
###
|
8
8
|
|
9
9
|
here = File.dirname(File.expand_path(__FILE__))
|
10
|
-
Dir.glob(here + '
|
10
|
+
Dir.glob(here + '/**/*_test.rb').each do |fpath|
|
11
11
|
require fpath
|
12
12
|
end
|
data/test/script_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
###
|
4
|
-
### $Release:
|
4
|
+
### $Release: 2.0.0 $
|
5
5
|
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
6
6
|
### $License: MIT License $
|
7
7
|
###
|
@@ -71,19 +71,20 @@ describe Main do
|
|
71
71
|
|
72
72
|
help_message = <<'END'.gsub(/\$SCRIPT/, File.basename($0))
|
73
73
|
Usage: $SCRIPT [..options..] [erubyfile]
|
74
|
-
-h, --help
|
75
|
-
-v, --version
|
76
|
-
-x
|
77
|
-
-X
|
78
|
-
-N
|
79
|
-
-U
|
80
|
-
-C
|
81
|
-
-c context
|
82
|
-
-f file
|
83
|
-
-H
|
84
|
-
|
85
|
-
--
|
86
|
-
--
|
74
|
+
-h, --help : help
|
75
|
+
-v, --version : version
|
76
|
+
-x : show ruby code
|
77
|
+
-X : show ruby code only (no text part)
|
78
|
+
-N : numbering: add line numbers (for '-x/-X')
|
79
|
+
-U : unique: compress empty lines (for '-x/-X')
|
80
|
+
-C : compact: remove empty lines (for '-x/-X')
|
81
|
+
-c context : context string (yaml inline style or ruby code)
|
82
|
+
-f file : context data file (*.yaml, *.json, or *.rb)
|
83
|
+
-H : same as --format=html
|
84
|
+
-R : same as --format=rails
|
85
|
+
--format=format : 'text', 'html' or 'rails' (default: text)
|
86
|
+
--encoding=name : encoding (default: utf-8)
|
87
|
+
--freeze={true|false} : use String#freeze() or not
|
87
88
|
|
88
89
|
Example:
|
89
90
|
## convert eRuby file into Ruby code
|
@@ -145,6 +146,22 @@ _buf = ''; _buf << '<html>
|
|
145
146
|
</body>
|
146
147
|
</html>
|
147
148
|
'; _buf.to_s
|
149
|
+
END
|
150
|
+
SOURCE_RAILS = <<'END'
|
151
|
+
@output_buffer = output_buffer || ActionView::OutputBuffer.new;@output_buffer.safe_append='<html>
|
152
|
+
<body>
|
153
|
+
<h1>';@output_buffer.append=(@title);@output_buffer.safe_append='</h1>
|
154
|
+
<h1>';@output_buffer.safe_append=(@title);@output_buffer.safe_append='</h1>
|
155
|
+
<div>
|
156
|
+
<ul>
|
157
|
+
'; for item in @items;
|
158
|
+
@output_buffer.safe_append=' <li>';@output_buffer.append=(item);@output_buffer.safe_append='</li>
|
159
|
+
'; end;
|
160
|
+
@output_buffer.safe_append=' </ul>
|
161
|
+
</div>
|
162
|
+
</body>
|
163
|
+
</html>
|
164
|
+
';@output_buffer.to_s
|
148
165
|
END
|
149
166
|
SOURCE_NO_TEXT = <<'END'
|
150
167
|
_buf = '';
|
@@ -345,6 +362,19 @@ END
|
|
345
362
|
end
|
346
363
|
|
347
364
|
|
365
|
+
describe '-R' do
|
366
|
+
|
367
|
+
it "uses Rails-style template." do
|
368
|
+
sout, serr = with_erubyfile do |fname|
|
369
|
+
dummy_stdio { Main.main(['-Rx', fname]) }
|
370
|
+
end
|
371
|
+
assert_equal _modify(SOURCE_RAILS), sout
|
372
|
+
assert_equal "", serr
|
373
|
+
end
|
374
|
+
|
375
|
+
end
|
376
|
+
|
377
|
+
|
348
378
|
describe '-c cotnext' do
|
349
379
|
|
350
380
|
it "can specify context data in YAML format." do
|
@@ -501,7 +531,7 @@ END
|
|
501
531
|
end
|
502
532
|
|
503
533
|
|
504
|
-
describe '--format={text|html}' do
|
534
|
+
describe '--format={text|html|rails}' do
|
505
535
|
|
506
536
|
it "can enforce text format." do
|
507
537
|
ctx_str = "{title: Love&Peace, items: [A, B, C]}"
|
@@ -521,6 +551,14 @@ END
|
|
521
551
|
assert_equal "", serr
|
522
552
|
end
|
523
553
|
|
554
|
+
it "can enforce rails format." do
|
555
|
+
sout, serr = with_erubyfile do |fname|
|
556
|
+
dummy_stdio { Main.main(['--format=rails', '-x', fname]) }
|
557
|
+
end
|
558
|
+
assert_equal _modify(SOURCE_RAILS), sout
|
559
|
+
assert_equal "", serr
|
560
|
+
end
|
561
|
+
|
524
562
|
it "reports error when argument is missng." do
|
525
563
|
status = nil
|
526
564
|
sout, serr = with_erubyfile do |fname|
|
@@ -537,7 +575,7 @@ END
|
|
537
575
|
dummy_stdio { status = Main.main(['-x', '--format=json', fname]) }
|
538
576
|
end
|
539
577
|
assert_equal "", sout
|
540
|
-
assert_equal "#{File.basename($0)}: --format=json: 'text' or '
|
578
|
+
assert_equal "#{File.basename($0)}: --format=json: 'text', 'html' or 'rails' expected\n", serr
|
541
579
|
assert_equal 1, status
|
542
580
|
end
|
543
581
|
|
data/test/template_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
###
|
4
|
-
### $Release:
|
4
|
+
### $Release: 2.0.0 $
|
5
5
|
### $Copyright: copyright(c) 2014 kuwata-lab.com all rights reserved $
|
6
6
|
### $License: MIT License $
|
7
7
|
###
|
@@ -39,7 +39,7 @@ items:
|
|
39
39
|
END
|
40
40
|
expected = <<'END'
|
41
41
|
_buf = ''; _buf << 'title: '; _buf << (@title).to_s; _buf << '
|
42
|
-
|
42
|
+
items:
|
43
43
|
'; for item in @items;
|
44
44
|
_buf << ' - '; _buf << (item).to_s; _buf << '
|
45
45
|
'; end;
|
@@ -107,14 +107,14 @@ END
|
|
107
107
|
expected = <<'END'
|
108
108
|
_buf = '';
|
109
109
|
|
110
|
-
|
111
|
-
|
110
|
+
|
111
|
+
_buf << 'x = ';
|
112
112
|
|
113
113
|
_buf << '
|
114
114
|
';
|
115
115
|
|
116
|
-
|
117
|
-
|
116
|
+
|
117
|
+
_buf.to_s
|
118
118
|
END
|
119
119
|
expected = _modify(expected)
|
120
120
|
assert_equal expected, template.parse(input)
|
@@ -184,6 +184,62 @@ END
|
|
184
184
|
assert_equal expected, template.parse(input)
|
185
185
|
end
|
186
186
|
|
187
|
+
it "concats spaces around embedded expressions." do
|
188
|
+
input = <<'END'
|
189
|
+
<form>
|
190
|
+
<%= f.text :email %>
|
191
|
+
<%= f.password :password %>
|
192
|
+
<%= f.submit 'Login' %>
|
193
|
+
</form>
|
194
|
+
END
|
195
|
+
expected = <<'END'
|
196
|
+
_buf = ''; _buf << '<form>
|
197
|
+
'; _buf << (f.text :email).to_s; _buf << '
|
198
|
+
'; _buf << (f.password :password).to_s; _buf << '
|
199
|
+
'; _buf << (f.submit 'Login').to_s; _buf << '
|
200
|
+
</form>
|
201
|
+
'; _buf.to_s
|
202
|
+
END
|
203
|
+
template = BabyErubis::Text.new(:freeze=>false)
|
204
|
+
assert_equal expected, template.parse(input)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "can recognize block argument in embedded expression correctly." do
|
208
|
+
input = <<'END'
|
209
|
+
<%= form_for(:article) do |f| %>
|
210
|
+
...
|
211
|
+
<% end %>
|
212
|
+
END
|
213
|
+
expected = <<'END'
|
214
|
+
_buf = ''; _buf << form_for(:article) do |f| _buf << '
|
215
|
+
...
|
216
|
+
'; end;
|
217
|
+
_buf.to_s
|
218
|
+
END
|
219
|
+
template = BabyErubis::Text.new(:freeze=>false)
|
220
|
+
assert_equal expected, template.parse(input)
|
221
|
+
#
|
222
|
+
input = <<'END'
|
223
|
+
<%= form_for :article do %>
|
224
|
+
...
|
225
|
+
<% end %>
|
226
|
+
END
|
227
|
+
expected = <<'END'
|
228
|
+
_buf = ''; _buf << form_for :article do _buf << '
|
229
|
+
...
|
230
|
+
'; end;
|
231
|
+
_buf.to_s
|
232
|
+
END
|
233
|
+
template = BabyErubis::Text.new(:freeze=>false)
|
234
|
+
assert_equal expected, template.parse(input)
|
235
|
+
end
|
236
|
+
|
237
|
+
it "doesn't misunderstand <%= @todo %> as block" do
|
238
|
+
tmpl = BabyErubis::Text.new
|
239
|
+
src = tmpl.parse("<b><%= @todo %></b>")
|
240
|
+
assert_match /\ _buf << \(\@todo\)\.to_s;/, src
|
241
|
+
end
|
242
|
+
|
187
243
|
end
|
188
244
|
|
189
245
|
|
metadata
CHANGED
@@ -1,31 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: baby_erubis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- makoto kuwata
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
|
-
description:
|
15
|
-
|
13
|
+
description: |
|
14
|
+
BabyErubis is an yet another eRuby implementation, based on Erubis.
|
16
15
|
|
17
16
|
* Small and fast
|
18
|
-
|
19
17
|
* Supports HTML as well as plain text
|
20
|
-
|
21
18
|
* Accepts both template file and template string
|
22
|
-
|
23
19
|
* Easy to customize
|
24
20
|
|
25
|
-
|
26
21
|
BabyErubis support Ruby 1.9 or higher, and will work on 1.8 very well.
|
27
|
-
|
28
|
-
'
|
29
22
|
email: kwa(at)kuwata-lab.com
|
30
23
|
executables:
|
31
24
|
- baby_erubis
|
@@ -33,7 +26,9 @@ extensions: []
|
|
33
26
|
extra_rdoc_files: []
|
34
27
|
files:
|
35
28
|
- lib/baby_erubis.rb
|
29
|
+
- lib/baby_erubis/rails.rb
|
36
30
|
- test/context_test.rb
|
31
|
+
- test/rails_test.rb
|
37
32
|
- test/run_all.rb
|
38
33
|
- test/script_test.rb
|
39
34
|
- test/template_test.rb
|
@@ -44,28 +39,28 @@ files:
|
|
44
39
|
- baby_erubis.gemspec
|
45
40
|
- Rakefile
|
46
41
|
homepage: https://github.com/kwatch/BabyErubis/tree/ruby
|
47
|
-
licenses:
|
42
|
+
licenses:
|
43
|
+
- MIT License
|
44
|
+
metadata: {}
|
48
45
|
post_install_message:
|
49
46
|
rdoc_options: []
|
50
47
|
require_paths:
|
51
48
|
- lib
|
52
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
-
none: false
|
54
50
|
requirements:
|
55
|
-
- -
|
51
|
+
- - '>='
|
56
52
|
- !ruby/object:Gem::Version
|
57
53
|
version: '0'
|
58
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
55
|
requirements:
|
61
|
-
- -
|
56
|
+
- - '>='
|
62
57
|
- !ruby/object:Gem::Version
|
63
58
|
version: '0'
|
64
59
|
requirements: []
|
65
60
|
rubyforge_project:
|
66
|
-
rubygems_version:
|
61
|
+
rubygems_version: 2.0.14
|
67
62
|
signing_key:
|
68
|
-
specification_version:
|
63
|
+
specification_version: 4
|
69
64
|
summary: yet another eRuby implementation based on Erubis
|
70
65
|
test_files:
|
71
66
|
- test/run_all.rb
|