Участник:Serhio Magpie/enhanceWikitextEditor.js: различия между версиями
Перейти к навигации
Перейти к поиску
Содержимое удалено Содержимое добавлено
тест |
Фикс для плавающих окон в редакторе |
||
(не показано 15 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
/** |
|||
* Enhance Wikitext Editor |
|||
* |
|||
* Author: Serhio Magpie |
|||
* Licenses: MIT, CC BY-SA |
|||
*/ |
|||
// <nowiki> |
// <nowiki> |
||
Строка 6: | Строка 13: | ||
codeEditorLanguage: mw.config.get( 'wgCodeEditorCurrentLanguage' ) |
codeEditorLanguage: mw.config.get( 'wgCodeEditorCurrentLanguage' ) |
||
}, |
}, |
||
_nodes = {} |
_nodes = {}, |
||
_editOptionsHeight = 0, |
|||
_css; |
|||
if ( !window.EnhanceWikitextEditor ) { |
if ( !window.EnhanceWikitextEditor ) { |
||
Строка 14: | Строка 23: | ||
EnhanceWikitextEditor.default = { |
EnhanceWikitextEditor.default = { |
||
name: 'EnhanceWikitextEditor', |
name: 'EnhanceWikitextEditor', |
||
allow: ['wikitext'] |
allow: [ 'wikitext' ], |
||
toggleEditOptions: true |
|||
}; |
}; |
||
EnhanceWikitextEditor.config = $.extend({}, EnhanceWikitextEditor.default, EnhanceWikitextEditor.config || {}); |
EnhanceWikitextEditor.config = $.extend( {}, EnhanceWikitextEditor.default, EnhanceWikitextEditor.config || {} ); |
||
function getNodes() { |
function getNodes() { |
||
Строка 30: | Строка 40: | ||
_nodes.$codeMirrorButton = $( '#mw-editbutton-codemirror .oo-ui-buttonElement-button' ); |
_nodes.$codeMirrorButton = $( '#mw-editbutton-codemirror .oo-ui-buttonElement-button' ); |
||
// Ace Editor |
// Ace Editor |
||
_nodes.$aceEditorButton = $( '#editform . |
_nodes.$aceEditorButton = $( '#editform .wikiEditor-ui-toolbar .group-codeeditor-main .oo-ui-toggleButtonWidget .oo-ui-buttonElement-button' ); |
||
} |
} |
||
function resizeTextbox() { |
function resizeTextbox() { |
||
// Кнопки переключения режимов редактора |
|||
// Переопределить настройки CodeMirror |
|||
⚫ | |||
_nodes.$codeMirrorButton.on( 'click', resizeTextboxHandler ); |
_nodes.$codeMirrorButton.on( 'click', resizeTextboxHandler ); |
||
// Переопределить настройки Ace Editor |
|||
⚫ | |||
_nodes.$aceEditorButton.on( 'click', resizeTextboxHandler ); |
_nodes.$aceEditorButton.on( 'click', resizeTextboxHandler ); |
||
// Масштабировать textarea при вводе текста |
// Масштабировать textarea при вводе текста |
||
_nodes.$textbox.on( 'keyup', resizeTextboxHandler ); |
_nodes.$textbox.on( 'keyup', resizeTextboxHandler ); |
||
// Масштабировать textarea |
// Масштабировать textarea или редактор |
||
resizeTextboxHandler(); |
resizeTextboxHandler(); |
||
} |
} |
||
Строка 48: | Строка 55: | ||
function resizeTextboxHandler() { |
function resizeTextboxHandler() { |
||
let top = $( window ).scrollTop(); |
let top = $( window ).scrollTop(); |
||
setAceEditor(); |
|||
_nodes.$textbox.css( 'height', 'auto' ); |
_nodes.$textbox.css( 'height', 'auto' ); |
||
_nodes.$textbox.css( 'height', _nodes.$textbox.prop( 'scrollHeight' ) + 'px' ); |
_nodes.$textbox.css( 'height', _nodes.$textbox.prop( 'scrollHeight' ) + 'px' ); |
||
setEditor(); |
|||
$( window ).scrollTop( top ); |
$( window ).scrollTop( top ); |
||
} |
} |
||
function |
function setEditOptions() { |
||
if ( !EnhanceWikitextEditor.config.toggleEditOptions ) { |
|||
⚫ | |||
} |
|||
_nodes.$editOptions.addClass( 'enhanceWikitextEditor--editOptions' ); |
|||
_nodes.$editOptions.on( 'mouseenter', setEditOptionsHeight ); |
|||
_nodes.$summary.on( 'focus', showEditOptions ); |
_nodes.$summary.on( 'focus', showEditOptions ); |
||
_nodes.$summary.on( 'blur', hideEditOptions ); |
_nodes.$summary.on( 'blur', hideEditOptions ); |
||
Строка 62: | Строка 74: | ||
function showEditOptions() { |
function showEditOptions() { |
||
setEditOptionsHeight(); |
|||
_nodes.$editOptions.addClass( 'visible' ); |
_nodes.$editOptions.addClass( 'visible' ); |
||
} |
|||
function setEditOptionsHeight() { |
|||
if ( _css && _css.cssRules[0] && _css.cssRules[0].selectorText === ':root' ) { |
|||
var height = ( |
|||
_nodes.$editOptions.prop( 'scrollHeight' ) - |
|||
_nodes.$editOptions.outerHeight() + |
|||
_nodes.$editOptions.height() |
|||
); |
|||
if ( height !== _editOptionsHeight ) { |
|||
_editOptionsHeight = height; |
|||
_css.cssRules[0].style.setProperty( '--enhanceWikitextEditor--editOptions-visible-height', height + 'px' ); |
|||
} |
|||
} |
|||
} |
} |
||
Строка 76: | Строка 103: | ||
function setAceEditor() { |
function setAceEditor() { |
||
var editor; |
|||
if ( typeof ace !== 'undefined' ) { |
if ( typeof ace !== 'undefined' ) { |
||
_nodes.$ace = $( '#editform .ace_editor' ); |
_nodes.$ace = $( '#editform .ace_editor' ); |
||
editor = ace.edit( _nodes.$ace.get(0) ); |
var editor = ace.edit( _nodes.$ace.get( 0 ) ); |
||
editor.setOptions( { maxLines: Infinity } ); |
editor.setOptions( { maxLines: Infinity } ); |
||
} |
} |
||
} |
|||
⚫ | |||
function setEditor() { |
|||
⚫ | |||
⚫ | |||
} |
} |
||
function init() { |
function init() { |
||
⚫ | |||
// Добавить переопределение стилей высоты и прикрепить верхнюю панель |
|||
:root { --enhanceWikitextEditor--editOptions-hidden-height:12px; --enhanceWikitextEditor--editOptions-visible-height:300px; }\ |
|||
⚫ | |||
\ |
|||
.wikiEditor-ui .wikiEditor-ui-top { position:-webkit-sticky; position:sticky; top:0; z-index:20; }\ |
.wikiEditor-ui .wikiEditor-ui-top { position:-webkit-sticky; position:sticky; top:0; z-index:20; }\ |
||
.wikiEditor-ui .wikiEditor-ui-text { height:auto !important; }\ |
|||
.wikiEditor-ui .wikiEditor-ui-text .ui-resizable { height:auto !important; }\ |
.wikiEditor-ui .wikiEditor-ui-text .ui-resizable { height:auto !important; }\ |
||
.wikiEditor-ui .wikiEditor-ui-text .ace_editor { min-height:475px; position:relative !important; }\ |
.wikiEditor-ui .wikiEditor-ui-text .ace_editor { min-height:475px; position:relative !important; }\ |
||
Строка 94: | Строка 126: | ||
.wikiEditor-ui .wikiEditor-ui-text .ace_search.right { right:24px; }\ |
.wikiEditor-ui .wikiEditor-ui-text .ace_search.right { right:24px; }\ |
||
.wikiEditor-ui .wikiEditor-ui-view .codeEditor-status { position:sticky; bottom:48px; z-index:4; }\ |
.wikiEditor-ui .wikiEditor-ui-view .codeEditor-status { position:sticky; bottom:48px; z-index:4; }\ |
||
.wikiEditor-toolbar-dialog { position:fixed !important; }\ |
|||
⚫ | |||
\ |
|||
.mw-editform .editOptions:hover, .mw-editform .editOptions:active, .mw-editform .editOptions.visible { max-height:300px; }\ |
|||
⚫ | |||
⚫ | |||
.enhanceWikitextEditor--editOptions:hover,\ |
|||
.enhanceWikitextEditor--editOptions:active,\ |
|||
.enhanceWikitextEditor--editOptions:focus-within,\ |
|||
.enhanceWikitextEditor--editOptions.visible { height:var(--enhanceWikitextEditor--editOptions-visible-height); }\ |
|||
⚫ | |||
\ |
|||
.mw-editform #wpTextbox1 { max-height:none; overflow:hidden; }\ |
.mw-editform #wpTextbox1 { max-height:none; overflow:hidden; }\ |
||
.CodeMirror { height:auto !important; }\ |
.CodeMirror { height:auto !important; }\ |
||
.CodeMirror-scroll { min-height:475px; }\ |
.CodeMirror-scroll { min-height:475px; }\ |
||
' ); |
' ); |
||
// Подготовить все нужные ноды |
|||
getNodes(); |
getNodes(); |
||
// Автоматически масштабировать окно редактирования |
|||
resizeTextbox(); |
resizeTextbox(); |
||
setEditOptions(); |
|||
// События Summary |
|||
setSummaryEvents(); |
|||
} |
} |
||
// CodeMirror |
|||
if( |
if( |
||
EnhanceWikitextEditor.config.allow.includes( _config.contentModel ) |
EnhanceWikitextEditor.config.allow.includes( _config.contentModel ) && |
||
![ 'error', 'missing' ].includes( mw.loader.getState( 'ext.CodeMirror' ) ) |
|||
|| _config.contentModel === 'javascript' |
|||
) { |
|||
init(); |
|||
⚫ | |||
return; |
|||
} |
|||
// Ace Editor |
|||
if ( |
|||
⚫ | |||
![ 'error', 'missing' ].includes( mw.loader.getState( 'ext.codeEditor.ace' ) ) |
|||
) { |
) { |
||
init(); |
|||
// Запускать скрипты только когда отрисовался wikiEditor |
|||
mw.loader.using( [ 'ext.codeEditor', 'ext.codeEditor.ace' ] ).then( setEditor ); |
|||
return; |
|||
⚫ | |||
// Запускать скрипты только когда отрисовался Ace Editor |
|||
⚫ | |||
} |
} |
||
Текущая версия от 10:18, 14 января 2023
/**
* Enhance Wikitext Editor
*
* Author: Serhio Magpie
* Licenses: MIT, CC BY-SA
*/
// <nowiki>
$( function () {
var _config = {
contentModel: mw.config.get( 'wgPageContentModel' ),
codeEditorLanguage: mw.config.get( 'wgCodeEditorCurrentLanguage' )
},
_nodes = {},
_editOptionsHeight = 0,
_css;
if ( !window.EnhanceWikitextEditor ) {
window.EnhanceWikitextEditor = {};
}
EnhanceWikitextEditor.default = {
name: 'EnhanceWikitextEditor',
allow: [ 'wikitext' ],
toggleEditOptions: true
};
EnhanceWikitextEditor.config = $.extend( {}, EnhanceWikitextEditor.default, EnhanceWikitextEditor.config || {} );
function getNodes() {
_nodes.$textbox = $( '#wpTextbox1' );
_nodes.$toolbar = $( '#wikiEditor-ui-toolbar' );
_nodes.$toolbarMain = $( '#wikiEditor-section-main' );
_nodes.$wpPreviewLive = $( '#wpPreviewLive' );
_nodes.$wpDiffLive = $( '#wpDiffLive' );
_nodes.$editOptions = $( '#editform .editOptions' );
_nodes.$summary = $( '#wpSummary' );
_nodes.$sandboxPage = $( '#wpTemplateSandboxPage .oo-ui-inputWidget-input' );
// Code Mirror
_nodes.$codeMirrorButton = $( '#mw-editbutton-codemirror .oo-ui-buttonElement-button' );
// Ace Editor
_nodes.$aceEditorButton = $( '#editform .wikiEditor-ui-toolbar .group-codeeditor-main .oo-ui-toggleButtonWidget .oo-ui-buttonElement-button' );
}
function resizeTextbox() {
// Кнопки переключения режимов редактора
_nodes.$codeMirrorButton.on( 'click', resizeTextboxHandler );
_nodes.$aceEditorButton.on( 'click', resizeTextboxHandler );
// Масштабировать textarea при вводе текста
_nodes.$textbox.on( 'keyup', resizeTextboxHandler );
// Масштабировать textarea или редактор
resizeTextboxHandler();
}
function resizeTextboxHandler() {
let top = $( window ).scrollTop();
_nodes.$textbox.css( 'height', 'auto' );
_nodes.$textbox.css( 'height', _nodes.$textbox.prop( 'scrollHeight' ) + 'px' );
setEditor();
$( window ).scrollTop( top );
}
function setEditOptions() {
if ( !EnhanceWikitextEditor.config.toggleEditOptions ) {
return;
}
_nodes.$editOptions.addClass( 'enhanceWikitextEditor--editOptions' );
_nodes.$editOptions.on( 'mouseenter', setEditOptionsHeight );
_nodes.$summary.on( 'focus', showEditOptions );
_nodes.$summary.on( 'blur', hideEditOptions );
_nodes.$sandboxPage.on( 'focus', showEditOptions );
_nodes.$sandboxPage.on( 'blur', hideEditOptions );
}
function showEditOptions() {
setEditOptionsHeight();
_nodes.$editOptions.addClass( 'visible' );
}
function setEditOptionsHeight() {
if ( _css && _css.cssRules[0] && _css.cssRules[0].selectorText === ':root' ) {
var height = (
_nodes.$editOptions.prop( 'scrollHeight' ) -
_nodes.$editOptions.outerHeight() +
_nodes.$editOptions.height()
);
if ( height !== _editOptionsHeight ) {
_editOptionsHeight = height;
_css.cssRules[0].style.setProperty( '--enhanceWikitextEditor--editOptions-visible-height', height + 'px' );
}
}
}
function hideEditOptions() {
_nodes.$editOptions.removeClass( 'visible' );
}
function setCodeMirror() {
if ( typeof CodeMirror !== 'undefined' ) {
CodeMirror.defaults.viewportMargin = Infinity;
}
}
function setAceEditor() {
if ( typeof ace !== 'undefined' ) {
_nodes.$ace = $( '#editform .ace_editor' );
var editor = ace.edit( _nodes.$ace.get( 0 ) );
editor.setOptions( { maxLines: Infinity } );
}
}
function setEditor() {
setCodeMirror();
setAceEditor();
}
function init() {
_css = mw.util.addCSS( '\
:root { --enhanceWikitextEditor--editOptions-hidden-height:12px; --enhanceWikitextEditor--editOptions-visible-height:300px; }\
\
.wikiEditor-ui .wikiEditor-ui-top { position:-webkit-sticky; position:sticky; top:0; z-index:20; }\
.wikiEditor-ui .wikiEditor-ui-text { height:auto !important; }\
.wikiEditor-ui .wikiEditor-ui-text .ui-resizable { height:auto !important; }\
.wikiEditor-ui .wikiEditor-ui-text .ace_editor { min-height:475px; position:relative !important; }\
.wikiEditor-ui .wikiEditor-ui-text .ace_search { position:fixed; top:auto; bottom:70px; border:1px solid #cbcbcb; border-radius:0; }\
.wikiEditor-ui .wikiEditor-ui-text .ace_search.right { right:24px; }\
.wikiEditor-ui .wikiEditor-ui-view .codeEditor-status { position:sticky; bottom:48px; z-index:4; }\
.wikiEditor-toolbar-dialog { position:fixed !important; }\
\
.enhanceWikitextEditor--editOptions { height:var(--enhanceWikitextEditor--editOptions-hidden-height); position:-webkit-sticky; position:sticky; bottom:0; z-index:19; overflow:hidden; border-top:1px solid #c8ccd1; transition:height 250ms ease-in-out 100ms; }\
.enhanceWikitextEditor--editOptions:hover,\
.enhanceWikitextEditor--editOptions:active,\
.enhanceWikitextEditor--editOptions:focus-within,\
.enhanceWikitextEditor--editOptions.visible { height:var(--enhanceWikitextEditor--editOptions-visible-height); }\
.enhanceWikitextEditor--editOptions #wpSummaryLabel .oo-ui-fieldLayout-header { padding-bottom:1em; }\
\
.mw-editform #wpTextbox1 { max-height:none; overflow:hidden; }\
.CodeMirror { height:auto !important; }\
.CodeMirror-scroll { min-height:475px; }\
' );
getNodes();
resizeTextbox();
setEditOptions();
}
// CodeMirror
if(
EnhanceWikitextEditor.config.allow.includes( _config.contentModel ) &&
![ 'error', 'missing' ].includes( mw.loader.getState( 'ext.CodeMirror' ) )
) {
init();
mw.loader.using( [ 'ext.wikiEditor' ] ).then( setEditor );
return;
}
// Ace Editor
if (
_config.codeEditorLanguage &&
![ 'error', 'missing' ].includes( mw.loader.getState( 'ext.codeEditor.ace' ) )
) {
init();
mw.loader.using( [ 'ext.codeEditor', 'ext.codeEditor.ace' ] ).then( setEditor );
return;
}
} );
// </nowiki>