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], &params[: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