#!/usr/bin/env python

import cgi

def pinyin(syl, tone):
    """Returns HTML pinyin for the syllable and tone"""
    pinyin_decimal = {
        "a0": "a", "a1":  "&#257;", "a2":  "&#225;",  "a3":  "&#462;",  "a4":  "&#224;",
        "e0": "e", "e1":  "&#275;", "e2":  "&#233;",  "e3":  "&#283;",  "e4":  "&#232;",
        "i0": "i", "i1":  "&#299;", "i2":  "&#237;",  "i3":  "&#464;",  "i4":  "&#236;",
        "o0": "o", "o1":  "&#333;", "o2":  "&#243;",  "o3":  "&#466;",  "o4":  "&#242;",
        "u0": "u", "u1":  "&#363;", "u2":  "&#250;",  "u3":  "&#468;",  "u4":  "&#249;",
        "v0": "&#252;", "v1":  "&#470;", "v2":  "&#472;",  "v3":  "&#474;",  "v4":  "&#476;"}
    lv = lambda s: s[max(map(lambda v: s.rfind(v), "aeiouv"))] #find last vowel
    
    if "a" in syl or "e" in syl:
        syl = syl.replace("a", pinyin_decimal["a"+tone])
        syl = syl.replace("e", pinyin_decimal["e"+tone])
    elif "ou" in syl:
        syl = syl.replace("o", pinyin_decimal["o"+tone])
    else:
        lastvowel = lv(syl)
        syl = syl.replace(lastvowel, pinyin_decimal[lastvowel+tone])
    if "v" in syl:
        syl = syl.replace("v", "&#252;")
    return syl

