MediaWiki:Gadget-summaryButtons.js: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Содержимое удалено Содержимое добавлено
чтoбы ccылкa нa oпиcaниe гaджeтa oткpывaлacь в новом окне (тyт пpaктичecки вceгдa пoльзoвaтeлю нe нyжнo пepexoдить и нeпoнятнo, чтo бyдeт при клике)
функцию insertSummary в глобальную область видимости (её, оказывается, требует MediaWiki:Gadget-wikificator.js)
 
(не показано 19 промежуточных версий 5 участников)
Строка 4: Строка 4:
function initSummaryButtons( mode ) {
function initSummaryButtons( mode ) {
function insertSummary( txt ) {
function insertSummary( txt ) {
var $summary;
if ( mode === 'source' ) {
$summary = $(' #wpSummary ');
} else {
$summary = veSaveDialog.editSummaryInput.$input;
}
if ( typeof txt !== 'string' ) {
if ( typeof txt !== 'string' ) {
txt = this.title;
txt = this.title;
}
}
if ( typeof summaryItemsSeparator == 'undefined' ) {
if ( typeof summaryItemsSeparator === 'undefined' ) {
window.summaryItemsSeparator = ',';
window.summaryItemsSeparator = ',';
}
}
var val = $summary.val();
var val = $summary.val();
var regExp = new RegExp( '(^|[,;.?!/]) ?' + mw.RegExp.escape( txt ) );
var regExp = new RegExp( '(^|[,;.?!/]) ?' + mw.util.escapeRegExp( txt ) );
if ( regExp.test( val ) ) {
if ( regExp.test( val ) ) {
return;
return;
Строка 31: Строка 24:
}
}
mode = mode || 'source';
mode = mode || 'classic';
window.insertSummary = insertSummary;
if (typeof summaryButtons === 'undefined') {
if ( typeof summaryButtons === 'undefined' ) {
window.summaryButtons = {
window.summaryButtons = {
hideDefaultButtons: false
hideDefaultButtons: false
Строка 39: Строка 33:
}
}
var veSaveDialog;
var veSaveDialog, $summaryWrapper, $summary;
if (mode === 'visual') {
if ( mode === 'classic' ) {
$summaryWrapper = $( '#wpSummaryWidget' );
$summary = $( '#wpSummary' );
} else {
veSaveDialog = ve.init.target.saveDialog;
veSaveDialog = ve.init.target.saveDialog;
$summaryWrapper = veSaveDialog.editSummaryInput.$element;
$summary = veSaveDialog.editSummaryInput.$input;
}
}
var $summaryButtons = $( '<div>' )
var $summaryWrapper = mode === 'source' ? $( '#wpSummaryWidget' ) : veSaveDialog.editSummaryInput.$element;
var $summaryButtons = $( '<div class="summaryButtons"></div>' ).insertAfter( $summaryWrapper );
.addClass( 'summaryButtons' )
.insertAfter( $summaryWrapper );
var $groups = $( '<div class="summaryButtons-groups"></div>' ).appendTo( $summaryButtons );
var $groups = $( '<div>' )
.addClass( 'summaryButtons-groups' )
.appendTo( $summaryButtons );
window.addSumButton = window.addSummaryButton = function ( label, text, type ) {
window.addSumButton = window.addSummaryButton = function ( label, text, group ) {
type = type || 'custom'; // 'default' or 'custom'
group = group || 'custom'; // default is 'default'
var $group = $( '.summaryButtons-group-' + type );
var $group = $( '.summaryButtons-group-' + group );
if ( !$group.length ) {
if ( !$group.length ) {
$group = $( '<div class="mw-ui-button-group summaryButtons-group summaryButtons-group-' + type + '">' ).appendTo( $groups );
$group = $( '<div>' )
.addClass( 'mw-ui-button-group summaryButtons-group summaryButtons-group-' + group )
.appendTo( $groups );
}
}
$( '<button>' )
$( '<a class="mw-ui-button summaryButtons-button" title="' + text + '">' + label + '</a>' )
.appendTo( $group )
.attr( 'type', 'button' )
.click( insertSummary );
.attr( 'title', text )
.addClass( 'mw-ui-button summaryButtons-button' )
.html( label )
.click( insertSummary )
.appendTo( $group );
};
};
var buttons = mode === 'source'
var buttons = mode !== 'visual' ?
// Кнопки для обычного режима редактирования
// Кнопки для обычного режима редактирования
? [
[
'викиф|икация', 'оформл|ение', 'стил|евые правки', 'орфогр|афия', 'пункт|уация',
'викиф|икация', 'внутр|енние ссылки', 'оформл|ение', 'стил|евые правки', 'орфогр|афия', 'пункт|уация',
'вопрос', 'ответ', 'комм|ентарий', 'кат|егоризация',
'вопрос', 'ответ', 'комм|ентарий', 'кат|егоризация', 'к удал|ению', 'илл|юстрирование',
'источ|ники', 'запр|ос источника', 'доп|олнение', 'уточн|ение', 'испр|авление',
'к удал|ению', 'илл|юстрация', 'источ|ники', 'запр|ос источника',
'доп|олнение', 'уточн|ение', 'испр|авление', 'обнов|ление', 'закр|ыто', 'итог'
'обнов|ление', 'закр|ыто', 'итог'
]
] :
// Кнопки для визуального редактора — без кнопок для обсуждений (визуальный редактор
// Кнопки для визуального редактора — без кнопок для обсуждений (визуальный редактор
// не предназначен для использования на страницах обсуждения)
// не предназначен для использования на страницах обсуждения)
: [
[
'викиф|икация', 'оформл|ение', 'стил|евые правки', 'орфогр|афия', 'пункт|уация',
'викиф|икация', 'внутр|енние ссылки', 'оформл|ение', 'стил|евые правки', 'орфогр|афия', 'пункт|уация',
'кат|егоризация',
'кат|егоризация', 'к удал|ению', 'илл|юстрирование', 'источ|ники', 'запр|ос источника',
'к удал|ению', 'илл|юстрация', 'источ|ники', 'запр|ос источника',
'доп|олнение', 'уточн|ение', 'испр|авление', 'обнов|ление'
'доп|олнение', 'уточн|ение', 'испр|авление', 'обнов|ление'
];
];
Строка 85: Строка 92:
);
);
}
}
$( '<a>' )
$( '<a href="https://ru.wikipedia.org/wiki/Википедия:Гаджеты/Кнопки_описания_правок" target="_blank" class="mw-ui-button mw-ui-quiet summaryButtons-info-link" title="Информация о кнопках описания правок">?</a>' )
.attr( 'href', 'https://ru.wikipedia.org/wiki/Википедия:Гаджеты/Кнопки_описания_правок' )
.attr( 'target', '_blank' )
.attr( 'title', 'Информация о кнопках описания правок' )
.attr( 'tabindex', '-1' )
.addClass( 'mw-ui-button mw-ui-quiet summaryButtons-info-link' )
.text( '?' )
.appendTo( $summaryButtons );
.appendTo( $summaryButtons );
// Эти стили находятся здесь, а не в отдельном CSS, потому что на страницах, где кнопок нет,
// Эти стили находятся здесь, а не в отдельном CSS, потому что на страницах, где кнопок нет,
// они вредны, а за тем, где запускается CSS, мы не можем проследить.
// они вредны, а за тем, где запускается CSS, мы не можем проследить.
mw.util.addCSS('\
mw.util.addCSS( '\
.mw-editform #wpSummaryWidget {\
.mw-editform #wpSummaryWidget {\
margin-bottom: 0;\
margin-bottom: 0;\
Строка 98: Строка 111:
margin-top: .85714em;\
margin-top: .85714em;\
}\
}\
');
' );
if (mode === 'visual' && !additionalCSS) {
if ( mode !== 'classic' && !additionalCSS ) {
additionalCSS = mw.util.addCSS('\
additionalCSS = mw.util.addCSS( '\
.ve-ui-mwSaveDialog-savePanel .summaryButtons {\
.ve-ui-mwSaveDialog-savePanel .summaryButtons {\
margin-top: 2px;\
margin-top: 2px;\
Строка 110: Строка 123:
border-radius: 2px;\
border-radius: 2px;\
}\
}\
');
' );
veSaveDialog.updateSize();
veSaveDialog.updateSize();
}
}
mw.hook('summaryButtons').fire();
mw.hook( 'summaryButtons' ).fire();
}
}


