renshi 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,18 +1,33 @@
1
- Renshi is a templating language for Ruby which is versatile and cooperative with HTML. It has a concise syntax and 'attribute expressions', which let you build and combine sets of inline Ruby instructions upon HTML elements.
1
+ Renshi - a templating language which is friendly and powerful with your HTML structures.
2
+
3
+ Works with Rails and Sinatra - no config.. Just 'require renshi'. In Sinatra use 'ren' where you would have used the 'erb'/'haml' methods.
4
+
5
+ index.html.ren means you're working with a Renshi file!
2
6
 
3
- Renshi integrates with Rails and Sinatra transparently. Simply 'require renshi'. In Sinatra use 'ren' where you would have used the 'erb'/'haml' methods. Renshi templates are appended with the suffix of .ren, e.g. index.html.ren or index.ren.
4
7
 
5
8
  $ Ruby Interpretation
6
9
  =====================
7
- Like ERB, but less typing.
10
+ $ interprets everything after it as ruby which will be to_stringed until the next $, a newline character, or the end of the element.
11
+
12
+ e.g. you can do this
13
+
14
+ $stylesheet_link_tag "atsida"
15
+
16
+ e.g. or this
17
+ <p>$foo $bar</p>
18
+
8
19
 
9
- Use $ or ${..} where you would use <%= ... %> . The single $ is used for an unbroken phrase (see below).
20
+ ${} delimits where the ruby begins and ends, for inplace insertions"
10
21
 
11
- $foo[0], $1+1, $Time.now - ERB equiv. <%= foo[0] %>, <%= 1+1 %>, <%= Time.now %>
22
+ e.g.
23
+ <p>${some_function "takes this string as input"} and this is normal HTML</p>
12
24
 
13
- ${some_function "takes this string as input"} (ERB equiv. - <%= some_function "takes this string as input" %>)
25
+ $^ outputs a single phrase:
14
26
 
15
- Use $[] instead of <% ... -%>
27
+ e.g.
28
+ <p>What are you doing up at $^Time.now when you should be asleep?</p>
29
+
30
+ $[] allows ruby src code to be embedded. It's a bad practice (use helpers or something) but we let you do it.
16
31
 
17
32
  $[if foo]
18
33
  $foo
@@ -20,14 +35,14 @@ $[end]
20
35
 
21
36
  Attribute Expressions
22
37
  =====================
23
- Attr. expressions are insertable into HTML elements as attributes.
38
+ Attribute expressions are insertable into HTML elements.
24
39
 
25
40
  <p r:if="user.known?">Welcome $user.name</p>
26
41
 
27
42
  They can be combined on elements and are interpreted in the order of appearance and are cumulative, allowing you to program inline on the HTML structure.
28
43
 
29
44
  <li r:each="@sphinx.results[:words], |k,v|" r:if="v[:hits].to_i > 0">
30
- $k - Hits $v[:hits] in $v[:docs] documents
45
+ $^k - Hits $^v[:hits] in $^v[:docs] documents
31
46
  </li>
32
47
 
33
48
  In the above, you can see that the if statement is scoped within the preceding each block, so you can reference variables between attr. expressions. Variables within an attr. expression don't need the $ symbol. That's only for setting up Ruby insertions within regular HTML.
@@ -146,7 +161,17 @@ To print a $ use $$, e.g. $$10.95 comes out as $10.95
146
161
 
147
162
  Because the $foo evaluation can take all sorts of symbols to interpret a Ruby statement, if you are using a special symbol *immediately* before it, you'll have to use ${foo} instead. For example, because $greetings[0].upcase is interpretable, if you want to output "[HELLO]" where the brackets surround the string, you'd use [${greetings[0].upcase}]
148
163
 
149
- The $ parser *delimits* (splits) on any character which is not in this list - . " ' { } ( ) + = * / \ - @ [ ] : ? ! % \w
164
+ The $^ parser *delimits* (splits) on any character which is not in this list - . " ' { } ( ) + = * / \ - @ [ ] : ? ! % \w
165
+
166
+ To output xml elements in a string use the escaped versions - e.g.for
167
+
168
+ (incorrect)
169
+ ${@page.section.root? ? "<li>Home</li>" : render_breadcrumbs(:from_top => 1)}
170
+
171
+ use, instead,
172
+
173
+ (correct)
174
+ ${@page.section.root? ? "&lt;li&gt;Home&lt;/li&gt;" : render_breadcrumbs(:from_top => 1)}
150
175
 
