Уважаемые адепты 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 различных наборов символов)