var additionalCSS;
var additionalCSS;
if ( window.ve && ve.init && ve.init.target && ve.init.target.active || $( '.ve-loading' ).length ) {
if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
mw.hook( 've.saveDialog.stateChanged' ).add( function () {
if ( !mw.config.get( 'wgArticleId' ) || $( '.summaryButtons' ).length ) return;
initSummaryButtons( ve.init.target.getSurface().getMode() );
} );
} else if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
$( function () {
$( function () {
var frm = document.getElementById( 'editform' );
var frm = document.getElementById( 'editform' );
if ( !mw.config.get( 'wgArticleId' ) || !frm || $( frm.wpSection ).val() === 'new' ) return;
if ( !mw.config.get( 'wgArticleId' ) || !frm || $( frm.wpSection ).val() === 'new' ) return;
initSummaryButtons( 'source' );
initSummaryButtons( 'classic' );
} );
} else if ( window.ve && ve.init && ve.init.target && ve.init.target.active ) {
mw.hook( 've.saveDialog.stateChanged' ).add( function () {
if ( !mw.config.get( 'wgArticleId' ) || $( '.summaryButtons' ).length ) return;
initSummaryButtons( 'visual' );
} );
} );
}
}

Текущая версия от 15:53, 26 декабря 2021

// Код из польской Википедии, изначально адаптированный для русскоязычного раздела Википедии by [[u:Alex Smotrov]]
// https://ru.wikipedia.org/ruwiki/w/index.php?diff=32005736&oldid=32004004&title=MediaWiki%3AEditpage.js&type=revision

