|
|
Строка 1: |
Строка 1: |
− | /* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
| + | var customizeToolbar = function () { |
− | // Wiki Linker
| + | /* Your code goes here */ |
− | // 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();
| + | |
− | }
| + | |
− | }
| + | |
− | }
| + | |
− | }
| + | |
− | } );
| + | |
| }; | | }; |
| | | |
| + | /* Check if view is in edit mode and that the required modules are available. Then, customize the toolbar … */ |
| if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { | | if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { |
− | importScript( 'MediaWiki:Stemmer.js' );
| + | mw.loader.using( 'user.options' ).then( function () { |
− | mw.loader.using( [ 'user.options', 'jquery.textSelection' ], function () { | + | // This can be the string "0" if the user disabled the preference ([[phab:T54542#555387]]) |
− | if ( mw.user.options.get( 'usebetatoolbar' ) === 1 ) { | + | if ( mw.user.options.get( 'usebetatoolbar' ) == 1 ) { |
− | if ( mw.user.options.get( 'showtoolbar' ) === 1 ) {
| + | $.when( |
− | $.when(
| + | mw.loader.using( 'ext.wikiEditor' ), $.ready |
− | mw.loader.using( ['ext.wikiEditor.toolbar', 'schema.Edit'] ),
| + | ).then( customizeToolbar ); |
− | $.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);
| |
− | }
| |
− |
| |
− | }
| |
− | }
| |
− | }
| |
| } | | } |