class Ting::Tones::Accents
Constants
- UNICODE_TONE_GLYPHS
Public Class Methods
add_tone(syll, tone)
click to toggle source
# File lib/ting/tones/accents.rb, line 23 def add_tone(syll, tone) syll = syll.sub('ü','v') tone = tone % MAX_TONE case syll when /a/ syll.sub(/a/, tone_glyph(:a,tone)) when /e/ syll.sub(/e/, tone_glyph(:e,tone)).sub('v', 'ü') when /o/ syll.sub(/o/, tone_glyph(:o,tone)) when /(i|u|v)\z/ syll.sub($1, tone_glyph($1,tone)).sub('v', 'ü') when /(i|u|v)/ syll.sub($1, tone_glyph($1,tone)).sub('v', 'ü') else syll end end
peek_tone(syll)
click to toggle source
# File lib/ting/tones/accents.rb, line 42 def peek_tone(syll) candidates = each_tone_glyph.map do |vowel, tones| tone_glyph = syll.codepoints.find {|t| tones.include?(t)} normalize( tones.index(tone_glyph) ) if tone_glyph end.compact candidates.reject {|tone| tone == 5}.first || candidates.first end
pop_tone(syll)
click to toggle source
returns [ tone number, syllable without tone ] e.g. ni3 => [ 3, 'ni' ]
# File lib/ting/tones/accents.rb, line 52 def pop_tone(syll) tone = peek_tone(syll) unpacked = syll.codepoints.to_a each_tone_glyph do |vowel, tone_glyph_codepoints| tone_glyph_cp = tone_glyph_codepoints[tone % MAX_TONE] if unpacked.include? tone_glyph_cp unpacked[unpacked.index(tone_glyph_cp)] = vowel.to_s.unpack('U').first return [normalize(tone_glyph_codepoints.index(tone_glyph_cp)), unpacked.pack('U*').sub('v', 'ü')] end end end
tone_glyph(letter,tone)
click to toggle source
# File lib/ting/tones/accents.rb, line 17 def tone_glyph(letter,tone) if (u=UNICODE_TONE_GLYPHS[letter.to_sym][tone%MAX_TONE]) [u].pack('U') end end
Private Class Methods
each_tone_glyph() { |vowel,tones| ... }
click to toggle source
# File lib/ting/tones/accents.rb, line 65 def each_tone_glyph return to_enum(__method__) unless block_given? [:a,:e,:i,:o,:u,:v].each do |v| #Order is significant vowel, tones = v, UNICODE_TONE_GLYPHS[v] yield vowel,tones end end