1
0
Fork 0
mirror of https://github.com/haml/haml.git synced 2022-11-09 12:33:31 -05:00
haml--haml/lib/hamlit/compiler.rb

98 lines
2.5 KiB
Ruby
Raw Normal View History

2015-10-24 23:39:34 +09:00
require 'hamlit/compiler/children_compiler'
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'
2015-10-18 01:38:37 +09:00
require 'hamlit/compiler/script_compiler'
2015-10-17 15:35:21 +09:00
require 'hamlit/compiler/silent_script_compiler'
2015-10-12 13:59:33 +09:00
require 'hamlit/compiler/tag_compiler'
2015-10-12 13:55:49 +09:00
require 'hamlit/filters'
2015-11-19 12:56:55 +09:00
require 'hamlit/unique_identifier'
2015-10-11 18:18:38 +09:00
2015-10-06 23:14:45 +09:00
module Hamlit
class Compiler
def initialize(options = {})
2015-11-19 12:56:55 +09:00
unique_identifier = UniqueIdentifier.new
2015-10-24 23:39:34 +09:00
@children_compiler = ChildrenCompiler.new
2015-10-17 15:35:21 +09:00
@comment_compiler = CommentCompiler.new
@doctype_compiler = DoctypeCompiler.new(options)
2015-11-19 12:56:55 +09:00
@script_compiler = ScriptCompiler.new(unique_identifier)
2015-10-17 15:35:21 +09:00
@silent_script_compiler = SilentScriptCompiler.new
2015-11-19 12:56:55 +09:00
@tag_compiler = TagCompiler.new(unique_identifier, options)
2015-10-18 01:38:37 +09:00
2015-10-17 15:35:21 +09:00
@filter_compiler = Filters.new(options)
2015-10-06 23:14:45 +09:00
end
2015-10-11 11:58:52 +09:00
def call(ast)
2015-11-22 02:03:32 +09:00
return runtime_error(ast) if ast.is_a?(HamlError)
2015-10-11 11:58:52 +09:00
compile(ast)
rescue Error => e
runtime_error(e)
2015-10-11 11:58:52 +09:00
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)
2015-10-16 01:11:45 +09:00
when :silent_script
2015-10-17 15:12:58 +09:00
compile_silent_script(node)
2015-10-12 18:34:47 +09:00
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-24 23:39:34 +09:00
@children_compiler.compile(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-18 01:38:37 +09:00
def compile_script(node)
2015-10-25 14:50:24 +09:00
@script_compiler.compile(node) { |n| compile_children(n) }
2015-10-17 15:12:58 +09:00
end
2015-10-18 01:38:37 +09:00
def compile_silent_script(node)
@silent_script_compiler.compile(node) { |n| compile_children(n) }
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-11-22 02:03:32 +09:00
def runtime_error(error)
[:multi].tap do |temple|
error.line.times { temple << [:newline] } if error.line
temple << [:code, %Q[raise #{error.class}.new(%q[#{error.message}], #{error.line.inspect})]]
end
end
2015-10-06 23:14:45 +09:00
end
end