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

Материал из Forex wiki
Перейти к: навигация, поиск
(Новая страница: «/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой ст…»)
 
 
Строка 1: Строка 1:
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
+
var customizeToolbar = function () {
// Wiki Linker
+
/* Your code goes here */
// Find link for selected text
+
 
+
// Toolbar buttons
+
 
+
var addOldToolbarButton = function() {
+
var $toolbar = $( '#gadget-toolbar' );
+
if ( !$toolbar.length ) {
+
$toolbar = $( '#toolbar' );
+
}
+
$( '<div>' )
+
.addClass( 'mw-toolbar-editbutton' )
+
.attr( 'id', 'mw-editbutton-gadget-wikilinker' )
+
.attr( 'alt', 'Wiki Linker' )
+
.attr( 'title', 'Wiki Linker. Підбирає вікіпосилання для виділеного слова чи фрази' )
+
.css( 'background-image', 'url(//upload.wikimedia.org/wikipedia/commons/a/ad/Wikilinker_toolbar.png) ' )
+
.appendTo( $toolbar )
+
.on( 'click', WikiLinker );
+
};
+
 
+
var addNewToolbarButton = function() {
+
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
+
'section': 'main',
+
'group': 'format',
+
'tools': {
+
'wikilinker': {
+
label: 'Wiki Linker. Підбирає вікіпосилання для виділеного слова чи фрази',
+
type: 'button',
+
icon: '//upload.wikimedia.org/wikipedia/commons/b/bd/Wikilinker.png',
+
action: {
+
type: 'callback',
+
execute: function() {
+
WikiLinker();
+
}
+
}
+
}
+
}
+
} );
+
 
};
 
};
  
 +
