Class: Yosina::Transliterators::HiraKataComposition::Transliterator

Inherits:
BaseTransliterator show all
Defined in:
lib/yosina/transliterators/hira_kata_composition.rb

Overview

Transliterator for hiragana/katakana composition

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Transliterator

Initialize the transliterator with options

Parameters:

  • options (Hash) (defaults to: {})

    Configuration options

Options Hash (options):

  • :compose_non_combining_marks (Boolean)

    Whether to compose non-combining marks (゛ and ゜) too. Defaults to false.



37
38
39
40
41
# File 'lib/yosina/transliterators/hira_kata_composition.rb', line 37

def initialize(options = {})
  super()
  @compose_non_combining_marks = options[:compose_non_combining_marks] || false
  @mappings = @compose_non_combining_marks ? NON_COMBINING_MARKS : COMBINING_MARKS
end

Instance Attribute Details

#compose_non_combining_marksObject (readonly)

Returns the value of attribute compose_non_combining_marks.



30
31
32
# File 'lib/yosina/transliterators/hira_kata_composition.rb', line 30

def compose_non_combining_marks
  @compose_non_combining_marks
end

Instance Method Details

#call(input_chars) ⇒ Enumerable<Char>

Combine decomposed hiragana and katakana characters with their marks

Parameters:

  • input_chars (Enumerable<Char>)

    The characters to transliterate

Returns:

  • (Enumerable<Char>)

    The transliterated characters



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/yosina/transliterators/hira_kata_composition.rb', line 47

def call(input_chars)
  e = input_chars.each
  offset = 0

  Chars.enum do |y|
    begin
      prev = e.next
    rescue StopIteration
      break
    end

    if prev.sentinel?
      y << prev
      break
    end

    loop do
      begin
        char = e.next
      rescue StopIteration
        break
      end

      if prev
        # Check for combining marks
        if (mark_mapping = @mappings[char.c]) && (composed = mark_mapping[prev.c])
          # Found a composable combination
          y << Char.new(c: composed, offset: offset, source: char)
          offset += composed.length
          prev = nil
          next
        end

        # No composition possible, keep original character
        y << prev.with_offset(offset)
        offset += prev.c.length
      end
      prev = char
    end
    if prev
      y << prev.with_offset(offset)
      offset += prev.c.length
    end
  end
end