mustache 0.5.1 → 0.6.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.
- 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/>
|