55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
// Adapted from Sharkey, licensed under AGPL-3.0-only
|
||
// https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/packages/misskey-js/src/nyaize.ts
|
||
|
||
const koRegex1 = /[나-낳]/g;
|
||
const koRegex2 = /(다$)|(다(?=\.))|(다(?= ))|(다(?=!))|(다(?=\?))/gm;
|
||
const koRegex3 = /(야(?=\?))|(야$)|(야(?= ))/gm;
|
||
|
||
const ifAfter = (prefix: string, fn: (x: string) => string) => {
|
||
const preLen = prefix.length;
|
||
const regex = new RegExp(prefix, 'i');
|
||
return (x: string, pos: number, string: string) => {
|
||
return pos > 0 && string.slice(pos - preLen, pos).match(regex) ? fn(x) : x;
|
||
};
|
||
};
|
||
|
||
const nyaize = (text: string) =>
|
||
text
|
||
// ja-JP
|
||
.replaceAll('な', 'にゃ')
|
||
.replaceAll('ナ', 'ニャ')
|
||
.replaceAll('ナ', 'ニャ')
|
||
// en-US
|
||
.replaceAll(
|
||
'a',
|
||
ifAfter('n', (x) => (x === 'A' ? 'YA' : 'ya')),
|
||
)
|
||
.replaceAll(
|
||
'ing',
|
||
ifAfter('morn', (x) => (x === 'ING' ? 'YAN' : 'yan')),
|
||
)
|
||
.replaceAll(
|
||
'one',
|
||
ifAfter('every', (x) => (x === 'ONE' ? 'NYAN' : 'nyan')),
|
||
)
|
||
// pl-PL
|
||
.replaceAll(
|
||
'ł',
|
||
ifAfter('mia', (x) => (x === 'Ł' ? 'U' : 'u')),
|
||
)
|
||
// ru-RU
|
||
.replaceAll(
|
||
'а',
|
||
ifAfter('н', (x) => (x === 'А' ? 'Я' : 'я')),
|
||
)
|
||
// ko-KR
|
||
.replace(koRegex1, (match) =>
|
||
!isNaN(match.charCodeAt(0))
|
||
? String.fromCharCode(match.charCodeAt(0) + '냐'.charCodeAt(0) - '나'.charCodeAt(0))
|
||
: match,
|
||
)
|
||
.replace(koRegex2, '다냥')
|
||
.replace(koRegex3, '냥');
|
||
|
||
export default nyaize;
|