def composeHangulJamoToSyllable(L0,V0,T0=None):
    if not ((L0 == None or isUnicodeChar(L0)) and isUnicodeChar(V0) and (T0 == None or isUnicodeChar(T0))):
        raise Exception('Jamo not unicode characters: %s %s %s' % (L0,V0,T0 if T0 != None else str(T0))) 
    if L0 == None:
        L0 = emptyJamo_L                                                
    if isHangulCompatibilityJamo(L0):
        L = hangulCompatibilityJamoToJamo_L(L0)
    else:
        L = L0
    if isHangulCompatibilityJamo(V0):
        V = hangulCompatibilityJamoToJamo_V(V0)
    else:
        V = V0
    if T0 != None:
        if isHangulCompatibilityJamo(T0):
            T = hangulCompatibilityJamoToJamo_T(T0)
        else:
            T = T0
    else:
        T = None # or do we want empty T pseudo Jamo?
    
    LIndex = _hangulJamoToIndex_L(L)
    VIndex = _hangulJamoToIndex_V(V)
    TIndex = _hangulJamoToIndex_T(T)
    
    cpSyll = (LIndex * VCount + VIndex) * TCount + TIndex + SBase
    
    if not isCombinedS(cpSyll):
        raise Exception("Codepoint produced by composition not Hangul syllable: " + codePointToCodePointString(cpSyll))
    
    return codePointToCharacter(cpSyll)    
 def main():
     
     # Write data in py nested tuple format, which needs to be pasted into this file. Function returns None.
     # The file UnicodeData.txt resides in the UCD directory of the Unicode data distribution.  See http://unicode.org/reports/tr44/#UCD_Files
     # Unicode 6 version was used to make data in this file
     
     makeJamoDataFromUnicodeData('UnicodeData.txt',sys.stdout)
     
     # Write templates for transLists - transliterations will be '' and will need to be filled in with actual values
     printTransList_L(sys.stdout)
     printTransList_V(sys.stdout)
     printTransList_T(sys.stdout)
         
     for syllIndex in xrange(0,SCount,256):
         syllCP = SBase + syllIndex
         syll = unichr(syllCP)
         L,V,T = decomposeHangulSyllableToJamo(syll)
         print codePointToCodePointString(syllCP),syll,hangulJamoToTrans(L),hangulJamoToTrans(V),hangulJamoToTrans(T)
 def test_conversions(self):
     for char,expected in ((u'a','U+0061'),('a','U+0061'),(u'ㄱ','U+3131'),(u'가','U+AC00'),(u'㐀','U+3400'),(u'𠀀','U+20000')):
         cp = cu.characterToCodepoint(char) # ord(char)
         self.assertTrue(cu.codePointExists(cp))
         char2 = cu.codePointToCharacter(cp)
         self.assertTrue(cu.isUnicodeChar(char2))
         self.assertEquals(char,char2)
         cpStr = cu.codePointToCodePointString(cp)
         self.assertEquals(cpStr,expected)
         cp2 = cu.codePointStringToCodePoint(cpStr)
         self.assertEquals(cp,cp2)
         char3 = cu.codePointStringToCharacter(cpStr)
         self.assertEquals(char3,char)
def hangulJamoToTrans(jamo):
    if jamo == None: # Assume empty T
        return ''
    if not isUnicodeChar(jamo):
        raise Exception('Not a unicode char: ' + unicode(jamo))
    cp = ord(jamo)
    if isL(cp):
        return jamoTransList_L[cp - LBase]
    elif isV(cp):
        return jamoTransList_V[cp - VBase]    
    elif isT(cp):
        return jamoTransList_T[cp - TBase]
    else:
        raise Exception('Not a Hangul Jamo: ' + codePointToCodePointString(cp) + ' ' +unicode(jamo))
def printTransList_T(out):
    print >> out, '\njamoTransList_T = ['
    for i in xrange(TCount):
        print >> out, '\'\', #',i,codePointToCodePointString(TBase + i),unichr(TBase + i)
    print ']'