მედიავიკი:Gadget-wikilinker.js
იერსახე
შენიშვნა: შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. Google Chrome, Firefox, Microsoft Edge და Safari: დააჭირეთ ⇧ Shift ღილაკს და შემდეგ - ღილაკს Reload.
// Russian Wiki Linker // 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', 'ვიკი-ლინკერი' ) .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' ), $.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 ); 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(); } } } }