Admin (обсуждение | вклад) (Новая страница: «/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой ст…») |
(нет различий)
|
Версия 14:33, 17 февраля 2018
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */ // 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', 'Wiki Linker' ) .attr( 'title', 'Wiki Linker. Підбирає вікіпосилання для виділеного слова чи фрази' ) .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: 'Wiki Linker. Підбирає вікіпосилання для виділеного слова чи фрази', 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 ) { importScript( 'MediaWiki:Stemmer.js' ); 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', 'schema.Edit'] ), $.ready ).then( addNewToolbarButton ); } } else { mw.loader.using( 'mediawiki.toolbar', function() { $( addOldToolbarButton ); } ); } } ); } 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 browserType = 0; var requestLength = 0; // довжина у словах var txt = ''; var wpTextbox1 = document.editform.wpTextbox1; var winScroll = document.documentElement.scrollTop; wpTextbox1.focus(); if (typeof wpTextbox1.selectionStart != 'undefined') { // Modern browsers browserType = 1; var textScroll = wpTextbox1.scrollTop; var startPos = wpTextbox1.selectionStart; var endPos = wpTextbox1.selectionEnd; txt = wpTextbox1.value.substring(startPos, endPos); // «відсікаємо» останній пробіл if (txt.slice(-1) == ' ') { txt = txt.slice(0,-1); endPos = endPos - 1; } if (txt == '') { alert(CantWork); } else { processText(); } wpTextbox1.selectionStart = startPos; wpTextbox1.selectionEnd = startPos + txt.length; wpTextbox1.scrollTop = textScroll; } else if (document.selection && document.selection.createRange) { //IE browserType = 2; range = document.selection.createRange(); txt = range.text; // «відсікаємо» останній пробіл if (txt.slice(-1) == ' ') { txt = txt.slice(0,-1); range.moveEnd('character', -1); } if (txt == '') { alert(CantWork); } else { processText(); } } else { // other browsers alert(CantWork); } document.documentElement.scrollTop = winScroll // scroll back, for IE/Opera 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() { 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 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 + ']]'; } if (browserType == 1) { //Mozilla/Opera/Safari3 wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos); wpTextbox1.selectionStart = startPos; wpTextbox1.selectionEnd = startPos + txt.length; wpTextbox1.scrollTop = textScroll; } else if (browserType == 2) { //IE range.text = txt; } else { // other browsers alert(CantWork); } } } } }