class Ting::Conversions::Hanyu

Public Class Methods

new(tone = :numbers, options = {}) click to toggle source
# File lib/ting/conversions/hanyu.rb, line 6
def initialize(tone = :numbers, options = {})
  @options = options
  @options[:preprocess] ||= lambda {|s| s.gsub(/u:|Ü/, 'ü').downcase }

  if Class === tone
    @tone = tone
  else
    @tone = Ting::Tones.const_get(Ting.camelize(tone.to_s))
  end
end

Public Instance Methods

parse(string) click to toggle source
# File lib/ting/conversions/hanyu.rb, line 32
def parse(string)
  result = []
  looking_at = []
  string.chars.each do |ch|
    head, syll = parse_tail(looking_at)
    looking_at << ch
    if syll && !parse_tail(looking_at)
      puts "-> #{syll.inspect}"
      result << head.to_s unless head.empty?
      result << syll
      looking_at = [ch]
    end
  end
  result
end
parse_syllable(tone_syll) click to toggle source
# File lib/ting/conversions/hanyu.rb, line 58
def parse_syllable(tone_syll)
  tone_syll = tone_syll.to_s
  tone_syll = @options[:preprocess].call(tone_syll) if @options[:preprocess]
  tone, syll = @tone.pop_tone(tone_syll)
  if tone && syll
    ini_fini = Conversions.parse(:hanyu,syll)
    if ini_fini
      p tone, syll, ini_fini
      ini, fini = ini_fini.initial, ini_fini.final
    end

    return Syllable.new(ini, fini, tone) if tone && ini && fini
  end
end
parse_tail(chars) click to toggle source
# File lib/ting/conversions/hanyu.rb, line 48
def parse_tail(chars)
  7.downto(1) do |i|
    head = chars[0...-i]
    tail = chars[-i..-1]
    syll = parse_syllable( tail )
    return head, syll if syll
  end
  nil
end
valid_character_regexp() click to toggle source
# File lib/ting/conversions/hanyu.rb, line 17
def valid_character_regexp
  @valid_character_regexp ||= valid_character_regexp!
end
valid_character_regexp!() click to toggle source
# File lib/ting/conversions/hanyu.rb, line 21
def valid_character_regexp!
  valid_chars = []
  Ting.valid_combinations do |i,f|
    1.upto(5) do |tone|
      valid_chars += @tone.add_tone(Conversions.unparse(:hanyu,Syllable.new(i,f)), tone).chars.to_a
    end
  end
  valid_chars.sort!.uniq!
  Regexp.new(valid_chars.map{|ch| Regexp.escape(ch)}.join('|'))
end