04.08.2012, 07:46
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
<script type="text/javascript">
function LatRus(TxtTrans1,a){TxtTrans1=='lat'? TxtTrans1='rus':TxtTrans1='lat';
lat0='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~[].'.split('');
lat='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~'.split('');
lat.push('\\[');lat.push('\\]');lat.push('\\.');
rus=('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
function transF(p){ar1=lat;ar2=rus;if(TxtTrans1=='lat'){ar2=lat0;ar1=rus}for(var i=0; i<ar1.length; i++){trans='/'+ar1[i]+'/gm';p=p.replace(eval(trans), ar2[i])}return p;} return transF(a);
}
var is_chrome = false, chrome_version = false;
if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
is_chrome = true;
}
function getSelectionStart(o) {
if (o.createTextRange) {
// IE, Opera
var r = document.selection.createRange().duplicate();
r.moveEnd('character', o.value.length);
if (r.text == '') {
return o.value.length;
}
return o.value.lastIndexOf(r.text);
} else { if(is_chrome)return o.selectionStart+1;
// FF
return o.selectionStart;
}
return true;
}
function setSelectionStart(o,n) {
if(!document.all)
{
var end = o.value.length;
o.setSelectionRange(n,n);
o.focus();
}
else
{
var r = o.createTextRange();
r.collapse(true);
r.moveStart("character", n);
r.moveEnd("character", 0);
r.select();
}
return true;
}
function correctInTag (tx) {
var Thistext = tx.value;
var CaretPos = getSelectionStart(tx);
var rega = /\[math\]([\s\S]*?)\[\/math\]/gm;
function replacer (str, p1, offset, s) {
var a = '[math]'; var b = '[/math]';
var St = offset + a.length;
var End = offset + str.length - b.length;
if(CaretPos >= St &&CaretPos<=End){
var Sstr = s.substring(St,End)
if(Sstr.indexOf(a)!=-1) return str;
var S = LatRus('rus',Sstr);/*alert(S)*/;
return a+S+b;
} else return str;
}
var str2 = Thistext.replace(rega,replacer)
tx.value = str2;
setSelectionStart(tx,CaretPos);
}
</script>
<textarea oninput="correctInTag (this)" id="abcd" style="width: 300px; height: 100px">
Наберите что-либо на русском внутри
Наберите что-либо
на русском внутри [math].
[/math].
И в этом [math].
[/math]
</textarea>
Можно вставлять даже копированием -осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи
Последний раз редактировалось Deff, 04.08.2012 в 16:25.
|
|
04.08.2012, 09:55
|
|
Профессор
|
|
Регистрация: 22.06.2012
Сообщений: 168
|
|
Deff, спасибо! Буду разбираться.
Сообщение от Deff
|
осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи
|
А разве в Вашем варианте курсор может наехать на теги даже при высокоскоростном наборе?
Вроде бы, с этим нет проблем. Во всяком случае, у меня не получилось наехать на теги.
Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу?
Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?
А что делать с IE?
Он же не вызывает по событию oninput. Но это не очень важно: в случае чего, сделаю костыль для IE из своего варианта и предупрежу пользователей, чтобы сильно не гнали лошадей.
|
|
04.08.2012, 10:15
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Demath
|
Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу?
|
Да
Сообщение от Demath
|
Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?
|
Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?
|
|
04.08.2012, 16:06
|
|
Профессор
|
|
Регистрация: 22.06.2012
Сообщений: 168
|
|
Сообщение от Deff
|
Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?
|
Да, сейчас работает и с разрывами строк внутри тегов. Спасибо!
А скрипт случайно не продублировался?
Вроде, два скрипта с одинаковым количеством строк.
|
|
04.08.2012, 16:26
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Demath
|
А скрипт случайно не продублировался?
|
Да - поправил - наверно не выспался
|
|
04.08.2012, 20:39
|
|
Профессор
|
|
Регистрация: 22.06.2012
Сообщений: 168
|
|
Сообщение от Deff
|
Да - поправил
|
Спасибо. Думал, мало ли что.
Нужно добавить для корректировки ещё три символа: ' :', ' ?', ' /'.
Проверьте, пожалуйста, верно дописал?
lat0 = 'qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL;"ZXCVBNM<>`~[].^&|'.split('');
lat = 'qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL;"ZXCVBNM<>`~'.split('');
lat.push('\\['); lat.push('\\]'); lat.push('\\.');
lat.push('\\^'); lat.push('\\&'); lat.push('\\|');
rus = ('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
rus.push('\:'); rus.push('\\?'); rus.push('\\/');
|
|
04.08.2012, 20:44
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Demath,
Это символы на русской раскладке ?
':', '?', '/'.
И чему они соответствуют на латинице ?
Я не вижу их на буквенной клаве в русской раскладке
|
|
04.08.2012, 21:04
|
|
Профессор
|
|
Регистрация: 22.06.2012
Сообщений: 168
|
|
Сообщение от Deff
|
Это символы на русской раскладке ?
':', '?', '/'.
И чему они соответствуют на латинице ?
Я не вижу их на буквенной клаве в русской раскладке
|
Вы правы: их нет на русской буквенной клаве.
Символы ' :' и ' ?', когда включена русская раскладка, набираются с Shift+6 и Shift+7 соответственно, а символ '/' с помощью Shift + клавиша правее ' ъ'. В моей клаве такое расположение, но и чуть с другим.
|
|
04.08.2012, 21:44
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Demath,
Суть в том - что если вставлять спец символы - будут проблемы при надобности их добавить и в самом деле - экспериментируйте сами
|
|
05.08.2012, 21:03
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
http://habrahabr.ru/post/149083/
Автор сего творения, интересно, зарегистрирован на форуме?
P.S. лучше было бы так ( min).
P.S.S. devote,
Последний раз редактировалось melky, 05.08.2012 в 21:43.
|
|
|
|