151
176
  Installation
152
177
  ============
data/lib/renshi/parser.rb CHANGED
@@ -105,7 +105,7 @@ module Renshi
105
105
 
106
106
  while idx != nil do
107
107
  next_char = text[(idx + 1)..(idx + 1)]
108
-
108
+
109
109
  if next_char == " "
110
110
  raise SyntaxError, "Floating $ - use $$ to output '$': #{text[(idx +1)..-1]}", caller
111
111
  elsif next_char == "("
@@ -116,7 +116,6 @@ module Renshi
116
116
  #an escaped $ - i.e. '$$'
117
117
  end_statement_idx = (idx + 2)
118
118
  bits << "$"
119
-
120
119
  #${...}
121
120
  elsif next_char == "{"
122
121
  begin
@@ -128,8 +127,7 @@ module Renshi
128
127
  end_statement_idx = closing_brace_idx + 1
129
128
  rescue StandardError
130
129
  raise SyntaxError, "No closing brace: #{text}", caller
131
- end
132
-
130
+ end
133
131
  #$[...]
134
132
  elsif next_char == "["
135
133
  begin
@@ -141,16 +139,33 @@ module Renshi
141
139
  end_statement_idx = closing_brace_idx + 1
142
140
  rescue StandardError
143
141
  raise SyntaxError, "No closing bracket: #{text}", caller
