টীকা: সংরক্ষণ করার পর, পরিবর্তনসমূহ তৎক্ষণাৎ নাও দেখাতে পারে। আপনার ব্রাউজারের ক্যাশ কিভাবে এড়াবেন তা জানতে এখানে ক্লিক করুন।
  • ফায়ারফক্স / সাফারি: Shift ধরে রাখা অবস্থায়পুনঃলোড করুন-এ ক্লিক করুন, অথবা Ctrl-F5 বা Ctrl-R (ম্যাক-এ ⌘-R) চাপুন
  • গুগল ক্রোম: Ctrl-Shift-R (ম্যাক-এ ⌘-Shift-R) চাপুন
  • ইন্টারনেট এক্সপ্লোরার: Ctrl ধরে রাখা অবস্থায় Refresh-এ ক্লিক করুন, অথবা Ctrl-F5 চাপুন
  • অপেরা: মেনু → ব্যবস্থাপনাসমূহ-এ যান (ম্যাকে অপেরা → পছন্দসমূহ) এবং এরপর গোপনীয়তা ও সুরক্ষা → ব্রাউজিং-এর তথ্য পরিষ্কার করুন → ক্যাশে করা ছবি ও ফাইলগুলি

অন্যান্য ব্রাউজার সম্পর্কে বিশদ নির্দেশাবলীর জন্য, উইকিপিডিয়া:আপনার ক্যাশে বাইপাস করুন দেখুন।

/* version 25.11.2016
table is a dictionary where keys are codes/scripts and values are list from a conversion table at ব্যবহারকারী আলাপ:Alex brollo/লিপ্যন্তর

table.ISO.indexOf("m̐") gives 19
table.Bengali[table.ISO.indexOf("m̐")] gives "ঁ"

It is reversible: 
table.ISO[table.Bengali.indexOf( "ঁ")] gives "m̐"

Indic scripts can be tranliterated one into the other:

table.Bengali[table.Devanagari.indexOf("अ")] gives "অ"

Transliteration keeps three steps:
1. Text is splitted into units (characters or double characters as ri, sh....); resulting list is cloned into lista1;
2. The list resulting from step1 is converted into "rought bengali" replacing roman units with bengali units resultin grom table object; resulting list is cloned into lista2;
3. The list resulting from step2 is browsed and edited for changes needed for vowels merging and conjuncts; resulting list is cloned into lista3; finally the edited bengali list 
   is simply joined by .join(""), and bengali text is got. 

Next step will be, to find and fix exceptions using data lista1, lista2, lista3. 
*/

