MediaWiki:Common.js: различия между версиями

Материал из Русского эксперта
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 159 промежуточных версий 6 участников)
Строка 1: Строка 1:
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
/****************************/
/* Вкладка «Новая страница» */
/****************************/
// Добавляет вкладку «Новая страница» для упрощения создания новых страниц
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz
$(document).ready(function() {
    // Чтобы не было путаницы, во время редактирования вкладку не показываем
    if (window.location.search.includes('action=edit')) {
        return; // Выходим из скрипта, если находим параметр action=edit
    }


/* Викификатор */
    // Ищем элемент вкладки "Обсуждение"
function addWikifButton(){
    var discussionTab = $('#ca-talk');
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/wikisource/ru/d/d1/Button-wikifikator.png'
i.alt = i.title = 'Викификатор'
i.onclick = Wikify
i.style.cursor = 'pointer'
toolbar.appendChild(i)
}
if (document.URL.indexOf('action=edit') > 0 || document.URL.indexOf('action=submit') > 0) {
document.write('<script type="text/javascript" src="http://ru.wikipedia.org/w/index.php?title=MediaWiki:Wikificator.js&action=raw&ctype=text/javascript"><\/script>')
addOnloadHook(addWikifButton)
}


/* Кнопки «Поделиться» от Яндекса */
    // Добавляем вкладку "Новая страница"
    var newTab = $('<li>', {
        id: 'ca-new-page',
        class: 'mw-list-item'
    }).append($('<a>', {
        href: '#', // Заглушка для ссылки
        text: 'Новая страница',
        click: function(event) {
            event.preventDefault(); // Предотвращаем стандартный переход по ссылке


if (wgAction == 'view') {
            // Вопрос пользователю
            var pageName = prompt('Введите название новой страницы:');
$.getScript('http://ruxpert.ru/skins/common/share.js', function( d, h, i ) { new Ya.share({
           
        element: 'sharingbuttons',
            if (pageName !== null && pageName.trim() !== '') {
            elementStyle: {
                 // Формируем URL для новой страницы
                 'type': 'button',
                 var encodedPageName = encodeURIComponent(pageName.trim()); // Кодируем символы для URL
                 'border': true,
                 // Открываем форму создания новой страницы
                 'quickServices': ['lj', 'twitter', 'vkontakte', 'facebook', 'gplus', 'yaru', 'moimir']
                 window.location.href = '/index.php?title=' + encodedPageName + '&action=edit';
            },
            }
            link: 'http://ruxpert.ru/' + wgPageName,
            title: wgTitle,
            popupStyle: {
                 blocks: {
                    'Поделись-ка!': ['lj', 'twitter', 'vkontakte', 'facebook', 'gplus', 'yaru', 'moimir'],
                },
                copyPasteField: true
            },
            serviceSpecific: {
                lj: {
                    link: '<a href="http://ruxpert.ru/' + wgPageName + '">' + wgPageName + ' - Русский эксперт</a>'
              }
         }
         }
});} );
    }));
 
    // Вставляем новую вкладку после вкладки "Обсуждение"
    discussionTab.after(newTab);
});
 
 
 
/*            */
/* Ссылкоправ */
/*            */
// Исправляет все внутристатейные ссылки типа #.D0.92.D0.BE на русский текст
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz


if( (wgNamespaceNumber != 0 && wgNamespaceNumber != 6 && wgNamespaceNumber != 100)
// Раскодирует единичную ссылку типа #.D0.92.D0.BE
      || wgAction != 'view' || /(oldid|diff)=/.test(window.location) ) return;
function decodeSingleURL(link) {
  $('#firstHeading').prepend( '<div style="font-size: 14px" id="sharingbuttons"></div>' );
    var originalLink = link;
}
    var parts = link.split('|'); // Разбиваем на части по символу "|"
    var urlPart = parts[0]; // Часть ссылки до "|"
    var hashParts = urlPart.split('#'); // Разбиваем часть ссылки до "|" на части по символу "#"


/* Таблификатор */
    if (hashParts.length > 1) {
        // Замена точек на процент-кодирование, только если за точкой следуют два шестнадцатеричных символа
        var encodedHash = hashParts[1].replace(/\.(?=[A-F0-9]{2})/gi, '%');


//Форматирует таблицу, скопированную из Excel, по правилам вики-разметки.
        // Попытка декодирования части URL после "#"
//Часть кода позаимствована из http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
        try {
//Автор: X-romix
            hashParts[1] = decodeURIComponent(encodedHash);
        } catch (e) {
var XRomix_Tablify_CantWork1 = 'Таблификатор не может работать в вашем браузере.\n\nTablificator cannot work in your browser' // английский текст для тех, кто не видит русские буквы
            // В случае ошибки декодирования, флаг успешного раскодирования остается false,
var XRomix_Tablify_FullText1 = 'Эта кнопка предназначена для форматирования табличного текста, скопированного из табличного редактора (например, из Excel). Чтобы функция заработала, сначала выделите нужный фрагмент текста в окне редактирования.'
            // это нужно для правильного подсчёта числа раскодированных ссылок.
            // Правильное кодирование: ".20", ".D0.80"
//Добавляет кнопку
            // Неправильное кодирование: ".ы", ".D1.8" (После .D0 и .D1 должна обязательно идти вторая часть кода символа)
function addTablifikatorButton1(){
            console.log("Ссылкоправ: не могу расшифровать URL " + encodedHash);
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
    var decodedUrlPart = hashParts.join('#');
    parts[0] = decodedUrlPart; // Обновляем первую часть с декодированной информацией
}else if (document.selection && document.selection.createRange) { //IE
 
    // Собираем обратно все части ссылки, разделенные "|"
  var range = document.selection.createRange()
    var decodedLink = parts.join('|');
  txt = range.text
 
  if (txt == '') {alert(XRomix_Tablify_FullText1); return}
    // Возвращаем измененную ссылку только если она изменилась
  else{
    return (decodedLink !== originalLink) ? decodedLink : null;
    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";
    }
}
  }
}
}


