kana 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 fistfvck
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,18 @@
1
+ = kana
2
+
3
+ Description goes here.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but
13
+ bump version in a commit by itself I can ignore when I pull)
14
+ * Send me a pull request. Bonus points for topic branches.
15
+
16
+ == Copyright
17
+
18
+ Copyright (c) 2009 fistfvck. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "kana"
8
+ gem.summary = %Q{convert hankaku <-> zenkaku}
9
+ gem.description = %Q{convert hankaku <-> zenkaku. like mb_convert_kana}
10
+ gem.email = "fistfvck@gmail.com"
11
+ gem.homepage = "http://github.com/fistfvck/kana"
12
+ gem.authors = ["fistfvck"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
31
+ end
32
+
33
+ task :spec => :check_dependencies
34
+
35
+ task :default => :spec
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
+
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = "kana #{version}"
43
+ rdoc.rdoc_files.include('README*')
44
+ rdoc.rdoc_files.include('lib/**/*.rb')
45
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/lib/kana.rb ADDED
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))
3
+ require 'kana/translator'
4
+ require 'kana/converter'
5
+
6
+ module Kana
7
+ def kana(str, opt=nil, enc=nil)
8
+ return str unless Translator.support?(str, enc)
9
+ str, orig_enc = Translator.to_utf8(str, enc)
10
+ str = Converter.convert(str, opt)
11
+ Translator.to_encode(str, orig_enc)
12
+ end
13
+ module_function :kana
14
+ end
15
+
16
+ class String
17
+ def kana(opt=nil, enc=nil)
18
+ Kana.kana self, opt, enc
19
+ end
20
+ end
@@ -0,0 +1,128 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Kana
3
+ module Converter
4
+ require 'kana/converter/numeric_alphabet'
5
+ require 'kana/converter/katahira'
6
+ require 'kana/converter/zenkaku'
7
+
8
+ def convert str, opt='KV'
9
+ opt ||= 'KV'
10
+ table = convert_tables opt
11
+ str.gsub(build_regexp(table)) do |match|
12
+ table[match]
13
+ end
14
+ end
15
+ module_function :convert
16
+
17
+ def self.build_regexp table
18
+ Regexp.union(*table.keys.sort_by{ |k| -table[k].size }.map{ |v|
19
+ if RUBY_VERSION >= '1.9.1'
20
+ Regexp.new(Regexp.escape(v))
21
+ else
22
+ Regexp.new(Regexp.escape(v,'u'),nil,'u')
23
+ end
24
+ })
25
+ end
26
+
27
+ def self.convert_table_katakana_hiragana opt, vsm
28
+ table = {}
29
+ opt.split(//).each do |c|
30
+ case c
31
+ when 'k'
32
+ # k 「全角カタカナ」を「半角カタカナ」に変換します。
33
+ table.update ZENKAKU_KATAKANA_HANKAKU
34
+ table.update ZENKAKU_DAKUTEN_KATAKANA_HANKAKU
35
+ table.update ZENKAKU_SYMBOL
36
+ when 'K'
37
+ # K 「半角カタカナ」を「全角カタカナ」に変換します。
38
+ table.update ZENKAKU_KATAKANA_HANKAKU.invert
39
+ table.update ZENKAKU_DAKUTEN_KATAKANA_HANKAKU.invert if vsm
40
+ table.update ZENKAKU_SYMBOL.invert
41
+ table.update ZENKAKU_KATAKANA_SYMBOL.invert
42
+ when 'h'
43
+ # h 「全角ひらがな」を「半角カタカナ」に変換します。
44
+ table.update ZENKAKU_HIRAGANA_HANKAKU
45
+ table.update ZENKAKU_DAKUTEN_HIRAGANA_HANKAKU
46
+ table.update ZENKAKU_SYMBOL
47
+ when 'H'
48
+ # H 「半角カタカナ」を「全角ひらがな」に変換します。
49
+ table.update ZENKAKU_HIRAGANA_HANKAKU.invert
50
+ table.update ZENKAKU_DAKUTEN_HIRAGANA_HANKAKU.invert if vsm
51
+ table.update ZENKAKU_SYMBOL.invert
52
+ table.update ZENKAKU_HIRAGANA_SYMBOL.invert
53
+ when 'c'
54
+ # c 「全角カタカナ」を「全角ひらがな」に変換します。
55
+ table.update KATAHIRA
56
+ when 'C'
57
+ # C 「全角ひらがな」を「全角カタカナ」に変換します。
58
+ table.update KATAHIRA.invert
59
+ end
60
+ end
61
+ table
62
+ end
63
+
64
+ ZENKATA_FLAG = 0x01 # Zenkaku Katakana
65
+ ZENHIRA_FLAG = 0x02 # Zenkaku Hiragana
66
+ HANKATA_FLAG = 0x04 # Hankaku Katakana
67
+ VSM_FLAG = 0x08 # Voiced Sound Mark
68
+
69
+ def self.convert_tables opt
70
+ table = {}
71
+ kh_option = {:flag => '', :vsm => false, :input => 0}
72
+ opt.split(//).each do |c|
73
+ case c
74
+ when 'n'
75
+ table.update NUMERIC
76
+ when 'N'
77
+ table.update NUMERIC.invert
78
+ when 'r'
79
+ table.update ALPHABET
80
+ when 'R'
81
+ table.update ALPHABET.invert
82
+ when 's'
83
+ table.update SPACE
84
+ when 'S'
85
+ table.update SPACE.invert
86
+ when 'a'
87
+ table.update convert_tables('nr')
88
+ table.update SYMBOL
89
+ when 'A'
90
+ table.update convert_tables('NR')
91
+ table.update SYMBOL.invert
92
+ table.update SYMBOL_INVERT
93
+
94
+ when 'k'
95
+ raise ArgumentError if (kh_option[:input] & ZENKATA_FLAG) != 0
96
+ kh_option[:input] |= ZENKATA_FLAG
97
+ kh_option[:flag] += 'k'
98
+ when 'c'
99
+ raise ArgumentError if (kh_option[:input] & ZENKATA_FLAG) != 0
100
+ kh_option[:input] |= ZENKATA_FLAG
101
+ kh_option[:flag] += 'c'
102
+ when 'h'
103
+ raise ArgumentError if (kh_option[:input] & ZENHIRA_FLAG) != 0
104
+ kh_option[:input] |= ZENHIRA_FLAG
105
+ kh_option[:flag] += 'h'
106
+ when 'C'
107
+ raise ArgumentError if (kh_option[:input] & ZENHIRA_FLAG) != 0
108
+ kh_option[:input] |= ZENHIRA_FLAG
109
+ kh_option[:flag] += 'C'
110
+ when 'K'
111
+ raise ArgumentError if (kh_option[:input] & HANKATA_FLAG) != 0
112
+ kh_option[:input] |= HANKATA_FLAG
113
+ kh_option[:flag] += 'K'
114
+ when 'H'
115
+ raise ArgumentError if (kh_option[:input] & HANKATA_FLAG) != 0
116
+ kh_option[:input] |= HANKATA_FLAG
117
+ kh_option[:flag] += 'H'
118
+ when 'V'
119
+ raise ArgumentError if (kh_option[:input] & HANKATA_FLAG) == 0
120
+ kh_option[:vsm] = true
121
+ else
122
+ raise ArgumentError
123
+ end
124
+ end
125
+ table.update convert_table_katakana_hiragana kh_option[:flag], kh_option[:vsm]
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,86 @@
1
+ # -*- coding: utf-8 -*-
2
+ # 全角カタカナ -> 全角ひらがな
3
+ Kana::Converter::KATAHIRA = Hash[*{0x30A1 => 0x3041, # KATAKANA LETTER SMALL A
4
+ 0x30A2 => 0x3042, # KATAKANA LETTER A
5
+ 0x30A3 => 0x3043, # KATAKANA LETTER SMALL I
6
+ 0x30A4 => 0x3044, # KATAKANA LETTER I
7
+ 0x30A5 => 0x3045, # KATAKANA LETTER SMALL U
8
+ 0x30A6 => 0x3046, # KATAKANA LETTER U
9
+ 0x30A7 => 0x3047, # KATAKANA LETTER SMALL E
10
+ 0x30A8 => 0x3048, # KATAKANA LETTER E
11
+ 0x30A9 => 0x3049, # KATAKANA LETTER SMALL O
12
+ 0x30AA => 0x304A, # KATAKANA LETTER O
13
+ 0x30AB => 0x304B, # KATAKANA LETTER KA
14
+ 0x30AC => 0x304C, # KATAKANA LETTER GA
15
+ 0x30AD => 0x304D, # KATAKANA LETTER KI
16
+ 0x30AE => 0x304E, # KATAKANA LETTER GI
17
+ 0x30AF => 0x304F, # KATAKANA LETTER KU
18
+ 0x30B0 => 0x3050, # KATAKANA LETTER GU
19
+ 0x30B1 => 0x3051, # KATAKANA LETTER KE
20
+ 0x30B2 => 0x3052, # KATAKANA LETTER GE
21
+ 0x30B3 => 0x3053, # KATAKANA LETTER KO
22
+ 0x30B4 => 0x3054, # KATAKANA LETTER GO
23
+ 0x30B5 => 0x3055, # KATAKANA LETTER SA
24
+ 0x30B6 => 0x3056, # KATAKANA LETTER ZA
25
+ 0x30B7 => 0x3057, # KATAKANA LETTER SI
26
+ 0x30B8 => 0x3058, # KATAKANA LETTER ZI
27
+ 0x30B9 => 0x3059, # KATAKANA LETTER SU
28
+ 0x30BA => 0x305A, # KATAKANA LETTER ZU
29
+ 0x30BB => 0x305B, # KATAKANA LETTER SE
30
+ 0x30BC => 0x305C, # KATAKANA LETTER ZE
31
+ 0x30BD => 0x305D, # KATAKANA LETTER SO
32
+ 0x30BE => 0x305E, # KATAKANA LETTER ZO
33
+ 0x30BF => 0x305F, # KATAKANA LETTER TA
34
+ 0x30C0 => 0x3060, # KATAKANA LETTER DA
35
+ 0x30C1 => 0x3061, # KATAKANA LETTER TI
36
+ 0x30C2 => 0x3062, # KATAKANA LETTER DI
37
+ 0x30C3 => 0x3063, # KATAKANA LETTER SMALL TU
38
+ 0x30C4 => 0x3064, # KATAKANA LETTER TU
39
+ 0x30C5 => 0x3065, # KATAKANA LETTER DU
40
+ 0x30C6 => 0x3066, # KATAKANA LETTER TE
41
+ 0x30C7 => 0x3067, # KATAKANA LETTER DE
42
+ 0x30C8 => 0x3068, # KATAKANA LETTER TO
43
+ 0x30C9 => 0x3069, # KATAKANA LETTER DO
44
+ 0x30CA => 0x306A, # KATAKANA LETTER NA
45
+ 0x30CB => 0x306B, # KATAKANA LETTER NI
46
+ 0x30CC => 0x306C, # KATAKANA LETTER NU
47
+ 0x30CD => 0x306D, # KATAKANA LETTER NE
48
+ 0x30CE => 0x306E, # KATAKANA LETTER NO
49
+ 0x30CF => 0x306F, # KATAKANA LETTER HA
50
+ 0x30D0 => 0x3070, # KATAKANA LETTER BA
51
+ 0x30D1 => 0x3071, # KATAKANA LETTER PA
52
+ 0x30D2 => 0x3072, # KATAKANA LETTER HI
53
+ 0x30D3 => 0x3073, # KATAKANA LETTER BI
54
+ 0x30D4 => 0x3074, # KATAKANA LETTER PI
55
+ 0x30D5 => 0x3075, # KATAKANA LETTER HU
56
+ 0x30D6 => 0x3076, # KATAKANA LETTER BU
57
+ 0x30D7 => 0x3077, # KATAKANA LETTER PU
58
+ 0x30D8 => 0x3078, # KATAKANA LETTER HE
59
+ 0x30D9 => 0x3079, # KATAKANA LETTER BE
60
+ 0x30DA => 0x307A, # KATAKANA LETTER PE
61
+ 0x30DB => 0x307B, # KATAKANA LETTER HO
62
+ 0x30DC => 0x307C, # KATAKANA LETTER BO
63
+ 0x30DD => 0x307D, # KATAKANA LETTER PO
64
+ 0x30DE => 0x307E, # KATAKANA LETTER MA
65
+ 0x30DF => 0x307F, # KATAKANA LETTER MI
66
+ 0x30E0 => 0x3080, # KATAKANA LETTER MU
67
+ 0x30E1 => 0x3081, # KATAKANA LETTER ME
68
+ 0x30E2 => 0x3082, # KATAKANA LETTER MO
69
+ 0x30E3 => 0x3083, # KATAKANA LETTER SMALL YA
70
+ 0x30E4 => 0x3084, # KATAKANA LETTER YA
71
+ 0x30E5 => 0x3085, # KATAKANA LETTER SMALL YU
72
+ 0x30E6 => 0x3086, # KATAKANA LETTER YU
73
+ 0x30E7 => 0x3087, # KATAKANA LETTER SMALL YO
74
+ 0x30E8 => 0x3088, # KATAKANA LETTER YO
75
+ 0x30E9 => 0x3089, # KATAKANA LETTER RA
76
+ 0x30EA => 0x308A, # KATAKANA LETTER RI
77
+ 0x30EB => 0x308B, # KATAKANA LETTER RU
78
+ 0x30EC => 0x308C, # KATAKANA LETTER RE
79
+ 0x30ED => 0x308D, # KATAKANA LETTER RO
80
+ 0x30EE => 0x308E, # KATAKANA LETTER SMALL WA
81
+ 0x30EF => 0x308F, # KATAKANA LETTER WA
82
+ 0x30F0 => 0x3090, # KATAKANA LETTER WI
83
+ 0x30F1 => 0x3091, # KATAKANA LETTER WE
84
+ 0x30F2 => 0x3092, # KATAKANA LETTER WO
85
+ 0x30F3 => 0x3093, # KATAKANA LETTER N
86
+ }.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten]
@@ -0,0 +1,165 @@
1
+ # -*- coding: utf-8 -*-
2
+ Kana::Converter::NUMERIC = Hash[*{0xFF10 => 0x30, # Fullwidth Digit Zero
3
+ 0xFF11 => 0x31, # Fullwidth Digit One
4
+ 0xFF12 => 0x32, # Fullwidth Digit Two
5
+ 0xFF13 => 0x33, # Fullwidth Digit Three
6
+ 0xFF14 => 0x34, # Fullwidth Digit Four
7
+ 0xFF15 => 0x35, # Fullwidth Digit Five
8
+ 0xFF16 => 0x36, # Fullwidth Digit Six
9
+ 0xFF17 => 0x37, # Fullwidth Digit Seven
10
+ 0xFF18 => 0x38, # Fullwidth Digit Eight
11
+ 0xFF19 => 0x39, # Fullwidth Digit Nine
12
+ }.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten]
13
+
14
+ Kana::Converter::ALPHABET = Hash[*{0xFF21 => 0x41, # Fullwidth Latin Capital Letter A
15
+ 0xFF22 => 0x42, # Fullwidth Latin Capital Letter B
16
+ 0xFF23 => 0x43, # Fullwidth Latin Capital Letter C
17
+ 0xFF24 => 0x44, # Fullwidth Latin Capital Letter D
18
+ 0xFF25 => 0x45, # Fullwidth Latin Capital Letter E
19
+ 0xFF26 => 0x46, # Fullwidth Latin Capital Letter F
20
+ 0xFF27 => 0x47, # Fullwidth Latin Capital Letter G
21
+ 0xFF28 => 0x48, # Fullwidth Latin Capital Letter H
22
+ 0xFF29 => 0x49, # Fullwidth Latin Capital Letter I
23
+ 0xFF2A => 0x4A, # Fullwidth Latin Capital Letter J
24
+ 0xFF2B => 0x4B, # Fullwidth Latin Capital Letter K
25
+ 0xFF2C => 0x4C, # Fullwidth Latin Capital Letter L
26
+ 0xFF2D => 0x4D, # Fullwidth Latin Capital Letter M
27
+ 0xFF2E => 0x4E, # Fullwidth Latin Capital Letter N
28
+ 0xFF2F => 0x4F, # Fullwidth Latin Capital Letter O
29
+ 0xFF30 => 0x50, # Fullwidth Latin Capital Letter P
30
+ 0xFF31 => 0x51, # Fullwidth Latin Capital Letter Q
31
+ 0xFF32 => 0x52, # Fullwidth Latin Capital Letter R
32
+ 0xFF33 => 0x53, # Fullwidth Latin Capital Letter S
33
+ 0xFF34 => 0x54, # Fullwidth Latin Capital Letter T
34
+ 0xFF35 => 0x55, # Fullwidth Latin Capital Letter U
35
+ 0xFF36 => 0x56, # Fullwidth Latin Capital Letter V
36
+ 0xFF37 => 0x57, # Fullwidth Latin Capital Letter W
37
+ 0xFF38 => 0x58, # Fullwidth Latin Capital Letter X
38
+ 0xFF39 => 0x59, # Fullwidth Latin Capital Letter Y
39
+ 0xFF3A => 0x5A, # Fullwidth Latin Capital Letter Z
40
+ 0xFF41 => 0x61, # Fullwidth Latin Small Letter A
41
+ 0xFF42 => 0x62, # Fullwidth Latin Small Letter B
42
+ 0xFF43 => 0x63, # Fullwidth Latin Small Letter C
43
+ 0xFF44 => 0x64, # Fullwidth Latin Small Letter D
44
+ 0xFF45 => 0x65, # Fullwidth Latin Small Letter E
45
+ 0xFF46 => 0x66, # Fullwidth Latin Small Letter F
46
+ 0xFF47 => 0x67, # Fullwidth Latin Small Letter G
47
+ 0xFF48 => 0x68, # Fullwidth Latin Small Letter H
48
+ 0xFF49 => 0x69, # Fullwidth Latin Small Letter I
49
+ 0xFF4A => 0x6A, # Fullwidth Latin Small Letter J
50
+ 0xFF4B => 0x6B, # Fullwidth Latin Small Letter K
51
+ 0xFF4C => 0x6C, # Fullwidth Latin Small Letter L
52
+ 0xFF4D => 0x6D, # Fullwidth Latin Small Letter M
53
+ 0xFF4E => 0x6E, # Fullwidth Latin Small Letter N
54
+ 0xFF4F => 0x6F, # Fullwidth Latin Small Letter O
55
+ 0xFF50 => 0x70, # Fullwidth Latin Small Letter P
56
+ 0xFF51 => 0x71, # Fullwidth Latin Small Letter Q
57
+ 0xFF52 => 0x72, # Fullwidth Latin Small Letter R
58
+ 0xFF53 => 0x73, # Fullwidth Latin Small Letter S
59
+ 0xFF54 => 0x74, # Fullwidth Latin Small Letter T
60
+ 0xFF55 => 0x75, # Fullwidth Latin Small Letter U
61
+ 0xFF56 => 0x76, # Fullwidth Latin Small Letter V
62
+ 0xFF57 => 0x77, # Fullwidth Latin Small Letter W
63
+ 0xFF58 => 0x78, # Fullwidth Latin Small Letter X
64
+ 0xFF59 => 0x79, # Fullwidth Latin Small Letter Y
65
+ 0xFF5A => 0x7A, # Fullwidth Latin Small Letter Z
66
+ }.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten]
67
+
68
+ Kana::Converter::SYMBOL = Hash[*{0xFF01 => 0x21, # Fullwidth Exclamation Mark
69
+ 0xFF03 => 0x23, # Fullwidth Number Sign
70
+ 0xFF04 => 0x24, # Fullwidth Dollar Sign
71
+ 0xFF05 => 0x25, # Fullwidth Percent Sign
72
+ 0xFF06 => 0x26, # Fullwidth Ampersand
73
+ 0xFF08 => 0x28, # Fullwidth Left Parenthesis
74
+ 0xFF09 => 0x29, # Fullwidth Right Parenthesis
75
+ 0xFF0A => 0x2A, # Fullwidth Asterisk
76
+ 0xFF0B => 0x2B, # Fullwidth Plus Sign
77
+ 0xFF0C => 0x2C, # Fullwidth Comma
78
+ 0xFF0D => 0x2D, # Fullwidth Hyphen-Minus
79
+ 0x2212 => 0x2D,
80
+ 0xFF0E => 0x2E, # Fullwidth Full Stop
81
+ 0xFF0F => 0x2F, # Fullwidth Solidus
82
+ 0xFF10 => 0x30,
83
+ 0xFF11 => 0x31,
84
+ 0xFF12 => 0x32,
85
+ 0xFF13 => 0x33,
86
+ 0xFF14 => 0x34,
87
+ 0xFF15 => 0x35,
88
+ 0xFF16 => 0x36,
89
+ 0xFF17 => 0x37,
90
+ 0xFF18 => 0x38,
91
+ 0xFF19 => 0x39,
92
+ 0xFF1A => 0x3A, # Fullwidth Colon
93
+ 0xFF1B => 0x3B, # Fullwidth Semicolon
94
+ 0xFF1C => 0x3C, # Fullwidth Less-Than Sign
95
+ 0xFF1D => 0x3D, # Fullwidth Equals Sign
96
+ 0xFF1E => 0x3E, # Fullwidth Greater-Than Sign
97
+ 0xFF1F => 0x3F, # Fullwidth Question Mark
98
+ 0xFF20 => 0x40, # Fullwidth Commercial At
99
+ 0xFF21 => 0x41,
100
+ 0xFF22 => 0x42,
101
+ 0xFF23 => 0x43,
102
+ 0xFF24 => 0x44,
103
+ 0xFF25 => 0x45,
104
+ 0xFF26 => 0x46,
105
+ 0xFF27 => 0x47,
106
+ 0xFF28 => 0x48,
107
+ 0xFF29 => 0x49,
108
+ 0xFF2A => 0x4A,
109
+ 0xFF2B => 0x4B,
110
+ 0xFF2C => 0x4C,
111
+ 0xFF2D => 0x4D,
112
+ 0xFF2E => 0x4E,
113
+ 0xFF2F => 0x4F,
114
+ 0xFF30 => 0x50,
115
+ 0xFF31 => 0x51,
116
+ 0xFF32 => 0x52,
117
+ 0xFF33 => 0x53,
118
+ 0xFF34 => 0x54,
119
+ 0xFF35 => 0x55,
120
+ 0xFF36 => 0x56,
121
+ 0xFF37 => 0x57,
122
+ 0xFF38 => 0x58,
123
+ 0xFF39 => 0x59,
124
+ 0xFF3A => 0x5A,
125
+ 0xFF3B => 0x5B,
126
+ 0xFF3D => 0x5D,
127
+ 0xFF3E => 0x5E,
128
+ 0xFF3F => 0x5F,
129
+ 0xFF40 => 0x60,
130
+ 0xFF41 => 0x61,
131
+ 0xFF42 => 0x62,
132
+ 0xFF43 => 0x63,
133
+ 0xFF44 => 0x64,
134
+ 0xFF45 => 0x65,
135
+ 0xFF46 => 0x66,
136
+ 0xFF47 => 0x67,
137
+ 0xFF48 => 0x68,
138
+ 0xFF49 => 0x69,
139
+ 0xFF4A => 0x6A,
140
+ 0xFF4B => 0x6B,
141
+ 0xFF4C => 0x6C,
142
+ 0xFF4D => 0x6D,
143
+ 0xFF4E => 0x6E,
144
+ 0xFF4F => 0x6F,
145
+ 0xFF50 => 0x70,
146
+ 0xFF51 => 0x71,
147
+ 0xFF52 => 0x72,
148
+ 0xFF53 => 0x73,
149
+ 0xFF54 => 0x74,
150
+ 0xFF55 => 0x75,
151
+ 0xFF56 => 0x76,
152
+ 0xFF57 => 0x77,
153
+ 0xFF58 => 0x78,
154
+ 0xFF59 => 0x79,
155
+ 0xFF5A => 0x7A,
156
+ 0xFF5B => 0x7B, # Fullwidth Left Curly Bracket
157
+ 0xFF5C => 0x7C, # Fullwidth Vertical Line
158
+ 0xFF5D => 0x7D, # Fullwidth Right Curly Bracket
159
+ }.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten]
160
+
161
+ Kana::Converter::SYMBOL_INVERT = Hash[*{0x2D => 0xFF0D
162
+ }.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten]
163
+
164
+ Kana::Converter::SPACE = Hash[*{0x3000 => 0x20, # IDEOGRAPHIC SPACE
165
+ }.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten]