Naraguna:Bennylin/trans-batak.js: Béda antara owahan
Konten dihapus Konten ditambahkan
batak |
Tanpa ringkesan besutan |
||
Larik 1: | Larik 1: | ||
/*! |
/*! |
||
* trans |
* trans.js |
||
* https://bennylin.github.com/transliterasi/ |
* https://bennylin.github.com/transliterasi/batak.html |
||
* |
* |
||
* Copyright 2013-2021, Bennylin @bennylin |
* Copyright 2013-2021, Bennylin @bennylin |
||
Larik 9: | Larik 9: | ||
* Versions: |
* Versions: |
||
* 1 April 2021 - v 1.0 |
* 1 April 2021 - v 1.0 |
||
* TODO: bindu |
* TODO: tompi, bindu, u_1bef, -ou simalungun |
||
* |
* |
||
* Derived from my Javanese transliteration: https://jv.wikipedia.org/wiki/Naraguna:Bennylin/trans.js |
* Derived from my Javanese transliteration: https://jv.wikipedia.org/wiki/Naraguna:Bennylin/trans.js |
||
Larik 42: | Larik 42: | ||
function isVowel(a) { |
function isVowel(a) { |
||
var str = "AaEeÈèÉéIiOoUuÊêĚěXxôāīūō"; |
var str = "AaEeÈèÉéIiOoUuÊêĚěXxôāīūō"; |
||
return findstr(str,a); |
|||
} |
|||
function isLCVowel(a) { |
|||
var str = "aeiou"; |
|||
return findstr(str,a); |
return findstr(str,a); |
||
} |
} |
||
Larik 58: | Larik 54: | ||
****************************/ |
****************************/ |
||
function isSpecial(a) { |
function isSpecial(a) { |
||
var str = " |
var str = "GgYyDdBb"; |
||
//untuk bikonsonan nga, nya |
//untuk bikonsonan nga, nya, nda, mba |
||
return findstr(str,a); |
return findstr(str,a); |
||
} |
} |
||
Larik 80: | Larik 76: | ||
str = str.substring(i); |
str = str.substring(i); |
||
} |
} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
//Aksara i (ᯤ) dan u (ᯥ) hanya digunakan untuk suku kata terbuka, misal pada kata dan ina ᯤᯉ dan ulu ᯥᯞᯮ. Untuk suku kata tertutup yang diawali dengan bunyi i atau u, digunakanlah aksara a (ᯀ atau ᯁ) bersama diaktirik untuk masing-masing vokal, misal pada kata indung ᯀᯪᯉ᯲ᯑᯮᯰ dan umpama ᯀᯮᯔ᯲ᯇᯔ |
//Aksara i (ᯤ) dan u (ᯥ) hanya digunakan untuk suku kata terbuka, misal pada kata dan ina ᯤᯉ dan ulu ᯥᯞᯮ. Untuk suku kata tertutup yang diawali dengan bunyi i atau u, digunakanlah aksara a (ᯀ atau ᯁ) bersama diaktirik untuk masing-masing vokal, misal pada kata indung ᯀᯪᯉ᯲ᯑᯮᯰ dan umpama ᯀᯮᯔ᯲ᯇᯔ |
||
//Huruf Latin kapital I dan U menghasilkan aksara-aksara "ina ni surat" ᯤ dan ᯥ, sementara huruf Latin kecil i dan u menghasilkan aksara-aksara "anak ni surat" ᯀᯪ dan ᯀᯮ. |
|||
var matramap1= { //toba, pakpak, mandailing |
|||
"e":'ᯩ', "é":'ᯩ', "i":'ᯪ', "o":'ᯬ', "u":'ᯮ', "x":'ᯧ', |
|||
⚫ | |||
⚫ | |||
var matramap2= { //simalungun |
|||
⚫ | |||
"A":'ᯀ', "E":'ᯀᯩ', "I":'ᯤ', "O":'ᯀᯬ', "U":'ᯥ', "X":'ᯀᯧ' |
|||
} |
|||
var matramap3= { //karo |
|||
"e":'ᯩ', "é":'ᯩ', "i":'ᯫ', "o":'ᯭ', "u":'ᯬ', "x":'ᯧ', |
|||
"A":'ᯀ', "E":'ᯀᯩ', "I":'ᯤ', "O":'ᯀᯭ', "U":'ᯥ', "X":'ᯀᯧ' |
|||
} |
|||
⚫ | |||
var modeTranslit = document.getElementsByName("mode"); |
|||
for(var rad in modeTranslit) { |
|||
if(modeTranslit[rad].checked) |
|||
mode = modeTranslit[rad].value; |
|||
} |
|||
if (mode == "karo") |
|||
matramap = matramap3; |
|||
else if (mode == "simalungun") |
|||
matramap = matramap2; |
|||
else //if (mode == "toba" || mode == "pakpak" || mode == "angkola-mandailing") |
|||
matramap = matramap1; |
|||
if(matramap[str]!==undefined) { |
if(matramap[str]!==undefined) { |
Révisi kala 2 April 2021 14.26
/*!
* trans.js
* https://bennylin.github.com/transliterasi/batak.html
*
* Copyright 2013-2021, Bennylin @bennylin
* Dual licensed under the MIT or GPL Version 2 licenses.
* Released under the MIT, BSD, and GPL Licenses.
*
* Versions:
* 1 April 2021 - v 1.0
* TODO: tompi, bindu, u_1bef, -ou simalungun
*
* Derived from my Javanese transliteration: https://jv.wikipedia.org/wiki/Naraguna:Bennylin/trans.js
*/
var vowelPrev = false;
/***************************
Function SuperTrim, findstr
trim string, menemukan karakter di dalam string
****************************/
function SuperTrim(str) {
str = str || '';
return str.replace(/^\s*|\s*$/g,'').replace(/\s+/g,' ');
}
function findstr(str,tofind) {
for (var i = 0; i < str.length; i++)
if (str[i] == tofind)
return true;
return false;
}
/***************************
Function isDigit, isPunct, isVowel
cek apakah digit, tanda baca, atau huruf vokal (a, e/è/é, i, o, u, ě/ê, ô, ā/ī/ū/ō)
****************************/
function isDigit(a) {
var str = "0123456789";
return findstr(str,a);
}
function isPunct(a) {
var str = ",.><?/+=-_}{[]*&^%$#@!~`\"\\|:;()";
return findstr(str,a);
}
function isVowel(a) {
var str = "AaEeÈèÉéIiOoUuÊêĚěXxôāīūō";
return findstr(str,a);
}
function isConsonant(a) {
var str = "BCDfGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz";
//QXqx are special chars, add engma & enye
return findstr(str,a);
}
/***************************
Function isSpecial, isHR, isLW
cek apakah karakter spesial (bikonsonan)
****************************/
function isSpecial(a) {
var str = "GgYyDdBb";
//untuk bikonsonan nga, nya, nda, mba
return findstr(str,a);
}
/***************************
Function GetMatra
apabila huruf vokal, return matra (sandhangan swara)
****************************/
function GetMatra(str) {
var i = 0;
if (str.length < 1) {
return "";
}
while (str[i] == 'h') {
i++;
if (i >= str.length) {
break;
}
}
if (i < str.length) {
str = str.substring(i);
}
//Aksara i (ᯤ) dan u (ᯥ) hanya digunakan untuk suku kata terbuka, misal pada kata dan ina ᯤᯉ dan ulu ᯥᯞᯮ. Untuk suku kata tertutup yang diawali dengan bunyi i atau u, digunakanlah aksara a (ᯀ atau ᯁ) bersama diaktirik untuk masing-masing vokal, misal pada kata indung ᯀᯪᯉ᯲ᯑᯮᯰ dan umpama ᯀᯮᯔ᯲ᯇᯔ
//Huruf Latin kapital I dan U menghasilkan aksara-aksara "ina ni surat" ᯤ dan ᯥ, sementara huruf Latin kecil i dan u menghasilkan aksara-aksara "anak ni surat" ᯀᯪ dan ᯀᯮ.
var matramap1= { //toba, pakpak, mandailing
"e":'ᯩ', "é":'ᯩ', "i":'ᯪ', "o":'ᯬ', "u":'ᯮ', "x":'ᯧ',
"A":'ᯀ', "E":'ᯀᯩ', "I":'ᯤ', "O":'ᯀᯬ', "U":'ᯥ', "X":'ᯀᯧ'
}
var matramap2= { //simalungun
"e":'ᯩ', "é":'ᯩ', "i":'ᯫ', "o":'ᯬ', "u":'ᯮ', "x":'ᯧ',
"A":'ᯀ', "E":'ᯀᯩ', "I":'ᯤ', "O":'ᯀᯬ', "U":'ᯥ', "X":'ᯀᯧ'
}
var matramap3= { //karo
"e":'ᯩ', "é":'ᯩ', "i":'ᯫ', "o":'ᯭ', "u":'ᯬ', "x":'ᯧ',
"A":'ᯀ', "E":'ᯀᯩ', "I":'ᯤ', "O":'ᯀᯭ', "U":'ᯥ', "X":'ᯀᯧ'
}
var matramap, mode;
var modeTranslit = document.getElementsByName("mode");
for(var rad in modeTranslit) {
if(modeTranslit[rad].checked)
mode = modeTranslit[rad].value;
}
if (mode == "karo")
matramap = matramap3;
else if (mode == "simalungun")
matramap = matramap2;
else //if (mode == "toba" || mode == "pakpak" || mode == "angkola-mandailing")
matramap = matramap1;
if(matramap[str]!==undefined) {
return matramap[str];
}
return "";
}
/***************************
Function GetShift
apabila huruf bikonsonan, return karakter khusus
****************************/
function GetShift(str) {
str = str.toLowerCase();
if (str.indexOf("ng") == 0) {
//suku kata diawali 'ng'
if (str.indexOf("nga") == 0) {
return { "CoreSound": "" + "ᯝ", "len": 3 };
} else if (str.indexOf("nge") == 0) {
return { "CoreSound": "" + "ᯝᯩ", "len": 3 };
} else if (str.indexOf("ngi") == 0) {
return { "CoreSound": "" + "ᯝᯫ", "len": 3 };
} else if (str.indexOf("ngo") == 0) {
return { "CoreSound": "" + "ᯝᯬ", "len": 3 };
} else if (str.indexOf("ngu") == 0) {
return { "CoreSound": "" + "ᯝᯮ", "len": 3 };
} else {
return { "CoreSound": "ᯰ", "len": 2 }; //amisara (sandhangan / cecak)
}
}
//nya
if (str.indexOf("ny") == 0) {
//suku kata diawali 'ny'
return { "CoreSound": "ᯠ", "len": 2 };
} /*
if (str.indexOf("nd") == 0) {
//nd-
return { "CoreSound": "ᯢ", "len": 2 };
} *//*
if (str.indexOf("mb") == 0) {
//mb-
return { "CoreSound": "ᯣ", "len": 2 };
} */
return {
"CoreSound": null, "len": 1
}
;
}
/***************************
Function GetCoreSound
return aksara nglegana
****************************/
function GetCoreSound(str) {
var consonantMap = {
"A":"ᯁ", //A
"B":"ᯅ", //B
"C":"ᯡ", //C
"D":"ᯑ", //D
"E":"ᯀᯩ", //E
"G":"ᯏ", //G
"H":"ᯃ", //H
"I":"ᯤ", //I
"J":"ᯐ", //J
"Z":"ᯐ", //J
"K":"ᯃ", //K
"Q":"ᯃ", //K
"X":"ᯃ", //K
"L":"ᯟ", //L
"M":"ᯕ", //M
"N":"ᯉ", //N
"O":"ᯀᯬ", //O
"P":"ᯈ", //P
"F":"ᯈ", //P
"R":"ᯓ", //R
"S":"ᯙ", //S
"T":"ᯖ", //T
"U":"ᯥ", //U
"V":"ᯌ", //W
"W":"ᯌ", //W
"Y":"ᯜ", //Y
"a":"ᯁ", //A
"b":"ᯅ", //B
"c":"ᯡ", //C
"d":"ᯑ", //D
"e":"ᯀᯩ", //E
"g":"ᯏ", //G
"h":"ᯃ", //H
"i":"ᯀᯪ", //I
"j":"ᯐ", //J
"z":"ᯐ", //J
"k":"ᯃ", //K
"q":"ᯃ", //K
"x":"ᯃ", //K
"l":"ᯟ", //L
"m":"ᯕ", //M
"n":"ᯉ", //N
"o":"ᯀᯬ", //O
"p":"ᯈ", //P
"f":"ᯈ", //P
"r":"ᯓ", //R
"s":"ᯙ", //S
"t":"ᯖ", //T
"u":"ᯀᯮ", //U
"v":"ᯌ", //W
"w":"ᯌ", //W
"y":"ᯜ" //Y
}
var h_shift = GetShift(str);
var core = str;
if (h_shift["CoreSound"] == null) {
if (consonantMap[str.charAt(0)]) core = consonantMap[str.charAt(0)];
return {
"CoreSound": core,
"len": 1
}
;
} else {
return h_shift;
}
}
/***************************
Function ResolveCharacterSound
return tanda baca, digit, vokal, maupun nglegana+pangkon
****************************/
function ResolveCharacterSound(c) {
var str = "" + c;
var len = 0;
if (isDigit(c)) {
return "" + ('' + (c - '0'));
} else if (isConsonant(str[0])) {
return "" + GetCoreSound(str).CoreSound + "᯲"; //virama pangolat
} else {
//if (isVowel(str[0])) {
return "" + GetCoreSound(str).CoreSound;
}
/**/
}
/***************************
Function GetSound
fungsi yang mentransliterasi masing-masing suku kata
****************************/
function GetSound(str) {
var len = 0;
str = SuperTrim(str);
str2 = str.toLowerCase();
if (str == null || str == "") {
return "";
}
if (str.length == 1) {
return ResolveCharacterSound(str[0]);
} else {
var core_sound = GetCoreSound(str);
//return "1"+core_sound.CoreSound+"2";
var matra = "";
var konsonan = "";
if (core_sound.len >= 1) {
matra = GetMatra(str.substring(core_sound.len)); //xeiou (pepet, taling, suku, taling tarung, wulu, dll.)
/*if () {
} else {
}*/
} else {
matra = ""; } //a/å/ɔ
/* rules for some cluster like ngg- that have different behaviour depending if it's the start of a word or not.
TODO: find more elegant solution */
if (str2.indexOf("ngg") == 0) { //ngg-
if (vowelPrev) konsonan = "ᯰᯎ";//<vowel>ngg-, e.g. tunggal
else konsonan = "ᯰᯎ";//<nonvowel>ngg-, i.e. nggambar
//for cluster longer than 4 consonants, such as "ditinggalnggambar",
//need to separate it by a space, "ditinggal nggambar" to be correct
} else if (core_sound.CoreSound == 'ᯱ' && matra == "᯲") { // wignyan
konsonan = "ᯂ"; //ha
} else if (core_sound.CoreSound == 'ᯱ' && matra != "᯲") { // wignyan
konsonan = "ᯂ"; //ha
} else if (core_sound.CoreSound == 'ᯰ' && matra == "᯲") { // cecak
konsonan = "ᯰ"; matra = "";//cecak
} else if (core_sound.CoreSound == 'ᯰ' && matra != "᯲") { // cecak
konsonan = "ᯝ"; //nga
} else {
konsonan = core_sound.CoreSound;
}
return "" + konsonan + matra;
}
}
/***************************
Function DoTransliterate
fungsi utama yang dipanggil (main function)
****************************/
function DoTransliterate(str) {
var i = 0;
var ret = "";
var pi = 0;
var vowelFlag = false;
startVowel = false;
str = SuperTrim(str);
while (i < str.length) {
if (i > 0 && isVowel(str[i]) && isVowel(str[i-1])) { //deal with words that start with multiple vocals
str = str.substring(0, i)+''+str.substring(i, str.length);
}
if ((isSpecial(str[i])) && !vowelFlag) {
//i++;
} else if ((str[i] == 'h' && vowelFlag) || (!isVowel(str[i]) && i > 0) || (str[i] == ' ') || isPunct(str[i]) || isDigit(str[i]) || ((i - pi) > 5)) {
ret += GetSound(str.substring(pi, i));
if (str[i] == ' ') { ret += ' '; }
if (isPunct(str[i])) {
ret += str[i];
pi = i + 1;
} else {
pi = i;
}
vowelFlag = false;
} else if (isVowel(str[i]) && str[i] != 'h') {
//ret += GetSound(str.substring(pi, i));
vowelFlag = true;
}
if (pi > 0 && isVowel(str[pi-1])) {
//<vowel>ngg
vowelPrev = true;
} else vowelPrev = false;
i++;
}
//endwhile
if (pi < i) {
ret += GetSound(str.substring(pi, i));
}
return SuperTrim(ret);
}