173 lines
3.9 KiB
TypeScript
173 lines
3.9 KiB
TypeScript
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;
|
|
}
|