144
- end
145
- else #$foo
146
- #divide with a delimiter for anything which is not a name character - alpa-numeric and underscore
147
- words = text[(idx +1)..-1].split(/[^\w."'{}()+=*\/\-@\[\]:?!%]/)
148
- words[0] = "'$'" if words[0] == "$"
149
- statement_str = words.first
150
- statement = Statement.new(statement_str)
151
- bits << statement.compile_to_print!
152
- end_statement_idx = (words.first.length) + 1 + idx
153
- end
142
+ end
143
+ elsif next_char == "^" #$!foo
144
+ #divide with a delimiter for anything which is not a name character - alpa-numeric and underscore
145
+ words = text[(idx + 2)..-1].split(/[^\w."'{}()+=*\/\-@\[\]:?!%]/)
146
+ words[0] = "'$'" if words[0] == "$"
147
+ statement_str = words.first
148
+ statement = Statement.new(statement_str)
149
+ bits << statement.compile_to_print!
150
+ end_statement_idx = (words.first.length) + 2 + idx
151
+ else #$foo
152
+ #divide with a delimiter on \n or $ or assume ruby until the end of element
153
+ words = text[(idx +1)..-1].split(/[\n$]/)
154
+ words[0] = "'$'" if words[0] == "$"
155
+
156
+ #now respect whitespace trailing the word - e.g. $foo $bar should not render as "helloworld"
157
+ if words.first.index(/\s/)
158
+ before_whitespace = words.first.rindex(/[^\s]/)
159
+ src = words.first[0..(before_whitespace)]
160
+ else
161
+ src = words.first
162
+ end
163
+
164
+ statement_str = src
165
+ statement = Statement.new(statement_str)
166
+ bits << statement.compile_to_print!
167
+ end_statement_idx = (src.length) + 1 + idx
168
+ end
154
169
 
155
170
  next_statement_idx = text.index("$", end_statement_idx)
156
171
 
data/lib/renshi.rb CHANGED
@@ -9,7 +9,7 @@ require 'renshi/attribute_expressions'
9
9
  require 'renshi/frameworks'
10
10
 
11
11
  module Renshi
12
- VERSION="0.2.4"
12
+ VERSION="0.2.5"
13
13
 
14
14
  class SyntaxError < StandardError; end
15
15
  end
data/spec/each_spec.rb CHANGED
@@ -29,6 +29,6 @@ describe Renshi::Parser do
29
29
  compiled = Renshi::Parser.parse(str)
30
30
  doc = eval(compiled, binding)
31
31
  doc = N(doc)
32
- (doc/"div[@id='test']").text.strip.should =~ /hello world/
32
+ (doc/"div[@id='test']").text.strip.should =~ /hello world/
33
33
  end
34
34
  end
data/spec/parser_spec.rb CHANGED
@@ -86,7 +86,7 @@ describe Renshi::Parser do
86
86
  it "should interpret all Renshi instructions and remove them from the document" do
87
87
  raw = compile_file("data/example1.ren")
88
88
  html = eval(raw, binding)
89
-
89
+
90
90
  html.should_not =~/R_INSTR_IDX_START/
91
91
  html.should_not =~/R_INSTR_IDX_END/
92
92
  html.should_not =~/@output_buffer.concat/
@@ -101,8 +101,8 @@ describe Renshi::Parser do
101
101
  html.should =~/head/
102
102
  end
103
103
 
104
- it "should interpret single $foos using \W, i.e. $foo$bar should render" do
105
- raw = Renshi::Parser.parse("$foo$bar")
104
+ it "should interpret single $^foos using \W, i.e. $^foo$^bar should render" do
105
+ raw = Renshi::Parser.parse("$^foo$^bar")
106
106
  foo = "hello"
107
107
  bar = " world"
108
108
 
@@ -118,106 +118,130 @@ class Test
118
118
  end
119
119
 
120
120
  it "should interpret single $foo.bar " do
121
- raw = Renshi::Parser.parse("$foo.bar")
122
- foo = Test.new
123
- html = eval(raw, binding)
124
-
125
- html.should eql "hello world"
126
- end
127
-
128
- it "should interpret single $1+1 and $2*2 and $3/3 and $4-4 " do
129
- raw = Renshi::Parser.parse("$1+1")
130
- foo = Test.new
131
- html = eval(raw, binding)
132
- html.should eql "2"
133
-
134
- raw = Renshi::Parser.parse("$2*2")
135
- foo = Test.new
136
- html = eval(raw, binding)
137
- html.should eql "4"
138
-
139
- raw = Renshi::Parser.parse("$3/3")
140
- foo = Test.new
141
- html = eval(raw, binding)
142
- html.should eql "1"
143
-
144
- raw = Renshi::Parser.parse("$4-4")
145
- foo = Test.new
146
- html = eval(raw, binding)
147
- html.should eql "0"
148
- end
149
-
150
-
151
- it "should interpret $foo[0] " do
152
- raw = Renshi::Parser.parse("$foo[0]")
153
- foo = ["hello world"]
154
- html = eval(raw, binding)
155
-
156
- html.should eql "hello world"
157
- end
158
-
159
-
160
- it "should interpret \"${@foo}\" " do
161
- raw = Renshi::Parser.parse(%Q!"${@foo}"!)
162
- puts raw
163
- @foo = "hello world"
164
- html = eval(raw, binding)
165
-
166
- html.should eql %Q!"hello world"!
167
- end
168
-
169
- class R
170
- attr_accessor :path
121
+ raw = Renshi::Parser.parse("$foo.bar")
122
+ foo = Test.new
123
+ html = eval(raw, binding)
124
+
125
+ html.should eql "hello world"
126
+ end
127
+
128
+ it "should interpret single $1+1 and $2*2 and $3/3 and $4-4 " do
129
+ raw = Renshi::Parser.parse("$1+1")
130
+ foo = Test.new
131
+ html = eval(raw, binding)
132
+ html.should eql "2"
133
+
134
+ raw = Renshi::Parser.parse("$2*2")
135
+ foo = Test.new
136
+ html = eval(raw, binding)
137
+ html.should eql "4"
138
+
139
+ raw = Renshi::Parser.parse("$3/3")
140
+ foo = Test.new
141
+ html = eval(raw, binding)
142
+ html.should eql "1"
143
+
144
+ raw = Renshi::Parser.parse("$4-4")
145
+ foo = Test.new
146
+ html = eval(raw, binding)
147
+ html.should eql "0"
148
+ end
149
+
150
+
151
+ it "should interpret $foo[0] " do
152
+ raw = Renshi::Parser.parse("$foo[0]")
153
+ foo = ["hello world"]
154
+ html = eval(raw, binding)
155
+
156
+ html.should eql "hello world"
157
+ end
158
+
159
+
160
+ it "should interpret \"${@foo}\" " do
161
+ raw = Renshi::Parser.parse(%Q!"${@foo}"!)
162
+ puts raw
163
+ @foo = "hello world"
164
+ html = eval(raw, binding)
165
+
166
+ html.should eql %Q!"hello world"!
167
+ end
168
+
169
+ class R
170
+ attr_accessor :path
171
+
172
+ def initialize
173
+ @path = "/hello/world"
174
+ end
175
+ end
176
+
177
+ it "should interpret <a href='{$r.path}'>hello</a>" do
178
+ r = R.new
179
+ raw = Renshi::Parser.parse(%Q!<a href="${r.path}">hello</a>!)
180
+ html = eval(raw, binding)
181
+
182
+ html.should eql "<a href=\"#{r.path}\">hello</a>"
183
+ end
184
+
185
+ it "should interpret $foo.nil?" do
186
+ foo = nil
187
+ raw = Renshi::Parser.parse("$foo.nil?")
188
+ html = eval(raw, binding)
189
+
190
+ html.should eql true.to_s
191
+ end
192
+
193
+ it "should interpret $@foo.nil?" do
194
+ @foo = nil
195
+ raw = Renshi::Parser.parse("$@foo.nil?")
196
+ html = eval(raw, binding)
197
+
198
+ html.should eql true.to_s
199
+ end
200
+
201
+ it "should interpret $a$b$c" do
202
+ a = 'a'; b = 'b'; c = 'c';
203
+ raw = Renshi::Parser.parse("$a$b$c")
204
+ html = eval(raw, binding)
205
+
206
+ html.should eql "abc"
207
+ end
208
+
209
+ it "should interpret $'foo'.upcase!" do
210
+ raw = Renshi::Parser.parse("$'foo'.upcase!")
211
+ html = eval(raw, binding)
212
+
213
+ html.should eql "FOO"
214
+ end
215
+
216
+ it "should interpret $Time.now.strftime('%I:%M')" do
217
+ raw = Renshi::Parser.parse("$Time.now.strftime('%I:%M')")
218
+ html = eval(raw, binding)
219
+
220
+ html.should =~ /:/
221
+ end
222
+
223
+ it "should evaluate ternary statements in the curly braces" do
224
+ foo = nil
225
+ raw = Renshi::Parser.parse("${foo.nil? ? '&gt;li&lt;hello&gt;/li&lt;' : '&gt;li&lt;goodbye&gt;/li&lt;'}")
226
+ html = eval(raw, binding)
227
+ html.should =~ /hello/
228
+ foo = ""
229
+ html = eval(raw, binding)
230
+ html.should =~ /goodbye/
231
+ end
232
+
233
+ it "should interpret $foo until \n or end of element as ruby to string" do
234
+ raw = Renshi::Parser.parse("$'this should output as a string'")
235
+ html = eval(raw, binding)
236
+
237
+ html.should =~ /this should output as a string/
238
+ end
171
239
 
172
- def initialize
173
- @path = "/hello/world"
174
- end
175
- end
176
-
177
- it "should interpret <a href='{$r.path}'>hello</a>" do
178
- r = R.new
179
- raw = Renshi::Parser.parse(%Q!<a href="${r.path}">hello</a>!)
180
- html = eval(raw, binding)
181
-
182
- html.should eql "<a href=\"#{r.path}\">hello</a>"
183
- end
184
-
185
- it "should interpret $foo.nil?" do
186
- foo = nil
187
- raw = Renshi::Parser.parse("$foo.nil?")
188
- html = eval(raw, binding)
189
-
190
- html.should eql true.to_s
191
- end
192
-
193
- it "should interpret $@foo.nil?" do
194
- @foo = nil
195
- raw = Renshi::Parser.parse("$@foo.nil?")
196
- html = eval(raw, binding)
197
-
198
- html.should eql true.to_s
199
- end
200
-
201
- it "should interpret $a$b$c" do
202
- a = 'a'; b = 'b'; c = 'c';
203
- raw = Renshi::Parser.parse("$a$b$c")
204
- html = eval(raw, binding)
205
-
206
- html.should eql "abc"
207
- end
208
-
209
- it "should interpret $'foo'.upcase!" do
210
- raw = Renshi::Parser.parse("$'foo'.upcase!")
211
- html = eval(raw, binding)
212
-
213
- html.should eql "FOO"
214
- end
215
-
216
- it "should interpret $Time.now.strftime('%I:%M')" do
217
- raw = Renshi::Parser.parse("$Time.now.strftime('%I:%M')")
218
- html = eval(raw, binding)
219
-
220
- html.should =~ /:/
221
- end
222
-
240
+ it "should interpret $^foo as the single phrase" do
241
+ raw = Renshi::Parser.parse("this should $^foo 'hello'")
242
+ foo = "say"
243
+ html = eval(raw, binding)
244
+
245
+ html.should =~ /this should say 'hello'/
246
+ end
223
247
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renshi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Faiz
@@ -9,7 +9,7 @@ autorequire: renshi
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-29 00:00:00 +10:00
12
+ date: 2009-10-06 00:00:00 +11:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency