class TwitterCldr::Transforms::RuleSet

Attributes

rules[R]
transform_id[R]

Public Class Methods

new(rules, transform_id) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 15
def initialize(rules, transform_id)
  @rules = partition(rules)
  @transform_id = transform_id
end

Public Instance Methods

invert() click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 26
def invert
  self.class.new(
    rules.reverse.map(&:invert), transform_id
  )
end
transform(text) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 20
def transform(text)
  cursor = Cursor.new(text.dup)
  rules.each { |rule| rule.apply_to(cursor) }
  cursor.text
end

Private Instance Methods

is_backward_filter?(rule) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 104
def is_backward_filter?(rule)
  rule.is_filter_rule? && rule.backward?
end
is_forward_filter?(rule) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 100
def is_forward_filter?(rule)
  rule.is_filter_rule? && !rule.backward?
end
make_conversion_rule_set(rules, filter_rule, inverse_filter_rule) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 92
def make_conversion_rule_set(rules, filter_rule, inverse_filter_rule)
  TwitterCldr::Transforms::ConversionRuleSet.new(
    filter_rule || Filters::NullFilter.new,
    inverse_filter_rule || Filters::NullFilter.new,
    rules
  )
end
partition(rules) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 34
def partition(rules)
  [].tap do |result|
    until rules.empty?
      filter_rule = nil
      inverse_filter_rule = nil

      if is_forward_filter?(rules[0])
        filter_rule = rules[0]
        rules.shift
      end

      trans_rules = take_transforms(rules)
      conv_rules = take_conversions(rules)
      result.concat(trans_rules)

      if !rules.empty? && is_backward_filter?(rules[0])
        inverse_filter_rule = rules[0]
        rules.shift
      end

      unless conv_rules.empty?
        result << make_conversion_rule_set(
          conv_rules, filter_rule, inverse_filter_rule
        )
      end

      # Handles the ConversionRuleSet case, which is neither
      # a transform rule nor a conversion rule.
      # ConversionRuleSets can occasionally exist in the list
      # of rules if, say, the rule set is being inverted and
      # therefore already contains a list of partitioned rules.
      if trans_rules.empty? && conv_rules.empty?
        result << rules.delete_at(0)
      end
    end
  end
end
take_conversions(rules) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 76
def take_conversions(rules)
  take_rules(rules, &:is_conversion_rule?)
end
take_rules(rules) { |rule| ... } click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 80
def take_rules(rules)
  [].tap do |result|
    rules.reject! do |rule|
      if yield(rule)
        result << rule
      else
        break
      end
    end
  end
end
take_transforms(rules) click to toggle source
# File lib/twitter_cldr/transforms/rule_set.rb, line 72
def take_transforms(rules)
  take_rules(rules, &:is_transform_rule?)
end