MediaWiki:Gadget-wikificator.js
Diemesė: ėšsauguojus Tamstā gal prireiktė ėšvalītė Tamstas naršīklės rėnktovė, kū paveizėtomėt pakeitėmus. Mozilla / Safari / Konqueror: laikīdami Shift pasėrinkėt Atsiōstė ėš nauja, a paspauskėt Ctrl-Shift-R (sėstemuo Apple Mac Cmd-Shift-R); IE: laikīdamė Ctrl paspauskėt Atnaujėntė, o paspauskėt Ctrl-F5; Konqueror: paprastiausē paspauskėt Perkrautė mīgtoka, o paspauskėt F5; Opera nauduotuojam gal prireiktė pėlnā ėšvalītė anū rėnktovė Rakondā→Nustatīmā.
// <nowiki>
( function () {
var wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?',
wmTalkPage = 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно';
window.wfPlugins = window.wfPlugins || [];
window.wfPluginsT = window.wfPluginsT || [];
// Function takes an input or text as an argument. If it is absent, it uses $( '#wpTextbox1' )
// as an input.
window.Wikify = function ( inputOrText ) {
'use strict';
var $input, text, caretPosition, textScroll,
txt = '',
hidden = [],
winScroll = document.documentElement.scrollTop,
$CodeMirrorVscrollbar = $( '.CodeMirror-vscrollbar' );
// Check what's in the first parameter
if ( typeof inputOrText === 'string' ) {
text = inputOrText;
} else {
$input = $( ( inputOrText &&
( ( inputOrText.nodeType && inputOrText.value !== undefined ) || // node
( inputOrText.prop && inputOrText.prop( 'nodeType' ) ) // jQuery object
)
) ?
inputOrText :
'#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;
}
}
hideTag( 'nowiki' );
hideTag( 'pre' );
hideTag( 'source' );
hideTag( 'syntaxhighlight' );
hideTag( 'templatedata' );
hideTag( 'code' );
hideTag( 'kbd' );
hideTag( 'tt' );
hideTag( 'graph' );
hideTag( 'hiero' );
hideTag( 'math' );
hideTag( 'timeline' );
hideTag( 'chem' );
hideTag( 'score' );
hideTag( 'categorytree' );
hideTag( 'inputbox' );
hideTag( 'mapframe' );
hideTag( 'maplink' );
// r(/( |\n|\r)+\{\{(·|•|\*)\}\}/g, '{{$2}}'); //before {{·/•/*}}, usually in templates
for (var i=1; i<=4; i++)
hide(/\{\{[^\{\}]*?\}\}/g)//templates
hide(/^ .*/mg)
hide(/(https?|ftp|news|nntp|telnet|irc|gopher):\/\/[^\s\[\]<>"]+ ?/gi)
hide(/^#(redirect|nukreipimas)/i)
hideTag('gallery')
r(/ +(\n|\r)/g,'$1')// naikinami tarpai eilutės gale
txt = '\n'+txt+'\n'
//LINKS
r(/(\[\[:?)(category|kategorija):( *)/ig, '$1Kateguorėjė:')
r(/(\[\[:?)(image|vaizdas|file):( *)/ig, '$1Abruozdielis:')
r(/(\(|\s)(\[\[[12]?\d{3}\]\]|[12]?\d{3})[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[12]?\d{3}\]\]|[12]?\d{3})(\W)(?![^\[\]]*\]\])/g, '$1$2–$4$5')
r(/(\[\[[12]?\d{3}\]\]) ?(m\.)/g, '$1'+u+'$2')
r(/(\(|\s)(\[\[[IVX]{1,5}\]\]|[IVX]{1,5})[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[IVX]{1,5}\]\]|[IVX]{1,5})(\W)/g, '$1$2–$4$5')
hide(/\[\[[^\]\|]+/g)//links
//TAGS
r(/<<(\S.+\S)>>/g, '„$1“') //<< >>
r(/(sup>|sub>|\s)-(\d)/g, '$1-$2') //minus
r(/²/gi, '²')
r(/³/gi, '³')
r(/<(b|strong)>(.*?)<\/(b|strong)>/gi,"'''$2'''")
r(/<(i|em)>(.*?)<\/(i|em)>/gi,"''$2''")
r(/^<hr ?\/?>/gim, '----')
r(/<\/?(hr|br)( [^\/>]+?)? ?\/?>/gi, '<$1$2 />')
// r(/(\n== *[a-zа-я\s\.:]+ *==\n+)<references *\/>/ig,'$1{\{примечания}}')
hide(/<[a-z][^>]*?>/gi)
hide(/^({\||\|-).*/mg)//table/row def
hide(/(^\||^!|!!|\|\|) *[a-z]+=[^|]+\|(?!\|)/mgi)//cell style
hide(/\| +/g)//formatted cell
r(/[ \t]+/g,' ')//double spaces
// Headings
r(/^(=+)[ \t\f\v]*(.*?)[ \t\f\v]*=+$/gm, '$1 $2 $1') //add spaces inside
r(/([^\r\n])(\r?\n==.*==\r?\n)/g, '$1\n$2') //add empty line before
r(/^== (.+)[.:] ==$/gm, '== $1 ==')
// Brūkšnys
r(/( |\s)-{1,3} /g, '$1– ') // hyphen -> —
r(/(\d)--(\d)/g, '$1–$2') // -> —
// Raidės
r(/aa/gi,'ā')
r(/AA/gi,'Ā')
r(/ee/gi,'ē')
r(/EE/gi,'ē')
r(/y/gi,'ī')
r(/Y/gi,'Ī')
r(/oo/gi,'ō')
r(/OO/gi,'Ō')
r(/ėė/gi,'ė̄')
r(/ĖĖ/gi,'Ė̄')
// Entities etc. → Unicode chars
r(/&#x([0-9a-f]{1,4});/gi, function(n,a){return String.fromCharCode(eval('0x'+a.substr(-4)))}) //́
r(/©/gi,'©')
r(/®/gi,'®')
r(/§/gi,'§')
r(/€/gi,'€')
r(/¥/gi,'¥')
r(/£/gi,'£')
r(/°/g,'°')
r(/\(tm\)|™/gi,'™')
r(/\.\.\.|…/g,'…')
r(/\+-(?!\+|-)|±/g,'±')
r(/~=/g,'≈')
r(/\^2(\D)/g,'²$1')
r(/\^3(\D)/g,'³$1')
r(/&((la|ra|bd|ld)quo|quot);/g,'"')
r(/([\wа-яА-ЯёЁ])'([\wа-яА-ЯёЁ])/g,'$1’$2') //'
r(/№№/g,'№')
// Insert/delete spaces
r(/(\d)(?:[\u00A0 ]|\ \;)?((?:(?:m|c|d|k|M)?m|[km]g|in|W)(?:²|³)?\.?)(?=[,;. ]| "?[a-ząčęėįšųūž])/g, '$1'+u+'$2')
hide(/\ \;/g)
r(/^([#*:]+)[ \t\f\v]*(?!\{\|)([^ \t\f\v*#:;])/gm, '$1 $2') //space after #*: unless before table
r(/(\S) (-{1,3}|—|–) (\S)/g, '$1'+u+'– $3')
r(/([\"\)\]a-ząčęėįšųūž“]|\sm|\sd) ?(\.|\!|\?|…) ?([„\(\[\"A-ZĄČĘĖĮŠŲŪŽ])/g, '$1$2 $3')
r(/([\)\"a-ząčęėįšųūž\]“]) *([,;:]) ?([„\(\[\"a-ząčęėįšųūž])/g, '$1$2 $3')
r(/\( +/g, '('); r(/ +\)/g, ')') //inside ()
//Kabutės
//"" → «»
for (var i=1; i<=3; i++)
r(/"([^\s"][^"]*[^\s"])"/ig, '„$1“') //"
//Temperature
r(/([\s\d=≈≠≤≥<>—("'|])([+±−-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])C)(?=[\s"').,;!?|])/gm, '$1$2'+u+'°C') //'
r(/([\s\d=≈≠≤≥<>—("'|])([+±−-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])F)(?=[\s"').,;|!?])/gm, '$1$2'+u+'°F') //'
txt=txt.substr(1, txt.length-2)
if ('0'.replace('0','$$') == '$') ////$ in replacing string is special, except in IE
for (var i=0; i<hidden.length; i++) hidden[i] = hidden[i].replace(/\$/g, '$$$$')
while (hidden.length>0)
r('\x01'+hidden.length+'\x02', hidden.pop())
if (txt_old != txt)
document.editform.wpSummary.value += ' [[Vikipedija:Vikifikatuorios|soriedīta]]'
}
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(RegExp('<' + tag + '( [^>]+)?>[\\s\\S]+?<\\/' + tag + '>','gi')) }
}
/ MAIN CODE
if ( $input ) {
$input.focus();
caretPosition = $input.textSelection( 'getCaretPosition', { startAndEnd: true } );
if ( caretPosition ) {
textScroll = ( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input )
.scrollTop();
if ( caretPosition[0] === caretPosition[1] ) {
processAllText();
} else {
txt = $input.textSelection( 'getSelection' );
processText();
// replaceSelection doesn't work with MediaWiki 1.30 in case this gadget is loaded
// from other wiki
$input.textSelection( 'encapsulateSelection', {
replace: true,
peri: txt
} );
// In CodeMirror, the selection isn't preserved, so we do it explicitly
$input.textSelection( 'setSelection', {
start: caretPosition[0],
end: caretPosition[0] + txt.length
} );
}
( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input )
.scrollTop( textScroll );
// If something went wrong
} else if ( confirm( wmFullText ) ) {
processAllText();
}
} else {
processAllText();
return text;
}
// scroll back, for 2017 wikitext editor, IE, Opera
document.documentElement.scrollTop = winScroll;
};
/* Toolbar buttons */
var addOldToolbarButton = function () {
var $toolbar = $( '#gadget-toolbar' );
if ( !$toolbar.length ) {
$toolbar = $( '#toolbar' );
}
$( '<div>' )
.addClass( 'mw-toolbar-editbutton' )
.attr( 'alt', 'Викификатор' )
.attr( 'title', 'Викификатор — автоматический обработчик текста' )
.css( {
'width': '69px',
'backgroundImage': 'url(//upload.wikimedia.org/wikipedia/commons/3/38/Button_wikify.png)'
} )
.appendTo( $toolbar )
.on( 'click', Wikify );
};
var addNewToolbarButton = function () {
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'main',
'group': mw.config.get( 'wgServerName' ) === 'bat-smg.wikipedia.org' ? 'gadgets' : 'insert',
'tools': {
'wikif': {
label: 'Викификатор — автоматический обработчик текста',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
action: {
type: 'callback',
execute: Wikify
}
}
}
} );
mw.hook( 'wikieditor.toolbar.wikificator' ).fire();
};
if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
mw.loader.using( [ 'user.options', 'jquery.textSelection' ], function () {
if ( mw.user.options.get( 'usebetatoolbar' ) === 1 ) {
$.when(
mw.loader.using( 'ext.wikiEditor' ),
$.ready
).then( function () {
if ( mw.config.get( 'wgServerName' ) === 'bat-smg.wikipedia.org' ) {
mw.hook( 'wikieditor.toolbar.gadgetsgroup' ).add( addNewToolbarButton );
} else {
addNewToolbarButton();
}
} );
} else {
mw.hook( 'legacy.toolbar.ready' ).add( function () {
$( addOldToolbarButton );
});
}
} );
}
/* VisualEditor code */
window.createVEWikificatorTool = function () {
// Create and register a command
function WikifyCommand() {
WikifyCommand.parent.call( this, 'wikificator' );
}
OO.inheritClass( WikifyCommand, ve.ui.Command );
// Forbid the command from being executed in the visual mode
WikifyCommand.prototype.isExecutable = function () {
var surface = ve.init.target.getSurface();
return surface && surface.getMode() === 'source';
};
WikifyCommand.prototype.execute = function ( surface ) {
Wikify();
return true;
};
if ( ve.ui.wikitextCommandRegistry ) {
ve.ui.wikitextCommandRegistry.register( new WikifyCommand() );
}
// Create and register a tool
function WikificatorTool() {
WikificatorTool.parent.apply( this, arguments );
}
OO.inheritClass( WikificatorTool, ve.ui.Tool );
WikificatorTool.static.name = 'wikificator';
WikificatorTool.static.group = 'utility';
WikificatorTool.static.title = 'Викификатор';
WikificatorTool.static.icon = 'wikify';
WikificatorTool.static.commandName = 'wikificator';
WikificatorTool.static.autoAddToCatchall = false;
WikificatorTool.static.deactivateOnSelect = false;
WikificatorTool.prototype.onUpdateState = function () {
WikificatorTool.parent.prototype.onUpdateState.apply( this, arguments );
this.setActive( false );
};
ve.ui.toolFactory.register( WikificatorTool );
};
}() );
// </nowiki>