//Scripts for supporting extension http://www.mediawiki.org/wiki/Extension:HarvardReferences
// Находит все ссылки типа [[…]] и передаёт их по одной в decodeSingleURL
function decode_links() {
var HrvHighlight = new function(){
    var textarea = document.getElementById('wpTextbox1');
    var editText = textarea.value;
var state = "";
 
    // Сохранение текущей позиции курсора
function setBackground(prm_name){
    var cursorPosition = textarea.selectionStart;
        var anchorTags = document.getElementsByTagName("li");
 
        for (var i = 0; i < anchorTags.length ; i++){
    var decodedCount = 0;
                var ob1=anchorTags[i];
 
                if(ob1.className=="harvBackground"){
    // Регулярное выражение для поиска всех ссылок
                        ob1.className = "";
    var regex = /\[\[([^\]]+)\]\]/g;
                }
   
        }
    // Применение функции декодирования к каждой ссылке
    var decodedText = editText.replace(regex, function(match, linkContent) {
        var anchorTags = document.getElementsByTagName("sup");
        var decodedLink = decodeSingleURL(linkContent);
        for (var i = 0; i < anchorTags.length ; i++){
        if (decodedLink !== null) {
                var ob1=anchorTags[i];
            decodedCount++;
                if(ob1.id.indexOf("harv_note-"+prm_name)==0){
            return '[[' + decodedLink + ']]'; // Убрали пробелы вокруг ссылки
                        ob1.parentNode.className = "harvBackground";
                }else if(ob1.id.indexOf("harv_note-")==0){
                        ob1.parentNode.className = "";
                }
         }
         }
        return match;
    });
    // Обновление текста в textarea
    textarea.value = decodedText;
    // Восстановление позиции курсора
    textarea.selectionStart = textarea.selectionEnd = cursorPosition;
    var finalMessage = decodedCount === 0
        ? "Закодированных ссылок не найдено."
        : "Раскодировано ссылок: " + decodedCount;
    alert(finalMessage);
}
}
 
