Wanakana 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 83237c4590625bb466af15e9defe6818306ff60b
4
+ data.tar.gz: c9c236fbfecc092491b47832a09ba4935b2adef7
5
+ SHA512:
6
+ metadata.gz: f9554316e0a9ee5339ae0dc8552e70778e65d4058f63ba9dac52b94bbe17e9ae8a89ef4ae0c5d88119f6188c28668e0e868b55c5305a5de542db0e0c4e4b8b54
7
+ data.tar.gz: 7e653deb792da02a384a2a2a5f850ec557011892692b207ddeb22b224243dad27cdb2a79134b2b976fe08fb4dd42cf30c4865d3c3022e4ce223a710dde8c9436
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.0
5
+ before_install: gem install bundler -v 1.12.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in wanakana.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Cantrell NM
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,69 @@
1
+ # WanaKanaRuby
2
+
3
+ Ruby port of [WaniKani/WanaKana](https://github.com/WaniKani/WanaKana), a Javascript library that provides utilities for detecting and transliterating Hiragana <--> Katakana <--> Romaji.
4
+
5
+ This port does not have the methods .bind or .unbind for inputs as WanKana.js does.
6
+
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'wanakana'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install wanakana
23
+
24
+ ## Usage
25
+
26
+ ```ruby
27
+ # Returns false if string contains mixed characters, otherwise true if Hiragana.
28
+ Wanakana.is_hiragana?(string)
29
+
30
+ # Returns false if string contains characters outside of the kana family, otherwise true if Hiragana and/or Katakana.
31
+ Wanakana.is_kana?(string)
32
+
33
+ # Returns false if string contains mixed characters, otherwise true if Katakana.
34
+ Wanakana.is_katakana>(string)
35
+
36
+ # Convert Katakana or Romaji to Hiragana.
37
+ Wanakana.to_hiragana(string [, options])
38
+
39
+ # Convert Romaji to Kana. Lowcase entries output Hiragana, while upcase entries output Katakana.
40
+ Wanakana.to_kana(string [, options])
41
+
42
+ # Convert Hiragana or Romaji to Katakana.
43
+ Wanakana.to_katakana(string [, options])
44
+
45
+ # Convert Kana to Romaji.
46
+ Wanakana.to_romaji(string [, options])
47
+
48
+ # Options:
49
+ # Many functions take an optional `options` hash.
50
+ # Here is the default hash used for options.
51
+ {
52
+ :useObsoleteKana => false, # Set to true to use obsolete characters, such as ゐ and ゑ.
53
+ :convertKatakanaToUppercase => false # Set to true to convert katakana characters to uppercase romaji.
54
+ }
55
+ ```
56
+
57
+ ## Development
58
+
59
+ After cloning the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
60
+
61
+ ## Contributing
62
+
63
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/cantrellnm/WanaKanaRuby).
64
+
65
+
66
+ ## License
67
+
68
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
69
+
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/lib/*_test.rb']
8
+ # t.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "wanakana"
5
+
6
+ require "irb"
7
+ IRB.start
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -0,0 +1,803 @@
1
+ require "wanakana/version"
2
+
3
+ module Wanakana
4
+ # based on wanakana.js version 1.3.7
5
+
6
+ LOWERCASE_START = 0x61;
7
+ LOWERCASE_END = 0x7A;
8
+ UPPERCASE_START = 0x41;
9
+ UPPERCASE_END = 0x5A;
10
+ HIRAGANA_START = 0x3041;
11
+ HIRAGANA_END = 0x3096;
12
+ KATAKANA_START = 0x30A1;
13
+ KATAKANA_END = 0x30FA;
14
+ LOWERCASE_FULLWIDTH_START = 0xFF41;
15
+ LOWERCASE_FULLWIDTH_END = 0xFF5A;
16
+ UPPERCASE_FULLWIDTH_START = 0xFF21;
17
+ UPPERCASE_FULLWIDTH_END = 0xFF3A;
18
+
19
+ #
20
+ # .bind, .unbind, ._onInput excluded from this port and IMEMode commented out
21
+ #
22
+
23
+ @@default_options = {
24
+ useObsoleteKana: false,
25
+ convertKatakanaToUppercase: false
26
+ # IMEMode: false
27
+ }
28
+
29
+ def self.default_options(opt=nil)
30
+ @@default_options = extend(opt, @@default_options) if opt
31
+ @@default_options
32
+ end
33
+
34
+ def self.is_hiragana?(input)
35
+ chars = input.split('')
36
+ are_hira = chars.select { |c| is_char_hiragana?(c) }
37
+ chars.length == are_hira.length
38
+ end
39
+
40
+ def self.is_katakana?(input)
41
+ chars = input.split('')
42
+ are_kata = chars.select { |c| is_char_katakana?(c) }
43
+ chars.length == are_kata.length
44
+ end
45
+
46
+ def self.is_kana?(input)
47
+ chars = input.split('')
48
+ are_kana = chars.select { |c| is_char_hiragana?(c) || is_char_katakana?(c) }
49
+ chars.length == are_kana.length
50
+ end
51
+
52
+ def self.is_romaji?(input)
53
+ chars = input.split('')
54
+ are_roma = chars.select { |c| !is_char_hiragana?(c) && !is_char_katakana?(c) }
55
+ chars.length == are_roma.length
56
+ end
57
+
58
+ def self.to_hiragana(input, options={})
59
+ return romaji_to_hiragana(input, options) if is_romaji?(input)
60
+ return katakana_to_hiragana(input) if is_katakana?(input)
61
+ input
62
+ end
63
+
64
+ def self.to_katakana(input, options={})
65
+ return hiragana_to_katakana(input) if is_hiragana?(input)
66
+ if is_romaji?(input)
67
+ input = romaji_to_hiragana(input, options)
68
+ return hiragana_to_katakana(input)
69
+ end
70
+ input
71
+ end
72
+
73
+ def self.to_kana(input, options={})
74
+ romaji_to_kana(input, options)
75
+ end
76
+
77
+ def self.to_romaji(input, options={})
78
+ hiragana_to_romaji(input, options)
79
+ end
80
+
81
+ protected
82
+
83
+ # For adding defaults to options hash
84
+ def self.extend(target, source)
85
+ return source if !target || target.empty?
86
+ source.each do |key, value|
87
+ target[key] = value unless target.has_key?(key)
88
+ end
89
+ target
90
+ end
91
+
92
+ def self.is_char_in_range?(char, start, finish)
93
+ code = char[0].ord
94
+ code.between?(start, finish)
95
+ end
96
+
97
+ def self.is_char_vowel?(char, includeY=true)
98
+ return false unless char
99
+ regexp = (includeY ? /[aeiouy]/ : /[aeiou]/)
100
+ char.downcase[0] =~ regexp
101
+ end
102
+
103
+ def self.is_char_consonant?(char, includeY=true)
104
+ return false unless char
105
+ regexp = (includeY ? /[bcdfghjklmnpqrstvwxyz]/ : /[bcdfghjklmnpqrstvwxz]/)
106
+ char.downcase[0] =~ regexp
107
+ end
108
+
109
+ def self.is_char_katakana?(char)
110
+ is_char_in_range?(char, Wanakana::KATAKANA_START, Wanakana::KATAKANA_END)
111
+ end
112
+
113
+ def self.is_char_hiragana?(char)
114
+ is_char_in_range?(char, Wanakana::HIRAGANA_START, Wanakana::HIRAGANA_END)
115
+ end
116
+
117
+ def self.is_char_kana?(char)
118
+ is_char_hiragana?(char) || is_char_katakana?(char)
119
+ end
120
+
121
+ def self.is_char_not_kana?(char)
122
+ !is_char_hiragana?(char) && !is_char_katakana?(char)
123
+ end
124
+
125
+ def self.convert_full_width_chars_to_ASCII(string)
126
+ chars = string.split('')
127
+ chars.map! do |char|
128
+ code = char[0].ord
129
+ if is_char_in_range?(char, Wanakana::LOWERCASE_FULLWIDTH_START, Wanakana::LOWERCASE_FULLWIDTH_END)
130
+ char = [code - Wanakana::LOWERCASE_FULLWIDTH_START + Wanakana::LOWERCASE_START].pack('U*')
131
+ elsif is_char_in_range?(char, Wanakana::UPPERCASE_FULLWIDTH_START, Wanakana::UPPERCASE_FULLWIDTH_END)
132
+ char = [code - Wanakana::UPPERCASE_FULLWIDTH_START + Wanakana::UPPERCASE_START].pack('U*')
133
+ end
134
+ end
135
+ chars.join('')
136
+ end
137
+
138
+ def self.katakana_to_hiragana(kata)
139
+ chars = kata.split('')
140
+ chars.map! do |char|
141
+ if is_char_katakana?(char)
142
+ code = char[0].ord + (Wanakana::HIRAGANA_START - Wanakana::KATAKANA_START)
143
+ char = [code].pack('U*')
144
+ else
145
+ char
146
+ end
147
+ end
148
+ chars.join('')
149
+ end
150
+
151
+ def self.hiragana_to_katakana(hira)
152
+ chars = hira.split('')
153
+ chars.map! do |char|
154
+ if is_char_hiragana?(char)
155
+ code = char[0].ord + (Wanakana::KATAKANA_START - Wanakana::HIRAGANA_START)
156
+ char = [code].pack('U*')
157
+ else
158
+ char
159
+ end
160
+ end
161
+ chars.join('')
162
+ end
163
+
164
+ def self.hiragana_to_romaji(hira, options)
165
+ options = extend(options, @@default_options)
166
+ len = hira.length
167
+ roma = []
168
+ cursor = 0
169
+ chunk_size = 0
170
+ chunk = nil
171
+ roma_char = nil
172
+ next_char_is_double_consonant = false
173
+ is_kata = false
174
+ while cursor < len do
175
+ chunk_size = [2, len - cursor].min
176
+ while chunk_size > 0 do
177
+ chunk = hira.slice(cursor, chunk_size)
178
+ if is_katakana?(chunk)
179
+ is_kata = true
180
+ chunk = katakana_to_hiragana(chunk)
181
+ end
182
+ if (chunk[0] == "っ" && chunk_size == 1 && cursor < (len - 1))
183
+ next_char_is_double_consonant = true
184
+ roma_char = ''
185
+ break
186
+ end
187
+ roma_char = Wanakana::J_TO_R[chunk.to_sym]
188
+ if (roma_char && next_char_is_double_consonant)
189
+ roma_char = roma_char[0].concat(roma_char)
190
+ next_char_is_double_consonant = false
191
+ end
192
+ if roma_char && is_kata
193
+ roma_char = roma_char.upcase if options[:convertKatakanaToUppercase]
194
+ end
195
+ is_kata = false
196
+ break if roma_char
197
+ chunk_size -= 1
198
+ end
199
+ roma_char = chunk unless roma_char
200
+ roma.push(roma_char)
201
+ cursor += chunk_size > 0 ? chunk_size : 1
202
+ end
203
+ roma.join('')
204
+ end
205
+
206
+ def self.romaji_to_hiragana(roma, options)
207
+ romaji_to_kana(roma, options, true)
208
+ end
209
+
210
+ def self.romaji_to_kana(roma, options, ignore_case=false)
211
+ options = extend(options, @@default_options)
212
+ len = roma.length
213
+ kana = []
214
+ cursor = 0
215
+ chunk_size = 0
216
+ chunk = nil
217
+ kana_char = nil
218
+ chunk_LC = nil
219
+ set_chunk = lambda {
220
+ chunk = roma.slice(cursor, chunk_size)
221
+ chunk_LC = chunk.downcase
222
+ }
223
+ is_char_upper_case = lambda { |char| is_char_in_range?(char, Wanakana::UPPERCASE_START, Wanakana::UPPERCASE_END) }
224
+ while cursor < len do
225
+ chunk_size = [3, len - cursor].min
226
+ while chunk_size > 0 do
227
+ set_chunk.call()
228
+ if (Wanakana::FOUR_CHARACTER_EDGE_CASES.include?(chunk_LC) && (len - cursor) >= 4)
229
+ chunk_size += 1
230
+ set_chunk.call()
231
+ else
232
+ if chunk_LC[0] == 'n'
233
+ # if (options[:IMEMode] && chunk_LC[1] == "'" && chunk_size ==2)
234
+ # kana_char = 'ん'
235
+ # break
236
+ # end
237
+ if (is_char_consonant?(chunk_LC[1], false) && is_char_vowel?(chunk_LC[2]))
238
+ chunk_size = 1
239
+ set_chunk.call()
240
+ end
241
+ end
242
+ if (chunk_LC[0] != 'n' && is_char_consonant?(chunk_LC[0]) && chunk[0] == chunk[1])
243
+ chunk_size = 1
244
+ chunk_LC = chunk = (is_char_in_range?(chunk[0], Wanakana::UPPERCASE_START, Wanakana::UPPERCASE_END) ? 'ッ' : 'っ')
245
+ end
246
+ end
247
+ kana_char = Wanakana::R_TO_J[chunk_LC.to_sym]
248
+ break if kana_char
249
+ chunk_size -= chunk_size == 4 ? 2 : 1
250
+ end
251
+ kana_char = chunk unless kana_char
252
+ if options[:useObsoleteKana]
253
+ kana_char = 'ゐ' if chunk_LC == 'wi'
254
+ kana_char = 'ゑ' if chunk_LC == 'we'
255
+ end
256
+ # if (options[:IMEMode] && chunk_LC[0] == 'n')
257
+ # kana_char = chunk[0] if ( roma[cursor+1].downcase == 'y' &&
258
+ # !is_char_vowel?(roma[cursor + 2]) ||
259
+ # cursor == (len - 1) ||
260
+ # is_kana?(roma[cursor + 1]) )
261
+ # end
262
+ unless ignore_case
263
+ kana_char = hiragana_to_katakana(kana_char) if is_char_upper_case.call(chunk[0])
264
+ end
265
+ kana.push(kana_char)
266
+ cursor += chunk_size > 0 ? chunk_size : 1
267
+ end
268
+ kana.join('')
269
+ end
270
+
271
+ FOUR_CHARACTER_EDGE_CASES = ['lts', 'chy', 'shy']
272
+
273
+ R_TO_J = {
274
+ a: 'あ',
275
+ i: 'い',
276
+ u: 'う',
277
+ e: 'え',
278
+ o: 'お',
279
+ yi: 'い',
280
+ wu: 'う',
281
+ whu: 'う',
282
+ xa: 'ぁ',
283
+ xi: 'ぃ',
284
+ xu: 'ぅ',
285
+ xe: 'ぇ',
286
+ xo: 'ぉ',
287
+ xyi: 'ぃ',
288
+ xye: 'ぇ',
289
+ ye: 'いぇ',
290
+ wha: 'うぁ',
291
+ whi: 'うぃ',
292
+ whe: 'うぇ',
293
+ who: 'うぉ',
294
+ wi: 'うぃ',
295
+ we: 'うぇ',
296
+ va: 'ゔぁ',
297
+ vi: 'ゔぃ',
298
+ vu: 'ゔ',
299
+ ve: 'ゔぇ',
300
+ vo: 'ゔぉ',
301
+ vya: 'ゔゃ',
302
+ vyi: 'ゔぃ',
303
+ vyu: 'ゔゅ',
304
+ vye: 'ゔぇ',
305
+ vyo: 'ゔょ',
306
+ ka: 'か',
307
+ ki: 'き',
308
+ ku: 'く',
309
+ ke: 'け',
310
+ ko: 'こ',
311
+ lka: 'ヵ',
312
+ lke: 'ヶ',
313
+ xka: 'ヵ',
314
+ xke: 'ヶ',
315
+ kya: 'きゃ',
316
+ kyi: 'きぃ',
317
+ kyu: 'きゅ',
318
+ kye: 'きぇ',
319
+ kyo: 'きょ',
320
+ ca: 'か',
321
+ ci: 'き',
322
+ cu: 'く',
323
+ ce: 'け',
324
+ co: 'こ',
325
+ lca: 'ヵ',
326
+ lce: 'ヶ',
327
+ xca: 'ヵ',
328
+ xce: 'ヶ',
329
+ qya: 'くゃ',
330
+ qyu: 'くゅ',
331
+ qyo: 'くょ',
332
+ qwa: 'くぁ',
333
+ qwi: 'くぃ',
334
+ qwu: 'くぅ',
335
+ qwe: 'くぇ',
336
+ qwo: 'くぉ',
337
+ qa: 'くぁ',
338
+ qi: 'くぃ',
339
+ qe: 'くぇ',
340
+ qo: 'くぉ',
341
+ kwa: 'くぁ',
342
+ qyi: 'くぃ',
343
+ qye: 'くぇ',
344
+ ga: 'が',
345
+ gi: 'ぎ',
346
+ gu: 'ぐ',
347
+ ge: 'げ',
348
+ go: 'ご',
349
+ gya: 'ぎゃ',
350
+ gyi: 'ぎぃ',
351
+ gyu: 'ぎゅ',
352
+ gye: 'ぎぇ',
353
+ gyo: 'ぎょ',
354
+ gwa: 'ぐぁ',
355
+ gwi: 'ぐぃ',
356
+ gwu: 'ぐぅ',
357
+ gwe: 'ぐぇ',
358
+ gwo: 'ぐぉ',
359
+ sa: 'さ',
360
+ si: 'し',
361
+ shi: 'し',
362
+ su: 'す',
363
+ se: 'せ',
364
+ so: 'そ',
365
+ za: 'ざ',
366
+ zi: 'じ',
367
+ zu: 'ず',
368
+ ze: 'ぜ',
369
+ zo: 'ぞ',
370
+ ji: 'じ',
371
+ sya: 'しゃ',
372
+ syi: 'しぃ',
373
+ syu: 'しゅ',
374
+ sye: 'しぇ',
375
+ syo: 'しょ',
376
+ sha: 'しゃ',
377
+ shu: 'しゅ',
378
+ she: 'しぇ',
379
+ sho: 'しょ',
380
+ shya: 'しゃ',
381
+ shyu: 'しゅ',
382
+ shye: 'しぇ',
383
+ shyo: 'しょ',
384
+ swa: 'すぁ',
385
+ swi: 'すぃ',
386
+ swu: 'すぅ',
387
+ swe: 'すぇ',
388
+ swo: 'すぉ',
389
+ zya: 'じゃ',
390
+ zyi: 'じぃ',
391
+ zyu: 'じゅ',
392
+ zye: 'じぇ',
393
+ zyo: 'じょ',
394
+ ja: 'じゃ',
395
+ ju: 'じゅ',
396
+ je: 'じぇ',
397
+ jo: 'じょ',
398
+ jya: 'じゃ',
399
+ jyi: 'じぃ',
400
+ jyu: 'じゅ',
401
+ jye: 'じぇ',
402
+ jyo: 'じょ',
403
+ ta: 'た',
404
+ ti: 'ち',
405
+ tu: 'つ',
406
+ te: 'て',
407
+ to: 'と',
408
+ chi: 'ち',
409
+ tsu: 'つ',
410
+ ltu: 'っ',
411
+ xtu: 'っ',
412
+ tya: 'ちゃ',
413
+ tyi: 'ちぃ',
414
+ tyu: 'ちゅ',
415
+ tye: 'ちぇ',
416
+ tyo: 'ちょ',
417
+ cha: 'ちゃ',
418
+ chu: 'ちゅ',
419
+ che: 'ちぇ',
420
+ cho: 'ちょ',
421
+ cya: 'ちゃ',
422
+ cyi: 'ちぃ',
423
+ cyu: 'ちゅ',
424
+ cye: 'ちぇ',
425
+ cyo: 'ちょ',
426
+ chya: 'ちゃ',
427
+ chyu: 'ちゅ',
428
+ chye: 'ちぇ',
429
+ chyo: 'ちょ',
430
+ tsa: 'つぁ',
431
+ tsi: 'つぃ',
432
+ tse: 'つぇ',
433
+ tso: 'つぉ',
434
+ tha: 'てゃ',
435
+ thi: 'てぃ',
436
+ thu: 'てゅ',
437
+ the: 'てぇ',
438
+ tho: 'てょ',
439
+ twa: 'とぁ',
440
+ twi: 'とぃ',
441
+ twu: 'とぅ',
442
+ twe: 'とぇ',
443
+ two: 'とぉ',
444
+ da: 'だ',
445
+ di: 'ぢ',
446
+ du: 'づ',
447
+ de: 'で',
448
+ :do => 'ど',
449
+ dya: 'ぢゃ',
450
+ dyi: 'ぢぃ',
451
+ dyu: 'ぢゅ',
452
+ dye: 'ぢぇ',
453
+ dyo: 'ぢょ',
454
+ dha: 'でゃ',
455
+ dhi: 'でぃ',
456
+ dhu: 'でゅ',
457
+ dhe: 'でぇ',
458
+ dho: 'でょ',
459
+ dwa: 'どぁ',
460
+ dwi: 'どぃ',
461
+ dwu: 'どぅ',
462
+ dwe: 'どぇ',
463
+ dwo: 'どぉ',
464
+ na: 'な',
465
+ ni: 'に',
466
+ nu: 'ぬ',
467
+ ne: 'ね',
468
+ no: 'の',
469
+ nya: 'にゃ',
470
+ nyi: 'にぃ',
471
+ nyu: 'にゅ',
472
+ nye: 'にぇ',
473
+ nyo: 'にょ',
474
+ ha: 'は',
475
+ hi: 'ひ',
476
+ hu: 'ふ',
477
+ he: 'へ',
478
+ ho: 'ほ',
479
+ fu: 'ふ',
480
+ hya: 'ひゃ',
481
+ hyi: 'ひぃ',
482
+ hyu: 'ひゅ',
483
+ hye: 'ひぇ',
484
+ hyo: 'ひょ',
485
+ fya: 'ふゃ',
486
+ fyu: 'ふゅ',
487
+ fyo: 'ふょ',
488
+ fwa: 'ふぁ',
489
+ fwi: 'ふぃ',
490
+ fwu: 'ふぅ',
491
+ fwe: 'ふぇ',
492
+ fwo: 'ふぉ',
493
+ fa: 'ふぁ',
494
+ fi: 'ふぃ',
495
+ fe: 'ふぇ',
496
+ fo: 'ふぉ',
497
+ fyi: 'ふぃ',
498
+ fye: 'ふぇ',
499
+ ba: 'ば',
500
+ bi: 'び',
501
+ bu: 'ぶ',
502
+ be: 'べ',
503
+ bo: 'ぼ',
504
+ bya: 'びゃ',
505
+ byi: 'びぃ',
506
+ byu: 'びゅ',
507
+ bye: 'びぇ',
508
+ byo: 'びょ',
509
+ pa: 'ぱ',
510
+ pi: 'ぴ',
511
+ pu: 'ぷ',
512
+ pe: 'ぺ',
513
+ po: 'ぽ',
514
+ pya: 'ぴゃ',
515
+ pyi: 'ぴぃ',
516
+ pyu: 'ぴゅ',
517
+ pye: 'ぴぇ',
518
+ pyo: 'ぴょ',
519
+ ma: 'ま',
520
+ mi: 'み',
521
+ mu: 'む',
522
+ me: 'め',
523
+ mo: 'も',
524
+ mya: 'みゃ',
525
+ myi: 'みぃ',
526
+ myu: 'みゅ',
527
+ mye: 'みぇ',
528
+ myo: 'みょ',
529
+ ya: 'や',
530
+ yu: 'ゆ',
531
+ yo: 'よ',
532
+ xya: 'ゃ',
533
+ xyu: 'ゅ',
534
+ xyo: 'ょ',
535
+ ra: 'ら',
536
+ ri: 'り',
537
+ ru: 'る',
538
+ re: 'れ',
539
+ ro: 'ろ',
540
+ rya: 'りゃ',
541
+ ryi: 'りぃ',
542
+ ryu: 'りゅ',
543
+ rye: 'りぇ',
544
+ ryo: 'りょ',
545
+ la: 'ら',
546
+ li: 'り',
547
+ lu: 'る',
548
+ le: 'れ',
549
+ lo: 'ろ',
550
+ lya: 'りゃ',
551
+ lyi: 'りぃ',
552
+ lyu: 'りゅ',
553
+ lye: 'りぇ',
554
+ lyo: 'りょ',
555
+ wa: 'わ',
556
+ wo: 'を',
557
+ lwe: 'ゎ',
558
+ xwa: 'ゎ',
559
+ n: 'ん',
560
+ nn: 'ん',
561
+ 'n '.to_sym => 'ん',
562
+ xn: 'ん',
563
+ ltsu: 'っ',
564
+ '-'.to_sym => 'ー',
565
+ '.'.to_sym => '。',
566
+ ','.to_sym => '、',
567
+ '('.to_sym => '(',
568
+ ')'.to_sym => ')',
569
+ '“'.to_sym => '「',
570
+ '”'.to_sym => '」',
571
+ '?'.to_sym => '?',
572
+ '!'.to_sym => '!'
573
+ }
574
+
575
+ J_TO_R = {
576
+ あ: 'a',
577
+ い: 'i',
578
+ う: 'u',
579
+ え: 'e',
580
+ お: 'o',
581
+ ゔぁ: 'va',
582
+ ゔぃ: 'vi',
583
+ ゔ: 'vu',
584
+ ゔぇ: 've',
585
+ ゔぉ: 'vo',
586
+ か: 'ka',
587
+ き: 'ki',
588
+ きゃ: 'kya',
589
+ きぃ: 'kyi',
590
+ きゅ: 'kyu',
591
+ く: 'ku',
592
+ け: 'ke',
593
+ こ: 'ko',
594
+ が: 'ga',
595
+ ぎ: 'gi',
596
+ ぐ: 'gu',
597
+ げ: 'ge',
598
+ ご: 'go',
599
+ ぎゃ: 'gya',
600
+ ぎぃ: 'gyi',
601
+ ぎゅ: 'gyu',
602
+ ぎぇ: 'gye',
603
+ ぎょ: 'gyo',
604
+ さ: 'sa',
605
+ す: 'su',
606
+ せ: 'se',
607
+ そ: 'so',
608
+ ざ: 'za',
609
+ ず: 'zu',
610
+ ぜ: 'ze',
611
+ ぞ: 'zo',
612
+ し: 'shi',
613
+ しゃ: 'sha',
614
+ しゅ: 'shu',
615
+ しょ: 'sho',
616
+ じ: 'ji',
617
+ じゃ: 'ja',
618
+ じゅ: 'ju',
619
+ じょ: 'jo',
620
+ た: 'ta',
621
+ ち: 'chi',
622
+ ちゃ: 'cha',
623
+ ちゅ: 'chu',
624
+ ちょ: 'cho',
625
+ つ: 'tsu',
626
+ て: 'te',
627
+ と: 'to',
628
+ だ: 'da',
629
+ ぢ: 'di',
630
+ づ: 'du',
631
+ で: 'de',
632
+ ど: 'do',
633
+ な: 'na',
634
+ に: 'ni',
635
+ にゃ: 'nya',
636
+ にゅ: 'nyu',
637
+ にょ: 'nyo',
638
+ ぬ: 'nu',
639
+ ね: 'ne',
640
+ の: 'no',
641
+ は: 'ha',
642
+ ひ: 'hi',
643
+ ふ: 'fu',
644
+ へ: 'he',
645
+ ほ: 'ho',
646
+ ひゃ: 'hya',
647
+ ひゅ: 'hyu',
648
+ ひょ: 'hyo',
649
+ ふぁ: 'fa',
650
+ ふぃ: 'fi',
651
+ ふぇ: 'fe',
652
+ ふぉ: 'fo',
653
+ ば: 'ba',
654
+ び: 'bi',
655
+ ぶ: 'bu',
656
+ べ: 'be',
657
+ ぼ: 'bo',
658
+ びゃ: 'bya',
659
+ びゅ: 'byu',
660
+ びょ: 'byo',
661
+ ぱ: 'pa',
662
+ ぴ: 'pi',
663
+ ぷ: 'pu',
664
+ ぺ: 'pe',
665
+ ぽ: 'po',
666
+ ぴゃ: 'pya',
667
+ ぴゅ: 'pyu',
668
+ ぴょ: 'pyo',
669
+ ま: 'ma',
670
+ み: 'mi',
671
+ む: 'mu',
672
+ め: 'me',
673
+ も: 'mo',
674
+ みゃ: 'mya',
675
+ みゅ: 'myu',
676
+ みょ: 'myo',
677
+ や: 'ya',
678
+ ゆ: 'yu',
679
+ よ: 'yo',
680
+ ら: 'ra',
681
+ り: 'ri',
682
+ る: 'ru',
683
+ れ: 're',
684
+ ろ: 'ro',
685
+ りゃ: 'rya',
686
+ りゅ: 'ryu',
687
+ りょ: 'ryo',
688
+ わ: 'wa',
689
+ を: 'wo',
690
+ ん: 'n',
691
+ ゐ: 'wi',
692
+ ゑ: 'we',
693
+ きぇ: 'kye',
694
+ きょ: 'kyo',
695
+ じぃ: 'jyi',
696
+ じぇ: 'jye',
697
+ ちぃ: 'cyi',
698
+ ちぇ: 'che',
699
+ ひぃ: 'hyi',
700
+ ひぇ: 'hye',
701
+ びぃ: 'byi',
702
+ びぇ: 'bye',
703
+ ぴぃ: 'pyi',
704
+ ぴぇ: 'pye',
705
+ みぇ: 'mye',
706
+ みぃ: 'myi',
707
+ りぃ: 'ryi',
708
+ りぇ: 'rye',
709
+ にぃ: 'nyi',
710
+ にぇ: 'nye',
711
+ しぃ: 'syi',
712
+ しぇ: 'she',
713
+ いぇ: 'ye',
714
+ うぁ: 'wha',
715
+ うぉ: 'who',
716
+ うぃ: 'wi',
717
+ うぇ: 'we',
718
+ ゔゃ: 'vya',
719
+ ゔゅ: 'vyu',
720
+ ゔょ: 'vyo',
721
+ すぁ: 'swa',
722
+ すぃ: 'swi',
723
+ すぅ: 'swu',
724
+ すぇ: 'swe',
725
+ すぉ: 'swo',
726
+ くゃ: 'qya',
727
+ くゅ: 'qyu',
728
+ くょ: 'qyo',
729
+ くぁ: 'qwa',
730
+ くぃ: 'qwi',
731
+ くぅ: 'qwu',
732
+ くぇ: 'qwe',
733
+ くぉ: 'qwo',
734
+ ぐぁ: 'gwa',
735
+ ぐぃ: 'gwi',
736
+ ぐぅ: 'gwu',
737
+ ぐぇ: 'gwe',
738
+ ぐぉ: 'gwo',
739
+ つぁ: 'tsa',
740
+ つぃ: 'tsi',
741
+ つぇ: 'tse',
742
+ つぉ: 'tso',
743
+ てゃ: 'tha',
744
+ てぃ: 'thi',
745
+ てゅ: 'thu',
746
+ てぇ: 'the',
747
+ てょ: 'tho',
748
+ とぁ: 'twa',
749
+ とぃ: 'twi',
750
+ とぅ: 'twu',
751
+ とぇ: 'twe',
752
+ とぉ: 'two',
753
+ ぢゃ: 'dya',
754
+ ぢぃ: 'dyi',
755
+ ぢゅ: 'dyu',
756
+ ぢぇ: 'dye',
757
+ ぢょ: 'dyo',
758
+ でゃ: 'dha',
759
+ でぃ: 'dhi',
760
+ でゅ: 'dhu',
761
+ でぇ: 'dhe',
762
+ でょ: 'dho',
763
+ どぁ: 'dwa',
764
+ どぃ: 'dwi',
765
+ どぅ: 'dwu',
766
+ どぇ: 'dwe',
767
+ どぉ: 'dwo',
768
+ ふぅ: 'fwu',
769
+ ふゃ: 'fya',
770
+ ふゅ: 'fyu',
771
+ ふょ: 'fyo',
772
+ ぁ: 'a',
773
+ ぃ: 'i',
774
+ ぇ: 'e',
775
+ ぅ: 'u',
776
+ ぉ: 'o',
777
+ ゃ: 'ya',
778
+ ゅ: 'yu',
779
+ ょ: 'yo',
780
+ っ: '',
781
+ ゕ: 'ka',
782
+ ゖ: 'ka',
783
+ ゎ: 'wa',
784
+ んあ: 'n\'a',
785
+ んい: 'n\'i',
786
+ んう: 'n\'u',
787
+ んえ: 'n\'e',
788
+ んお: 'n\'o',
789
+ んや: 'n\'ya',
790
+ んゆ: 'n\'yu',
791
+ んよ: 'n\'yo',
792
+ ' '.to_sym => ' ',
793
+ 'ー'.to_sym => '-',
794
+ '。'.to_sym => '.',
795
+ '、'.to_sym => ',',
796
+ '('.to_sym => '(',
797
+ ')'.to_sym => ')',
798
+ '「'.to_sym => '“',
799
+ '」'.to_sym => '”',
800
+ '?'.to_sym => '?',
801
+ '!'.to_sym => '!'
802
+ }
803
+ end
@@ -0,0 +1,3 @@
1
+ module Wanakana
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,3 @@
1
+ module Wanakana
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wanakana/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "Wanakana"
8
+ spec.version = Wanakana::VERSION
9
+ spec.authors = ["Cantrell NM"]
10
+ spec.email = ["cantrellnm@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby port of WaniKani/WanaKana.js}
13
+ spec.description = %q{Change Japanese text to and from romaji, hiragana, and katakana. This gem is a port of WaniKani's JavaScript library.}
14
+ spec.homepage = "https://github.com/cantrellnm/WanaKanaRuby"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.11"
23
+ spec.add_development_dependency "rake", "~> 11.2"
24
+ spec.add_development_dependency "minitest", "~> 5.8"
25
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: Wanakana
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cantrell NM
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-07-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '11.2'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '11.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.8'
55
+ description: Change Japanese text to and from romaji, hiragana, and katakana. This
56
+ gem is a port of WaniKani's JavaScript library.
57
+ email:
58
+ - cantrellnm@gmail.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - bin/console
70
+ - bin/setup
71
+ - lib/wanakana.rb
72
+ - lib/wanakana/version.rb
73
+ - version.rb
74
+ - wanakana.gemspec
75
+ homepage: https://github.com/cantrellnm/WanaKanaRuby
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.5.1
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Ruby port of WaniKani/WanaKana.js
99
+ test_files: []