MediaWiki:Common.js — различия между версиями
Материал из ПокеВики
EvilCat (обсуждение | вклад) |
EvilCat (обсуждение | вклад) м |
||
(не показано 35 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ | /* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ | ||
− | + | ||
− | var | + | function addOnloadHook(func) |
− | var | + | { |
− | if (! | + | $(func); |
− | var | + | } |
− | + | ||
− | i. | + | document.domain='pokeliga.com' |
− | i. | + | if ( (window.top==window) || ((window.top!=window)&&(window.top.location.host!='pokeliga.com')) ) |
− | + | window.location.href='http://pokeliga.com/pokewiki.php#'+window.location.pathname.substring(1)+window.location.search; | |
− | + | ||
+ | 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 ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) { | ||
+ | mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' ); | ||
+ | } | ||
+ | |||
+ | var customizeToolbar = function() { | ||
+ | |||
+ | $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', { | ||
+ | 'section': 'main', | ||
+ | 'group': 'format', | ||
+ | 'tools': { | ||
+ | 'wikify': { | ||
+ | label: 'Викификатор', | ||
+ | type: 'button', | ||
+ | icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', | ||
+ | action: { | ||
+ | type: 'callback', | ||
+ | execute: function(context){ | ||
+ | Wikify(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } ); // wikiEditor | ||
+ | |||
+ | } // customizeToolbar | ||
+ | |||
+ | /* Check if view is in edit mode and that the required modules are available. Then, customize the toolbar … */ | ||
+ | if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { | ||
+ | $.when(mw.loader.using( 'ext.wikiEditor' ), $.ready).then( customizeToolbar ); | ||
+ | } | ||
+ | |||
+ | |||
+ | //Кнопки быстрого описания правки | ||
+ | |||
+ | //список кнопок | ||
+ | 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 | ||
} | } | ||
− | if ( | + | |
− | + | 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); | ||
+ | } | ||
+ | |||
+ | if (window.parent) | ||
+ | { | ||
+ | var syncHash = function() | ||
+ | { | ||
+ | var hash; | ||
+ | hash = window.location.pathname.substring(1) + window.location.search + window.location.hash; | ||
+ | window.parent.postMessage({ hash: hash }, 'http://pokeliga.com'); | ||
+ | } | ||
+ | |||
+ | var syncHeight = function() | ||
+ | { | ||
+ | var height; | ||
+ | height = document.body.scrollHeight; | ||
+ | window.parent.postMessage({ height: height }, 'http://pokeliga.com'); | ||
+ | } | ||
+ | |||
+ | addOnloadHook(syncHash); | ||
+ | addOnloadHook(syncHeight); | ||
+ | |||
+ | window.addEventListener('hashchange', syncHash); | ||
+ | } // if (window.parent) |
Текущая версия на 13:38, 17 марта 2018
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ function addOnloadHook(func) { $(func); } document.domain='pokeliga.com' if ( (window.top==window) || ((window.top!=window)&&(window.top.location.host!='pokeliga.com')) ) window.location.href='http://pokeliga.com/pokewiki.php#'+window.location.pathname.substring(1)+window.location.search; 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 ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) { mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' ); } var customizeToolbar = function() { $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', { 'section': 'main', 'group': 'format', 'tools': { 'wikify': { label: 'Викификатор', type: 'button', icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', action: { type: 'callback', execute: function(context){ Wikify(); } } } } } ); // wikiEditor } // customizeToolbar /* Check if view is in edit mode and that the required modules are available. Then, customize the toolbar … */ if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { $.when(mw.loader.using( 'ext.wikiEditor' ), $.ready).then( customizeToolbar ); } //Кнопки быстрого описания правки //список кнопок 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); } if (window.parent) { var syncHash = function() { var hash; hash = window.location.pathname.substring(1) + window.location.search + window.location.hash; window.parent.postMessage({ hash: hash }, 'http://pokeliga.com'); } var syncHeight = function() { var height; height = document.body.scrollHeight; window.parent.postMessage({ height: height }, 'http://pokeliga.com'); } addOnloadHook(syncHash); addOnloadHook(syncHeight); window.addEventListener('hashchange', syncHash); } // if (window.parent)