Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion lib/easy_template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ module EasyTemplate
# variables: (Hash)
# the hash containing the values to substitute in place of the keys enclosed by { and }.
def self.process(text, variables)
text.gsub(/(\\\{)|((?<!\\)(?:\\\\)*#{variables.map{|v|"\\{#{Regexp.escape(v[0])}\\}"}.join('|')})/i){|s| s[0] == '\\' ? s[1] : variables[s[1..-2]]}
text.gsub(/(\\\{)|((?<!\\)(?:\\\\)*#{variables.map{|v|"\\{#{Regexp.escape(v[0])}\\}"}.join('|')})/i){|s| s[0] == '\\' ? s[1] :
variables.fetch(s[1..-2],
( s[1..-2].respond_to?(:to_sym) ? variables.fetch(s[1..-2].to_sym, nil) : nil)
)
}
end
end
17 changes: 17 additions & 0 deletions test/test_easy_template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,45 @@ def test_without_substitution
def test_with_a_single_substitution
assert_equal 'world!',
EasyTemplate::process('{hello}', {'hello' => 'world!'})
assert_equal 'world!',
EasyTemplate::process('{hello}', {hello: 'world!'})

end

def test_with_static_text_and_substitution
assert_equal 'Hello Mr Bowie!',
EasyTemplate::process('Hello Mr {last name}!', {'last name' => 'Bowie'})
assert_equal 'Hello Mr Bowie!',
EasyTemplate::process('Hello Mr {last name}!', {'last name': 'Bowie'})
end

def test_with_escaped_text
assert_equal 'Hello Mrs {first name} Simone!',
EasyTemplate::process('Hello Mrs \{first name} {last name}!', {'first name' => 'Nina', 'last name' => 'Simone'})
assert_equal 'Hello Mrs {first name} Simone!',
EasyTemplate::process('Hello Mrs \{first name} {last name}!', {'first name': 'Nina', 'last name' => 'Simone'})
assert_equal 'Hello Mrs {first name} Simone!',
EasyTemplate::process('Hello Mrs \{first name} {last name}!', {'first name': 'Nina', 'last name': 'Simone'})

end

def test_with_escaped_text_at_begin
assert_equal '{first name} Simone!',
EasyTemplate::process('\{first name} {last name}!', {'first name' => 'Nina', 'last name' => 'Simone'})
assert_equal '{first name} Simone!',
EasyTemplate::process('\{first name} {last name}!', {'first name' => 'Nina', 'last name': 'Simone'})
end

def test_with_escaped_text_everywhere
assert_equal '{first nam{e} {Simone{',
EasyTemplate::process('\{first nam\{e} \{{last name}\{', {'first name' => 'Nina', 'last name' => 'Simone'})
end

def test_uses_both_strings_and_symbols_as_keys
assert_equal 'MadBomber was here',
EasyTemplate.process('{who} was {where}', {who:'MadBomber', 'where' => 'here'})
end

def test_fun
assert_equal 'Not bad ={D!',
EasyTemplate::process('{fun }{{{}}} {test yeah!}', {'fun }{{{}}} {test yeah!' => 'Not bad ={D!'})
Expand Down