// Вешает кнопку Ссылкоправа на панель инструментов (это часть скрипта выше)
function setBackground1(prm_name, prm_n){
mw.loader.using(['mediawiki.util', 'mediawiki.user'], function () {
         var anchorTags = document.getElementsByTagName("sup");
    setTimeout(function() {
         for (var i = 0; i < anchorTags.length ; i++){
         var formatGroup = document.querySelector('.wikiEditor-ui-toolbar .group.group-format');
                var ob1=anchorTags[i];
         if (!formatGroup) {
                if(ob1.id.indexOf("harv_note-")==0){
            // Выходим, если панели инструментов нет на странице, то есть мы не в режиме редактирования
                        ob1.parentNode.className = "";
            //console.error('Format group not found');
                }
            return;
         }
         }
         var anchorTags = document.getElementsByTagName("li");
 
         for (var i = 0; i < anchorTags.length ; i++){
        // Создание новой кнопки
                var ob1=anchorTags[i];
         var button = document.createElement('span');
                if(ob1.className=="harvBackground"){
         button.className = 'tool oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-buttonWidget';
                        ob1.className = "";
        button.innerHTML = '<a class="oo-ui-buttonElement-button" role="button" title="Ссылкоправ" tabindex="0" rel="nofollow">' +
                }
            '<span class="oo-ui-iconElement-icon" style="background-image: url(\'https://ruxpert.ru/images/7/72/Ссылкоправ.jpg\');"></span>' +
            '<span class="oo-ui-labelElement-label"></span>' +
                if(ob1.id.indexOf("cite_note-"+prm_name+"-"+prm_n)==0){
            '</a>';
                        ob1.className = "harvBackground";
 
                }else if(ob1.id.indexOf("cite_note-")==0){
        // Добавление обработчика клика для вызова функции decode_links
                        ob1.className = "";
        button.onclick = function() {
                }
            decode_links();
        }
        };
 
        // Добавление кнопки в группу форматирования
        formatGroup.appendChild(button);
    }, 1000);
});
 
 
/*                        */
/* WikiEditor/Викификатор */
/*                        */
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' );
}
}
 
function setBackground2(prm_name){
var customizeToolbar = function() {
   
        var n="";
    $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
         'section': 'advanced',
        var arr=prm_name.split("-");
        'group': 'format',
         var arr1=arr[1].split("_");
         'tools': {
            'wikify': {
         if(arr[2]){
                 label: 'Викификатор',
                n="cite_note-"+arr1[0]+"-"+arr1[1];
                type: 'button',
        }else{
                icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
                 n="cite_note-"+arr[1];
                 action: {
        }
                    type: 'callback',
                    execute: function(context){
        var anchorTags = document.getElementsByTagName("li");
                         Wikify();
        for (var i = 0; i < anchorTags.length ; i++){
                    }
                var ob1=anchorTags[i];
                 if(ob1.className=="harvBackground"){
                        ob1.className = "";
                }
                if(ob1.id.indexOf("cite_note-")==0){
                         if(ob1.id==n){
                                ob1.className = "harvBackground";
                        }else{
                                ob1.className = "";
                        }
                 }
                 }
            }
         }
         }
    } );
}
};
 
