Advertisement
jomin398

Lua.EnglishToKorean

Dec 5th, 2018
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.22 KB | None | 0 0
  1. PLUGIN.Title = "EnglishToKorean"
  2. -- code from : https://milennium9.blog.me/20205300449
  3. PLUGIN.Description = "convert english chat to korean."
  4. _wsetlocale(LC_ALL, L"korean");
  5. function PLUGIN:Init()
  6.   self:AddChatCommand( "ko", self.ToKorean )
  7. end
  8. function PLUGIN:ToKorean( netuser, cmd, args )
  9.  
  10.   local str = "";
  11.   for i,v in pairs(args) do
  12.     str = str .. self:englishToKorean(v) .. " "
  13.   end
  14.   rust.BroadcastChat( "nickname", str )
  15.  
  16. end
  17.  
  18. function PLUGIN:conv2utf8(unicode_list)
  19.   local result = ''
  20.   local w,x,y,z = 0,0,0,0
  21.   local function modulo(a, b)
  22.     return a - math.floor(a/b) * b
  23.   end
  24.   for i,v in ipairs(unicode_list) do
  25.     if v ~= 0 and v ~= nil then
  26.       if v <= 0x7F then -- same as ASCII
  27.          result = result .. string.char(v)
  28.       elseif v >= 0x80 and v <= 0x7FF then -- 2 bytes
  29.          y = math.floor(modulo(v, 0x000800) / 64)
  30.          z = modulo(v, 0x000040)
  31.          result = result .. string.char(0xC0 + y, 0x80 + z)
  32.       elseif (v >= 0x800 and v <= 0xD7FF) or (v >= 0xE000 and v <= 0xFFFF) then -- 3 bytes
  33.          x = math.floor(modulo(v, 0x010000) / 4096)
  34.          y = math.floor(modulo(v, 0x001000) / 64)
  35.          z = modulo(v, 0x000040)
  36.          result = result .. string.char(0xE0 + x, 0x80 + y, 0x80 + z)
  37.       elseif (v >= 0x10000 and v <= 0x10FFFF) then -- 4 bytes
  38.          w = math.floor(modulo(v, 0x200000) / 262144)
  39.          x = math.floor(modulo(v, 0x040000) / 4096)
  40.          y = math.floor(modulo(v, 0x001000) / 64)
  41.          z = modulo(v, 0x000040)
  42.          result = result .. string.char(0xF0 + w, 0x80 + x, 0x80 + y, 0x80 + z)
  43.       end
  44.     end
  45.   end
  46.   return result
  47. end
  48.  
  49. function PLUGIN:englishToKorean(msg)
  50.   if msg == nil then
  51.     return "nil"
  52.   end
  53.  
  54.   local text = msg;
  55.  
  56.   -- ­한글의 초,중,종성의 인덱스
  57.   local initialCode = 0;
  58.   local medialCode  = 0;
  59.   local finalCode   = 0;
  60.  
  61.   -- 루프와 결과 저장을 위한 변수
  62.   local textLength = #text
  63.   local ret = "";
  64.   local cont = 0
  65.  
  66.   for idx = 1, textLength do
  67.     -- lua는 루프 내부에서 idx 변수를 변화 시켜도 루프에 영향을 주지 않는다.
  68.     -- 스킵한 문자를 위한 continue 처리를 위해 cont 사용
  69.     if cont < idx then
  70.       -- 초성 검색
  71.       local first = text:sub( idx, idx )
  72.       initialCode = self:getCode( 'initial', text:sub( idx, idx ) );
  73.       idx = idx + 1; -- 다음 영타로 중성을 찾아야 한다.
  74.  
  75.       if initialCode ~= -1 then
  76.         -- 두번째 영문으로 중성을 추론한다.
  77.         -- ㅘ, ㅝ, ㅙ 등 2번의 입력으로 구성된 중성을 우선 검색한다.
  78.         tempMedialCode = self:getCode( 'medial', text:sub( idx, idx + 1 ) );
  79.        
  80.         if tempMedialCode ~= -1 then
  81.           -- 중성을 찾았다면 사용한 영타 2자를 스킵한다.
  82.           medialCode = tempMedialCode;
  83.           idx = idx + 2;
  84.  
  85.         else -- 찾지 못했다면 한번의 입력을 구성된 중성을 검색한다.
  86.           medialCode = self:getCode( 'medial', text:sub( idx, idx ) );
  87.           idx = idx + 1;
  88.         end
  89.      
  90.         -- 마지막으로 종성을 검색한다.
  91.         -- 않, 값 등 받침이 2번의 입력으로 구성된 종성을 우선 검색한다.
  92.         tempFinalCode = self:getCode( 'final', text:sub( idx, idx + 1 ) );
  93.        
  94.         if tempFinalCode ~= -1 then
  95.           finalCode = tempFinalCode;
  96.           -- 발견했다면 이 문자가 종성인지 아니면 다음 한글의 초성인지를 판단해야 한다.
  97.           -- 이어지는 영타가 중성에 포함되는지를 확인한다.
  98.           tempMedialCode = self:getCode( 'medial', text:sub( idx + 2, idx + 2 ) );
  99.  
  100.           if tempMedialCode ~= -1 then
  101.             -- 이어지는 문자가 중성이라면 2번의 입력 중 뒤에 것은 다음 글자의 초성이 된다.
  102.             finalCode = self:getCode( 'final', text:sub( idx, idx ) );
  103.           else
  104.             idx = idx + 1;
  105.           end
  106.  
  107.         else
  108.           -- 또다시 중성이 이어진다면 종성은 존재하지 않는 것이다.
  109.           tempMedialCode = self:getCode( 'medial', text:sub( idx + 1, idx + 1 ) );
  110.  
  111.           if tempMedialCode ~= -1 then
  112.             -- 가ㅏ 처럼 중성이 두번 이어지면 종성은 없는 것으로 간주한다.
  113.             finalCode = 0;
  114.             idx = idx - 1;
  115.           else
  116.             -- 하나의 입력으로 이루어진 종성을 검색한다.
  117.             finalCode = self:getCode( 'final', text:sub( idx, idx ) );
  118.             if finalCode == -1 then finalCode = 0; end
  119.           end
  120.         end
  121.       end
  122.      
  123.       -- 초성을 찾지 못했다면 특수 문자로 간주하고 그문자를 그대로 사용한다.
  124.       if initialCode < 0 then
  125.         ret = ret .. first
  126.       else
  127.         local code = 44032 + initialCode + medialCode + finalCode
  128.         local ch = self:conv2utf8({code})
  129.         ret = ret .. ch
  130.       end
  131.      
  132.       cont = idx;
  133.       end
  134.   end
  135.   return ret
  136. end
  137.  
  138. function PLUGIN:getCode( tt, char )
  139.   -- 초성 리스트
  140.   local initial = { 'r','R','s','e','E','f','a','q','Q','t','T','d','w','W','c','z','x','v','g'};
  141.   -- 중성 리스트
  142.   local medial = { 'k', 'o', 'i', 'O', 'j', 'p', 'u', 'P', 'h', 'hk', 'ho', 'hl', 'y', 'n', 'nj', 'np', 'nl', 'b', 'm', 'ml', 'l' };
  143.   -- 종성 리스트
  144.   local final = { 'r', 'R', 'rt', 's', 'sw', 'sg', 'e', 'f', 'fr', 'fa', 'fq', 'ft', 'fx', 'fv', 'fg', 'a', 'q', 'qt', 't', 'T', 'd', 'w', 'c', 'z', 'x', 'v', 'g' };
  145.   local returnCode = 0; -- 최종 인덱스
  146.   local isFind = false; -- 발견 여부
  147.  
  148.   -- 각 리스트에서 인덱스를 검색하기 위한 로컬 함수
  149.   local find = function(tb, ch)
  150.     for i = 1, #tb do
  151.       if tb[i] == ch then
  152.         returnCode = i-1; -- Lua는 인덱스가 1부터 시작되기 때문에..
  153.         isFind = true;
  154.         break;
  155.       end
  156.     end
  157.   end
  158.  
  159.   if char ~= nil then
  160.     if tt == 'initial' then
  161.       find( initial, char )
  162.       returnCode = returnCode * 21 * 28
  163.     elseif tt == 'medial' then
  164.       find( medial, char )
  165.       returnCode = returnCode * 28
  166.     elseif tt == 'final' then
  167.       find( final, char )
  168.       returnCode = returnCode + 1
  169.     end
  170.   end
  171.   if isFind == false then returnCode = -1; end
  172.   return returnCode;
  173. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement