Changeset 2941 for lang/ruby/ssb

Show
Ignore:
Timestamp:
12/09/07 17:12:57 (13 months ago)
Author:
lchin
Message:

lang/ruby/ssb: refactored emoji conversion

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/ssb/trunk/libs/ssb/emoji.rb

    r2526 r2941  
    4343    end 
    4444 
    45     def self.emoji_conv(term, str, is_utf8=false) 
    46       ret = str 
     45    def self.emoji_conv(term, html, is_utf8=false) 
     46      case term.get_carrier 
     47      when KtaiSpec::CARRIER_DOCOMO 
     48        convert_docomo(html, is_utf8) 
     49      when KtaiSpec::CARRIER_KDDI 
     50        convert_kddi(html) 
     51      when KtaiSpec::CARRIER_SOFTBANK 
     52        convert_thirdforce(html) 
     53      else 
     54        html 
     55      end 
     56    end 
    4757 
    48       # SJIS Binary 
    49       if term.get_carrier == KtaiSpec::CARRIER_DOCOMO 
    50         ret.gsub!(RE_IMODE_SJIS) do |s| 
    51           orig_match = $1 
    52           if not $2.nil? 
    53             sprintf '<img class="emoji" src="emoji/docomo/%X.gif" />', orig_match.unpack('n')[0] 
    54           else 
    55             orig_match 
    56           end 
     58    def self.convert_docomo(html, is_utf8) 
     59      html.gsub!(RE_IMODE_SJIS) { docomo_sjis_binary($1, $2) } 
     60      html.gsub!(/./) { |c| docomo_utf8_binary(c) } if is_utf8 
     61      html.gsub!(/&#([0-9]+);/) { docomo_sjis_decimal($1) } 
     62      html.gsub(/(&#x([0-9a-zA-Z]+);)/) { docomo_unicode_hex($1, $2) } 
     63    end 
     64 
     65    # SJIS Binary 
     66    def self.docomo_sjis_binary(original, inside) 
     67      unless inside.nil? 
     68        sprintf '<img class="emoji" src="emoji/docomo/%X.gif" />', original.unpack('n')[0] 
     69      else 
     70        original 
     71      end 
     72    end 
     73 
     74    # UNICODE 16進数実体参照 (とりあえず拡張絵文字だけ) 
     75    def self.docomo_unicode_hex(original, unicode) 
     76      code = 
     77        case hex = unicode.hex 
     78        when 0xE63E..0xE69B 
     79          # 4705 
     80          hex + 4705 
     81        when 0xE69C..0xE6DA, 0xE6AC..0xE6BA 
     82          # 4772 
     83          hex + 4772 
     84        when 0xE6DB..0xE70A, 0xE70C..0xE757 
     85          # 4773 
     86          hex + 4773 
     87        else 
     88          original 
    5789        end 
     90      if code.is_a?(Integer) 
     91        '<img class="emoji" src="emoji/docomo/' + (code).to_s(16).upcase + '.gif" />' 
     92      else 
     93        code 
     94      end 
     95    end 
    5896 
    59         # UTF8 BINARY 
    60         if is_utf8 
    61           ret.gsub!(/./) do |c| 
    62             sjis = SSB::Emoji.docomo_uni2sjis("%X" % c.unpack("U")[0]) 
    63             sjis ? sprintf('<img class="emoji" src="emoji/docomo/%s.gif" />', sjis) : c 
    64           end 
    65         end 
     97    # SJIS 10進数実体参照 
     98    def self.docomo_sjis_decimal(code) 
     99      '<img class="emoji" src="emoji/docomo/' + code.to_i.to_s(16).upcase + '.gif" />' 
     100    end 
    66101 
    67         # SJIS 10進数実体参照 
    68         ret.gsub!(/&#([0-9]+);/) do |s| 
    69           '<img class="emoji" src="emoji/docomo/' + $1.to_i.to_s(16).upcase + '.gif" />' 
    70         end 
     102    # UTF8 BINARY 
     103    def self.docomo_utf8_binary(code) 
     104      sjis = SSB::Emoji.docomo_uni2sjis("%X" % code.unpack("U")[0]) 
     105      sjis ? sprintf('<img class="emoji" src="emoji/docomo/%s.gif" />', sjis) : code 
     106    end 
    71107 
    72         # UNICODE 16進数実体参照 (とりあえず拡張絵文字だけ) 
    73         ret.gsub!(/(&#x([0-9a-zA-Z]+);)/) do |s| 
    74           code = 
    75             case ($2.hex) 
    76             when 0xE63E..0xE69B 
    77               # 4705 
    78               $2.hex + 4705 
    79             when 0xE69C..0xE6DA, 0xE6AC..0xE6BA 
    80               # 4772 
    81               $2.hex + 4772 
    82             when 0xE6DB..0xE70A, 0xE70C..0xE757 
    83               # 4773 
    84               $2.hex + 4773 
    85             else 
    86               $1 
    87             end 
    88           if code.is_a?(Integer) 
    89             '<img class="emoji" src="emoji/docomo/' + (code).to_s(16).upcase + '.gif" />' 
    90           else 
    91             code 
    92           end 
    93         end 
     108    def self.convert_kddi(html) 
     109      html.gsub!(/(&#x([0-9a-zA-Z]+);)/) { kddi_localsrc($1, $2) } 
     110      html.gsub(/ (localsrc)=\"?([^>\" ]+)\"?/im) { 
     111        ' class="emoji" src="emoji/kddi/' + '%03d' % $2.to_i + '.gif"' 
     112      } 
     113    end 
     114     
     115    # KDDI localsrc 
     116    def self.kddi_localsrc(original, code) 
     117      number = SSB::Emoji.ez_uni2number(code) 
     118      if number.nil? 
     119        original 
     120      else 
     121        sprintf '<img class="emoji" src="emoji/kddi/%03d.gif" />', number 
    94122      end 
     123    end 
    95124 
    96       # KDDI localsrc 
    97       if term.get_carrier == KtaiSpec::CARRIER_KDDI 
    98         ret.gsub!(/(&#x([0-9a-zA-Z]+);)/) do |s| 
    99           number = SSB::Emoji.ez_uni2number($2) 
    100           if number.nil? 
    101             $1 
    102           else 
    103             sprintf '<img class="emoji" src="emoji/kddi/%03d.gif" />', number 
    104           end 
    105         end 
     125    def self.convert_thirdforce(html) 
     126      html.gsub!(/(&#x([a-zA-Z0-9]{4});)/) { thirdforce_unicode_hex_cref($1, $2) } 
     127      re_sb_emoji = Regexp.new('\x1B\$(..)\x0F', 0, 'n') 
     128      html.gsub(re_sb_emoji) { thirdforce_emoji($1) } 
     129    end 
    106130 
    107         ret.gsub!(/ (localsrc)=\"?([^>\" ]+)\"?/im) { |s| 
    108           ' class="emoji" src="emoji/kddi/' + '%03d' % $2.to_i + '.gif"' 
     131    def self.thirdforce_unicode_hex_cref(original, unicode) 
     132      code = unicode.hex 
     133      if (0xE001 <= code and code <= 0xE05A) or 
     134         (0xE101 <= code and code <= 0xE15A) or 
     135         (0xE201 <= code and code <= 0xE253) or 
     136         (0xE255 <= code and code <= 0xE257) or 
     137         (0xE301 <= code and code <= 0xE34D) or 
     138         (0xE401 <= code and code <= 0xE44C) or 
     139         (0xE501 <= code and code <= 0xE537) 
     140        sprintf "<img class='emoji' src='emoji/softbank/%s.gif' />", unicode 
     141      else 
     142        original 
     143      end 
     144    end 
     145 
     146    def self.thirdforce_emoji(emoji) 
     147        page_map = { 
     148          ?G => 1, 
     149          ?E => 2, 
     150          ?F => 3, 
     151          ?O => 4, 
     152          ?P => 5, 
     153          ?Q => 6, 
    109154        } 
    110       end 
    111  
    112       # Thirdforce 
    113       re_sb_emoji = Regexp.new('\x1B\$(..)\x0F', 0, 'n') 
    114       if term.get_carrier == KtaiSpec::CARRIER_SOFTBANK 
    115         # unicode hex cref. 
    116         ret.gsub!(/(&#x([a-zA-Z0-9]{4});)/) do |x| 
    117           code = $2.hex 
    118           if (0xE001 <= code and code <= 0xE05A) or 
    119              (0xE101 <= code and code <= 0xE15A) or 
    120              (0xE201 <= code and code <= 0xE253) or 
    121              (0xE255 <= code and code <= 0xE257) or 
    122              (0xE301 <= code and code <= 0xE34D) or 
    123              (0xE401 <= code and code <= 0xE44C) or 
    124              (0xE501 <= code and code <= 0xE537) 
    125  
    126             sprintf "<img class='emoji' src='emoji/softbank/%s.gif' />", $2 
    127           else 
    128             $1 
    129           end 
    130         end 
    131         # web code 
    132         ret.gsub!(re_sb_emoji) { |s| 
    133           page_map = { 
    134             ?G => 1, 
    135             ?E => 2, 
    136             ?F => 3, 
    137             ?O => 4, 
    138             ?P => 5, 
    139             ?Q => 6, 
    140           } 
    141           code = ( (0xE0 + page_map[$1[0]] - 1 ) << 8) + ($1[1] - ?! + 1) 
    142  
    143           sprintf "<img class='emoji' src='emoji/softbank/%04X.gif' />" % code 
    144         } 
    145       end 
    146  
    147       ret 
     155        code = ( (0xE0 + page_map[emoji[0]] - 1 ) << 8) + (emoji[1] - ?! + 1) 
     156        sprintf "<img class='emoji' src='emoji/softbank/%04X.gif' />" % code 
    148157    end 
    149158  end 
    150159end 
    151