MediaWiki:Common.js
Материал из ПокеВики
Версия от 14:47, 11 октября 2012; EvilCat (обсуждение | вклад)
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ function preserveSearch() { if ( ($search.value== '')&&(!$search.hasFocus()) ) return; var $body=document.getElementById('searchBody'); if ($body) $body.style.display='block !important'; } function unpreserveSearch() { var $force=false; if (typeof(arguments[0])!='undefined') $force=arguments[0]; if ( ( ($search.value!='')||($search.hasFocus()) ) && (!$force) ) return; var $body=document.getElementById('searchBody'); if (!$body) return; if ($force) $body.style.display='none'; $body.style.display=''; } var $search=document.getElementById('searchInput'); if ($search) { $search.addEventListener('keypress', preserveSearch); $search.addEventListener('focus', preserveSearch); $search.addEventListener('blur', unpreserveSearch); var $cross=document.createElement('a'); $cross.innerHTML='x'; $cross.style.cssFloat='right'; $cross.href='javascript:unpreserveSearch(true)'; var $target=document.getElementById('searchform'); if ($target) $target.appendChild($cross); } //кнопка викификатора if (wgAction == 'edit' || wgAction == 'submit') { importScriptURI('//ru.wikipedia.org/w/index.php?title=MediaWiki:Wikificator.js&action=raw&ctype=text/javascript') mwCustomEditButtons['wikif'] = [function(){Wikify()}, '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', 'Викификатор — автоматический обработчик текста'] if ( typeof $j != 'undefined' && typeof $j.fn.wikiEditor != 'undefined' ) { $j( function() {$j( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {'section': 'main','group': 'format','tools': { 'wikif': { label: 'Викификатор', type: 'button', icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', action: { type: 'callback', execute: function(){Wikify()} }}}});}); } } //Кнопки быстрого описания правки //список кнопок function SummaryButtons(){ var wpSummary = document.getElementById('wpSummary') if (!wpSummary || (wpSummary.form.wpSection && wpSummary.form.wpSection.value == 'new')) return wpSummaryBtn = document.createElement('span') //global var wpSummaryBtn.id = 'userSummaryButtonsA' // +Рекомендация var wpSummaryBtnRec = document.createElement('i') wpSummaryBtnRec.appendChild(document.createTextNode('Пожалуйста, если вы не торопитесь, опишите вашу правку подробно: например, не «дополнение», а «+персонажи».')) wpSummaryBtnRec.appendChild(document.createElement('br')) wpSummaryBtn.appendChild(wpSummaryBtnRec) wpSummary.parentNode.insertBefore(wpSummaryBtn, wpSummary.nextSibling) wpSummary.parentNode.insertBefore(document.createElement('br'), wpSummary.nextSibling) addSumButton('викиф.', 'викификация', 'Произведена викификация') addSumButton('оформл.', 'оформление', 'Оформление') addSumButton('стиль', 'стилевые правки', 'Стилевые правки') addSumButton('орфогр.', 'орфография', 'Поправлена орфография') addSumButton('пункт.', 'пунктуация', 'Изменена пунктуация') // addSumButton('интервики', 'интервики', 'Изменены межъязыковые ссылки (интервики)') addSumButton('кат.', 'правка категорий', 'Изменены категории') addSumButton('шаб.', 'шаблон', 'Добавлен / изменён шаблон') addSumButton('к удал.', 'к удалению', 'Страница предложена к удалению') addSumButton('доп.', 'дополнение', 'Добавлены новые сведения') addSumButton('иллюстрация', 'иллюстрация', 'Размещена иллюстрация') addSumButton('обнов.', 'обновление данных', 'Обновлены устаревшие данные') addSumButton('разметка', 'правка разметки', 'Изменение разметки') } //код вставки кнопок быстрого описания function addSumButton(name, text, title) { var btn = document.createElement('a') btn.appendChild(document.createTextNode(name)) btn.title = title btn.onclick = function(){insertSummary(text)} wpSummaryBtn.appendChild(btn) } //код вставки описания function insertSummary(text) { var wpSummary = document.getElementById('wpSummary') if (wpSummary.value.indexOf(text) != -1) return if (wpSummary.value.match(/[^,; \/]$/)) wpSummary.value += ',' if (wpSummary.value.match(/[^ ]$/)) wpSummary.value += ' ' wpSummary.value += text } //вызов функции вставки кнопок быстрого описания правки при загрузке страницы addOnloadHook(SummaryButtons) //перемещение ссылок "править" влево, к заголовку секции, для борьбы с багом движка addOnloadHook(function() { if (typeof oldEditsectionLinks != 'undefined' && oldEditsectionLinks) return; var spans = document.getElementsByTagName("span"); for (var i=0; i<spans.length; i++) { var span = spans[i]; if (span.className != "editsection") continue; span.style.fontSize = "x-small"; span.style.fontWeight = "normal"; span.style.styleFloat = "none"; // IE-Fix für die folgende Zeile span.style.cssFloat = "none"; span.style.marginLeft = "0px"; span.parentNode.appendChild(document.createTextNode(" ")); span.parentNode.appendChild(span); } }); //Скрываемый текст var NavigationBarHide = '[скрыть]' var NavigationBarShow = '[показать]' var hasClass = (function (){ var reCache = {} return function (element, className){ return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className) } })() /** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See * http://www.mediawiki.org/wiki/Manual:Collapsible_tables. * Maintainers: [[**MAINTAINERS**]] */ var autoCollapse = 2; var collapseCaption = 'скрыть'; var expandCaption = 'показать'; function collapseTable( tableIndex ) { var Button = document.getElementById( 'collapseButton' + tableIndex ); var Table = document.getElementById( 'collapsibleTable' + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; if ( Button.firstChild.data == collapseCaption ) { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = 'none'; } Button.firstChild.data = expandCaption; } else { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createCollapseButtons() { var tableIndex = 0; var NavigationBoxes = new Object(); var Tables = document.getElementsByTagName( 'table' ); for ( var i = 0; i < Tables.length; i++ ) { if ( hasClass( Tables[i], 'collapsible' ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0]; if( !HeaderRow ) continue; var Header = HeaderRow.getElementsByTagName( 'th' )[0]; if( !Header ) continue; NavigationBoxes[tableIndex] = Tables[i]; Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex ); var Button = document.createElement( 'span' ); var ButtonLink = document.createElement( 'a' ); var ButtonText = document.createTextNode( collapseCaption ); Button.className = 'collapseButton'; // Styles are declared in MediaWiki:Common.css ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex ); ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( '[' ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( ']' ) ); Header.insertBefore( Button, Header.childNodes[0] ); tableIndex++; } } for ( var i = 0; i < tableIndex; i++ ) { if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) { collapseTable( i ); } } } addOnloadHook( createCollapseButtons ); /** Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]] */ var hasClass = (function() { var reCache = {}; return function( element, className ) { return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); }; })(); // Collapsible Divs function collapsibleDivs(){ var navIdx = 0, colNavs = [], i, NavFrame var divs = document.getElementById('content').getElementsByTagName('div') for (i=0; NavFrame = divs[i]; i++) { if (!hasClass(NavFrame, 'NavFrame')) continue NavFrame.id = 'NavFrame' + navIdx var a = document.createElement('a') a.className = 'NavToggle' a.id = 'NavToggle' + navIdx a.href = 'javascript:collapseDiv(' + navIdx + ');' a.appendChild(document.createTextNode(NavigationBarShow)) for (var j=0; j < NavFrame.childNodes.length; j++) if (hasClass(NavFrame.childNodes[j], 'NavHead')) NavFrame.childNodes[j].appendChild(a) colNavs[navIdx++] = NavFrame } for (i=0; i < navIdx; i++) if (hasClass(colNavs[i], 'expanded')) collapseDiv(i) } function collapseDiv(idx) { var div = document.getElementById('NavFrame' + idx) var btn = document.getElementById('NavToggle' + idx) if (!div || !btn) return false var isShown = (btn.firstChild.data == NavigationBarHide) btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide var disp = isShown ? 'none' : 'block' for (var child = div.firstChild; child != null; child = child.nextSibling) if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent')) child.style.display = disp } //вызов функций для скрываемого текста addOnloadHook(collapsibleDivs) /* Переключаемые версии имён и названий. */ if (wgNamespaceNumber===0) { addOnloadHook(setVersionsButtons); } function getInnerTags($source, $class) { var $list=$source.childNodes, $result=new Array(), $rec=new Array(); var $limit=0, $tag='SPAN'; if (typeof(arguments[2])=='string') $tag=arguments[2].toUpperCase(); if (typeof(arguments[3])=='number') $limit=arguments[3]; for (var $i=0; $i<$list.length; $i++) { if (($list[$i].tagName==$tag)&&(hasClass($list[$i], $class))) $result[$result.length]=$list[$i]; if (($limit>0)&&($result.length>=$limit)) break; $rec=getInnerTags($list[$i], $class, $tag, $limit-$result.length); if ($rec) $result=$result.concat($rec); if (($limit>0)&&($result.length>=$limit)) break; } if ($limit==1) return $result[0]; else return $result; } var $vers_glossary=new Array(), $vers_current=new Array(); const $vers_var=['translit', 'transcript', 'kiriji']; const $vers_cases=['im', 'rod', 'dat', 'vin', 'tvor', 'pred', 'impl', 'rodpl', 'datpl', 'vinpl', 'tvorpl', 'predpl']; /* Установка кнопок */ function setVersionsButtons() { var $holder=getInnerTags(document.body, 'versionswitcher', 'div'); if (!$holder) return true; if ($holder.length==0) return true; var $buttons, $words, $var, $whole=false; if (hasClass($holder[0], 'wholedoc')) $whole=true; for (var $h=0; $h<$holder.length; $h++) { if (!$whole) $vers_current[$h]=0; $buttons=getInnerTags($holder[$h], 'versionbutton', 'span'); for (var $b=0; $b<$buttons.length; $b++) { for ($i=0; $i<$vers_var.length; $i++) { if (hasClass($buttons[$b], $vers_var[$i])) { $var=$i; break; } } $buttons[$b].id='var'+(($whole)?('W'):($h))+'-'+$i; if ($buttons[$b].addEventListener) $buttons[$b].addEventListener('click', pickVariant, false); else if ($buttons[$b].attachEvent)$buttons[$b].attachEvent('onclick', pickVariant); } if ($whole) break; } if ($whole) $vers_current=0; if ($whole) $holder=getInnerTags(document.body, 'versiondata', 'span'); for (var $h=0; $h<$holder.length; $h++) { $vers_glossary[$h]=new Array(); $buttons=getInnerTags($holder[$h], 'wordvariant', 'span'); for (var $b=0; $b<$buttons.length; $b++) { $words=$buttons[$b].innerHTML; $words=$words.split(','); if ($words.length==1) $words=multArray($words, 12); else if ($words.length==6) $words=multArray($words, 2); for ($i=0; $i<$vers_var.length; $i++) { if (hasClass($buttons[$b], $vers_var[$i])) $vers_glossary[$h][$i]=$words; } } } } function multArray($arr, $mult) { if ($mult==1) return $arr; var $result=new Array(); for (var $x=0; $x<$mult; $x++) for (var $i=0; $i<$arr.length; $i++) $result[$x*$arr.length+$i]=$arr[$i]; return $result; } function pickVariant(e) { if (!e) var e = window.event; var $button; if (e.target) $button = e.target; else if (e.srcElement) $button = e.srcElement; if ($button.tagName=='U') $button=$button.parentNode; var $id=$button.id.substr(3); $id=$id.split('-'); var $group=$id[0], $pick=$id[1]; if (($group!='W')&&($vers_current[$group]==$pick)) return true; if (($group=='W')&&($vers_current==$pick)) return true; var $varianted=getInnerTags(document.body, 'varianted', 'span'); for ($v=0; $v<$varianted.length; $v++) { for ($c=0; $c<12; $c++) { if (hasClass($varianted[$v], 'case'+$vers_cases[$c])) { if ($group=='W') { for (var $g=0; $g<$vers_glossary.length; $g++) { if ($varianted[$v].innerHTML==$vers_glossary[$g][$vers_current][$c]) { $varianted[$v].innerHTML=$vers_glossary[$g][$pick][$c]; break; } else if ($varianted[$v].innerHTML==ucfirst($vers_glossary[$g][$vers_current][$c])) { $varianted[$v].innerHTML=ucfirst($vers_glossary[$g][$pick][$c]); break; } } } else { if ($varianted[$v].innerHTML==$vers_glossary[$group][$vers_current[$group]][$c]) $varianted[$v].innerHTML=$vers_glossary[$group][$pick][$c]; else $varianted[$v].innerHTML=ucfirst($vers_glossary[$group][$pick][$c]); } } } } if ($group=='W') $vers_current=$pick; else $vers_current[$group]=$pick; } function ucfirst (str) { // Makes a string's first character uppercase // // version: 1008.1718 // discuss at: http://phpjs.org/functions/ucfirst // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: Onno Marsman // + improved by: Brett Zamir (http://brett-zamir.me) // * example 1: ucfirst('kevin van zonneveld'); // * returns 1: 'Kevin van zonneveld' str += ''; var f = str.charAt(0).toUpperCase(); return f + str.substr(1); }