Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как исправить раскладку клавиатуры в заданной области textarea (https://javascript.ru/forum/dom-window/30215-kak-ispravit-raskladku-klaviatury-v-zadannojj-oblasti-textarea.html)

Demath 27.07.2012 23:31

Исправление раскладки клавиатуры в заданной области textarea
 
Подскажите, пожалуйста, как вызвать функцию (исправление раскладки Ru->En) в заданной области <textarea>?
Граница области задаётся окаймляющей парой: [math],[/math]. То есть нужно, чтобы функция вызывалась только, когда курсор находится между [math] и [/math].

С исправлением раскладки во всей <textarea> почти нет проблем (не пашет в IE)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">

<script type=text/javascript>
String.prototype.reverseRuEnLayout = (function()
{
    var L = {'А':'F','а':'f','Б':'<','б':'\,','В':'D','в':'d','Г':'U','г':'u',
             'Д':'L','д':'l','Е':'T','е':'t','Ё':'~','ё':'`','Ж':';','ж':';',
             'З':'P','з':'p','И':'B','и':'b','Й':'Q','й':'q','К':'R','к':'r',
             'Л':'K','л':'k','М':'V','м':'v','Н':'Y','н':'y','О':'J','о':'j',
             'П':'G','п':'g','Р':'H','р':'h','С':'C','с':'c','Т':'N','т':'n',
             'У':'E','у':'e','Ф':'A','ф':'a','Х':'{','х':'[','Ц':'W','ц':'w',
             'Ч':'X','ч':'x','Ш':'I','ш':'i','Щ':'O','щ':'o','Ъ':'}','ъ':']',
             'Ы':'S','ы':'s','Ь':'M','ь':'m','Э':'\'','э':'\'','Ю':'>','ю':'\.',
             'Я':'Z','я':'z','/':'|',':':'^','?':'&'  //некоторые символы специально не учтены
            },
        r = '', k;
    for (k in L) r += k;
    r = new RegExp('[' + r + ']', 'g');
    k = function(a){return a in L ? L[a] : '';};

    return function() {return this.replace(r, k);
    onpropertychange="document.getElementById('abcd').value = this.value.reverseRuEnLayout()"     
    };
})();
</script>

</head>
<body>
<textarea style="margin-left: 50px; width: 400px; height: 100px;" id="abcd"
          oninput="document.getElementById('abcd').value = this.value.reverseRuEnLayout()">
</textarea>
</body>
</html>

Нашел на этом форуме, как получить курсор в textarea, но использовать это не получается.

Deff 27.07.2012 23:52

Demath,
Воть тут функция для textarea => http://javascript.ru/forum/css-html-...tml#post185394 пост 2

Demath 28.07.2012 19:26

Deff, спасибо. Пока не догнал, как использовать.

Также у немцев нашёл кроссбраузерный скрипт по отловли курсора в textarea вставки ббкодов, но тоже не разберусь, как подогнать для своего :(

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Einf&uuml;gen von Inhalten in eine Textarea</title>
<script type="text/javascript">
function insert(aTag, eTag) {
  var input = document.forms['formular'].elements['eingabe'];
  input.focus();
  /* für Internet Explorer */
  if(typeof document.selection != 'undefined') {
    /* Einfügen des Formatierungscodes */
    var range = document.selection.createRange();
    var insText = range.text;
    range.text = aTag + insText + eTag;
    /* Anpassen der Cursorposition */
    range = document.selection.createRange();
    if (insText.length == 0) {
      range.move('character', -eTag.length);
    } else {
      range.moveStart('character', aTag.length + insText.length + eTag.length);      
    }
    range.select();
  }
  /* für neuere auf Gecko basierende Browser */
  else if(typeof input.selectionStart != 'undefined')
  {
    /* Einfügen des Formatierungscodes */
    var start = input.selectionStart;
    var end = input.selectionEnd;
    var insText = input.value.substring(start, end);
    input.value = input.value.substr(0, start) + aTag + insText + eTag + input.value.substr(end);
    /* Anpassen der Cursorposition */
    var pos;
    if (insText.length == 0) {
      pos = start + aTag.length;
    } else {
      pos = start + aTag.length + insText.length + eTag.length;
    }
    input.selectionStart = pos;
    input.selectionEnd = pos;
  }
  /* für die übrigen Browser */
  else
  {
    /* Abfrage der Einfügeposition */
    var pos;
    var re = new RegExp('^[0-9]{0,3}$');
    while(!re.test(pos)) {
      pos = prompt("Einfügen an Position (0.." + input.value.length + "):", "0");
    }
    if(pos > input.value.length) {
      pos = input.value.length;
    }
    /* Einfügen des Formatierungscodes */
    var insText = prompt("Bitte geben Sie den zu formatierenden Text ein:");
    input.value = input.value.substr(0, pos) + aTag + insText + eTag + input.value.substr(pos);
  }
}
</script>
</head>
<body>
<form name="formular" action="">
<input type="button" value="Einfügen" onClick="insert('[link]', '[/link]')">
<textarea name="eingabe" cols="30" rows="5">Ihre Nachricht</textarea>
</form>
<p>Positionieren Sie einfach den Cursor innerhalb der textarea oder markieren Sie Text darin. W&auml;hlen Sie dann "Einf&uuml;gen", um <code>[link]...[/link]</code> an dieser Stelle  einf&uuml;gen zu lassen, sofern es der Browser erm&ouml;glicht.</p>
</body>
</html>

Deff 28.07.2012 21:07

Demath,
Читайте пояснения в топике 0 там и спрашивайте 0 просто ставите функцию - прописываете в скрипте свой теxtarea, по вызову функции bbcode(bbopen, bbclose) (из onclick какой нидь кнопки) обрамляется текущий выделенный текст в bbopen, bbclose
bbopen - тег начального обрамления ( к примеру [Demath] )
bbclose - тег конечного обрамления ( к примеру [/Demath] )
парся value теxtarea - (к примеру indexOf) получаете начальное по концу первого тега , а по началу второго - конечные точки выделения
Или если нужно вставить ток в текущее положение используем функцию
function smile(code, popup) в таком виде smile(code) - она вставит только тег в текущее положение курсора - далее парсим - определяем номер символа по концу тега - удаляем вставку

Demath 28.07.2012 23:20

Цитата:

Сообщение от Deff
Читайте пояснения в топике 0 там и спрашивайте 0 просто ставите функцию - прописываете в скрипте свой теxtarea, по вызову функции bbcode(bbopen, bbclose) (из onclick какой нидь кнопки) обрамляется текущий выделенный текст в bbopen, bbclose
bbopen - тег начального обрамления ( к примеру [Demath] )
bbclose - тег конечного обрамления ( к примеру [/Demath] )

Весь скрипт для вставки ббкодов не нужен. Пытаюсь выдрать из него часть, которая определяет положение курсора в textarea.
А, вообще, спасибо, пригодится!

Цитата:

Сообщение от Deff
парся value теxtarea - (к примеру indexOf) получаете начальное по концу первого тега , а по началу второго - конечные точки выделения
Или если нужно вставить ток в текущее положение используем функцию
function smile(code, popup) в таком виде smile(code) - она вставит только тег в текущее положение курсора - далее парсим - определяем номер символа по концу тега - удаляем вставку

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

__________________________________________________ _____________
P.S. Нашел кроссбраузерную (?) функцию для автокоррекции раскладки клавиатуры.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru-ru" xml:lang="ru-ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Перевод в транслит</title>
<script type="text/javascript">
function correctRuEnlayout(){
var text=document.getElementById('abcd').value;
var transl=new Array();
    transl['А']='F';     transl['а']='f';
    transl['Б']='<';     transl['б']='\,';
    transl['В']='D';     transl['в']='d';
    transl['Г']='U';     transl['г']='u';
    transl['Д']='L';     transl['д']='l';
    transl['Е']='T';     transl['е']='t';
    transl['Ё']='~';     transl['ё']='`';
    transl['Ж']=';';     transl['ж']=';';
    transl['З']='P';     transl['з']='p';
    transl['И']='B';     transl['и']='b';
    transl['Й']='Q';     transl['й']='q';
    transl['К']='R';     transl['к']='r';
    transl['Л']='K';     transl['л']='k';
    transl['М']='V';     transl['м']='v';
    transl['Н']='Y';     transl['н']='y';
    transl['О']='J';     transl['о']='j';
    transl['П']='G';     transl['п']='g';
    transl['Р']='H';     transl['р']='h';
    transl['С']='C';     transl['с']='c';
    transl['Т']='N';     transl['т']='n';
    transl['У']='E';     transl['у']='e';
    transl['Ф']='A';     transl['ф']='a';
    transl['Х']='{';     transl['х']='[';
    transl['Ц']='W';     transl['ц']='w';
    transl['Ч']='X';     transl['ч']='x';
    transl['Ш']='I';     transl['ш']='i';
    transl['Щ']='O';     transl['щ']='o';
    transl['Ъ']='}';     transl['ъ']=']';
    transl['Ы']='S';     transl['ы']='s';
    transl['Ь']='M';     transl['ь']='m';
    transl['Э']='\"';    transl['э']='\'';
    transl['Ю']='>';     transl['ю']='\.';
    transl['Я']='Z';     transl['я']='z';
    transl['/']='|';     transl['\\']='\\';
	transl[':']='^';     transl['?']='&';
	//некоторые символы не учтены специально
	
    var result='';
    for(i=0;i<text.length;i++) {
        if(transl[text[i]]!=undefined) { result+=transl[text[i]]; }
        else { result+=text[i]; }
    }
    document.getElementById('abcd').value=result;
}
</script>
</head>
<body style="padding-left: 100px;">
<textarea id="abcd" style="width:300px; height:100px;" onkeyup="correctRuEnlayout()" ></textarea>
</body>
</html>

Deff 28.07.2012 23:26

Цитата:

Сообщение от Demath
Простите, не совсем понял. Если возможно, то подробней, пожалуйста.

Выделили текст курсором, по клику на кнопку(как тут в форме отправки сообщений) обрамили его уникальными тегами( поскольку обрамили по клику - тут жа считываем value у textarea и парсим своё уникальное обрамление, определем позицию - регуляркой или чисто replace - удаляем временно вставленные теги - что - не понятно ?

Deff 28.07.2012 23:49

Цитата:

Сообщение от Demath
P.S. Нашел кроссбраузерную (?) функцию для автокоррекции раскладки клавиатуры.

http://hostjs-mybb2011.narod.ru/Rus_Lat.htm Вторая кнопка (*Т) - Выделяем текст и жмем(Второй раз выделяем и жмём

Demath 29.07.2012 11:55

Спасибо, хороший и нужный скрипт, пригодится, но не совсем подходит под текущую нужду.

Например, чтобы пользователю набрать этот абзац с формулам (см. рис.), нужно 24 раза переключить раскладку клавиатуры, так как LaTex-код формул набирается на латинице.



Нужно чтобы функция вызывалась (автокоррекция раскладки клавиатуры во время ввода) только когда русская буква появляется между [math]здесь[/math], а не во всей textarea. Думаю, не обязательно отлавливать позицию курсора.

Сама функция
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru-ru" xml:lang="ru-ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Перевод в транслит</title>
<script type="text/javascript">
function correctRuEnlayout(){
var text=document.getElementById('abcd').value;
var transl=new Array();
    transl['А']='F';     transl['а']='f';
    transl['Б']='<';     transl['б']='\,';
    transl['В']='D';     transl['в']='d';
    transl['Г']='U';     transl['г']='u';
    transl['Д']='L';     transl['д']='l';
    transl['Е']='T';     transl['е']='t';
    transl['Ё']='~';     transl['ё']='`';
    transl['Ж']=';';     transl['ж']=';';
    transl['З']='P';     transl['з']='p';
    transl['И']='B';     transl['и']='b';
    transl['Й']='Q';     transl['й']='q';
    transl['К']='R';     transl['к']='r';
    transl['Л']='K';     transl['л']='k';
    transl['М']='V';     transl['м']='v';
    transl['Н']='Y';     transl['н']='y';
    transl['О']='J';     transl['о']='j';
    transl['П']='G';     transl['п']='g';
    transl['Р']='H';     transl['р']='h';
    transl['С']='C';     transl['с']='c';
    transl['Т']='N';     transl['т']='n';
    transl['У']='E';     transl['у']='e';
    transl['Ф']='A';     transl['ф']='a';
    transl['Х']='{';     transl['х']='[';
    transl['Ц']='W';     transl['ц']='w';
    transl['Ч']='X';     transl['ч']='x';
    transl['Ш']='I';     transl['ш']='i';
    transl['Щ']='O';     transl['щ']='o';
    transl['Ъ']='}';     transl['ъ']=']';
    transl['Ы']='S';     transl['ы']='s';
    transl['Ь']='M';     transl['ь']='m';
    transl['Э']='\"';    transl['э']='\'';
    transl['Ю']='>';     transl['ю']='\.';
    transl['Я']='Z';     transl['я']='z';
    transl['/']='|';     transl['\\']='\\';
	transl[':']='^';     transl['?']='&';
	//некоторые символы не учтены специально
	
    var result='';
    for(i=0;i<text.length;i++) {
        if(transl[text[i]]!=undefined) { result+=transl[text[i]]; }
        else { result+=text[i]; }
    }
    document.getElementById('abcd').value=result;
}
</script>
</head>
<body style="padding-left: 100px;">
<textarea id="abcd" style="width:300px; height:100px;" onkeyup="correctRuEnlayout()" ></textarea>
</body>
</html>

Demath 30.07.2012 19:51

Получилось только с помощью регулярных выражений

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru-ru" xml:lang="ru-ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Перевод в транслит</title>
<script type="text/javascript">
function correctLayout(text){
    if (typeof(text)=="undefined") return null;
var transl=new Array();
    transl['А']='F';     transl['а']='f';
    transl['Б']='<';     transl['б']='\,';
    transl['В']='D';     transl['в']='d';
    transl['Г']='U';     transl['г']='u';
    transl['Д']='L';     transl['д']='l';
    transl['Е']='T';     transl['е']='t';
    transl['Ё']='~';     transl['ё']='`';
    transl['Ж']=';';     transl['ж']=';';
    transl['З']='P';     transl['з']='p';
    transl['И']='B';     transl['и']='b';
    transl['Й']='Q';     transl['й']='q';
    transl['К']='R';     transl['к']='r';
    transl['Л']='K';     transl['л']='k';
    transl['М']='V';     transl['м']='v';
    transl['Н']='Y';     transl['н']='y';
    transl['О']='J';     transl['о']='j';
    transl['П']='G';     transl['п']='g';
    transl['Р']='H';     transl['р']='h';
    transl['С']='C';     transl['с']='c';
    transl['Т']='N';     transl['т']='n';
    transl['У']='E';     transl['у']='e';
    transl['Ф']='A';     transl['ф']='a';
    transl['Х']='{';     transl['х']='[';
    transl['Ц']='W';     transl['ц']='w';
    transl['Ч']='X';     transl['ч']='x';
    transl['Ш']='I';     transl['ш']='i';
    transl['Щ']='O';     transl['щ']='o';
    transl['Ъ']='}';     transl['ъ']=']';
    transl['Ы']='S';     transl['ы']='s';
    transl['Ь']='M';     transl['ь']='m';
    transl['Э']='\"';    transl['э']='\'';
    transl['Ю']='>';     transl['ю']='\.';
    transl['Я']='Z';     transl['я']='z';
    //некоторые символы не учтены специально
    
    var result='';
    for(i=0;i<text.length;i++) {
        if(transl[text[i]]!=undefined) { result+=transl[text[i]]; }
        else { result+=text[i]; }
    }
    return result;
};

function correctInPsevdoTag(text){
  re= /\[math\]((.(?!\[\/math\]))*.)\[\/math\]/ig;
    translit= function(text, group1) {
        return correctLayout('[math]'+group1+'[/math]');
    };
    return text.replace(re, translit);
}
</script>
</head>
<body style="padding-left: 100px;">
<textarea id="abcd" style="width:300px; height:100px;" onkeyup="this.value=correctInPsevdoTag(this.value);"></textarea>
</body>
</html>

Но после каждого нажатия клавиши внутри [math][/math] курсор перебрасывает в конец строки :(
Как это можно исправить?

Deff 30.07.2012 20:05

Цитата:

Сообщение от Demath
Но после каждого нажатия клавиши внутри курсор перебрасывает в конец строки

Нун нажимать не клавишами - а иконкой в вашей форме - выделили текст - нажали - иконку

Demath 30.07.2012 20:25

Цитата:

Сообщение от Deff
Нун нажимать не клавишами - а иконкой в вашей форме - выделили текст - нажали - иконку

Тогда от скрипта будет мало толку. Цель и практическая ценность скрипта в том, чтобы облегчить пользователю ввод формул (пример здесь)

С выделением не легче (может чуть-чуть), чем с переключением раскладки. К тому же, пользователю нужно видеть в процессе ввода, что он вводит.

Я так понимаю, что проблема связана с событием onKeyUp?

Demath 01.08.2012 14:49

Вот получилось (не без помощи) исправлять раскладку клавиатуры с Ru на En внутри тегов [ math][/math ] в textarea во время ввода (событие OnKeyUp), при этом каретка не переносится в конец строки после каждого нажатия клавиши внутри [ math][/math ].

Но раскладка клавиатуры корректируется только в первом вхождении [ math][/math ], в последующих не изменяется :(
Подскажите, как это исправить.

<textarea style="width: 450px; height: 140px" id="abcd" onkeyup="correctInTag (this)">
Наберите что-либо на русском внутри [ math][/math ].
 
Но внутри второй пары [ math][/math ] и всех последующих раскладка не корректируется.
</textarea>
 
<script  type="text/javascript"> 
function correctInTag (t)
{ 
if ((/[а-я]/i).exec (t.value.split ('[ math]') [1].split ('[/math ]') [0]) == null) return;
var cyr = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя',
    klv = 'F<DULT~:PBQRKVYJGHCNEA{WXIOMS}">Zf,dult`;pbqrkvyjghcnea[wxioms]\'.z';
if (document.selection)
   {t.focus ();
     var rng = document.selection.createRange ();
     rng.moveEnd ('character', -1); rng.moveEnd ('character', 1);
     rng.text = klv.charAt (cyr.indexOf (rng.text));
   }
else if (t.selectionStart >= 0)
   {var s = t.selectionStart - 1;
     t.value = t.value.substr (0, s)
           + klv.charAt (cyr.indexOf (t.value.substr (s, 1)))
           + t.value.substr (s + 1);
     t.selectionStart = t.selectionEnd = s + 1;
   }
} 
</script>

Deff 01.08.2012 15:25

Цитата:

Сообщение от Demath
Но раскладка клавиатуры корректируется только в первом вхождении

2. Парс делаете Метод match(regexp) http://javascript.ru/basic/regular-e...d-match-regexp

тогда у Вас массив - его и обрабатываете через свою функцию correctInTag

Demath 01.08.2012 15:39

Цитата:

Сообщение от Deff (Сообщение 193635)
2. Парс делаете Метод match(regexp) http://javascript.ru/basic/regular-e...d-match-regexp

тогда у Вас массив - его и обрабатываете через свою функцию correctInTag

Deff, если не трудно, подробней, пожалуйста.

Deff 01.08.2012 15:43

Demath, метод match(сейчас вы делаете через exec)
Выдаст Вам массив совпадени -Ошибся -Сорри

Занчит рекурсия через replace http://javascript.ru/basic/regular-e...herez-funkciyu
Делаете парс с помощью replace и вызываемой функцией и делаете замену - подстановку каждого вхождения

Demath 01.08.2012 18:10

Цитата:

Сообщение от Deff
Занчит рекурсия через replace http://javascript.ru/basic/regular-e...herez-funkciyu
Делаете парс с помощью replace и вызываемой функцией и делаете замену - подстановку каждого вхождения

Спасибо.

Пытаюсь по всякому, но не получается :(

Deff 01.08.2012 19:24

Demath,
Выложите чисто считанную полную строку вместе с тегами вставленного обрамления [match] и восклицалом отметьте место текущего положения курсора

Demath 03.08.2012 23:46

Спасибо за подсказки! Кажется, получилось во всех вхождениях тега [math].[/math] корректировать раскладку клавиатуры.

<script  type="text/javascript"> 
function correctInTag(t)
{ 
    for (var z = t.value.split('[math]'), f = 0, j = 1, lj = z.length; j < lj; j++)
         { if (new RegExp('[а-яё]', 'i').exec(z[j].split('[/math]')[0]) != null) {f = 1; break} }
    if (!f) return;   
    var cyr = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя',
        klv = 'F<DULT~:PBQRKVYJGHCNEA{WXIOMS}">Zf,dult`;pbqrkvyjghcnea[wxioms]\'.z';
    if (document.selection)
        { t.focus();
          var rng = document.selection.createRange();
          rng.moveEnd('character', -1);
          rng.moveEnd('character', 1);
          rng.text = klv.charAt(cyr.indexOf(rng.text));
        }
    else if (t.selectionStart >= 0)
             { var s = t.selectionStart - 1;
               t.value = t.value.substr(0, s)
                         + klv.charAt(cyr.indexOf(t.value.substr(s, 1)))
                         + t.value.substr(s + 1);
               t.selectionStart = t.selectionEnd = s + 1;
             }
} 
</script>

<textarea id="abcd" onkeyup="correctInTag(this)" style="width: 300px; height: 100px">
Наберите что-либо на русском внутри [math].[/math].
И в этом [math].[/math].
</textarea>

Deff 03.08.2012 23:54

Demath,
:-E криво работает в опере еще и селект строк добавляет - приходится гасить... и рекурсия медленная - при большой скорости набора - убивает теги обрамлений
Всё нун делать несколько иначе

Demath 04.08.2012 00:08

Цитата:

Сообщение от Deff
криво работает в опере

А что именно происходит в Опере?

Цитата:

Сообщение от Deff
еще и селект строк добавляет - приходится гасить

Не понял. Уточните, пожалуйста.

Deff 04.08.2012 07:46

<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>
Можно вставлять даже копированием -осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи

Demath 04.08.2012 09:55

Deff, спасибо! Буду разбираться.

Цитата:

Сообщение от Deff
осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи

А разве в Вашем варианте курсор может наехать на теги даже при высокоскоростном наборе?
Вроде бы, с этим нет проблем. Во всяком случае, у меня не получилось наехать на теги.
Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу?

Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?

А что делать с IE?
Он же не вызывает по событию oninput. Но это не очень важно: в случае чего, сделаю костыль для IE из своего варианта и предупрежу пользователей, чтобы сильно не гнали лошадей.

Deff 04.08.2012 10:15

Цитата:

Сообщение от Demath
Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу?

Да

Цитата:

Сообщение от Demath
Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?

Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?

Demath 04.08.2012 16:06

Цитата:

Сообщение от Deff
Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?

Да, сейчас работает и с разрывами строк внутри тегов. Спасибо!

А скрипт случайно не продублировался?
Вроде, два скрипта с одинаковым количеством строк.

Deff 04.08.2012 16:26

Цитата:

Сообщение от Demath
А скрипт случайно не продублировался?

Да - поправил - наверно не выспался

Demath 04.08.2012 20:39

Цитата:

Сообщение от 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('\\/');

Deff 04.08.2012 20:44

Demath,
Это символы на русской раскладке ?
':', '?', '/'.

И чему они соответствуют на латинице ?

Я не вижу их на буквенной клаве в русской раскладке

Demath 04.08.2012 21:04

Цитата:

Сообщение от Deff
Это символы на русской раскладке ?
':', '?', '/'.

И чему они соответствуют на латинице ?
Я не вижу их на буквенной клаве в русской раскладке

Вы правы: их нет на русской буквенной клаве.

Символы ':' и '?', когда включена русская раскладка, набираются с Shift+6 и Shift+7 соответственно, а символ '/' с помощью Shift + клавиша правее 'ъ'. В моей клаве такое расположение, но и чуть с другим.

Deff 04.08.2012 21:44

Demath,
Суть в том - что если вставлять спец символы - будут проблемы при надобности их добавить и в самом деле - экспериментируйте сами

melky 05.08.2012 21:03

http://habrahabr.ru/post/149083/
Автор сего творения, интересно, зарегистрирован на форуме?

P.S. лучше было бы так (min).
P.S.S. devote, :)

Deff 05.08.2012 22:08

melky, Эт несколько не то - там транслитерация - а тут переключение раскладки

Ксать тут, на форе Выкладывал и транслитерацию, (Да там devote на habrе всё ниже поправил ... чо тады переживать

Гы - статья то сегодняшняя 5 августа 2012 в 21:26

melky 05.08.2012 22:41

Цитата:

Сообщение от Deff (Сообщение 194816)
melky,
Эт несколько не то - там транслитерация - а тут переключение раскладки

Ксать тут, на форе Выкладывал и транслитерацию, (Да там devote на habrе всё ниже поправил ... чо тады переживать

Гы - статья то сегодняшняя 5 августа 2012 в 21:26

угумс .. у меня просто забурлило :)

UPD : учитывает слова в верхнем регистре.
http://jsbin.com/akaxeg/5

Deff 05.08.2012 23:02

melky, я спокойно уже отношусь к грехам и своим и чужим - ценности все временныя - то что седни ставишь на пьедестал - завтра -говно и старье... а чо тады упрекать кого то - чо он плохо вяжет лапти?

Demath 07.08.2012 21:39

Цитата:

Сообщение от melky (Сообщение 194790)
http://habrahabr.ru/post/149083/
Автор сего творения, интересно, зарегистрирован на форуме?

За основу взял функцию отсюда http://www.cyberforum.ru/javascript/thread328195.html


Часовой пояс GMT +3, время: 12:53.