//when user clicks to harv ref in article text
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
function whenUserClicksToHarvRef(prm_name, prm_n){
    mw.loader.using( 'user.options', function () {
        var anchorTags = document.getElementsByTagName("a");
         if ( mw.user.options.get('usebetatoolbar') ) {
        for (var i = 0; i < anchorTags.length ; i++){
            mw.loader.using( 'ext.wikiEditor.toolbar', function () {
                var ob1=anchorTags[i];
                 $(document).ready( customizeToolbar );
                if(ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink"){
            } );
                        ob1.className = "";
                }
        }
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.id=="harv_ref-"+prm_name+"-"+prm_n){
                        ob1.className = "harvVisitedLink";
                }else if(ob1.id=="harv_note-"+prm_name+"-"+prm_n){     
                        ob1.className = "harvReferenceLink";
                }else if(ob1.id=="harv_note-"+prm_name){       
                        ob1.className = "harvReferenceLink";
                }else{ 
                        ob1.className = "";
                }
        }
        setBackground(prm_name);
}
//when user clicks to big backlink from bibliography
function whenUserClicksToHarvBigBacklink(prm_name){
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink"){
                        ob1.className = "";
                }
        }
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink"){
                        ob1.className = "";
                }
                if(ob1.id.indexOf("harv_ref-"+prm_name+"-")==0){
                        ob1.className = "harvVisitedLink";
                }else if(ob1.id=="harv_note-"+prm_name){
                        ob1.className = "harvReferenceLink";
                }
        }
        setBackground(prm_name);
}
//when user clicks to small (number) backlink from bibliography
function whenUserClicksToHarvSmallBacklink(prm_name, prm_n){
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink"){
                        ob1.className = "";
                }
        }
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink"){
                        ob1.className = "";
                }
                if(ob1.id=="harv_ref-"+prm_name+"-"+prm_n){
                        ob1.className = "harvVisitedLink";
                }else if(ob1.id=="harv_note-"+prm_name){
                        ob1.className = "harvReferenceLink";
                }else if(ob1.id=="harv_note-"+prm_name+"-"+prm_n){
                        ob1.className = "harvReferenceLink";
                }
        }
        setBackground(prm_name);
}
function showRefsMode(n){
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.id.indexOf("harv_ref-")==0){
                        if(n==""){
                                ob1.style.display = "";
                                ob2=ob1.childNodes[0];
                                ob3=ob2.childNodes[0];
                                if(ob3.nodeValue.indexOf("*")>=0){
                                        t=ob2.title;
                                        ob3.nodeValue=t;
                                };
                        }else if(n=="hide"){
                                ob1.style.display = "none";
                        }else if (n=="short"){
                                ob1.style.display = "";
                                ob2=ob1.childNodes[0];
                                ob3=ob2.childNodes[0];
                                var t=ob3.nodeValue;
                                if(ob1.childNodes.length>1){
                                        var p=ob1.childNodes[1].nodeValue;
                                        t=t+ob1.childNodes[1].nodeValue;
                                        ob1.childNodes[1].nodeValue="";
                                }
                                ob2.title=t;
                                ob3.nodeValue="* ";
                        }else{ 
                                ob1.style.display = "";
                        }
                }
        }
}
this.changeFormat = function(){
        var s=state;
        if(s==""){
                s="short";
        }else if(s=="short"){ 
                s="hide";
        }else if(s=="hide"){   
                s="";
        }
        state=s;
        showRefsMode(s);
}
//when user clicks to ref in article text whenUserClicksToRef
function whenUserClicksToRef(prm_name, prm_n){
        var anchorTags = document.getElementsByTagName("sup");
        //alert('"#cite_ref'+prm_name+'-'+prm_n+'"');
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                //alert(ob1.id+"==="+ob1.id.indexOf('cite_ref-'));
                if(ob1.id.indexOf("cite_ref-")==0){   
                        if(ob1.id=="cite_ref"+prm_name+"-"+prm_n){
                                ob1.className = "harvVisitedLink";
                        }else{ 
                                ob1.className = "harvNone";
                        }
                }else if(ob1.id.indexOf("harv_ref-")==0){     
                        ob1.className = "";
                }else if(ob1.id.indexOf("harv_note-")==0){     
                        ob1.className = "";
                }
        }
        //setBackground(prm_name);
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                var h=ob1.href;
                var p=h.lastIndexOf("#");
                if(p==-1) continue;
                var h=h.substring(p, h.length);
                if(h.indexOf("#cite_ref-")==0){  
                        if(h == "#cite_ref"+prm_name+"-"+prm_n){       
                                ob1.className = "harvReferenceLink";
                        }else{ 
                                ob1.className = "";
                        }
                }
        }
        setBackground1(prm_name, prm_n);
}
function handler1(id){
        var arr=id.split("-");
        whenUserClicksToHarvRef(arr[1], arr[2]);
}
function handler2(id){
        var arr=id.split("-");
        if(arr[2]){
                whenUserClicksToHarvSmallBacklink(arr[1], arr[2]);
        }else{
                whenUserClicksToHarvBigBacklink(arr[1]);
        }
}
function handler3(id){
        var arr=id.split("-");
         if(arr[2]){
                whenUserClicksToRef("-"+arr[1], arr[2]);
        }else{
                whenUserClicksToRef("", arr[1]);
        }
}
function handler4(id, h){
        var p=h.lastIndexOf("#");
        if(p==-1) return;
        var h=h.substring(p+1, h.length);
        whenUserClicksToBackRef(h);
}
//when user clicks to ref in article text whenUserClicksToRef
function whenUserClicksToBackRef(prm_href){
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                if(ob1.className == "harvReferenceLink"){
                        ob1.className = "";
                }
                if(ob1.className == "harvVisitedLink"){
                        ob1.className = "";
                }
                if(ob1.id.indexOf("cite_ref-")==0){   
                        if(ob1.id==prm_href){
                                ob1.className = "harvVisitedLink";
                        }else{ 
                                ob1.className = "";
                        }
                }
        }
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length ; i++){
                var ob1=anchorTags[i];
                var h=ob1.href;
                var p=h.lastIndexOf("#");
                if(p==-1) continue;
                var h=h.substring(p, h.length);
                if(h.indexOf("#cite_ref-")==0){  
                        if(h == "#"+prm_href){ 
                                ob1.className = "harvReferenceLink";
                        }else{ 
                                ob1.className = "";
                        }
                 }
        }
        setBackground2(prm_href);
}
//Main function on load page
this.onLoad = function(){
        if (wgAction=="view"){ //only for view pages
                var ok=0;
                //install events
                var anchorTags = document.getElementsByTagName("a");
                for (var i = 0; i < anchorTags.length ; i++){
                        var ob1=anchorTags[i];
                        if(ob1.href.indexOf("#harv_note-")>=0){
                                ob1.onclick= function(){handler1(this.parentNode.id)};
                        }else if(ob1.href.indexOf("#harv_ref-")>=0){
                                ob1.onclick= function(){handler2(this.parentNode.id)};
                                ok=1;
                        }else if(ob1.href.indexOf("#cite_note-")>=0){
                                ob1.onclick= function(){handler3(this.parentNode.id)};
                                ok=1;
                        }else if(ob1.href.indexOf("#cite_ref-")>=0){
                                ob1.onclick= function(){handler4(this.parentNode.id, this.href)};
                                ok=1;
                        }
                }
                //install the portlet
                if(ok==1){
                        var hist; var url;
                        if (!(hist = document.getElementById('ca-history') )) return;
                        if (!(url = hist.getElementsByTagName('a')[0] )) return;
                        if (!(url = url.href )) return;
                        addPortletLink('p-cactions', 'javascript:HrvHighlight.changeFormat();',
                                                  'links', 'ca-harvrefs', 'Change format of harvard references', '');
                        var s=state;
                        if(s!="") showRefsMode(s);
                }
         }
         }
    } );
};
/*************************/
/* Реклама Яндекс Директ */
/*************************/
/* Реклама Яндекса не должна показываться на страницах редактирования статей, обсуждения статей и участников, страницах участников, служебных страницах, страницах с историей правок. */
var path = decodeURIComponent(window.location.pathname);
if(path.indexOf("Участник:") === -1 && path.indexOf("Обсуждение") === -1 &&
  path.indexOf("index.php") === -1 && path.indexOf("Служебная:") === -1 &&
  path.indexOf("help.php") === -1 && path.indexOf("MediaWiki:") === -1) {
/* Блок 1 */
(function() {
$('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>');
})();
(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-1",
renderTo: "yandex_rtb_R-A-446933-1",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");
/* Блок 2 */
(function() {
$('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>');
})();
(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-2",
renderTo: "yandex_rtb_R-A-446933-2",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");
}
}
}//obj
//Script is starting here
if (doneOnloadHook) HrvHighlight.onLoad()
else addOnloadHook(HrvHighlight.onLoad);

