Hangul JS

You can now use korean words || Into js

คุณจะต้องติดตั้งส่วนขยาย เช่น Tampermonkey, Greasemonkey หรือ Violentmonkey เพื่อติดตั้งสคริปต์นี้

You will need to install an extension such as Tampermonkey to install this script.

คุณจะต้องติดตั้งส่วนขยาย เช่น Tampermonkey หรือ Violentmonkey เพื่อติดตั้งสคริปต์นี้

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

Advertisement:

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

Advertisement:

// ==UserScript==
// @name         Hangul JS
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  You can now use korean words || Into js
// @author       OfficialGoku
// @license     OFFICIAL
// @match        http://*/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==
// Temporarily store global flag
// This flag tells Aromanize not to extend string.
if(typeof AROMANIZE_EXTEND_STRING != 'undefined') {
	var AROMANIZE_EXTEND_STRING_ORIGINAL = AROMANIZE_EXTEND_STRING;
}
AROMANIZE_EXTEND_STRING = false;

// Export module
module.exports = require('./aromanize');

// Restore global flag (if any)
if(typeof AROMANIZE_EXTEND_STRING_ORIGINAL != 'undefined') {
	AROMANIZE_EXTEND_STRING = AROMANIZE_EXTEND_STRING_ORIGINAL;
}
else {
	delete AROMANIZE_EXTEND_STRING;
}

/**
	Aromanize-js
	@author Official Goku
	@since 2021.12.06
	
	UNICODE TABLE REFERENCES
	Hangul Jamo            0x3131 - 0x
	Hangul Choseong Jaeum  0x1100 - 0x1112
	Hangul Jungseong Moeum 0x1161 - 
	Hangul Jongseong Jaeum 0x11A8
	Hangul Eumjeol         0xAC00
 */
