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]] - преобразование ссылок"; } } } }