Участник:Serhio Magpie/enhanceWikitextEditor.js: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Содержимое удалено Содержимое добавлено
м v0.0.8
м v0.0.10
Строка 1: Строка 1:
// <nowiki>
// <nowiki>
( function () {
$( function () {


var nodes = {};
var nodes = {};
Строка 69: Строка 69:
init();
init();


}() );
} );
// </nowiki>
// </nowiki>

Версия от 21:36, 30 декабря 2018

// <nowiki>
$( function () {

	var nodes = {};

    function addCSS( css ) {
		let styleElem = document.createElement( 'style' );
		styleElem.appendChild( document.createTextNode( css ) );
		document.getElementsByTagName( 'head' )[0].appendChild( styleElem );
	}

	function getNodes() {
		nodes.$textbox = $( '#wpTextbox1' );
		nodes.$toolbar = $( '#wikiEditor-ui-toolbar' );
		nodes.$toolbarMain = $( '#wikiEditor-section-main' );
		nodes.$codeMirrorButton = $( '#mw-editbutton-codemirror .oo-ui-buttonElement-button' );
		nodes.$wpPreviewLive = $( '#wpPreviewLive' );
		nodes.$wpDiffLive = $( '#wpDiffLive' );
	}

	function resizeTextbox(){
		// Переопрделяем настройки CodeMirror
		if( typeof CodeMirror !== 'undefined' ) {
			CodeMirror.defaults.viewportMargin = Infinity;
		}
		// Масштабируем textarea при вводе текста и при переключении режима подстветки
		nodes.$codeMirrorButton.on( 'click', resizeTextboxHanlder );
		nodes.$textbox.on( 'keyup', resizeTextboxHanlder );
		// Масштабируем textarea
		resizeTextboxHanlder();
	}

	function resizeTextboxHanlder() {
		let top = $( window ).scrollTop();
		nodes.$textbox.css( 'height', 'auto' );
		nodes.$textbox.css( 'height', nodes.$textbox.prop( 'scrollHeight' ) + 'px' );
		$( window ).scrollTop( top );
	}

	function moveAjaxPreviewButtons() {
		// Перемещать только если задана позиция справа
		if ( typeof ajaxPreviewPos !== 'undefined' && ajaxPreviewPos === 'right' ) {
			nodes.$ajaxPreviewContainer = nodes.$wpPreviewLive.parent();
			nodes.$ajaxPreviewContainer.css( 'margin', '4px' );
			nodes.$ajaxPreviewContainer.insertBefore( nodes.$toolbarMain );
		}
	}

	function init() {
	    let isEditing = [ 'edit', 'submit' ].includes( mw.config.get( 'wgAction' ) );
	    let isRightNamespace = mw.config.get( 'wgNamespaceNumber' ) === 10;
	    // Запускать только на страницах в пространстве шаблонов в режиме редактирования
	    if ( isEditing && isRightNamespace ){
	    	// Подготовить все нужные ноды
	    	getNodes();
            // Добавить переопределение стилей высоты и прикрепить верхнюю панель
            addCSS( '\
            	.wikiEditor-ui .wikiEditor-ui-top { position:sticky; top:0; z-index:20; }\
            	.mw-editform #wpTextbox1 { max-height:none; overflow:hidden; }\
            	.CodeMirror { height:auto !important; }\
			' );
			// Автоматическое масштабирования окна редактирования
			resizeTextbox();
			// Перемещаем кнопки гаджета [[Википедия:Гаджеты/Ajax-предпросмотр]] на панель редактора
			mw.hook( 'wikieditor.toolbar.gadgetsgroup' ).add( moveAjaxPreviewButtons );
	    }
	}

	init();

} );
// </nowiki>