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/lib/mustache/context.rb
CHANGED
@@ -11,23 +11,66 @@ class Mustache
|
|
11
11
|
|
12
12
|
# A Context represents the context which a Mustache template is
|
13
13
|
# executed within. All Mustache tags reference keys in the Context.
|
14
|
-
class Context
|
14
|
+
class Context
|
15
|
+
# Expect to be passed an instance of `Mustache`.
|
15
16
|
def initialize(mustache)
|
16
17
|
@mustache = mustache
|
17
|
-
|
18
|
+
@stack = [@mustache]
|
18
19
|
end
|
19
20
|
|
21
|
+
# Adds a new object to the context's internal stack.
|
22
|
+
#
|
23
|
+
# Returns the Context.
|
24
|
+
def push(new)
|
25
|
+
@stack.unshift(new)
|
26
|
+
self
|
27
|
+
end
|
28
|
+
alias_method :update, :push
|
29
|
+
|
30
|
+
# Removes the most recently added object from the context's
|
31
|
+
# internal stack.
|
32
|
+
#
|
33
|
+
# Returns the Context.
|
34
|
+
def pop
|
35
|
+
@stack.shift
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
# Can be used to add a value to the context in a hash-like way.
|
40
|
+
#
|
41
|
+
# context[:name] = "Chris"
|
42
|
+
def []=(name, value)
|
43
|
+
push(name => value)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Alias for `fetch`.
|
20
47
|
def [](name)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
48
|
+
fetch(name, nil)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Similar to Hash#fetch, finds a value by `name` in the context's
|
52
|
+
# stack. You may specify the default return value by passing a
|
53
|
+
# second parameter.
|
54
|
+
#
|
55
|
+
# If no second parameter is passed (or raise_on_context_miss is
|
56
|
+
# set to true), will raise a ContextMiss exception on miss.
|
57
|
+
def fetch(name, default = :__raise)
|
58
|
+
@stack.each do |frame|
|
59
|
+
hash = frame.respond_to?(:has_key?)
|
60
|
+
|
61
|
+
if hash && frame.has_key?(name)
|
62
|
+
return frame[name]
|
63
|
+
elsif hash && frame.has_key?(name.to_s)
|
64
|
+
return frame[name.to_s]
|
65
|
+
elsif !hash && frame.respond_to?(name)
|
66
|
+
return frame.__send__(name)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if default == :__raise || @mustache.raise_on_context_miss?
|
71
|
+
raise ContextMiss.new("Can't find #{name} in #{@stack.inspect}")
|
29
72
|
else
|
30
|
-
|
73
|
+
default
|
31
74
|
end
|
32
75
|
end
|
33
76
|
end
|
data/lib/mustache/template.rb
CHANGED
@@ -76,20 +76,8 @@ class Mustache
|
|
76
76
|
ctxtmp = "ctx#{tmpid}"
|
77
77
|
res << ev(<<-compiled)
|
78
78
|
if v = ctx[#{name}]
|
79
|
-
v = [v]
|
80
|
-
|
81
|
-
#{ctxtmp} = ctx.dup
|
82
|
-
begin
|
83
|
-
r = v.map { |h| ctx.update(h); #{code} }.join
|
84
|
-
rescue TypeError => e
|
85
|
-
raise TypeError,
|
86
|
-
"All elements in {{#{name.to_s[1..-1]}}} are not hashes!"
|
87
|
-
end
|
88
|
-
ctx.replace(#{ctxtmp})
|
89
|
-
r
|
90
|
-
else
|
91
|
-
#{code}
|
92
|
-
end
|
79
|
+
v = [v] unless v.is_a?(Array) # shortcut when passed non-array
|
80
|
+
v.map { |h| ctx.push(h); c = #{code}; ctx.pop; c }.join
|
93
81
|
end
|
94
82
|
compiled
|
95
83
|
# $' = The string to the right of the last successful match
|
data/lib/mustache/version.rb
CHANGED
data/man/mustache.1
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
.\" generated with Ron/v0.3
|
2
|
+
.\" http://github.com/rtomayko/ron/
|
3
|
+
.
|
4
|
+
.TH "MUSTACHE" "1" "March 2010" "DEFUNKT" "Mustache Manual"
|
5
|
+
.
|
6
|
+
.SH "NAME"
|
7
|
+
\fBmustache\fR \-\- Mustache processor
|
8
|
+
.
|
9
|
+
.SH "SYNOPSIS"
|
10
|
+
\fBcat data.yml template.mustache | mustache\fR
|
11
|
+
.
|
12
|
+
.SH "DESCRIPTION"
|
13
|
+
Mustache is a logic\-less templating system for HTML, config files,
|
14
|
+
anything.
|
15
|
+
.
|
16
|
+
.P
|
17
|
+
The \fBmustache\fR command processes a Mustache template preceded by YAML
|
18
|
+
frontmatter from standard input and prints one or more documents to
|
19
|
+
standard output.
|
20
|
+
.
|
21
|
+
.P
|
22
|
+
YAML frontmatter beings with \fB---\fR on a single line, followed by YAML,
|
23
|
+
ending with another \fB---\fR on a single line, e.g.
|
24
|
+
.
|
25
|
+
.IP "" 4
|
26
|
+
.
|
27
|
+
.nf
|
28
|
+
|
29
|
+
\fB---
|
30
|
+
names: [ {name: chris}, {name: mark}, {name: scott} ]
|
31
|
+
--- \fR
|
32
|
+
.
|
33
|
+
.fi
|
34
|
+
.
|
35
|
+
.IP "" 0
|
36
|
+
.
|
37
|
+
.P
|
38
|
+
If you are unfamiliar with YAML, it is a superset of JSON. Valid JSON
|
39
|
+
should work fine.
|
40
|
+
.
|
41
|
+
.P
|
42
|
+
After the frontmatter should come any valid Mustache template. See
|
43
|
+
mustache(5) for an overview of Mustache templates.
|
44
|
+
.
|
45
|
+
.P
|
46
|
+
For example:
|
47
|
+
.
|
48
|
+
.IP "" 4
|
49
|
+
.
|
50
|
+
.nf
|
51
|
+
|
52
|
+
\fB{{#names}}
|
53
|
+
Hi {{name}}!
|
54
|
+
{{/names}} \fR
|
55
|
+
.
|
56
|
+
.fi
|
57
|
+
.
|
58
|
+
.IP "" 0
|
59
|
+
.
|
60
|
+
.P
|
61
|
+
Now let's combine them.
|
62
|
+
.
|
63
|
+
.IP "" 4
|
64
|
+
.
|
65
|
+
.nf
|
66
|
+
|
67
|
+
\fB$ cat data.yml
|
68
|
+
---
|
69
|
+
names: [ {name: chris}, {name: mark}, {name: scott} ]
|
70
|
+
---
|
71
|
+
$ cat template.mustache
|
72
|
+
{{#names}}
|
73
|
+
Hi {{name}}!
|
74
|
+
{{/names}}
|
75
|
+
|
76
|
+
$ cat data.yml template.mustache | mustache
|
77
|
+
Hi chris!
|
78
|
+
Hi mark!
|
79
|
+
Hi scott!
|
80
|
+
\fR
|
81
|
+
.
|
82
|
+
.fi
|
83
|
+
.
|
84
|
+
.IP "" 0
|
85
|
+
.
|
86
|
+
.P
|
87
|
+
If you provide multiple YAML documents (as delimited by \fB---\fR), your
|
88
|
+
template will be rendered multiple times. Like a mail merge.
|
89
|
+
.
|
90
|
+
.P
|
91
|
+
For example:
|
92
|
+
.
|
93
|
+
.IP "" 4
|
94
|
+
.
|
95
|
+
.nf
|
96
|
+
|
97
|
+
\fB$ cat data.yml
|
98
|
+
---
|
99
|
+
name: chris
|
100
|
+
---
|
101
|
+
name: mark
|
102
|
+
---
|
103
|
+
name: scott
|
104
|
+
---
|
105
|
+
$ cat template.mustache
|
106
|
+
Hi {{name}}!
|
107
|
+
|
108
|
+
$ cat data.yml template.mustache | mustache
|
109
|
+
Hi chris!
|
110
|
+
Hi mark!
|
111
|
+
Hi scott!
|
112
|
+
\fR
|
113
|
+
.
|
114
|
+
.fi
|
115
|
+
.
|
116
|
+
.IP "" 0
|
117
|
+
.
|
118
|
+
.SH "INSTALLATION"
|
119
|
+
If you have RubyGems installed:
|
120
|
+
.
|
121
|
+
.IP "" 4
|
122
|
+
.
|
123
|
+
.nf
|
124
|
+
|
125
|
+
\fBgem install mustache \fR
|
126
|
+
.
|
127
|
+
.fi
|
128
|
+
.
|
129
|
+
.IP "" 0
|
130
|
+
.
|
131
|
+
.SH "COPYRIGHT"
|
132
|
+
Mustache is Copyright (C) 2009 Chris Wanstrath
|
133
|
+
.
|
134
|
+
.P
|
135
|
+
Original CTemplate by Google
|
136
|
+
.
|
137
|
+
.SH "SEE ALSO"
|
138
|
+
mustache(5), mustache(7), gem(1),\fIhttp://defunkt.github.com/mustache/\fR
|
data/man/mustache.1.html
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
5
|
+
<meta name='generator' value='Ron/v0.3'>
|
6
|
+
<title>mustache(1) -- Mustache processor</title>
|
7
|
+
<style type='text/css'>
|
8
|
+
body {margin:0}
|
9
|
+
#man, #man code, #man pre, #man tt, #man kbd, #man samp {
|
10
|
+
font-family:consolas,monospace;
|
11
|
+
font-size:16px;
|
12
|
+
line-height:1.3;
|
13
|
+
color:#343331;
|
14
|
+
background:#fff; }
|
15
|
+
#man { max-width:89ex; text-align:justify; margin:0 25px 25px 25px }
|
16
|
+
#man h1, #man h2, #man h3 { color:#232221;clear:left }
|
17
|
+
#man h1 { font-size:28px; margin:15px 0 30px 0; text-align:center }
|
18
|
+
#man h2 { font-size:18px; margin-bottom:0; margin-top:10px; line-height:1.3; }
|
19
|
+
#man h3 { font-size:16px; margin:0 0 0 4ex; }
|
20
|
+
#man p, #man ul, #man ol, #man dl, #man pre { margin:0 0 18px 0; }
|
21
|
+
#man pre {
|
22
|
+
color:#333231;
|
23
|
+
background:#edeceb;
|
24
|
+
padding:5px 7px;
|
25
|
+
margin:0px 0 20px 0;
|
26
|
+
border-left:2ex solid #ddd}
|
27
|
+
#man pre + h2, #man pre + h3 {
|
28
|
+
margin-top:22px;
|
29
|
+
}
|
30
|
+
#man h2 + pre, #man h3 + pre {
|
31
|
+
margin-top:5px;
|
32
|
+
}
|
33
|
+
#man > p, #man > ul, #man > ol, #man > dl, #man > pre { margin-left:8ex; }
|
34
|
+
#man dt { margin:0; clear:left }
|
35
|
+
#man dt.flush { float:left; width:8ex }
|
36
|
+
#man dd { margin:0 0 0 9ex }
|
37
|
+
#man code, #man strong, #man b { font-weight:bold; color:#131211; }
|
38
|
+
#man pre code { font-weight:normal; color:#232221; background:inherit }
|
39
|
+
#man em, var, u {
|
40
|
+
font-style:normal; color:#333231; border-bottom:1px solid #999; }
|
41
|
+
#man h1.man-title { display:none; }
|
42
|
+
#man ol.man, #man ol.man li { margin:2px 0 10px 0; padding:0;
|
43
|
+
float:left; width:33%; list-style-type:none;
|
44
|
+
text-transform:uppercase; font-size:18px; color:#999;
|
45
|
+
letter-spacing:1px;}
|
46
|
+
#man ol.man { width:100%; }
|
47
|
+
#man ol.man li.tl { text-align:left }
|
48
|
+
#man ol.man li.tc { text-align:center;letter-spacing:4px }
|
49
|
+
#man ol.man li.tr { text-align:right }
|
50
|
+
#man ol.man a { color:#999 }
|
51
|
+
#man ol.man a:hover { color:#333231 }
|
52
|
+
</style>
|
53
|
+
</head>
|
54
|
+
<body>
|
55
|
+
<div id='man'>
|
56
|
+
|
57
|
+
<h1 class='man-title'>mustache(1)</h1>
|
58
|
+
|
59
|
+
<ol class='head man'>
|
60
|
+
<li class='tl'>mustache(1)</li>
|
61
|
+
<li class='tc'>Mustache Manual</li>
|
62
|
+
<li class='tr'>mustache(1)</li>
|
63
|
+
</ol>
|
64
|
+
|
65
|
+
<h2 id='NAME'>NAME</h2>
|
66
|
+
<p><code>mustache</code> -- Mustache processor</p>
|
67
|
+
<h2>SYNOPSIS</h2>
|
68
|
+
|
69
|
+
<p><code>cat data.yml template.mustache | mustache</code></p>
|
70
|
+
|
71
|
+
<h2>DESCRIPTION</h2>
|
72
|
+
|
73
|
+
<p>Mustache is a logic-less templating system for HTML, config files,
|
74
|
+
anything.</p>
|
75
|
+
|
76
|
+
<p>The <code>mustache</code> command processes a Mustache template preceded by YAML
|
77
|
+
frontmatter from standard input and prints one or more documents to
|
78
|
+
standard output.</p>
|
79
|
+
|
80
|
+
<p>YAML frontmatter beings with <code>---</code> on a single line, followed by YAML,
|
81
|
+
ending with another <code>---</code> on a single line, e.g.</p>
|
82
|
+
|
83
|
+
<pre><code>---
|
84
|
+
names: [ {name: chris}, {name: mark}, {name: scott} ]
|
85
|
+
---
|
86
|
+
</code></pre>
|
87
|
+
|
88
|
+
<p>If you are unfamiliar with YAML, it is a superset of JSON. Valid JSON
|
89
|
+
should work fine.</p>
|
90
|
+
|
91
|
+
<p>After the frontmatter should come any valid Mustache template. See
|
92
|
+
mustache(5) for an overview of Mustache templates.</p>
|
93
|
+
|
94
|
+
<p>For example:</p>
|
95
|
+
|
96
|
+
<pre><code>{{#names}}
|
97
|
+
Hi {{name}}!
|
98
|
+
{{/names}}
|
99
|
+
</code></pre>
|
100
|
+
|
101
|
+
<p>Now let's combine them.</p>
|
102
|
+
|
103
|
+
<pre><code>$ cat data.yml
|
104
|
+
---
|
105
|
+
names: [ {name: chris}, {name: mark}, {name: scott} ]
|
106
|
+
---
|
107
|
+
|
108
|
+
$ cat template.mustache
|
109
|
+
{{#names}}
|
110
|
+
Hi {{name}}!
|
111
|
+
{{/names}}
|
112
|
+
|
113
|
+
$ cat data.yml template.mustache | mustache
|
114
|
+
Hi chris!
|
115
|
+
Hi mark!
|
116
|
+
Hi scott!
|
117
|
+
</code></pre>
|
118
|
+
|
119
|
+
<p>If you provide multiple YAML documents (as delimited by <code>---</code>), your
|
120
|
+
template will be rendered multiple times. Like a mail merge.</p>
|
121
|
+
|
122
|
+
<p>For example:</p>
|
123
|
+
|
124
|
+
<pre><code>$ cat data.yml
|
125
|
+
---
|
126
|
+
name: chris
|
127
|
+
---
|
128
|
+
name: mark
|
129
|
+
---
|
130
|
+
name: scott
|
131
|
+
---
|
132
|
+
|
133
|
+
$ cat template.mustache
|
134
|
+
Hi {{name}}!
|
135
|
+
|
136
|
+
$ cat data.yml template.mustache | mustache
|
137
|
+
Hi chris!
|
138
|
+
Hi mark!
|
139
|
+
Hi scott!
|
140
|
+
</code></pre>
|
141
|
+
|
142
|
+
<h2>INSTALLATION</h2>
|
143
|
+
|
144
|
+
<p>If you have RubyGems installed:</p>
|
145
|
+
|
146
|
+
<pre><code>gem install mustache
|
147
|
+
</code></pre>
|
148
|
+
|
149
|
+
<h2>COPYRIGHT</h2>
|
150
|
+
|
151
|
+
<p>Mustache is Copyright (C) 2009 Chris Wanstrath</p>
|
152
|
+
|
153
|
+
<p>Original CTemplate by Google</p>
|
154
|
+
|
155
|
+
<h2>SEE ALSO</h2>
|
156
|
+
|
157
|
+
<p>mustache(5), mustache(7), gem(1),
|
158
|
+
<a href="http://defunkt.github.com/mustache/">http://defunkt.github.com/mustache/</a></p>
|
159
|
+
|
160
|
+
<ol class='foot man'>
|
161
|
+
<li class='tl'>DEFUNKT</li>
|
162
|
+
<li class='tc'>March 2010</li>
|
163
|
+
<li class='tr'>mustache(1)</li>
|
164
|
+
</ol>
|
165
|
+
|
166
|
+
</div>
|
167
|
+
</body>
|
168
|
+
</html>
|
data/man/mustache.1.ron
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
mustache(1) -- Mustache processor
|
2
|
+
=================================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`cat data.yml template.mustache | mustache`
|
7
|
+
|
8
|
+
|
9
|
+
## DESCRIPTION
|
10
|
+
|
11
|
+
Mustache is a logic-less templating system for HTML, config files,
|
12
|
+
anything.
|
13
|
+
|
14
|
+
The `mustache` command processes a Mustache template preceded by YAML
|
15
|
+
frontmatter from standard input and prints one or more documents to
|
16
|
+
standard output.
|
17
|
+
|
18
|
+
YAML frontmatter beings with `---` on a single line, followed by YAML,
|
19
|
+
ending with another `---` on a single line, e.g.
|
20
|
+
|
21
|
+
---
|
22
|
+
names: [ {name: chris}, {name: mark}, {name: scott} ]
|
23
|
+
---
|
24
|
+
|
25
|
+
If you are unfamiliar with YAML, it is a superset of JSON. Valid JSON
|
26
|
+
should work fine.
|
27
|
+
|
28
|
+
After the frontmatter should come any valid Mustache template. See
|
29
|
+
mustache(5) for an overview of Mustache templates.
|
30
|
+
|
31
|
+
For example:
|
32
|
+
|
33
|
+
{{#names}}
|
34
|
+
Hi {{name}}!
|
35
|
+
{{/names}}
|
36
|
+
|
37
|
+
Now let's combine them.
|
38
|
+
|
39
|
+
$ cat data.yml
|
40
|
+
---
|
41
|
+
names: [ {name: chris}, {name: mark}, {name: scott} ]
|
42
|
+
---
|
43
|
+
|
44
|
+
$ cat template.mustache
|
45
|
+
{{#names}}
|
46
|
+
Hi {{name}}!
|
47
|
+
{{/names}}
|
48
|
+
|
49
|
+
$ cat data.yml template.mustache | mustache
|
50
|
+
Hi chris!
|
51
|
+
Hi mark!
|
52
|
+
Hi scott!
|
53
|
+
|
54
|
+
If you provide multiple YAML documents (as delimited by `---`), your
|
55
|
+
template will be rendered multiple times. Like a mail merge.
|
56
|
+
|
57
|
+
For example:
|
58
|
+
|
59
|
+
$ cat data.yml
|
60
|
+
---
|
61
|
+
name: chris
|
62
|
+
---
|
63
|
+
name: mark
|
64
|
+
---
|
65
|
+
name: scott
|
66
|
+
---
|
67
|
+
|
68
|
+
$ cat template.mustache
|
69
|
+
Hi {{name}}!
|
70
|
+
|
71
|
+
$ cat data.yml template.mustache | mustache
|
72
|
+
Hi chris!
|
73
|
+
Hi mark!
|
74
|
+
Hi scott!
|
75
|
+
|
76
|
+
|
77
|
+
## INSTALLATION
|
78
|
+
|
79
|
+
If you have RubyGems installed:
|
80
|
+
|
81
|
+
gem install mustache
|
82
|
+
|
83
|
+
|
84
|
+
## COPYRIGHT
|
85
|
+
|
86
|
+
Mustache is Copyright (C) 2009 Chris Wanstrath
|
87
|
+
|
88
|
+
Original CTemplate by Google
|
89
|
+
|
90
|
+
|
91
|
+
## SEE ALSO
|
92
|
+
|
93
|
+
mustache(5), mustache(7), gem(1),
|
94
|
+
<http://defunkt.github.com/mustache/>
|