Текущая версия от 21:57, 2 октября 2024

/****************************/
/* Вкладка «Новая страница» */
/****************************/
// Добавляет вкладку «Новая страница» для упрощения создания новых страниц
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz
$(document).ready(function() {
    // Чтобы не было путаницы, во время редактирования вкладку не показываем
    if (window.location.search.includes('action=edit')) {
        return; // Выходим из скрипта, если находим параметр action=edit
    }

    // Ищем элемент вкладки "Обсуждение"
    var discussionTab = $('#ca-talk');

    // Добавляем вкладку "Новая страница"
    var newTab = $('<li>', {
        id: 'ca-new-page',
        class: 'mw-list-item'
    }).append($('<a>', {
        href: '#', // Заглушка для ссылки
        text: 'Новая страница',
        click: function(event) {
            event.preventDefault(); // Предотвращаем стандартный переход по ссылке

            // Вопрос пользователю
            var pageName = prompt('Введите название новой страницы:');
            
            if (pageName !== null && pageName.trim() !== '') {
                // Формируем URL для новой страницы
                var encodedPageName = encodeURIComponent(pageName.trim()); // Кодируем символы для URL
                // Открываем форму создания новой страницы
                window.location.href = '/index.php?title=' + encodedPageName + '&action=edit';
            }
        }
    }));

    // Вставляем новую вкладку после вкладки "Обсуждение"
    discussionTab.after(newTab);
});



