Skip to content

Instantly share code, notes, and snippets.

@marcmartino
Last active December 31, 2019 21:44
Show Gist options
  • Save marcmartino/608961ff5cf0d3d635c75a8c961ef1bf to your computer and use it in GitHub Desktop.
Save marcmartino/608961ff5cf0d3d635c75a8c961ef1bf to your computer and use it in GitHub Desktop.
hangul jamo info
export enum jamoAttr {
consonant,
vowel,
singleJamo,
doubleJamo,
composedJamo,
validInitialPosition,
validFinalPosition,
verticalVowel,
horizontalVowel,
dipthong
}
type LeadingOrTrailingConsonants =
| "ㄱ"
| "ㄲ"
| "ㄴ"
| "ㄷ"
| "ㄹ"
| "ㅁ"
| "ㅂ"
| "ㅅ"
| "ㅆ"
| "ㅇ"
| "ㅈ"
| "ㅊ"
| "ㅋ"
| "ㅌ"
| "ㅍ"
| "ㅎ";
type LeadingOnlyConsonants = "ㄸ" | "ㅃ" | "ㅉ";
type TrailingOnlyConsonants =
| "ㄳ"
| "ㄵ"
| "ㄶ"
| "ㄺ"
| "ㄻ"
| "ㄼ"
| "ㄽ"
| "ㄾ"
| "ㄿ"
| "ㅀ"
| "ㅄ";
export interface jamoObject {
attributes: jamoAttr[];
name: { hangul: string; romanized: string };
}
export interface jamoPositionDescription {
romanization: string;
ipa: string;
}
interface LeadingOnlyConsonant extends jamoObject {
initial: jamoPositionDescription;
}
interface LeadingOrTrailingConsonant extends jamoObject {
initial: jamoPositionDescription;
final: jamoPositionDescription;
}
interface TrailingOnlyConsonant extends jamoObject {
final: jamoPositionDescription;
}
export const consonants: {
[jamo in LeadingOrTrailingConsonants]: LeadingOrTrailingConsonant;
} &
{ [jamo in LeadingOnlyConsonants]: LeadingOnlyConsonant } &
{ [jamo in TrailingOnlyConsonants]: TrailingOnlyConsonant } = {
ㄱ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "기역", romanized: "giyeok" },
initial: {
romanization: "g",
ipa: "/k/"
},
final: {
romanization: "k",
ipa: "[k̚]"
}
},
ㄲ: {
attributes: [
jamoAttr.consonant,
jamoAttr.doubleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "쌍기역", romanized: "ssanggieok" },
initial: {
romanization: "kk",
ipa: "/k͈/"
},
final: { romanization: "k", ipa: "[k̚]" }
},
ㄴ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "니은", romanized: "nieun" },
initial: {
romanization: "n",
ipa: "/n/"
},
final: { romanization: "n", ipa: "/n/" }
},
ㄷ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "디귿", romanized: "dikeut" },
initial: {
romanization: "d",
ipa: "/t/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㄸ: {
attributes: [
jamoAttr.consonant,
jamoAttr.doubleJamo,
jamoAttr.validInitialPosition
],
name: { hangul: "쌍디귿", romanized: "ssangdikeut" },
initial: {
romanization: "tt",
ipa: "/t͈/"
}
},
ㄹ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "리을", romanized: "rieul" },
initial: {
romanization: "r",
ipa: "/ɾ/"
},
final: { romanization: "l", ipa: "[l]" }
},
ㅁ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "미음", romanized: "mieum" },
initial: {
romanization: "m",
ipa: "/m/"
},
final: { romanization: "m", ipa: "/m/" }
},
ㅂ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "비읍", romanized: "bieup" },
initial: {
romanization: "b",
ipa: "/p/"
},
final: { romanization: "p", ipa: "[p̚]" }
},
ㅃ: {
attributes: [
jamoAttr.consonant,
jamoAttr.doubleJamo,
jamoAttr.validInitialPosition
],
name: { hangul: "쌍비읍", romanized: "ssangbieup" },
initial: {
romanization: "pp",
ipa: "/p͈/"
}
},
ㅅ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "시옷", romanized: "siot" },
initial: {
romanization: "s",
ipa: "/s/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㅆ: {
attributes: [
jamoAttr.consonant,
jamoAttr.doubleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "쌍시옷", romanized: "ssangsiot" },
initial: {
romanization: "ss",
ipa: "/s͈/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㅇ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "이응", romanized: "ieung" },
initial: {
romanization: "",
ipa: ""
},
final: { romanization: "ng", ipa: "/ŋ/" }
},
ㅈ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "지읒", romanized: "jieut" },
initial: {
romanization: "j",
ipa: "/tɕ/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㅉ: {
attributes: [
jamoAttr.consonant,
jamoAttr.doubleJamo,
jamoAttr.validInitialPosition
],
name: { hangul: "쌍지읒", romanized: "ssangjieut" },
initial: {
romanization: "jj",
ipa: "/t͈ɕ/"
}
},
ㅊ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "치읓", romanized: "chieut" },
initial: {
romanization: "ch",
ipa: "/tɕʰ/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㅋ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "키읔", romanized: "kieuk" },
initial: {
romanization: "ḳ",
ipa: "/kʰ/"
},
final: { romanization: "k", ipa: "[k̚]" }
},
ㅌ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "티읕", romanized: "tieut" },
initial: {
romanization: "t",
ipa: "/tʰ/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㅍ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "피읖", romanized: "pieup" },
initial: {
romanization: "p̣",
ipa: "/pʰ/"
},
final: { romanization: "p", ipa: "[p̚] " }
},
ㅎ: {
attributes: [
jamoAttr.consonant,
jamoAttr.singleJamo,
jamoAttr.validInitialPosition,
jamoAttr.validFinalPosition
],
name: { hangul: "히읗", romanized: "hieuh" },
initial: {
romanization: "h",
ipa: "/h/"
},
final: { romanization: "t", ipa: "[t̚]" }
},
ㄳ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "기역-시옷", romanized: "giyeok-siot" },
final: { romanization: "gs", ipa: "" }
},
ㄵ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "니은-", romanized: "nieun" },
final: { romanization: "nj", ipa: "" }
},
ㄶ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "니은-", romanized: "nieun" },
final: { romanization: "nh", ipa: "" }
},
ㄺ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-기역", romanized: "rieul-giyeok" },
final: { romanization: "lg", ipa: "[k̚]" }
},
ㄻ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-미음", romanized: "rieul-mieum" },
final: { romanization: "lm", ipa: "" }
},
ㄼ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-비읍", romanized: "rieul-bieup" },
final: { romanization: "lb", ipa: "" }
},
ㄽ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-티읕", romanized: "rieul-tieut" },
final: { romanization: "ls", ipa: "" }
},
ㄾ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-", romanized: "rieul-" },
final: { romanization: "lt", ipa: "" }
},
ㄿ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-피읖", romanized: "rieul-pieup" },
final: { romanization: "lp", ipa: "" }
},
ㅀ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "리을-히읗", romanized: "rieul-hieuh" },
final: { romanization: "lh", ipa: "" }
},
ㅄ: {
attributes: [
jamoAttr.consonant,
jamoAttr.composedJamo,
jamoAttr.validFinalPosition
],
name: { hangul: "비읍-시옷", romanized: "bieup-siot" },
final: { romanization: "bs", ipa: "" }
}
};
export const vowels = {};
import { jamoObject, jamoAttr, jamoPositionDescription } from "./consonantJamo";
type SingleVowels =
| "ㅏ"
| "ㅑ"
| "ㅓ"
| "ㅕ"
| "ㅗ"
| "ㅛ"
| "ㅜ"
| "ㅠ"
| "ㅡ"
| "ㅣ";
type CompositeVowels =
| "ㅐ"
| "ㅒ"
| "ㅔ"
| "ㅖ"
| "ㅘ"
| "ㅙ"
| "ㅚ"
| "ㅝ"
| "ㅞ"
| "ㅟ"
| "ㅢ";
interface vowel extends jamoObject {
medial: jamoPositionDescription;
}
export const vowels: {
[jamo in SingleVowels]: vowel;
} &
{ [jamo in CompositeVowels]: vowel } = {
ㅏ: {
attributes: [jamoAttr.vowel, jamoAttr.verticalVowel, jamoAttr.singleJamo],
name: { hangul: "아", romanized: "ah" },
medial: { romanization: "a", ipa: "/a/" }
},
ㅑ: {
attributes: [
jamoAttr.vowel,
jamoAttr.verticalVowel,
jamoAttr.singleJamo,
jamoAttr.dipthong
],
name: { hangul: "야", romanized: "yah" },
medial: { romanization: "ya", ipa: "/ja/" }
},
ㅓ: {
attributes: [jamoAttr.vowel, jamoAttr.verticalVowel, jamoAttr.singleJamo],
name: { hangul: "어", romanized: "eoh" },
medial: { romanization: "eo", ipa: "/ʌ/" }
},
ㅕ: {
attributes: [
jamoAttr.vowel,
jamoAttr.verticalVowel,
jamoAttr.singleJamo,
jamoAttr.dipthong
],
name: { hangul: "여", romanized: "" },
medial: { romanization: "yeo", ipa: "/jʌ/" }
},
ㅗ: {
attributes: [jamoAttr.vowel, jamoAttr.horizontalVowel, jamoAttr.singleJamo],
name: { hangul: "오", romanized: "oh" },
medial: { romanization: "o", ipa: "/o/" }
},
ㅛ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.singleJamo,
jamoAttr.dipthong
],
name: { hangul: "요", romanized: "yoh" },
medial: { romanization: "yo", ipa: "/jo/" }
},
ㅜ: {
attributes: [jamoAttr.vowel, jamoAttr.horizontalVowel, jamoAttr.singleJamo],
name: { hangul: "우", romanized: "oo" },
medial: { romanization: "u", ipa: "/u/" }
},
ㅠ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.singleJamo,
jamoAttr.dipthong
],
name: { hangul: "유", romanized: "you" },
medial: { romanization: "yu", ipa: "/ju/" }
},
ㅡ: {
attributes: [jamoAttr.vowel, jamoAttr.horizontalVowel, jamoAttr.singleJamo],
name: { hangul: "으", romanized: "eu" },
medial: { romanization: "eu", ipa: "/ɯ/" }
},
ㅣ: {
attributes: [jamoAttr.vowel, jamoAttr.verticalVowel, jamoAttr.singleJamo],
name: { hangul: "이", romanized: "ee" },
medial: { romanization: "i", ipa: "/i/" }
},
ㅐ: {
attributes: [jamoAttr.vowel, jamoAttr.verticalVowel, jamoAttr.composedJamo],
name: { hangul: "애", romanized: "ah" },
medial: { romanization: "ae", ipa: "/ɛ/" }
},
ㅒ: {
attributes: [
jamoAttr.vowel,
jamoAttr.verticalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "얘", romanized: "yae" },
medial: { romanization: "yae", ipa: "/jɛ/" }
},
ㅔ: {
attributes: [jamoAttr.vowel, jamoAttr.verticalVowel, jamoAttr.composedJamo],
name: { hangul: "에", romanized: "eh" },
medial: { romanization: "e", ipa: "/e/" }
},
ㅖ: {
attributes: [
jamoAttr.vowel,
jamoAttr.verticalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "예", romanized: "yeh" },
medial: { romanization: "ye", ipa: "/je/" }
},
ㅘ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "와", romanized: "wa" },
medial: { romanization: "wa", ipa: "/wa/" }
},
ㅙ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "왜", romanized: "wae" },
medial: { romanization: "wae", ipa: "/wɛ/" }
},
ㅚ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo
],
name: { hangul: "외", romanized: "we" },
medial: { romanization: "oe", ipa: "/ø/" }
},
ㅝ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "워", romanized: "weo" },
medial: { romanization: "wo", ipa: "/wʌ/" }
},
ㅞ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "웨", romanized: "we" },
medial: { romanization: "we", ipa: "/we/" }
},
ㅟ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo
],
name: { hangul: "위", romanized: "wi" },
medial: { romanization: "wi", ipa: "/wi ~ y/" }
},
ㅢ: {
attributes: [
jamoAttr.vowel,
jamoAttr.horizontalVowel,
jamoAttr.composedJamo,
jamoAttr.dipthong
],
name: { hangul: "의", romanized: "eui" },
medial: { romanization: "ui", ipa: "/ɰi/" }
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment