Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] JS. Обратная транслитерация.

Ответить
Настройки темы
[решено] JS. Обратная транслитерация.

Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


кароче делаю для сайта автоперевод с транслита на кирилицу (для чата и форума)
для IE сделал, а для мозилы никак не разрулю
как подменить в event`е keyCode??? и как предыдущую от курсора букву удалить???
чё та я с Range не разрулю никак

Код: Выделить весь код
var a = new Array(1100,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1097,1088,1089,1090,1091,1074,1099,1093,1099,1079);
var A = new Array(1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1065,1056,1057,1058,1059,1042,1067,1061,1067,1047);
var H1 = 'CKSZ';
var h = new Array(1095,1093,1096,1078);
var H = new Array(1063,1061,1064,1046);
var Q1 = '`E';
var q = new Array(1098,1101);
var Q = new Array(1066,1069);
var Y1 = 'AOU';
var y = new Array(1103,1105,1102);
var Y = new Array(1071,1025,1070);
var lastCodes = new Array(0,0,0);

function Transliterate(e) {
	var code = -1;
	if (typeof(e.charCode) != 'undefined') {
		code = e.charCode;
	} else if (typeof(event) != 'undefined') {
		code = event.keyCode;
		e = event;
	}
	if (code < 0) return false;
	if (code == 192) code = 96;
	if (code != 16)
		for (var i = 0; i < 2; i++)
			lastCodes[i] = lastCodes[i + 1];
	lastCodes[2] = code >= 97 && code <= 122 ? code - 32 : code;
	if (lastCodes[2] == 72 && lastCodes[1] == 72 && lastCodes[0] == 83) {
		RemovePrevLetter(e);
		code = code == 72 ? 1065 : 1097;
	} else if (lastCodes[2] == 90 && lastCodes[1] == 67){
		RemovePrevLetter(e);
		code = code == 90 ? 1062 : 1094;
		lastCodes[2] = 0;
	} else if (lastCodes[2] == 72) {
		key = H1.indexOf(String.fromCharCode(lastCodes[1]));
		if (key >= 0) {
			RemovePrevLetter(e);
			code = code == 72 ? H[key] : h[key];
		}
	} else if (lastCodes[2] == 96) {
		key = Q1.indexOf(String.fromCharCode(lastCodes[1]));
		if (key >= 0) {
			RemovePrevLetter(e);
			code = lastCodes[1] == 96 && event.shiftKey ? Q[key] : q[key];
			lastCodes[2] = 0;
		}
	} else if (lastCodes[1] == 89) {
		key = Y1.indexOf(String.fromCharCode(lastCodes[2]));
		if (key >= 0) {
			RemovePrevLetter(e);
			code = code == 89 ? Y[key] : y[key];
		}
	}
	if (code >= 96 && code <= 122) code = a[code - 96];
	else if(code >= 65 && code <= 90) code = A[code - 65];
	if (typeof(event) != 'undefined') event.keyCode = code;
	else return code; // вот тут надо подменить для мозиллы и остальных gecko
}

function RemovePrevLetter(e) {
	if (typeof (document.selection) != 'undefined') {
		var m = document.selection.createRange();
	} else {
// тут надо определиться с m = new Range() для мозиллы
	}
	if (!(m.text > '')) m.moveStart('character', -1);
	if (m.htmlText.substring(0, 1) == '<') return;
	m.deleteContents();
	m.select();
}
вызываю так:
HTML код: Выделить весь код
<textarea id="message" onkeypress="javascript:if(Trans) Transliterate(event);"></textarea>

Trans - это глобальная переменная - транслитерация включена/выключена

повторяю - в ie всё ок

Отправлено: 23:06, 26-01-2007

 

Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


итак, решено
вот код
Код: Выделить весь код
var a = new Array(1100,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1097,1088,1089,1090,1091,1074,1099,1093,1099,1079);
var A = new Array(1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1065,1056,1057,1058,1059,1042,1067,1061,1067,1047);
var H1 = 'CKSZ';
var h = new Array(1095,1093,1096,1078);
var H = new Array(1063,1061,1064,1046);
var Q1 = '`E';
var q = new Array(1098,1101);
var Q = new Array(1066,1069);
var Y1 = 'AOU';
var y = new Array(1103,1105,1102);
var Y = new Array(1071,1025,1070);
var lastCodes = new Array(0,0,0);

