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

Merge FilterCompiler into Compiler

This commit is contained in:
Takashi Kokubun 2015-03-28 18:24:21 +09:00
parent 9a79e887ca
commit 9d1c9d8b68
6 changed files with 66 additions and 65 deletions

View file

@ -1,16 +1,27 @@
require 'hamlit/compilers/doctype'
require 'hamlit/compilers/filter'
require 'hamlit/compilers/preserve'
require 'hamlit/compilers/script'
require 'hamlit/compilers/text'
require 'hamlit/concerns/escapable'
require 'hamlit/concerns/registerable'
require 'hamlit/filter'
require 'hamlit/filters/css'
require 'hamlit/filters/javascript'
require 'hamlit/filters/ruby'
module Hamlit
class Compiler < Hamlit::Filter
include Compilers::Doctype
include Compilers::Filter
include Compilers::Preserve
include Compilers::Script
include Compilers::Text
include Concerns::Escapable
extend Concerns::Registerable
register :javascript, Filters::Javascript
register :css, Filters::Css
register :ruby, Filters::Ruby
end
end

View file

@ -0,0 +1,55 @@
require 'hamlit/concerns/registerable'
require 'hamlit/filters/css'
require 'hamlit/filters/javascript'
require 'hamlit/filters/ruby'
module Hamlit
module Compilers
module Filter
BASE_DEPTH = 2
IGNORED_FILTERS = %w[ruby].freeze
def on_haml_filter(name, exp)
exp = format_expressions(name, exp)
ast = Compiler.find(name).compile(exp)
compile(ast)
end
private
def format_expressions(name, lines)
return lines if IGNORED_FILTERS.include?(name)
lines = [''] if lines.empty?
lines = unindent_lines(lines)
[:multi, [:static, "\n"], *wrap_newlines(lines)]
end
def unindent_lines(lines)
base = lines.first.index(/[^\s]/) || 0
lines.map do |line|
change_indent(line, BASE_DEPTH - base)
end
end
def change_indent(line, diff)
if diff >= 0
((' ' * diff) + line).gsub(/ *\Z/, '')
else
line.gsub(/^[[:blank:]]{#{-1 * diff}}/, '')
end
end
def wrap_newlines(lines)
ast = []
lines.each do |line|
ast << [:haml, :text, line]
ast << [:static, "\n"]
end
ast
end
end
end
end

View file

@ -1,4 +1,3 @@
require 'hamlit/filter'
require 'hamlit/concerns/escapable'
module Hamlit

View file

@ -1,5 +1,3 @@
require 'hamlit/filter'
# NOTE: This compiler has an extremely bad effect for performance.
# We should optimize this.
module Hamlit

View file

@ -3,7 +3,6 @@ require 'hamlit/attribute_compiler'
require 'hamlit/attribute_sorter'
require 'hamlit/compiler'
require 'hamlit/dynamic_formatter'
require 'hamlit/filter_compiler'
require 'hamlit/html/pretty'
require 'hamlit/html/ugly'
require 'hamlit/multiline'
@ -21,7 +20,6 @@ module Hamlit
use Multiline
use Parser
use FilterCompiler
use Compiler
use AttributeCompiler
use NewAttributeCompier

View file

@ -1,60 +0,0 @@
require 'hamlit/filter'
require 'hamlit/concerns/registerable'
require 'hamlit/filters/css'
require 'hamlit/filters/javascript'
require 'hamlit/filters/ruby'
module Hamlit
class FilterCompiler < Hamlit::Filter
extend Concerns::Registerable
BASE_DEPTH = 2
IGNORED_FILTERS = %w[ruby].freeze
register :javascript, Filters::Javascript
register :css, Filters::Css
register :ruby, Filters::Ruby
def on_haml_filter(name, exp)
exp = format_expressions(name, exp)
compiler = FilterCompiler.find(name)
compiler.compile(exp)
end
private
def format_expressions(name, lines)
return lines if IGNORED_FILTERS.include?(name)
lines = [''] if lines.empty?
lines = unindent_lines(lines)
[:multi, [:static, "\n"], *wrap_newlines(lines)]
end
def unindent_lines(lines)
base = lines.first.index(/[^\s]/) || 0
lines.map do |line|
change_indent(line, BASE_DEPTH - base)
end
end
def change_indent(line, diff)
if diff >= 0
((' ' * diff) + line).gsub(/ *\Z/, '')
else
line.gsub(/^[[:blank:]]{#{-1 * diff}}/, '')
end
end
def wrap_newlines(lines)
ast = []
lines.each do |line|
ast << [:haml, :text, line]
ast << [:static, "\n"]
end
ast
end
end
end