Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.10.2012, 16:04
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Замена со сдвигом каретки в нужную позицию
Уважаемые адепты js, помогите, пожалуйста, доделать скрипт автозамены в textarea при вводе со сдвигом каретки в нужную позицию.
Например, при вводе в textarea символов sq1 нужно их заменить на \sqrt{} и сдвинуть каретку между \sqrt{ и }. Вроде, это получилось сделать: все прекрасно заменяется и каретка после замены там, где нужно.

Не догоняю, что добавить, чтобы эта замена выполнялась только внутри тегов [tex][/tex], а не во всей textarea. Понятно, что нужно баловаться с регуляркой.

<script type="text/javascript">
function getCaretPosT(obj)                                       //Получение текущей позиции каретки (из Сети)
{   var s, e, p; //все
    if (typeof obj!="object") {obj=document.getElementById('abcd')}
    obj.focus();
    if (document.selection)//ie, opera
       { s=document.selection.createRange();
         if (window.opera)//opera
		    {s.moveStart("character", -obj.value.length); return s.text.length;}
         else { e=document.body.createTextRange(); //IE
                e.moveToElementText(obj);
                for (p=0; e.compareEndPoints("StartToStart", s)<0; p++)
                    {e.moveStart('character', 1)}
                return p;
              }
       }
    else if (obj.selectionStart||obj.selectionStart=="0")
            {return obj.selectionStart;}
}
function setCaretPos(obj,p)                                          //Задание позиции каретки (из Сети)
{   if (typeof obj!="object") {obj=document.getElementById('abcd')};
    obj.focus();
    if (obj.setSelectionRange){obj.setSelectionRange(p,p)}//FF
    else if (obj.createTextRange)//IE
	        { var r=obj.createTextRange(); r.collapse(true);
              r.moveEnd("character", p); r.moveStart("character", p); r.select();}		  
}
function MathReplace()                                 //Замена символов со сдвигом каретки в нужную позицию
{   var o = document.getElementById('abcd'),
        c = getCaretPosT(o.value),                             //Текущая позиция каретки.
        x = ['dfr1','fr1','nsq1','sq1'],                       //Символы, которые нужно заменить при вводе.
        a = ['\\dfrac{','\\frac{','\\sqrt[','\\sqrt{'],        //Часть "заменуемого" (до символа, после которого
                                                               //  нужно установить каретку после замены).
	    b = ['}{}','}{}',']{}','}'];                           //Вторая часть "заменуемого".  

    for (i=0; i<x.length; i++)
        { if (o.value.indexOf(x[i])!=-1)
             { o.value = o.value.replace(x[i], a[i]+b[i]);          
		       setCaretPos(o.value, c-x[i].length+a[i].length);} //Задание позиции каретки между    
        }                                                        //  a[i] и b[i] после замены.
}
</script>

<textarea id="abcd" style="width:500px; height:150px;" onkeyup="MathReplace()">
Введите dfr+1, fr+1, nsq+1 или sq+1 (без +)
</textarea>


Пробовал это (где x[i] - заменяемые символы), но "парсится" текст и между парами [tex][/tex]
RegExp('(\\[tex\\][\\s\\S]*?)'+x[i]+'([\\s\\S]*?\\[\/tex\\])')
И подскажите: для производительности лучше без цикла сделать?
(будет заменятся около 2k различных наборов символов)

Последний раз редактировалось Demath, 17.10.2012 в 16:21.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти позицию каретки (номер символа) относительно всего документа? sbudyakov Общие вопросы Javascript 2 10.10.2012 17:00