MediaWiki:Gadget-wikilinker.js
Заўвага: Пасля апублікавання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змены.
- Firefox / Safari: націсніце Reload, утрымліваючы Shift, або націсніце Ctrl-F5 ці Ctrl-R (⌘-R на Макінтошах)
- Google Chrome: Націсніце Ctrl-Shift-R (⌘-Shift-R на Mac)
- Internet Explorer / Edge: націсніце Refresh, утрымліваючы Ctrl, або націсніце Ctrl-F5
- Opera: Увайдзіце Menu → Settings (Opera → Preferences на Mac), далей Privacy & security → Clear browsing data → Cached images and files.
// Wiki Linker, trasferred from ruwiki
// Find link for selected text
if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
importScript( 'MediaWiki:Stemmer.js' );
}
function stemPhrase ( phrase ) {
phrase = phrase
.substr( 0, 100 )
.replace( /[«»%'"]/g, '' )
.replace( /[\s\-–—_!?\.,:;]+/g, ' ' )
.trim();
var bestemmer = new BelarusianStemmer();
var arr = phrase.split(' ');
var res = '';
var nextRes = '';
var n = 0;
for ( var i in arr ) {
bestemmer.setCurrent(arr[i]);
bestemmer.stem();
nextRes = bestemmer.getCurrent();
if ( nextRes.length > 0 ) {
if ( nextRes !== arr[i] && n < 3 ) {
res += 'intitle:' + nextRes + '* ';
n++; // у радку запыту можа быць не больш за 3 зорачкі
}
else {
res += nextRes + ' ';
}
}
}
// trim string
res = res.replace( /(^\s+)|(\s+$)/g, '' );
return res;
}
window.WikiLinker = function () {
var xmlhttp;
var CantWork = 'Спачатку трэба вылучыць слова або словазлучэнне';
var requestTokens = 0;
var $wpTextbox1 = $( '#wpTextbox1' );
var txt = $wpTextbox1.textSelection( 'getSelection' );
var startEndPos = $( '#wpTextbox1' ).textSelection( 'getCaretPosition', {
startAndEnd: true
} ),
startPos = startEndPos[0],
endPos = startEndPos[1];
// Trim selected text
while ( txt.slice( 0, 1 ) === ' ' ) {
txt = txt.slice( 1 );
startPos = startPos + 1;
}
while ( txt.slice( -1 ) === ' ' ) {
txt = txt.slice( 0, -1 );
endPos = endPos - 1;
}
if ( txt === '' ) {
mw.notify( CantWork );
return;
}
if ( startEndPos[0] !== startPos || startEndPos[1] !== endPos ) {
$wpTextbox1.textSelection( 'setSelection', {
start: startPos,
end: endPos
} );
}
processText( txt );
function processText ( txt ) {
var preparedText = stemPhrase( txt );
// Ужываць рэжым сумяшчальнасці (паводзіны старога рухавічка Lucene)
preparedText = preparedText;
requestTokens = preparedText.split( ' ' ).length;
var url = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) +
'/api.php?action=query&list=search&continue=' +
'&srlimit=5&srprop=&format=json&srsearch=' + encodeURIComponent(preparedText);
loadXMLDoc( url );
}
function loadXMLDoc ( url ) {
xmlhttp = GetXmlHttpObject();
if ( xmlhttp === null ) {
mw.notify( '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 pageName = resp.query.search[0].title;
// калі ў запыце было толькі адно слова, то абіраем самую кароткую назву з першых трох вынікаў,
// каб для "Англіяй" выдавалася "Англія", а не "Англіканства"
if ( requestTokens === 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' ) {
pageName = resar[0];
}
}
// для "форумы" будзе "[[форум]]ы", а не "[[форум|форумы]]"
if ( initialLower( txt.substr( 0, pageName.length ) ) === initialLower( pageName ) &&
pageName.length <= txt.length
) {
txt = '[[' + txt.substr( 0, pageName.length ) + ']]' +
txt.substr( pageName.length, txt.length - pageName.length );
}
else {
txt = '[[' + pageName + '|' + txt + ']]';
}
}
else {
txt = '[[' + '|' + txt + ']]';
}
$( '#wpTextbox1' )
.focus()
.textSelection('replaceSelection', txt)
.textSelection('setSelection', {
start: startPos,
end: startPos + txt.length
});
}
}
}
};
if (typeof registerTool !== 'undefined') {
registerTool( {
name: 'wikilinker',
position: 300,
title: 'Вікіспасыльшчык',
label: 'Вікіспасыльшчык — падбірае вікіспасылку для вылучанага слова або словазлучэння',
callback: WikiLinker,
classic: {
icon: '//upload.wikimedia.org/wikipedia/commons/b/bd/Wikilinker.png',
},
visual: {
icon: '//upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Wikilinker_VE_icon.svg/20px-Wikilinker_VE_icon.svg.png',
modes: [ 'source' ],
addCallback: function () {
importScript( 'MediaWiki:Stemmer.js' );
}
},
} );
}