Користувач:Oleandr/JS/wordwikify.js
< Користувач:Oleandr | JS
Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.
- Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
- Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
- Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
- Opera: натисніть Ctrl-F5
//Создание викиссылки из слова, на котором находится курсор
//Автор: X-romix
var XRomix_WordWikify_CantWork = 'Скрипт WordWikify не может работать в вашем браузере.\n\Script WordWikify cannot work in your browser' // английский текст для тех, кто не видит русские буквы
var XRomix_WordWikify_FullText = 'Эта кнопка предназначена для викификации выделенного слова. Выберите фрагмент текста.';
if (/edit|submit/.test(wgAction)){
mwCustomEditButtons['wordwikify'] = [XRomix_WordWikify, 'http://upload.wikimedia.org/wikipedia/ru/c/c1/Button-Found.PNG', 'Український WikiLinker. Шукає вікі-посилання для обраного слова або словосполучення']
}
//Этот код выполняется в начале.
// if (wgAction == 'edit' || wgAction == 'submit'){
// addOnloadHook(add_XRomix_WordWikify_Button)
// }
//Добавляет кнопку
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)
}
//Функция по преобразованию текста
function XRomix_WordWikify()
{
alert('1')
//Проверяем, поддерживает ли браузер регулярные выражения (RegExp)
if (('code'.replace(/d/g, 'r') != 'core') || (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5))
{
alert(XRomix_RefConv2_CantWork);
return
}
alert('2')
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
{
alert('3')
processText()
wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos)
}
alert('4')
setSelectionRange(wpTextbox1, startPos, startPos + txt.length)
setScrollTop(wpTextbox1, winScroll)//scroll back
//Здесь производим замену в переменной txt - это отразится на выделенном фрагменте текста
function processText(){
var searchInput=document.getElementById('searchInput');
txt="[["+searchInput.value+"|"+txt+"]]";
}
//подсчитывает концы строк в фрагменте текста
function countCrlf(str){
var cnt=0;
for(var i=0; i<str.length; i++){
var c=str.charCodeAt(i);
if (c==13){
cnt++;
}
}
return cnt;
}
//Браузеро-независимый setSelectionRange - изменяет начало и конец
//выделенного фрагмента в поле ввода input
function setSelectionRange(input, start, end) {
if (typeof wpTextbox1.selectionStart != 'undefined'
&& (navigator.productSub > 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
}
};
}