roka 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 497e882b9a0a284194ebb131fbb50a00c5ed3fd3
4
- data.tar.gz: a46eef1091e38182f23dff720fe4333b3d095125
3
+ metadata.gz: f288807db01ef8354ddb642a8202e1709243751e
4
+ data.tar.gz: e019147f12f3a784f10012bdfa5bad85d635aa0a
5
5
  SHA512:
6
- metadata.gz: 2acdaf6c30fc419b0ba6f4faceab0a13c5183bda348727e860062e1627e891b9653ccc21b0dcad1c35024b655c058e313ba1263d8e5693ea164fb7b53ec6b57d
7
- data.tar.gz: 1ba7ca636288931eaeeeabdfac330fd2ceec9868be28a24ba6d38811c095e19f760eff3940c76de0f357b0462bcb034d33adcbdeee4f6c16f1160c2d09175bb6
6
+ metadata.gz: 38bcbf0086694e5d59619e98a940147eec56e53d01d398a27a6da8336fa20cdd006a690d49bf849585fce4459ee5f71852e493c2816895f11b55fb172d96c3a6
7
+ data.tar.gz: d795cba70b0b04a0a64a256c4d60660bbac4cabcc803c8c7d4a20aea066ad97984a3f5db7799d75b7835738a5d14e8023f376a43185a7d349f352a9e4e48a478
data/README.md CHANGED
@@ -30,7 +30,7 @@ require 'roka'
30
30
  'kondo',
31
31
  'kyari-pamyupamyu',
32
32
  'hohno',
33
- 'hyogakyo',
33
+ 'hyougaki',
34
34
  ].each do |romaji|
35
35
  puts romaji
36
36
  p Roka.convert(romaji)
@@ -38,32 +38,54 @@ end
38
38
  # oyasai
39
39
  # ["オヤサイ"]
40
40
  # ono
41
- # ["オノ", "オノオ", "オノウ"]
41
+ # ["オンオ", "オノ", "オオンオ", "オオノ", "オウンオ", "オウノ"]
42
42
  # ohno
43
- # ["オノ", "オオノ", "オノオ", "オノウ", "オオノオ", "オオノウ"]
43
+ # ["オンオ", "オノ", "オオンオ", "オオノ"]
44
44
  # omi
45
- # ["オミ", "オオミ", "オウミ"]
45
+ # ["オミ"]
46
46
  # otto
47
- # ["オット", "オオット", "オウット", "オットオ", "オットウ", "オオットオ", "オオットウ", "オウットオ", "オウットウ"]
47
+ # ["オット"]
48
48
  # kohama
49
49
  # ["コハマ"]
50
50
  # kondo
51
- # ["コンド", "コンドオ", "コンドウ"]
51
+ # ["コンド", "コンドウ"]
52
52
  # kyari-pamyupamyu
53
53
  # ["キャリーパミュパミュ"]
54
54
  # hohno
55
- # ["ホノ", "ホオノ", "ホノオ", "ホノウ", "ホオノオ", "ホオノウ"]
56
- # hyogaki
57
- # ["ヒョガキ", "ヒョオガキ", "ヒョウガキ"]
55
+ # ["ホンオ", "ホノ", "ホオンオ", "ホオノ"]
56
+ # hyougaki
57
+ # ["ヒョウガキ"]
58
58
  ```
59
59
 
60
60
  ### CLI
61
61
 
62
62
  ```sh
63
- $ roka rokadesu
64
- ロカデス
65
- ロオカデス
66
- ロウカデス
63
+ $ roka koniro kono konno konyakku konnyaku ann koh kondo
64
+ --- koniro
65
+ コンイロ
66
+ コニロ
67
+ --- kono
68
+ コンオ
69
+ コノ
70
+ コオンオ
71
+ コオノ
72
+ コウンオ
73
+ コウノ
74
+ --- konno
75
+ コンノ
76
+ コンノウ
77
+ --- konyakku
78
+ コニャック
79
+ --- konnyaku
80
+ コンニャク
81
+ --- ann
82
+ アン
83
+ --- koh
84
+
85
+ コウ
86
+ --- kondo
87
+ コンド
88
+ コンドウ
67
89
  ```
68
90
 
69
91
 
data/exe/roka CHANGED
@@ -6,5 +6,8 @@ $LOAD_PATH << "#{root}/lib" if File.exist?("#{root}/Gemfile")
6
6
 
7
7
  require 'roka'
8
8
 
9
- text = ARGV[0]
10
- puts Roka.convert(text) if text
9
+ ARGV.each do |text|
10
+ next unless text
11
+ puts '--- %s' % [text]
12
+ puts Roka.convert(text)
13
+ end
@@ -36,18 +36,19 @@ class Roka::Converter
36
36
  }
37
37
 
38
38
  PATTERN_CHANGES = {
39
- /n([^aeiou])/ => 'nn\1',
40
- /([^aeiou])\1/ => 'xtu\1',
41
39
  /([kg])w([aeiou])/ => '\1ux\2',
42
40
  /([td])w([aeiou])/ => '\1ox\2',
43
41
  /([sc])h([aeiou])/ => '\1ixy\2',
44
42
  /([kgszjtcdnhbpmrl])y([aeiou])/ => '\1ixy\2',
45
43
  /([td])h([aeiou])/ => '\1exy\2',
44
+ /n([^aeioun])/ => 'n\1',
45
+ /([^aeioun])\1/ => 'xtu\1',
46
+ /nn\b/ => 'n',
47
+ /^(n[^aeiou]o)([^h]|\b)/ => '\1h\2',
46
48
  }
47
49
 
48
50
  EXCEPTIONS = {
49
51
  '-' => 'ー',
50
- 'nn' => 'ン',
51
52
  'xka' => 'ヵ',
52
53
  'xke' => 'ヶ',
53
54
  'xtu' => 'ッ',
@@ -60,7 +61,7 @@ class Roka::Converter
60
61
  attr_reader :determined
61
62
 
62
63
  def initialize(str)
63
- @buffer = regulate(str)
64
+ @buffer = regulate(str)
64
65
  @determined = []
65
66
  end
66
67
 
@@ -74,7 +75,7 @@ class Roka::Converter
74
75
  || parse_pattern \
75
76
  || parse_prefix \
76
77
  || parse_vowel \
77
- || consume(1)
78
+ || parse_last
78
79
  end
79
80
 
80
81
  def parse_exception
@@ -109,8 +110,12 @@ class Roka::Converter
109
110
  vowel = @buffer[l]
110
111
 
111
112
  if (i = VOWELS_INDEX.index(vowel))
112
- consume(l + 1, changes[i])
113
- expand_long_sound(vowel)
113
+ if 'n' == @buffer[0] && 'x' != @buffer[l + 1] && 'ン' != @determined[@determined.size - 1]
114
+ consume(l + 1, ['ン' + VOWELS_KANA[i], changes[i]])
115
+ else
116
+ consume(l + 1, changes[i])
117
+ end
118
+ expand_long_sound(prefix, vowel)
114
119
  return true
115
120
  end
116
121
  end
@@ -123,13 +128,21 @@ class Roka::Converter
123
128
  vowel = @buffer[0]
124
129
  if (i = VOWELS_INDEX.index(vowel))
125
130
  consume(1, VOWELS_KANA[i])
126
- expand_long_sound(vowel)
131
+ expand_long_sound(nil, vowel)
127
132
  true
128
133
  else
129
134
  false
130
135
  end
131
136
  end
132
137
 
138
+ def parse_last
139
+ if 'n' == @buffer[0]
140
+ consume(1, 'ン')
141
+ else
142
+ consume(1)
143
+ end
144
+ end
145
+
133
146
  def consume(len, replacement = nil)
134
147
  replacement = @buffer[0...len] if replacement.nil?
135
148
  @determined << replacement if replacement
@@ -137,18 +150,23 @@ class Roka::Converter
137
150
  true
138
151
  end
139
152
 
140
- def expand_long_sound(vowel)
141
- return unless 'o' == vowel
142
- peak = @buffer[0]
143
-
144
- if 'h' == peak
145
- u1 = self.class.new(@buffer).tap(&:parse).determined
146
- if u1[0] == 'h'
147
- consume(1, false)
148
- @determined << ['オ']
153
+ def expand_long_sound(prefix, vowel)
154
+ c = @buffer[0]
155
+
156
+ case vowel
157
+ when 'o'
158
+ if 'h' == c && !@buffer[1]
159
+ consume(1, ['', ''])
160
+ elsif 'h' == c
161
+ d, _ = peak
162
+ if d[0] == 'h'
163
+ consume(1, ['', 'オ'])
164
+ end
165
+ elsif !(VOWELS_INDEX + %w[y]).include?(c) && ('n' == c && 'o' == @buffer[1])
166
+ @determined << ['', 'オ', 'ウ']
149
167
  end
150
- elsif !(VOWELS_INDEX + %w[n y]).include?(peak)
151
- @determined << ['', 'ウ']
168
+ when 'u'
169
+ @determined << ['', 'ウ'] if 'y' == prefix
152
170
  end
153
171
  end
154
172
 
@@ -161,7 +179,7 @@ class Roka::Converter
161
179
 
162
180
  @determined.each do |det|
163
181
  if det.is_a?(Array)
164
- tree += tree.product(det).map(&:join)
182
+ tree = tree.product(det).map(&:join)
165
183
  else
166
184
  tree.each { |t| t << det }
167
185
  end
@@ -174,4 +192,16 @@ class Roka::Converter
174
192
  NKF.nkf('-m0 -Z1 -w', str.to_s.downcase).gsub(/[^a-z-]+/, ' ')
175
193
  end
176
194
 
195
+ def peak(_buffer = nil)
196
+ determined = @determined
197
+ buffer = @buffer
198
+ @determined = []
199
+ @buffer = _buffer unless _buffer.nil?
200
+ parse while @determined.empty? || !eos?
201
+ [@determined, @buffer].tap do
202
+ @determined = determined
203
+ @buffer = buffer
204
+ end
205
+ end
206
+
177
207
  end
@@ -1,3 +1,3 @@
1
1
  module Roka
2
- VERSION = "0.1.0"
2
+ VERSION = '0.1.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuki Iwanaga