MediaWiki:Monobook.js
[http://www.wikizamki.org/links.htm]
(Различия между версиями)
Elden (обсуждение | вклад) |
Elden (обсуждение | вклад) |
||
| Строка 235: | Строка 235: | ||
} | } | ||
| + | } | ||
| + | |||
| + | |||
| + | //Преобразование ссылок в читабельный вид | ||
| + | //Часть кода позаимствована из 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:X-romix/refconv.js|refconv.js]] - преобразование ссылок"; | ||
| + | } | ||
| + | } | ||
| + | } | ||
} | } | ||
Версия 11:39, 30 июля 2009
/* Указанный здесь JavaScript будет загружен всем участникам, использующим тему оформления MonoBook */
//Скрипт дополняет форму поиска ссылками на поиск в гугле по различным вики-проектам.
function xRomixSearch(mode){
var el = document.getElementById('xRomix_hidden_search_span');
if (!el) return;
var f1 = document.getElementById('searchInput');
if (!f1) return;
var s="";
if(mode=="google_wikipedia"){
s=" <form id='xRomix_hidden_search_form' action='http://ru.wikipedia.org/wiki/Заглавная страница'>\
<input id='xRomix_hidden_search_text' type='hidden' name='q' value=''>\
<input type='hidden' name='as_sitesearch' value='wikipedia.org'>\
</form>";
}else if(mode=="google_wiktionary"){
s=" <form id='xRomix_hidden_search_form' action='http://ru.wiktionary.org/wiki/Заглавная страница'>\
<input id='xRomix_hidden_search_text' type='hidden' name='q' value=''>\
<input type='hidden' name='as_sitesearch' value='wiktionary.org'>\
</form>";
}else if(mode=="google_wikibooks"){
s=" <form id='xRomix_hidden_search_form' action='http:http://ru.wikibooks.org/wiki/Заглавная страница'>\
<input id='xRomix_hidden_search_text' type='hidden' name='q' value=''>\
<input type='hidden' name='as_sitesearch' value='wikibooks.org'>\
</form>";
}else if(mode=="google_translate"){
var text=f1.value;
//Определим направление перевода
try{
if (text.search(/[А-Яа-я]+/)>=0){
lang="ru|en";
}else{
lang="en|ru";
}
}catch(e){
lang="en|ru";
}
s=" <form id='xRomix_hidden_search_form' action='http://translate.google.com/translate_t'>\
<input id='xRomix_hidden_search_text' type='hidden' name='text' value=''>\
<input type='hidden' name='hl' value='ru'>\
<input type='hidden' name='ie' value='UTF8'>\
<input type='hidden' name='langpair' value='"+lang+"'>\
</form>";
}else if(mode=="yandex_slovari"){
s=" <form id='xRomix_hidden_search_form' action='http://lingvo.yandex.ru/search.xml'>\
<input id='xRomix_hidden_search_text' type='hidden' name='text' value=''>\
</form>";
}else if(mode=="yandex_lingvo"){
s=" <form id='xRomix_hidden_search_form' action='http://lingvo.yandex.ru/en'>\
<input id='xRomix_hidden_search_text' type='hidden' name='text' value=''>\
<input type='hidden' name='st_translate' value='1'>\
</form>";
}
el.innerHTML=s;
var f2 = document.getElementById('xRomix_hidden_search_text');
if (!f2) return;
f2.value=f1.value;
var f = document.getElementById('xRomix_hidden_search_form');
if (!f) return;
try{
var test = extSearchMode; //проверяем наличие переменной
}catch(e){
extSearchMode=1; //по умолчанию - в новом окне
}
if (extSearchMode == 1){
f.target='_blank';
}
f.submit();
}
addOnloadHook(function(){
var el = document.getElementById('searchBody');
if (!el) return;
s="<form action='/wiki/Служебная:Search' id='searchform' target='_blank'><div>\
<input id='searchInput' name='search' type='text' title='Искать это слово [f]' accesskey='f' value='' />\
<input type='submit' name='go' class='searchButton' id='searchGoButton' value='Перейти' title='Перейти к странице, имеющей в точности такое название' /> \
<input type='submit' name='fulltext' class='searchButton' id='mw-searchButton' value='Найти' title='Найти страницы, содержащие указанный текст' /></div></form>\
<span id='xRomix_hidden_search_span'></span>\
<div align='left'><br><ul>\
<li><a href='javascript: xRomixSearch(\"google_wikipedia\");'>Википедия</a></li>\
<li><a href='javascript: xRomixSearch(\"google_wiktionary\");'>Викисловарь</a></li>\
<li><a href='javascript: xRomixSearch(\"google_wikibooks\");'>Викиучебник</a></li>\
<li><a href='javascript: xRomixSearch(\"google_translate\");'>Google→Переводчик</a></li>\
<li><a href='javascript: xRomixSearch(\"yandex_slovari\");'>Яндекс→Словари</a></li>\
<li><a href='javascript: xRomixSearch(\"yandex_lingvo\");'>Яндекс→Lingvo</a></li>\
</ul></div>\
";
try{
var test = extSearchMode; //проверяем наличие переменной
}catch(e){
extSearchMode=1; //по умолчанию - в новом окне
}
if (extSearchMode == 0){
//Убираем target='_blank' - открывание в новом окне, если переменная = 0
var reg = /target\=\'\_blank\'/g
var res = s.replace(reg, "");
s = res;
//Заменяем стрелочку на минус (чтобы было видно, в каком режиме будет поиск)
var reg = /→/g
var res = s.replace(reg, "-");
s = res;
}
el.innerHTML=s;
}//function
);//addOnloadHook
//Форматирует таблицу, скопированную из Excel, по правилам вики-разметки.
//Часть кода позаимствована из http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
//Автор: X-romix
var XRomix_Tablify_CantWork1 = 'Таблификатор не может работать в вашем браузере.\n\nTablificator cannot work in your browser' // английский текст для тех, кто не видит русские буквы
var XRomix_Tablify_FullText1 = 'Эта кнопка предназначена для форматирования табличного текста, скопированного из табличного редактора (например, из Excel). Чтобы функция заработала, сначала выделите нужный фрагмент текста в окне редактирования.'
//Добавляет кнопку
function addTablifikatorButton1(){
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-tablifikator.PNG'
i.alt = i.title = 'Таблификатор'
i.onclick = XRomix_Tablify1
i.style.cursor = 'pointer'
toolbar.appendChild(i)
}
//Этот код выполняется в начале.
if (wgAction == 'edit' || wgAction == 'submit'){
addOnloadHook(addTablifikatorButton1)
}
//Функция для оформления таблицы
function XRomix_Tablify1(){
//Проверяем, поддерживает ли браузер регулярные выражения (RegExp)
if (('code'.replace(/d/g, 'r') != 'core')
|| (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5))
{ alert(XRomix_Tablify_CantWork1); return }
setWpSummary();
var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1
var winScroll = document.documentElement.scrollTop //remember window scroll
wpTextbox1.focus()
if (typeof wpTextbox1.selectionStart != 'undefined'
&& (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3
var textScroll = wpTextbox1.scrollTop
var startPos = wpTextbox1.selectionStart
var endPos = wpTextbox1.selectionEnd
txt = wpTextbox1.value.substring(startPos, endPos)
if (txt == '') {alert(XRomix_Tablify_FullText1); return}
else{
processText()
wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos)
}
wpTextbox1.selectionStart = startPos
wpTextbox1.selectionEnd = startPos + txt.length
wpTextbox1.scrollTop = textScroll
}else if (document.selection && document.selection.createRange) { //IE
var range = document.selection.createRange()
txt = range.text
if (txt == '') {alert(XRomix_Tablify_FullText1); return}
else{
processText()
range.text = txt
//if (!window.opera) txt = txt.replace(/\r/g,'')
if (range.moveStart) range.moveStart('character', - txt.length)
range.select()
}
}else // Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку
{ alert(XRomix_Tablify_CantWork1); return }
document.documentElement.scrollTop = winScroll // scroll back, for IE/Opera
//Здесь производим замену в переменной txt - это отразится на выделенном фрагменте текста
function processText(){
var col1hdr=0;
if (confirm('Вы хотите оформить первую колонку как заголовок?')) col1hdr=1;
txt = txt.replace(/^\s+|\s+$/g, '') //Обрезаем пробелы слева и справа
var arr1=txt.split("\n")
txt='\n{| class="standard"\n'
for (var i=0; i<arr1.length; i++){
txt = txt+"|-\n"
s1=arr1[i];
var arr2=s1.split("\t")
for (var j=0; j<arr2.length; j++){
var s2=arr2[j];
if ((col1hdr==1 && j==0)||i==0){
txt = txt+"! "+s2+"\n"
}else{
txt = txt+"| "+s2+"\n"
}
}
}
txt = txt+"|}"
}
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:X-romix/tablifikator.js|tablifikator.js]] - таблица из Excel/Calc";
}
}
}
}
//Преобразование ссылок в читабельный вид
//Часть кода позаимствована из 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:X-romix/refconv.js|refconv.js]] - преобразование ссылок";
}
}
}
}