User:Khanson/wordwikify.js

//Создание викиссылки из слова, на котором находится курсор //Автор: X-romix var XRomix_WordWikify_CantWork = 'Скрипт WordWikify не может работать в вашем браузере.\n\Script WordWikify cannot work in your browser' // английский текст для тех, кто не видит русские буквы var XRomix_WordWikify_FullText = 'Эта кнопка предназначена для викификации выделенного слова. Выберите фрагмент текста.'; //Добавляет кнопку function add_XRomix_WordWikify_Button{ var toolbar = document.getElementById('toolbar') var textbox = document.getElementById('wpTextbox1') if (!textbox || !toolbar) return var i = document.createElement('img') i.src = 'http://upload.wikimedia.org/wikipedia/ru/c/c1/Button-Found.PNG' //i.src = 'http://upload.wikimedia.org/wikipedia/ru/7/75/Button-Test.PNG' i.alt = i.title = 'Викификация слова' i.onclick = XRomix_WordWikify i.style.cursor = 'pointer' toolbar.appendChild(i) } //Этот код выполняется в начале. if (wgAction == 'edit' || wgAction == 'submit'){ addOnloadHook(add_XRomix_WordWikify_Button) } //Функция по преобразованию текста function XRomix_WordWikify{ //Проверяем, поддерживает ли браузер регулярные выражения (RegExp) if (('code'.replace(/d/g, 'r') != 'core')    || (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5)) { alert(XRomix_RefConv2_CantWork); return } var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1 wpTextbox1.focus; var winScroll=getScrollTop(wpTextbox1)//remember window scroll var startPos = getSelectionStart(wpTextbox1) var startPos1 = startPos; var endPos = startPos+getSelectionLength(wpTextbox1) if (startPos==-2) // Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку { alert(XRomix_RefConv2_CantWork); return } var str=wpTextbox1.value; if (startPos==endPos){ while (1==1){ if (startPos==0) break; startPos--; var ch = str.charAt(startPos); if (!ch.match(/[a-zA-Zа-яА-Я0-9Ёё]/)){ startPos++; break; }	 }	  var str1= str.substr(startPos); endPos=str1.search(/[^a-zA-Zа-яА-Я0-9Ёё]/); if (endPos==-1) {endPos=startPos} else{endPos=endPos+startPos} if(endPos<=startPos1){ alert('В текущей позиции курсора не найдено слово или число'); return; }	}	//alert("+++"+startPos+" "+endPos); txt = str.substring(startPos, endPos) if (txt == '') {alert(XRomix_RefConv2_FullText); return} else{ processText wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos) }	setSelectionRange(wpTextbox1, startPos, startPos + txt.length) setScrollTop(wpTextbox1, winScroll)//scroll back //Здесь производим замену в переменной txt - это отразится на выделенном фрагменте текста function processText{ var searchInput=document.getElementById('searchInput'); txt=""+txt+""; }

//подсчитывает концы строк в фрагменте текста function countCrlf(str){ var cnt=0; for(var i=0; i 20031000 || is_safari)) { //Mozilla/Opera/Safari3 input.setSelectionRange(start, end); }else if (document.selection && document.selection.createRange) { //Internet Explorer var range = input.createTextRange; range.collapse(true); range.moveStart("character", start - countCrlf(input.value.substring(0, start))); range.moveEnd("character", end - start - countCrlf(input.value.substring(start, end))); range.select; }	 };

//Браузеро-независимое получение длины //выделенного фрагмента в поле ввода input function getSelectionLength(input) { if (typeof wpTextbox1.selectionStart != 'undefined'    && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3 return input.selectionEnd-input.selectionStart; }else if (document.selection && document.selection.createRange) { //Internet Explorer input.focus var range = document.selection.createRange return range.text.length }	else return -2; };

//Браузеро-независимый getSelectionStart - возвращает позицию начала //выделенного фрагмента в поле ввода input, или позицию курсора в поле ввода function getSelectionStart(input) { if (typeof wpTextbox1.selectionStart != 'undefined'    && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3 return input.selectionStart; }else if (document.selection && document.selection.createRange) { //Internet Explorer input.focus //return Math.abs(document.selection.createRange.moveStart("character", -1000000));

var temp = input.value; input.focus var range = document.selection.createRange var length = range.text.length var txt = range.text range.text="{50E9CD6A-BC3E-4B44-9107-FFF6A65DC28E}" //фтыкаем гуид чтобы найти положение курсора в IE	 //Статья http://www.bazon.net/mishoo/articles.epl?art_id=1292 //рекомендует фтыкать тильду, но гуид лучше, потому что он гарантированно не встретится в тексте var vv=input.value; var startPos = vv.search("{50E9CD6A-BC3E-4B44-9107-FFF6A65DC28E}") //ищем этот гуид input.value=temp //восстанавливаем текст, который был в поле ввода setSelectionRange(input, startPos, startPos+length) //восстанавливаем выделение return startPos }	else return -2; };

//Браузеро-независимый getScrollTop - возвращает позицию прокрутки //в поле ввода input function getScrollTop(input) { if (typeof wpTextbox1.selectionStart != 'undefined'    && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3 return input.scrollTop }else if (document.selection && document.selection.createRange) { //Internet Explorer input.focus return document.documentElement.scrollTop }	else return -2; };

//Браузеро-независимый setScrollTop - устанавливает позицию прокрутки //в поле ввода input function setScrollTop(input, top) { if (typeof wpTextbox1.selectionStart != 'undefined'    && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3 input.scrollTop=top }else if (document.selection && document.selection.createRange) { //Internet Explorer input.focus document.documentElement.scrollTop=top } }; }