2015-10-12 17:37:22 +09:00
|
|
|
require 'hamlit/compiler/comment_compiler'
|
2015-10-12 13:59:33 +09:00
|
|
|
require 'hamlit/compiler/doctype_compiler'
|
|
|
|
require 'hamlit/compiler/tag_compiler'
|
2015-10-12 13:55:49 +09:00
|
|
|
require 'hamlit/filters'
|
2015-10-15 22:10:14 +09:00
|
|
|
require 'hamlit/whitespace/compiler'
|
2015-10-11 18:18:38 +09:00
|
|
|
|
2015-10-06 23:14:45 +09:00
|
|
|
module Hamlit
|
|
|
|
class Compiler
|
|
|
|
def initialize(options = {})
|
2015-10-15 22:10:14 +09:00
|
|
|
@comment_compiler = CommentCompiler.new
|
|
|
|
@doctype_compiler = DoctypeCompiler.new(options)
|
|
|
|
@tag_compiler = TagCompiler.new(options)
|
|
|
|
@filter_compiler = Filters.new(options)
|
|
|
|
@whitespace_compiler = Whitespace::Compiler.new
|
2015-10-06 23:14:45 +09:00
|
|
|
end
|
|
|
|
|
2015-10-11 11:58:52 +09:00
|
|
|
def call(ast)
|
|
|
|
compile(ast)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2015-10-11 11:50:22 +09:00
|
|
|
def compile(node)
|
2015-10-07 00:33:20 +09:00
|
|
|
case node.type
|
2015-10-11 11:50:22 +09:00
|
|
|
when :root
|
|
|
|
compile_children(node)
|
2015-10-12 00:37:01 +09:00
|
|
|
when :comment
|
|
|
|
compile_comment(node)
|
2015-10-11 13:05:32 +09:00
|
|
|
when :doctype
|
|
|
|
compile_doctype(node)
|
2015-10-12 08:29:35 +09:00
|
|
|
when :filter
|
|
|
|
compile_filter(node)
|
2015-10-11 13:05:42 +09:00
|
|
|
when :plain
|
|
|
|
compile_plain(node)
|
2015-10-12 18:34:47 +09:00
|
|
|
when :script
|
|
|
|
compile_script(node)
|
|
|
|
when :tag
|
|
|
|
compile_tag(node)
|
2015-10-12 17:57:12 +09:00
|
|
|
when :haml_comment
|
2015-10-11 17:02:44 +09:00
|
|
|
[:multi]
|
2015-10-12 17:57:12 +09:00
|
|
|
else
|
|
|
|
raise InternalError.new("Unexpected node type: #{node.type}")
|
2015-10-07 00:33:20 +09:00
|
|
|
end
|
2015-10-06 23:14:45 +09:00
|
|
|
end
|
2015-10-11 11:50:22 +09:00
|
|
|
|
|
|
|
def compile_children(node)
|
2015-10-15 22:10:14 +09:00
|
|
|
@whitespace_compiler.compile_children(node) { |n| compile(n) }
|
2015-10-11 11:50:22 +09:00
|
|
|
end
|
2015-10-11 11:58:14 +09:00
|
|
|
|
2015-10-12 18:34:47 +09:00
|
|
|
def compile_comment(node)
|
|
|
|
@comment_compiler.compile(node) { |n| compile_children(n) }
|
|
|
|
end
|
|
|
|
|
2015-10-11 13:05:32 +09:00
|
|
|
def compile_doctype(node)
|
2015-10-11 19:53:34 +09:00
|
|
|
@doctype_compiler.compile(node)
|
2015-10-11 13:05:32 +09:00
|
|
|
end
|
|
|
|
|
2015-10-12 08:29:35 +09:00
|
|
|
def compile_filter(node)
|
|
|
|
@filter_compiler.compile(node)
|
|
|
|
end
|
|
|
|
|
2015-10-12 18:34:47 +09:00
|
|
|
def compile_plain(node)
|
|
|
|
[:static, node.value[:text]]
|
2015-10-12 00:37:01 +09:00
|
|
|
end
|
|
|
|
|
2015-10-12 18:34:47 +09:00
|
|
|
def compile_script(node)
|
2015-10-12 18:39:00 +09:00
|
|
|
if node.value[:preserve]
|
|
|
|
[:dynamic, %Q[Haml::Helpers.find_and_preserve(#{node.value[:text]}, %w(textarea pre code))]]
|
|
|
|
elsif node.value[:escape_html]
|
2015-10-12 18:34:47 +09:00
|
|
|
[:escape, true, [:dynamic, node.value[:text]]]
|
|
|
|
else
|
|
|
|
[:dynamic, node.value[:text]]
|
|
|
|
end
|
2015-10-11 13:05:42 +09:00
|
|
|
end
|
|
|
|
|
2015-10-12 18:34:47 +09:00
|
|
|
def compile_tag(node)
|
|
|
|
@tag_compiler.compile(node) { |n| compile_children(n) }
|
2015-10-11 11:58:14 +09:00
|
|
|
end
|
2015-10-12 17:57:12 +09:00
|
|
|
|
|
|
|
class InternalError < RuntimeError
|
|
|
|
end
|
2015-10-06 23:14:45 +09:00
|
|
|
end
|
|
|
|
end
|