MediaWiki:Gadget-wikificator.js: различия между версиями
Перейти к навигации
Перейти к поиску
Строка 197: | Строка 197: | ||
document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera | document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera | ||
}; | }; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}() ); | }() ); |
Версия 23:33, 25 февраля 2018
( function () { var wmCantWork = 'Викификатор не может работать в вашем браузере', wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?', wmTalkPage = 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно'; window.wfPlugins = window.wfPlugins || []; window.Wikify = function ( input ) { 'use strict'; var txt = '', hidden = [], winScroll = document.documentElement.scrollTop; // Поверхностная проверка на то, что перед нами поле ввода if ( !input || !input.tagName || input.value === undefined ) { input = document.editform.wpTextbox1; } // FUNCTIONS function r( r1, r2 ) { txt = txt.replace( r1, r2 ); } function hide( re ) { r( re, function ( s ) { return '\x01' + hidden.push( s ) + '\x02'; } ); } function hideTag ( tag ) { hide( new RegExp( '<' + tag + '( [^>]+)?>[\\s\\S]+?<\\/' + tag + '>', 'gi' ) ); } function hideTemplates() { hide( /\{\{([^{]\{?)+?\}\}/g ); var pos = 0, stack = [], tpl, left, right; while ( true ) { left = txt.indexOf( '{{', pos ); right = txt.indexOf( '}}', pos ); if ( left === -1 && right === -1 && !stack.length ) { break; } if ( left !== -1 && ( left < right || right === -1 ) ) { stack.push( left ); pos = left + 2; } else { left = stack.pop(); if ( typeof left === 'undefined' ) { if ( right === -1 ) { pos += 2; continue; } else { left = 0; } } if ( right === -1 ) { right = txt.length; } right += 2; tpl = txt.substring( left, right ); txt = txt.substring( 0, left ) + '\x01' + hidden.push( tpl ) + '\x02' + txt.substr( right ); pos = right - tpl.length; } } } function processLink(link, left, right) { left = $.trim(left.replace(/[ _\u00A0]+/g, ' ')); if (left.match(/^(?:Категория|Файл) ?:/)) { return '[[' + left + '|' + right + ']]'; } right = $.trim(right.replace(/ {2,}/g, ' ')); var inLink = right.substr(0, left.length); var afterLink = right.substr(left.length); var uniLeft = left.substr(0, 1).toUpperCase() + left.substr(1); var uniRight = (right.substr(0, 1).toUpperCase() + right.substr(1)).replace(/[_\u00A0]/g, ' '); if (uniRight.indexOf(uniLeft) === 0 && afterLink.match(/^[a-zа-яё]*$/)) { return '[[' + inLink + ']]' + afterLink; } else { return '[[' + left + '|' + right + ']]'; } } function processText() { var i, u = '\u00A0'; // non-breaking space if ( mw.config.get('wgNamespaceNumber') % 2 || mw.config.get('wgNamespaceNumber') === 4 ) { // is talk page var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g ); if ( sigs && sigs.length > 1 ) { alert( wmTalkPage ); return; } } // Hyphens to em-dashes r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> — r( /(\d)--(\d)/g, '$1—$2' ); // -> — // Plugins for ( i in window.wfPlugins ) { if ( window.wfPlugins.hasOwnProperty( i ) ) { window.wfPlugins[i]( txt, r ); } } r( /«|»|“|”|„/g, '"' ); // temp // "" → «» for ( i = 1; i <= 2; i++ ) { r( /([\s\x02!|#'"\/([{;+\-])"([^"]*)([^\s"([{|])"([^a-zа-яё])/ig, '$1«$2$3»$4' ); // " } while ( /«[^»]*«/.test( txt ) ) { r( /«([^»]*)«([^»]*)»/g, '«$1„$2“' ); } function unhide( s, num ) { return hidden[ num - 1 ]; } while ( txt.match( /\x01\d+\x02/ ) ) { r( /\x01(\d+)\x02/g, unhide ); } txt = txt.substr( 1, txt.length - 2 ); } function processAllText() { txt = input.value; processText(); r( /^[\n\r]+/, '' ); input.value = txt; txt = ''; if ( window.auto_comment && window.insertSummary && !document.editform.wpSection.value ) { window.insertSummary( 'викификатор' ); } } // Check regexp support try { txt = 'ая'.replace( /а/g, 'б' ).replace( /б(?=я)/, 'в' ); } catch ( e ) {} if ( txt !== 'вя' ) { alert( wmCantWork ); return; } input.focus(); // Modern browsers if ( typeof input.selectionStart !== 'undefined' ) { var textScroll = input.scrollTop, startPos = input.selectionStart, endPos = input.selectionEnd; txt = input.value.substring( startPos, endPos ); if ( txt === '' ) { processAllText(); } else { processText(); input.value = input.value.substring( 0, startPos ) + txt + input.value.substring( endPos ); } input.selectionStart = startPos; input.selectionEnd = startPos + txt.length; input.scrollTop = textScroll; // IE } else if ( document.selection && document.selection.createRange ) { var range = document.selection.createRange(); txt = range.text; if ( txt === '' ) { processAllText(); } else { processText(); range.text = txt; if ( range.moveStart ) { range.moveStart( 'character', -txt.length ); } range.select(); } // Other browsers } else if ( confirm( wmFullText ) ) { processAllText(); } document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera }; }() );