Pinyin to ASCII transliteration

by Kai Carver

JavaScript

// Pinyin to Ascii converter
// More generally, can transliterate certain characters into others

// 2 ways:

// 1. from http://stackoverflow.com/questions/286921/javascript-efficiently-replace-all-accented-characters-in-a-string
//āēīōūǖĀĒĪŌŪǕ

function getTransliterator()
{
  return (function() {
    var patternLetters = /[öäüÖÄÜáàâéèêúùûóòôÁÀÂÉÈÊÚÙÛÓÒÔßǐ]/g;
    var lookupLetters = {
      "ä": "a", "ö": "o", "ü": "u",
      "Ä": "A", "Ö": "O", "Ü": "U",
      "á": "a", "à": "a", "â": "a",
      "é": "e", "è": "e", "ê": "e",
      "ú": "u", "ù": "u", "û": "u",
      "ó": "o", "ò": "o", "ô": "o",
      "Á": "A", "À": "A", "Â": "A",
      "É": "E", "È": "E", "Ê": "E",
      "Ú": "U", "Ù": "U", "Û": "U",
      "Ó": "O", "Ò": "O", "Ô": "O",
      "ǐ": "i"
    };
    var letterTranslator = function(match) { 
      return lookupLetters[match] || match;
    }
    return function(text) {
      return text.replace(patternLetters, letterTranslator);
    }
  })();
}

// 2. using JavaScript equivalent of Perl's tr///
// http://blog.versed.se/2008/07/transliterate-in-javascript.html
String.prototype.tr = function(from, to) {  
    var fromChars = from.split("");  
    var toChars = to.split("");  

    var mapTable = {};  

    for(var i = 0; i < fromChars.length; i++) {  
        var c = i < toChars.length ? toChars[i] : "";  
        mapTable[fromChars[i]] = c;  
    }  

    var str = this;  

    var re = new RegExp(fromChars.join("|"), "g");  
    str = str.replace(re, function(c) { 
        return mapTable[c]; 
    });  

    return str;  
};

transliterate = getTransliterator();

// test
function testit(t) {
  //document.write("transliterate(\"" + t + "\") = \"" + transliterate(t) + "\"<br />");
  document.write("" + t + " = " + 
               t.tr("āēīōūǖĀĒĪŌŪǕáéíóúǘÁÉÍÓÚǗǎěǐǒǔǚǍĚǏǑǓǙàèìòùǜÀÈÌÒÙǛüÜ",
                    "aeiouvAEIOUVaeiouvAEIOUVaeiouvAEIOUVaeiouvAEIOUVvV"
                    ) + "<br />");
}

var all_mandarin_syllables = ["ā", "á", "à", "āi",...