var table={
"ISO":["a","ā","i","ī","u","ū","r̥","r̥̄","l̥","l̥̄","e","ē","ê","ai","o","ō","ô","au","ṁ","m̐","ḥ","k","kh","g","gh","ṅ","c","ch","j","jh","ñ","ṭ","ṭh","ḍ","ṛ","ḍh","ṛh","ṇ","t","th","d","dh","n","p","ph","b","bh","m","y","ẏ","r","l","v","ś","ṣ","s","h","’","q","k͟h","ġ","z","f","x","0","1","2","3","4","5","6","7","8","9",'.'],
"IAST":["a|A","ā|Ā","i|I","ī|Ī","u|U","ū|Ū","ṛ|Ṛ","ṝ|Ṝ","ḷ|Ḷ","ḹ|Ḹ","","e|E","","ai|Ai","","o|O","","au|Au","ṃ|Ṃ","","ḥ|Ḥ","k|K","kh|Kh","g|G","gh|Gh","ṅ|Ṅ","c|C","ch|Ch","j|J","jh|Jh","ñ|Ñ","ṭ|Ṭ","ṭh|Ṭh","ḍ|Ḍ","","ḍh|Ḍh","","ṇ|Ṇ","t|T","th|Th","d|D","dh|Dh","n|N","p|P","ph|Ph","b|B","bh|Bh","m|M","y|Y","","r|R","l|L","v|V","ś|Ś","ṣ|Ṣ","s|S","h|H","","","","","","","x","0","1","2","3","4","5","6","7","8","9",'.'],
"HK":["a","A","i","I","u","U","R","RR","lR","lRR","","e","","ai","","o","","au","M","","H","k","kh","g","gh","G","c","ch","j","jh","J","T","Th","D","","Dh","","N","t","th","d","dh","n","p","ph","b","bh","m","y","","r","l","v","z","S","s","h","","","","","","","x","0","1","2","3","4","5","6","7","8","9",'.'],
"NLK":["a","ā","i","ī","u","ū","ṛ","","","","","ē","","ai","","ō","","au","ṃ","","ḥ","k","kh","g","gh","ṅ","c","ch","j","jh","ñ","ṭ","ṭh","ḍ","","ḍh","","ṇ","t","th","d","dh","n","p","ph","b","bh","m","ẏ|y","","r","l","v","ś","ṣ","s","h","","","","","","","x","0","1","2","3","4","5","6","7","8","9",'.'],
"ITRANS":["a","aa","i","ii|I","u","uu|U","RRi|R^i","RRI|R^I","LLi|L^i","LLI|L^I","","e","","ai","","o","","au",".m|N",".N","H","k","kh","g","gh","~N","ch","Ch","j","jh","~n","T","Th","D","","Dh","","N","t","th","d","dh","n","p","ph","b","bh","m","y","","r","l","v|w","sh","Sh","s","h",".a","","","","","","x","0","1","2","3","4","5","6","7","8","9",'.'],
"MarkLikhita":["a","á","i","í","u","ú","ri","","","","","e","","ai","","o","","au","","ṇ","","k","kh","g","gh","ṅ","c","ch","j","jh","ñ","ṭ","ṭh","ḍ","ṛ","ḍh","ṛh","n","t","th","d","dh","n","p","ph","b","bh","m","j","y","r","l","v","sh","sh","s","h",'’','q','k͟h','ġ','z','f',"x","0","1","2","3","4","5","6","7","8","9","."],
"Devanagari":["अ|!","आ|ा","इ|ि","ई|ी","उ|ु","ऊ|ू","ऋ|ृ","ॠ|ॄ","ऌ|ॢ","ॡ|ॣ","ऎ|ॆ","ए|े","ऍ|ॅ","ऐ|ै","ऒ|ॊ","ओ|ो","ऑ|ॉ","औ|ौ","ं","ँ","ः","क्","ख्","ग्","घ्","ङ्","च्","छ्","ज्","झ्","ञ्","ट्","ठ्","ड्","ड़्","ढ्","ढ़्","ण्","त्","थ्","द्","ध्","न्","प्","फ्","ब्","भ्","म्","य्","य़्","र्","ल्","व्","श्","ष्","स्","ह्","ऽ","क़्","ख़्","ग़्","ज़्","फ़्","क्स","०","१","२","३","४","५","६","७","८","९",'।'],
"Bengali":["অ|!","আ|া","ই|ি","ঈ|ী","উ|ু","ঊ|ূ","ঋ|ৃ","ৠ|ৄ","ঌ|ৢ","ৡ|ৣ","","এ|ে","","ঐ|ৈ","","ও|ো","","ঔ|ৌ","ং","ঁ","ঃ","ক্‌","খ্‌","গ্‌","ঘ্‌","ঙ্‌","চ্‌","ছ্‌","জ্‌","ঝ্‌","ঞ্‌","ট্‌","ঠ্‌","ড্‌","ড়্‌","ঢ্‌","ঢ়্‌","ণ্‌","ত্‌","থ্‌","দ্‌","ধ্‌","ন্‌","প্‌","ফ্‌","ব্‌","ভ্‌","ম্‌","য্‌","য়্‌","র্‌","ল্‌","ব্‌","শ্‌","ষ্‌","স্‌","হ্‌","ঽ","ক়্","খ়্","গ়্","জ়্","ফ়্","ক্স","০","১","২","৩","৪","৫","৬","৭","৮","৯",'।'],
"Ben":["অ", "!", "আ", "া", "ই", "ি", "ঈ", "ী", "উ", "ু", "ঊ", "ূ", "ঋ", "ৃ", "ৠ", "ৄ", "ঌ", "ৢ", "ৡ", "ৣ", "", "এ", "ে", "", "ঐ", "ৈ", "", "ও", "ো", "", "ঔ", "ৌ", "ং", "ঁ", "ঃ", "ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ট", "ঠ", "ড", "ড", "ঢ", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "প", "ফ", "ব", "ভ", "ম", "য", "য", "র", "ল", "ব", "শ", "ষ", "স", "হ", "ঽ", "ক", "খ", "গ", "জ", "ফ", "ক", "০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "।", "্"],
"Dev":["अ", "!", "आ", "ा", "इ", "ि", "ई", "ी", "उ", "ु", "ऊ", "ू", "ऋ", "ृ", "ॠ", "ॄ", "ऌ", "ॢ", "ॡ", "ॣ", "ऎ", "ॆ", "ए", "े", "ऍ", "ॅ", "ऐ", "ै", "ऒ", "ॊ", "ओ", "ो", "ऑ", "ॉ", "औ", "ौ", "ं", "ँ", "ः", "क", "ख", "ग", "घ", "ङ", "च", "छ", "ज", "झ", "ञ", "ट", "ठ", "ड", "ड", "ढ", "ढ", "ण", "त", "थ", "द", "ध", "न", "प", "फ", "ब", "भ", "म", "य", "य", "र", "ल", "व", "श", "ष", "स", "ह", "ऽ", "क", "ख", "ग", "ज", "फ", "क", "०", "१", "२", "३", "४", "५", "६", "७", "८", "९", "।", "্"]};


// conversion tables for split1()
var doubleVowel=["ri", "ai", "au"];
var doubleVowelC=["α","β","γ"];
var doubleCons=["kh", "gh", "ch", "jh", "th", "bh", "ph", "dh", "sh", "ṭh", "ḍh", "ṛh"];
var doubleConsC=["δ","ε","ζ","η","θ","ι","κ","λ","μ","ν","ξ","ο"];
var lista1,lista2,lista3;
// splits Mark-Likhita text into a list of single, or double, characters, new step 1 of transliteration
function split1(testo) {
	testo=testo.toLocaleLowerCase();
	$.each(doubleVowel, function (index,value) {
		testo=testo.replace(RegExp(value,"g"),doubleVowelC[index]);
	});
	$.each(doubleCons, function (index,value) {
		testo=testo.replace(RegExp(value,"g"),doubleConsC[index]);
	});
	testo=testo.split("");
	var pos,i;
	for (i=0;i<testo.length;i+=1) {
		pos=doubleVowelC.indexOf(testo[i]);
		if (pos!==-1) testo[i]=doubleVowel[pos];
	}
	for (i=0;i<testo.length;i+=1) {
		pos=doubleConsC.indexOf(testo[i]);
		if (pos!==-1) testo[i]=doubleCons[pos];
	}
	lista1=$.extend(true, [], testo);
return testo;
}

function convb(lista) {
	var i;
	for (i=0;i<lista.length;i+=1) {
		
		
		if (table.MarkLikhita.indexOf(lista[i])>-1) {
			lista[i]=table.Bengali[table.MarkLikhita.indexOf(lista[i])];
			if (lista1[i]==="n") lista[i]="ন্‌"; // general rule for n
		}
		if (i>0) {
			if (lista1[i]==="n") lista[i]="ন্‌"; // general rule for n
			if (lista1[i-1]==="k" && lista1[i]==="sh") lista[i]="ষ্‌" ;  //rule 1
			if (lista1[i-1]==="j" && lista1[i]==="n") lista[i]="ঞ্‌" ;  //rule 2
			if (lista1[i-1]==="sh" && lista1[i]==="n")  {               //rule 3
				lista[i-1]="ষ্‌" ;  
				lista[i]="ণ্‌";
			}
			if (lista[i-1].indexOf("্")===1 && lista1[i]==="y") lista[i]="য্‌" ;  // rule 4
			if (lista[i-1].indexOf("|")>-1 && lista1[i]==="ri") lista[i]="রি";  // rule 5
			if (lista1[i-1]==="n" && lista1[i]==="g") {               //rule 6
				lista[i-1]="";
				lista[i]="ঙ্গ্‌";
			}
			if (lista1[i-1]==="ṇ" && lista1[i]==="g") {               //rule 7
				lista[i-1]="ং";
				lista[i]="";
			}
			if (lista1[i-1]==="sh" && (lista1[i]==="k"||lista1[i]==="p"||lista1[i]==="ph"||lista1[i]==="ṭ"||lista1[i]==="ṭh")) lista[i-1]="ষ্‌" ;  //rule 8-12
			// rule 13
			if (lista1[i-1]==="sh" && lista1[i]==="t") {   
				lista[i-1]="ষ্‌";
				lista[i]="ট্‌" ;
				}
			// rule 14
			if (lista1[i-1]==="sh" && lista1[i]==="th") {   
				lista[i-1]="ষ্‌";
				lista[i]="ঠ্‌" ;
				}
			if (lista1[i-1]==="n" && (lista1[i]==="ṭ"||lista1[i]==="ṭh"||lista1[i]==="ḍ"||lista1[i]==="ḍh")) lista[i-1]="ণ্‌" ;  //rule  15-18
			if (lista1[i-1]==="n" && (lista1[i]==="t"||lista1[i]==="th"||lista1[i]==="d"||lista1[i]==="dh")) lista[i-1]="ন্‌";  // rule 19-22
			if (lista1[i-1]==="ri" && lista1[i]==="sh") lista[i]="ষ্‌";   // rule 23
		}	if (lista1[i-1]==="ri" && lista1[i]==="n") lista[i]="ণ্‌";   // rule 24
	}
	lista2=$.extend(true, [], lista);
	return lista;
}	


function mergeb(l) {
	var i;
	var virama="\u09cd";
	var zwnj="\u200c";
	for (i=0;i<l.length;i+=1) {
		// test for a vowel
		if (l[i].split("|").length===2) {
			// it's a vowel; test for first char of a word
			if (i===0 || (i>0 && ! /[\u0995-\u09b9]/.test(l[i-1]) ) ) {			
				l[i]=l[i].split("|")[0];
			} else {
				l[i]=l[i].split("|")[1].replace("!","");
				l[i-1]=l[i-1].replace(virama+zwnj,"");
			}
		// it's not a vowel
		} else {
			// test for a consonant
			if (i>0) l[i-1]=l[i-1].replace(zwnj,"");
			if (i===l.length-1 || (i>0 && ! /[\u0995-\u09b9]/.test(l[i+1]) )) l[i]=l[i].replace(virama+zwnj,"");
		}
		
	}
	lista3=$.extend(true,[],l);
	return l.join("");
}



function testTrans(testo) {
	return mergeb(convb(split1(testo)));
}


function mlbGo() {
	var r= /({{tr\|)([^|]+?)(}})/gi;
	var testo=$("#wpTextbox1").val();
	var lista=testo.match(r);
	var temp,newTr;
	for (i=0;i<lista.length;i+=1) {
		temp= (/({{tr\|)([^|]+?)(}})/g).exec(lista[i]);
		newTr=temp[1]+temp[2]+"|"+mergeb(convb(split1(temp[2])))+temp[3];
		testo=testo.replace(lista[i],newTr);
		console.log(lista[i],newTr);
	}
	$("#wpTextbox1").val(testo);
	
}

/* diacritici */
if ( typeof $ != 'undefined' && typeof $.fn.wikiEditor != 'undefined' ) {
	$( function() {
		$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
			'section': 'advanced',
			'group': 'format',
			'tools': {
				'mlb': {
					label: 'mlb',
					type: 'button',
					icon: '//upload.wikimedia.org/wikipedia/commons/thumb/d/da/Tilde_overlay.svg/20px-Tilde_overlay.svg.png',
					action: {
						type: 'callback',
						execute: mlbGo
					}
				}
			}
		});
	});
}
//$(".tr").click(function() {$(".tr").toggle();});


if ($("#content .tr").length>0) {
	mw.util.addPortletLink(
		'p-tb',
		'javascript:void(0)',
		'ToggleChar',
		't-toggle',
		'Toggle characters Roman - Bengali'
	);
	$("#t-toggle").click(function() {
				$(".tr").toggle();
	});
}