Multiplatform Hangul processor library for Kotlin & JS projects, based on reverse-engineered Branah keyboard algorithm. Supported platforms:
- JS (Node, Browser)
- Kotlin (JVM, JS, Native)
Install khangul npm package:
$ npm i khangul
Import HangulContext
:
import { HangulContext } from 'khangul'
Create a new instance of HangulContext
and use it to process Hangul:
const hangulContext = new HangulContext()
console.log(hangulContext.getValue()) // ''
khangulContext.appendLetter('γ
')
khangulContext.appendLetter('γ
')
khangulContext.appendLetter('γ΄')
console.log(hangulContext.getValue()) // μ[Hangul.kt](src%2FcommonMain%2Fkotlin%2FHangul.kt)
khangulContext.removeLastLetter()
console.log(hangulContext.getValue()) // μ
Hangul.consonants
// output: ['γ±', 'γ΄', 'γ·', ...]
Hangul.vowels
// output: ['γ
', 'γ
', 'γ
', ...]
Hangul.combinationVowels
// output: ['γ
', 'γ
', 'γ
', ...]
Hangul.tenseConsonants
// output: ['γ²', 'γΈ', 'γ
', ...]
Hangul.getAll()
// output [ ...consonants, ...tenseConsonants, ...vowels, ...combinationVowels ]
Hangul.generateRandomSyllable()
// example output: λ²Ό, μΌ, λ·°, ν°, μ΄, ν¬, μ₯¬, μ, μ°
The library handles natural Hangul input, so its main use-case is to be used in text editors, chat apps, etc. As an example, there's a preview of react-simple-keyboard component integrated with our Hangul context & compatibile keyboard layout:
import { HangulContext } from "khangul"
import Keyboard from 'react-simple-keyboard'
const hangulContext = useRef(new HangulContext())
const keyboard = useRef(null as unknown as SimpleKeyboard)
const [userInput, setUserInput] = useState('')
const [layoutName, setLayoutName] = useState('default')
const onKeyPress = (button: string) => {
if (button === "{shift}" || button === "{lock}") {
setLayoutName(layoutName === "default" ? "shift" : "default")
return
}
else if (button === "{bksp}") {
hangulContext.current.removeLastLetter()
setUserInput(hangulContext.current.getValue())
return
}
hangulContext.current.appendLetter(button)
setUserInput(hangulContext.current.getValue())
}
return (
<>
<Input
placeholder='Type here...'
value={userInput}
onChange={() => {}}
/>
<Keyboard
keyboardRef={ref => (keyboard.current = ref)}
enableLayoutCandidates={false}
layoutName={layoutName}
onChange={() => {}}
onKeyPress={onKeyPress}
layout={{
default: [
"` 1 2 3 4 5 6 7 8 9 0 - = {bksp}",
"{tab} γ
γ
γ· γ± γ
γ
γ
γ
γ
γ
[ ] \\",
"{lock} γ
γ΄ γ
γΉ γ
γ
γ
γ
γ
£ ; ' {enter}",
"{shift} γ
γ
γ
γ
γ
γ
γ
‘ , . / {shift}",
".com @ {space}",
],
shift: [
"~ ! @ # $ % ^ & * ( ) _ + {bksp}",
"{tab} γ
γ
γΈ γ² γ
γ
γ
{ } |",
'{lock} : " {enter}',
"{shift} | < > ? {shift}",
".com @ {space}",
],
}}
/>
</>
)