mustache 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,4 +1,16 @@
1
- ## 0.3.0 (2009-??-??)
1
+ ## 0.3.2 (2009-10-19)
2
+
3
+ * Bugfix: Partials in Sinatra were using the wrong path.
4
+
5
+ ## 0.3.1 (2009-10-19)
6
+
7
+ * Added mustache.vim to contrib/ (Thanks Juvenn Woo!)
8
+ * Support string keys in contexts (not just symbol keys).
9
+ * Bugfix: # and / were not permitted in tag names. Now they are.
10
+ * Bugfix: Partials in Sinatra needed to know their extension and path
11
+ * Bugfix: Using the same boolean section twice was failing
12
+
13
+ ## 0.3.0 (2009-10-14)
2
14
 
3
15
  * Set Delimiter tags are now supported. See the README
4
16
  * Improved error message when an enumerable section did not return all
data/README.md CHANGED
@@ -364,6 +364,13 @@ An example Sinatra application is also provided:
364
364
  <http://github.com/defunkt/mustache-sinatra-example>
365
365
 
366
366
 
367
+ Vim
368
+ ---
369
+
370
+ Thanks to [Juvenn Woo](http://github.com/juvenn) for mustache.vim. It
371
+ is included under the contrib/ directory.
372
+
373
+
367
374
  Installation
368
375
  ------------
369
376
 
data/Rakefile CHANGED
@@ -9,6 +9,9 @@ Rake::TestTask.new do |t|
9
9
  t.verbose = false
10
10
  end
11
11
 
12
+ desc "Build a gem"
13
+ task :gem => [ :gemspec, :build ]
14
+
12
15
  desc "Launch Kicker (like autotest)"
13
16
  task :kicker do
14
17
  puts "Kicking... (ctrl+c to cancel)"
@@ -40,7 +43,7 @@ rescue LoadError
40
43
  end
41
44
 
42
45
  desc "Push a new version to Gemcutter"
43
- task :publish => [ :gemspec, :build ] do
46
+ task :publish => [ :test, :gemspec, :build ] do
44
47
  system "git tag v#{Mustache::Version}"
45
48
  system "git push origin v#{Mustache::Version}"
46
49
  system "gem push pkg/mustache-#{Mustache::Version}.gem"
@@ -0,0 +1,10 @@
1
+ %h1= header
2
+ - item.each do |i|
3
+ %ul
4
+ - if i[:current]
5
+ %li= i[:name]
6
+ - else
7
+ %li
8
+ %a{:href => i[:url]}= i[:name]
9
+ - if item.empty?
10
+ %p= The list is empty.
data/benchmarks/speed.rb CHANGED
@@ -11,17 +11,40 @@ template = File.read(File.dirname(__FILE__) + '/complex.erb')
11
11
 
12
12
  unless ENV['NOERB']
13
13
  erb = ERB.new(template)
14
- bench 'ERB w/ caching' do
15
- erb.result(ComplexView.new.send(:binding))
14
+ scope = ComplexView.new.send(:binding)
15
+ bench 'ERB w/ caching' do
16
+ erb.result(scope)
16
17
  end
17
18
 
18
19
  unless ENV['CACHED']
19
- bench 'ERB w/o caching' do
20
- ERB.new(template).result(ComplexView.new.send(:binding))
20
+ scope = ComplexView.new.send(:binding)
21
+ bench 'ERB w/o caching' do
22
+ ERB.new(template).result(scope)
21
23
  end
22
24
  end
23
25
  end
24
26
 
27
+
28
+ ## haml
29
+ require 'haml'
30
+ template = File.read(File.dirname(__FILE__) + '/complex.haml')
31
+
32
+ unless ENV['NOHAML']
33
+ haml = Haml::Engine.new(template)
34
+ scope = ComplexView.new.send(:binding)
35
+ bench 'HAML w/ caching' do
36
+ haml.render(scope)
37
+ end
38
+
39
+ unless ENV['CACHED']
40
+ scope = ComplexView.new.send(:binding)
41
+ bench 'HAML w/o caching' do
42
+ Haml::Engine.new(template).render(scope)
43
+ end
44
+ end
45
+ end
46
+
47
+
25
48
  ## mustache
26
49
  tpl = ComplexView.new
27
50
  tpl.template
@@ -37,14 +60,14 @@ items << { :name => 'blue', :current => false, :url => '#Blue' }
37
60
 
38
61
  tpl[:item] = items
39
62
 
40
- bench '{ w/ caching' do
63
+ bench '{{ w/ caching' do
41
64
  tpl.to_html
42
65
  end
43
66
 
44
67
  content = File.read(ComplexView.template_file)
45
68
 
46
69
  unless ENV['CACHED']
47
- bench '{ w/o caching' do
70
+ bench '{{ w/o caching' do
48
71
  ctpl = ComplexView.new
49
72
  ctpl.template = content
50
73
  ctpl[:item] = items
@@ -0,0 +1,69 @@
1
+ " Vim syntax file
2
+ " Language: Mustache
3
+ " Maintainer: Juvenn Woo <machese@gmail.com>
4
+ " Screenshot: http://imgur.com/6F408
5
+ " Version: 1
6
+ " Last Change: 2009 Oct 15
7
+ " Remark:
8
+ " It lexically hilights embedded mustaches (exclusively) in html file.
9
+ " While it was written for Ruby-based Mustache template system, it should work for Google's C-based *ctemplate* as well as Erlang-based *et*. All of them are, AFAIK, based on the idea of ctemplate.
10
+ " References:
11
+ " [Mustache](http://github.com/defunkt/mustache)
12
+ " [ctemplate](http://code.google.com/p/google-ctemplate/)
13
+ " [ctemplate doc](http://google-ctemplate.googlecode.com/svn/trunk/doc/howto.html)
14
+ " [et](http://www.ivan.fomichev.name/2008/05/erlang-template-engine-prototype.html)
15
+ " TODO: Feedback is welcomed.
16
+
17
+
18
+ " Read the HTML syntax to start with
19
+ if version < 600
20
+ so <sfile>:p:h/html.vim
21
+ else
22
+ runtime! syntax/html.vim
23
+ unlet b:current_syntax
24
+ endif
25
+
26
+ if version < 600
27
+ syntax clear
28
+ elseif exists("b:current_syntax")
29
+ finish
30
+ endif
31
+
32
+ " Standard HiLink will not work with included syntax files
33
+ if version < 508
34
+ command! -nargs=+ HtmlHiLink hi link <args>
35
+ else
36
+ command! -nargs=+ HtmlHiLink hi def link <args>
37
+ endif
38
+
39
+ syntax match mustacheError '}}}\?'
40
+ syntax match mustacheInsideError '{{[{#<>=!\/]\?' containedin=@mustacheInside
41
+ syntax region mustacheVariable matchgroup=mustacheMarker start=/{{/ end=/}}/ containedin=@htmlMustacheContainer
42
+ syntax region mustacheVariableUnescape matchgroup=mustacheMarker start=/{{{/ end=/}}}/ containedin=@htmlMustacheContainer
43
+ syntax region mustacheSection matchgroup=mustacheMarker start='{{[#/]' end=/}}/ containedin=@htmlMustacheContainer
44
+ syntax region mustachePartial matchgroup=mustacheMarker start=/{{[<>]/ end=/}}/
45
+ syntax region mustacheMarkerSet matchgroup=mustacheMarker start=/{{=/ end=/=}}/
46
+ syntax region mustacheComment start=/{{!/ end=/}}/ contains=Todo containedin=htmlHead
47
+
48
+
49
+ " Clustering
50
+ syntax cluster mustacheInside add=mustacheVariable,mustacheVariableUnescape,mustacheSection,mustachePartial,mustacheMarkerSet
51
+ syntax cluster htmlMustacheContainer add=htmlHead,htmlTitle,htmlString,htmlH1,htmlH2,htmlH3,htmlH4,htmlH5,htmlH6
52
+
53
+
54
+ " Hilighting
55
+ " mustacheInside hilighted as Number, which is rarely used in html
56
+ " you might like change it to Function or Identifier
57
+ HtmlHiLink mustacheVariable Number
58
+ HtmlHiLink mustacheVariableUnescape Number
59
+ HtmlHiLink mustachePartial Number
60
+ HtmlHiLink mustacheSection Number
61
+ HtmlHiLink mustacheMarkerSet Number
62
+
63
+ HtmlHiLink mustacheComment Comment
64
+ HtmlHiLink mustacheMarker Identifier
65
+ HtmlHiLink mustacheError Error
66
+ HtmlHiLink mustacheInsideError Error
67
+
68
+ let b:current_syntax = "mustache"
69
+ delcommand HtmlHiLink
@@ -1 +1 @@
1
- <h1>{{title}}{{! just something interesting... or not... }}</h1>
1
+ <h1>{{title}}{{! just something interesting... #or not... }}</h1>
@@ -0,0 +1,7 @@
1
+ {{#t}}
2
+ * first
3
+ {{/t}}
4
+ * {{two}}
5
+ {{#t}}
6
+ * third
7
+ {{/t}}
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
+ require 'mustache'
3
+
4
+ class DoubleSection < Mustache
5
+ self.path = File.dirname(__FILE__)
6
+
7
+ def t
8
+ true
9
+ end
10
+
11
+ def two
12
+ "second"
13
+ end
14
+ end
@@ -10,6 +10,8 @@ class Mustache
10
10
  def [](name)
11
11
  if has_key?(name)
12
12
  super
13
+ elsif has_key?(name.to_s)
14
+ super(name.to_s)
13
15
  elsif @mustache.respond_to?(name)
14
16
  @mustache.send(name)
15
17
  else
@@ -76,6 +76,18 @@ class Mustache
76
76
 
77
77
  end
78
78
 
79
+ # Tell the view class its extension and path so finding partials
80
+ # works as expected.
81
+ if klass.template_extension != 'mustache'
82
+ klass.template_extension = 'mustache'
83
+ end
84
+
85
+ # Confusingly Sinatra's `views` setting tells Mustache where the
86
+ # templates are found. It's fine, blame Chris.
87
+ if klass.template_path != options.views
88
+ klass.template_path = options.views
89
+ end
90
+
79
91
  # Create a new instance for playing with
80
92
  instance = klass.new
81
93
 
@@ -47,7 +47,7 @@ class Mustache
47
47
  # If enumerable, the return value is iterated over (a `for` loop).
48
48
  def compile_sections(src)
49
49
  res = ""
50
- while src =~ /#{otag}\#(.+)#{ctag}\s*(.+)#{otag}\/\1#{ctag}\s*/m
50
+ while src =~ /#{otag}\#([^\}]*)#{ctag}\s*(.+?)#{otag}\/\1#{ctag}\s*/m
51
51
  # $` = The string to the left of the last successful match
52
52
  res << compile_tags($`)
53
53
  name = $1.strip.to_sym.inspect
@@ -85,7 +85,7 @@ class Mustache
85
85
  # 4. Partial tags - {{< partial_name }}
86
86
  def compile_tags(src)
87
87
  res = ""
88
- while src =~ /#{otag}(=|!|<|\{)?([^\/#]+?)\1?#{ctag}+/
88
+ while src =~ /#{otag}(=|!|<|\{)?(.+?)\1?#{ctag}+/
89
89
  res << str($`)
90
90
  case $1
91
91
  when '!'
@@ -1,3 +1,3 @@
1
1
  class Mustache
2
- Version = '0.3.0'
2
+ Version = '0.3.1'
3
3
  end
@@ -10,6 +10,7 @@ require 'unescaped'
10
10
  require 'comments'
11
11
  require 'passenger'
12
12
  require 'delimiters'
13
+ require 'double_section'
13
14
 
14
15
  class MustacheTest < Test::Unit::TestCase
15
16
  def test_passenger
@@ -143,7 +144,6 @@ Welcome
143
144
  end_partial
144
145
  end
145
146
 
146
-
147
147
  def test_delimiters
148
148
  assert_equal <<-end_partial, Delimiters.render
149
149
 
@@ -155,6 +155,14 @@ end_partial
155
155
  end_partial
156
156
  end
157
157
 
158
+ def test_double_section
159
+ assert_equal <<-end_section.strip, DoubleSection.render.strip
160
+ * first
161
+ * second
162
+ * third
163
+ end_section
164
+ end
165
+
158
166
  def test_comments
159
167
  assert_equal "<h1>A Comedy of Errors</h1>\n", Comments.render
160
168
  end
@@ -224,6 +232,14 @@ data
224
232
  assert_equal '<li>1234</li>', instance.render.strip
225
233
  end
226
234
 
235
+ def test_enumerable_sections_accept_a_string_keyed_hash_as_a_context
236
+ instance = Mustache.new
237
+ instance[:list] = { 'item' => 1234 }
238
+ instance.template = '{{#list}} <li>{{item}}</li> {{/list}}'
239
+
240
+ assert_equal '<li>1234</li>', instance.render.strip
241
+ end
242
+
227
243
  def test_knows_when_its_been_compiled_when_set_with_string
228
244
  klass = Class.new(Mustache)
229
245
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mustache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Wanstrath
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-14 00:00:00 -07:00
12
+ date: 2009-10-19 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -31,15 +31,19 @@ files:
31
31
  - README.md
32
32
  - Rakefile
33
33
  - benchmarks/complex.erb
34
+ - benchmarks/complex.haml
34
35
  - benchmarks/helper.rb
35
36
  - benchmarks/simple.erb
36
37
  - benchmarks/speed.rb
38
+ - contrib/mustache.vim
37
39
  - examples/comments.html
38
40
  - examples/comments.rb
39
41
  - examples/complex_view.html
40
42
  - examples/complex_view.rb
41
43
  - examples/delimiters.html
42
44
  - examples/delimiters.rb
45
+ - examples/double_section.html
46
+ - examples/double_section.rb
43
47
  - examples/escaped.html
44
48
  - examples/escaped.rb
45
49
  - examples/inner_partial.html
@@ -94,6 +98,7 @@ test_files:
94
98
  - examples/comments.rb
95
99
  - examples/complex_view.rb
96
100
  - examples/delimiters.rb
101
+ - examples/double_section.rb
97
102
  - examples/escaped.rb
98
103
  - examples/passenger.rb
99
104
  - examples/simple.rb