Замена со сдвигом каретки в нужную позицию
Уважаемые адепты 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 различных наборов символов) |
Часовой пояс GMT +3, время: 01:53. |