장준영

feat-표준화 service 추가

1 +/* eslint-disable no-use-before-define */
2 +/* eslint-disable no-restricted-syntax */
3 +const Hangul = require('hangul-js');
4 +
5 +const standardize = (word) => {
6 + let result = '';
7 + let newLetter = '';
8 + const disassembledWord = Hangul.disassemble(word);
9 + for (const [index, letter] of disassembledWord.entries()) {
10 + if (isKorean(letter)) {
11 + newLetter = Hangul.isConsonant(letter)
12 + ? standardizeConsonent(letter)
13 + : standardizeVowel(letter);
14 + } else {
15 + const preLetter = index === 1 ? '' : disassembledWord[index - 1];
16 + const nextLetter = index === disassembledWord.length - 1 ? '' : disassembledWord[index + 1];
17 + newLetter = isVowelSpecial(preLetter, letter, nextLetter)
18 + ? standardizeSpecialVowel(letter)
19 + : standardizeSpecialConsonent(letter);
20 + }
21 + result += newLetter;
22 + }
23 + return result;
24 +};
25 +
26 +const isKorean = (word) => {
27 + const numCheck = /[0-9]/; // 숫자
28 +
29 + const engCheck = /[a-zA-Z]/; // 문자
30 +
31 + const specialCheck = /[~!@#$%^&*()_+|<>?:{}]/; // 특수문자
32 +
33 + if (!numCheck.test(word) && !engCheck.test(word) && !specialCheck.test(word)) {
34 + return true;
35 + }
36 + return false;
37 +};
38 +
39 +const standardizeConsonent = (letter) => {
40 + switch (letter) {
41 + case ('ㄱ', 'ㄲ', 'ㅋ'):
42 + return 'ㄱ';
43 + case ('ㄷ', 'ㄸ', 'ㅌ'):
44 + return 'ㄷ';
45 + case ('ㅂ', 'ㅃ', 'ㅍ'):
46 + return 'ㅂ';
47 + case ('ㅅ', 'ㅆ'):
48 + return 'ㅅ';
49 + case ('ㅈ', 'ㅉ', 'ㅊ'):
50 + return 'ㅈ';
51 + default:
52 + return letter;
53 + }
54 +};
55 +
56 +const standardizeVowel = (letter) => {
57 + switch (letter) {
58 + case ('ㅏ', 'ㅑ'):
59 + return 'ㅏ';
60 + case ('ㅗ', 'ㅛ'):
61 + return 'ㅗ';
62 + case ('ㅐ', 'ㅒ', 'ㅔ', 'ㅖ', 'ㅙ', 'ㅚ', 'ㅝ', 'ㅞ'):
63 + return 'ㅐ';
64 + case ('ㅜ', 'ㅠ'):
65 + return 'ㅜ';
66 + case ('ㅓ', 'ㅕ'):
67 + return 'ㅓ';
68 + case ('ㅟ', 'ㅢ', 'ㅣ'):
69 + return 'ㅣ';
70 + default:
71 + return letter;
72 + }
73 +};
74 +
75 +const isVowelSpecial = (preLetter, letter, nextLetter) => {
76 + if (preLetter !== '') {
77 + if (nextLetter === '') {
78 + if (isKorean(preLetter)) {
79 + if (Hangul.isConsonant(preLetter)) {
80 + return true;
81 + }
82 + }
83 + } else if (isKorean(preLetter) && isKorean(nextLetter)) {
84 + if (Hangul.isConsonant(preLetter) && Hangul.isConsonant(nextLetter)) {
85 + return true;
86 + }
87 + }
88 + }
89 +
90 + return false;
91 +};
92 +
93 +const standardizeSpecialConsonent = (letter) => {
94 + switch (letter) {
95 + case ('g', 'ㅑ'):
96 + return 'ㅏ';
97 + case ('ㅗ', 'ㅛ'):
98 + return 'ㅗ';
99 + case ('ㅐ', 'ㅒ', 'ㅔ', 'ㅖ', 'ㅙ', 'ㅚ', 'ㅝ', 'ㅞ'):
100 + return 'ㅐ';
101 + case ('ㅜ', 'ㅠ'):
102 + return 'ㅜ';
103 + case ('ㅓ', 'ㅕ'):
104 + return 'ㅓ';
105 + case ('ㅟ', 'ㅢ', 'ㅣ'):
106 + return 'ㅣ';
107 + default:
108 + return letter;
109 + }
110 +};
111 +
112 +const standardizeSpecialVowel = (letter) => {
113 + switch (letter) {
114 + case ('g', 'ㅑ'):
115 + return 'ㅏ';
116 + case ('ㅗ', 'ㅛ'):
117 + return 'ㅗ';
118 + case ('ㅐ', 'ㅒ', 'ㅔ', 'ㅖ', 'ㅙ', 'ㅚ', 'ㅝ', 'ㅞ'):
119 + return 'ㅐ';
120 + case ('ㅜ', 'ㅠ'):
121 + return 'ㅜ';
122 + case ('ㅓ', 'ㅕ'):
123 + return 'ㅓ';
124 + case ('ㅟ', 'ㅢ', 'ㅣ'):
125 + return 'ㅣ';
126 + default:
127 + return letter;
128 + }
129 +};
130 +
131 +module.exports = { standardize };