class TwitterCldr::Transforms::ConversionRuleSet

Attributes

filter_rule[R]
inverse_filter_rule[R]
rule_index[R]
rules[R]

Public Class Methods

new(filter_rule, inverse_filter_rule, rules) click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 16
def initialize(filter_rule, inverse_filter_rule, rules)
  @rules = rules
  @filter_rule = filter_rule
  @inverse_filter_rule = inverse_filter_rule
  @rule_index = build_rule_index(rules)
end

Public Instance Methods

apply_to(cursor) click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 53
def apply_to(cursor)
  until cursor.eos?
    if filter_rule.matches?(cursor)
      rule_match = find_matching_rule_at(cursor)

      if rule_match
        start = rule_match.start
        stop = rule_match.stop
        replacement = rule_match.replacement
        puts "#{cursor.text[start...stop]} -> #{replacement}" if $debug
        cursor.text[start...stop] = replacement

        cursor.advance(
          replacement.size + rule_match.cursor_offset
        )
      else
        cursor.advance
      end
    else
      cursor.advance
    end
  end
end
backward?() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 27
def backward?
  false
end
forward?() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 23
def forward?
  true
end
invert() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 47
def invert
  ConversionRuleSet.new(
    inverse_filter_rule, filter_rule, inverted_rules
  )
end
is_conversion_rule?() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 39
def is_conversion_rule?
  false
end
is_conversion_rule_set?() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 43
def is_conversion_rule_set?
  true
end
is_filter_rule?() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 31
def is_filter_rule?
  false
end
is_transform_rule?() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 35
def is_transform_rule?
  false
end

Private Instance Methods

build_rule_index(rules) click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 132
def build_rule_index(rules)
  TwitterCldr::Utils::Trie.new.tap do |trie|
    rules.each_with_index do |rule, idx|
      next unless rule.forward?

      if rule.has_codepoints?
        codepoints = rule.codepoints

        if codepoints.size > 0
          rule.codepoints.each do |codepoint|
            bytes = codepoint.chr('UTF-8').bytes

            if entry = trie.get(bytes)
              entry << rule
            else
              trie.add(bytes, [rule])
            end
          end
        end
      else
        if entry = trie.get([0])
          entry << rule
        else
          trie.add([0], [rule])
        end
      end
    end
  end
end
find_matching_blank_key_rule_at(cursor) click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 120
def find_matching_blank_key_rule_at(cursor)
  if rules = rule_index.get([0])
    rules.each do |rule|
      if side_match = rule.match(cursor)
        return RuleMatch.new(rule, side_match)
      end
    end
  end

  nil
end
find_matching_indexed_rule_at(cursor) click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 108
def find_matching_indexed_rule_at(cursor)
  if rules = rule_index.get(cursor.index_values)
    rules.each do |rule|
      if side_match = rule.match(cursor)
        return RuleMatch.new(rule, side_match)
      end
    end
  end

  nil
end
find_matching_rule_at(cursor) click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 89
def find_matching_rule_at(cursor)
  indexed_match = find_matching_indexed_rule_at(cursor)
  blank_key_match = find_matching_blank_key_rule_at(cursor)

  if indexed_match
    if blank_key_match
      if blank_key_match < indexed_match
        blank_key_match
      else
        indexed_match
      end
    else
      indexed_match
    end
  else
    blank_key_match
  end
end
inverted_rules() click to toggle source
# File lib/twitter_cldr/transforms/conversion_rule_set.rb, line 79
def inverted_rules
  @inverted_rules ||= begin
    rules.each_with_object([]) do |rule, ret|
      if rule.can_invert?
        ret << rule.invert
      end
    end
  end
end