1/** 2 * Hangul.js 3 * https://github.com/e-/Hangul.js 4 * 5 * Copyright 2017, Jaemin Jo 6 * under the MIT license. 7 */ 8 9(function () { 10 'use strict'; 11 /* Disassembled ì´ì±(onset) */ 12 var CHO = [ 13 'ã±', 'ã²', 'ã´', 'ã·', 'ã¸', 14 'ã¹', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 15 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 16 'ã ', 'ã ' 17 ], 18 /* Disassembled ì¤ì±(nucleus) */ 19 JUNG = [ 20 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 21 'ã ', 'ã ', 'ã ', 'ã ', ['ã ', 'ã '], ['ã ', 'ã '], 22 ['ã ', 'ã £'], 'ã ', 'ã ', ['ã ', 'ã '], ['ã ', 'ã '], ['ã ', 'ã £'], 23 'ã ', 'ã ¡', ['ã ¡', 'ã £'], 'ã £' 24 ], 25 /* Desassembled ì¢ ì±(coda) */ 26 JONG = [ 27 '', 'ã±', 'ã²', ['ã±', 'ã '], 'ã´', ['ã´', 'ã '], ['ã´', 'ã '], 'ã·', 'ã¹', 28 ['ã¹', 'ã±'], ['ã¹', 'ã '], ['ã¹', 'ã '], ['ã¹', 'ã '], ['ã¹', 'ã '], ['ã¹', 'ã '], ['ã¹', 'ã '], 'ã ', 29 'ã ', ['ã ', 'ã '], 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ' 30 ], 31 /* ì ëì½ë íê¸ ìì ìì¹ */ 32 HANGUL_OFFSET = 0xAC00, 33 /* ìì */ 34 CONSONANTS = [ 35 'ã±', 'ã²', 'ã³', 'ã´', 'ãµ', 'ã¶', 'ã·', 'ã¸', 36 'ã¹', 'ãº', 'ã»', 'ã¼', 'ã½', 'ã¾', 'ã¿', 'ã ', 37 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 38 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ' 39 ], 40 /* Assembled ì´ì± */ 41 COMPLETE_CHO = [ 42 'ã±', 'ã²', 'ã´', 'ã·', 'ã¸', 43 'ã¹', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 44 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ' 45 ], 46 /* Assembled ì¤ì± */ 47 COMPLETE_JUNG = [ 48 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 49 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 50 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 51 'ã ', 'ã ¡', 'ã ¢', 'ã £' 52 ], 53 /* Assembled ì¢ ì± */ 54 COMPLETE_JONG = [ 55 '', 'ã±', 'ã²', 'ã³', 'ã´', 'ãµ', 'ã¶', 'ã·', 'ã¹', 56 'ãº', 'ã»', 'ã¼', 'ã½', 'ã¾', 'ã¿', 'ã ', 'ã ', 57 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ', 'ã ' 58 ], 59 /* ë³µì¡í ìì: [ ìì1, ìì2, ìì1+ìì2 ] */ 60 COMPLEX_CONSONANTS = [ 61 ['ã±', 'ã ', 'ã³'], 62 ['ã´', 'ã ', 'ãµ'], 63 ['ã´', 'ã ', 'ã¶'], 64 ['ã¹', 'ã±', 'ãº'], 65 ['ã¹', 'ã ', 'ã»'], 66 ['ã¹', 'ã ', 'ã¼'], 67 ['ã¹', 'ã ', 'ã½'], 68 ['ã¹', 'ã ', 'ã¾'], 69 ['ã¹', 'ã ', 'ã¿'], 70 ['ã¹', 'ã ', 'ã '], 71 ['ã ', 'ã ', 'ã '] 72 ], 73 /* ë³µì¡í 모ì: [모ì1, 모ì2, 모ì1+모ì2] */ 74 COMPLEX_VOWELS = [ 75 ['ã ', 'ã ', 'ã '], 76 ['ã ', 'ã ', 'ã '], 77 ['ã ', 'ã £', 'ã '], 78 ['ã ', 'ã ', 'ã '], 79 ['ã ', 'ã ', 'ã '], 80 ['ã ', 'ã £', 'ã '], 81 ['ã ¡', 'ã £', 'ã ¢'] 82 ], 83 CONSONANTS_HASH, 84 CHO_HASH, 85 JUNG_HASH, 86 JONG_HASH, 87 COMPLEX_CONSONANTS_HASH, 88 COMPLEX_VOWELS_HASH 89 ; 90 91 function _makeHash(array) { 92 var length = array.length, 93 hash = { 0: 0 } 94 ; 95 for (var i = 0; i < length; i++) { 96 if (array[i]) 97 hash[array[i].charCodeAt(0)] = i; 98 } 99 return hash; 100 } 101 102 CONSONANTS_HASH = _makeHash(CONSONANTS); 103 CHO_HASH = _makeHash(COMPLETE_CHO); 104 JUNG_HASH = _makeHash(COMPLETE_JUNG); 105 JONG_HASH = _makeHash(COMPLETE_JONG); 106 107 function _makeComplexHash(array) { 108 var length = array.length, 109 hash = {}, 110 code1, 111 code2 112 ; 113 for (var i = 0; i < length; i++) { 114 code1 = array[i][0].charCodeAt(0); 115 code2 = array[i][1].charCodeAt(0); 116 if (typeof hash[code1] === 'undefined') { 117 hash[code1] = {}; 118 } 119 hash[code1][code2] = array[i][2].charCodeAt(0); 120 } 121 return hash; 122 } 123 124 COMPLEX_CONSONANTS_HASH = _makeComplexHash(COMPLEX_CONSONANTS); 125 COMPLEX_VOWELS_HASH = _makeComplexHash(COMPLEX_VOWELS); 126 127 /* c ê° CONSONANTSì 멤ë²ì¼ ê²½ì° true ë°í (cê° ììì¼ ê²½ì° true ë°í) */ 128 function _isConsonant(c) { 129 return typeof CONSONANTS_HASH[c] !== 'undefined'; 130 } 131 /* c ê° COMPLETE_JUNGì 멤ë²ì¼ ê²½ì° true ë°í (c ê° ì´ì±ì¼ ê²½ì° true ë°í) */ 132 function _isCho(c) { 133 return typeof CHO_HASH[c] !== 'undefined'; 134 } 135 /* c ê° COMPLETE_JUNGì 멤ë²ì¼ ê²½ì° true ë°í (c ê° ì¤ì±ì¼ ê²½ì° true ë°í) */ 136 function _isJung(c) { 137 return typeof JUNG_HASH[c] !== 'undefined'; 138 } 139 /* c ê° COMPLETE_JONGì 멤ë²ì¼ ê²½ì° true ë°í (c ê° ì¢ ì±ì¼ ê²½ì° true ë°í) */ 140 function _isJong(c) { 141 return typeof JONG_HASH[c] !== 'undefined'; 142 } 143 /* c ê° íê¸ì¼ ê²½ì° true ë°í */ 144 function _isHangul(c /* code number */) { 145 return 0xAC00 <= c && c <= 0xd7a3; 146 } 147 /* aì bê° ì¤ì±ì¼ë¡ì ê²°í©í ì ìë ê²½ì° COMPLEX_VOWELS_HASH[a][b] ê°(ê²°í©í ì¢ ì±ì ì ëì½ë ê°) ë°í */ 148 function _isJungJoinable(a, b) { 149 return (COMPLEX_VOWELS_HASH[a] && COMPLEX_VOWELS_HASH[a][b]) ? COMPLEX_VOWELS_HASH[a][b] : false;
150 } 151 /* aì bê° ì¢ ì±ì¼ë¡ì ê²°í©í ì ìë ê²½ì° COMPLEX_CONSONANTS_HASH[a][b] ê°(ê²°í©í ì¢ ì±ì ì ëì½ë ê°) ë°í */ 152 function _isJongJoinable(a, b) { 153 return COMPLEX_CONSONANTS_HASH[a] && COMPLEX_CONSONANTS_HASH[a][b] ? COMPLEX_CONSONANTS_HASH[a][b] : false; 154 } 155 156 var disassemble = function (string, grouped) { 157 /* ì ë ¥ê°ì´ NULLì¼ ê²½ì° ìë¬ ë°ì */ 158 if (string === null) { 159 throw new Error('Arguments cannot be null'); 160 } 161 /* ì ë ¥ê°ì´ 'object' íì ì¸ ê²½ì° ë¬¸ìì´ë¡ ë³í© */ 162 if (typeof string === 'object') { 163 string = string.join(''); 164 } 165 166 var result = [], 167 length = string.length, 168 cho, 169 jung, 170 jong, 171 code, 172 r 173 ; 174 /* 모ë 문ìì ëí´ íì¸ */ 175 for (var i = 0; i < length; i++) { 176 var temp = []; 177 178 code = string.charCodeAt(i); //문ì를 ì ëì½ëê°ì¼ë¡ ë³íí´ codeì ì ì¥ 179 /* ië²ì§¸ 문ì(code)ê° ìì±ë íê¸ì¸ ê²½ì° */ 180 if (_isHangul(code)) { 181 code -= HANGUL_OFFSET; 182 jong = code % 28; 183 jung = (code - jong) / 28 % 21; 184 cho = parseInt((code - jong) / 28 / 21); 185 temp.push(CHO[cho]); // temp ë°°ì´ì ì´ì± ì¶ê° 186 /* ì¤ì±ì´ objectíì¸ ê²½ì° (2 ë¨ì¼ 모ìì ì¡°í©ì¸ ê²½ì°) */ 187 if (typeof JUNG[jung] === 'object') { 188 temp = temp.concat(JUNG[jung]); // tempì í´ë¹ ì¤ì±ì 모ìë¤ ì¶ê° 189 /* ì¤ì±ì´ ë¨ì¼ 모ìì¼ë¡ ì´ë£¨ì´ì§ ê²½ì° */ 190 } else { 191 temp.push(JUNG[jung]); // tempì í´ë¹ 모ì ì¶ê° 192 } 193 /* ì¢ ì±ì´ ìë ê²½ì° */ 194 if (jong > 0) { 195 /* ì¢ ì±ì´ objectíì¸ ê²½ì° (2 ë¨ì¼ ììì ì¡°í©ì¸ ê²½ì°) */ 196 if (typeof JONG[jong] === 'object') { 197 temp = temp.concat(JONG[jong]); // tempì í´ë¹ ì¢ ì±ì ììë¤ ì¶ê° 198 /* ì¢ ì±ì´ ë¨ì¼ ììì¼ë¡ ì´ë£¨ì´ì§ ê²½ì° */ 199 } else { 200 temp.push(JONG[jong]); // tempì í´ë¹ ìì ì¶ê° 201 } 202 } 203 /* ië²ì§¸ 문ì(code)ê° ìì±ë íê¸ì´ ìëë©´ì CONSONANTSì 멤ë²ì¼ ê²½ì° (ììì¼ ê²½ì°)*/ 204 } else if (_isConsonant(code)) { 205 if (_isCho(code)) { 206 r = CHO[CHO_HASH[code]]; // ì´ì±ì¼ ê²½ì° í´ë¹ ì´ì±ì rì ì ì¥ 207 } else { 208 r = JONG[JONG_HASH[code]]; // ì¢ ì±ì¼ ê²½ì° í´ë¹ ì¢ ì±ì rì ì ì¥ 209 } 210 if (typeof r === 'string') { 211 temp.push(r); // rì´ string íì¼ ê²½ì° tempì ì¶ê° 212 } else { 213 temp = temp.concat(r); // ìë ê²½ì° tempì r ë°°ì´ì ììë¤ ì¶ê° 214 } 215 /* ië²ì§¸ 문ì(code)ê° ìì±ë íê¸ì´ ìëë©´ì COMPLETE_JUNGì 멤ë²ì¼ ê²½ì° (ì¤ì±ì¼ ê²½ì°) */ 216 } else if (_isJung(code)) { 217 r = JUNG[JUNG_HASH[code]]; // rì í´ë¹ ì¤ì± ì ì¥ 218 if (typeof r === 'string') { 219 temp.push(r); // rì´ string íì¼ ê²½ì° tempì ì¶ê° 220 } else { 221 temp = temp.concat(r); // ìë ê²½ì° tempì r ë°°ì´ì ììë¤ ì¶ê° 222 } 223 /* ië²ì§¸ 문ì(code)ê° íê¸ì´ ìë ê²½ì° */ 224 } else { 225 temp.push(string.charAt(i)); // tempì ië²ì§¸ 문ì를 ì¶ê° 226 } 227 228 if (grouped) result.push(temp); //groupedê° ì¤ì ë ê²½ì° resultì temp ì¶ê° 229 else result = result.concat(temp); //groupedê° ì¤ì ëì§ ìì ê²½ì° resultì tempì ììë¤ ì¶ê° 230 } 231 232 return result; 233 }; 234 235 /* stringì¼ë¡ disassemle */ 236 var disassembleToString = function (str) { 237 if (typeof str !== 'string') { 238 return ''; // ì ë ¥ê°ì´ stringíì´ ìë ê²½ì° ë¹ ë¬¸ìì´ ë°í 239 } 240 str = disassemble(str); // strì disassemble 241 return str.join(''); // strì 문ìì´ë¡ ë°í 242 }; 243 244 /* stringì¼ë¡ assemble */ 245 var assemble = function (array) { 246 if (typeof array === 'string') { 247 array = disassemble(array);
247 // ì ë ¥ê°ì´ stringíì¸ ê²½ì° ì°ì disassemble 248 } 249 250 var result = [], 251 length = array.length, 252 code, 253 stage = 0, 254 complete_index = -1, //ìì±ë ê³³ì ì¸ë±ì¤ 255 previous_code, 256 jong_joined = false 257 ; 258 259 function _makeHangul(index) { // complete_index + 1ë¶í° indexê¹ì§ë¥¼ greedyíê² íê¸ë¡ ë§ë ë¤. 260 var code, 261 cho, 262 jung1, 263 jung2, 264 jong1 = 0, 265 jong2, 266 hangul = '' 267 ; 268 269 jong_joined = false; 270 if (complete_index + 1 > index) { 271 return; 272 } 273 for (var step = 1; ; step++) { 274 if (step === 1) { 275 cho = array[complete_index + step].charCodeAt(0); // 첫 ì모를 choì ì ì¥ 276 /* choê° ì¤ì±ì¸ ê²½ì° */ 277 if (_isJung(cho)) { // 첫ë²ì§¸ ê²ì´ 모ìì´ë©´ 1) ã ê°ì ê²½ì°ì´ê±°ë 2) ã ê°ì ê²½ì°ì´ë¤ 278 /* choì ë¤ì ì모(jung1)ê° ë²ì ë´ì ìì¼ë©´ì 모ìì¸ ê²½ì° */ 279 if (complete_index + step + 1 <= index && _isJung(jung1 = array[complete_index + step + 1].charCodeAt(0))) { //ë¤ìê²ì´ ìê³ ëª¨ìì´ë©´ 280 result.push(String.fromCharCode(_isJungJoinable(cho, jung1))); // choì jung1ì´ ì¤ì±ì¼ë¡ ì¡°í©ê°ë¥í ê²½ì° resultì ì¡°í©í 문ì ì¶ê° 281 complete_index = index; // complete_indexì indexê° ì ì¥ (indexê¹ì§ assemble ìë£) 282 return; 283 /* choì ë¤ì ìëª¨ê° ìê±°ë ììì¸ ê²½ì° (choì ê²°í©í ê²ì´ ììë)*/ 284 } else { 285 result.push(array[complete_index + step]); // resultì choì í´ë¹íë ìëª¨ê° ì¶ê° 286 complete_index = index; // complete_indexì indexê° ì ì¥ (indexê¹ì§ assemble ìë£) 287 return; 288 } 289 /* choê° ì¤ì±ì´ ìëë©´ì ì´ì±ë ìë ê²½ì° */ 290 } else if (!_isCho(cho)) { 291 result.push(array[complete_index + step]); // resultì choì í´ë¹íë ìëª¨ê° ì¶ê° 292 complete_index = index; // complete_indexì indexê° ì ì¥ (indexê¹ì§ assemble ìë£) 293 return; 294 }
295 hangul = array[complete_index + step]; // hangulì 첫 ìëª¨ê° ì ì¥ 296 } else if (step === 2) { 297 jung1 = array[complete_index + step].charCodeAt(0); // jung1ì ëë²ì§¸ ì모 ì ì¥ 298 /* jung1ì´ ììì¸ ê²½ì° */ 299 if (_isCho(jung1)) { //ëë²ì§¸ ë ììì´ ì¤ë©´ ã³ ìì ã ê°ì ê²½ì°ì´ë¤ 300 cho = _isJongJoinable(cho, jung1); // ìì ì´ì±(cho)ê³¼ jung1ì´ ì¡°í© ê°ë¥í ê²½ì° choì í´ë¹ ì¡°í©ì ì ì¥íë¤ 301 hangul = String.fromCharCode(cho); // hangulì cho를 문ìì´ë¡ ë°íí´ ì ì¥íë¤. 302 result.push(hangul); // resultì hangul ì¶ê° 303 complete_index = index; // complete_indexì indexê° ì ì¥ (indexê¹ì§ assemble ìë£) 304 return; 305 /* jung1ì´ ììì´ ìë ê²½ì° */ 306 } else { 307 hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + HANGUL_OFFSET); // choì jung1ì íê¸ë¡ ì¡°í©í´ 문ìì´ë¡ ë°í í hangulì ì ì¥ 308 } 309 } else if (step === 3) { 310 jung2 = array[complete_index + step].charCodeAt(0); // jung2ì ì¸ë²ì§¸ ì모 ì ì¥ 311 if (_isJungJoinable(jung1, jung2)) { 312 jung1 = _isJungJoinable(jung1, jung2); // jung1ê³¼ jung2ê° ì¢ ì±ì¼ë¡ì ì¡°í© ê°ë¥í ê²½ì° ì¡°í© í´ jung1ì ì ì¥ 313 } else { 314 jong1 = jung2; // jung1ê³¼ jung2ê° ì¢ ì±ì¼ë¡ì ì¡°í© ë¶ê°ë¥í ê²½ì° jung2ê°ì jong1ì ì ì¥ 315 } 316 hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); 317 318 } else if (step === 4) { 319 jong2 = array[complete_index + step].charCodeAt(0); // jong2ì ë¤ë²ì§¸ ì모 ì ì¥ 320 if (_isJongJoinable(jong1, jong2)) { 321 jong1 = _isJongJoinable(jong1, jong2); // jong1ê³¼ jong2ê° ì¢ ì±ì¼ë¡ì ì¡°í© ê°ë¥í ê²½ì° ì¡°í© í jong1ì ì ì¥ 322 } else { 323 jong1 = jong2; // jong1ê³¼ jong2ê° ì¢ ì±ì¼ë¡ì ì¡°í© ë¶ê°ë¥í ê²½ì° jong2ê°ì jong1ì ì ì¥ 324 } 325 hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // cho, jung1, jong1를 íê¸ë¡ ì¡°í©í´ 문ìì´ë¡ ë°í í hangulì ì ì¥ 326 } else if (step === 5) { 327 jong2 = array[complete_index + step].charCodeAt(0); // jong2ì ë¤ì¯ë²ì§¸ ì모 ì ì¥ 328 jong1 = _isJongJoinable(jong1, jong2); // jong1ê³¼ jong2를 ì¢ ì±ì¼ë¡ì ì¡°í©í´ jong1ì ì ì¥ 329 hangul = String.fromCharCode((CHO_HASH[cho] * 21 + JUNG_HASH[jung1]) * 28 + JONG_HASH[jong1] + HANGUL_OFFSET); // cho, jung1, jong1를 íê¸ë¡ ì¡°í©í´ 문ìì´ë¡ ë°í í hangulì ì ì¥ 330 } 331 332 if (complete_index + step >= index) { 333 result.push(hangul); // resultì hangul ì¶ê° (ì¡°í© ê²°ê³¼ ì¶ê°) 334 complete_index = index; 335 return; 336 } 337 } 338 } 339 340 /* 모ë 문ìì ëí´ íì¸ */ 341 for (var i = 0; i < length; i++) { 342 code = array[i].charCodeAt(0); 343 if (!_isCho(code) && !_isJung(code) && !_isJong(code)) { //ì´, ì¤, ì¢ ì± ë¤ ìëë©´ 344 _makeHangul(i - 1); // i-1ë²ì§¸ 문ìê¹ì§ ì°ì íê¸ë¡ ì¡°í©í í 345 _makeHangul(i); // ië²ì§¸ë¶í° ë¤ì ì¡°í© 346 stage = 0; 347 continue; 348 } 349 //console.log(stage, array[i]); 350 if (stage === 0) { // ì´ì±ì´ ì¬ ì°¨ë¡ 351 if (_isCho(code)) { // ì´ì±ì´ ì¤ë©´ ì무 문ì ìë¤. 352 stage = 1; 353 } else if (_isJung(code)) { 354 // ì¤ì±ì´ì¤ë©´ ã ëë ã ì¸ê²ì´ë¤. ë°ë¡ 구ë¶ì 못íë¤. ë°ë¼ì í¹ìí stageì¸ stage4ë¡ ì´ë 355 stage = 4; 356 } 357 } else if (stage == 1) { //ì¤ì±ì´ ì¬ ì°¨ë¡ 358 if (_isJung(code)) { //ì¤ì±ì´ ì¤ë©´ 문ì ìì ì§í. 359 stage = 2; 360 } else { //ìëê³ ììì´ì¤ë©´ ã»ê°ì ê²½ì°ê° ìê³ ã¹ã ê°ì ê²½ì°ê° ìë¤. 361 if (_isJongJoinable(previous_code, code)) { 362 // í©ì³ì§ ì ìë¤ë©´ ã» ê°ì ê²½ì°ì¸ë° ì´ ë¤ì 모ìì´ ìì ã¹ë§ ê° ë ìë ìê³ ì´ì±ì´ ì¬ ìë ìë¤. ë°ë¼ì ì£ë¶ë¦¬ ìì±í ì ìë¤. ì´ë stage5ë¡ ê°ë¤. 363 stage = 5; 364 } else { //í©ì³ì§ ì ìë¤ë©´ ì ê¸ì ìì± í ì¬ì í ì¤ì±ì´ ì¬ ì°¨ë¡ 365 _makeHangul(i - 1); 366 } 367 } 368 } else if (stage == 2) { //ì¢ ì±ì´ ì¬ ì°¨ë¡ 369 if (_isJong(code)) { //ì¢ ì±ì´ ì¤ë©´ ë¤ìì ìì ëë 모ìì´ ì¨ë¤. 370 stage = 3; 371 } else if (_isJung(code)) { //ê·¸ë°ë° ì¤ì±ì´ ì¤ë©´ ìì 모ìê³¼ í©ì¹ ì ìëì§ ë³¸ë¤. 372 if (_isJungJoinable(previous_code, code)) { //í©ì¹ ì ìì¼ë©´ ì¬ì í ì¢ ì±ì´ ì¬ ì°¨ë¡ê³ ê·¸ëë¡ ì§í 373 } else { // í©ì¹ ì ìë¤ë©´ ì¤íê° ì긴 ê²½ì° 374 _makeHangul(i - 1); 375 stage = 4; 376 } 377 } else { // ë°ì¹¨ì´ ìëë ììì´ ì¤ë©´ 㸠ê°ì ì´ì ê¹ì§ ìì±íê³ ë¤ììì 378 _makeHangul(i - 1); 379 stage = 1; 380 } 381 } else if (stage == 3) { // ì¢ ì±ì´ íë ì¨ ìí. 382 if (_isJong(code)) { // ë ì¢ ì±ì´ë©´ í©ì¹ ì ìëì§ ë³¸ë¤. 383 if (!jong_joined && _isJongJoinable(previous_code, code)) { //í©ì¹ ì ìì¼ë©´ ê³ì ì§í. ìëíë©´ ì´ë²ì ì¨ ììì´ ë¤ì ê¸ìì ì´ì±ì´ ë ìë ì기 ë문. ëì ì´ ê¸°íë íë²ë§ 384 jong_joined = true; 385 } else { //ìì¼ë©´ íê¸ì ìì± 386 _makeHangul(i - 1); 387 stage = 1; // ì´ ì¢ ì±ì´ ì´ì±ì´ ëê³ ì¤ì±ë¶í° ìì 388 } 389 } else if (_isCho(code)) { // ì´ì±ì´ë©´ íê¸ì ìì±. 390 _makeHangul(i - 1); 391 stage = 1; //ì´ ê¸ìê° ì´ì±ì´ëë¯ë¡ ì¤ì±ë¶í° ìì 392 } else if (_isJung(code)) { // ì¤ì±ì´ë©´ ì´ì ì¢ ì±ì ì´ ì¤ì
392±ê³¼ í©ì³ì§ê³ ì ê¸ìë ë°ì¹¨ì´ ìë¤. 393 _makeHangul(i - 2); 394 stage = 2; 395 } 396 } else if (stage == 4) { // ì¤ì±ì´ íë ì¨ ìí 397 if (_isJung(code)) { //ì¤ì±ì´ ì¨ ê²½ì° 398 if (_isJungJoinable(previous_code, code)) { //ì´ì ì¤ì±ê³¼ í©ì³ì§ ì ìë ê²½ì° 399 _makeHangul(i); 400 stage = 0; 401 } else { //ì¤ì±ì´ ìì§ë§ 못í©ì¹ë ê²½ì°. ã ã ê°ì 402 _makeHangul(i - 1); 403 } 404 } else { // ìëë©´ ììì´ ì¨ ê²½ì°. 405 _makeHangul(i - 1); 406 stage = 1; 407 } 408 } else if (stage == 5) { // ì´ì±ì´ ì°ìí´ì ëê° ì¨ ìí 㺠409 if (_isJung(code)) { //ì´ë²ì ì¤ì±ì´ë©´ ã¹ê° 410 _makeHangul(i - 2); 411 stage = 2; 412 } else { 413 _makeHangul(i - 1); 414 stage = 1; 415 } 416 } 417 previous_code = code; 418 } 419 _makeHangul(i - 1); 420 return result.join(''); 421 }; 422 423 var search = function (a, b) { 424 /* a ì b 를 disassembleí í 문ìì´ë¡ ë°íí´ ad, bdì ê°ê° ì ì¥ */ 425 var ad = disassemble(a).join(''), 426 bd = disassemble(b).join('') 427 ; 428 429 return ad.indexOf(bd); // ad ìì bdê° í¬í¨ëë ì¸ë±ì¤ë¥¼ ì°¾ì ë°í 430 }; 431 432 var rangeSearch = function (haystack, needle) { 433 var hex = disassemble(haystack).join(''), 434 nex = disassemble(needle).join(''), 435 grouped = disassemble(haystack, true), 436 re = new RegExp(nex, 'gi'), 437 indices = [], 438 result; 439 440 if (!needle.length) return []; 441 442 while ((result = re.exec(hex))) { 443 indices.push(result.index); 444 } 445 446 function findStart(index) { 447 for (var i = 0, length = 0; i < grouped.length; ++i) { 448 length += grouped[i].length; 449 if (index < length) return i; 450 } 451 } 452 453 function findEnd(index) { 454 for (var i = 0, length = 0; i < grouped.length; ++i) { 455 length += grouped[i].length; 456 if (index + nex.length <= length) return i; 457 } 458 } 459 460 return indices.map(function (i) { 461 return [findStart(i), findEnd(i)]; 462 }); 463 }; 464 465 function Searcher(string) { 466 this.string = string; 467 this.disassembled = disassemble(string).join(''); 468 } 469 470 Searcher.prototype.search = function (string) { 471 return disassemble(string).join('').indexOf(this.disassembled); 472 }; 473 /* stringì´ ììì¼ë¡ ëëëì§ íì¸ */ 474 var endsWithConsonant = function (string) { 475 if (typeof string === 'object') { 476 string = string.join(''); 477 } 478 479 var code = string.charCodeAt(string.length - 1); 480 481 if (_isHangul(code)) { // ìì±ë íê¸ì´ë©´ 482 code -= HANGUL_OFFSET; 483 var jong = code % 28; 484 if (jong > 0) { 485 return true; 486 } 487 } else if (_isConsonant(code)) { //ììì´ë©´ 488 return true; 489 } 490 return false; 491 }; 492 493 /* stringì´ target 문ìë¡ ëëëì§ íì¸ */ 494 var endsWith = function (string, target) { 495 return disassemble(string).pop() === target; 496 }; 497 498 499 var hangul = { 500 disassemble: disassemble, 501 d: disassemble, // alias for disassemble 502 disassembleToString: disassembleToString, 503 ds: disassembleToString, // alias for disassembleToString 504 assemble: assemble, 505 a: assemble, // alias for assemble 506 search: search, 507 rangeSearch: rangeSearch, 508 Searcher: Searcher, 509 endsWithConsonant: endsWithConsonant, 510 endsWith: endsWith, 511 isHangul: function (c) { 512 if (typeof c === 'string') 513 c = c.charCodeAt(0); 514 return _isHangul(c); 515 }, 516 isComplete: function (c) { 517 if (typeof c === 'string')
518 c = c.charCodeAt(0); 519 return _isHangul(c); 520 }, 521 isConsonant: function (c) { 522 if (typeof c === 'string') 523 c = c.charCodeAt(0); 524 return _isConsonant(c); 525 }, 526 isVowel: function (c) { 527 if (typeof c === 'string') 528 c = c.charCodeAt(0); 529 return _isJung(c); 530 }, 531 isCho: function (c) { 532 if (typeof c === 'string') 533 c = c.charCodeAt(0); 534 return _isCho(c); 535 }, 536 isJong: function (c) { 537 if (typeof c === 'string') 538 c = c.charCodeAt(0); 539 return _isJong(c); 540 }, 541 isHangulAll: function (str) { 542 if (typeof str !== 'string') return false; 543 for (var i = 0; i < str.length; i++) { 544 if (!_isHangul(str.charCodeAt(i))) return false; 545 } 546 return true; 547 }, 548 isCompleteAll: function (str) { 549 if (typeof str !== 'string') return false; 550 for (var i = 0; i < str.length; i++) { 551 if (!_isHangul(str.charCodeAt(i))) return false; 552 } 553 return true; 554 }, 555 isConsonantAll: function (str) { 556 if (typeof str !== 'string') return false; 557 for (var i = 0; i < str.length; i++) { 558 if (!_isConsonant(str.charCodeAt(i))) return false; 559 } 560 return true; 561 }, 562 isVowelAll: function (str) { 563 if (typeof str !== 'string') return false; 564 for (var i = 0; i < str.length; i++) { 565 if (!_isJung(str.charCodeAt(i))) return false; 566 } 567 return true; 568 }, 569 isChoAll: function (str) { 570 if (typeof str !== 'string') return false; 571 for (var i = 0; i < str.length; i++) { 572 if (!_isCho(str.charCodeAt(i))) return false; 573 } 574 return true; 575 }, 576 isJongAll: function (str) { 577 if (typeof str !== 'string') return false; 578 for (var i = 0; i < str.length; i++) { 579 if (!_isJong(str.charCodeAt(i))) return false; 580 } 581 return true; 582 } 583 }; 584 585 if (typeof define == 'function' && define.amd) { 586 define(function () { 587 return hangul; 588 }); 589 } else if (typeof module !== 'undefined') { 590 module.exports = hangul; 591 } else { 592 window.Hangul = hangul; 593 } 594})(); 595
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.