1require File.expand_path('../jisx0208', __FILE__) 2 3ENCODES = [ 4 { 5 :name => "SHIFT_JIS-DOCOMO", 6 :src_zone => [0xF8..0xFC, 0x40..0xFC, 8], 7 :dst_ilseq => 0xFFFE, 8 :map => [ 9 [0xE63E..0xE757, JISX0208::Char.from_sjis(0xF89F)], 10 ], 11 }, 12 { 13 :name => "ISO-2022-JP-KDDI", 14 :src_zone => [0x21..0x7E, 0x21..0x7E, 8], 15 :dst_ilseq => 0xFFFE, 16 :map => [ 17 [0xE468..0xE5B4, JISX0208::Char.new(0x7521)], 18 [0xE5B5..0xE5CC, JISX0208::Char.new(0x7867)], 19 [0xE5CD..0xE5DF, JISX0208::Char.new(0x7921)], 20 [0xEA80..0xEAFA, JISX0208::Char.new(0x7934)], 21 [0xEAFB..0xEB0D, JISX0208::Char.new(0x7854)], 22 [0xEB0E..0xEB8E, JISX0208::Char.new(0x7A51)], 23 ], 24 }, 25 { 26 :name => "SHIFT_JIS-KDDI", 27 :src_zone => [0xF3..0xFC, 0x40..0xFC, 8], 28 :dst_ilseq => 0xFFFE, 29 :map => [ 30 [0xE468..0xE5B4, JISX0208::Char.from_sjis(0xF640)], 31 [0xE5B5..0xE5CC, JISX0208::Char.from_sjis(0xF7E5)], 32 [0xE5CD..0xE5DF, JISX0208::Char.from_sjis(0xF340)], 33 [0xEA80..0xEAFA, JISX0208::Char.from_sjis(0xF353)], 34 [0xEAFB..0xEB0D, JISX0208::Char.from_sjis(0xF7D2)], 35 [0xEB0E..0xEB8E, JISX0208::Char.from_sjis(0xF3CF)], 36 ], 37 }, 38 { 39 :name => "SHIFT_JIS-SOFTBANK", 40 :src_zone => [0xF3..0xFC, 0x40..0xFC, 8], 41 :dst_ilseq => 0xFFFE, 42 :map => [ 43 [0xE001..0xE05A, JISX0208::Char.from_sjis(0xF941)], 44 [0xE101..0xE15A, JISX0208::Char.from_sjis(0xF741)], 45 [0xE201..0xE25A, JISX0208::Char.from_sjis(0xF7A1)], 46 [0xE301..0xE34D, JISX0208::Char.from_sjis(0xF9A1)], 47 [0xE401..0xE44C, JISX0208::Char.from_sjis(0xFB41)], 48 [0xE501..0xE53E, JISX0208::Char.from_sjis(0xFBA1)], 49 ], 50 }, 51] 52 53def zone(*args) 54 bits = args.pop 55 [*args.map{|range| "0x%02X-0x%02X" % [range.begin, range.end] }, bits].join(' / ') 56end 57 58def header(params) 59 (<<END_HEADER_TEMPLATE % [params[:name], zone(*params[:src_zone]), params[:dst_ilseq]]) 60# DO NOT EDIT THIS FILE DIRECTLY 61 62TYPE ROWCOL 63NAME %s 64SRC_ZONE %s 65OOB_MODE ILSEQ 66DST_ILSEQ 0x%04X 67DST_UNIT_BITS 16 68END_HEADER_TEMPLATE 69end 70 71def generate_to_ucs(params, pairs) 72 pairs.sort_by! {|u, c| c } 73 name = "EMOJI_#{params[:name]}%UCS" 74 open("#{name}.src", "w") do |io| 75 io.print header(params.merge(name: name.tr('%', '/'))) 76 io.puts 77 io.puts "BEGIN_MAP" 78 io.print pairs.inject("") {|acc, uc| acc += "0x%04X = 0x%04X\n" % uc.reverse } 79 io.puts "END_MAP" 80 end 81end 82 83def generate_from_ucs(params, pairs) 84 pairs.sort_by! {|u, c| u } 85 name = "UCS%EMOJI_#{params[:name]}" 86 open("#{name}.src", "w") do |io| 87 io.print header(params.merge(name: name.tr('%', '/'))) 88 io.puts 89 io.puts "BEGIN_MAP" 90 io.print pairs.inject("") {|acc, uc| acc += "0x%04X = 0x%04X\n" % uc } 91 io.puts "END_MAP" 92 end 93end 94 95def make_pairs(code_map) 96 pairs = code_map.inject([]) {|acc, (range, ch)| 97 acc += range.map{|uni| pair = [uni, Integer(ch)]; ch = ch.succ; next pair } 98 } 99end 100 101ENCODES.each do |params| 102 pairs = make_pairs(params[:map], ¶ms[:conv]) 103 generate_to_ucs(params, pairs) 104 generate_from_ucs(params, pairs) 105end 106 107# generate KDDI-UNDOC for Shift_JIS-KDDI 108kddi_sjis_map = ENCODES.select{|enc| enc[:name] == "SHIFT_JIS-KDDI"}.first[:map] 109pairs = kddi_sjis_map.inject([]) {|acc, (range, ch)| 110 acc += range.map{|uni| pair = [ch.to_sjis - 0x700, Integer(ch)]; ch = ch.succ; next pair } 111} 112params = { 113 :name => "SHIFT_JIS-KDDI-UNDOC", 114 :src_zone => [0xF3..0xFC, 0x40..0xFC, 8], 115 :dst_ilseq => 0xFFFE, 116} 117generate_from_ucs(params, pairs) 118generate_to_ucs(params, pairs) 119 120# generate KDDI-UNDOC for ISO-2022-JP-KDDI 121kddi_2022_map = ENCODES.select{|enc| enc[:name] == "ISO-2022-JP-KDDI"}.first[:map] 122pairs = kddi_2022_map.each_with_index.inject([]) {|acc, ((range, ch), i)| 123 sjis = kddi_sjis_map[i][1] 124 acc += range.map{|uni| pair = [sjis.to_sjis - 0x700, Integer(ch)]; ch = ch.succ; sjis = sjis.succ; next pair } 125} 126params = { 127 :name => "ISO-2022-JP-KDDI-UNDOC", 128 :src_zone => [0x21..0x7E, 0x21..0x7E, 8], 129 :dst_ilseq => 0xFFFE, 130} 131generate_from_ucs(params, pairs) 132