mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
Parse string interpolation
This commit is contained in:
parent
f482296c24
commit
74561f3ee3
5 changed files with 37 additions and 2 deletions
|
@ -6,6 +6,7 @@ require 'hamlit/filter_formatter'
|
||||||
require 'hamlit/multiline_preprocessor'
|
require 'hamlit/multiline_preprocessor'
|
||||||
require 'hamlit/parser'
|
require 'hamlit/parser'
|
||||||
require 'hamlit/script_compiler'
|
require 'hamlit/script_compiler'
|
||||||
|
require 'hamlit/text_compiler'
|
||||||
|
|
||||||
module Hamlit
|
module Hamlit
|
||||||
class Engine < Temple::Engine
|
class Engine < Temple::Engine
|
||||||
|
@ -17,6 +18,7 @@ module Hamlit
|
||||||
use FilterFormatter
|
use FilterFormatter
|
||||||
use FilterCompiler
|
use FilterCompiler
|
||||||
use ScriptCompiler
|
use ScriptCompiler
|
||||||
|
use TextCompiler
|
||||||
use DynamicFormatter
|
use DynamicFormatter
|
||||||
html :Fast
|
html :Fast
|
||||||
filter :Escapable
|
filter :Escapable
|
||||||
|
|
|
@ -52,6 +52,7 @@ module Hamlit
|
||||||
|
|
||||||
scanner = StringScanner.new(line)
|
scanner = StringScanner.new(line)
|
||||||
scanner.scan(/ +/)
|
scanner.scan(/ +/)
|
||||||
|
return parse_text(scanner) if scanner.match?(/\#{/)
|
||||||
|
|
||||||
case scanner.peek(1)
|
case scanner.peek(1)
|
||||||
when '!'
|
when '!'
|
||||||
|
@ -149,7 +150,7 @@ module Hamlit
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse_text(scanner)
|
def parse_text(scanner)
|
||||||
ast = [:static]
|
ast = [:haml, :text]
|
||||||
ast << scanner.scan(/.+/)
|
ast << scanner.scan(/.+/)
|
||||||
ast
|
ast
|
||||||
end
|
end
|
||||||
|
|
17
lib/hamlit/text_compiler.rb
Normal file
17
lib/hamlit/text_compiler.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
require 'temple/html/filter'
|
||||||
|
|
||||||
|
# NOTE: This compiler has an extremely bad effect for performance.
|
||||||
|
# We should optimize this.
|
||||||
|
module Hamlit
|
||||||
|
class TextCompiler < Temple::HTML::Filter
|
||||||
|
def on_haml_text(exp)
|
||||||
|
compile_text(exp)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def compile_text(exp)
|
||||||
|
[:dynamic, %Q{"#{exp.gsub(/"/, '\"')}"}]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
15
spec/hamlit/engine/text_spec.rb
Normal file
15
spec/hamlit/engine/text_spec.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
describe Hamlit::Engine do
|
||||||
|
describe 'text' do
|
||||||
|
it 'renders string interpolation' do
|
||||||
|
assert_render(<<-HAML, <<-HTML)
|
||||||
|
#{ "a#{3}a" }a" #{[1, 2]} b
|
||||||
|
a#{{ a: 3 }}
|
||||||
|
<ht#{2}ml>
|
||||||
|
HAML
|
||||||
|
a3aa" [1, 2] b
|
||||||
|
a{:a=>3}
|
||||||
|
<ht2ml>
|
||||||
|
HTML
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,7 +4,7 @@ describe Hamlit::Parser do
|
||||||
assert_compile(
|
assert_compile(
|
||||||
'%span a',
|
'%span a',
|
||||||
[:multi,
|
[:multi,
|
||||||
[:html, :tag, 'span', [:haml, :attrs], [:static, 'a']],
|
[:html, :tag, 'span', [:haml, :attrs], [:haml, :text, 'a']],
|
||||||
[:static, "\n"],
|
[:static, "\n"],
|
||||||
[:newline]],
|
[:newline]],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Reference in a new issue