/*            */
/* Ссылкоправ */
/*            */
// Исправляет все внутристатейные ссылки типа #.D0.92.D0.BE на русский текст
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz

// Раскодирует единичную ссылку типа #.D0.92.D0.BE
function decodeSingleURL(link) {
    var originalLink = link;
    var parts = link.split('|'); // Разбиваем на части по символу "|"
    var urlPart = parts[0]; // Часть ссылки до "|"
    var hashParts = urlPart.split('#'); // Разбиваем часть ссылки до "|" на части по символу "#"

    if (hashParts.length > 1) {
        // Замена точек на процент-кодирование, только если за точкой следуют два шестнадцатеричных символа
        var encodedHash = hashParts[1].replace(/\.(?=[A-F0-9]{2})/gi, '%');

        // Попытка декодирования части URL после "#"
        try {
            hashParts[1] = decodeURIComponent(encodedHash);
        } catch (e) {
            // В случае ошибки декодирования, флаг успешного раскодирования остается false,
            // это нужно для правильного подсчёта числа раскодированных ссылок.
            // Правильное кодирование: ".20", ".D0.80"
            // Неправильное кодирование: ".ы", ".D1.8" (После .D0 и .D1 должна обязательно идти вторая часть кода символа)
            console.log("Ссылкоправ: не могу расшифровать URL " + encodedHash);
        }
    }

    // Собираем обратно часть ссылки
    var decodedUrlPart = hashParts.join('#');
    parts[0] = decodedUrlPart; // Обновляем первую часть с декодированной информацией

    // Собираем обратно все части ссылки, разделенные "|"
    var decodedLink = parts.join('|');

    // Возвращаем измененную ссылку только если она изменилась
    return (decodedLink !== originalLink) ? decodedLink : null;
}

