Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1322 → Rev 1323

/mozilla/latrus/trunk/src/chrome/content/latrus.js
0,0 → 1,198
var latRusWorker = null;
var latRusEnabled = false;
 
var LatRus = {
init: function()
{
latRusWorker = new Worker();
 
LatRus.setEnabled(false);
},
 
onKeyPress: function(aEvent)
{
if(!latRusEnabled) return;
if(aEvent.ctrlKey || aEvent.altKey || aEvent.charCode == 0) return true;
if(aEvent.keyCode == 255) return; // our loop event
 
var newEvent = aEvent.target.ownerDocument.createEvent("KeyEvents");
newEvent.initKeyEvent(aEvent.type, aEvent.bubbles, aEvent.cancelable, aEvent.view,
false, false, false, false, 255, latRusWorker.convertCode(aEvent.charCode));
aEvent.preventDefault();
aEvent.originalTarget.dispatchEvent(newEvent);
},
 
toggleEnabled: function()
{
LatRus.setEnabled(!latRusEnabled);
},
 
setEnabled: function(enabled)
{
latRusEnabled = enabled;
LatRus.updateEnabled();
},
 
updateEnabled: function()
{
var item = document.getElementById("context-latrus-enabled");
if(item) {
item.setAttribute("checked", latRusEnabled);
}
 
var panel = document.getElementById("latrus-panel");
if(panel) {
panel.label = (latRusEnabled ? "RUS" : "LAT");
}
},
onMenuPopupShowing: function(menu)
{
if(!gContextMenu) return null;
var textSelected = (LatRus.getSelectedText(gContextMenu.target) != null);
 
var itemToLat = document.getElementById("context-latrus-tolat");
if(itemToLat) {
itemToLat.disabled = !textSelected;
}
 
var itemToRus = document.getElementById("context-latrus-torus");
if(itemToRus) {
itemToRus.disabled = !textSelected;
}
},
 
selectedToLat: function()
{
if(!gContextMenu) return null;
LatRus.convertSelectedText(gContextMenu.target, 'convertStringBackward');
},
 
selectedToRus: function()
{
if(!gContextMenu) return null;
LatRus.convertSelectedText(gContextMenu.target, 'convertStringForward');
},
 
getSelectedText: function(e)
{
if(!e) return null;
if(!e.value) return null;
var start = e.selectionStart;
var end = e.selectionEnd;
if(start < 0 || end < 0 || start >= end) return null;
return e.value.toString().substring(start, end);
},
 
convertSelectedText: function(e, transformation)
{
var selection = LatRus.getSelectedText(e);
if(!selection) return;
 
var res = latRusWorker[transformation].call(latRusWorker, selection);
var start = e.selectionStart;
var end = e.selectionEnd;
var scrollTop = e.scrollTop;
var scrollLeft = e.scrollLeft;
e.value = e.value.substring(0, start) + res + e.value.substring(end);
e.setSelectionRange(start, start + res.length);
 
e.scrollTop = scrollTop;
e.scrollLeft = scrollLeft;
},
 
showOptions: function()
{
alert("latrus options");
},
};
 
/* REGISTER */
if(!latRusWorker && !window.frameElement) {
window.addEventListener('load', LatRus.init, false);
window.addEventListener('keypress', LatRus.onKeyPress, true);
}
 
Worker.engTable = new Array(
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'\"', '\'', '§', '$', '&', '/', '(', ')', '=', '?', '`', '-',
'_', '#', '+', '*', ',', '.', 'ä', 'ö', 'ü', 'ß');
Worker.rusTable1 = new Array(
'а', 'б', 'ц', 'д', 'е', 'ф', 'г', 'х', 'и', 'й', 'к', 'л', 'м',
'н', 'о', 'п', 'ч', 'р', 'с', 'т', 'у', 'в', 'ш', 'ж', 'я', 'з',
'ъ', 'ь', '§', '$', '&', '/', '(', ')', '=', '?', '`', '-',
'_', '#', '+', '*', ',', '.', 'э', 'ы', 'ю', 'щ');
Worker.rusTable2 = new Array(
'ф', 'и', 'с', 'в', 'у', 'а', 'п', 'р', 'ш', 'о', 'л', 'д', 'ь',
'т', 'щ', 'з', 'й', 'к', 'ы', 'е', 'г', 'м', 'ц', 'ч', 'я', 'н',
'\"', '/', 'â„–', ';', ':', '?', '*', '(', ')', '_', '=', '.',
',', '\\', 'ъ', 'Ъ', 'б', 'ю');
 
function Worker()
{
this.convertCodes = new Object();
this.convertChars = new Object();
this.backCodes = new Object();
this.backChars = new Object();
 
Worker.buildConvertTable(Worker.engTable, Worker.rusTable1, true, this.convertCodes, this.convertChars);
Worker.buildConvertTable(Worker.rusTable1, Worker.engTable, true, this.backCodes, this.backChars);
}
 
Worker.buildConvertTable = function(fromTable, toTable, autoUpperCase, resCodes, resChars)
{
for(var i = 0, l = Math.min(fromTable.length, toTable.length); i < l; ++i) {
resCodes[fromTable[i].charCodeAt(0)] = toTable[i].charCodeAt(0);
resChars[fromTable[i].charAt(0)] = toTable[i].charAt(0);
if(autoUpperCase) {
var fromUpper = fromTable[i].toUpperCase()
if(fromUpper != fromTable[i]) {
var toUpper = toTable[i].toUpperCase();
 
resCodes[fromUpper.charCodeAt(0)] = toUpper.charCodeAt(0);
resChars[fromUpper.charAt(0)] = toUpper.charAt(0);
}
}
}
}
 
Worker.prototype.convertCode = function(c)
{
return this.convert(this.convertCodes, c);
}
 
Worker.prototype.convertStringForward = function(s)
{
return this.convertString(this.convertChars, s);
}
 
Worker.prototype.convertStringBackward = function(s)
{
return this.convertString(this.backChars, s);
}
 
Worker.prototype.convertString = function(table, s)
{
var res = "";
for(var i = 0, l = s.length; i < l; ++i) {
res += this.convert(table, s.charAt(i));
}
 
return res;
}
 
Worker.prototype.convert = function(table, c)
{
if(table) {
var r = table[c];
if(r != undefined) return r;
}
 
return c; // not found or no table
}