 // -*- Coding: utf-8; -*-
//--------------------------------------------------------------------
// Copyright (c) 1999-2002, International Business Machines
// Corporation and others.  All Rights Reserved.
//--------------------------------------------------------------------
// THIS IS A MACHINE-GENERATED FILE
// Tool: dumpicurules.bat
// Source: ../../../impl/data/Transliterator_Latin_Jamo.txt
// Date: Sat Jul 27 10:31:07 2002
//--------------------------------------------------------------------

// Latin_Jamo

t_Latn_Jamo {
  Rule {
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//--------------------------------------------------------------------

//- N.B. DO NOT put any filters, NFD, etc. here -- those are aliased in
//- the INDEX file.  This transliterator is, by itself, not
//- instantiated.  It is used as a part of Latin-Jamo, Latin-Hangul, or
//- inverses thereof.

// Transliteration from Latin characters to Korean script is done in
// two steps: Latin to Jamo, then Jamo to Hangul.  The Jamo-Hangul
// transliteration is done algorithmically following Unicode 3.0
// section 3.11.  This file implements the Latin to Jamo
// transliteration using rules.

// Jamo occupy the block 1100-11FF.  Within this block there are three
// groups of characters: initial consonants or choseong (I), medial
// vowels or jungseong (M), and trailing consonants or jongseong (F).
// Standard Korean syllables are of the form I+M+F*.

// Section 3.11 describes the use of 'filler' jamo to convert
// nonstandard syllables to standard form: the choseong filler 115F and
// the junseong filler 1160.  In this transliterator, we will not use
// 115F or 1160.

// We will, however, insert two 'null' jamo to make foreign words
// conform to Korean syllable structure.  These are the null initial
// consonant 110B (IEUNG) and the null vowel 1173 (EU).  In Latin text,
// we will use the separator in order to disambiguate strings,
// e.g. "kan-ggan" (initial GG) vs. "kanggan" (final NG + initial G).

// We will not use all of the characters in the jamo block.  We will
// only use the 19 initials, 21 medials, and 27 finals possessing a
// jamo short name as defined in section 4.4 of the Unicode book.

// Rules of thumb.  These guidelines provide the basic framework
// for the rules.  They are phrased in terms of Latin-Jamo transliteration.
// The Jamo-Latin rules derive from these, since the Jamo-Latin rules are
// just context-free transliteration of jamo to corresponding short names,
// with the addition of separators to maintain round-trip integrity
// in the context of the Latin-Jamo rules.

// A sequence of vowels:
// - Take the longest sequence you can. If there are too many, or you don't
//   have a starting consonant, introduce a 110B necessary.

// A sequence of consonants.
// - First join the double consonants: G + G -> GG
// - In the remaining list,
// -- If there is no preceding vowel, take the first consonant, and insert EU
//    after it. Continue with the rest of the consonants.
// -- If there is one consonant, attach to the following vowel
// -- If there are two consonants and a following vowel, attach one to the
//    preceeding vowel, and one to the following vowel.
// -- If there are more than two consonants, join the first two together if you
//    can: L + G => LG
// -- If you still end up with more than 2 consonants, insert EU after the
//    first one, and continue with the rest of the consonants.

//----------------------------------------------------------------------
// Variables

// Some latin consonants or consonant pairs only occur as initials, and
// some only as finals, but some occur as both.  This makes some jamo
// consonants ambiguous when transliterated into latin.
//   Initial only: IEUNG BB DD JJ R
//   Final only: BS GS L LB LG LH LM LP LS LT NG NH NJ
//   Initial and Final: B C D G GG H J K M N P S SS T

  "$Gi = \u1100;"
  "$GGi = \u1101;"
  "$Ni = \u1102;"
  "$Di = \u1103;"
  "$DD = \u1104;"
  "$R = \u1105;"
  "$Mi = \u1106;"
  "$Bi = \u1107;"
  "$BB = \u1108;"
  "$Si = \u1109;"
  "$SSi = \u110A;"
  "$IEUNG = \u110B;" // null initial, inserted during Latin-Jamo
  "$Ji = \u110C;"
  "$JJ = \u110D;"
  "$Ci = \u110E;"
  "$Ki = \u110F;"
  "$Ti = \u1110;"
  "$Pi = \u1111;"
  "$Hi = \u1112;"

  "$A = \u1161;"
  "$AE = \u1162;"
  "$YA = \u1163;"
  "$YAE = \u1164;"
  "$EO = \u1165;"
  "$E = \u1166;"
  "$YEO = \u1167;"
  "$YE = \u1168;"
  "$O = \u1169;"
  "$WA = \u116A;"
  "$WAE = \u116B;"
  "$OE = \u116C;"
  "$YO = \u116D;"
  "$U = \u116E;"
  "$WEO = \u116F;"
  "$WE = \u1170;"
  "$WI = \u1171;"
  "$YU = \u1172;"
  "$EU = \u1173;" // null medial, inserted during Latin-Jamo
  "$YI = \u1174;"
  "$I = \u1175;"

  "$Gf = \u11A8;"
  "$GGf = \u11A9;"
  "$GS = \u11AA;"
  "$Nf = \u11AB;"
  "$NJ = \u11AC;"
  "$NH = \u11AD;"
  "$Df = \u11AE;"
  "$L = \u11AF;"
  "$LG = \u11B0;"
  "$LM = \u11B1;"
  "$LB = \u11B2;"
  "$LS = \u11B3;"
  "$LT = \u11B4;"
  "$LP = \u11B5;"
  "$LH = \u11B6;"
  "$Mf = \u11B7;"
  "$Bf = \u11B8;"
  "$BS = \u11B9;"
  "$Sf = \u11BA;"
  "$SSf = \u11BB;"
  "$NG = \u11BC;"
  "$Jf = \u11BD;"
  "$Cf = \u11BE;"
  "$Kf = \u11BF;"
  "$Tf = \u11C0;"
  "$Pf = \u11C1;"
  "$Hf = \u11C2;"
  
  "$jamoInitial = [\u1100-\u1112];"

  "$jamoMedial = [\u1161-\u1175];"

  "$latinInitial = [bcdghjkmnprst];"

  // Any character in the latin transliteration of a medial
  "$latinMedial = [aeiouwy];"

  // The last character of the latin transliteration of a medial
  "$latinMedialEnd = [aeiou];"

  // Disambiguation separator
  "$sep = \\\';"

//----------------------------------------------------------------------
// Jamo-Latin

// Jamo to latin is relatively simple, since it is the latin that is
// ambiguous.  Most rules are straightforward, and we encode them below
// as simple add-on back rule, e.g.:

//   $jamoMedial {bs} > $BS;

// becomes

//   $jamoMedial {bs} <> $BS;

// Furthermore, we don't care about the ordering for Jamo-Latin because
// we are going from single characters, so we can very easily piggyback
// on the Latin-Jamo.

// The main issue with Jamo-Latin is when to insert separators.
// Separators are inserted to obtain correct round trip behavior.  For
// example, the sequence Ki A Gf Gi E, if transliterated to "kagge",
// would then round trip to Ki A GGi E.  To prevent this, we insert a
// separator: "kag-ge".  IMPORTANT: The need for separators depends
// very specifically on the behavior of the Latin-Jamo rules.  A change
// in the Latin-Jamo behavior can completely change the way the
// separator insertion must be done.

// First try to preserve actual separators in the jamo text by doubling
// them.  This fixes problems like:
// (Di)(A)(Ji)(U)(NG)-(IEUNG)(YEO)(Nf)(Gi)(YEO)(L) => dajung-yeongyeol
// => (Di)(A)(Ji)(U)(NG)(IEUNG)(YEO)(Nf)(Gi)(YEO)(L).  This is optional
// -- if we don't care about losing separators in the jamo, we can delete
// this rule.

  "$sep $sep <> $sep;"

// Triple consonants.  For three consonants "axxx" we insert a
// separator between the first and second "x" if XXf, Xf, and Xi all
// exist, and we have A Xf XXi.  This prevents the reverse
// transliteration to A XXf Xi.

  "$sep < $latinMedialEnd g {} $GGi;"
  "$sep < $latinMedialEnd s {} $SSi;"

// For vowels the rule is similar.  If there is a vowel "ae" such that
// "a" by itself and "e" by itself are vowels, then we want to map A E
// to "a-e" so as not to round trip to AE.  However, in the text Ki EO
// IEUNG E we don't need to map to "keo-e".  "keoe" suffices.  For
// vowels of the form "aei", both "ae" + "i" and "a" + "ei" must be
// tested.  NOTE: These rules used to have a left context of
// $latinInitial instead of [^$latinMedial].  The problem with this is
// sequences where an initial IEUNG is transliterated away:
//   (IEUNG)(A)(IEUNG)(EO) => aeo => (IEUNG)(AE)(IEUNG)(O)

  "$sep < [^$latinMedial] [y w] e {} [$O $OE];"
  "$sep < [^$latinMedial] e {} [$O $OE $U];"
  "$sep < [^$latinMedial] [o a] {} [$E $EO $EU];"
  "$sep < [^$latinMedial] [w y] a {} [$E $EO $EU];"

// Similar to the above, but with an intervening $IEUNG.

  "$sep < [^$latinMedial] [y w] e {} $IEUNG [$O $OE];"
  "$sep < [^$latinMedial] e {} $IEUNG [$O $OE $U];"
  "$sep < [^$latinMedial] [o a] {} $IEUNG [$E $EO $EU];"
  "$sep < [^$latinMedial] [w y] a {} $IEUNG [$E $EO $EU];"

// Single finals followed by IEUNG.  The jamo sequence A Xf IEUNG E,
// where Xi also exists, must be transliterated as "ax-e" to prevent
// the round trip conversion to A Xi E.

  "$sep < $latinMedialEnd b {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd c {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd d {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd g {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd h {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd j {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd k {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd m {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd n {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd p {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd s {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd t {} $IEUNG $jamoMedial;"

// Double finals followed by IEUNG.  Similar to the single finals
// followed by IEUNG.  Any latin consonant pair X Y, between medials,
// that we would split by Latin-Jamo, we must handle when it occurs as
// part of A XYf IEUNG E, to prevent round trip conversion to A Xf Yi
// E.

  "$sep < $latinMedialEnd b s {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd g g {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd g s {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l b {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l g {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l h {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l m {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l p {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l s {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd l t {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd n g {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd n h {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd n j {} $IEUNG $jamoMedial;"
  "$sep < $latinMedialEnd s s {} $IEUNG $jamoMedial;"

// Split doubles.  Text of the form A Xi Xf E, where XXi also occurs,
// we transliterate as "ax-xe" to prevent round trip transliteration as
// A XXi E.

  "$sep < $latinMedialEnd b {} $Bi $jamoMedial;"
  "$sep < $latinMedialEnd d {} $Di $jamoMedial;"
  "$sep < $latinMedialEnd j {} $Ji $jamoMedial;"
  "$sep < $latinMedialEnd g {} $Gi $jamoMedial;"
  "$sep < $latinMedialEnd s {} $Si $jamoMedial;"

// XYY.  This corresponds to the XYY rule in Latin-Jamo.  By default
// Latin-Jamo maps "xyy" to Xf YYi, to keep YY together.  As a result,
// "xyy" forms that correspond to XYf Yi must be transliterated as
// "xy-y".

  "$sep < $latinMedialEnd b s {} [$Si $SSi];"
  "$sep < $latinMedialEnd g s {} [$Si $SSi];"
  "$sep < $latinMedialEnd l b {} [$Bi $BB];"
  "$sep < $latinMedialEnd l g {} [$Gi $GGi];"
  "$sep < $latinMedialEnd l s {} [$Si $SSi];"
  "$sep < $latinMedialEnd n g {} [$Gi $GGi];"
  "$sep < $latinMedialEnd n j {} [$Ji $JJ];"

// Deletion of IEUNG is handled below.

//----------------------------------------------------------------------
// Latin-Jamo

// [Basic, context-free Jamo-Latin rules are embedded here too.  See
// above.]

// Split digraphs: Text of the form 'axye', where 'xy' is a final
// digraph, 'x' is a final (by itself), 'y' is an initial, and 'a' and
// 'e' are medials, we want to transliterate this as A Xf Yi E rather
// than A XYf IEUNG E.  We do NOT include text of the form "axxe",
// since that is handled differently below.  These rules are generated
// programmatically from the jamo data.

  "$jamoMedial {b s} $latinMedial > $Bf $Si;"
  "$jamoMedial {g s} $latinMedial > $Gf $Si;"
  "$jamoMedial {l b} $latinMedial > $L $Bi;"
  "$jamoMedial {l g} $latinMedial > $L $Gi;"
  "$jamoMedial {l h} $latinMedial > $L $Hi;"
  "$jamoMedial {l m} $latinMedial > $L $Mi;"
  "$jamoMedial {l p} $latinMedial > $L $Pi;"
  "$jamoMedial {l s} $latinMedial > $L $Si;"
  "$jamoMedial {l t} $latinMedial > $L $Ti;"
  "$jamoMedial {n g} $latinMedial > $Nf $Gi;"
  "$jamoMedial {n h} $latinMedial > $Nf $Hi;"
  "$jamoMedial {n j} $latinMedial > $Nf $Ji;"

// Single consonants are initials: Text of the form 'axe', where 'x'
// can be an initial or a final, and 'a' and 'e' are medials, we want
// to transliterate as A Xi E rather than A Xf IEUNG E.

  "$jamoMedial {b} $latinMedial > $Bi;"
  "$jamoMedial {c} $latinMedial > $Ci;"
  "$jamoMedial {d} $latinMedial > $Di;"
  "$jamoMedial {g} $latinMedial > $Gi;"
  "$jamoMedial {h} $latinMedial > $Hi;"
  "$jamoMedial {j} $latinMedial > $Ji;"
  "$jamoMedial {k} $latinMedial > $Ki;"
  "$jamoMedial {m} $latinMedial > $Mi;"
  "$jamoMedial {n} $latinMedial > $Ni;"
  "$jamoMedial {p} $latinMedial > $Pi;"
  "$jamoMedial {s} $latinMedial > $Si;"
  "$jamoMedial {t} $latinMedial > $Ti;"

// Doubled initials.  The sequence "axxe", where XX exists as an initial
// (XXi), and also Xi and Xf exist (true of all digraphs XX), we want
// to transliterate as A XXi E, rather than split to A Xf Xi E.

  "$jamoMedial {b b} $latinMedial > $BB;"
  "$jamoMedial {d d} $latinMedial > $DD;"
  "$jamoMedial {j j} $latinMedial > $JJ;"
  "$jamoMedial {g g} $latinMedial > $GGi;"
  "$jamoMedial {s s} $latinMedial > $SSi;"

// XYY.  Because doubled consonants bind more strongly than XY
// consonants, we must handle the sequence "axyy" specially.  Here XYf
// and YYi must exist.  In these cases, we map to Xf YYi rather than
// XYf.

  "$jamoMedial {b} s s > $Bf;"
  "$jamoMedial {g} s s > $Gf;"
  "$jamoMedial {l} b b > $L;"
  "$jamoMedial {l} g g > $L;"
  "$jamoMedial {l} s s > $L;"
  "$jamoMedial {n} g g > $Nf;"
  "$jamoMedial {n} j j > $Nf;"

// Finals: Attach consonant with preceding medial to preceding medial.
// Do this BEFORE mapping consonants to initials.  Longer keys must
// precede shorter keys that they start with, e.g., the rule for 'bs'
// must precede 'b'.

// [BASIC Jamo-Latin FINALS handled here.  Order irrelevant within this
// block for Jamo-Latin.]

  "$jamoMedial {bs} <> $BS;"
  "$jamoMedial {b} <> $Bf;"
  "$jamoMedial {c} <> $Cf;"
  "$jamoMedial {d} <> $Df;"
  "$jamoMedial {gg} <> $GGf;"
  "$jamoMedial {gs} <> $GS;"
  "$jamoMedial {g} <> $Gf;"
  "$jamoMedial {h} <> $Hf;"
  "$jamoMedial {j} <> $Jf;"
  "$jamoMedial {k} <> $Kf;"
  "$jamoMedial {lb} <> $LB;  $jamoMedial {lg} <> $LG;"
  "$jamoMedial {lh} <> $LH;"
  "$jamoMedial {lm} <> $LM;"
  "$jamoMedial {lp} <> $LP;"
  "$jamoMedial {ls} <> $LS;"
  "$jamoMedial {lt} <> $LT;"
  "$jamoMedial {l} <> $L;"
  "$jamoMedial {m} <> $Mf;"
  "$jamoMedial {ng} <> $NG;"
  "$jamoMedial {nh} <> $NH;"
  "$jamoMedial {nj} <> $NJ;"
  "$jamoMedial {n} <> $Nf;"
  "$jamoMedial {p} <> $Pf;"
  "$jamoMedial {ss} <> $SSf;"
  "$jamoMedial {s} <> $Sf;"
  "$jamoMedial {t} <> $Tf;"

// Initials: Attach single consonant to following medial.  Do this
// AFTER mapping finals.  Longer keys must precede shorter keys that
// they start with, e.g., the rule for 'gg' must precede 'g'.

// [BASIC Jamo-Latin INITIALS handled here.  Order irrelevant within
// this block for Jamo-Latin.]

  "{gg} $latinMedial <> $GGi;"
  "{g} $latinMedial <> $Gi;"
  "{n} $latinMedial <> $Ni;"
  "{dd} $latinMedial <> $DD;"
  "{d} $latinMedial <> $Di;"
  "{r} $latinMedial <> $R;"
  "{m} $latinMedial <> $Mi;"
  "{bb} $latinMedial <> $BB;"
  "{b} $latinMedial <> $Bi;"
  "{ss} $latinMedial <> $SSi;"
  "{s} $latinMedial <> $Si;"
  "{jj} $latinMedial <> $JJ;"
  "{j} $latinMedial <> $Ji;"
  "{c} $latinMedial <> $Ci;"
  "{k} $latinMedial <> $Ki;"
  "{t} $latinMedial <> $Ti;"
  "{p} $latinMedial <> $Pi;"
  "{h} $latinMedial <> $Hi;"

// 'r' in final position.  Because of the equivalency of the 'l' and
// 'r' jamo (the glyphs are the same), we try to provide the same
// equivalency in Latin-Jamo.  The 'l' to 'r' conversion is handled
// below.  If we see an 'r' in an apparent final position, treat it
// like 'l'.  For example, "karka" => Ki A R EU Ki A without this rule.
// Instead, we want Ki A L Ki A.

  "$jamoMedial {r} $latinInitial > | l;"

// Initial + Final: If we match the next rule, we have initial then
// final consonant with no intervening medial.  We insert the null
// vowel BEFORE it to create a well-formed syllable.  (In the next rule
// we insert a null vowel AFTER an anomalous initial.)

  "$jamoInitial {} [bcdghjklmnpst] > $EU;"

// Initial + X: This block matches an initial consonant not followed by
// a medial.  We insert the null vowel after it.  We handle double
// initials explicitly here; for single initial consonants we insert EU
// (as Latin) after them and let standard rules do the rest.

// BREAKS ROUND TRIP INTEGRITY

  "gg > $GGi $EU;"
  "dd > $DD $EU;"
  "bb > $BB $EU;"
  "ss > $SSi $EU;"
  "jj > $JJ $EU;"

  "([bcdghjkmnprst]) > | $1 eu;"

// X + Final: Finally we have to deal with a consonant that can only be
// interpreted as a final (not an initial) and which is preceded
// neither by an initial nor a medial.  It is the start of the
// syllable, but cannot be.  Most of these will already be handled by
// the above rules.  'bs' splits into Bi EU Sf.  Similar for 'gs' 'ng'
// 'nh' 'nj'.  The only problem is 'l' and digraphs starting with 'l'.
// For this isolated case, we could add a null initial and medial,
// which would give "la" => IEUNG EU L IEUNG A, for example.  A more
// economical solution is to transliterate isolated "l" (that is,
// initial "l") to "r".  (Other similar conversions of consonants that
// occur neither as initials nor as finals are handled below.)

  "l > | r;"

// Medials.  If a medial is preceded by an initial, then we proceed
// normally.  As usual, longer keys must precede shorter ones.

// [BASIC Jamo-Latin MEDIALS handled here.  Order irrelevant within
// this block for Jamo-Latin.]

  "$jamoInitial {ae} <> $AE;"
  "$jamoInitial {a} <> $A;"
  "$jamoInitial {eo} <> $EO;"
  "$jamoInitial {eu} <> $EU;"
  "$jamoInitial {e} <> $E;"
  "$jamoInitial {i} <> $I;"
  "$jamoInitial {oe} <> $OE;"
  "$jamoInitial {o} <> $O;"
  "$jamoInitial {u} <> $U;"
  "$jamoInitial {wae} <> $WAE;"
  "$jamoInitial {wa} <> $WA;"
  "$jamoInitial {weo} <> $WEO;"
  "$jamoInitial {we} <> $WE;"
  "$jamoInitial {wi} <> $WI;"
  "$jamoInitial {yae} <> $YAE;"
  "$jamoInitial {ya} <> $YA;"
  "$jamoInitial {yeo} <> $YEO;"
  "$jamoInitial {ye} <> $YE;"
  "$jamoInitial {yi} <> $YI;"
  "$jamoInitial {yo} <> $YO;"
  "$jamoInitial {yu} <> $YU;"

// We may see an anomalous isolated 'w' or 'y'.  In that case, we
// interpret it as 'wi' and 'yu', respectively.

// BREAKS ROUND TRIP INTEGRITY

  "$jamoInitial {w} > | wi;"
  "$jamoInitial {y} > | yu;"

// Otherwise, insert a null consonant IEUNG before the medial (which is
// still an untransliterated latin vowel).

  "($latinMedial) > $IEUNG | $1;"

// Convert non-jamo latin consonants to equivalents.  These occur as
// neither initials nor finals in jamo.  'l' occurs as a final, but not
// an initial; it is handled above.  The following letters (left hand
// side) will never be output by Jamo-Latin.

  "f > | p;"
  "q > | k;"
  "v > | b;"
  "x > | ks;"
  "z > | s;"

// Delete separators (Latin-Jamo).

  "$sep > ;"

// Delete null consonants (Jamo-Latin).  Do NOT delete null EU vowels,
// since these may also occur in text.

  "< $IEUNG;"

//- N.B. DO NOT put any filters, NFD, etc. here -- those are aliased in
//- the INDEX file.  This transliterator is, by itself, not
//- instantiated.  It is used as a part of Latin-Jamo, Latin-Hangul, or
//- inverses thereof.

// eof
  }
}
