musterb 0.0.7 → 0.1.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/lib/musterb/chain.rb +1 -1
- data/lib/musterb/evaluator.rb +1 -1
- data/lib/musterb/extract_values.rb +1 -1
- data/lib/musterb/musterbifier.rb +46 -19
- data/lib/musterb/template_handler.rb +20 -7
- data/lib/musterb/version.rb +1 -1
- data/lib/musterb.rb +15 -11
- data/musterb.gemspec +1 -0
- data/spec/musterb/musterbifier_spec.rb +5 -6
- data/spec/musterb/template_handler_spec.rb +27 -0
- metadata +22 -2
data/lib/musterb/chain.rb
CHANGED
data/lib/musterb/evaluator.rb
CHANGED
data/lib/musterb/musterbifier.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
class Musterb::Musterbifier
|
2
|
-
def initialize(template
|
2
|
+
def initialize(template)
|
3
3
|
@template = template
|
4
|
-
@render_partial_template = render_partial_template || method(:partials_not_implemented)
|
5
4
|
end
|
6
5
|
|
7
|
-
def fetch(
|
8
|
-
|
6
|
+
def fetch(match)
|
7
|
+
match = match.strip
|
8
|
+
return "musterb.current" if match == '.'
|
9
|
+
tokens = match.split(".")
|
9
10
|
last_token = tokens.pop
|
10
11
|
fetch_command = tokens.inject("musterb") do |str, token|
|
11
12
|
"#{str}.chain('#{token}')"
|
@@ -13,35 +14,61 @@ class Musterb::Musterbifier
|
|
13
14
|
"#{fetch_command}['#{last_token}']"
|
14
15
|
end
|
15
16
|
|
17
|
+
def block_if(tokens)
|
18
|
+
"<% musterb.block_if #{tokens} do %>"
|
19
|
+
end
|
20
|
+
|
21
|
+
def block_unless(tokens)
|
22
|
+
"<% musterb.block_unless #{tokens} do %>"
|
23
|
+
end
|
24
|
+
|
25
|
+
def block_end
|
26
|
+
"<% end %>"
|
27
|
+
end
|
28
|
+
|
29
|
+
def text_without_escaping(tokens)
|
30
|
+
"<%= #{tokens} %>"
|
31
|
+
end
|
32
|
+
|
33
|
+
def text_with_escaping(tokens)
|
34
|
+
"<%== #{tokens} %>"
|
35
|
+
end
|
36
|
+
|
37
|
+
def comment
|
38
|
+
""
|
39
|
+
end
|
40
|
+
|
41
|
+
def change_token
|
42
|
+
raise NotImplementedError, 'Not able to change the mustache delimiter just yet'
|
43
|
+
end
|
44
|
+
|
45
|
+
def render_partial(partial)
|
46
|
+
raise NotImplementedError, "Override render_partial in Musterbifier to render partials"
|
47
|
+
end
|
48
|
+
|
16
49
|
def to_erb
|
17
50
|
@template.gsub(/\{\{(\{?[^\}]*\}?)\}\}/) do |match|
|
18
51
|
match = $1
|
19
52
|
case match[0]
|
20
53
|
when '#'
|
21
|
-
|
54
|
+
block_if fetch match[1..-1]
|
22
55
|
when '^'
|
23
|
-
|
56
|
+
block_unless fetch match[1..-1]
|
24
57
|
when "/"
|
25
|
-
|
58
|
+
block_end
|
26
59
|
when '{'
|
27
|
-
|
60
|
+
text_without_escaping fetch match[1..-2]
|
28
61
|
when '&'
|
29
|
-
|
62
|
+
text_without_escaping fetch match[1..-1]
|
30
63
|
when '!'
|
31
|
-
|
32
|
-
when '.'
|
33
|
-
"<%== musterb.current %>"
|
64
|
+
comment
|
34
65
|
when '='
|
35
|
-
|
66
|
+
change_token
|
36
67
|
when '>'
|
37
|
-
|
68
|
+
render_partial match[1..-1].strip
|
38
69
|
else
|
39
|
-
|
70
|
+
text_with_escaping fetch match
|
40
71
|
end
|
41
72
|
end
|
42
73
|
end
|
43
|
-
|
44
|
-
def partials_not_implemented(partial)
|
45
|
-
"raise NotImplementedError, 'Don't know how to render partial: #{partial}'"
|
46
|
-
end
|
47
74
|
end
|
@@ -1,15 +1,28 @@
|
|
1
1
|
require 'musterb'
|
2
|
+
require 'action_view'
|
2
3
|
|
3
|
-
|
4
|
-
def
|
5
|
-
"render :partial => '#{partial}', :locals => {:initial_context => musterb.context}"
|
4
|
+
class Musterb::TemplateHandler < Musterb::Musterbifier
|
5
|
+
def render_partial(partial)
|
6
|
+
"<%= render :partial => '#{partial}', :locals => {:initial_context => musterb.context} %>"
|
7
|
+
end
|
8
|
+
|
9
|
+
def text_without_escaping(tokens)
|
10
|
+
"<%= #{tokens}.html_safe %>"
|
11
|
+
end
|
12
|
+
|
13
|
+
def text_with_escaping(tokens)
|
14
|
+
"<%= #{tokens} %>"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.compile_mustache(source, options = {})
|
18
|
+
erb = Musterb.to_erb(source, options.merge(:musterbifier_klass => self))
|
19
|
+
klass = ActionView::Template::Handlers::ERB
|
20
|
+
klass.erb_implementation.new(erb, :trim => (klass.erb_trim_mode == "-")).src
|
6
21
|
end
|
7
22
|
|
8
23
|
def self.call(template)
|
9
|
-
options = {
|
24
|
+
options = {}
|
10
25
|
options[:initial_context] = "initial_context" if template.locals.include? "initial_context"
|
11
|
-
|
12
|
-
klass = ActionView::Template::Handlers::ERB
|
13
|
-
klass.erb_implementation.new(erb, :trim => (klass.erb_trim_mode == "-")).src
|
26
|
+
compile_mustache(template.source, options)
|
14
27
|
end
|
15
28
|
end
|
data/lib/musterb/version.rb
CHANGED
data/lib/musterb.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
|
-
require "musterb/version"
|
2
|
-
require "musterb/extract_values"
|
3
|
-
require "musterb/musterbifier"
|
4
|
-
require "musterb/binding_extractor"
|
5
|
-
require "musterb/hash_extractor"
|
6
|
-
require "musterb/object_extractor"
|
7
|
-
require "musterb/null_extractor"
|
8
|
-
require "musterb/evaluator"
|
9
|
-
require "musterb/chain"
|
10
|
-
|
11
1
|
require "erubis"
|
12
2
|
|
13
3
|
module Musterb
|
4
|
+
autoload :VERSION, "musterb/version"
|
5
|
+
|
6
|
+
autoload :ExtractValues, "musterb/extract_values"
|
7
|
+
autoload :Musterbifier, "musterb/musterbifier"
|
8
|
+
autoload :BindingExtractor, "musterb/binding_extractor"
|
9
|
+
autoload :HashExtractor, "musterb/hash_extractor"
|
10
|
+
autoload :ObjectExtractor, "musterb/object_extractor"
|
11
|
+
autoload :NullExtractor, "musterb/null_extractor"
|
12
|
+
autoload :Evaluator, "musterb/evaluator"
|
13
|
+
autoload :Chain, "musterb/chain"
|
14
|
+
|
15
|
+
autoload :TemplateHandler, "musterb/template_handler"
|
16
|
+
|
14
17
|
def self.to_erb(template, options = {})
|
15
|
-
|
18
|
+
klass = options[:musterbifier_klass] || Musterbifier
|
19
|
+
musterbifier = klass.new(template)
|
16
20
|
initial_context = options[:initial_context] || 'Musterb::BindingExtractor.new binding'
|
17
21
|
"<% Musterb::Evaluator.new(#{initial_context}).tap do |musterb| %>#{musterbifier.to_erb}<% end %>"
|
18
22
|
end
|
data/musterb.gemspec
CHANGED
@@ -19,6 +19,10 @@ describe Musterb::Musterbifier do
|
|
19
19
|
Musterb::Musterbifier.new("{{#cond}}foo{{/cond}}").to_erb.should eq "<% musterb.block_if musterb['cond'] do %>foo<% end %>"
|
20
20
|
end
|
21
21
|
|
22
|
+
it "can do #." do
|
23
|
+
Musterb::Musterbifier.new("{{#.}}foo{{/.}}").to_erb.should eq "<% musterb.block_if musterb.current do %>foo<% end %>"
|
24
|
+
end
|
25
|
+
|
22
26
|
it "replaces carrot correctly" do
|
23
27
|
Musterb::Musterbifier.new("{{^cond}}foo{{/cond}}").to_erb.should eq "<% musterb.block_unless musterb['cond'] do %>foo<% end %>"
|
24
28
|
end
|
@@ -36,11 +40,6 @@ describe Musterb::Musterbifier do
|
|
36
40
|
end
|
37
41
|
|
38
42
|
it "replaces calls for partials with an exception by default" do
|
39
|
-
Musterb::Musterbifier.new("{{> foo}}").to_erb.should
|
40
|
-
end
|
41
|
-
|
42
|
-
it "can be injected with an algorithm for creating partials" do
|
43
|
-
render_partial_template = lambda { |p| "render :partial => '#{p}', :current_context => musterb.context" }
|
44
|
-
Musterb::Musterbifier.new("{{> foo}}", render_partial_template).to_erb.should eq "<%= render :partial => 'foo', :current_context => musterb.context %>"
|
43
|
+
lambda { Musterb::Musterbifier.new("{{> foo}}").to_erb }.should raise_error NotImplementedError
|
45
44
|
end
|
46
45
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'musterb/template_handler'
|
2
|
+
|
3
|
+
describe Musterb::TemplateHandler do
|
4
|
+
def evaluate(template, binding)
|
5
|
+
compiled = "output_buffer = nil; " + Musterb::TemplateHandler::compile_mustache(template)
|
6
|
+
binding.eval compiled
|
7
|
+
end
|
8
|
+
|
9
|
+
it "is wired up correctly" do
|
10
|
+
foo = "hi"
|
11
|
+
evaluate("{{foo}}", binding).should eq "hi"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "renders partials corrects" do
|
15
|
+
Musterb::TemplateHandler::compile_mustache("{{>foo}}").should include "render :partial => 'foo', :locals => {:initial_context => musterb.context}"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "escapes things by default" do
|
19
|
+
foo = "<br>"
|
20
|
+
evaluate("{{foo}}", binding).should eq "<br>"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "does not escape things in triple staches" do
|
24
|
+
foo = "<br>"
|
25
|
+
evaluate("{{{foo}}}", binding).should eq "<br>"
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: musterb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: erubis
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: actionpack
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: The ability to compile mustache templates to erubis erb templates so
|
79
95
|
that we can make use of the performance of compiling templates
|
80
96
|
email:
|
@@ -129,6 +145,8 @@ files:
|
|
129
145
|
c3BlYy9tdXN0ZXJiL211c3RlcmJpZmllcl9zcGVjLnJi
|
130
146
|
- !binary |-
|
131
147
|
c3BlYy9tdXN0ZXJiL29iamVjdF9leHRyYWN0b3Jfc3BlYy5yYg==
|
148
|
+
- !binary |-
|
149
|
+
c3BlYy9tdXN0ZXJiL3RlbXBsYXRlX2hhbmRsZXJfc3BlYy5yYg==
|
132
150
|
- !binary |-
|
133
151
|
c3BlYy9tdXN0ZXJiX3NwZWMucmI=
|
134
152
|
- !binary |-
|
@@ -170,6 +188,8 @@ test_files:
|
|
170
188
|
c3BlYy9tdXN0ZXJiL211c3RlcmJpZmllcl9zcGVjLnJi
|
171
189
|
- !binary |-
|
172
190
|
c3BlYy9tdXN0ZXJiL29iamVjdF9leHRyYWN0b3Jfc3BlYy5yYg==
|
191
|
+
- !binary |-
|
192
|
+
c3BlYy9tdXN0ZXJiL3RlbXBsYXRlX2hhbmRsZXJfc3BlYy5yYg==
|
173
193
|
- !binary |-
|
174
194
|
c3BlYy9tdXN0ZXJiX3NwZWMucmI=
|
175
195
|
- !binary |-
|