%% code part of frkim
%% v1.2   (fix a bug reported by AppleMintChoco)
%% v1.1   (\AddRule extended, \RenewVowels added)
%% v1.0.2 (\frkhangulfont, \bf)
%% v1.0.1 (\AddRule)
%% v1.0   (\jamoul)
%% 
\char_set_catcode_other:N \@

\clist_const:Nn \c_hgvow_clist { a, e, o, u, y, i, @, * }
\tl_set:Nn \zero_const { x }

\tl_new:N \g_cho_tl
\tl_new:N \g_jun_tl
\tl_new:N \g_jon_tl

\tl_new:N  \l_currtk_tl
\int_new:N \l_cflag_int

%\bool_new:N \opt_zeroisx_bool

\NewDocumentCommand \zeroisx {}
{
	\bool_set_true:N \opt_zeroisx_bool
}

\NewDocumentCommand \zeroisrq {}
{
	\bool_set_false:N \opt_zeroisx_bool
}

\cs_if_exist:NT \rq {
	\let\originalrq\rq
	\cs_undefine:N \rq 
}

\NewDocumentCommand \rq {}
{
	\symbol{"0027}
}

%%% jamoul cmd
\tl_new:N \l_frkjamoulcmd_tl

\tl_set:Nn \frk_space_here { \exp_args:No \use:c { \l_frkjamoulcmd_tl } { \c_space_token } }
\tl_set:Nn \l_frkjamoulcmd_tl {}

\NewDocumentCommand \jamoul { m m }
{
  \group_begin:
	\bool_if:NTF \opt_luatexko_loaded
	{
		\use:c { #1 } { \hg { #2 } }
	}
	{
		\tl_set:Nn \l_frkjamoulcmd_tl { #1 }
		\hg { #2 }
	}
  \group_end:
}

\DeclareDocumentCommand \setpmhangulfont { o m o }
{
	\IfValueTF { #1 }
	{
		\tl_set:Nn \frkhangulfontfeature { #1 }
		\IfValueT { #3 }
		{
			\tl_put_right:Nn \frkhangulfontfeature {  , #3 }
		}
	}
	{
		\IfValueT { #3 }
		{
			\tl_set:Nn \frkhangulfontfeature { #3 }
		}
	}
	
	\tl_set:Nn \frkhangulfont { #2 }
}

\NewDocumentCommand \hg { m }
{	
	\regex_split:nnN { \s } { #1 } \l_tmpa_seq
	
	\seq_map_indexed_inline:Nn \l_tmpa_seq
	{
		\_process_word:n { ##2 }
		
		\int_compare:nT { ##1 < \seq_count:N \l_tmpa_seq }
		{ \frk_space_here } 
	}

}

\cs_new:Npn \_process_word:n #1
{
	\tl_set:Nn \l_aword_tl { #1 }
	\bool_if:NT \opt_zeroisx_bool 
	{
		\regex_replace_all:nnN { ' } { \c{rq} } \l_aword_tl
	}
	\clear_all_var:
	\tl_map_function:NN \l_aword_tl \_main_fn:n
	%%% 마지막에 끝난 조건에 따라
	\int_case:nn { \l_cflag_int }
	{
		{ 1 } 	{%% 모음으로 끝남
					\tl_gput_right:NV \g_jun_tl \l_currtk_tl
					\build_syl:
				}
		{ 3 }	{%% 자음으로 끝남
					\tl_gput_right:NV \g_jon_tl \l_currtk_tl
					\build_syl:
				}
	}
}

\cs_new:Nn \clear_all_var:
{
	\tl_gclear:N \g_cho_tl
	\tl_gclear:N \g_jun_tl
	\tl_gclear:N \g_jon_tl
	
	\tl_clear:N \l_currtk_tl
	
	\int_zero:N \l_cflag_int
}

\tl_new:N \l_delayedtoken_tl

\cs_new:Npn \_main_fn:n #1
{
	\regex_match:nnTF { ['@a-zA-Z\*] } { #1 }
	{
    	\clist_if_in:NnTF \c_hgvow_clist { #1 }
    	{
    		\_proc_vowel:n { #1 }
    	}
    	{
    		\_proc_const:n { #1 }
    	}
	}
	{
		\str_if_eq:nnTF { #1 } { - }
		{
			\_proc_dash:
		}
		{
    		\int_compare:nTF { \l_cflag_int == 0 } 
    		{
    			#1
    		}
    		{
    			\tl_put_right:Nn \l_delayedtoken_tl { #1 }
    		}
		}
	}
}

\cs_new:Npn \_proc_dash:
{
	\int_case:nn { \l_cflag_int }
	{
		{ 0 } { }
		{ 1 } { \tl_gput_right:NV \g_jun_tl \l_currtk_tl \build_syl: }
		{ 3 } { \tl_gput_right:NV \g_jon_tl \l_currtk_tl \build_syl: }
	}
	
	\int_zero:N \l_cflag_int
	\tl_clear:N \l_currtk_tl
}

\cs_new:Npn \_proc_vowel:n #1
{
	\int_case:nn { \l_cflag_int }
	{
		{ 0 }	{%%% 직전이 0이면 초성 확정
					\tl_if_empty:NT \l_currtk_tl  %%% 어두에 모음 => 초성을 'ㅇ'으로
					{
						\tl_set:No \l_currtk_tl { \zero_const }
					}
					
					\tl_gset:NV \g_cho_tl \l_currtk_tl
					\tl_set:Nn \l_currtk_tl { #1 }
					
					\int_set:Nn \l_cflag_int { 1 }
				}
		{ 1 }	{%%% 직전이 모음이면 모음 모음
					\tl_gput_right:NV \g_jun_tl \l_currtk_tl
					\tl_set:Nn \l_currtk_tl { #1 }
					\int_set:Nn \l_cflag_int { 1 }
				}
		{ 3 }	{%%% 직전이 자음이면 직전 토큰은 다음 음절의 초성임
				 %%% 이전 문자를 출력
					\build_syl:
				 %%% 초성 확정
					\tl_gset:NV \g_cho_tl \l_currtk_tl
					\tl_set:Nn \l_currtk_tl { #1 }
					\int_set:Nn \l_cflag_int { 1 }
				}
	}
}

\cs_new:Npn \_proc_const:n #1
{
	\int_case:nn { \l_cflag_int }
	{
		{ 0 }	{%%% 어절의 시작. 초성 생략 규칙이 없으므로 무조건 초성임.
				 %%% 어절의 시작이 아니면?
					\tl_put_right:Nn \l_currtk_tl { #1 }
					\int_set:Nn \l_cflag_int { 0 }
				}
		{ 1 }	{%%% 직전이 모음이면 중성 확정
					\tl_gput_right:NV \g_jun_tl \l_currtk_tl
					\tl_set:Nn \l_currtk_tl { #1 }
					\int_set:Nn \l_cflag_int { 3 }
				}
		{ 3 }	{%%% 직전이 자음이면 종성 모음
					\tl_gput_right:NV \g_jon_tl \l_currtk_tl
					\tl_set:Nn \l_currtk_tl { #1 }
					\int_set:Nn \l_cflag_int { 3 }
				}
	}
}

%%% 
%%%%%%%%% DICTIONARIES
\prop_const_from_keyval:Nn \c_frkcho_prop
{
	g 	= \__prt_symbol_u:n { 1100 },
	G 	= \__prt_symbol_u:n { 1101 },
	n	= \__prt_symbol_u:n { 1102 },
	d	= \__prt_symbol_u:n { 1103 },
	D	= \__prt_symbol_u:n { 1104 },
	r	= \__prt_symbol_u:n { 1105 },
	m	= \__prt_symbol_u:n { 1106 },
	b	= \__prt_symbol_u:n { 1107 },
	B	= \__prt_symbol_u:n { 1108 },
	s	= \__prt_symbol_u:n { 1109 },
	S	= \__prt_symbol_u:n { 110A },
	x	= \__prt_symbol_u:n { 110B },
	q	= \__prt_symbol_u:n { 110B },
	j	= \__prt_symbol_u:n { 110C },
	J	= \__prt_symbol_u:n { 110D },
	c	= \__prt_symbol_u:n { 110E },
	k	= \__prt_symbol_u:n { 110F },
	t	= \__prt_symbol_u:n { 1110 },
	p	= \__prt_symbol_u:n { 1111 },
	h	= \__prt_symbol_u:n { 1112 },
	Q	= \__prt_symbol_u:n { 114C },
	z	= \__prt_symbol_u:n { 1140 },
	X	= \__prt_symbol_u:n { 1159 },
	v	= \__prt_symbol_u:n { 112B },
%%%%
	bs	= \__prt_symbol_u:n { 1121 },
	bd	= \__prt_symbol_u:n { 1120 },
	bs	= \__prt_symbol_u:n { 1121 },
	bsg	= \__prt_symbol_u:n { 1122 },
	bsd	= \__prt_symbol_u:n { 1123 },
	bsj	= \__prt_symbol_u:n { 1126 },
	sg	= \__prt_symbol_u:n { 112D },
	sd	= \__prt_symbol_u:n { 112F },
	sr	= \__prt_symbol_u:n { 1130 },
	sb	= \__prt_symbol_u:n { 1132 },
	sj	= \__prt_symbol_u:n { 1136 },
	sc	= \__prt_symbol_u:n { 1137 },
	sk	= \__prt_symbol_u:n { 1138 },
	st	= \__prt_symbol_u:n { 1139 },
	sp	= \__prt_symbol_u:n { 113A },
%%% fillet
	w 	= \__prt_symbol_u:n { 115F },
}

\prop_const_from_keyval:Nn \c_frkjung_prop
{
	a	= \__prt_symbol_u:n { 1161 },
	ai	= \__prt_symbol_u:n { 1162 },
	ia	= \__prt_symbol_u:n { 1163 },
	iai	= \__prt_symbol_u:n { 1164 },
	e	= \__prt_symbol_u:n { 1165 },
	ei	= \__prt_symbol_u:n { 1166 },
	ie	= \__prt_symbol_u:n { 1167 },
	iei	= \__prt_symbol_u:n { 1168 },
	o	= \__prt_symbol_u:n { 1169 },
	oa	= \__prt_symbol_u:n { 116A },
	oai	= \__prt_symbol_u:n { 116B },
	oi	= \__prt_symbol_u:n { 116C },
	io	= \__prt_symbol_u:n { 116D },
	u	= \__prt_symbol_u:n { 116E },
	ue	= \__prt_symbol_u:n { 116F },
	uei	= \__prt_symbol_u:n { 1170 },
	ui	= \__prt_symbol_u:n { 1171 },
	iu	= \__prt_symbol_u:n { 1172 },
	y	= \__prt_symbol_u:n { 1173 },
	yi	= \__prt_symbol_u:n { 1174 },
	i	= \__prt_symbol_u:n { 1175 },
	@	= \__prt_symbol_u:n { 119E },
	@i	= \__prt_symbol_u:n { 11A1 },
	@@	= \__prt_symbol_u:n { 11A2 },
%%% fillet
	*	= \__prt_symbol_u:n { 1160 },
}

\prop_const_from_keyval:Nn \c_frkjong_prop
{
	g	= \__prt_symbol_u:n { 11A8 },
	G	= \__prt_symbol_u:n { 11A9 },
	gs	= \__prt_symbol_u:n { 11AA },
	n	= \__prt_symbol_u:n { 11AB },
	nj	= \__prt_symbol_u:n { 11AC },
	nh	= \__prt_symbol_u:n { 11AD },
	d	= \__prt_symbol_u:n { 11AE },
	r	= \__prt_symbol_u:n { 11AF },
	rg	= \__prt_symbol_u:n { 11B0 },
	rm	= \__prt_symbol_u:n { 11B1 },
	rb	= \__prt_symbol_u:n { 11B2 },
	rs	= \__prt_symbol_u:n { 11B3 },
	rt	= \__prt_symbol_u:n { 11B4 },
	rp	= \__prt_symbol_u:n { 11B5 },
	rh	= \__prt_symbol_u:n { 11B6 },
	m	= \__prt_symbol_u:n { 11B7 },
	b	= \__prt_symbol_u:n { 11B8 },
	bs	= \__prt_symbol_u:n { 11B9 },
	s	= \__prt_symbol_u:n { 11BA },
	S	= \__prt_symbol_u:n { 11BB },
	q	= \__prt_symbol_u:n { 11BC },
	Q	= \__prt_symbol_u:n { 11F0 },
	j	= \__prt_symbol_u:n { 11BD },
	c	= \__prt_symbol_u:n { 11BE },
	k	= \__prt_symbol_u:n { 11BF },
	t	= \__prt_symbol_u:n { 11C0 },
	p	= \__prt_symbol_u:n { 11C1 },
	h	= \__prt_symbol_u:n { 11C2 },
	v	= \__prt_symbol_u:n { 11E6 },
%%%%%
	rX	= \__prt_symbol_u:n { 11D9 },
	X  	= \__prt_symbol_u:n { 11F9 },
	mg	= \__prt_symbol_u:n { 11DA },
	sg	= \__prt_symbol_u:n { 11E7 },
	sd	= \__prt_symbol_u:n { 11E8 },
	sr	= \__prt_symbol_u:n { 11E9 },
	sb	= \__prt_symbol_u:n { 11EA },
}

\prop_new:N \l_usercho_prop
\prop_new:N \l_userjung_prop
\prop_new:N \l_userjong_prop

\NewDocumentCommand \AddRule { m m }
{
	\clist_set:Nn \l_tmpa_clist { #2 }
	\clist_map_inline:Nn \l_tmpa_clist
	{
		\_split_userrule_keyval:w ##1 \q_stop
		\prop_put:cVx { l_user #1 _prop } \l_tmpkey_tl { \__prt_symbol_u:n {\l_tmpval_tl} }
	}
}

\cs_new:Npn \_split_userrule_keyval:w #1 = #2 \q_stop
{
	\tl_set:Nn \l_tmpkey_tl { #1 }
	\tl_set:Nn \l_tmpval_tl { #2 }
}

\cs_new:Nn \build_syl:
{
  \group_begin:
    \cs_if_exist:NTF \hangulfontspec
  	{
  		\exp_last_unbraced:NNf \hangulfontspec [ \frkhangulfontfeature ] { \frkhangulfont }
  	}
  	{
  		\exp_last_unbraced:NNf \fontspec [ \frkhangulfontfeature ] { \frkhangulfont }
  	}

  	\tl_if_empty:NTF \l_frkjamoulcmd_tl
  	{
  		\build_syl_main:
  	}
  	{
  	  \sys_if_engine_xetex:T { \allowbreak }
  	  \exp_args:No \use:c { \l_frkjamoulcmd_tl } {
  	  	\build_syl_main:
  	  }
  	}
	\group_end:

	\tl_clear:N \l_delayedtoken_tl
}

\cs_new:Nn \build_syl_main:
{
	\bool_if:NF \opt_zeroisx_bool
	{
		\exp_args:Nno
		\regex_replace_all:nnN { ' } { \zero_const } \g_cho_tl
	}
	\tl_if_empty:NF \g_cho_tl
	{
		\prop_get:NVNTF \l_usercho_prop \g_cho_tl \l_tmpone_tl 
			{ \tl_use:N \l_tmpone_tl }
			{
				\prop_get:NVNT \c_frkcho_prop \g_cho_tl \l_tmpone_tl
				{ \tl_use:N \l_tmpone_tl }
			}
	}
	\tl_if_empty:NF \g_jun_tl
	{
		\prop_get:NVNTF \l_userjung_prop \g_jun_tl \l_tmptwo_tl 
			{ \tl_use:N \l_tmptwo_tl }
			{
				\prop_get:NVNT \c_frkjung_prop \g_jun_tl \l_tmptwo_tl
				{ \tl_use:N \l_tmptwo_tl }
			}
	}
	\tl_if_empty:NF \g_jon_tl 
	{
		\prop_get:NVNTF \l_userjong_prop \g_jon_tl \l_tmpthr_tl 
			{ \tl_use:N \l_tmpthr_tl }
			{
				\prop_get:NVNT \c_frkjong_prop \g_jon_tl \l_tmpthr_tl
				{ \tl_use:N \l_tmpthr_tl }
			}
	}

	\tl_gclear:N \g_jun_tl
	\tl_gclear:N \g_jon_tl

	\tl_if_empty:NF \l_delayedtoken_tl
	{
		\l_delayedtoken_tl
	}
}

%%%% \frdash
\NewDocumentCommand \frdash { }
{
	\symbol{"002D}
}

\NewDocumentCommand \frendash {}
{
	--
}

\NewDocumentCommand \fremdash {}
{
	---
}

\prop_const_from_keyval:Nn \my_compjamo_prop
{
	!g	= \__prt_symbol_u:n { 3131 },
	!G	= \__prt_symbol_u:n { 3132 },
	!gs	= \__prt_symbol_u:n { 3133 },
	!n	= \__prt_symbol_u:n { 3134 },
	!nj	= \__prt_symbol_u:n { 3135 },
	!nh	= \__prt_symbol_u:n { 3136 },
	!d	= \__prt_symbol_u:n { 3137 },
	!dd	= \__prt_symbol_u:n { 3138 },
	!r	= \__prt_symbol_u:n { 3139 },
	!rg	= \__prt_symbol_u:n { 313A },
	!rm	= \__prt_symbol_u:n { 313B },
	!rb	= \__prt_symbol_u:n { 313C },
	!rs	= \__prt_symbol_u:n { 313D },
	!rt	= \__prt_symbol_u:n { 313E },
	!rp	= \__prt_symbol_u:n { 313F },
	!rh	= \__prt_symbol_u:n { 3140 },
	!m	= \__prt_symbol_u:n { 3141 },
	!b	= \__prt_symbol_u:n { 3142 },
	!B	= \__prt_symbol_u:n { 3143 },
	!bs	= \__prt_symbol_u:n { 3144 },
	!s	= \__prt_symbol_u:n { 3145 },
	!S	= \__prt_symbol_u:n { 3146 },
	!q	= \__prt_symbol_u:n { 3147 },
	!j	= \__prt_symbol_u:n { 3148 },
	!J	= \__prt_symbol_u:n { 3149 },
	!c	= \__prt_symbol_u:n { 314A },
	!k	= \__prt_symbol_u:n { 314B },
	!t	= \__prt_symbol_u:n { 314C },
	!p	= \__prt_symbol_u:n { 314D },
	!h	= \__prt_symbol_u:n { 314E },
	!a	= \__prt_symbol_u:n { 314F },
	!ai	= \__prt_symbol_u:n { 3150 },
	!ia	= \__prt_symbol_u:n { 3151 },
	!iai	= \__prt_symbol_u:n { 3152 },
	!e	= \__prt_symbol_u:n { 3153 },
	!ei	= \__prt_symbol_u:n { 3154 },
	!ie	= \__prt_symbol_u:n { 3155 },
	!iei	= \__prt_symbol_u:n { 3156 },
	!o	= \__prt_symbol_u:n { 3157 },
	!oa	= \__prt_symbol_u:n { 3158 },
	!oai	= \__prt_symbol_u:n { 3159 },
	!oi	= \__prt_symbol_u:n { 315A },
	!io	= \__prt_symbol_u:n { 315B },
	!u	= \__prt_symbol_u:n { 315C },
	!ue	= \__prt_symbol_u:n { 315E },
	!eui	= \__prt_symbol_u:n { 315E },
	!ui	= \__prt_symbol_u:n { 315F },
	!yi	= \__prt_symbol_u:n { 315F },
	!iu	= \__prt_symbol_u:n { 3160 },
	!y	= \__prt_symbol_u:n { 3161 },
	!yi	= \__prt_symbol_u:n { 3162 },
	!i	= \__prt_symbol_u:n { 3163 },
	!rX	= \__prt_symbol_u:n { 316D },
	!bg	= \__prt_symbol_u:n { 3172 },
	!bsg	= \__prt_symbol_u:n { 3174 },
	!bsd	= \__prt_symbol_u:n { 3175 },
	!v	= \__prt_symbol_u:n { 3178 },
	!sg	= \__prt_symbol_u:n { 317A },
	!sd	= \__prt_symbol_u:n { 317C },
	!sb	= \__prt_symbol_u:n { 317D },
	!sj	= \__prt_symbol_u:n { 317E },
	!z	= \__prt_symbol_u:n { 317F },
	!Q	= \__prt_symbol_u:n { 3181 },
	!hh	= \__prt_symbol_u:n { 3185 },
	!X	= \__prt_symbol_u:n { 3186 },
	!@ 	= \__prt_symbol_u:n { 318D },
	!@i	= \__prt_symbol_u:n { 318E },
}

\NewDocumentCommand \frcc { m }
{
	\space\unskip
	\prop_get:NnNT \my_compjamo_prop {!#1} \l_tmpa_tl
			{ \tl_use:N \l_tmpa_tl }
}

\NewDocumentCommand \activatefrcccmds { }
{
    \clist_set:Nn \l_tmpa_clist { g, G, n, d, D, r, m, b, B, s, S, q, Q, j, J, c, k, t, p, h, z, X, v, a, ai, ia, iai, e, ei, ie, iei, o, oi, io, oa, oai, u, ui, iu, ue, uei, i, y, yi, @}
    \clist_map_inline:Nn \l_tmpa_clist
    {
    	\cs_set:cn { frcc ##1: } { \frcc{##1} }
		\cs_set_eq:cc { frcc ##1 } { frcc ##1: }
    }
}

%%% hangul
\cs_set_eq:NN \endhangul \scan_stop:
\cs_new:Npn \hangul_start:w #1 \endhangul
{ \seq_set_split:Nnn \l_tmpa_seq { \par } { #1 }
  \seq_map_inline:Nn \l_tmpa_seq { \hg{##1} \par } }
\NewDocumentCommand \hangul {}
{ \hangul_start:w }

%%% activatefrcccmds
\bool_if:NT \opt_frcccmds_bool 
{
	\AtBeginDocument { \activatefrcccmds }
}

%%% compatibility 
\cs_set_eq:NN \jamoword \hg

\seq_new:N \l_inputword_seq
\seq_new:N \l_inputpar_seq

\NewDocumentEnvironment { jamotext } { +b }
{
	\seq_set_split:Nnn \l_inputpar_seq { \par } { #1 }
	\seq_map_indexed_function:NN \l_inputpar_seq \jamo_word:nn
}{}

\cs_new:Npn \jamo_word:nn #1 #2
{
%	\jamoword { #2 }
	\seq_set_split:Nnn \l_inparpar_seq { ~ } { #2 }
	
	\seq_map_indexed_inline:Nn \l_inparpar_seq
	{
		\regex_match:nnTF { ^\!\{ } { ##2 }
		{
			\tl_set:Nn \l_tmpa_tl { ##2 }
			\regex_match:nnTF { ^\!\{(.+?)\}$ } { ##2 }
			{
				\regex_replace_once:nnN { ^\!\{(.+?)\}$ } { \1 } \l_tmpa_tl
				\l_tmpa_tl 
			}
			{
				\tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl
				\regex_replace_once:nnN { ^\!\{(.+?)\}(.*)$ } { \1 } \l_tmpa_tl
				\l_tmpa_tl 
				\regex_replace_once:nnN { ^\!\{(.+?)\}(.*)$ } { \2 } \l_tmpb_tl
				\exp_args:No \jamoword { \l_tmpb_tl }
			}	
		}
		{
			\jamoword{ ##2 }
		}
		
		\int_compare:nT { ##1 < \seq_count:N \l_inparpar_seq }
		{ \frk_space_here }
	}

	\int_compare:nT { #1 < \seq_count:N \l_inputpar_seq }
	{ \par }
}

\NewDocumentCommand \RenewVowels { m }
{
	\clist_set:Nn \c_hgvow_clist { @, *, #1 }
}

\NewDocumentCommand \RenewLeadingZero { m }
{
	\tl_set:Nn \zero_const { #1 }
}

\endinput
