mustache 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +30 -197
- data/Rakefile +87 -46
- data/bin/mustache +5 -29
- data/lib/mustache/context.rb +54 -11
- data/lib/mustache/template.rb +2 -14
- data/lib/mustache/version.rb +1 -1
- data/man/mustache.1 +138 -0
- data/man/mustache.1.html +168 -0
- data/man/mustache.1.ron +94 -0
- data/man/mustache.5 +364 -0
- data/man/mustache.5.html +300 -0
- data/man/mustache.5.ron +220 -0
- data/test/helper.rb +1 -0
- data/test/mustache_test.rb +19 -16
- metadata +32 -65
- data/.gitignore +0 -1
- data/.kick +0 -26
- data/CONTRIBUTORS +0 -7
- data/HISTORY.md +0 -76
- data/benchmarks/complex.erb +0 -15
- data/benchmarks/complex.haml +0 -10
- data/benchmarks/helper.rb +0 -20
- data/benchmarks/simple.erb +0 -5
- data/benchmarks/speed.rb +0 -76
- data/contrib/mustache.vim +0 -69
- data/contrib/tpl-mode.el +0 -274
- data/examples/comments.mustache +0 -1
- data/examples/comments.rb +0 -14
- data/examples/complex_view.mustache +0 -16
- data/examples/complex_view.rb +0 -34
- data/examples/delimiters.mustache +0 -6
- data/examples/delimiters.rb +0 -22
- data/examples/double_section.mustache +0 -7
- data/examples/double_section.rb +0 -14
- data/examples/escaped.mustache +0 -1
- data/examples/escaped.rb +0 -14
- data/examples/inner_partial.mustache +0 -1
- data/examples/inner_partial.txt +0 -1
- data/examples/namespaced.mustache +0 -1
- data/examples/namespaced.rb +0 -25
- data/examples/partial_with_module.mustache +0 -3
- data/examples/partial_with_module.rb +0 -37
- data/examples/passenger.conf +0 -5
- data/examples/passenger.rb +0 -27
- data/examples/simple.mustache +0 -5
- data/examples/simple.rb +0 -26
- data/examples/template_partial.mustache +0 -2
- data/examples/template_partial.rb +0 -18
- data/examples/template_partial.txt +0 -4
- data/examples/unescaped.mustache +0 -1
- data/examples/unescaped.rb +0 -14
data/man/mustache.5.ron
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
mustache(5) -- Logic-less templates.
|
2
|
+
====================================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
A typical Mustache template:
|
7
|
+
|
8
|
+
Hello {{name}}
|
9
|
+
You have just won ${{value}}!
|
10
|
+
{{#in_ca}}
|
11
|
+
Well, ${{taxed_value}}, after taxes.
|
12
|
+
{{/in_ca}}
|
13
|
+
|
14
|
+
Given the following hash:
|
15
|
+
|
16
|
+
{
|
17
|
+
"name": "Chris",
|
18
|
+
"value": 10000,
|
19
|
+
"taxed_value": 10000 - (10000 * 0.4),
|
20
|
+
"in_ca": true
|
21
|
+
}
|
22
|
+
|
23
|
+
Will produce the following:
|
24
|
+
|
25
|
+
Hello Chris
|
26
|
+
You have just won $10000!
|
27
|
+
Well, $6000.0, after taxes.
|
28
|
+
|
29
|
+
|
30
|
+
## DESCRIPTION
|
31
|
+
|
32
|
+
Mustache can be used for HTML, config files, source code -
|
33
|
+
anything. It works by expanding tags in a template using values
|
34
|
+
provided in a hash or object.
|
35
|
+
|
36
|
+
We call it "logic-less" because there are no if statements, else
|
37
|
+
clauses, or for loops. Instead there are only tags. Some tags are
|
38
|
+
replaced with a value, some nothing, and others a series of
|
39
|
+
values. This document explains the different types of Mustache tags.
|
40
|
+
|
41
|
+
|
42
|
+
## TAG TYPES
|
43
|
+
|
44
|
+
Tags are indicated by the double mustaches. `{{name}}` is a tag. Let's
|
45
|
+
talk about the different types of tags.
|
46
|
+
|
47
|
+
|
48
|
+
### Variables
|
49
|
+
|
50
|
+
The most basic tag is the variable. A `{{name}}` tag in a basic
|
51
|
+
template will try to call the `name` method on your view. If there is
|
52
|
+
no `name` method, an exception will be raised.
|
53
|
+
|
54
|
+
All variables are HTML escaped by default. If you want to return
|
55
|
+
unescaped HTML, use the triple mustache: `{{{name}}}`.
|
56
|
+
|
57
|
+
By default a variable "miss" returns an empty string. This can usually
|
58
|
+
be configured in your Mustache library.
|
59
|
+
|
60
|
+
Template:
|
61
|
+
|
62
|
+
* {{name}}
|
63
|
+
* {{age}}
|
64
|
+
* {{company}}
|
65
|
+
* {{{company}}}
|
66
|
+
|
67
|
+
Hash:
|
68
|
+
|
69
|
+
{
|
70
|
+
"name": "Chris",
|
71
|
+
"company": "<b>GitHub</b>"
|
72
|
+
}
|
73
|
+
|
74
|
+
Output:
|
75
|
+
|
76
|
+
* Chris
|
77
|
+
*
|
78
|
+
* <b>GitHub</b>
|
79
|
+
* <b>GitHub</b>
|
80
|
+
|
81
|
+
### Boolean Sections
|
82
|
+
|
83
|
+
A section begins with a pound and ends with a slash. That is,
|
84
|
+
`{{#person}}` begins a "person" section while `{{/person}}` ends it.
|
85
|
+
|
86
|
+
If the `person` key exists and calling it returns false, the HTML
|
87
|
+
between the pound and slash will not be displayed.
|
88
|
+
|
89
|
+
If the `person` method exists and calling it returns true, the HTML
|
90
|
+
between the pound and slash will be rendered and displayed.
|
91
|
+
|
92
|
+
Template:
|
93
|
+
|
94
|
+
{{#person}}
|
95
|
+
Shown!
|
96
|
+
{{/person}}
|
97
|
+
{{#anything_else}}
|
98
|
+
Never shown!
|
99
|
+
{{/anything_else}}
|
100
|
+
|
101
|
+
Hash:
|
102
|
+
|
103
|
+
{
|
104
|
+
"person": true
|
105
|
+
}
|
106
|
+
|
107
|
+
Output:
|
108
|
+
|
109
|
+
Shown!
|
110
|
+
|
111
|
+
### Enumerable Sections
|
112
|
+
|
113
|
+
Enumerable sections are syntactically identical to boolean sections in
|
114
|
+
that they begin with a pound and end with a slash. The difference,
|
115
|
+
however, is in the view: if the method called returns an enumerable,
|
116
|
+
the section is repeated as the enumerable is iterated over.
|
117
|
+
|
118
|
+
Each item in the enumerable is expected to be a hash which will then
|
119
|
+
become the context of the corresponding iteration. In this way we can
|
120
|
+
construct loops.
|
121
|
+
|
122
|
+
Template:
|
123
|
+
|
124
|
+
{{#repo}}
|
125
|
+
<b>{{name}}</b>
|
126
|
+
{{/repo}}
|
127
|
+
|
128
|
+
Hash:
|
129
|
+
|
130
|
+
{
|
131
|
+
"repo": [
|
132
|
+
{ "name": "resque" },
|
133
|
+
{ "name": "hub" },
|
134
|
+
{ "name": "rip" },
|
135
|
+
]
|
136
|
+
}
|
137
|
+
|
138
|
+
Output:
|
139
|
+
|
140
|
+
<b>resque</b>
|
141
|
+
<b>hub</b>
|
142
|
+
<b>rip</b>
|
143
|
+
|
144
|
+
|
145
|
+
### Comments
|
146
|
+
|
147
|
+
Comments begin with a bang and are ignored. The following template:
|
148
|
+
|
149
|
+
<h1>Today{{! ignore me }}.</h1>
|
150
|
+
|
151
|
+
Will render as follows:
|
152
|
+
|
153
|
+
<h1>Today.</h1>
|
154
|
+
|
155
|
+
|
156
|
+
### Partials
|
157
|
+
|
158
|
+
Partials begin with a greater than sign, like `{{> box}}`.
|
159
|
+
|
160
|
+
It is useful to think of partials as a "template expansion" - that is,
|
161
|
+
the actual partial tag will be replaced with the content of the
|
162
|
+
partial. Therefor partials share the current context.
|
163
|
+
|
164
|
+
For example, this template and partial:
|
165
|
+
|
166
|
+
base.mustache:
|
167
|
+
<h2>Names</h2>
|
168
|
+
{{# names }}
|
169
|
+
{{> user }}
|
170
|
+
{{/ names }}
|
171
|
+
|
172
|
+
user.mustache:
|
173
|
+
<strong>{{ name }}</strong>
|
174
|
+
|
175
|
+
Can be thought of as a single, expanded template:
|
176
|
+
|
177
|
+
<h2>Names</h2>
|
178
|
+
{{# names }}
|
179
|
+
<strong>{{ name }}</strong>
|
180
|
+
{{/ names }}
|
181
|
+
|
182
|
+
|
183
|
+
### Set Delimiter
|
184
|
+
|
185
|
+
Set Delimiter tags start with an equal sign and change the tag
|
186
|
+
delimiters from {{ and }} to custom strings.
|
187
|
+
|
188
|
+
Consider the following contrived example:
|
189
|
+
|
190
|
+
* {{ default_tags }}
|
191
|
+
{{=<% %>=}}
|
192
|
+
* <% erb_style_tags %>
|
193
|
+
<%={{ }}=%>
|
194
|
+
* {{ default_tags_again }}
|
195
|
+
|
196
|
+
Here we have a list with three items. The first item uses the default
|
197
|
+
tag style, the second uses erb style as defined by the Set Delimiter
|
198
|
+
tag, and the third returns to the default style after yet another Set
|
199
|
+
Delimiter declaration.
|
200
|
+
|
201
|
+
According to [ctemplates][ct], this "is useful for languages like TeX, where
|
202
|
+
double-braces may occur in the text and are awkward to use for
|
203
|
+
markup."
|
204
|
+
|
205
|
+
Custom delimiters may not contain whitespace or the equals sign.
|
206
|
+
|
207
|
+
[ct]: http://google-ctemplate.googlecode.com/svn/trunk/doc/howto.html
|
208
|
+
|
209
|
+
|
210
|
+
## COPYRIGHT
|
211
|
+
|
212
|
+
Mustache is Copyright (C) 2009 Chris Wanstrath
|
213
|
+
|
214
|
+
Original CTemplate by Google
|
215
|
+
|
216
|
+
|
217
|
+
## SEE ALSO
|
218
|
+
|
219
|
+
mustache(1), mustache(7), gem(1),
|
220
|
+
<http://defunkt.github.com/mustache/>
|
data/test/helper.rb
CHANGED
data/test/mustache_test.rb
CHANGED
@@ -21,17 +21,17 @@ end_passenger
|
|
21
21
|
<li><a href="#Blue">blue</a></li>
|
22
22
|
</ul>
|
23
23
|
end_complex
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
# end_complex
|
26
|
+
def test_nested_objects
|
27
|
+
assert_equal <<-end_complex, NestedObjects.render
|
28
|
+
<h1>Colors</h1>
|
29
|
+
<ul>
|
30
|
+
<li><strong>red</strong></li>
|
31
|
+
<li><a href="#Green">green</a></li>
|
32
|
+
<li><a href="#Blue">blue</a></li>
|
33
|
+
</ul>
|
34
|
+
end_complex
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_single_line_sections
|
@@ -178,14 +178,17 @@ data
|
|
178
178
|
:deploy_to => '/var/www/example.com' )
|
179
179
|
end
|
180
180
|
|
181
|
-
def
|
181
|
+
def test_doesnt_execute_what_it_doesnt_need_to
|
182
182
|
instance = Mustache.new
|
183
|
-
instance[:
|
184
|
-
instance.
|
185
|
-
|
186
|
-
|
187
|
-
|
183
|
+
instance[:show] = false
|
184
|
+
instance.instance_eval do
|
185
|
+
def die
|
186
|
+
raise "bummer"
|
187
|
+
end
|
188
188
|
end
|
189
|
+
instance.template = '{{#show}} <li>{{die}}</li> {{/show}} yay'
|
190
|
+
|
191
|
+
assert_equal "yay", instance.render
|
189
192
|
end
|
190
193
|
|
191
194
|
def test_reports_unclosed_sections
|
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.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wanstrath
|
@@ -9,68 +9,49 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
13
|
-
default_executable:
|
12
|
+
date: 2010-03-08 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description:
|
16
|
+
description: |
|
17
|
+
Inspired by ctemplate, Mustache is a framework-agnostic way to render
|
18
|
+
logic-free views.
|
19
|
+
|
20
|
+
As ctemplates says, "It emphasizes separating logic from presentation:
|
21
|
+
it is impossible to embed application logic in this template
|
22
|
+
language.
|
23
|
+
|
24
|
+
Think of Mustache as a replacement for your views. Instead of views
|
25
|
+
consisting of ERB or HAML with random helpers and arbitrary logic,
|
26
|
+
your views are broken into two parts: a Ruby class and an HTML
|
27
|
+
template.
|
28
|
+
|
17
29
|
email: chris@ozmm.org
|
18
30
|
executables:
|
19
31
|
- mustache
|
20
32
|
extensions: []
|
21
33
|
|
22
|
-
extra_rdoc_files:
|
23
|
-
|
24
|
-
- README.md
|
34
|
+
extra_rdoc_files: []
|
35
|
+
|
25
36
|
files:
|
26
|
-
- .gitignore
|
27
|
-
- .kick
|
28
|
-
- CONTRIBUTORS
|
29
|
-
- HISTORY.md
|
30
|
-
- LICENSE
|
31
37
|
- README.md
|
32
38
|
- Rakefile
|
33
|
-
-
|
34
|
-
- benchmarks/complex.haml
|
35
|
-
- benchmarks/helper.rb
|
36
|
-
- benchmarks/simple.erb
|
37
|
-
- benchmarks/speed.rb
|
38
|
-
- bin/mustache
|
39
|
-
- contrib/mustache.vim
|
40
|
-
- contrib/tpl-mode.el
|
41
|
-
- examples/comments.mustache
|
42
|
-
- examples/comments.rb
|
43
|
-
- examples/complex_view.mustache
|
44
|
-
- examples/complex_view.rb
|
45
|
-
- examples/delimiters.mustache
|
46
|
-
- examples/delimiters.rb
|
47
|
-
- examples/double_section.mustache
|
48
|
-
- examples/double_section.rb
|
49
|
-
- examples/escaped.mustache
|
50
|
-
- examples/escaped.rb
|
51
|
-
- examples/inner_partial.mustache
|
52
|
-
- examples/inner_partial.txt
|
53
|
-
- examples/namespaced.mustache
|
54
|
-
- examples/namespaced.rb
|
55
|
-
- examples/partial_with_module.mustache
|
56
|
-
- examples/partial_with_module.rb
|
57
|
-
- examples/passenger.conf
|
58
|
-
- examples/passenger.rb
|
59
|
-
- examples/simple.mustache
|
60
|
-
- examples/simple.rb
|
61
|
-
- examples/template_partial.mustache
|
62
|
-
- examples/template_partial.rb
|
63
|
-
- examples/template_partial.txt
|
64
|
-
- examples/unescaped.mustache
|
65
|
-
- examples/unescaped.rb
|
66
|
-
- lib/mustache.rb
|
39
|
+
- LICENSE
|
67
40
|
- lib/mustache/context.rb
|
68
41
|
- lib/mustache/sinatra.rb
|
69
42
|
- lib/mustache/template.rb
|
70
43
|
- lib/mustache/version.rb
|
71
|
-
- lib/
|
44
|
+
- lib/mustache.rb
|
72
45
|
- lib/rack/bug/panels/mustache_panel/mustache_extension.rb
|
73
46
|
- lib/rack/bug/panels/mustache_panel/view.mustache
|
47
|
+
- lib/rack/bug/panels/mustache_panel.rb
|
48
|
+
- bin/mustache
|
49
|
+
- man/mustache.1
|
50
|
+
- man/mustache.1.html
|
51
|
+
- man/mustache.1.ron
|
52
|
+
- man/mustache.5
|
53
|
+
- man/mustache.5.html
|
54
|
+
- man/mustache.5.ron
|
74
55
|
- test/autoloading_test.rb
|
75
56
|
- test/helper.rb
|
76
57
|
- test/mustache_test.rb
|
@@ -80,8 +61,8 @@ homepage: http://github.com/defunkt/mustache
|
|
80
61
|
licenses: []
|
81
62
|
|
82
63
|
post_install_message:
|
83
|
-
rdoc_options:
|
84
|
-
|
64
|
+
rdoc_options: []
|
65
|
+
|
85
66
|
require_paths:
|
86
67
|
- lib
|
87
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -103,19 +84,5 @@ rubygems_version: 1.3.5
|
|
103
84
|
signing_key:
|
104
85
|
specification_version: 3
|
105
86
|
summary: Mustache is a framework-agnostic way to render logic-free views.
|
106
|
-
test_files:
|
107
|
-
|
108
|
-
- test/helper.rb
|
109
|
-
- test/mustache_test.rb
|
110
|
-
- test/partial_test.rb
|
111
|
-
- examples/comments.rb
|
112
|
-
- examples/complex_view.rb
|
113
|
-
- examples/delimiters.rb
|
114
|
-
- examples/double_section.rb
|
115
|
-
- examples/escaped.rb
|
116
|
-
- examples/namespaced.rb
|
117
|
-
- examples/partial_with_module.rb
|
118
|
-
- examples/passenger.rb
|
119
|
-
- examples/simple.rb
|
120
|
-
- examples/template_partial.rb
|
121
|
-
- examples/unescaped.rb
|
87
|
+
test_files: []
|
88
|
+
|
data/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
docs
|
data/.kick
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# take control of the growl notifications
|
2
|
-
module GrowlHacks
|
3
|
-
def growl(type, subject, body, *args, &block)
|
4
|
-
case type
|
5
|
-
when Kicker::GROWL_NOTIFICATIONS[:succeeded]
|
6
|
-
puts subject = "Success"
|
7
|
-
body = body.split("\n").last
|
8
|
-
when Kicker::GROWL_NOTIFICATIONS[:failed]
|
9
|
-
subject = "Failure"
|
10
|
-
puts body
|
11
|
-
body = body.split("\n").last
|
12
|
-
else
|
13
|
-
return nil
|
14
|
-
end
|
15
|
-
super(type, subject, body, *args, &block)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
Kicker.send :extend, GrowlHacks
|
20
|
-
|
21
|
-
# no logging
|
22
|
-
Kicker::Utils.module_eval do
|
23
|
-
def log(message)
|
24
|
-
nil
|
25
|
-
end
|
26
|
-
end
|