MediaWiki:Gadget-wikilinker.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
// Wiki Linker
// Find link for selected text

// Toolbar buttons

var addOldToolbarButton = function() {
  if(mw.toolbar) {
    mw.toolbar.addButton({onClick: WikiLinker , imageFile: '//upload.wikimedia.org/wikipedia/commons/a/ad/Wikilinker_toolbar.png', speedTip: 'Wiki Linker'});
  }
};

var addNewToolbarButton = function() {
	$( '#wpTextbox1' ).on( 'wikiEditor-toolbar-doneInitialSections', 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();
						}
					}
				}
			}
		});
	});
};

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 requestLength = 0; // довжина у словах

    var txt = '';
    const $wpTextbox1 = $('#wpTextbox1');

    var winScroll = document.documentElement.scrollTop;

    $wpTextbox1.focus();

    txt = $wpTextbox1.textSelection( 'getSelection' );

    txt = txt.trim();
    
    if (txt == '') {
        alert(CantWork);
    }
    else {
        processText();
    }

    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() {
        return new XMLHttpRequest();
    }

    // порівняння за довжиною рядка, без врахування уточнення у дужках
    // щоб для "Категорі*" видавалося "Категорія (значення)", а не "Класифікація"
    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 + ']]';
                }

                $('#wpTextbox1').textSelection('encapsulateSelection', {
					peri: txt,
					replace: true
				})
            }
        }
    }
}

$(function(){
	if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
		importScript('MediaWiki:Stemmer.js');
		mw.loader.using(['user.options', 'jquery.textSelection'], function () {
			if (mw.user.options.get('usebetatoolbar') === 1) {
				mw.loader.using('ext.wikiEditor', addNewToolbarButton)
			} else {
	          mw.loader.using('ext.gadget.mediawiki.toolbar', addOldToolbarButton)
			}
		});
	}
})