Module: Kana::Converter

Defined in:
lib/kana/converter.rb

Constant Summary collapse

VALID_OPTION =
['n','N','r','R','s','S','a','A','k','K','h','H','c','C','V',].freeze
ZENKAKU_KATAKANA_HANKAKU =

全角カタカナ -> 半角カタカナ(清音のみ)

Hash[*{
  0x30A1 => 0xFF67,
  0x30A2 => 0xFF71,
  0x30A3 => 0xFF68,
  0x30A4 => 0xFF72,
  0x30A5 => 0xFF69,
  0x30A6 => 0xFF73,
  0x30A7 => 0xFF6A,
  0x30A8 => 0xFF74,
  0x30A9 => 0xFF6B,
  0x30AA => 0xFF75,
  0x30AB => 0xFF76,
  0x30AD => 0xFF77,
  0x30AF => 0xFF78,
  0x30B1 => 0xFF79,
  0x30B3 => 0xFF7A,
  0x30B5 => 0xFF7B,
  0x30B7 => 0xFF7C,
  0x30B9 => 0xFF7D,
  0x30BB => 0xFF7E,
  0x30BD => 0xFF7F,
  0x30BF => 0xFF80,
  0x30C1 => 0xFF81,
  0x30C3 => 0xFF6F,
  0x30C4 => 0xFF82,
  0x30C6 => 0xFF83,
  0x30C8 => 0xFF84,
  0x30CA => 0xFF85,
  0x30CB => 0xFF86,
  0x30CC => 0xFF87,
  0x30CD => 0xFF88,
  0x30CE => 0xFF89,
  0x30CF => 0xFF8A,
  0x30D2 => 0xFF8B,
  0x30D5 => 0xFF8C,
  0x30D8 => 0xFF8D,
  0x30DB => 0xFF8E,
  0x30DE => 0xFF8F,
  0x30DF => 0xFF90,
  0x30E0 => 0xFF91,
  0x30E1 => 0xFF92,
  0x30E2 => 0xFF93,
  0x30E3 => 0xFF6C,
  0x30E4 => 0xFF94,
  0x30E5 => 0xFF6D,
  0x30E6 => 0xFF95,
  0x30E7 => 0xFF6E,
  0x30E8 => 0xFF96,
  0x30E9 => 0xFF97,
  0x30EA => 0xFF98,
  0x30EB => 0xFF99,
  0x30EC => 0xFF9A,
  0x30ED => 0xFF9B,
  0x30EE => 0xFF9C,
  0x30EF => 0xFF9C,
  0x30F0 => 0xFF72,
  0x30F1 => 0xFF74,
  0x30F2 => 0xFF66,
  0x30F3 => 0xFF9D,
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
ZENKAKU_DAKUTEN_KATAKANA_HANKAKU =

全角カタカナ -> 半角カタカナ(濁音・半濁音)

Hash[*{
  0x30AC => [0xFF76,0xFF9E],
  0x30AE => [0xFF77,0xFF9E],
  0x30B0 => [0xFF78,0xFF9E],
  0x30B2 => [0xFF79,0xFF9E],
  0x30B4 => [0xFF7A,0xFF9E],
  0x30B6 => [0xFF7B,0xFF9E],
  0x30B8 => [0xFF7C,0xFF9E],
  0x30BA => [0xFF7D,0xFF9E],
  0x30BC => [0xFF7E,0xFF9E],
  0x30BE => [0xFF7F,0xFF9E],
  0x30C0 => [0xFF80,0xFF9E],
  0x30C2 => [0xFF81,0xFF9E],
  0x30C5 => [0xFF82,0xFF9E],
  0x30C7 => [0xFF83,0xFF9E],
  0x30C9 => [0xFF84,0xFF9E],
  0x30D0 => [0xFF8A,0xFF9E],
  0x30D1 => [0xFF8A,0xFF9F],
  0x30D3 => [0xFF8B,0xFF9E],
  0x30D4 => [0xFF8B,0xFF9F],
  0x30D6 => [0xFF8C,0xFF9E],
  0x30D7 => [0xFF8C,0xFF9F],
  0x30D9 => [0xFF8D,0xFF9E],
  0x30DA => [0xFF8D,0xFF9F],
  0x30DC => [0xFF8E,0xFF9E],
  0x30DD => [0xFF8E,0xFF9F],
  0x30F4 => [0xFF73,0xFF9E],
}.map{ |k,v| [[k].pack('U'), v.map{ |e| [e].pack('U') }.join ] }.flatten].freeze
ZENKAKU_HIRAGANA_HANKAKU =

全角ひらがな -> 半角カタカナ(清音のみ)

Hash[*{
  0x3041 => 0xFF67,
  0x3042 => 0xFF71,
  0x3043 => 0xFF68,
  0x3044 => 0xFF72,
  0x3045 => 0xFF69,
  0x3046 => 0xFF73,
  0x3047 => 0xFF6A,
  0x3048 => 0xFF74,
  0x3049 => 0xFF6B,
  0x304A => 0xFF75,
  0x304B => 0xFF76,
  0x304D => 0xFF77,
  0x304F => 0xFF78,
  0x3051 => 0xFF79,
  0x3053 => 0xFF7A,
  0x3055 => 0xFF7B,
  0x3057 => 0xFF7C,
  0x3059 => 0xFF7D,
  0x305B => 0xFF7E,
  0x305D => 0xFF7F,
  0x305F => 0xFF80,
  0x3061 => 0xFF81,
  0x3063 => 0xFF6F,
  0x3064 => 0xFF82,
  0x3066 => 0xFF83,
  0x3068 => 0xFF84,
  0x306A => 0xFF85,
  0x306B => 0xFF86,
  0x306C => 0xFF87,
  0x306D => 0xFF88,
  0x306E => 0xFF89,
  0x306F => 0xFF8A,
  0x3072 => 0xFF8B,
  0x3075 => 0xFF8C,
  0x3078 => 0xFF8D,
  0x307B => 0xFF8E,
  0x307E => 0xFF8F,
  0x307F => 0xFF90,
  0x3080 => 0xFF91,
  0x3081 => 0xFF92,
  0x3082 => 0xFF93,
  0x3083 => 0xFF6C,
  0x3084 => 0xFF94,
  0x3085 => 0xFF6D,
  0x3086 => 0xFF95,
  0x3087 => 0xFF6E,
  0x3088 => 0xFF96,
  0x3089 => 0xFF97,
  0x308A => 0xFF98,
  0x308B => 0xFF99,
  0x308C => 0xFF9A,
  0x308D => 0xFF9B,
  0x308E => 0xFF9C,
  0x308F => 0xFF9C,
  0x3090 => 0xFF72,
  0x3091 => 0xFF74,
  0x3092 => 0xFF66,
  0x3093 => 0xFF9D,
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
ZENKAKU_DAKUTEN_HIRAGANA_HANKAKU =

全角ひらがな -> 半角カタカナ(濁音・半濁音)

Hash[*{
  0x304C => [0xFF76,0xFF9E],
  0x304E => [0xFF77,0xFF9E],
  0x3050 => [0xFF78,0xFF9E],
  0x3052 => [0xFF79,0xFF9E],
  0x3054 => [0xFF7A,0xFF9E],
  0x3056 => [0xFF7B,0xFF9E],
  0x3058 => [0xFF7C,0xFF9E],
  0x305A => [0xFF7D,0xFF9E],
  0x305C => [0xFF7E,0xFF9E],
  0x305E => [0xFF7F,0xFF9E],
  0x3060 => [0xFF80,0xFF9E],
  0x3062 => [0xFF81,0xFF9E],
  0x3065 => [0xFF82,0xFF9E],
  0x3067 => [0xFF83,0xFF9E],
  0x3069 => [0xFF84,0xFF9E],
  0x3070 => [0xFF8A,0xFF9E],
  0x3071 => [0xFF8A,0xFF9F],
  0x3073 => [0xFF8B,0xFF9E],
  0x3074 => [0xFF8B,0xFF9F],
  0x3076 => [0xFF8C,0xFF9E],
  0x3077 => [0xFF8C,0xFF9F],
  0x3079 => [0xFF8D,0xFF9E],
  0x307A => [0xFF8D,0xFF9F],
  0x307C => [0xFF8E,0xFF9E],
  0x307D => [0xFF8E,0xFF9F],
}.map{ |k,v| [[k].pack('U'), v.map{ |e| [e].pack('U') }.join ] }.flatten].freeze
ZENKAKU_SYMBOL =

全角記号 -> 半角記号

Hash[*{
  0x3001 => 0xFF64,
  0x3002 => 0xFF61,
  0x300C => 0xFF62,
  0x300D => 0xFF63,
  0x309B => 0xFF9E,
  0x309C => 0xFF9F,
  0x30FC => 0xFF70,
  0x30FB => 0xFF65,
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
ZENKAKU_KATAKANA_SYMBOL =

全角記号 -> 半角記号

Hash[*{
  0x30F2 => 0xFF66,
  0x30A1 => 0xFF67,
  0x30A3 => 0xFF68,
  0x30A5 => 0xFF69,
  0x30A7 => 0xFF6A,
  0x30A9 => 0xFF6B,
  0x30E3 => 0xFF6C,
  0x30E5 => 0xFF6D,
  0x30E7 => 0xFF6E,
  0x30C3 => 0xFF6F,
  0x30A2 => 0xFF71,
  0x30A4 => 0xFF72,
  0x30A6 => 0xFF73,
  0x30A8 => 0xFF74,
  0x30AA => 0xFF75,
  0x30AB => 0xFF76,
  0x30AD => 0xFF77,
  0x30AF => 0xFF78,
  0x30B1 => 0xFF79,
  0x30B3 => 0xFF7A,
  0x30B5 => 0xFF7B,
  0x30B7 => 0xFF7C,
  0x30B9 => 0xFF7D,
  0x30BB => 0xFF7E,
  0x30BD => 0xFF7F,
  0x30BF => 0xFF80,
  0x30C1 => 0xFF81,
  0x30C4 => 0xFF82,
  0x30C6 => 0xFF83,
  0x30C8 => 0xFF84,
  0x30CA => 0xFF85,
  0x30CB => 0xFF86,
  0x30CC => 0xFF87,
  0x30CD => 0xFF88,
  0x30CE => 0xFF89,
  0x30CF => 0xFF8A,
  0x30D2 => 0xFF8B,
  0x30D5 => 0xFF8C,
  0x30D8 => 0xFF8D,
  0x30DB => 0xFF8E,
  0x30DE => 0xFF8F,
  0x30DF => 0xFF90,
  0x30E0 => 0xFF91,
  0x30E1 => 0xFF92,
  0x30E2 => 0xFF93,
  0x30E4 => 0xFF94,
  0x30E6 => 0xFF95,
  0x30E8 => 0xFF96,
  0x30E9 => 0xFF97,
  0x30EA => 0xFF98,
  0x30EB => 0xFF99,
  0x30EC => 0xFF9A,
  0x30ED => 0xFF9B,
  0x30EF => 0xFF9C,
  0x30F3 => 0xFF9D,
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
ZENKAKU_HIRAGANA_SYMBOL =

全角記号 -> 半角記号

Hash[*{
  0x3092 => 0xFF66,
  0x3041 => 0xFF67,
  0x3043 => 0xFF68,
  0x3045 => 0xFF69,
  0x3047 => 0xFF6A,
  0x3049 => 0xFF6B,
  0x3083 => 0xFF6C,
  0x3085 => 0xFF6D,
  0x3087 => 0xFF6E,
  0x3063 => 0xFF6F,
  0x3042 => 0xFF71,
  0x3044 => 0xFF72,
  0x3046 => 0xFF73,
  0x3048 => 0xFF74,
  0x304A => 0xFF75,
  0x304B => 0xFF76,
  0x304D => 0xFF77,
  0x304F => 0xFF78,
  0x3051 => 0xFF79,
  0x3053 => 0xFF7A,
  0x3055 => 0xFF7B,
  0x3057 => 0xFF7C,
  0x3059 => 0xFF7D,
  0x305B => 0xFF7E,
  0x305D => 0xFF7F,
  0x305F => 0xFF80,
  0x3061 => 0xFF81,
  0x3064 => 0xFF82,
  0x3066 => 0xFF83,
  0x3068 => 0xFF84,
  0x306A => 0xFF85,
  0x306B => 0xFF86,
  0x306C => 0xFF87,
  0x306D => 0xFF88,
  0x306E => 0xFF89,
  0x306F => 0xFF8A,
  0x3072 => 0xFF8B,
  0x3075 => 0xFF8C,
  0x3078 => 0xFF8D,
  0x307B => 0xFF8E,
  0x307E => 0xFF8F,
  0x307F => 0xFF90,
  0x3080 => 0xFF91,
  0x3081 => 0xFF92,
  0x3082 => 0xFF93,
  0x3084 => 0xFF94,
  0x3086 => 0xFF95,
  0x3088 => 0xFF96,
  0x3089 => 0xFF97,
  0x308A => 0xFF98,
  0x308B => 0xFF99,
  0x308C => 0xFF9A,
  0x308D => 0xFF9B,
  0x308F => 0xFF9C,
  0x3093 => 0xFF9D,
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
KATAHIRA =

全角カタカナ -> 全角ひらがな

Hash[*{0x30A1 => 0x3041, # KATAKANA LETTER SMALL A
  0x30A2 => 0x3042, # KATAKANA LETTER A
  0x30A3 => 0x3043, # KATAKANA LETTER SMALL I
  0x30A4 => 0x3044, # KATAKANA LETTER I
  0x30A5 => 0x3045, # KATAKANA LETTER SMALL U
  0x30A6 => 0x3046, # KATAKANA LETTER U
  0x30A7 => 0x3047, # KATAKANA LETTER SMALL E
  0x30A8 => 0x3048, # KATAKANA LETTER E
  0x30A9 => 0x3049, # KATAKANA LETTER SMALL O
  0x30AA => 0x304A, # KATAKANA LETTER O
  0x30AB => 0x304B, # KATAKANA LETTER KA
  0x30AC => 0x304C, # KATAKANA LETTER GA
  0x30AD => 0x304D, # KATAKANA LETTER KI
  0x30AE => 0x304E, # KATAKANA LETTER GI
  0x30AF => 0x304F, # KATAKANA LETTER KU
  0x30B0 => 0x3050, # KATAKANA LETTER GU
  0x30B1 => 0x3051, # KATAKANA LETTER KE
  0x30B2 => 0x3052, # KATAKANA LETTER GE
  0x30B3 => 0x3053, # KATAKANA LETTER KO
  0x30B4 => 0x3054, # KATAKANA LETTER GO
  0x30B5 => 0x3055, # KATAKANA LETTER SA
  0x30B6 => 0x3056, # KATAKANA LETTER ZA
  0x30B7 => 0x3057, # KATAKANA LETTER SI
  0x30B8 => 0x3058, # KATAKANA LETTER ZI
  0x30B9 => 0x3059, # KATAKANA LETTER SU
  0x30BA => 0x305A, # KATAKANA LETTER ZU
  0x30BB => 0x305B, # KATAKANA LETTER SE
  0x30BC => 0x305C, # KATAKANA LETTER ZE
  0x30BD => 0x305D, # KATAKANA LETTER SO
  0x30BE => 0x305E, # KATAKANA LETTER ZO
  0x30BF => 0x305F, # KATAKANA LETTER TA
  0x30C0 => 0x3060, # KATAKANA LETTER DA
  0x30C1 => 0x3061, # KATAKANA LETTER TI
  0x30C2 => 0x3062, # KATAKANA LETTER DI
  0x30C3 => 0x3063, # KATAKANA LETTER SMALL TU
  0x30C4 => 0x3064, # KATAKANA LETTER TU
  0x30C5 => 0x3065, # KATAKANA LETTER DU
  0x30C6 => 0x3066, # KATAKANA LETTER TE
  0x30C7 => 0x3067, # KATAKANA LETTER DE
  0x30C8 => 0x3068, # KATAKANA LETTER TO
  0x30C9 => 0x3069, # KATAKANA LETTER DO
  0x30CA => 0x306A, # KATAKANA LETTER NA
  0x30CB => 0x306B, # KATAKANA LETTER NI
  0x30CC => 0x306C, # KATAKANA LETTER NU
  0x30CD => 0x306D, # KATAKANA LETTER NE
  0x30CE => 0x306E, # KATAKANA LETTER NO
  0x30CF => 0x306F, # KATAKANA LETTER HA
  0x30D0 => 0x3070, # KATAKANA LETTER BA
  0x30D1 => 0x3071, # KATAKANA LETTER PA
  0x30D2 => 0x3072, # KATAKANA LETTER HI
  0x30D3 => 0x3073, # KATAKANA LETTER BI
  0x30D4 => 0x3074, # KATAKANA LETTER PI
  0x30D5 => 0x3075, # KATAKANA LETTER HU
  0x30D6 => 0x3076, # KATAKANA LETTER BU
  0x30D7 => 0x3077, # KATAKANA LETTER PU
  0x30D8 => 0x3078, # KATAKANA LETTER HE
  0x30D9 => 0x3079, # KATAKANA LETTER BE
  0x30DA => 0x307A, # KATAKANA LETTER PE
  0x30DB => 0x307B, # KATAKANA LETTER HO
  0x30DC => 0x307C, # KATAKANA LETTER BO
  0x30DD => 0x307D, # KATAKANA LETTER PO
  0x30DE => 0x307E, # KATAKANA LETTER MA
  0x30DF => 0x307F, # KATAKANA LETTER MI
  0x30E0 => 0x3080, # KATAKANA LETTER MU
  0x30E1 => 0x3081, # KATAKANA LETTER ME
  0x30E2 => 0x3082, # KATAKANA LETTER MO
  0x30E3 => 0x3083, # KATAKANA LETTER SMALL YA
  0x30E4 => 0x3084, # KATAKANA LETTER YA
  0x30E5 => 0x3085, # KATAKANA LETTER SMALL YU
  0x30E6 => 0x3086, # KATAKANA LETTER YU
  0x30E7 => 0x3087, # KATAKANA LETTER SMALL YO
  0x30E8 => 0x3088, # KATAKANA LETTER YO
  0x30E9 => 0x3089, # KATAKANA LETTER RA
  0x30EA => 0x308A, # KATAKANA LETTER RI
  0x30EB => 0x308B, # KATAKANA LETTER RU
  0x30EC => 0x308C, # KATAKANA LETTER RE
  0x30ED => 0x308D, # KATAKANA LETTER RO
  0x30EE => 0x308E, # KATAKANA LETTER SMALL WA
  0x30EF => 0x308F, # KATAKANA LETTER WA
  0x30F0 => 0x3090, # KATAKANA LETTER WI
  0x30F1 => 0x3091, # KATAKANA LETTER WE
  0x30F2 => 0x3092, # KATAKANA LETTER WO
  0x30F3 => 0x3093, # KATAKANA LETTER N
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
NUMERIC =

Fullwidth Digit Zero

Hash[*{0xFF10 => 0x30, # Fullwidth Digit Zero
  0xFF11 => 0x31, # Fullwidth Digit One
  0xFF12 => 0x32, # Fullwidth Digit Two
  0xFF13 => 0x33, # Fullwidth Digit Three
  0xFF14 => 0x34, # Fullwidth Digit Four
  0xFF15 => 0x35, # Fullwidth Digit Five
  0xFF16 => 0x36, # Fullwidth Digit Six
  0xFF17 => 0x37, # Fullwidth Digit Seven
  0xFF18 => 0x38, # Fullwidth Digit Eight
  0xFF19 => 0x39, # Fullwidth Digit Nine
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
ALPHABET =

Fullwidth Latin Capital Letter A

Hash[*{0xFF21 => 0x41, # Fullwidth Latin Capital Letter A
  0xFF22 => 0x42, # Fullwidth Latin Capital Letter B
  0xFF23 => 0x43, # Fullwidth Latin Capital Letter C
  0xFF24 => 0x44, # Fullwidth Latin Capital Letter D
  0xFF25 => 0x45, # Fullwidth Latin Capital Letter E
  0xFF26 => 0x46, # Fullwidth Latin Capital Letter F
  0xFF27 => 0x47, # Fullwidth Latin Capital Letter G
  0xFF28 => 0x48, # Fullwidth Latin Capital Letter H
  0xFF29 => 0x49, # Fullwidth Latin Capital Letter I
  0xFF2A => 0x4A, # Fullwidth Latin Capital Letter J
  0xFF2B => 0x4B, # Fullwidth Latin Capital Letter K
  0xFF2C => 0x4C, # Fullwidth Latin Capital Letter L
  0xFF2D => 0x4D, # Fullwidth Latin Capital Letter M
  0xFF2E => 0x4E, # Fullwidth Latin Capital Letter N
  0xFF2F => 0x4F, # Fullwidth Latin Capital Letter O
  0xFF30 => 0x50, # Fullwidth Latin Capital Letter P
  0xFF31 => 0x51, # Fullwidth Latin Capital Letter Q
  0xFF32 => 0x52, # Fullwidth Latin Capital Letter R
  0xFF33 => 0x53, # Fullwidth Latin Capital Letter S
  0xFF34 => 0x54, # Fullwidth Latin Capital Letter T
  0xFF35 => 0x55, # Fullwidth Latin Capital Letter U
  0xFF36 => 0x56, # Fullwidth Latin Capital Letter V
  0xFF37 => 0x57, # Fullwidth Latin Capital Letter W
  0xFF38 => 0x58, # Fullwidth Latin Capital Letter X
  0xFF39 => 0x59, # Fullwidth Latin Capital Letter Y
  0xFF3A => 0x5A, # Fullwidth Latin Capital Letter Z
  0xFF41 => 0x61, # Fullwidth Latin Small Letter A
  0xFF42 => 0x62, # Fullwidth Latin Small Letter B
  0xFF43 => 0x63, # Fullwidth Latin Small Letter C
  0xFF44 => 0x64, # Fullwidth Latin Small Letter D
  0xFF45 => 0x65, # Fullwidth Latin Small Letter E
  0xFF46 => 0x66, # Fullwidth Latin Small Letter F
  0xFF47 => 0x67, # Fullwidth Latin Small Letter G
  0xFF48 => 0x68, # Fullwidth Latin Small Letter H
  0xFF49 => 0x69, # Fullwidth Latin Small Letter I
  0xFF4A => 0x6A, # Fullwidth Latin Small Letter J
  0xFF4B => 0x6B, # Fullwidth Latin Small Letter K
  0xFF4C => 0x6C, # Fullwidth Latin Small Letter L
  0xFF4D => 0x6D, # Fullwidth Latin Small Letter M
  0xFF4E => 0x6E, # Fullwidth Latin Small Letter N
  0xFF4F => 0x6F, # Fullwidth Latin Small Letter O
  0xFF50 => 0x70, # Fullwidth Latin Small Letter P
  0xFF51 => 0x71, # Fullwidth Latin Small Letter Q
  0xFF52 => 0x72, # Fullwidth Latin Small Letter R
  0xFF53 => 0x73, # Fullwidth Latin Small Letter S
  0xFF54 => 0x74, # Fullwidth Latin Small Letter T
  0xFF55 => 0x75, # Fullwidth Latin Small Letter U
  0xFF56 => 0x76, # Fullwidth Latin Small Letter V
  0xFF57 => 0x77, # Fullwidth Latin Small Letter W
  0xFF58 => 0x78, # Fullwidth Latin Small Letter X
  0xFF59 => 0x79, # Fullwidth Latin Small Letter Y
  0xFF5A => 0x7A, # Fullwidth Latin Small Letter Z
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
SYMBOL =

Fullwidth Exclamation Mark

Hash[*{0xFF01 => 0x21, # Fullwidth Exclamation Mark
  0xFF03 => 0x23, # Fullwidth Number Sign
  0xFF04 => 0x24, # Fullwidth Dollar Sign
  0xFF05 => 0x25, # Fullwidth Percent Sign
  0xFF06 => 0x26, # Fullwidth Ampersand
  0xFF08 => 0x28, # Fullwidth Left Parenthesis
  0xFF09 => 0x29, # Fullwidth Right Parenthesis
  0xFF0A => 0x2A, # Fullwidth Asterisk
  0xFF0B => 0x2B, # Fullwidth Plus Sign
  0xFF0C => 0x2C, # Fullwidth Comma
  0xFF0D => 0x2D, # Fullwidth Hyphen-Minus
  0x2212 => 0x2D,
  0xFF0E => 0x2E, # Fullwidth Full Stop
  0xFF0F => 0x2F, # Fullwidth Solidus
  0xFF10 => 0x30,
  0xFF11 => 0x31,
  0xFF12 => 0x32,
  0xFF13 => 0x33,
  0xFF14 => 0x34,
  0xFF15 => 0x35,
  0xFF16 => 0x36,
  0xFF17 => 0x37,
  0xFF18 => 0x38,
  0xFF19 => 0x39,
  0xFF1A => 0x3A, # Fullwidth Colon
  0xFF1B => 0x3B, # Fullwidth Semicolon
  0xFF1C => 0x3C, # Fullwidth Less-Than Sign
  0xFF1D => 0x3D, # Fullwidth Equals Sign
  0xFF1E => 0x3E, # Fullwidth Greater-Than Sign
  0xFF1F => 0x3F, # Fullwidth Question Mark
  0xFF20 => 0x40, # Fullwidth Commercial At
  0xFF21 => 0x41,
  0xFF22 => 0x42,
  0xFF23 => 0x43,
  0xFF24 => 0x44,
  0xFF25 => 0x45,
  0xFF26 => 0x46,
  0xFF27 => 0x47,
  0xFF28 => 0x48,
  0xFF29 => 0x49,
  0xFF2A => 0x4A,
  0xFF2B => 0x4B,
  0xFF2C => 0x4C,
  0xFF2D => 0x4D,
  0xFF2E => 0x4E,
  0xFF2F => 0x4F,
  0xFF30 => 0x50,
  0xFF31 => 0x51,
  0xFF32 => 0x52,
  0xFF33 => 0x53,
  0xFF34 => 0x54,
  0xFF35 => 0x55,
  0xFF36 => 0x56,
  0xFF37 => 0x57,
  0xFF38 => 0x58,
  0xFF39 => 0x59,
  0xFF3A => 0x5A,
  0xFF3B => 0x5B,
  0xFF3D => 0x5D,
  0xFF3E => 0x5E,
  0xFF3F => 0x5F,
  0xFF40 => 0x60,
  0xFF41 => 0x61,
  0xFF42 => 0x62,
  0xFF43 => 0x63,
  0xFF44 => 0x64,
  0xFF45 => 0x65,
  0xFF46 => 0x66,
  0xFF47 => 0x67,
  0xFF48 => 0x68,
  0xFF49 => 0x69,
  0xFF4A => 0x6A,
  0xFF4B => 0x6B,
  0xFF4C => 0x6C,
  0xFF4D => 0x6D,
  0xFF4E => 0x6E,
  0xFF4F => 0x6F,
  0xFF50 => 0x70,
  0xFF51 => 0x71,
  0xFF52 => 0x72,
  0xFF53 => 0x73,
  0xFF54 => 0x74,
  0xFF55 => 0x75,
  0xFF56 => 0x76,
  0xFF57 => 0x77,
  0xFF58 => 0x78,
  0xFF59 => 0x79,
  0xFF5A => 0x7A,
  0xFF5B => 0x7B, # Fullwidth Left Curly Bracket
  0xFF5C => 0x7C, # Fullwidth Vertical Line
  0xFF5D => 0x7D, # Fullwidth Right Curly Bracket
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
SYMBOL_INVERT =
Hash[*{0x2D => 0xFF0D
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
SPACE =

IDEOGRAPHIC SPACE

Hash[*{0x3000 => 0x20, # IDEOGRAPHIC SPACE
}.map{ |k,v| [[k].pack('U'), [v].pack('U')] }.flatten].freeze
@@cached_data =
{}

Class Method Summary collapse

Class Method Details

.build_convert_table(opt) ⇒ Object



19
20
21
22
23
24
# File 'lib/kana/converter.rb', line 19

def self.build_convert_table opt
  opt = parse_option opt
  return @@cached_data[opt] if @@cached_data[opt]
  table = convert_tables opt
  @@cached_data[opt] = [build_regexp(table), table].freeze
end

.build_regexp(table) ⇒ Object



102
103
104
105
106
107
108
109
110
# File 'lib/kana/converter.rb', line 102

def self.build_regexp table
  Regexp.union(*table.keys.sort_by{ |k| -table[k].size }.map{ |v|
                 if RUBY_VERSION >= '1.9.1'
                   Regexp.new(Regexp.escape(v))
                 else
                   Regexp.new(Regexp.escape(v,'u'),nil,'u')
                 end
               }).freeze
end

.convert(str, opt = 'KV') ⇒ Object



8
9
10
11
12
13
14
# File 'lib/kana/converter.rb', line 8

def convert str, opt='KV'
  opt ||= 'KV'
  regexp, table = build_convert_table opt
  str.gsub(regexp) do |match|
    table[match]
  end
end

.convert_tables(opt) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/kana/converter.rb', line 34

def self.convert_tables opt
  table = {}
  opt.each do |c|
    case c
    when 'n'
      # 全角数字 -> 半角数字
      table.update NUMERIC
    when 'N'
      # 半角数字 -> 全角数字
      table.update NUMERIC.invert
    when 'r'
      # 全角英字 -> 半角英字
      table.update ALPHABET
    when 'R'
      # 半角英字 -> 全角英字
      table.update ALPHABET.invert
    when 's'
      # 全角スペース -> 半角スペース
      table.update SPACE
    when 'S'
      # 半角スペース -> 全角スペース
      table.update SPACE.invert
    when 'a'
      # 全角英数字 -> 半角英数字
      table.update convert_tables(['n','r',])
      table.update SYMBOL
    when 'A'
      # 半角英数字 -> 全角英数字
      table.update convert_tables(['N','R',])
      table.update SYMBOL.invert
      table.update SYMBOL_INVERT
    when 'k'
      # 全角カタカナ -> 半角カタカナ
      table.update ZENKAKU_KATAKANA_HANKAKU
      table.update ZENKAKU_DAKUTEN_KATAKANA_HANKAKU
      table.update ZENKAKU_SYMBOL
    when 'K'
      # 全角カタカナ -> 半角カタカナ
      table.update ZENKAKU_KATAKANA_HANKAKU.invert
      table.update ZENKAKU_DAKUTEN_KATAKANA_HANKAKU.invert if opt.find{ |o| o == 'V' }
      table.update ZENKAKU_SYMBOL.invert
      table.update ZENKAKU_KATAKANA_SYMBOL.invert
    when 'h'
      # 全角ひらがな -> 半角カタカナ
      table.update ZENKAKU_HIRAGANA_HANKAKU
      table.update ZENKAKU_DAKUTEN_HIRAGANA_HANKAKU
      table.update ZENKAKU_SYMBOL
    when 'H'
      # 半角カタカナ -> 全角ひらがな
      table.update ZENKAKU_HIRAGANA_HANKAKU.invert
      table.update ZENKAKU_DAKUTEN_HIRAGANA_HANKAKU.invert if opt.find{ |o| o == 'V' }
      table.update ZENKAKU_SYMBOL.invert
      table.update ZENKAKU_HIRAGANA_SYMBOL.invert
    when 'c'
      # 全角カタカナ -> 全角ひらがな
      table.update KATAHIRA
    when 'C'
      # 全角ひらがな -> 全角カタカナ
      table.update KATAHIRA.invert
    when 'V'
      # do nothing
    else
      raise ArgumentError
    end
  end
  table.freeze
end

.parse_option(opt) ⇒ Object



28
29
30
31
32
# File 'lib/kana/converter.rb', line 28

def self.parse_option opt
  opt.split(//).uniq.sort.each do |c|
    raise ArgumentError unless VALID_OPTION.include?(c)
  end
end