mustache 0.99.5 → 0.99.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a22fd6d24b05a356ea96d520d05b1d558789a55
4
- data.tar.gz: 434c410c4f8eec4c004ce4dce27d9cc7e6e8d03a
3
+ metadata.gz: e3c1091a71418634c3e493d6b3aae1e5a8f0d0f0
4
+ data.tar.gz: 87936c1b015243222b2c95c29693106a9ea646a1
5
5
  SHA512:
6
- metadata.gz: 3fddf352c8e8ec2303c451a834a3ed437de4dacffe211ff55f64a165dcef9692a972f2346cb6bd272fcfecccc58fef762f055a8f7c19bc74e627c851ba5321db
7
- data.tar.gz: 091b121190a804a7d003f762b08f2ab287811ed94f3642233fcda90773affee179bc69de7132b159dae3da4cd5f4c7928cefb3d2ea49a2333038c046993c1a9a
6
+ metadata.gz: a422377f6020f923eac84ca194e46b78d05ad611428faa4dede440c090c61e2a30d5d15618286ae72b8ebf486e9aae4b351fee521f5bdc4e13ecc99d1a1677e4
7
+ data.tar.gz: 30d05bc44030071c322a18ff64235c7bd8da19b03c1cbb4bc68dd3deba33c21d82af75dc435aa2c9845705ea8c7989130aa7626aced0ffb119d6bc18344fa420
data/README.md CHANGED
@@ -8,7 +8,7 @@ As ctemplates says, "It emphasizes separating logic from presentation:
8
8
  it is impossible to embed application logic in this template language."
9
9
 
10
10
  For a list of implementations (other than Ruby) and tips, see
11
- <http://mustache.github.com/>.
11
+ <http://mustache.github.io/>.
12
12
 
13
13
 
14
14
  Overview
@@ -99,16 +99,16 @@ Tag Types
99
99
 
100
100
  For a language-agnostic overview of Mustache's template syntax, see
101
101
  the `mustache(5)` manpage or
102
- <http://mustache.github.com/mustache.5.html>.
102
+ <http://mustache.github.io/mustache.5.html>.
103
103
 
104
104
 
105
105
  Escaping
106
106
  --------
107
107
 
108
108
  Mustache does escape all values when using the standard double
109
- Mustache syntax. Characters which will be escaped: `& \ " < >`. To
110
- disable escaping, simply use triple mustaches like
111
- `{{{unescaped_variable}}}`.
109
+ Mustache syntax. Characters which will be escaped: `& \ " < >` (as
110
+ well as `'` in Ruby `>= 2.0`). To disable escaping, simply use triple
111
+ mustaches like `{{{unescaped_variable}}}`.
112
112
 
113
113
  Example: Using `{{variable}}` inside a template for `5 > 2` will
114
114
  result in `5 &gt; 2`, where as the usage of `{{{variable}}}` will
@@ -283,16 +283,16 @@ Sinatra
283
283
 
284
284
  Mustache ships with Sinatra integration. Please see
285
285
  `lib/mustache/sinatra.rb` or
286
- <http://github.com/defunkt/mustache/blob/master/lib/mustache/sinatra.rb>
286
+ <https://github.com/defunkt/mustache/blob/master/lib/mustache/sinatra.rb>
287
287
  for complete documentation.
288
288
 
289
289
  An example Sinatra application is also provided:
290
- <http://github.com/defunkt/mustache-sinatra-example>
290
+ <https://github.com/defunkt/mustache-sinatra-example>
291
291
 
292
292
  If you are upgrading to Sinatra 1.0 and Mustache 0.9.0+ from Mustache
293
293
  0.7.0 or lower, the settings have changed. But not that much.
294
294
 
