Serbian Latin to Cyrillic (dev)

By Martin Podolak Last update Nov 7, 2010 — Installed 243 times.

There are 1 previous version of this script.

// ==UserScript==
// @name            Serbian Latin to Cyrillic
// @description     Web site conversion of Serbian Latin to Cyrillic
// @source          http://userscripts.org./scripts/show/89948
// @identifier      http://userscripts.org./scripts/source/89948.user.js
// @version         1.0
// @date            2010-11-07
// @author          Martin Podolak
// @namespace       http://podolak.net/translit
// @include         *
// ==/UserScript==


/*
Based on Pridelands.ru - Polsko Rosyjska transliteracja (transkrypcja) + Tłumaczenie menu 0.7 BETA by Nitrol (http://userscripts.org./scripts/show/80413)
*/

var words = {};

String.prototype.prepareRegex = function() {
return this.replace(/([\[\]\^\&\$\.\(\)\?\/\\\+\{\}\|])/g, "\\$1");
};

function isOkTag(tag) {
var ok = true;
var badTags = new Array('pre','blockquote','code','input','button','textarea');
for each(var badTag in badTags) if(tag==badTag) ok=false;
return ok;
}

var regexs=new Array(),
	replacements=new Array();
for(var word in words) {
regexs.push(new RegExp(word.prepareRegex().replace(/\*/g,'[^ ]*'), 'gi'));
replacements.push(words[word]);
}

var texts = document.evaluate("//text()[normalize-space(.)!='']",document,null,6,null), text="";
for(var i=0,l=texts.snapshotLength; (this_text=texts.snapshotItem(i)); i++) {
	if(isOkTag(this_text.parentNode.tagName.toLowerCase()) && (text=this_text.textContent)) {
	for(var x=0; x<regexs.length; x++) text = text.replace(regexs[x], replacements[x]);
	this_text.textContent = text;
	}
}

transliterate_rus1 = true;

transliterate_rus2 = true;

var obstring = 'var transliterations = {';
if(transliterate_rus1 == true)
	{
	obstring +=	'"Dz":"Ѕ", "dz":"ѕ", "Lj":"Љ", "lj":"љ", "Nj":"Њ", "nj":"њ", "Dž":"Џ", "dž":"џ", A:"A", a:"a", B:"Б", b:"б", V:"В", v:"в", G:"Г", g:"г", D:"Д", d:"д", E:"Е", e:"е", Ž:"Ж",'
	+		'z:"з", I:"И", i:"и", I:"І", i:"і", J:"Й", j:"й", J:"Ј", j:"ј", K:"К", k:"к", Ḱ:"Ќ", ḱ:"ќ",'
	+		'L:"Л", l:"л", N:"Н", n:"н", O:"О", o:"о", P:"П", p:"п", R:"Р", r:"р", S:"С", s:"с", T:"Т", t:"т",'
	+		'Ć:"Ћ", ć:"ћ", ž:"ж", Ǵ:"Ѓ", ǵ:"ѓ", Đ:"Ђ", đ:"ђ", Z:"З", M:"М", m:"м", U:"У", u:"у", Ŭ:"Ў", ŭ:"ў",'
	+		'F:"Ф", f:"ф", H:"Х", h:"х", C:"Ц", c:"ц", Č:"Ч", č:"ч", Š:"Ш", š:"ш",';
	}

if(transliterate_rus2 == true)	
	{	
	obstring +=	'Э:"E", э:"e", Ю:"Ju", ю:"ju", Я:"Ja", я:"ja",'
	+		'Ё:"Ë", ё:"ë" ,';
	}

obstring += '};';
eval(obstring);

function defined(v)
	{
	return v != undefined;
	}

function translate(text)
	{
	if(!defined(text) || !text.match) 
		return undefined;
	
//	text = text.replace(/^\s*/, "").replace(/\s*$/, "");

	if(text == "")
		return undefined;

	var translation = "";

	for(var i = 0; i < text.length; i++)
		{
		rus1 = text.charAt(i);

		transliteration = transliterations[rus1];

		if(defined(transliteration))
			translation += transliteration;

		else
			translation += rus1;
		}
	
	return translation;
	}

function translateTree(a)
	{
	var items = document.evaluate("descendant::*", a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	
	for(var i = 0; i < items.snapshotLength; i++)
		{
		var e = items.snapshotItem(i);
		
		for(var j = 0; j < e.childNodes.length; j++)
			{
			var elem = e.childNodes[j];

			if(elem.nodeType == 3)
				{
				var text = translate(elem.wholeText);
				if(defined(text))
					elem.replaceWholeText(text);
				} 

			else
				{
				var text = translate(elem.value);
				if(defined(text))
					elem.value = text;
				}
			}
		}
	}

translateTree(document.body);