// 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;