var Aromanize = {

	////////////////////////////////////////////////////////////////////
	// Transliteration rules
	////////////////////////////////////////////////////////////////////
	
	rules: {
		
		hangul: {
			
			/**
			 * Revised Romanization Transcription
			 */
			'rr': {
				// Note: giyeok (0x1100) for middle moeum is different than giyeok (0x3131) for standalone jamo
				cho: {
					'ᄀ': 'g', 'ᄁ': 'kk',
					'ᄂ': 'n',
					'ᄃ': 'd', 'ᄄ': 'tt',
					'ᄅ': 'r', 
					'ᄆ': 'm',
					'ᄇ': 'b', 'ᄈ': 'pp',
					'ᄉ': 's', 'ᄊ': 'ss',
					'ᄋ': '',
					'ᄌ': 'j', 'ᄍ': 'jj',
					'ᄎ': 'ch', 
					'ᄏ': 'k', 
					'ᄐ': 't',
					'ᄑ': 'p',
					'ᄒ': 'h'
				},
				
				// Note: ᅡ (0x1161) for middle moeum is different than ㅏ (0x314F) for standalone jamo
				jung: {
					'ᅡ': 'a', 'ᅢ': 'ae', 'ᅣ': 'ya', 'ᅤ': 'yae', 
					'ᅥ': 'eo', 'ᅦ': 'e', 'ᅧ': 'yeo', 'ᅨ': 'ye', 
					'ᅩ': 'o', 'ᅪ': 'wa', 'ᅫ': 'wae', 'ᅬ': 'oe', 'ᅭ': 'yo',
					'ᅮ': 'u', 'ᅯ': 'wo', 'ᅰ': 'we', 'ᅱ': 'wi', 'ᅲ': 'yu', 
					'ᅳ': 'eu', 'ᅴ': 'eui', 'ᅵ': 'i'
				},
				
				// Note: ᆨ (0x11A8) for last jaeum (batchim) is different than ᄀ (0x1100) for first jaeum
				// also different than ㄱ (0x3131) for standalone jamo
				jong: {
					'ᆨ': 'k', 'ᆨᄋ': 'g', 'ᆨᄂ': 'ngn', 'ᆨᄅ': 'ngn', 'ᆨᄆ': 'ngm', 'ᆨᄒ': 'kh',
					'ᆩ': 'kk', 'ᆩᄋ': 'kg', 'ᆩᄂ': 'ngn', 'ᆩᄅ': 'ngn', 'ᆩᄆ': 'ngm', 'ᆩᄒ': 'kh',
					'ᆪ': 'k', 'ᆪᄋ': 'ks', 'ᆪᄂ': 'ngn', 'ᆪᄅ': 'ngn', 'ᆪᄆ': 'ngm', 'ᆪᄒ': 'kch', 
					'ᆫ': 'n', 'ᆫᄅ': 'll', 
					'ᆬ': 'n', 'ᆬᄋ': 'nj', 'ᆬᄂ': 'nn', 'ᆬᄅ': 'nn', 'ᆬᄆ': 'nm', 'ᆬㅎ': 'nch',
					'ᆭ': 'n', 'ᆭᄋ': 'nh', 'ᆭᄅ': 'nn', 
					'ᆮ': 't', 'ᆮᄋ': 'd', 'ᆮᄂ': 'nn', 'ᆮᄅ': 'nn', 'ᆮᄆ': 'nm', 'ᆮᄒ': 'th', 
					'ᆯ': 'l', 'ᆯᄋ': 'r', 'ᆯᄂ': 'll', 'ᆯᄅ': 'll', 
					'ᆰ': 'k', 'ᆰᄋ': 'lg', 'ᆰᄂ': 'ngn', 'ᆰᄅ': 'ngn', 'ᆰᄆ': 'ngm', 'ᆰᄒ': 'lkh',
					'ᆱ': 'm', 'ᆱᄋ': 'lm', 'ᆱᄂ': 'mn', 'ᆱᄅ': 'mn', 'ᆱᄆ': 'mm', 'ᆱᄒ': 'lmh', 
					'ᆲ': 'p', 'ᆲᄋ': 'lb', 'ᆲᄂ': 'mn', 'ᆲᄅ': 'mn', 'ᆲᄆ': 'mm', 'ᆲᄒ': 'lph', 
					'ᆳ': 't', 'ᆳᄋ': 'ls', 'ᆳᄂ': 'nn', 'ᆳᄅ': 'nn', 'ᆳᄆ': 'nm', 'ᆳᄒ': 'lsh', 
					'ᆴ': 't', 'ᆴᄋ': 'lt', 'ᆴᄂ': 'nn', 'ᆴᄅ': 'nn', 'ᆴᄆ': 'nm', 'ᆴᄒ': 'lth', 
					'ᆵ': 'p', 'ᆵᄋ': 'lp', 'ᆵᄂ': 'mn', 'ᆵᄅ': 'mn', 'ᆵᄆ': 'mm', 'ᆵᄒ': 'lph', 
					'ᆶ': 'l', 'ᆶᄋ': 'lh', 'ᆶᄂ': 'll', 'ᆶᄅ': 'll', 'ᆶᄆ': 'lm', 'ᆶᄒ': 'lh',
					'ᆷ': 'm', 'ᆷᄅ': 'mn', 
					'ᆸ': 'p', 'ᆸᄋ': 'b', 'ᆸᄂ': 'mn', 'ᆸᄅ': 'mn', 'ᆸᄆ': 'mm', 'ᆸᄒ': 'ph', 
					'ᆹ': 'p', 'ᆹᄋ': 'ps', 'ᆹᄂ': 'mn', 'ᆹᄅ': 'mn', 'ᆹᄆ': 'mm', 'ᆹᄒ': 'psh', 
					'ᆺ': 't', 'ᆺᄋ': 's', 'ᆺᄂ': 'nn', 'ᆺᄅ': 'nn', 'ᆺᄆ': 'nm', 'ᆺᄒ': 'sh', 
					'ᆻ': 't', 'ᆻᄋ': 'ss', 'ᆻᄂ': 'tn', 'ᆻᄅ': 'tn', 'ᆻᄆ': 'nm', 'ᆻᄒ': 'th', 
					'ᆼ': 'ng',
					'ᆽ': 't', 'ᆽᄋ': 'j', 'ᆽᄂ': 'nn', 'ᆽᄅ': 'nn', 'ᆽᄆ': 'nm', 'ᆽᄒ': 'ch', 
					'ᆾ': 't', 'ᆾᄋ': 'ch', 'ᆾᄂ': 'nn', 'ᆾᄅ': 'nn', 'ᆾᄆ': 'nm', 'ᆾᄒ': 'ch', 
					'ᆿ': 'k', 'ᆿᄋ': 'k', 'ᆿᄂ': 'ngn', 'ᆿᄅ': 'ngn', 'ᆿᄆ': 'ngm', 'ᆿᄒ': 'kh', 
					'ᇀ': 't', 'ᇀᄋ': 't', 'ᇀᄂ': 'nn', 'ᇀᄅ': 'nn', 'ᇀᄆ': 'nm', 'ᇀᄒ': 'th', 
					'ᇁ': 'p', 'ᇁᄋ': 'p', 'ᇁᄂ': 'mn', 'ᇁᄅ': 'mn', 'ᇁᄆ': 'mm', 'ᇁᄒ': 'ph', 
					'ᇂ': 't', 'ᇂᄋ': 'h', 'ᇂᄂ': 'nn', 'ᇂᄅ': 'nn', 'ᇂᄆ': 'mm', 'ᇂᄒ': 't',
					'ᇂᄀ': 'k', 
				}
			},
			
			/**
			 * Revised Romanization Transliteration
			 */
			'rr-translit': {
				// Note: giyeok (0x1100) for middle moeum is different than giyeok (0x3131) for standalone jamo
				cho: {
					'ᄀ': 'g', 'ᄁ': 'kk',
					'ᄂ': 'n',
					'ᄃ': 'd', 'ᄄ': 'tt',
					'ᄅ': 'l', 
					'ᄆ': 'm',
					'ᄇ': 'b', 'ᄈ': 'pp',
					'ᄉ': 's', 'ᄊ': 'ss',
					'ᄋ': '',
					'ᄌ': 'j', 'ᄍ': 'jj',
					'ᄎ': 'ch', 
					'ᄏ': 'k', 
					'ᄐ': 't',
					'ᄑ': 'p',
					'ᄒ': 'h'
				},		
				
				// Note: ᅡ (0x1161) for middle moeum is different than ㅏ (0x314F) for standalone jamo
				jung: {
					'ᅡ': 'a', 'ᅢ': 'ae', 'ᅣ': 'ya', 'ᅤ': 'yae', 
					'ᅥ': 'eo', 'ᅦ': 'e', 'ᅧ': 'yeo', 'ᅨ': 'ye', 
					'ᅩ': 'o', 'ᅪ': 'oa', 'ᅫ': 'oae', 'ᅬ': 'oi', 'ᅭ': 'yo',
					'ᅮ': 'u', 'ᅯ': 'ueo', 'ᅰ': 'ue', 'ᅱ': 'ui', 'ᅲ': 'yu', 
					'ᅳ': 'eu', 'ᅴ': 'eui', 'ᅵ': 'i'
				},
				
				// Note: ᆨ (0x11A8) for last jaeum (batchim) is different than ᄀ (0x1100) for first jaeum
				// also different than ㄱ (0x3131) for standalone jamo
				jong: {
					'ᆨ': 'g', 'ᆨᄋ': 'g-',
					'ᆩ': 'kk', 'ᆩᄋ': 'kk-',
					'ᆪ': 'gs', 'ᆪᄋ': 'gs-', 'ᆪᄉ': 'gs-s', 
					'ᆫ': 'n', 'ᆫᄋ': 'n-', 
					'ᆬ': 'nj', 'ᆬᄋ': 'nj-', 'ᆬᄌ': 'nj-j', 
					'ᆭ': 'nh', 'ᆭᄋ': 'nh-',
					'ᆮ': 'd', 'ᆮᄋ': 'd-',
					'ᆯ': 'l', 'ᆯᄋ': 'l-',
					'ᆰ': 'lg', 'ᆰᄋ': 'lg-', 
					'ᆱ': 'lm', 'ᆱᄋ': 'lm-', 
					'ᆲ': 'lb', 'ᆲᄋ': 'lb-', 
					'ᆳ': 'ls', 'ᆳᄋ': 'ls-', 'ᆳᄉ': 'ls-s', 
					'ᆴ': 'lt', 'ᆴᄋ': 'lt-', 
					'ᆵ': 'lp', 'ᆵᄋ': 'lp-', 
					'ᆶ': 'lh', 'ᆶᄋ': 'lh-', 
					'ᆷ': 'm', 'ᆷᄋ': 'm-', 
					'ᆸ': 'b', 'ᆸᄋ': 'b-', 
					'ᆹ': 'bs', 'ᆹᄋ': 'bs-', 'ᆹᄉ': 'bs-s', 
					'ᆺ': 's', 'ᆺᄋ': 's-', 'ᆺᄊ': 's-ss', 
					'ᆻ': 'ss', 'ᆻᄋ': 'ss-', 'ᆻᄉ': 'ss-s', 
					'ᆼ': 'ng', 'ᆼᄋ': 'ng-',
					'ᆽ': 'j', 'ᆽᄋ': 'j-', 'ᆽᄌ': 'j-j', 
					'ᆾ': 'ch', 'ᆾᄋ': 'ch-', 
					'ᆿ': 'k', 'ᆿᄋ': 'k-', 
					'ᇀ': 't', 'ᇀᄋ': 't-', 
					'ᇁ': 'p', 'ᇁᄋ': 'p-', 
					'ᇂ': 'h', 'ᇂᄋ': 'h-'
				}
			},
			
			'skats': {
				hyphen: ' ',
				
				// Note: giyeok (0x1100) for middle moeum is different than giyeok (0x3131) for standalone jamo
				cho: {
					'ᄀ': 'L', 'ᄁ': 'LL',
					'ᄂ': 'F',
					'ᄃ': 'B', 'ᄄ': 'BB',
					'ᄅ': 'V', 
					'ᄆ': 'M',
					'ᄇ': 'W', 'ᄈ': 'WW',
					'ᄉ': 'G', 'ᄊ': 'GG',
					'ᄋ': 'K',
					'ᄌ': 'P', 'ᄍ': 'PP',
					'ᄎ': 'C', 
					'ᄏ': 'X', 
					'ᄐ': 'Z',
					'ᄑ': 'O',
					'ᄒ': 'J',
					' ': '  '
				},		
				
				// Note: ᅡ (0x1161) for middle moeum is different than ㅏ (0x314F) for standalone jamo
				jung: {
					'ᅡ': 'E', 'ᅢ': 'EU', 'ᅣ': 'I', 'ᅤ': 'IU', 
					'ᅥ': 'T', 'ᅦ': 'TU', 'ᅧ': 'S', 'ᅨ': 'SU', 
					'ᅩ': 'A', 'ᅪ': 'AE', 'ᅫ': 'AEU', 'ᅬ': 'AU', 'ᅭ': 'N',
					'ᅮ': 'H', 'ᅯ': 'HT', 'ᅰ': 'HTU', 'ᅱ': 'HU', 'ᅲ': 'R', 
					'ᅳ': 'D', 'ᅴ': 'DU', 'ᅵ': 'U'
				},
				
				// Note: ᆨ (0x11A8) for last jaeum (batchim) is different than ᄀ (0x1100) for first jaeum
				// also different than ㄱ (0x3131) for standalone jamo
				jong: {
					'ᆨ': 'L', 'ᆩ': 'LL', 'ᆪ': 'LG', 
					'ᆫ': 'F', 'ᆬ': 'FP', 'ᆭ': 'FJ', 
					'ᆮ': 'B', 
					'ᆯ': 'V', 'ᆰ': 'VL', 'ᆱ': 'VM', 'ᆲ': 'VW', 'ᆳ': 'VG', 'ᆴ': 'VZ', 'ᆵ': 'VO', 'ᆶ': 'VJ', 
					'ᆷ': 'M', 
					'ᆸ': 'W', 'ᆹ': 'WG', 
					'ᆺ': 'G', 'ᆻ': 'GG', 
					'ᆼ': 'K', 
					'ᆽ': 'P', 
					'ᆾ': 'C', 
					'ᆿ': 'X', 
					'ᇀ': 'Z', 
					'ᇁ': 'O', 
					'ᇂ': 'J'
				}
			},
			
			/**
			 * Indonesian Transcription
			 */
			'ebi': {
				// Note: giyeok (0x1100) for middle moeum is different than giyeok (0x3131) for standalone jamo
				cho: {
					'ᄀ': 'gh', 'ᄁ': 'k',
					'ᄂ': 'n',
					'ᄃ': 'dh', 'ᄄ': 't',
					'ᄅ': 'r', 
					'ᄆ': 'm',
					'ᄇ': 'b', 'ᄈ': 'p',
					'ᄉ': 's', 'ᄊ': 's',
					'ᄋ': '',
					'ᄌ': 'jh', 'ᄍ': 'c',
					'ᄎ': 'ch', 
					'ᄏ': 'kh', 
					'ᄐ': 'th',
					'ᄑ': 'ph',
					'ᄒ': 'h'
				},
				
				// Note: giyeok (0x1100) for middle moeum is different than giyeok (0x3131) for standalone jamo
				cho2: {
					'ᄀ': 'g', 'ᄁ': 'k',
					'ᄂ': 'n',
					'ᄃ': 'd', 'ᄄ': 't',
					'ᄅ': 'r', 
					'ᄆ': 'm',
					'ᄇ': 'b', 'ᄈ': 'p',
					'ᄉ': 's', 'ᄊ': 's',
					'ᄋ': '',
					'ᄌ': 'j', 'ᄍ': 'c',
					'ᄎ': 'ch', 
					'ᄏ': 'kh', 
					'ᄐ': 'th',
					'ᄑ': 'ph',
					'ᄒ': 'h'
				},
				
				// Note: ᅡ (0x1161) for middle moeum is different than ㅏ (0x314F) for standalone jamo
				jung: {
					'ᅡ': 'a', 'ᅢ': 'è', 'ᅣ': 'ya', 'ᅤ': 'yè', 
					'ᅥ': 'ö', 'ᅦ': 'é', 'ᅧ': 'yö', 'ᅨ': 'yé', 
					'ᅩ': 'o', 'ᅪ': 'wa', 'ᅫ': 'wè', 'ᅬ': 'wé', 'ᅭ': 'yo',
					'ᅮ': 'u', 'ᅯ': 'wo', 'ᅰ': 'wé', 'ᅱ': 'wi', 'ᅲ': 'yu', 
					'ᅳ': 'eu', 'ᅴ': 'eui', 'ᅵ': 'i'
				},
				
				// Note: ᆨ (0x11A8) for last jaeum (batchim) is different than ᄀ (0x1100) for first jaeum
				// also different than ㄱ (0x3131) for standalone jamo
				jong: {
					'ᆨ': 'k', 'ᆨᄋ': 'g', 'ᆨᄂ': 'ngn', 'ᆨᄅ': 'ngn', 'ᆨᄆ': 'ngm', 'ᆨᄒ': 'kh',
					'ᆩ': 'k', 'ᆩᄋ': 'kg', 'ᆩᄂ': 'ngn', 'ᆩᄅ': 'ngn', 'ᆩᄆ': 'ngm', 'ᆩᄒ': 'kh',
					'ᆪ': 'k', 'ᆪᄋ': 'ks', 'ᆪᄂ': 'ngn', 'ᆪᄅ': 'ngn', 'ᆪᄆ': 'ngm', 'ᆪᄒ': 'kch', 
					'ᆫ': 'n', 'ᆫᄅ': 'll', 
					'ᆬ': 'n', 'ᆬᄋ': 'nj', 'ᆬᄂ': 'nn', 'ᆬᄅ': 'nn', 'ᆬᄆ': 'nm', 'ᆬㅎ': 'nch',
					'ᆭ': 'n', 'ᆭᄋ': 'nh', 'ᆭᄅ': 'nn', 
					'ᆮ': 't', 'ᆮᄋ': 'd', 'ᆮᄂ': 'nn', 'ᆮᄅ': 'nn', 'ᆮᄆ': 'nm', 'ᆮᄒ': 'th', 
					'ᆯ': 'l', 'ᆯᄋ': 'r', 'ᆯᄂ': 'll', 'ᆯᄅ': 'll', 
					'ᆰ': 'k', 'ᆰᄋ': 'lg', 'ᆰᄂ': 'ngn', 'ᆰᄅ': 'ngn', 'ᆰᄆ': 'ngm', 'ᆰᄒ': 'lkh',
					'ᆱ': 'm', 'ᆱᄋ': 'lm', 'ᆱᄂ': 'mn', 'ᆱᄅ': 'mn', 'ᆱᄆ': 'mm', 'ᆱᄒ': 'lmh', 
					'ᆲ': 'p', 'ᆲᄋ': 'lb', 'ᆲᄂ': 'mn', 'ᆲᄅ': 'mn', 'ᆲᄆ': 'mm', 'ᆲᄒ': 'lph', 
					'ᆳ': 't', 'ᆳᄋ': 'ls', 'ᆳᄂ': 'nn', 'ᆳᄅ': 'nn', 'ᆳᄆ': 'nm', 'ᆳᄒ': 'lsh', 
					'ᆴ': 't', 'ᆴᄋ': 'lt', 'ᆴᄂ': 'nn', 'ᆴᄅ': 'nn', 'ᆴᄆ': 'nm', 'ᆴᄒ': 'lth', 
					'ᆵ': 'p', 'ᆵᄋ': 'lp', 'ᆵᄂ': 'mn', 'ᆵᄅ': 'mn', 'ᆵᄆ': 'mm', 'ᆵᄒ': 'lph', 
					'ᆶ': 'l', 'ᆶᄋ': 'lh', 'ᆶᄂ': 'll', 'ᆶᄅ': 'll', 'ᆶᄆ': 'lm', 'ᆶᄒ': 'lh',
					'ᆷ': 'm', 'ᆷᄅ': 'mn', 
					'ᆸ': 'p', 'ᆸᄋ': 'b', 'ᆸᄂ': 'mn', 'ᆸᄅ': 'mn', 'ᆸᄆ': 'mm', 'ᆸᄒ': 'ph', 
					'ᆹ': 'p', 'ᆹᄋ': 'ps', 'ᆹᄂ': 'mn', 'ᆹᄅ': 'mn', 'ᆹᄆ': 'mm', 'ᆹᄒ': 'psh', 
					'ᆺ': 't', 'ᆺᄋ': 'sh', 'ᆺᄂ': 'nn', 'ᆺᄅ': 'nn', 'ᆺᄆ': 'nm', 'ᆺᄒ': 'sh', 
					'ᆻ': 't', 'ᆻᄋ': 's', 'ᆻᄂ': 'nn', 'ᆻᄅ': 'nn', 'ᆻᄆ': 'nm', 'ᆻᄒ': 'th', 
					'ᆼ': 'ng',
					'ᆽ': 't', 'ᆽᄋ': 'j', 'ᆽᄂ': 'nn', 'ᆽᄅ': 'nn', 'ᆽᄆ': 'nm', 'ᆽᄒ': 'ch', 
					'ᆾ': 't', 'ᆾᄋ': 'ch', 'ᆾᄂ': 'nn', 'ᆾᄅ': 'nn', 'ᆾᄆ': 'nm', 'ᆾᄒ': 'ch', 
					'ᆿ': 'k', 'ᆿᄋ': 'k', 'ᆿᄂ': 'ngn', 'ᆿᄅ': 'ngn', 'ᆿᄆ': 'ngm', 'ᆿᄒ': 'kh', 
					'ᇀ': 't', 'ᇀᄋ': 't', 'ᇀᄂ': 'nn', 'ᇀᄅ': 'nn', 'ᇀᄆ': 'nm', 'ᇀᄒ': 'th', 'ᇀ이': 'ch',
					'ᇁ': 'p', 'ᇁᄋ': 'p', 'ᇁᄂ': 'mn', 'ᇁᄅ': 'mn', 'ᇁᄆ': 'mm', 'ᇁᄒ': 'ph', 
					'ᇂ': 't', 'ᇂᄋ': 'h', 'ᇂᄂ': 'nn', 'ᇂᄅ': 'nn', 'ᇂᄆ': 'mm', 'ᇂᄒ': 't', 
					'ᇂᄀ': 'kh', 'ᇂᄃ': 'dh', 'ᇂᄇ': 'bh'
				}
			},
			
			/**
			 * Kontsevich
			 */
			'konsevich': {
				// Note: giyeok (0x1100) for middle moeum is different than giyeok (0x3131) for standalone jamo
				cho: {
					'ᄀ': 'к', 'ᄁ': 'кк',
					'ᄂ': 'н',
					'ᄃ': 'т', 'ᄄ': 'тт',
					'ᄅ': 'р', 
					'ᄆ': 'м',
					'ᄇ': 'п', 'ᄈ': 'пп',
					'ᄉ': 'с', 'ᄊ': 'сс',
					'ᄋ': '',
					'ᄌ': 'ч', 'ᄍ': 'чч',
					'ᄎ': 'чх', 
					'ᄏ': 'кх', 
					'ᄐ': 'тх',
					'ᄑ': 'пх',
					'ᄒ': 'х'
				},
				
				// Note: ᅡ (0x1161) for middle moeum is different than ㅏ (0x314F) for standalone jamo
				jung: {
					'ᅡ': 'а', 'ᅢ': 'э', 'ᅣ': 'я', 'ᅤ': 'йя', 
					'ᅥ': 'о', 'ᅦ': 'е́', 'ᅧ': 'ё', 'ᅨ': 'йе', 
					'ᅩ': 'о́', 'ᅪ': 'ва', 'ᅫ': 'вэ', 'ᅬ': 'ве', 'ᅭ': 'ё',
					'ᅮ': 'у', 'ᅯ': 'во', 'ᅰ': 'ве', 'ᅱ': 'ви', 'ᅲ': 'ю', 
					'ᅳ': 'ы', 'ᅴ': 'ый', 'ᅵ': 'и'
				},
				
				// Note: ᆨ (0x11A8) for last jaeum (batchim) is different than ᄀ (0x1100) for first jaeum
				// also different than ㄱ (0x3131) for standalone jamo
				jong: {
					'ᆨ': 'к', 'ᆨᄋ': 'г', 'ᆨᄂ': 'нн', 'ᆨᄅ': 'нн', 'ᆨᄆ': 'нм', 
					'ᆩ': 'кк', 'ᆩᄋ': 'кк', 'ᆩᄂ': 'нн', 'ᆩᄅ': 'нн', 'ᆩᄆ': 'нм',
					'ᆪ': 'к', 'ᆪᄋ': 'кс', 'ᆪᄂ': 'нн', 'ᆪᄅ': 'нн', 'ᆪᄆ': 'нм', 'ᆪᄒ': 'ксх', 
					'ᆫ': 'н', 'ᆫᄀ': 'нг', 'ᆫᄃ': 'нд', 'ᆫᄅ': 'лл', 'ᆫᄇ': 'нб', 'ᆫᄌ': 'ндж', 
					'ᆬ': 'н', 'ᆬᄋ': 'нч', 'ᆬᄂ': 'нн', 'ᆬᄅ': 'нн', 'ᆬᄆ': 'нм', 'ᆬㅎ': 'нчх',
					'ᆭ': 'н', 'ᆭᄋ': 'нх', 'ᆭᄅ': 'нн', 
					'ᆮ': 'т', 'ᆮᄂ': 'тн', 'ᆮᄅ': 'нн', 'ᆮᄆ': 'нм', 
					'ᆯ': 'ль', 'ᆯᄋ': 'р', 'ᆯᄀ': 'льг', 'ᆯᄂ': 'лл', 'ᆯᄃ': 'льтт', 'ᆯᄅ': 'лл', 'ᆯᄇ': 'льб', 'ᆯᄉ': 'льсс', 'ᆯᄌ': 'льчч', 'ᆯᄒ': 'рх', 
					'ᆰ': 'к', 'ᆰᄋ': 'льг', 'ᆰᄀ': 'льг', 'ᆰᄂ': 'нн', 'ᆰᄅ': 'нн', 'ᆰᄆ': 'нм', 'ᆰᄒ': 'лькх',
					'ᆱ': 'м', 'ᆱᄋ': 'льм', 'ᆱᄂ': 'мн', 'ᆱᄅ': 'мн', 'ᆱᄆ': 'мм', 'ᆱᄒ': 'льмх', 
					'ᆲ': 'п', 'ᆲᄋ': 'льп', 'ᆲᄂ': 'мн', 'ᆲᄅ': 'мн', 'ᆲᄆ': 'мм', 'ᆲᄒ': 'льпх', 
					'ᆳ': 'т', 'ᆳᄋ': 'льс', 'ᆳᄂ': 'нн', 'ᆳᄅ': 'нн', 'ᆳᄆ': 'мн', 'ᆳᄒ': 'льс', 
					'ᆴ': 'т', 'ᆴᄋ': 'льтх', 'ᆴᄂ': 'нн', 'ᆴᄅ': 'нн', 'ᆴᄆ': 'нм', 'ᆴᄒ': 'льтх', 
					'ᆵ': 'п', 'ᆵᄋ': 'льпх', 'ᆵᄂ': 'мн', 'ᆵᄅ': 'мн', 'ᆵᄆ': 'мм', 'ᆵᄒ': 'льпх', 
					'ᆶ': 'ль', 'ᆶᄋ': 'льх', 'ᆶᄂ': 'лл', 'ᆶᄅ': 'лл', 'ᆶᄆ': 'льм', 'ᆶᄒ': 'льх',
					'ᆷ': 'м', 'ᆷᄀ': 'мг', 'ᆷᄃ': 'мд', 'ᆷᄅ': 'мн', 'ᆷᄇ': 'мб', 'ᆷᄌ': 'мдж', 
					'ᆸ': 'п', 'ᆸᄋ': 'б', 'ᆸᄂ': 'мн', 'ᆸᄅ': 'мн', 'ᆸᄆ': 'мм', 
					'ᆹ': 'п', 'ᆹᄋ': 'пс', 'ᆹᄂ': 'мн', 'ᆹᄅ': 'мн', 'ᆹᄆ': 'мм', 
					'ᆺ': 'т', 'ᆺᄋ': 'с', 'ᆺᄂ': 'нн', 'ᆺᄅ': 'нн', 'ᆺᄆ': 'нм', 'ᆺᄒ': 'с', 
					'ᆻ': 'т', 'ᆻᄋ': 'сс', 'ᆻᄅ': 'тн', 'ᆻᄆ': 'нм', 'ᆻᄒ': 'тх', 
					'ᆼ': 'нъ', 'ᆼᄀ': 'нг', 'ᆼᄃ': 'нд', 'ᆼᄅ': 'нн', 'ᆼᄇ': 'нб', 'ᆼᄌ': 'ндж',
					'ᆽ': 'т', 'ᆽᄋ': 'ч', 'ᆽᄂ': 'нн', 'ᆽᄅ': 'нн', 'ᆽᄆ': 'нм', 'ᆽᄒ': 'чх', 
					'ᆾ': 'т', 'ᆾᄋ': 'чх', 'ᆾᄂ': 'нн', 'ᆾᄅ': 'нн', 'ᆾᄆ': 'нм', 'ᆾᄒ': 'чх', 
					'ᆿ': 'к', 'ᆿᄋ': 'кх', 'ᆿᄂ': 'нн', 'ᆿᄅ': 'нн', 'ᆿᄆ': 'нм', 'ᆿᄒ': 'кх', 
					'ᇀ': 'т', 'ᇀᄋ': 'тх', 'ᇀᄂ': 'нн', 'ᇀᄅ': 'нн', 'ᇀᄆ': 'нм', 'ᇀᄒ': 'тх', 
					'ᇁ': 'п', 'ᇁᄋ': 'пх', 'ᇁᄂ': 'мн', 'ᇁᄅ': 'мн', 'ᇁᄆ': 'мм', 'ᇁᄒ': 'пх', 
					'ᇂ': 'т', 'ᇂᄋ': 'х', 'ᇂᄂ': 'нн', 'ᇂᄅ': 'нн', 'ᇂᄆ': 'мм', 'ᇂᄒ': 'тх',
					'ᇂᄀ': 'кх', 
				}
			}
			
		}
	},
	
	////////////////////////////////////////////////////////////////////
	// Conversion methods
	////////////////////////////////////////////////////////////////////

	/**
	 * Converts Hangul to Romaja
	 * 
	 * Options/Parameters:
	 * text      - (String) Source string.
	 * rule      - (String) Romanization rule.
	 *             Possible values: rr|rr-translit|skats
	 * hyphen    - (String) Hyphenate syllables with specified characters.
	 * 
	 * Return:
	 * (String) Romanized string.
	 */
	hangulToLatin: function() { // (text, rule, hyphen)
		
		// Helper functions
		// Check if it's letter or numbers
		var isChoseong = function(char) {
			if(char.charCodeAt(0) >= 0x1100 && char.charCodeAt(0) <= 0x1112) {
				return true;
			}
			else {
				return false;
			}
		};
		
		// Options mapping
		var args = {};
		if(typeof arguments[0] == 'object') {
			args = arguments[0];
		}
		else {
			args.text = arguments[0];
			args.rule = arguments[1];
			args.hyphen = arguments[2];
		}
		
		if(args.hyphen == null) {
			args.hyphen = '';
		}
		
		var rulemap = this.rules.hangul.rr;
		if(args.rule != null && this.rules.hangul[args.rule] != null) {
			rulemap = this.rules.hangul[args.rule];
		}
		else if(args.rule != null) {
			throw 'Invalid rule ' + args.rule;
		}
		
		var rom = '';
		var curr = null, next;
		var skipJaeum = false; // Indicates jaeum of current iteration to be skipped
		for(var i = 0; i <= args.text.length; i++) {
			// If next is hangul syllable, separate it into jamo
			// 0xAC00 is the first hangul syllable in unicode table
			// 0x1100 is the first hangul jaeum in unicode table
			// 0x1161 is the first hangul moeum in unicode table
			// 0x11A8 is the first hangul batchim in unicode table
			nextIdx = args.text.charCodeAt(i) - 0xAC00;
			if(!isNaN(nextIdx) && nextIdx >= 0 && nextIdx <= 11171) {
				next = String.fromCharCode(Math.floor(nextIdx / 588) + 0x1100)
					+ String.fromCharCode(Math.floor(nextIdx % 588 / 28) + 0x1161)
					+ (nextIdx % 28 == 0 ? '' : String.fromCharCode(nextIdx % 28 + 0x11A7)); // Index 0 is reserved for nothing
			}
			else {
				next = args.text.charAt(i);
			}
			
			// Except for first iteration (curr is null), 
			// Curr and next contains 2 or 3 jamo, or 1 non-hangul letter
			if(curr != null) {
				
				var res = '';
				
				// Choseong Jaeum
				if(!skipJaeum) {
					// If not the first syllable, try cho2 if defined
					if(i > 0 && !/\s/.test(args.text.charAt(i-2)) && 
					   rulemap.cho2 != undefined &&
					   rulemap.cho2[curr.charAt(0)] != undefined
					) {
						res += rulemap.cho2[curr.charAt(0)];
					}
					else if(rulemap.cho[curr.charAt(0)] != undefined) {
						res += rulemap.cho[curr.charAt(0)];
					}
					else {
						res += curr.charAt(0);
					}
				}
				skipJaeum = false;
				
				// Jungseong Moeum
				if(curr.length > 1) {
					if(rulemap.jung[curr.charAt(1)] != undefined) {
						res += rulemap.jung[curr.charAt(1)];
					}
					else {
						res += curr.charAt(1);
					}
					
					// Add hyphen if no batchim
					if(curr.length == 2 && isChoseong(next.charAt(0))) {
						res += ' ';
					}
				}
				
				// Jongseong Jaeum (Batchim)
				if(curr.length > 2) {
					// Changing sound with next jaeum + moeum
					if(rulemap.jong[curr.charAt(2) + next.charAt(0) + next.charAt(1)] != undefined) {
						res += rulemap.jong[curr.charAt(2) + next.charAt(0) + next.charAt(1)];
						skipJaeum = true;
						
						// No need to add hyphen here as it's already defined
					}
					// Changing sound with next jaeum
					else if(rulemap.jong[curr.charAt(2) + next.charAt(0)] != undefined) {
						res += rulemap.jong[curr.charAt(2) + next.charAt(0)];
						skipJaeum = true;
						
						// No need to add hyphen here as it's already defined
					}
					// Unchanging sound
					else if(rulemap.jong[curr.charAt(2)] != undefined) {
						res += rulemap.jong[curr.charAt(2)];
						
						// Add hyphen
						if(isChoseong(next.charAt(0))) {
							res += ' ';
						}
					}
					else {
						res += curr.charAt(2);
						
						// Add hyphen
						if(isChoseong(next.charAt(0))) {
							res += ' ';
						}
					}
				}
				
				// Replace hyphen (if this is hangeul word)
				if(curr.length > 1) {
					if(args.hyphen == '' && rulemap.hyphen != null) {
						res = res.replace(' ', rulemap.hyphen);
					}
					else {
						// Soft hyphen
						res = res.replace(' ', args.hyphen);
						// Hard hyphen
						if(args.hyphen != '') {
							res = res.replace('-', args.hyphen);
						}
					}
				}
				rom += res;
			}
			
			curr = next;
		}
		return rom;
	},
	
	////////////////////////////////////////////////////////////////////
	// All-in-one converters
	////////////////////////////////////////////////////////////////////

	/**
	 * Converts Hangul/Hiragana/Katakana to Romaja
	 * 
	 * Conversion is done using default conversion rule for each script.
	 * If you wish to specify which rule to use, use hangulToLatin(), 
	 * hiraganaToLatin(), or katakanaToLatin() function.
	 * 
	 * Options/Parameters:
	 * text      - (String) Source text.
	 * rule      - (String) Romanization rule.
	 * hyphen    - (String) Hyphenate syllables with specified characters.
	 * 
	 * Return:
	 * (String) Romanized string.
	 */
	toLatin: function() { // (text, rule, hyphen)
		return this.hangulToLatin.apply(this, arguments);
	},

	/**
	 * Converts Hangul/Hiragana/Katakana to Romaja
	 * 
	 * This is an alias of toRomaja().
	 */
	romanize: function() { 
		return this.toLatin.apply(this, arguments); 
	},

	/**
	 * Converts Romaji/Hangul/Katakana to Hiragana
	 */
	toHiragana: function(text) {
		//TODO
		throw 'Not implemented';
		return text;
	},

	/**
	 * Converts Romaji/Hangul/Hiragana to Katakana
	 */
	toKatakana: function(text) {
		//TODO
		throw 'Not implemented';
		return text;
	},

	/**
	 * Converts Romaji/Hiragana/Katakana to Hangul
	 */
	toHangul: function(text) {
		//TODO
		throw 'Not implemented';
		return text;
	},

};

