roka 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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