Участник:Ignatus/discussion.js

// Оформлять все реплики в обсуждениях ***********звёздочками

(function () {

var tbox = $( '#wpTextbox1' );

var cf=':', ct='*';//символы, которые надо заменять друг на друга

var asterisker = function(){
	// Структуризация: *:#;
	var se = tbox.textSelection('getCaretPosition', {startAndEnd: true});
	var se_old = {start:se[0],end:se[1]};
	var lastMatch = ''; // Начало предыдущей строки
	
	var maker = function(inp,UTC,init,offs){
		// Если за рабочей областью, не заменяем
		if(offs<se[0] || offs>se[1])return;
		//Заменяем : на *, если они не после ; или не в середине реплики
	    var i = 0, newinit='';// Начало, которое может быть общим
	    while (
	    	i<init.length  &&
	    	i<lastMatch.length &&
	    	(
	    		init.charAt(i)==lastMatch.charAt(i)  ||
	    		init.charAt(i)==cf  &&  lastMatch.charAt(i)==ct ||
	    		init.charAt(i)==':'  &&  lastMatch.charAt(i)==';'
	    	)
	    ){
	    	newinit += init.charAt(i)==cf  &&  lastMatch.charAt(i)==ct
	    				? ( i==init.length-1 && !UTC  ?  cf  :  ct )
	    				: init.charAt(i);
	    	i++;
	    }
	    // Здесь может начинаться новый уровень списка как выше, так и ниже
	    if(i<init.length){
	    	newinit += init.charAt(i)==cf ? ( !UTC  ?  cf  :  ct ) : init.charAt(i);
	    	i++;
	    }
	    // Дальнейшее может быть введено ошибочно, но может быть и внутренней разметкой реплики
	    // Ошибки исправлять пока не научились, так что не трогаем
	    if(i<init.length){newinit+=init.slice(i)}
	    lastMatch = newinit;
	    return (UTC||'')+newinit;
	};//maker
	
	var text = tbox.textSelection('getContents');
	if(se[1]-se[0]<=1){
		se=[0,text.length];
	}
	tbox.val(text.replace(//После подписей, заголовков, а также убираем пустые строки из списков
	/(\n|^)\n*([*:;#]+)/mg,
		maker
	));
	tbox.textSelection('setSelection',se_old);
};

function addNewToolbarButton() {
	tbox.wikiEditor( 'addToToolbar', {
		section: 'main',
		group: 'gadgets',
		'tools': {
			'asterisker': {
				label: 'Оформить все реплики маркерами', // or use labelMsg for a localized label, see above
				type: 'button',
				icon: '//upload.wikimedia.org/wikipedia/commons/7/76/Silk_asterisk_yellow.png',
				action: {
					type: 'callback',
					execute: asterisker
				}
			}
		}
	} );
}

if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
	mw.loader.using( 'user.options', function () {
		if( typeof Ignatus == 'object' && typeof Ignatus.discussion == 'object' && Ignatus.discussion.oldpanel
		  || !mw.user.options.get('usebetatoolbar') ){// старая панель
			var bpar = [asterisker, 'commons/7/76/Silk_asterisk_yellow.png', 'Оформить все реплики маркерами'];
			// Чтоб работало и до, и после MediaWiki:Editpage.js
	    	if(typeof addFuncBtn == 'function')addFuncBtn('wikilinker',bpar[0],bpar[1],bpar[2]);else{
				/*mw.toolbar.addButton( {
					imageFile: '//upload.wikimedia.org/wikipedia/commons/7/76/Silk_asterisk_yellow.png',
					speedTip: 'Оформить все реплики маркерами',
					imageId: 'askterisker',
					onClick: asterisker
				} );*/
	    	}
		}else if ( mw.user.options.get('usebetatoolbar') ) { // новая панель
			$.when( mw.loader.using( 'ext.wikiEditor' ), $.ready ).then( function () {
				var buttonAdded = false;
				mw.hook( 'wikieditor.toolbar.wikificator' ).add( function () {
					if ( !buttonAdded ) {
						addNewToolbarButton();
						buttonAdded = true;
					}
				} );
				mw.hook( 'wikieditor.toolbar.gadgetsgroup' ).add( function () {
					setTimeout( function () {
						if ( !buttonAdded ) {
							addNewToolbarButton();
							buttonAdded = true;
						}
					}, 2000 );
				} );
			} );
		}
	} );
}

}());
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya