//Преобразование ссылок в читабельный вид
//Часть кода позаимствована из http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
//Автор: X-romix
var XRomix_RefConv_CantWork = 'RefConv не может работать в вашем браузере.\n\RefConv cannot work in your browser' // английский текст для тех, кто не видит русские буквы
var XRomix_RefConv_FullText = 'Эта кнопка предназначена для преобразования ссылок в читабельный вид. Выберите фрагмент текста.';
//Добавляет кнопку
function add_XRomix_RefConv_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/0/0d/Button-RefConv.png'
//i.src = 'http://upload.wikimedia.org/wikipedia/ru/7/75/Button-Test.PNG'
i.alt = i.title = 'Преобразование ссылки в читаемый вид'
i.onclick = XRomix_RefConv1
i.style.cursor = 'pointer'
toolbar.appendChild(i)
}
//Этот код выполняется в начале.
if (wgAction == 'edit' || wgAction == 'submit'){
addOnloadHook(add_XRomix_RefConv_Button)
}
//Функция по преобразованию текста
function XRomix_RefConv1(){
//Проверяем, поддерживает ли браузер регулярные выражения (RegExp)
if (('code'.replace(/d/g, 'r') != 'core')
|| (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5))
{ alert(XRomix_RefConv_CantWork); return }
setWpSummary();
var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1
wpTextbox1.focus();
var winScroll=getScrollTop(wpTextbox1)//remember window scroll
var startPos = getSelectionStart(wpTextbox1)
var endPos = startPos+getSelectionLength(wpTextbox1)
if (startPos==-2)
// Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку
{ alert(XRomix_RefConv_CantWork); return }
if (startPos==endPos){
while (1==1){
if (startPos==0) break;
var str= wpTextbox1.value.substring(startPos, startPos+7);
if (str.search(/http\:\/\//i)!=-1) break;
startPos--;
}
var str= wpTextbox1.value.substr(startPos);
endPos=str.search(/[\s\]\t\n\<\>]/);
if (endPos==-1) {endPos=wpTextbox1.value.length;}
else{endPos=endPos+startPos}
if(endPos<wpTextbox1.selectionStart){
alert('В текущей позиции курсора не найден интернет-адрес http:// ');
return;
}
}
txt = wpTextbox1.value.substring(startPos, endPos)
if (txt == '') {alert(XRomix_RefConv_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(){
txt = txt.replace(/%D0%81/g, 'Ё');
txt = txt.replace(/%D0%90/g, 'А');
txt = txt.replace(/%D0%91/g, 'Б');
txt = txt.replace(/%D0%92/g, 'В');
txt = txt.replace(/%D0%93/g, 'Г');
txt = txt.replace(/%D0%94/g, 'Д');
txt = txt.replace(/%D0%95/g, 'Е');
txt = txt.replace(/%D0%96/g, 'Ж');
txt = txt.replace(/%D0%97/g, 'З');
txt = txt.replace(/%D0%98/g, 'И');
txt = txt.replace(/%D0%99/g, 'Й');
txt = txt.replace(/%D0%9A/g, 'К');
txt = txt.replace(/%D0%9B/g, 'Л');
txt = txt.replace(/%D0%9C/g, 'М');
txt = txt.replace(/%D0%9D/g, 'Н');
txt = txt.replace(/%D0%9E/g, 'О');
txt = txt.replace(/%D0%9F/g, 'П');
txt = txt.replace(/%D0%A0/g, 'Р');
txt = txt.replace(/%D0%A1/g, 'С');
txt = txt.replace(/%D0%A2/g, 'Т');
txt = txt.replace(/%D0%A3/g, 'У');
txt = txt.replace(/%D0%A4/g, 'Ф');
txt = txt.replace(/%D0%A5/g, 'Х');
txt = txt.replace(/%D0%A6/g, 'Ц');
txt = txt.replace(/%D0%A7/g, 'Ч');
txt = txt.replace(/%D0%A8/g, 'Ш');
txt = txt.replace(/%D0%A9/g, 'Щ');
txt = txt.replace(/%D0%AA/g, 'Ъ');
txt = txt.replace(/%D0%AB/g, 'Ы');
txt = txt.replace(/%D0%AC/g, 'Ь');
txt = txt.replace(/%D0%AD/g, 'Э');
txt = txt.replace(/%D0%AE/g, 'Ю');
txt = txt.replace(/%D0%AF/g, 'Я');
txt = txt.replace(/%D1%91/g, 'ё');
txt = txt.replace(/%D0%B0/g, 'а');
txt = txt.replace(/%D0%B1/g, 'б');
txt = txt.replace(/%D0%B2/g, 'в');
txt = txt.replace(/%D0%B3/g, 'г');
txt = txt.replace(/%D0%B4/g, 'д');
txt = txt.replace(/%D0%B5/g, 'е');
txt = txt.replace(/%D0%B6/g, 'ж');
txt = txt.replace(/%D0%B7/g, 'з');
txt = txt.replace(/%D0%B8/g, 'и');
txt = txt.replace(/%D0%B9/g, 'й');
txt = txt.replace(/%D0%BA/g, 'к');
txt = txt.replace(/%D0%BB/g, 'л');
txt = txt.replace(/%D0%BC/g, 'м');
txt = txt.replace(/%D0%BD/g, 'н');
txt = txt.replace(/%D0%BE/g, 'о');
txt = txt.replace(/%D0%BF/g, 'п');
txt = txt.replace(/%D1%80/g, 'р');
txt = txt.replace(/%D1%81/g, 'с');
txt = txt.replace(/%D1%82/g, 'т');
txt = txt.replace(/%D1%83/g, 'у');
txt = txt.replace(/%D1%84/g, 'ф');
txt = txt.replace(/%D1%85/g, 'х');
txt = txt.replace(/%D1%86/g, 'ц');
txt = txt.replace(/%D1%87/g, 'ч');
txt = txt.replace(/%D1%88/g, 'ш');
txt = txt.replace(/%D1%89/g, 'щ');
txt = txt.replace(/%D1%8A/g, 'ъ');
txt = txt.replace(/%D1%8B/g, 'ы');
txt = txt.replace(/%D1%8C/g, 'ь');
txt = txt.replace(/%D1%8D/g, 'э');
txt = txt.replace(/%D1%8E/g, 'ю');
txt = txt.replace(/%D1%8F/g, 'я');
}
//подсчитывает концы строк в фрагменте текста
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
}
};
function setWpSummary(){
var wpSummary = document.getElementById('wpSummary')
if(wpSummary){
var temp=wpSummary.value;
temp=temp.replace(/\/\*.*?\*\// , ""); //комментарии
temp=temp.replace(/[\s]*/ , ""); //пробелы
if (temp==""){
wpSummary.value=wpSummary.value+" [[User talk:Khanson/refconv.js|refconv.js]] - преобразование ссылок";
}
}
}
}