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

Combine ids and classes in html tags

This commit is contained in:
Takashi Kokubun 2015-03-27 23:40:03 +09:00
parent cc6295d400
commit 3845db3264
2 changed files with 29 additions and 20 deletions

View file

@ -6,38 +6,45 @@ require 'hamlit/filter'
module Hamlit module Hamlit
class AttributeSorter < Hamlit::Filter class AttributeSorter < Hamlit::Filter
def on_haml_attrs(*attrs) def on_haml_attrs(*attrs)
[:html, :attrs, *pull_class_first(attrs)] attrs = join_ids(attrs)
attrs = combine_classes(attrs)
attrs = pull_class_first(attrs)
[:html, :attrs, *attrs]
end end
private private
def pull_class_first(attrs) def pull_class_first(attrs)
class_attrs = attrs.select do |html, attr, name, content| class_attrs = filter_attrs(attrs, 'class')
name == 'class'
end
combine_classes(class_attrs) + (attrs - class_attrs) combine_classes(class_attrs) + (attrs - class_attrs)
end end
def combine_classes(attrs) def combine_classes(attrs)
return attrs if attrs.length <= 1 class_attrs = filter_attrs(attrs, 'class')
return attrs if class_attrs.length <= 1
values = [] values = class_attrs.map(&:last).sort_by(&:last)
attrs.each_with_index do |(html, attr, name, value), index| [[:html, :attr, 'class', [:multi, *insert_static(values, ' ')]]] + (attrs - class_attrs)
type, str = value
case type
when :static
values.push(value)
when :dynamic
values.unshift(value)
end
end
[[:html, :attr, 'class', [:multi, *insert_spaces(values)]]]
end end
def insert_spaces(array) def join_ids(attrs)
id_attrs = filter_attrs(attrs, 'id')
return attrs if id_attrs.length <= 1
values = attrs.map(&:last)
[[:html, :attr, 'id', [:multi, *insert_static(values, '_')]]] + (attrs - id_attrs)
end
def filter_attrs(attrs, target)
class_attrs = attrs.select do |html, attr, name, content|
name == target
end
end
def insert_static(array, str)
result = [] result = []
array.each_with_index do |value, index| array.each_with_index do |value, index|
result << [:static, ' '] if index > 0 result << [:static, str] if index > 0
result << value result << value
end end
result result

View file

@ -341,7 +341,8 @@ describe "haml" do
assert_ugly(haml, locals, options) assert_ugly(haml, locals, options)
end end
specify "HTML-style attributes separated with newlines" do # FIXME: it requires multiple-line attribute parser
pending "HTML-style attributes separated with newlines" do
haml = %q{%p(a='b' haml = %q{%p(a='b'
c='d')} c='d')}
locals = {} locals = {}
@ -435,7 +436,8 @@ describe "haml" do
assert_ugly(haml, locals, options) assert_ugly(haml, locals, options)
end end
specify "Ruby-style attributes separated with newlines" do # FIXME: it requires multiple-line attribute parser
pending "Ruby-style attributes separated with newlines" do
haml = %q{%p{ :a => 'b', haml = %q{%p{ :a => 'b',
'c' => 'd' }} 'c' => 'd' }}
locals = {} locals = {}