function initSummaryButtons( mode ) {
	function insertSummary( txt ) {
		if ( typeof txt !== 'string' ) {
			txt = this.title;
		}
		if ( typeof summaryItemsSeparator === 'undefined' ) {
			window.summaryItemsSeparator = ',';
		}
		var val = $summary.val();
		var regExp = new RegExp( '(^|[,;.?!/]) ?' + mw.util.escapeRegExp( txt ) );
		if ( regExp.test( val ) ) {
			return;
		}
		if ( /[^,; \/]$/.test( val ) ) {
			val += summaryItemsSeparator;
		}
		if ( /[^ ]$/.test( val ) ) {
			val += ' ';
		}
		$summary.val( val + txt ).focus().change();
	}
	
	mode = mode || 'classic';
	
	window.insertSummary = insertSummary;
	if ( typeof summaryButtons === 'undefined' ) {
		window.summaryButtons = {
			hideDefaultButtons: false
		};
	}
	
	var veSaveDialog, $summaryWrapper, $summary;
	if ( mode === 'classic' ) {
		$summaryWrapper = $( '#wpSummaryWidget' );
		$summary = $( '#wpSummary' );
	} else {
		veSaveDialog = ve.init.target.saveDialog;
		$summaryWrapper = veSaveDialog.editSummaryInput.$element;
		$summary = veSaveDialog.editSummaryInput.$input;
	}
	
	var $summaryButtons = $( '<div>' )
		.addClass( 'summaryButtons' )
		.insertAfter( $summaryWrapper );
	var $groups = $( '<div>' )
		.addClass( 'summaryButtons-groups' )
		.appendTo( $summaryButtons );
	
	window.addSumButton = window.addSummaryButton = function ( label, text, group ) {
		group = group || 'custom';  // default is 'default'
		var $group = $( '.summaryButtons-group-' + group );
		if ( !$group.length ) {
			$group = $( '<div>' )
				.addClass( 'mw-ui-button-group summaryButtons-group summaryButtons-group-' + group )
				.appendTo( $groups );
		}
		
		$( '<button>' )
			.attr( 'type', 'button' )
			.attr( 'title', text )
			.addClass( 'mw-ui-button summaryButtons-button' )
			.html( label )
			.click( insertSummary )
			.appendTo( $group );
	};
	
	var buttons = mode !== 'visual' ?
		// Кнопки для обычного режима редактирования
		[
			'викиф|икация', 'внутр|енние ссылки', 'оформл|ение', 'стил|евые правки', 'орфогр|афия', 'пункт|уация',
			'вопрос', 'ответ', 'комм|ентарий', 'кат|егоризация', 'к удал|ению', 'илл|юстрирование',
			'источ|ники', 'запр|ос источника', 'доп|олнение', 'уточн|ение', 'испр|авление',
			'обнов|ление', 'закр|ыто', 'итог'
		] :
		// Кнопки для визуального редактора — без кнопок для обсуждений (визуальный редактор
		// не предназначен для использования на страницах обсуждения)
		[
			'викиф|икация', 'внутр|енние ссылки', 'оформл|ение', 'стил|евые правки', 'орфогр|афия', 'пункт|уация',
			'кат|егоризация', 'к удал|ению', 'илл|юстрирование', 'источ|ники', 'запр|ос источника',
			'доп|олнение', 'уточн|ение', 'испр|авление', 'обнов|ление'
		];
	
	if ( !summaryButtons.hideDefaultButtons ) {
		$.each(
			buttons,
			function ( i, s ) {
				addSummaryButton( s.replace( /\|.*/, '' ), s.replace( /\|/, '' ), 'default' );
			}
		);
	}
	$( '<a>' )
		.attr( 'href', 'https://ru.wikipedia.org/wiki/Википедия:Гаджеты/Кнопки_описания_правок' )
		.attr( 'target', '_blank' )
		.attr( 'title', 'Информация о кнопках описания правок' )
		.attr( 'tabindex', '-1' )
		.addClass( 'mw-ui-button mw-ui-quiet summaryButtons-info-link' )
		.text( '?' )
		.appendTo( $summaryButtons );
	
	// Эти стили находятся здесь, а не в отдельном CSS, потому что на страницах, где кнопок нет,
	// они вредны, а за тем, где запускается CSS, мы не можем проследить.
	mw.util.addCSS( '\
		.mw-editform #wpSummaryWidget {\
			margin-bottom: 0;\
		}\
		\
		.mw-editform .editCheckboxes {\
			margin-top: .85714em;\
		}\
	' );
	
	if ( mode !== 'classic' && !additionalCSS ) {
		additionalCSS = mw.util.addCSS( '\
			.ve-ui-mwSaveDialog-savePanel .summaryButtons {\
				margin-top: 2px;\
			}\
			\
			.ve-ui-mwSaveDialog-savePanel .ve-ui-mwSaveDialog-options {\
				border-top: 1px solid #c8ccd1;\
				border-radius: 2px;\
			}\
		' );
		veSaveDialog.updateSize();
	}
	
	mw.hook( 'summaryButtons' ).fire();
}

var additionalCSS;
if ( window.ve && ve.init && ve.init.target && ve.init.target.active || $( '.ve-loading' ).length ) {
	mw.hook( 've.saveDialog.stateChanged' ).add( function () {
		if ( !mw.config.get( 'wgArticleId' ) || $( '.summaryButtons' ).length ) return;
		initSummaryButtons( ve.init.target.getSurface().getMode() );
	} );
} else if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
	$( function () {
		var frm = document.getElementById( 'editform' );
		if ( !mw.config.get( 'wgArticleId' ) || !frm || $( frm.wpSection ).val() === 'new' ) return;
		initSummaryButtons( 'classic' );
	} );
}