//Преобразование ссылок Википедии в читабельный вид.
//Описание скрипта находится на странице обсуждения.
//Часть кода позаимствована из http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
//Автор: X-romix
var XRomix_RefConv2_CantWork = 'RefConv2 не может работать в вашем браузере.\n\RefConv cannot work in your browser' // английский текст для тех, кто не видит русские буквы
var XRomix_RefConv2_FullText = 'Эта кнопка предназначена для преобразования ссылок Википедии в читабельный вид. Выберите фрагмент текста.';
//Добавляет кнопку
function add_XRomix_RefConv2_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/4/45/Button-RefConv2.PNG'
//i.src = 'http://upload.wikimedia.org/wikipedia/ru/7/75/Button-Test.PNG'
i.alt = i.title = 'Преобразование ссылки Википедии в читаемый вид'
i.onclick = XRomix_RefConv2
i.style.cursor = 'pointer'
toolbar.appendChild(i)
}
//Этот код выполняется в начале.
if (mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit'){
addOnloadHook(add_XRomix_RefConv2_Button)
}
//Функция по преобразованию текста
function XRomix_RefConv2(){
//Проверяем, поддерживает ли браузер регулярные выражения (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 }
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=startPos}
else{endPos=endPos+startPos}
if(endPos<=startPos1){
alert('В текущей позиции курсора не найден интернет-адрес http:// ')
return;
}
}
txt = wpTextbox1.value.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(){
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, 'я');
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, 'я');
txt = txt.replace("http://ru.wikipedia.org/wiki/", '')
txt = "[["+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
}
};
}