class FoodIngredientParser::Loose::Transform::SplitENumbers

Constants

MATCH_RE
SINGLE_RE
SPLIT_RE

Transforms node tree to split e-number combinations.

@note mark and amount is lost, this is not expected on e-numbers

Public Class Methods

new(node) click to toggle source
# File lib/food_ingredient_parser/loose/transform/split_e_numbers.rb, line 18
def initialize(node)
  @node = node
end
transform!(node) click to toggle source
# File lib/food_ingredient_parser/loose/transform/split_e_numbers.rb, line 14
def self.transform!(node)
  new(node).transform!
end

Public Instance Methods

transform!() click to toggle source
# File lib/food_ingredient_parser/loose/transform/split_e_numbers.rb, line 22
def transform!
  transform_node!(@node)
  @node
end

Private Instance Methods

new_node(node, begins, ends) click to toggle source
# File lib/food_ingredient_parser/loose/transform/split_e_numbers.rb, line 43
def new_node(node, begins, ends)
  offset = node.name.interval.first
  new_node = Node.new(node.input, offset + begins .. offset + ends)
  new_node.name = Node.new(node.input, new_node.interval)
  new_node
end
transform_node!(node) click to toggle source
# File lib/food_ingredient_parser/loose/transform/split_e_numbers.rb, line 29
def transform_node!(node)
  if node.contains.any?
    node.contains.each {|n| transform_node!(n) }
  elsif node.name && m = MATCH_RE.match(node.name.text_value)
    i = 0
    while m = node.name.text_value.match(SPLIT_RE, i)
      node.contains << new_node(node, i, m.begin(0)-1)
      i = m.end(0)
    end
    node.contains << new_node(node, i, node.name.interval.last) if i <= node.name.interval.last
    node.name = nil
  end
end