# File tailor.rb, line 42 def process # process imports process_import(@xml_document, TOPLEVEL_BINDING) # process each loops loops = REXML::XPath.match(@xml_document, '//*[@each]') loops.reverse! # reverse loops to do inner nested loops first loops.each do |element| # new_element_string = '' element.write(new_element_string) # loop_each = element.attributes['each'] if element.attributes.has_key?('do') loop_do = element.attributes['do'] else loop_do = 'item' end # collect bindings indexer = "#{loop_do.split(',')[0]}_index" loop_eval = "i = -1 \n" loop_eval += "#{loop_each}.collect do |#{loop_do}| \n" loop_eval += " #{indexer} = i += 1 \n" loop_eval += " binding \n" loop_eval += "end \n" loop_bindings = eval(loop_eval.untaint, TOPLEVEL_BINDING) loop_bindings.each do |loop_binding| # for each binding substitute items # make new element new_element_source = REXML::SourceFactory.create_from(new_element_string) new_element = REXML::Element.new(new_element_source) new_element.attributes.get_attribute('each').remove new_element.attributes.get_attribute('do').remove if element.attributes.has_key?('do') # process items process_eval(new_element.untaint, loop_binding) process_if(new_element, loop_binding) process_content(new_element, loop_binding) process_attributes_if(new_element, loop_binding) process_attributes(new_element, loop_binding) # insert the new element element.parent.insert_before(element, new_element) end element.remove end # those not contained in each loops process_eval(@xml_document, TOPLEVEL_BINDING) process_if(@xml_document, TOPLEVEL_BINDING) process_content(@xml_document, TOPLEVEL_BINDING) process_attributes_if(@xml_document, TOPLEVEL_BINDING) process_attributes(@xml_document, TOPLEVEL_BINDING) end