summaryrefslogtreecommitdiff
path: root/tool/enc-emoji-citrus-gen.rb
diff options
context:
space:
mode:
authormuraken <muraken@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-09 09:15:42 +0000
committermuraken <muraken@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-09 09:15:42 +0000
commit62f8df2d3c95816028c006ecbe70bc51704eec4b (patch)
tree2eb080aa7b5d235cf934014ebbafa17c3f598718 /tool/enc-emoji-citrus-gen.rb
parentc4636043cc2afe5a5fec48850115e8aa0aa3c2de (diff)
* enc/trans/EMOJI/*.src, enc/trans/emoji*, enc/x-emoji.c, test/ruby/enc/test_emoji.rb, tool/enc-emoji-citrus-gen.rb, tool/enc-emoji4unicode.rb, tool/jisx0208.rb, tool/test/test_jisx0208.rb: new encodings to support emoji charsets, which are used by Japanese mobile phones [ruby-dev:40528]. Thanks Yoji Shidara for a lot of contribution.
* tool/transcode-tblgen.rb: modified for enc-emoji4unicode.rb. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26856 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool/enc-emoji-citrus-gen.rb')
-rw-r--r--tool/enc-emoji-citrus-gen.rb131
1 files changed, 131 insertions, 0 deletions
diff --git a/tool/enc-emoji-citrus-gen.rb b/tool/enc-emoji-citrus-gen.rb
new file mode 100644
index 0000000..5037cbd
--- /dev/null
+++ b/tool/enc-emoji-citrus-gen.rb
@@ -0,0 +1,131 @@
+require File.expand_path('../jisx0208', __FILE__)
+
+ENCODES = [
+ {
+ :name => "SHIFT_JIS-DOCOMO",
+ :src_zone => [0xF8..0xFC, 0x40..0xFC, 8],
+ :dst_ilseq => 0xFFFE,
+ :map => [
+ [0xE63E..0xE757, JISX0208::Char.from_sjis(0xF89F)],
+ ],
+ },
+ {
+ :name => "ISO-2022-JP-KDDI",
+ :src_zone => [0x21..0x7E, 0x21..0x7E, 8],
+ :dst_ilseq => 0xFFFE,
+ :map => [
+ [0xE468..0xE5B4, JISX0208::Char.new(0x7521)],
+ [0xE5B5..0xE5CC, JISX0208::Char.new(0x7867)],
+ [0xE5CD..0xE5DF, JISX0208::Char.new(0x7921)],
+ [0xEA80..0xEAFA, JISX0208::Char.new(0x7934)],
+ [0xEAFB..0xEB0D, JISX0208::Char.new(0x7854)],
+ [0xEB0E..0xEB8E, JISX0208::Char.new(0x7A51)],
+ ],
+ },
+ {
+ :name => "SHIFT_JIS-KDDI",
+ :src_zone => [0xF3..0xFC, 0x40..0xFC, 8],
+ :dst_ilseq => 0xFFFE,
+ :map => [
+ [0xE468..0xE5B4, JISX0208::Char.from_sjis(0xF640)],
+ [0xE5B5..0xE5CC, JISX0208::Char.from_sjis(0xF7E5)],
+ [0xE5CD..0xE5DF, JISX0208::Char.from_sjis(0xF340)],
+ [0xEA80..0xEAFA, JISX0208::Char.from_sjis(0xF353)],
+ [0xEAFB..0xEB0D, JISX0208::Char.from_sjis(0xF7D2)],
+ [0xEB0E..0xEB8E, JISX0208::Char.from_sjis(0xF3CF)],
+ ],
+ },
+ {
+ :name => "SHIFT_JIS-SOFTBANK",
+ :src_zone => [0xF3..0xFC, 0x40..0xFC, 8],
+ :dst_ilseq => 0xFFFE,
+ :map => [
+ [0xE001..0xE05A, JISX0208::Char.from_sjis(0xF941)],
+ [0xE101..0xE15A, JISX0208::Char.from_sjis(0xF741)],
+ [0xE201..0xE25A, JISX0208::Char.from_sjis(0xF7A1)],
+ [0xE301..0xE34D, JISX0208::Char.from_sjis(0xF9A1)],
+ [0xE401..0xE44C, JISX0208::Char.from_sjis(0xFB41)],
+ [0xE501..0xE53E, JISX0208::Char.from_sjis(0xFBA1)],
+ ],
+ },
+]
+
+def zone(*args)
+ bits = args.pop
+ [*args.map{|range| "0x%02X-0x%02X" % [range.begin, range.end] }, bits].join(' / ')
+end
+
+def header(params)
+ (<<END_HEADER_TEMPLATE % [params[:name], zone(*params[:src_zone]), params[:dst_ilseq]])
+# DO NOT EDIT THIS FILE DIRECTLY
+
+TYPE ROWCOL
+NAME %s
+SRC_ZONE %s
+OOB_MODE ILSEQ
+DST_ILSEQ 0x%04X
+DST_UNIT_BITS 16
+END_HEADER_TEMPLATE
+end
+
+def generate_to_ucs(params, pairs)
+ pairs.sort_by! {|u, c| c }
+ name = "EMOJI_#{params[:name]}%UCS"
+ open("#{name}.src", "w") do |io|
+ io.print header(params.merge(name: name.tr('%', '/')))
+ io.puts
+ io.puts "BEGIN_MAP"
+ io.print pairs.inject("") {|acc, uc| acc += "0x%04X = 0x%04X\n" % uc.reverse }
+ io.puts "END_MAP"
+ end
+end
+
+def generate_from_ucs(params, pairs)
+ pairs.sort_by! {|u, c| u }
+ name = "UCS%EMOJI_#{params[:name]}"
+ open("#{name}.src", "w") do |io|
+ io.print header(params.merge(name: name.tr('%', '/')))
+ io.puts
+ io.puts "BEGIN_MAP"
+ io.print pairs.inject("") {|acc, uc| acc += "0x%04X = 0x%04X\n" % uc }
+ io.puts "END_MAP"
+ end
+end
+
+def make_pairs(code_map)
+ pairs = code_map.inject([]) {|acc, (range, ch)|
+ acc += range.map{|uni| pair = [uni, Integer(ch)]; ch = ch.succ; next pair }
+ }
+end
+
+ENCODES.each do |params|
+ pairs = make_pairs(params[:map], &params[:conv])
+ generate_to_ucs(params, pairs)
+ generate_from_ucs(params, pairs)
+end
+
+# generate KDDI-UNDOC for Shift_JIS-KDDI
+kddi_sjis_map = ENCODES.select{|enc| enc[:name] == "SHIFT_JIS-KDDI"}.first[:map]
+pairs = kddi_sjis_map.inject([]) {|acc, (range, ch)|
+ acc += range.map{|uni| pair = [ch.to_sjis - 0x700, Integer(ch)]; ch = ch.succ; next pair }
+}
+params = {
+ :name => "SHIFT_JIS-KDDI-UNDOC",
+ :src_zone => [0xF3..0xFC, 0x40..0xFC, 8],
+ :dst_ilseq => 0xFFFE,
+}
+generate_from_ucs(params, pairs)
+generate_to_ucs(params, pairs)
+
+# generate KDDI-UNDOC for ISO-2022-JP-KDDI
+kddi_2022_map = ENCODES.select{|enc| enc[:name] == "ISO-2022-JP-KDDI"}.first[:map]
+pairs = kddi_2022_map.each_with_index.inject([]) {|acc, ((range, ch), i)|
+ sjis = kddi_sjis_map[i][1]
+ acc += range.map{|uni| pair = [sjis.to_sjis - 0x700, Integer(ch)]; ch = ch.succ; sjis = sjis.succ; next pair }
+}
+params = {
+ :name => "ISO-2022-JP-KDDI-UNDOC",
+ :src_zone => [0x21..0x7E, 0x21..0x7E, 8],
+ :dst_ilseq => 0xFFFE,
+}
+generate_from_ucs(params, pairs)