টীকা: সংরক্ষণ করার পর, পরিবর্তনসমূহ তৎক্ষণাৎ নাও দেখাতে পারে। আপনার ব্রাউজারের ক্যাশ কিভাবে এড়াবেন তা জানতে এখানে ক্লিক করুন।
  • ফায়ারফক্স / সাফারি: 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̐"


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 offs={"Bengali":2432,"Devanagari":2304,"lacking":"\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3\u09b4\u09b5\u09ba\u09bb"+
     "\u09c5\u09c6\u09c9\u09ca\u09cf\u09d1\u09d2\u09d3\u09d4\u09d5\u09d6\u09d8\u09d9\u09da\u09db\u09de\u09e4\u09e5\u09fc\u09fd"+
     "\u09fe\u09ff"};
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":["অ|!","আ|া","ই|ি","ঈ|ী","উ|ু","ঊ|ূ","ঋ|ৃ","ৠ|ৄ","ঌ|ৢ","ৡ|ৣ","","এ|ে","","ঐ|ৈ","","ও|ো","","ঔ|ৌ","ং","ঁ","ঃ","ক্‌","খ্‌","গ্‌","ঘ্‌","ঙ্‌","চ্‌","ছ্‌","জ্‌","ঝ্‌","ঞ্‌","ট্‌","ঠ্‌","ড্‌","ড়্‌","ঢ্‌","ঢ়্‌","ণ্‌","ত্‌","থ্‌","দ্‌","ধ্‌","ন্‌","প্‌","ফ্‌","ব্‌","ভ্‌","ম্‌","য্‌","য়্‌","র্‌","ল্‌","ব্‌","শ্‌","ষ্‌","স্‌","হ্‌","ঽ","ক়্","খ়্","গ়্","জ়্","ফ়্","ক্স","০","১","২","৩","৪","৫","৬","৭","৮","৯",'।']};


// 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);
	
}

/* First try of a indic-to-indic transliterator
Uses unicode ranges of characters whose first .codePointAt is stored into the dictionary offs

Accepts three parameters: 
* string: string to convert
* to: script into which is to be transliterated (default Deganavari)
* from: script from which is to be transliterated  (default Bangali)

Returns transliterated string; only the charachters into the range of language from are tranliterated
*/

function convIndic(ch,to,from) {
    if (from===undefined) from="Bengali";
    if (to===undefined) to="Devanagari";
    var offset=offs[to]-offs[from];
    var tr="";
    var c="";
    $.each(ch.split(""), function(index,value) {
    // first: is value into devanagari range?
    if (value.codePointAt()>=offs[from] && value.codePointAt()<offs[from]+128) {
           c=String.fromCharCode(value.codePointAt()+offset);
           // second: is bengali-transformed into the list of lacking characters?
           if (to==="Bengali" && offs.lacking.indexOf(c)>-1) {
                 c="♦";
           }
           tr+=c;
     } else tr+=value;
    });
    return tr;
}


/* 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();
	});
}