moduleTemplemoduleHTML# @api publicclassAttributeMerger<Filterdefault_options[:attr_delimiter]={'id'=>'_','class'=>' '}defon_html_attrs(*attrs)result={}attrs.eachdo|attr|raise(InvalidExpression,'Attribute is not a html attr')ifattr[0]!=:html||attr[1]!=:attrname,value=attr[2].to_s,attr[3]nextifempty_exp?(value)ifresult[name]delimiter=options[:attr_delimiter][name]raise"Multiple #{name} attributes specified"unlessdelimiterifempty_exp?(value)result[name]=[:html,:attr,name,[:multi,result[name][3],value]]elsifcontains_static?(value)result[name]=[:html,:attr,name,[:multi,result[name][3],[:static,delimiter],value]]elsetmp=unique_nameresult[name]=[:html,:attr,name,[:multi,result[name][3],[:capture,tmp,value],[:if,"!#{tmp}.empty?",[:multi,[:static,delimiter],[:dynamic,tmp]]]]]endelseresult[name]=attrendend[:multi,*result.sort.map{|name,attr|compile(attr)}]enddefon_html_attr(name,value)ifempty_exp?(value)valueelsifcontains_static?(value)[:html,:attr,name,value]elsetmp=unique_name[:multi,[:capture,tmp,compile(value)],[:if,"!#{tmp}.empty?",[:html,:attr,name,[:dynamic,tmp]]]]endendprotecteddefcontains_static?(exp)caseexp[0]when:multiexp[1..-1].any?{|e|contains_static?(e)}when:escapecontains_static?(exp[2])when:statictrueelsefalseendendendendend