kana 0.1.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.
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]