def srv_syl(syl):
    """Serves the syllable page (html) containing links to sound files"""
    soundlist = ['a', 'ai', 'an', 'ang', 'ao', 'ba', 'bai', 'ban', 'bang', 'bao', 'bei', 'ben', 'beng', 'bi', 'bian', 'biao', 'bie', 'bin', 'bing', 'bo', 'bu', 'ca', 'cai', 'can', 'cang', 'cao', 'ce', 'ceng', 'cha', 'chai', 'chan', 'chang', 'chao', 'che', 'chen', 'cheng', 'chi', 'chong', 'chou', 'chu', 'chuai', 'chuan', 'chuang', 'chui', 'chun', 'chuo', 'ci', 'cong', 'cou', 'cu', 'cuan', 'cui', 'cun', 'cuo', 'da', 'dai', 'dan', 'dang', 'dao', 'de', 'dei', 'deng', 'di', 'dian', 'diao', 'die', 'ding', 'diu', 'dong', 'dou', 'du', 'duan', 'dui', 'dun', 'duo', 'e', 'ee', 'ei', 'en', 'er', 'fa', 'fan', 'fang', 'fei', 'fen', 'feng', 'fo', 'fou', 'fu', 'ga', 'gai', 'gan', 'gang', 'gao', 'ge', 'gei', 'gen', 'geng', 'gong', 'gou', 'gu', 'gua', 'guai', 'guan', 'guang', 'gui', 'gun', 'guo', 'ha', 'hai', 'han', 'hang', 'hao', 'he', 'hei', 'hen', 'heng', 'hong', 'hou', 'hu', 'hua', 'huai', 'huan', 'huang', 'hui', 'hun', 'huo', 'ji', 'jia', 'jian', 'jiang', 'jiao', 'jie', 'jin', 'jing', 'jiong', 'jiu', 'ju', 'juan', 'jue', 'jun', 'ka', 'kai', 'kan', 'kang', 'kao', 'ke', 'ken', 'keng', 'kong', 'kou', 'ku', 'kua', 'kuai', 'kuan', 'kuang', 'kui', 'kun', 'kuo', 'la', 'lai', 'lan', 'lang', 'lao', 'le', 'lei', 'leng', 'li', 'lian', 'liang', 'liao', 'lie', 'lin', 'ling', 'liu', 'long', 'lou', 'lu', 'luan', 'lun', 'luo', 'lv', 'lve', 'ma', 'mai', 'man', 'mang', 'mao', 'mei', 'men', 'meng', 'mi', 'mian', 'miao', 'mie', 'min', 'ming', 'miu', 'mo', 'mou', 'mu', 'na', 'nai', 'nan', 'nang', 'nao', 'ne', 'nei', 'nen', 'neng', 'ni', 'nian', 'niao', 'nie', 'nin', 'ning', 'niu', 'nong', 'nou', 'nu', 'nuan', 'nuo', 'nv', 'nve', 'pa', 'pai', 'pan', 'pang', 'pao', 'pei', 'pen', 'peng', 'pi', 'pian', 'piao', 'pie', 'pin', 'ping', 'po', 'pou', 'pu', 'qi', 'qia', 'qian', 'qiang', 'qiao', 'qie', 'qin', 'qing', 'qiong', 'qiu', 'qu', 'quan', 'que', 'qun', 'ran', 'rao', 'ren', 'reng', 'rong', 'rou', 'ru', 'ruan', 'rui', 'run', 'ruo', 'sa', 'sai', 'san', 'sang', 'sao', 'se', 'sen', 'seng', 'sha', 'shai', 'shan', 'shang', 'shao', 'she', 'shei', 'shen', 'sheng', 'shi', 'shou', 'shu', 'shua', 'shuai', 'shuan', 'shuang', 'shui', 'shun', 'shuo', 'si', 'song', 'sou', 'su', 'suan', 'sui', 'sun', 'suo', 'ta', 'tai', 'tan', 'tang', 'tao', 'te', 'teng', 'ti', 'tian', 'tiao', 'tie', 'ting', 'tong', 'tou', 'tu', 'tuan', 'tui', 'tun', 'tuo', 'wa', 'wai', 'wan', 'wang', 'wei', 'wen', 'weng', 'wo', 'wu', 'xi', 'xia', 'xian', 'xiang', 'xiao', 'xie', 'xin', 'xing', 'xiong', 'xiu', 'xu', 'xuan', 'xue', 'xun', 'ya', 'yan', 'yang', 'yao', 'ye', 'yi', 'yin', 'ying', 'yong', 'you', 'yu', 'yuan', 'yue', 'yun', 'za', 'zai', 'zan', 'zang', 'zao', 'ze', 'zei', 'zen', 'zeng', 'zha', 'zhai', 'zhan', 'zhang', 'zhao', 'zhe', 'zhei', 'zhen', 'zheng', 'zhi', 'zhong', 'zhou', 'zhu', 'zhua', 'zhuai', 'zhuan', 'zhuang', 'zhui', 'zhun', 'zhuo', 'zi', 'zong', 'zou', 'zu', 'zuan', 'zun', 'zuo']
    syllablelist = ['ba', 'bo', 'bai', 'bei', 'bao', 'ban', 'ben', 'bang', 'beng', 'bi', 'bie', 'biao', 'bian', 'bin', 'bing', 'bu', 'pa', 'po', 'pai', 'pei', 'pao', 'pou', 'pan', 'pen', 'pang', 'peng', 'pi', 'pie', 'piao', 'pian', 'pin', 'ping', 'pu', 'ma', 'mo', 'me', 'mai', 'mei', 'mao', 'mou', 'man', 'men', 'mang', 'meng', 'mi', 'mie', 'miao', 'miu', 'mian', 'min', 'ming', 'mu', 'fa', 'fo', 'fei', 'fou', 'fan', 'fen', 'fang', 'feng', 'fu', 'da', 'de', 'dai', 'dei', 'dao', 'dou', 'dan', 'den', 'dang', 'deng', 'di', 'die', 'diao', 'diu', 'dian', 'diang', 'ding', 'du', 'duo', 'dui', 'duan', 'dun', 'dong', 'ta', 'te', 'tai', 'tao', 'tou', 'tan', 'tang', 'teng', 'ti', 'tie', 'tiao', 'tian', 'ting', 'tu', 'tuo', 'tui', 'tuan', 'tun', 'tong', 'na', 'ne', 'nai', 'nei', 'nao', 'nou', 'nan', 'nen', 'nang', 'neng', 'ni', 'nia', 'nie', 'niao', 'niu', 'nian', 'nin', 'niang', 'ning', 'nu', 'nuo', 'nuan', 'nun', 'nong', 'nv', 'nve', 'la', 'lo', 'le', 'lai', 'lei', 'lao', 'lou', 'lan', 'lang', 'leng', 'li', 'lia', 'lie', 'liao', 'liu', 'lian', 'lin', 'liang', 'ling', 'lu', 'luo', 'luan', 'lun', 'long', 'lv', 'lve', 'lvn', 'ga', 'ge', 'gai', 'gei', 'gao', 'gou', 'gan', 'gen', 'gang', 'geng', 'gu', 'gua', 'guo', 'guai', 'gui', 'guan', 'gun', 'guang', 'gong', 'ka', 'ke', 'kai', 'kao', 'kou', 'kan', 'ken', 'kang', 'keng', 'ku', 'kua', 'kuo', 'kuai', 'kui', 'kuan', 'kun', 'kuang', 'kong', 'ha', 'he', 'hai', 'hei', 'hao', 'hou', 'han', 'hen', 'hang', 'heng', 'hu', 'hua', 'huo', 'huai', 'hui', 'huan', 'hun', 'huang', 'hong', 'ji', 'jia', 'jie', 'jiao', 'jiu', 'jian', 'jin', 'jiang', 'jing', 'ju', 'jue', 'juan', 'jun', 'jiong', 'qi', 'qia', 'qie', 'qiao', 'qiu', 'qian', 'qin', 'qiang', 'qing', 'qu', 'que', 'quan', 'qun', 'qiong', 'xi', 'xia', 'xie', 'xiao', 'xiu', 'xian', 'xin', 'xiang', 'xing', 'xu', 'xue', 'xuan', 'xun', 'xiong', 'zhi', 'zha', 'zhe', 'zhai', 'zhei', 'zhao', 'zhou', 'zhan', 'zhen', 'zhang', 'zheng', 'zhu', 'zhua', 'zhuo', 'zhuai', 'zhui', 'zhuan', 'zhun', 'zhuang', 'zhong', 'chi', 'cha', 'che', 'chai', 'chao', 'chou', 'chan', 'chen', 'chang', 'cheng', 'chu', 'chua', 'chuo', 'chuai', 'chui', 'chuan', 'chun', 'chuang', 'chong', 'shi', 'sha', 'she', 'shai', 'shei', 'shao', 'shou', 'shan', 'shen', 'shang', 'sheng', 'shu', 'shua', 'shuo', 'shuai', 'shui', 'shuan', 'shun', 'shuang', 'shong', 'ri', 're', 'rao', 'rou', 'ran', 'ren', 'rang', 'reng', 'ru', 'ruo', 'rui', 'ruan', 'run', 'rong', 'zi', 'za', 'ze', 'zai', 'zei', 'zao', 'zou', 'zan', 'zen', 'zang', 'zeng', 'zu', 'zuo', 'zui', 'zuan', 'zun', 'zong', 'ci', 'ca', 'ce', 'cai', 'cao', 'cou', 'can', 'cen', 'cang', 'ceng', 'cu', 'cuo', 'cui', 'cuan', 'cun', 'cong', 'si', 'sa', 'se', 'sai', 'sei', 'sao', 'sou', 'san', 'sen', 'sang', 'seng', 'su', 'suo', 'sui', 'suan', 'sun', 'song', 'a', 'e', 'ai', 'ei', 'ao', 'ou', 'an', 'en', 'ang', 'er', 'yi', 'ya', 'ye', 'yao', 'you', 'yan', 'yin', 'yang', 'ying', 'wu', 'wa', 'wo', 'wai', 'wei', 'wan', 'wen', 'wang', 'weng', 'yu', 'yue', 'yuan', 'yun', 'yong', 'yong']
    nobpmf = ["a", "ai", "an", "ang", "ao", "e", "ee", "ei", "en", "er", "wa", "wai", "wan", "wang", "wei", "wen", "wo", "wu", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan", "yue", "yun"]

    if syl not in syllablelist:
        output = "<p>Sorry, we do not recognize this syllable.</p>"
    elif syl not in soundlist:
        output = "<p>Sorry, no sound is available for this syllable.</p>"
    elif syl in nobpmf:
        output = """
        <table width="100%%">
           <tr>
              <td width="20%%">%s</td>
              <td width="20%%"><a target="sound" href="sounds/%s1.wav">%s</a></td>
              <td width="20%%"><a target="sound" href="sounds/%s2.wav">%s</a></td>
              <td width="20%%"><a target="sound" href="sounds/%s3.wav">%s</a></td>
              <td width="20%%"><a target="sound" href="sounds/%s4.wav">%s</a></td>
           </tr>
        </table>
        """ % (pinyin(syl, "0"), syl, pinyin(syl,"1"), syl, pinyin(syl,"2"), syl, pinyin(syl,"3"), syl, pinyin(syl,"4"))
    else:
        output = """
        <table width="100%%">
           <tr>
              <td width="20%%"><a target="sound" href="sounds/%s_bpmf.wav">%s</a><br><div style="font-size: 35%%">(BPMF spelling)</div></td>
              <td width="20%%"><a target="sound" href="sounds/%s1.wav">%s</a></td>
              <td width="20%%"><a target="sound" href="sounds/%s2.wav">%s</a></td>
              <td width="20%%"><a target="sound" href="sounds/%s3.wav">%s</a></td>
              <td width="20%%"><a target="sound" href="sounds/%s4.wav">%s</a></td>
           </tr>
        </table>
        """ % (syl, pinyin(syl, "0"), syl, pinyin(syl,"1"), syl, pinyin(syl,"2"), syl, pinyin(syl,"3"), syl, pinyin(syl,"4"))
    return """
<html>
<head>
<title>Chinese Phonetics: %s</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<style type="text/css">
   body {margin-left: 0; margin-right: 0; margin-left: 0; margin-top:0;}
   td {font: 175%% "Times New Roman", serif; text-align:center; background: #eee;}
</style>
</head>
<body>
%s

</body>
</html>""" % (syl, output)

if __name__ == "__main__":
    syls = []
    with open("index.html") as f:
        for line in f:
            if "syllable_" in line:
                syls.append(line.split("syllable_")[1].split('.')[0])
    for syl in syls:
        print syl,
        with open("syllable_{}.html".format(syl), "w") as f:
            f.write(srv_syl(syl))
        print "done"
