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)
}
});
}
})