function Transliterate(e) {
	var code = -1;
	if (typeof(e.charCode) != 'undefined') {
		code = e.charCode;
	} else if (typeof(event) != 'undefined') {
		code = event.keyCode;
		e = event;
	}
	if (code == 192) code = 96;
	if (code != 16)
		for (var i = 0; i < 2; i++)
			lastCodes[i] = lastCodes[i + 1];
	lastCodes[2] = code >= 97 && code <= 122 ? code - 32 : code;
	if (code <= 0) {
		if (typeof(e.keyCode) != 'undefined') lastCodes[2] = e.keyCode;
		return false;
	}
	if (e.ctrlKey || e.altKey) return false;
	if (lastCodes[2] == 72 && lastCodes[1] == 72 && lastCodes[0] == 83) {
		RemovePrevLetter(e);
		code = code == 72 ? 1065 : 1097;
	} else if (lastCodes[2] == 90 && lastCodes[1] == 67){
		RemovePrevLetter(e);
		code = code == 90 ? 1062 : 1094;
		lastCodes[2] = 0;
	} else if (lastCodes[2] == 72) {
		var key = H1.indexOf(String.fromCharCode(lastCodes[1]));
		if (key >= 0) {
			RemovePrevLetter(e);
			code = code == 72 ? H[key] : h[key];
		}
	} else if (lastCodes[2] == 96) {
		var key = Q1.indexOf(String.fromCharCode(lastCodes[1]));
		if (key >= 0) {
			RemovePrevLetter(e);
			code = lastCodes[1] == 96 && e.shiftKey ? Q[key] : q[key];
			lastCodes[2] = 0;
		}
	} else if (lastCodes[1] == 89) {
		var key = Y1.indexOf(String.fromCharCode(lastCodes[2]));
		if (key >= 0) {
			RemovePrevLetter(e);
			code = code == 89 ? Y[key] : y[key];
		}
	}
	if (code >= 96 && code <= 122) code = a[code - 96];
	else if(code >= 65 && code <= 90) code = A[code - 65];
	if (typeof(event) != 'undefined') event.keyCode = code;
	else {
		if (e.cancelable) e.preventDefault();
		var t = e.target;
		if (typeof (e.target) == 'undefined') return false;
		var elt = e.target;
		var startPos = elt.selectionStart;
		var endPos = elt.selectionEnd;
		elt.value = elt.value.substring(0, startPos) + String.fromCharCode(code) +
			elt.value.substring(endPos, elt.value.length);
		elt.selectionStart = startPos + 1;
		elt.selectionEnd = elt.selectionStart;
	}
}

function RemovePrevLetter(e) {
	if (typeof (document.selection) != 'undefined') {
		var m = document.selection.createRange();
		m.collapse(false);
		m.moveStart('character', -1);
		m.text = '';
		m.select();
	} else {
		if (typeof (e.target) == 'undefined') return false;
		var elt = e.target;
		var startPos = elt.selectionStart;
		var endPos = elt.selectionEnd;
		elt.value = elt.value.substring(0, startPos - 1) +
			elt.value.substring(endPos, elt.value.length);
		elt.selectionStart = startPos;
		elt.selectionEnd = elt.selectionStart;
	}
}

function checkKey(e) {
	var code = -1;
	if (typeof(e.charCode) != 'undefined') {
		code = e.charCode;
		if (code <= 0) {
			if (typeof(e.keyCode) != 'undefined') code = e.keyCode;
		}
	} else if (typeof(event) != 'undefined') {
		code = event.keyCode;
		e = event;
	}
	var navigateCodes = [8, 9, 27, 33, 34, 35, 36, 37, 38, 39, 40, 46];
	for (var i = 0; i < navigateCodes.length; i++) {
		if (code == navigateCodes[i]) {
			lastCodes[2] = code;
			break;
		}
	}
}
вызывается следующим образом:
HTML код: Выделить весь код
<textarea id="message" onkeypress="javascript:if(Trans) Transliterate(event);" onkeydown="javascript:if(Trans) checkKey(event);"></textarea>

onkeydown - это чтоб перехватить клавиши навигации - их onkeypress в эксплорере не перехватывает
с range в файрфоксе так и не разобрался, но этот вариант работает и в эксплорере и в файрфоксе
в опере, правда никак
если таки найдется умелец и сделает (или хотяб подскажет) для оперы, буду только благодарен

Отправлено: 21:00, 27-01-2007 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] JS. Обратная транслитерация.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено




 
Переход