mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
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], ¶ms[: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)
 |