export const nyaWords = { '나': "냐", '낙': "냑", '낚': "냒", '낛': "냓", '난': "냔", '낝': "냕", '낞': "냖", '낟': "냗", '날': "냘", '낡': "냙", '낢': "냚", '낣': "냛", '낤': "냜", '낥': "냝", '낦': "냞", '낧': "냟", '남': "냠", '납': "냡", '낪': "냢", '낫': "냣", '났': "냤", '낭': "냥", '낮': "냦", '낯': "냧", '낰': "냨", '낱': "냩", '낲': "냪", '낳': "냫", }; export const nyaWords2 = { '내': "냥", '넹': "냥", '넴': "냥", '넵': "냥", '냐': "냥", '님': "냥", '니': "냥", '다': "다냥", '까': "까냥", '네': "네냥", '야': "야냥", '꺼': "꺼냥", '래': "래냥", '해': "해냥", '지': "지냥", '라': "라냥", '요': "요냥", '가': "가냥", '데': "데냥", '돼': "돼냥", '줘': "줘냥", '마': "마냥", '와': "와냥", '어': "어냥", '자': "자냥", '죠': "죠냥", '서': "서냥", '게': "게냥", }; function replacePunctuation(input: string): string { return input.replace(/(^|\s)([?!,.;~^@()]+)/g, (match, p1, p2) => { const firstChar = p2[0]; let transformed; if (firstChar === '?') transformed = '냥?'; else if (firstChar === '!') transformed = '냥!'; else if (firstChar === ',') transformed = '냥,'; else if (firstChar === '.') transformed = '냥.'; else if (firstChar === ';') transformed = '냥;'; else if (firstChar === '~') transformed = '냥~'; else if (firstChar === '^') transformed = '냥^'; else if (firstChar === '@') transformed = '냥@'; else if (firstChar === '(') transformed = '냥('; else if (firstChar === ')') transformed = '냥)'; else transformed = p2; return p1 + transformed + p2.slice(1); }); } function addNyangAtMWord(sentence: string): string { return sentence.split(' ').map((word) => { const match = word.match(/^([가-힣]+)([?!,.;~^@()]*)$/); if (!match) return word; const baseWord = match[1]; const punctuation = match[2]; const lastChar = baseWord[baseWord.length - 1]; const charCode = lastChar.charCodeAt(0); if (charCode >= 0xAC00 && charCode <= 0xD7A3) { const baseCode = charCode - 0xAC00; const jongseong = baseCode % 28; if (jongseong === 16) { return baseWord + "냥" + punctuation; } } return word; }).join(' '); } export function nyaize(text: string): string { for (let key in nyaWords2) { text = text.replaceAll(key + ".", nyaWords2[key as keyof typeof nyaWords2] + "."); // yeah I gotta optimize these text = text.replaceAll(key + ",", nyaWords2[key as keyof typeof nyaWords2] + ","); text = text.replaceAll(key + "?", nyaWords2[key as keyof typeof nyaWords2] + "?"); text = text.replaceAll(key + "!", nyaWords2[key as keyof typeof nyaWords2] + "!"); text = text.replaceAll(key + ";", nyaWords2[key as keyof typeof nyaWords2] + ";"); text = text.replaceAll(key + "~", nyaWords2[key as keyof typeof nyaWords2] + "~"); text = text.replaceAll(key + "^", nyaWords2[key as keyof typeof nyaWords2] + "^"); text = text.replaceAll(key + "@", nyaWords2[key as keyof typeof nyaWords2] + "@"); text = text.replaceAll(key + "(", nyaWords2[key as keyof typeof nyaWords2] + "("); text = text.replaceAll(key + ")", nyaWords2[key as keyof typeof nyaWords2] + ")"); text = text.replaceAll(key + " ", nyaWords2[key as keyof typeof nyaWords2] + " "); if (text.endsWith(key)) { text = text.slice(0, -1) + nyaWords2[key as keyof typeof nyaWords2]; } } for (let key in nyaWords) { text = text.replaceAll(key, nyaWords[key as keyof typeof nyaWords]); } text = replacePunctuation(text); text = addNyangAtMWord(text); return text; }