moduleTemplemoduleHTML# @api publicclassAttributeMerger<Filterdefault_options[:attr_delimiter]={'id'=>'_','class'=>' '}default_options[:sort_attrs]=truedefon_html_attrs(*attrs)names=[]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]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]=attrnames<<nameendendresult=options[:sort_attrs]?result.sort:names.map{|k|[k,result[k]]}[:multi,*result.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