Skip to content

Commit

Permalink
Implemented romaji to kana conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
EClaesson committed Sep 20, 2020
1 parent 6362fac commit f394a9b
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 4 deletions.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ Return a string based on _str_ where all katakana characters are replaced with h

Returns a string based on _str_ where all hiragana and katakana are replaced with romaji.

``` romajiToHiragana(str) ```

Returns a string based on _str_ with all romaji replaced with hiragana.

``` romajiToKatakana(str) ```

Returns a string based on _str_ with all romaji replaced with katakana.

## Examples

```javascript
Expand All @@ -80,4 +88,7 @@ jskana.hiraganaToKatakana('「うまい もも こっちゃ こい。 にがい

jskana.kanaToRomaji('こちゃに れもんを いれます。')
> 'kochani remonwo iremasu。'

jskana.romajiToHiragana('kochani remonwo iremasu')
> 'こちゃに れもんを いれます'
```
43 changes: 41 additions & 2 deletions jskana.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const HIRAGANA_ROMAJI_MAPPING = [
['りゅ', 'ryu'], ['りょ', 'ryo'], ['ぎゃ', 'gya'], ['ぎゅ', 'gyu'], ['ぎょ', 'gyo'],
['じゃ', 'ja'], ['じゅ', 'ju'], ['じょ', 'jo'], ['びゃ', 'bya'], ['びゅ', 'byu'],
['びょ', 'byo'], ['ぴゃ', 'pya'], ['ぴゅ', 'pyu'], ['ぴょ', 'pyo'],
];
].sort((a, b) => { return a[1].length < b[1].length ? -1 : 1; });

const HIRAGANA = 0;
const KATAKANA = 1;
Expand Down Expand Up @@ -131,6 +131,14 @@ function _systemConvertChar(char, from_system, to_system) {
function _systemConvertString(str, from_system, to_system) {
let converted = '';

if(from_system === ROMAJI) {
if(to_system === HIRAGANA) {
return _romajiToHiragana(str);
} else {
return _systemConvertString(_romajiToHiragana(str), HIRAGANA, KATAKANA);
}
}

[...str].forEach((char) => {
if(_isCharWhitespace(char) || !isStringOfSystem(char, from_system)) {
converted += char;
Expand All @@ -152,6 +160,32 @@ function _hiraganaCharToRomaji(char) {
return '';
}

function _romajiToHiragana(str) {
let remaining = str.slice();
let hiragana = '';

while(remaining.length > 0) {
let found = false;

for(let i = HIRAGANA_ROMAJI_MAPPING.length - 1; i >= 0; i--) {
let mapping = HIRAGANA_ROMAJI_MAPPING[i];

if(remaining.startsWith(mapping[1])) {
hiragana += mapping[0];
remaining = remaining.substring(mapping[1].length);
found = true;
}
}

if(!found) {
hiragana += remaining[0];
remaining = remaining.substring(1);
}
}

return hiragana;
}

function isStringOfSystem(str, system, include_punctuation) {
if(system === ROMAJI) {
return isRomaji(str, include_punctuation);
Expand Down Expand Up @@ -216,6 +250,9 @@ function isRomaji(str, include_punctuation=true) { return [...str].every((char)
function hiraganaToKatakana(str) { return _systemConvertString(str, HIRAGANA, KATAKANA); }
function katakanaToHiragana(str) { return _systemConvertString(str, KATAKANA, HIRAGANA); }

function romajiToHiragana(str) { return _systemConvertString(str, ROMAJI, HIRAGANA); }
function romajiToKatakana(str) { return _systemConvertString(str, ROMAJI, KATAKANA); }

exports.splitKanaString = splitKanaString;
exports.isHiragana = isHiragana;
exports.isKatakana = isKatakana;
Expand All @@ -224,4 +261,6 @@ exports.isPunctuation = isPunctuation;
exports.isRomaji = isRomaji;
exports.hiraganaToKatakana = hiraganaToKatakana;
exports.katakanaToHiragana = katakanaToHiragana;
exports.kanaToRomaji = kanaToRomaji;
exports.kanaToRomaji = kanaToRomaji;
exports.romajiToHiragana = romajiToHiragana;
exports.romajiToKatakana = romajiToKatakana;
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jskana",
"version": "0.0.2",
"version": "0.0.3",
"description": "Japanese kana and romaji conversion.",
"main": "jskana.js",
"scripts": {
Expand Down
11 changes: 10 additions & 1 deletion test.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,13 @@ test('katakanaToHiragana', () => {
test('kanaToRomaji', () => {
expect(jskana.kanaToRomaji('こちゃに れもんを いれます。')).toBe('kochani remonwo iremasu。');
expect(jskana.kanaToRomaji('ネクライトーキー')).toBe('nekuraitoki');
});
});

test('romajiToHiragana', () => {
expect(jskana.romajiToHiragana('kochani remonwo iremasu。')).toBe('こちゃに れもんを いれます。');
})

test('romajiToKatakana', () => {
expect(jskana.romajiToKatakana('kurakushon')).toBe('クラクション');
})

0 comments on commit f394a9b

Please sign in to comment.