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

// Оформлять все реплики в обсуждениях :::::::::::двоеточиями// Позаимствовано у Участник:Ignatus/discussion.js и переделано в «обратный вид»(function () {var tbox = $( '#wpTextbox1' );var cf='*', ct=':';//символы, которые надо заменять друг на другаvar coloner = 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;};//makervar 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': {'coloner': {label: 'Оформить все реплики отступами', // or use labelMsg for a localized label, see abovetype: 'button',icon: '//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Colon.svg/22px-Colon.svg.png',action: {type: 'callback',execute: coloner}}}} );}if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {mw.loader.using( 'user.options', function () {if( typeof Alex_Great == 'object' && typeof Alex_Great.discussion == 'object' && Alex_Great.discussion.oldpanel  || !mw.user.options.get('usebetatoolbar') ){// старая панельvar bpar = [coloner, 'commons/thumb/a/aa/Colon.svg/22px-Colon.svg.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/thumb/a/aa/Colon.svg/22px-Colon.svg.png',speedTip: 'Оформить все реплики отступами',imageId: 'coloner',onClick: coloner} );*/    }}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 );} );} );}} );}}());