Updated 2014-02-09 18:04:51 by dkf

The manipulation of Sanskrit and Pali texts is problematic because of the relatively complex way in which syllables are built up through a process of stacking. Furthermore, each consonant is considered to possess an inherent 'a' sound which needs to be neutralized if a consonant ends a word. To make matters more complex initial vowels are treated as individual syllables.

The following script will convert IAST romanized Sanskrit/Pali strings and convert them into Devanagri.

# test-IAST-Devanagri.tcl
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

package require Gnocl

#---------------
# Handle word initials and finals
#---------------
#
proc IAST_2_Devanagari:word_start_end {word} {

        set initials_2 {         
                oṁ ॐ
        }
        
        set initials_1 {
                a अ        ā आ        i इ        ī ई
                u उ        ū ऊ        ṝ ऋ        ḷ ऌ                              
                e ए        ai ऐ        o ओ        au औ
                ' ऽ                
                }

        # consonants with virama        
        set finals_2 {
                kh ख्        gh घ्        ch छ्        jh झ्
                ṭh ठ्        ḍh ढ्        th थ्        dh ध्
                ph फ्        bh भ        
                }

        set finals_1 {                
                k क्        g ग्        c च्        j ज्
                ñ ञ्        ṭ ट्        ḍ ड्        ṇ ण्
                t त्        d द्        ṅ ङ्        n न्
                p प्        b ब्        m म्        y य्
                r र्        l ल्        v व्        ś श्        
                ṣ ष्        s स्        h ह्
        }

        # handle syllable of word, potentially a dual character
        set a [string map $initials_2 [string range $word 0 1]]
        set word [string replace $word 0 1 {} ]
        set word "$a$word"

        # remove any verse numbers and puncutation from the word end
        set punc ""
        set b [string first | $word]
        if {$b != "-1"} {
                set punc [string range $word $b end]
                set word [string range $word 0 $b-1]
                }

        # handle syllable of word, potentially a vowel
        set a [string map $initials_1 [string range $word 0 0]]
        set word [string replace $word 0 0 $a ]
        
        # handle last syllable, potential aspirated consonants
        set a [string map $finals_2 [string range $word end-1 end]]
        set word [string replace $word end-1 end $a ]
        
        # unaspirated consonants
        set a [string map $finals_1 [string range $word end end]]
        set word [string replace $word end end $a ]
        
        # reapply verse numbers and punctuation
        return $word$punc        

} 
 
#---------------
# convert IAST string to unicode devanagri
#---------------
#
proc IAST_2_Devanagari {str} {
        
        # ligatures (conjunct consonants) listed in Coulson, 1992. Sanskrit -A Complete Course for Beginners, (pp.23-24).
        set mappings {
                ktry क्र्त्य                ghny घ्न्य                ṅkty ङ्क्त्य्                ṅkṣv ङ्क्ष्व्                ṅkhy ङ्ख्य
                ṅghy ङ्घ्य                ṅghr ङ्घ्र                cchr च्छ्र्                ḍghr ड्घ्र्                ṇḍry ण्ड्र्य
                tsny त्स्न्य                dghr द्घ्र                ddhy द्ध्य                dbhy द्भ्य                dhny ध्न्य
                dhry ध्ग्र्य                ndhr न्ध्र                bbhy ब्भ्य                                

                kkh क्ख                kty क्त्य                ktr क्त्र                ktv क्त्व                kny क्न्य
                kry क्र्य                kvy क्व्य                kṣm क्ष्म                kṣy क्ष्य                kṣv क्ष्व
                khy ख्य                khr ख्र                gry ग्र्य                ghn घ्न                ghm घ्म
                ghy घ्य                ghr घ्र                ṅkt ङ्क्त्                ṅky ङ्क्य्                ṅkṣ ङ्क्स्
                ṅkh ङ्ख                ṅgy ङ्ग्य                ṅgh ङ्घ                cch च्छ                chy छ्य
                chr छ्र्                jjh ज्झ                jñy ज्ञ्य                ñcm ञ्च्म                ñcy ञ्च्य
                ñch ञ्छ                ñjy ञ्य                ṭhy ठ्य                ṭhr ठ्र्                ḍgy ड्ग्य्
                ḍgh ड्घ्                ḍḍh ड्ढ्                ḍhy ड्ह्य्                ḍhr ड्ह्र्                ṇṭh ण्ठ
                ṇḍy ण्ड्य                ṇḍr ण्ड्र्                ṇḍh ण्ध                tkr त्क्र                tty त्त्य
                ttr त्त्र                ttv त्त्व                tth त्थ                tny त्न्य                tpr त्प्र
                tmy त्म्य                try त्र्य                tṣn त्ष्न                thy थ्य                dgr द्ग्र
                dgh द्घ                ddy द्द्य                ddh द्ध                dbh द्भ                dry द्र्य
                dvy द्व्य                dhn ध्न                dhm ध्म                dhy ध्य                dhr ध्र
                dhv ध्व                nty द्त्य                ntr न्त्र                ndr न्द्र                ndh न्ध
                npr न्प्र                pry प्र्य                psv प्स्व                bgh ब्घ                bhn भ्न
                bhy भ्य                bhr भ्र                bhv भ्व                mbh म्भ                ścy श्च्य
                śry श्र्य                śvy श्व्य                ṣṭy ष्ट्य                ṣṭṛ ष्टृ                ṣṭv ष्ट्व
                ṣṭh ष्ठ                ṣṇy ष्ण्य                ṣpr ष्प्र                skh स्ख                sty स्त्य
                str स्त्र                stv स्त्व                sth स्थ                sny स्न्य                sph स्फ
                smy स्म्य                                                                

                dh ध                kk क्क                kc क्च                kṇ क्ण                kt क्त
                kn क्न                km क्म                ky क्य                kr क्र                kl क्ल
                kv क्व                kṣ क्ष                gy ग्य                gr ग्र                ṅk ङ्क्
                ṅg ङ्ग                ṅṅ ङ्ङ्                ṅn ङ्न्                ṅm ङ्म्                ṅy ङ्य
                cc च्च                cñ च्ञ                cm च्म                cy च्य                jj ज्ज
                jñ ज्ञ                jm ज्म                jy ज्य                jr ज्र                jv ज्व
                ñc ञ्च                ñj ञ्ज                ṭt ट्त्                ṭy ट्य                ḍg ड्ग्
                ḍm ड्म                ḍy ड्य                ṇṭ ण्ट्                ṇḍ ण्ड्                ṇṇ ण्ण
                ṇm ण्म                ṇy ण्य                ṇv ण्व                tk त्क                tt त्त
                tn त्न                tp त्प                tm त्म                ty त्य                tr त्र
                tv त्व                ts त्स                dg द्ग                dd द्द                dn द्न
                db द्ब                dm द्म                dy द्य                dr द्र                dv द्व
                nt न्त                nd न्द                nn न्न                np न्प                nm न्म
                ny न्य                nr न्र                ns न्स                pt प्त                pn प्न
                pp प्प                pm प्म                py प्य                pr प्र                pl प्ल
                pv प्व                ps प्स                by ब्य                br ब्र                bv ब्व
                mn म्न                mp म्प                mr म्र                mb म्ब                mm म्म
                my म्य                mr म्र                ml म्ल                mv म्व                yy य्य
                yv य्व                lk ल्क                lp ल्प                lm ल्म                ly ल्य
                ll ल्ल                lv ल्व                lh ल्ह                vn व्न                vy व्य
                vr व्र                vv व्व                śc श्च                śn श्न                śy श्य
                śr श्र                śl श्ल                śv श्व                śś श्श                ṣṭ ष्ट
                ṣṇ ष्ण                ṣp ष्प                ṣm ष्म                ṣy ष्य                ṣv ष्व
                sk स्क                st स्त                sn स्न                sp स्प                sm स्म
                sy स्य                sr स्र                sv स्व                ss स्स                hṇ ह्ण
                hn ह्न                hm ह्म                hy ह्य                hr ह्र                hl ह्ल
                hv ह्व                ai ै                au ौ                kh ख                gh घ
                ch छ                jh झ                ṭh ठ                ḍh ढ                th थ
                ph फ                bh भ                || ॥                                

                a {}                ā ा                i ि                ī ी                u ु
                ū ू                ṛ ृ                e े                o ो                ṃ ँ
                ṁ ं                ḥ ः                k क                g ग                c च
                j ज                ñ ञ                ṭ ट                ḍ ड                ṇ ण
                t त                d द                ṅ ङ                n न                p प
                b ब                m म                y य                r र                l ल
                v व                ś श                ṣ ष                s स                h ह
                0 ०                1 १                2 २                3 ३                4 ४
                5 ५                6 ६                7 ७                8 ८                9 ९
                | ।                
        }

        set str [string tolower $str]

        set result ""
        foreach word $str {
                set a [IAST_2_Devanagari:word_start_end $word] 
                set a  [string map $mappings $a ]
                set result "$result $a"
                }

        return $result
}

#----------------------------------------
#                                 DEMO BLOCK
#----------------------------------------

set str {
kṣipraṁ kṣepraṁ kāmaguṇeṣvatīva carataṁ kriḍāṁ yuvāṁ vindataṁ
mṛtyurnāsti na janma nārtijarase lokaḥ paro nāsti vaḥ|
puṇyāpuṇyaphalaṁ ca karmajanitaṁ nāstyatra hetuḥ kriyā
lābhāya vadatīha śākyatanayo mā śraddhayā gacchatam||10||
}


set txt [gnocl::text -baseFont {Gentium 12} -wrapMode word]
gnocl::window -child $txt -width 450 -height 350

$txt tag create devanagari -font {"Sanskrit 99" 14}

foreach line [split $str \n] {
        $txt insert end [IAST_2_Devanagari $line]\n -tags devanagari
}

$txt insert end $str