kuroshiro
kuroshiro is a Japanese language library for converting Japanese sentence to Hiragana, Katakana or Romaji with furigana and okurigana modes supported.
Read this in other languages: English, ๆฅๆฌ่ช, ็ฎไฝไธญๆ, ็น้ซไธญๆ, Esperanto.
Demo
You can check the demo here.
Feature
- Japanese Sentence => Hiragana, Katakana or Romaji
- Furigana and okurigana supported
๐ Multiple morphological analyzers supported๐ Multiple romanization systems supported- Useful Japanese utils
Breaking Change in 1.x
- Seperate morphological analyzer from phonetic notation logic to make it possible that we can use different morphological analyzers (ready-made or customized)
- Embrace ES8/ES2017 to use async/await functions
- Use ES6 Module instead of CommonJS
Ready-made Analyzer Plugins
You should check the environment compatibility of each analyzer before you start working with them
Analyzer | Node.js Support | Browser Support | Plugin Repo | Developer |
---|---|---|---|---|
Kuromoji | โ | โ | kuroshiro-analyzer-kuromoji | Hexen Qi |
Mecab | โ | โ | kuroshiro-analyzer-mecab | Hexen Qi |
Yahoo Web API | โ | โ | kuroshiro-analyzer-yahoo-webapi | Hexen Qi |
Usage
Node.js (or using a module bundler (e.g. Webpack))
Install with npm package manager:
$ npm install kuroshiro
Load the library:
Support ES6 Module import
import Kuroshiro from "kuroshiro";
// Initialize kuroshiro with an instance of analyzer (You could check the [apidoc](#initanalyzer) for more information):
// For this example, you should npm install and import the kuromoji analyzer first
import KuromojiAnalyzer from "kuroshiro-analyzer-kuromoji";
// Instantiate
const kuroshiro = new Kuroshiro();
// Initialize
// Here uses async/await, you could also use Promise
await kuroshiro.init(new KuromojiAnalyzer());
// Convert what you want
const result = await kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", { to: "hiragana" });
And CommonJS require
const Kuroshiro = require("kuroshiro")๏ผ
const KuromojiAnalyzer = require("kuroshiro-analyzer-kuromoji");
const kuroshiro = new Kuroshiro();
kuroshiro.init(new KuromojiAnalyzer())
.then(function(){
return kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", { to: "hiragana" });
})
.then(function(result){
console.log(result);
})
Browser
Add dist/kuroshiro.min.js
to your frontend project (you may first build it from source with npm run build
after npm install
), and in your HTML:
<script src="url/to/kuroshiro.min.js"></script>
For this example, you should also include kuroshiro-analyzer-kuromoji.min.js
which you could get from kuroshiro-analyzer-kuromoji
<script src="url/to/kuroshiro-analyzer-kuromoji.min.js"></script>
Instantiate:
var kuroshiro = new Kuroshiro();
Initialize kuroshiro with an instance of analyzer, then convert what you want:
kuroshiro.init(new KuromojiAnalyzer({ dictPath: "url/to/dictFiles" }))
.then(function () {
return kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", { to: "hiragana" });
})
.then(function(result){
console.log(result);
})
API
Constructor
Examples
const kuroshiro = new Kuroshiro();
Instance Medthods
init(analyzer)
Initialize kuroshiro with an instance of analyzer. You should first import an analyzer and initialize it. You can make use of the Ready-made Analyzers listed above. And please refer to documentation of analyzers for analyzer initialization instructions
Arguments
analyzer
- An instance of analyzer.
Examples
await kuroshiro.init(new KuromojiAnalyzer());
convert(str, [options])
Convert given string to target syllabary with options available
Arguments
str
- A String to be converted.options
- Optional kuroshiro has several convert options as below.
Options | Type | Default | Description |
---|---|---|---|
to | String | "hiragana" | Target syllabary [hiragana , katakana , romaji ] |
mode | String | "normal" | Convert mode [normal , spaced , okurigana , furigana ] |
romajiSystem* | String | "hepburn" | Romanization system [nippon , passport , hepburn ] |
delimiter_start | String | "(" | Delimiter(Start) |
delimiter_end | String | ")" | Delimiter(End) |
*: Param romajiSystem
is only applied when the value of param to
is romaji
. For more about it, check Romanization System
Examples
// normal
await kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", {mode:"okurigana", to:"hiragana"});
// result๏ผใใใใจใใใใฆใใคใชใใใใใใชใใฎใฏใใใใใฎใฉใคใณ and ใฌใใชใขใใใใ๏ผ
// spaced
await kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", {mode:"okurigana", to:"hiragana"});
// result๏ผใใใใจใ ใใ ใฆ ใ ใคใชใ ใ ใ ใใใชใ ใฎ ใฏ ใใใใ ใฎ ใฉใคใณ and ใฌใ ใชใข ใใใใ ๏ผ
// okurigana
await kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", {mode:"okurigana", to:"hiragana"});
// result: ๆ(ใใ)ใๅ(ใจ)ใใใๆ(ใฆ)ใ็น(ใคใช)ใใใ้(ใใ)ใชใใฎใฏไบบ็(ใใใใ)ใฎใฉใคใณ and ใฌใใชใขๆ้ซ(ใใใใ)๏ผ
// furigana await kuroshiro.convert("ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ", {mode:"furigana", to:"hiragana"}); // result: ๆใๅใใใๆใ็นใใใ้ใชใใฎใฏไบบ็ใฎใฉใคใณ and ใฌใใชใขๆ้ซ๏ผ
Utils
Examples
const result = Kuroshiro.Util.isHiragana("ใ"));
isHiragana(char)
Check if input char is hiragana.
isKatakana(char)
Check if input char is katakana.
isKana(char)
Check if input char is kana.
isKanji(char)
Check if input char is kanji.
isJapanese(char)
Check if input char is Japanese.
hasHiragana(str)
Check if input string has hiragana.
hasKatakana(str)
Check if input string has katakana.
hasKana(str)
Check if input string has kana.
hasKanji(str)
Check if input string has kanji.
hasJapanese(str)
Check if input string has Japanese.
kanaToHiragna(str)
Convert input kana string to hiragana.
kanaToKatakana(str)
Convert input kana string to katakana.
kanaToRomaji(str, system)
Convert input kana string to romaji. Param system
accepts "nippon"
, "passport"
, "hepburn"
(Default: "hepburn").
Romanization System
kuroshiro supports three kinds of romanization systems.
nippon
: Nippon-shiki romanization. Refer to ISO 3602 Strict.
passport
: Passport-shiki romanization. Refer to Japanese romanization table published by Ministry of Foreign Affairs of Japan.
hepburn
: Hepburn romanization. Refer to BS 4812 : 1972.
There is a useful webpage for you to check the difference between these romanization systems.
Notice for Romaji Conversion
Since it's impossible to fully automatically convert furigana directly to romaji because furigana lacks information on pronunciation (Refer to ใชใ ใใชใฌใใงใฏ ใใกใชใฎใ๏ผ).
kuroshiro will not handle chลon when processing directly furigana (kana) -> romaji conversion with every romanization system (Except that Chลonpu will be handled)
For example, you'll get "kousi", "koushi", "koushi" respectively when converts kana "ใใใ" to romaji
using nippon
, passport
, hepburn
romanization system.
The kanji -> romaji conversion with/without furigana mode is unaffected by this logic.
Contributing
Please check CONTRIBUTING.
Inspired By
- kuromoji
- wanakana
License
MIT