/* 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 ) {
 
if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
importScript( 'MediaWiki:Stemmer.js' );
+
mw.loader.using( 'user.options' ).then( function () {
mw.loader.using( [ 'user.options', 'jquery.textSelection' ], function () {
+
// This can be the string "0" if the user disabled the preference ([[phab:T54542#555387]])
if ( mw.user.options.get( 'usebetatoolbar' ) === 1 ) {
+
if ( mw.user.options.get( 'usebetatoolbar' ) == 1 ) {
if ( mw.user.options.get( 'showtoolbar' ) === 1 ) {
+
$.when(
$.when(
+
mw.loader.using( 'ext.wikiEditor' ), $.ready
mw.loader.using( ['ext.wikiEditor.toolbar', 'schema.Edit'] ),
+
).then( customizeToolbar );
$.ready
+
).then( addNewToolbarButton );
+
}
+
} else {
+
mw.loader.using( 'mediawiki.toolbar', function() {
+
$( addOldToolbarButton );
+
} );
+
 
}
 
}
 
} );
 
} );
}
 
 
function stemPhrase(phrase) {
 
  phrase=phrase.substr(0,100);
 
 
  phrase=phrase.replace(/\s/g, " ");
 
  phrase=phrase.replace(/—/g, " ");
 
  phrase=phrase.replace(/»/g, "");
 
  phrase=phrase.replace(/«/g, "");
 
  phrase=phrase.replace(/\%/g, "");
 
  phrase=phrase.replace(/\'/g, "");
 
  phrase=phrase.replace(/\"/g, "");
 
  phrase=phrase.replace(/_/g, " ");
 
  phrase=phrase.replace(/\!/g, " ");
 
  phrase=phrase.replace(/\?/g, " ");
 
  phrase=phrase.replace(/\./g, " ");
 
  phrase=phrase.replace(/\,/g, " ");
 
  phrase=phrase.replace(/\:/g, " ");
 
  phrase=phrase.replace(/\s+/g, " ");
 
 
  var rustemmer = new RussianStemmer();
 
 
  var arr = phrase.split(' ')
 
  var res = '';
 
  var next_res = '';
 
 
  var n = 0;
 
 
  for (var i in arr) {
 
      rustemmer.setCurrent(arr[i]);
 
      rustemmer.stem();
 
      next_res = rustemmer.getCurrent();
 
      if (next_res.length > 0) {
 
        if (next_res != arr[i] && n < 3) {
 
          res += next_res + '* ';
 
          n++; // у рядку запита може бути не більше 3 зірочок
 
        }
 
        else {
 
          res += next_res + ' ';
 
        }
 
      }
 
  }
 
 
  // trim string
 
  res = res.replace(/(^\s+)|(\s+$)/g, "");
 
 
  return res;
 
}
 
 
function WikiLinker() {
 
 
    var xmlhttp;
 
    var prepWin;
 
 
    var CantWork = 'Спочатку потрібно виділити слово чи фразу';
 
    var range;
 
    var browserType = 0;
 
 
    var requestLength = 0; // довжина у словах
 
 
    var txt = '';
 
    var wpTextbox1 = document.editform.wpTextbox1;
 
 
    var winScroll = document.documentElement.scrollTop;
 
 
    wpTextbox1.focus();
 
 
    if (typeof wpTextbox1.selectionStart != 'undefined') { // Modern browsers
 
        browserType = 1;
 
 
        var textScroll = wpTextbox1.scrollTop;
 
        var startPos = wpTextbox1.selectionStart;
 
        var endPos = wpTextbox1.selectionEnd;
 
        txt = wpTextbox1.value.substring(startPos, endPos);
 
 
        // «відсікаємо» останній пробіл
 
        if (txt.slice(-1) == ' ') {
 
          txt = txt.slice(0,-1);
 
          endPos = endPos - 1;
 
        }
 
 
        if (txt == '') {
 
            alert(CantWork);
 
        }
 
        else {
 
            processText();
 
        }
 
        wpTextbox1.selectionStart = startPos;
 
        wpTextbox1.selectionEnd = startPos + txt.length;
 
        wpTextbox1.scrollTop = textScroll;
 
    } else if (document.selection && document.selection.createRange) { //IE
 
        browserType = 2;
 
 
        range = document.selection.createRange();
 
        txt = range.text;
 
 
        // «відсікаємо» останній пробіл
 
        if (txt.slice(-1) == ' ') {
 
          txt = txt.slice(0,-1);
 
          range.moveEnd('character', -1);
 
        }
 
 
        if (txt == '') {
 
            alert(CantWork);
 
        }
 
        else {
 
            processText();
 
        }
 
    } else { // other browsers
 
        alert(CantWork);
 
    }
 
 
    document.documentElement.scrollTop = winScroll // scroll back, for IE/Opera
 
 
    function processText() {
 
        var preparedText = stemPhrase(txt);
 
 
        requestLength = preparedText.split(' ').length;
 
 
        loadXMLDoc(mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&list=search&srlimit=5&srprop=&srredirects=1&format=json&srsearch=' + preparedText);
 
    }
 
 
    function loadXMLDoc(url) {
 
        xmlhttp = GetXmlHttpObject();
 
        if (xmlhttp == null) {
 
            alert("Your browser does not support XMLHTTP!");
 
            return;
 
        }
 
        xmlhttp.onreadystatechange = stateChanged;
 
        xmlhttp.open("GET", url, true);
 
        xmlhttp.send(null);
 
    }
 
 
    function GetXmlHttpObject() {
 
        if (window.XMLHttpRequest) {
 
            // code for IE7+, Firefox, Chrome, Opera, Safari
 
            return new XMLHttpRequest();
 
        }
 
        if (window.ActiveXObject) {
 
            // code for IE6, IE5
 
            return new ActiveXObject("Microsoft.XMLHTTP");
 
        }
 
        return null;
 
    }
 
 
    // порівняння за довжиною рядка, без врахування уточнення у дужках
 
    // щоб для "Категорі*" видавалося "Категорія (значення)", а не "Класифікація"
 
    function compareStringLengths (a, b) {
 
      a = a.replace(/ \(.*\)/g, "");
 
      b = b.replace(/ \(.*\)/g, "");
 
 
      if ( a.length < b.length ) return -1;
 
      if ( a.length > b.length ) return 1;
 
      return 0;
 
    }
 
 
    function initialLower(str) {
 
      return str.substr(0, 1).toLowerCase() + str.substr(1);
 
    }
 
 
    function stateChanged() {
 
        if (xmlhttp.readyState == 4) {
 
            if (xmlhttp.status == 200) {
 
                var resp = eval('(' + xmlhttp.responseText + ')');
 
               
 
                if (typeof resp.query.search[0] != 'undefined') {
 
 
                  var page_name = resp.query.search[0].title;
 
 
                  // якщо у запиті було тільки одне слово, то вибираємо найбільш коротку назву з перших трьох результатів
 
                  // щоб для "Англією" видавало "Англія", а не "Англіканство"
 
 
                  if (requestLength == 1) {
 
                      var resar = [];
 
                 
 
                      for (var j=0;j<=4;j++) {
 
                        if (typeof resp.query.search[j] != 'undefined' && txt.substr(0,3).toLowerCase() == resp.query.search[j].title.substr(0,3).toLowerCase() ) {
 
                            resar.push(resp.query.search[j].title);
 
                        }
 
                      }
 
                 
 
                      resar.sort(compareStringLengths);
 
                 
 
                      if (typeof resar[0] != 'undefined') {
 
                        page_name = resar[0]
 
                      }
 
                  }
 
 
                  // для "форуми" буде "[[форум]]и", а не "[[форум|форуми]]"
 
                  if ( initialLower(txt.substr(0, page_name.length)) == initialLower(page_name)  &&  page_name.length <= txt.length) {
 
                      txt = '[[' + txt.substr(0, page_name.length) + ']]' + txt.substr(page_name.length, txt.length - page_name.length) ;
 
                  }
 
                  else {
 
                      txt = '[[' + page_name + '|' + txt + ']]';
 
                  }
 
                }
 
                else {
 
                  txt = '[[' + '|' + txt + ']]';
 
                }
 
 
              if (browserType == 1) { //Mozilla/Opera/Safari3
 
                  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 (browserType == 2) { //IE
 
                    range.text = txt;
 
 
              } else { // other browsers
 
                  alert(CantWork);
 
              }
 
 
            }
 
        }
 
    }
 
 
}
 
}

Текущая версия на 14:41, 17 февраля 2018

var customizeToolbar = function () {
	/* Your code goes here */
};
 
/* 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 ) {
	mw.loader.using( 'user.options' ).then( function () {
		// This can be the string "0" if the user disabled the preference ([[phab:T54542#555387]])
		if ( mw.user.options.get( 'usebetatoolbar' ) == 1 ) {
			$.when(
				mw.loader.using( 'ext.wikiEditor' ), $.ready
			).then( customizeToolbar );
		}
	} );
}