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 (const 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 (const key in nyaWords) { text = text.replaceAll(key, nyaWords[key as keyof typeof nyaWords]); } text = replacePunctuation(text); text = addNyangAtMWord(text); return text; }