////////////////////////////////////////////////////////////////////
// String extensions
////////////////////////////////////////////////////////////////////

if((typeof AROMANIZE_EXTEND_STRING == 'undefined' || AROMANIZE_EXTEND_STRING) &&
   (typeof document == 'undefined' || /\?(.+&)?base(=true)?(&.+)?$/.test(document.currentScript.src) == false)
  ) {
		
	// romanize()
	if(typeof String.prototype.romanize == 'undefined') {
		String.prototype.romanize = function() {
			var args = Array.prototype.slice.call(arguments);
			args.unshift(this.toString());
			return Aromanize.toLatin.apply(Aromanize, args);
		};
	}

}

////////////////////////////////////////////////////////////////////////////////
// Export Node.js module
////////////////////////////////////////////////////////////////////////////////

if(typeof module != 'undefined') {
	module.exports = Aromanize;
}

////////////////////////////////////////////////////////////////////////////////
// Command line interface
////////////////////////////////////////////////////////////////////////////////

if(typeof process != 'undefined' && require.main == module) {
	
	// Capture options
	var script = Aromanize.toLatin;
	var options = {};
	for(var i = 2; i < process.argv.length; i++) {
		// Script
		switch(process.argv[i]) {
			case '-r':
			case '--romanize':
			case '-l':
			case '--latin':
				script = Aromanize.toLatin;
				break;
				
			case '-h':
			case '--hangul':
				script = Aromanize.toHangul;
				break;
				
			case '-i':
			case '--hiragana':
				script = Aromanize.toHiragana;
				break;
				
			case '-k':
			case '--katakana':
				script = Aromanize.toKatakana;
				break;
			case '-c':
			case '--cyrillic':
				script = Aromanize.toLatin;
				options.rule = 'konsevich';
				break;
		}
		
		// Options
		if(process.argv[i][0] == '-') {
			var opt = process.argv[i].split('=');
			switch(opt[0]) {
				default:
					if(opt[0].length > 2) {
						options[opt[0].substr(2)] = opt[1];
					}
			}
		}
		
		// Input
		else {
			options['text'] = process.argv[i];
		}
	}
	
	// If no input provided or --help is triggered, show help
	if(options['text'] == null || options['--help'] != undefined) {
		console.log('\n\
Usage:\n\
  aromanize [TARGET] [OPTIONS] <input>\n\
\n\
Example:\n\
  aromanize -r "안녕하세요?"\n\
\n\
TARGET:\n\
  -r, --romanize,   \n\
  -l, --latin       Converts to Latin script (Romaja).\n\
  -c, --cyrillic    Converts to Cyrillic script.\n\
\n\
OPTIONS:\n\
      --rule=RULE   Use specified transliteration rule.\n\
      --help        Display this help message.\n\
      \n\
RULE:\n\
  rr                Revised Romanization Transcription (default for -r)\n\
  rr-translit       Revised Romanization Transliteration\n\
  skats             SKATS Coding\n\
  ebi               Indonesian Transcription\n\
  konsevich         Konsevich (default for -c)\n\
		');
		process.exit(0);
	}
	
	// Execute script
	//console.log(options);
	console.log(script.call(Aromanize, options));
}