// Находит все ссылки типа [[…]] и передаёт их по одной в decodeSingleURL
function decode_links() {
    var textarea = document.getElementById('wpTextbox1');
    var editText = textarea.value;

    // Сохранение текущей позиции курсора
    var cursorPosition = textarea.selectionStart;

    var decodedCount = 0;

    // Регулярное выражение для поиска всех ссылок
    var regex = /\[\[([^\]]+)\]\]/g;
    
    // Применение функции декодирования к каждой ссылке
    var decodedText = editText.replace(regex, function(match, linkContent) {
        var decodedLink = decodeSingleURL(linkContent);
        if (decodedLink !== null) {
            decodedCount++;
            return '[[' + decodedLink + ']]'; // Убрали пробелы вокруг ссылки
        }
        return match;
    });

    // Обновление текста в textarea
    textarea.value = decodedText;

    // Восстановление позиции курсора
    textarea.selectionStart = textarea.selectionEnd = cursorPosition;

    var finalMessage = decodedCount === 0
        ? "Закодированных ссылок не найдено."
        : "Раскодировано ссылок: " + decodedCount;

    alert(finalMessage);
}

// Вешает кнопку Ссылкоправа на панель инструментов (это часть скрипта выше)
mw.loader.using(['mediawiki.util', 'mediawiki.user'], function () {
    setTimeout(function() {
        var formatGroup = document.querySelector('.wikiEditor-ui-toolbar .group.group-format');
        if (!formatGroup) {
            // Выходим, если панели инструментов нет на странице, то есть мы не в режиме редактирования
            //console.error('Format group not found');
            return;
        }

        // Создание новой кнопки
        var button = document.createElement('span');
        button.className = 'tool oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-buttonWidget';
        button.innerHTML = '<a class="oo-ui-buttonElement-button" role="button" title="Ссылкоправ" tabindex="0" rel="nofollow">' +
            '<span class="oo-ui-iconElement-icon" style="background-image: url(\'https://ruxpert.ru/images/7/72/Ссылкоправ.jpg\');"></span>' +
            '<span class="oo-ui-labelElement-label"></span>' +
            '</a>';

        // Добавление обработчика клика для вызова функции decode_links
        button.onclick = function() {
            decode_links();
        };

        // Добавление кнопки в группу форматирования
        formatGroup.appendChild(button);
    }, 1000);
});


/*                        */
/* WikiEditor/Викификатор */
/*                        */
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': 'advanced',
        '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();
                    }
                }
            }
        }
    } );
};

if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
    mw.loader.using( 'user.options', function () {
        if ( mw.user.options.get('usebetatoolbar') ) {
            mw.loader.using( 'ext.wikiEditor.toolbar', function () {
                $(document).ready( customizeToolbar );
            } );
        }
    } );
};

/*************************/
/* Реклама Яндекс Директ */
/*************************/

/* Реклама Яндекса не должна показываться на страницах редактирования статей, обсуждения статей и участников, страницах участников, служебных страницах, страницах с историей правок. */

var path = decodeURIComponent(window.location.pathname);
if(path.indexOf("Участник:") === -1 && path.indexOf("Обсуждение") === -1 &&
   path.indexOf("index.php") === -1 && path.indexOf("Служебная:") === -1 &&
   path.indexOf("help.php") === -1 && path.indexOf("MediaWiki:") === -1) {

/* Блок 1 */

(function() {
 $('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>');
})();

(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-1",
renderTo: "yandex_rtb_R-A-446933-1",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");

/* Блок 2 */

(function() {
 $('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>');
})();

(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-2",
renderTo: "yandex_rtb_R-A-446933-2",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");

}