295
- See [this diff](http://gist.github.com/345490) for what you need to
295
+ See [this diff](https://gist.github.com/defunkt/345490) for what you need to
296
296
  do. Basically, things are named properly now and all should be
297
297
  contained in a hash set using `set :mustache, hash`.
298
298
 
@@ -317,11 +317,7 @@ Using Rails? Add this to your initializer or environment file:
317
317
  Vim
318
318
  ---
319
319
 
320
- Thanks to [Juvenn Woo](http://github.com/juvenn) for mustache.vim. It
321
- is included under the contrib/ directory.
322
-
323
- See <http://gist.github.com/323622> for installation instructions.
324
-
320
+ vim-mustache-handlebars is available at https://github.com/mustache/vim-mustache-handlebars
325
321
 
326
322
  Emacs
327
323
  -----
@@ -332,16 +328,16 @@ mustache-mode.el is available at https://github.com/mustache/emacs
332
328
  TextMate
333
329
  --------
334
330
 
335
- [Mustache.tmbundle](http://github.com/defunkt/Mustache.tmbundle)
331
+ [Mustache.tmbundle](https://github.com/defunkt/Mustache.tmbundle)
336
332
 
337
- See <http://gist.github.com/323624> for installation instructions.
333
+ See <https://gist.github.com/defunkt/323624> for installation instructions.
338
334
 
339
335
 
340
336
  Command Line
341
337
  ------------
342
338
 
343
339
  See `mustache(1)` man page or
344
- <http://mustache.github.com/mustache.1.html>
340
+ <http://mustache.github.io/mustache.1.html>
345
341
  for command line docs.
346
342
 
347
343
 
@@ -356,8 +352,8 @@ Installation
356
352
  Acknowledgements
357
353
  ----------------
358
354
 
359
- Thanks to [Tom Preston-Werner](http://github.com/mojombo) for showing
360
- me ctemplate and [Leah Culver](http://github.com/leah) for the name "Mustache."
355
+ Thanks to [Tom Preston-Werner](https://github.com/mojombo) for showing
356
+ me ctemplate and [Leah Culver](https://github.com/leah) for the name "Mustache."
361
357
 
362
358
  Special thanks to [Magnus Holm](http://judofyr.net/) for all his
363
359
  awesome work on Mustache's parser.
@@ -391,9 +387,9 @@ The archive can be found at <http://librelist.com/browser/>.
391
387
  Meta
392
388
  ----
393
389
 
394
- * Code: `git clone git://github.com/defunkt/mustache.git`
395
- * Home: <http://mustache.github.com>
396
- * Bugs: <http://github.com/defunkt/mustache/issues>
390
+ * Code: `git clone https://github.com/defunkt/mustache.git`
391
+ * Home: <http://mustache.github.io>
392
+ * Bugs: <https://github.com/defunkt/mustache/issues>
397
393
  * List: <mustache@librelist.com>
398
394
  * Gems: <http://rubygems.org/gems/mustache>
399
395
 
@@ -402,8 +398,8 @@ You can also find us in `#{` on irc.freenode.net.
402
398
  [1]: http://code.google.com/p/google-ctemplate/
403
399
  [2]: http://www.ivan.fomichev.name/2008/05/erlang-template-engine-prototype.html
404
400
  [3]: http://google-ctemplate.googlecode.com/svn/trunk/doc/howto.html
405
- [4]: http://github.com/brynary/rack-bug/
401
+ [4]: https://github.com/brynary/rack-bug/
406
402
  [5]: http://img.skitch.com/20091027-n8pxwwx8r61tc318a15q1n6m14.png
407
403
  [cb]: http://wiki.github.com/defunkt/resque/contributing
408
404
  [fk]: http://help.github.com/forking/
409
- [is]: http://github.com/defunkt/mustache/issues
405
+ [is]: https://github.com/defunkt/mustache/issues
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'rake/testtask'
2
- require 'rake/rdoctask'
2
+ require 'rdoc/task'
3
3
 
4
4
  #
5
5
  # Helpers
@@ -64,20 +64,38 @@ class Mustache
64
64
  opts.parse!(args)
65
65
  end
66
66
 
67
- # Does the dirty work of reading files from STDIN and the command
68
- # line then processing them. The meat of this script, if you will.
69
- def self.process_files(input_stream)
70
- doc = input_stream.read
67
+ def self.yaml_is_array?(yaml)
68
+ yaml.is_a? Array and yaml.length == 1 and yaml[0].is_a? Array
69
+ end
71
70
 
72
- if doc =~ /^(\s*---(.+)---\s*)/m
73
- yaml = $2.strip
74
- template = doc.sub($1, '')
71
+ def self.yaml_is_object?(yaml)
72
+ yaml.is_a? Array and yaml.length == 1 and yaml[0].is_a? Hash
73
+ end
75
74
 
76
- YAML.each_document(yaml) do |data|
77
- puts Mustache.render(template, data)
78
- end
79
- else
75
+ # Does the dirty work of reading files from the command line then
76
+ # processing them. The meat of this script, if you will.
77
+ def self.process_files(input_files)
78
+ doc = input_files.file.read
79
+
80
+ yaml = nil
81
+ begin
82
+ yaml = RUBY_VERSION >= '1.9.3' ? YAML.load_stream(doc) : YAML.each_document(doc)
83
+ rescue
84
+ puts "Unable to parse yaml!"
85
+ end
86
+
87
+ if yaml.nil?
80
88
  puts Mustache.render(doc)
89
+ else
90
+ template = input_files.skip.file.read
91
+
92
+ if self.yaml_is_array?(yaml)
93
+ puts Mustache.render(template, yaml[0].reduce({}) {|hash, currentHash| hash.merge(currentHash)})
94
+ elsif self.yaml_is_object?(yaml)
95
+ puts Mustache.render(template, yaml[0])
96
+ else
97
+ puts Mustache.render(template, yaml)
98
+ end
81
99
  end
82
100
  end
83
101
  end
@@ -89,6 +107,6 @@ ARGV << '-h' if ARGV.empty? && $stdin.tty?
89
107
  # Process options
90
108
  Mustache::CLI.parse_options(ARGV) if $stdin.tty?
91
109
 
92
- # Still here - process ARGF
110
+ # Still here - process rest of ARGF
93
111
  Mustache::CLI.process_files(ARGF)
94
112
 
@@ -1,3 +1,4 @@
1
+ require 'mustache/enumerable'
1
2
  require 'mustache/template'
2
3
  require 'mustache/context'
3
4
  require 'mustache/settings'
@@ -202,14 +203,10 @@ class Mustache
202
203
  # Mustache.view_namespace = Hurl::Views
203
204
  # Mustache.view_class(:Partial) # => Hurl::Views::Partial
204
205
  def self.view_class(name)
205
- if name != classify(name.to_s)
206
- name = classify(name.to_s)
207
- end
206
+ name = classify(name.to_s)
208
207
 
209
208
  # Emptiness begets emptiness.
210
- if name.to_s == ''
211
- return Mustache
212
- end
209
+ return Mustache if name.to_s == ''
213
210
 
214
211
  file_name = underscore(name)
215
212
  name = "#{view_namespace}::#{name}"
@@ -280,11 +277,7 @@ class Mustache
280
277
  # Turns a string into a Mustache::Template. If passed a Template,
281
278
  # returns it.
282
279
  def self.templateify(obj)
283
- if obj.is_a?(Template)
284
- obj
285
- else
286
- Template.new(obj.to_s)
287
- end
280
+ obj.is_a?(Template) ? obj : Template.new(obj.to_s)
288
281
  end
289
282
 
290
283
  def templateify(obj)
@@ -0,0 +1,116 @@
1
+ require 'mustache'
2
+
3
+ class Mustache::Template
4
+ def token_names
5
+ def recursor(toks, section)
6
+ toks.map do |token|
7
+ next unless token.is_a? Array
8
+ if token[0] == :mustache && [:etag,:utag].include? token[1]
9
+ (section + [token[2][2][0]]).join '.'
10
+ elsif token[0] == :mustache && [:section,:inverted_section].include? token[1]
11
+ recursor(token[4], section + [token[2][2][0]])
12
+ else
13
+ recursor(token, section)
14
+ end
15
+ end
16
+ end
17
+ recursor(tokens, []).flatten.reject(&:nil?).uniq
18
+ end
19
+
20
+ def section_names
21
+ def recursor(toks, section)
22
+ sections = []
23
+ toks.each do |token|
24
+ next unless token.is_a? Array
25
+ if token[0] == :mustache && [:section,:inverted_section].include? token[1]
26
+ new_section = section + [token[2][2][0]]
27
+ sections += [ new_section.join('.') ] + recursor(token[4], new_section)
28
+ else
29
+ sections += recursor(token, section)
30
+ end
31
+ end
32
+ sections
33
+ end
34
+ recursor(tokens,[]).reject(&:nil?).uniq
35
+ end
36
+
37
+ def partial_names
38
+ def recursor(toks)
39
+ partials = []
40
+ toks.each do |token|
41
+ next unless token.is_a? Array
42
+ partials += if token[0..1] == [:mustache, :partial]
43
+ [token[2]] # partial here
44
+ else
45
+ recursor(token)
46
+ end
47
+ end
48
+ partials
49
+ end
50
+ recursor(tokens).reject(&:nil?).uniq
51
+ end
52
+
53
+ end
54
+
55
+ if __FILE__ == $0
56
+ require "test/unit"
57
+
58
+ class TestMustacheTokenNames < Test::Unit::TestCase
59
+
60
+ def setup
61
+ @template = Mustache::Template.new(@@template_text ||= DATA.read)
62
+ end
63
+
64
+ def test_token_names
65
+ assert_equal(@template.token_names,
66
+ [ "yourname",
67
+ "HOME",
68
+ "friend.name",
69
+ "friend.morr.word",
70
+ "friend.morr.up",
71
+ "friend.morr.awesomesauce",
72
+ "friend.morr.hiss",
73
+ "friend.notinmorr",
74
+ "friend.person",
75
+ "love",
76
+ "triplestash"
77
+ ]
78
+ )
79
+ end
80
+
81
+ def test_partial_names
82
+ assert_equal(@template.partial_names, ["partial1", "partial2"])
83
+ end
84
+
85
+ def test_section_names
86
+ assert_equal(@template.section_names, ["friend", "friend.morr"])
87
+ end
88
+ end
89
+ end
90
+
91
+ __END__
92
+ Hi there {{yourname}}. Your home directory is {{HOME}}.
93
+
94
+ {{#friend}}
95
+ Your friend is named {{name}}
96
+ {{#morr}}
97
+ Hey {{word}} {{up}} {{{awesomesauce}}}.
98
+ {{/morr}}
99
+ {{^morr}}
100
+ Booooo. {{hiss}}
101
+ {{/morr}}
102
+ {{notinmorr}}
103
+ {{> partial1}}
104
+ {{/friend}}
105
+ {{^friend}}
106
+ You have no friends, {{person}}. You suck.
107
+ {{/friend}}
108
+
109
+ {{> partial2}}
110
+ {{! comments are awesome }}
111
+
112
+ {{={% %}=}}
113
+
114
+ {%love%}
115
+ {%={{ }}=%}
116
+ {{{triplestash}}}
@@ -31,7 +31,7 @@ class Mustache
31
31
  part = mustache.partial(name).to_s.gsub(/^/, indentation)
32
32
 
33
33
  # Call the Mustache's `partial` method and render the result.
34
- result = mustache.render(part, self)
34
+ mustache.render(part, self)
35
35
  end
36
36
 
37
37
  # Find the first Mustache in the stack. If we're being rendered
@@ -80,7 +80,7 @@ class Mustache
80
80
  # Do we know about a particular key? In other words, will calling
81
81
  # `context[key]` give us a result that was set. Basically.
82
82
  def has_key?(key)
83
- !!fetch(key)
83
+ !!fetch(key, false)
84
84
  rescue ContextMiss
85
85
  false
86
86
  end
@@ -97,9 +97,7 @@ class Mustache
97
97
  next if frame == self
98
98
 
99
99
  value = find(frame, name, :__missing)
100
- if value != :__missing
101
- return value
102
- end
100
+ return value if value != :__missing
103
101
  end
104
102
 
105
103
  if default == :__raise || mustache_in_stack.raise_on_context_miss?
@@ -121,22 +119,37 @@ class Mustache
121
119
  #
122
120
  # Returns the value of key in obj if it is found and default otherwise.
123
121
  def find(obj, key, default = nil)
124
- hash = obj.respond_to?(:has_key?)
122
+ hash = obj.respond_to?(:to_hash)
123
+
124
+ if !hash
125
+ # If a class, we need to find tags (methods) per Parser::ALLOWED_CONTENT.
126
+ if key.to_s.include?('-')
127
+ key = key.to_s.gsub('-', '_')
128
+ end
125
129
 
126
- if hash && obj.has_key?(key)
130
+ if obj.respond_to?(key)
131
+ meth = obj.method(key) rescue proc { obj.send(key) }
132
+ if meth.arity == 1
133
+ meth.to_proc
134
+ else
135
+ meth[]
136
+ end
137
+ else
138
+ default
139
+ end
140
+ elsif hash && obj.has_key?(key)
127
141
  obj[key]
128
142
  elsif hash && obj.has_key?(key.to_s)
129
143
  obj[key.to_s]
130
- elsif !hash && obj.respond_to?(key)
131
- meth = obj.method(key) rescue proc { obj.send(key) }
132
- if meth.arity == 1
133
- meth.to_proc
134
- else
135
- meth[]
136
- end
137
144
  else
138
- default
145
+ obj[key] || default
139
146
  end
140
147
  end
141
148
  end
142
149
  end
150
+
151
+ class Hash
152
+ def to_hash
153
+ self
154
+ end unless method_defined?(:to_hash)
155
+ end
@@ -0,0 +1,3 @@
1
+ class Mustache
2
+ Enumerable = Module.new
3
+ end
@@ -64,17 +64,22 @@ class Mustache
64
64
  #
65
65
  # [:multi,
66
66
  # [:static, "Hello "],
67
- # [:mustache, :etag, "name"],
67
+ # [:mustache, :etag,
68
+ # [:mustache, :fetch, ["name"]]],
68
69
  # [:static, "\nYou have just won $"],
69
- # [:mustache, :etag, "value"],
70
- # [:static, "!\n"],
71
- # [:mustache,
72
- # :section,
73
- # "in_ca",
74
- # [:multi,
75
- # [:static, "Well, $"],
76
- # [:mustache, :etag, "taxed_value"],
77
- # [:static, ", after taxes.\n"]]]]
70
+ # [:mustache, :etag,
71
+ # [:mustache, :fetch, ["value"]]],
72
+ # [:static, "!\n"],
73
+ # [:mustache,
74
+ # :section,
75
+ # [:mustache, :fetch, ["in_ca"]],
76
+ # [:multi,
77
+ # [:static, "Well, $"],
78
+ # [:mustache, :etag,
79
+ # [:mustache, :fetch, ["taxed_value"]]],
80
+ # [:static, ", after taxes.\n"]],
81
+ # "Well, ${{taxed_value}}, after taxes.\n",
82
+ # ["{{", "}}"]]]
78
83
  def compile!(exp)
79
84
  case exp.first
80
85
  when :multi
@@ -111,7 +116,7 @@ class Mustache
111
116
  t.render(ctx.dup)
112
117
  else
113
118
  # Shortcut when passed non-array
114
- v = [v] unless v.is_a?(Array) || defined?(Enumerator) && v.is_a?(Enumerator)
119
+ v = [v] unless v.is_a?(Array) || v.is_a?(Mustache::Enumerable) || defined?(Enumerator) && v.is_a?(Enumerator)
115
120
 
116
121
  v.map { |h| ctx.push(h); r = #{code}; ctx.pop; r }.join
117
122
  end