Revision as of 16:23, 2 November 2016 | | Revision as of 16:37, 2 November 2016 |
Line 103: | | Line 103: |
| .replace( /[\s\-–—_!?\.,:;]+/g, ' ' ) | | | .replace( /[\s\-–—_!?\.,:;]+/g, ' ' ) |
| .trim(); | | | .trim(); |
| | + | /* |
| var requestTokens = preparedText.split( ' ' ).length; | | | var requestTokens = preparedText.split( ' ' ).length; |
| var url = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + | | | var url = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + |
| '/api.php?action=query&list=search&continue=' + | | | '/api.php?action=query&list=search&continue=' + |
| '&srlimit=5&srprop=&format=json&srsearch=' + encodeURIComponent( txt ); | | | '&srlimit=5&srprop=&format=json&srsearch=' + encodeURIComponent( txt ); |
| | + | */ |
| | + | // Использовать режим совместимости (поведение старого движка) |
| | + | preparedText = '"' + preparedText + '"~2~'; |
| | + | var 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=' + preparedText; |
| | | | |
| loadXMLDoc( url ); | | | loadXMLDoc( url ); |
Revision as of 16:37, 2 November 2016
// Wiki Linker
// Find link for selected text
// old version without stemmer https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikilinker.js&oldid=67851678
// +
// https://ru.wikipedia.org/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Q-bit_array/Gadget-wikilinker.js
// Toolbar buttons
var addOldToolbarButton = function() {
var $toolbar = $( '#gadget-toolbar' );
if ( !$toolbar.length ) {
$toolbar = $( '#wikiEditor-ui-toolbar' );
}
$( '<div>' )
.addClass( 'tool tool-button wikiEditor-toolbar-spritedButton' )
.attr( 'id', 'mw-editbutton-gadget-wikilinker' )
.attr( 'alt', 'Вики-ссыльщик' )
.attr( 'title', 'Вики-ссыльщик — подбирает вики-ссылку для выделенного слова или словосочетания' )
.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: 'Вики-ссыльщик — подбирает вики-ссылку для выделенного слова или словосочетания',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/b/bd/Wikilinker.png',
action: {
type: 'callback',
execute: function() {
WikiLinker();
}
}
}
}
} );
};
if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
mw.loader.using( [ 'user.options', 'jquery.textSelection' ], function () {
if ( mw.user.options.get( 'usebetatoolbar' ) === 1 ) {
if ( mw.user.options.get( 'showtoolbar' ) === 1 ) {
$.when(
mw.loader.using( 'ext.wikiEditor.toolbar' ),
$.ready
).then( addNewToolbarButton );
}
} else {
mw.loader.using( 'mediawiki.action.edit', function() {
$( addOldToolbarButton );
} );
}
} );
}
function WikiLinker() {
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 = txt
.substr( 0, 100 )
.replace( /[«»%'"]/g, '' )
.replace( /[\s\-–—_!?\.,:;]+/g, ' ' )
.trim();
/*
var 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( txt );
*/
// Использовать режим совместимости (поведение старого движка)
preparedText = '"' + preparedText + '"~2~';
var 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=' + 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' )
.textSelection( 'encapsulateSelection', {
peri: txt,
replace: true
} )
.textSelection( 'scrollToCaretPosition' )
.focus();
}
}
}
}