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:
parent
9a79e887ca
commit
9d1c9d8b68
6 changed files with 66 additions and 65 deletions
|
@ -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
|
||||
|
|
55
lib/hamlit/compilers/filter.rb
Normal file
55
lib/hamlit/compilers/filter.rb
Normal 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
|
|
@ -1,4 +1,3 @@
|
|||
require 'hamlit/filter'
|
||||
require 'hamlit/concerns/escapable'
|
||||
|
||||
module Hamlit
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
require 'hamlit/filter'
|
||||
|
||||
# NOTE: This compiler has an extremely bad effect for performance.
|
||||
# We should optimize this.
|
||||
module Hamlit
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Add table
Reference in a new issue