mirror of
https://github.com/Ionaru/easy-markdown-editor
synced 2025-06-30 14:41:01 -06:00
Merge pull request #196 from nick-denry/preview_without_fullscreen
Preview without fullscreen
This commit is contained in:
commit
d90085acb5
@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Added
|
### Added
|
||||||
- Support for Node.js 14.
|
- Support for Node.js 14.
|
||||||
|
- Preview without fullscreen (Thanks to [@nick-denry], [#196]).
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix cursor displayed position on activity ([#183]).
|
- Fix cursor displayed position on activity ([#183]).
|
||||||
@ -168,6 +169,7 @@ Project forked from [SimpleMDE](https://github.com/sparksuite/simplemde-markdown
|
|||||||
[#9]: https://github.com/Ionaru/easy-markdown-editor/issues/9
|
[#9]: https://github.com/Ionaru/easy-markdown-editor/issues/9
|
||||||
|
|
||||||
<!-- Linked PRs -->
|
<!-- Linked PRs -->
|
||||||
|
[#196]: https://github.com/Ionaru/easy-markdown-editor/pull/196
|
||||||
[#175]: https://github.com/Ionaru/easy-markdown-editor/pull/175
|
[#175]: https://github.com/Ionaru/easy-markdown-editor/pull/175
|
||||||
[#173]: https://github.com/Ionaru/easy-markdown-editor/pull/173
|
[#173]: https://github.com/Ionaru/easy-markdown-editor/pull/173
|
||||||
[#170]: https://github.com/Ionaru/easy-markdown-editor/pull/170
|
[#170]: https://github.com/Ionaru/easy-markdown-editor/pull/170
|
||||||
@ -192,6 +194,7 @@ Project forked from [SimpleMDE](https://github.com/sparksuite/simplemde-markdown
|
|||||||
[#19]: https://github.com/Ionaru/easy-markdown-editor/pull/19
|
[#19]: https://github.com/Ionaru/easy-markdown-editor/pull/19
|
||||||
|
|
||||||
<!-- Linked users -->
|
<!-- Linked users -->
|
||||||
|
[@nick-denry]: https://github.com/nick-denry
|
||||||
[@StefKors]: https://github.com/StefKors
|
[@StefKors]: https://github.com/StefKors
|
||||||
[@felipefdl]: https://github.com/felipefdl
|
[@felipefdl]: https://github.com/felipefdl
|
||||||
[@A-312]: https://github.com/A-312
|
[@A-312]: https://github.com/A-312
|
||||||
|
@ -186,6 +186,7 @@ easyMDE.value('New input for **EasyMDE**');
|
|||||||
- **spellChecker**: If set to `false`, disable the spell checker. Defaults to `true`.
|
- **spellChecker**: If set to `false`, disable the spell checker. Defaults to `true`.
|
||||||
- **inputStyle**: `textarea` or `contenteditable`. Defaults to `textarea` for desktop and `contenteditable` for mobile. `contenteditable` option is necessary to enable nativeSpellcheck.
|
- **inputStyle**: `textarea` or `contenteditable`. Defaults to `textarea` for desktop and `contenteditable` for mobile. `contenteditable` option is necessary to enable nativeSpellcheck.
|
||||||
- **nativeSpellcheck**: If set to `false`, disable native spell checker. Defaults to `true`.
|
- **nativeSpellcheck**: If set to `false`, disable native spell checker. Defaults to `true`.
|
||||||
|
- **sideBySideFullscreen**: If set to `false`, allows side-by-side editing without going into fullscreen. Defaults to `true`.
|
||||||
- **status**: If set to `false`, hide the status bar. Defaults to the array of built-in status bar items.
|
- **status**: If set to `false`, hide the status bar. Defaults to the array of built-in status bar items.
|
||||||
- Optionally, you can set an array of status bar items to include, and in what order. You can even define your own custom status bar items.
|
- Optionally, you can set an array of status bar items to include, and in what order. You can even define your own custom status bar items.
|
||||||
- **styleSelectedText**: If set to `false`, remove the `CodeMirror-selectedtext` class from selected lines. Defaults to `true`.
|
- **styleSelectedText**: If set to `false`, remove the `CodeMirror-selectedtext` class from selected lines. Defaults to `true`.
|
||||||
@ -288,6 +289,7 @@ var editor = new EasyMDE({
|
|||||||
},
|
},
|
||||||
}], // Another optional usage, with a custom status bar item that counts keystrokes
|
}], // Another optional usage, with a custom status bar item that counts keystrokes
|
||||||
styleSelectedText: false,
|
styleSelectedText: false,
|
||||||
|
sideBySideFullscreen: false,
|
||||||
syncSideBySidePreviewScroll: false,
|
syncSideBySidePreviewScroll: false,
|
||||||
tabSize: 4,
|
tabSize: 4,
|
||||||
toolbar: false,
|
toolbar: false,
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
.EasyMDEContainer {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.EasyMDEContainer.sided--no-fullscreen {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
.CodeMirror {
|
.CodeMirror {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: auto;
|
height: auto;
|
||||||
@ -31,6 +41,13 @@
|
|||||||
width: 50% !important;
|
width: 50% !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.CodeMirror-sided.sided--no-fullscreen {
|
||||||
|
border-right: none!important;
|
||||||
|
border-bottom-right-radius: 0px;
|
||||||
|
position: relative;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
.CodeMirror-placeholder {
|
.CodeMirror-placeholder {
|
||||||
opacity: .5;
|
opacity: .5;
|
||||||
}
|
}
|
||||||
@ -116,6 +133,10 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.editor-toolbar.sided--no-fullscreen {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-toolbar button, .editor-toolbar .easymde-dropdown {
|
.editor-toolbar button, .editor-toolbar .easymde-dropdown {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@ -195,6 +216,10 @@
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.editor-statusbar.sided--no-fullscreen {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-statusbar span {
|
.editor-statusbar span {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
min-width: 4em;
|
min-width: 4em;
|
||||||
@ -243,6 +268,12 @@
|
|||||||
display: block
|
display: block
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.editor-preview-active-side.sided--no-fullscreen {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
height: auto;
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-preview-active {
|
.editor-preview-active {
|
||||||
display: block
|
display: block
|
||||||
}
|
}
|
||||||
|
@ -332,6 +332,29 @@ function toggleFullScreen(editor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Hide side by side if needed
|
||||||
|
var sidebyside = cm.getWrapperElement().nextSibling;
|
||||||
|
if (/editor-preview-active-side/.test(sidebyside.className))
|
||||||
|
toggleSideBySide(editor);
|
||||||
|
|
||||||
|
if (editor.options.onToggleFullScreen) {
|
||||||
|
editor.options.onToggleFullScreen(cm.getOption('fullScreen') || false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove or set maxHeight
|
||||||
|
if (cm.getOption('fullScreen')) {
|
||||||
|
if (editor.options.maxHeight !== false) {
|
||||||
|
cm.getScrollerElement().style.removeProperty('height');
|
||||||
|
sidebyside.style.removeProperty('height');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (editor.options.maxHeight !== false) {
|
||||||
|
cm.getScrollerElement().style.height = editor.options.maxHeight;
|
||||||
|
editor.setPreviewMaxHeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Update toolbar class
|
// Update toolbar class
|
||||||
if (!/fullscreen/.test(editor.toolbar_div.className)) {
|
if (!/fullscreen/.test(editor.toolbar_div.className)) {
|
||||||
editor.toolbar_div.className += ' fullscreen';
|
editor.toolbar_div.className += ' fullscreen';
|
||||||
@ -350,16 +373,6 @@ function toggleFullScreen(editor) {
|
|||||||
toolbarButton.className = toolbarButton.className.replace(/\s*active\s*/g, '');
|
toolbarButton.className = toolbarButton.className.replace(/\s*active\s*/g, '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Hide side by side if needed
|
|
||||||
var sidebyside = cm.getWrapperElement().nextSibling;
|
|
||||||
if (/editor-preview-active-side/.test(sidebyside.className))
|
|
||||||
toggleSideBySide(editor);
|
|
||||||
|
|
||||||
if (editor.options.onToggleFullScreen) {
|
|
||||||
editor.options.onToggleFullScreen(cm.getOption('fullScreen') || false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -857,7 +870,32 @@ function toggleSideBySide(editor) {
|
|||||||
var preview = wrapper.nextSibling;
|
var preview = wrapper.nextSibling;
|
||||||
var toolbarButton = editor.toolbarElements && editor.toolbarElements['side-by-side'];
|
var toolbarButton = editor.toolbarElements && editor.toolbarElements['side-by-side'];
|
||||||
var useSideBySideListener = false;
|
var useSideBySideListener = false;
|
||||||
|
|
||||||
|
var noFullscreenItems = [
|
||||||
|
wrapper.parentNode, // easyMDEContainer
|
||||||
|
editor.gui.toolbar,
|
||||||
|
wrapper,
|
||||||
|
preview,
|
||||||
|
editor.gui.statusbar,
|
||||||
|
];
|
||||||
|
|
||||||
|
function addNoFullscreenClass(el) {
|
||||||
|
el.className += ' sided--no-fullscreen';
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeNoFullscreenClass(el) {
|
||||||
|
el.className = el.className.replace(
|
||||||
|
/\s*sided--no-fullscreen\s*/g, ''
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (/editor-preview-active-side/.test(preview.className)) {
|
if (/editor-preview-active-side/.test(preview.className)) {
|
||||||
|
if (cm.getOption('sideBySideNoFullscreen')) {
|
||||||
|
cm.setOption('sideBySideNoFullscreen', false);
|
||||||
|
noFullscreenItems.forEach(function (el) {
|
||||||
|
removeNoFullscreenClass(el);
|
||||||
|
});
|
||||||
|
}
|
||||||
preview.className = preview.className.replace(
|
preview.className = preview.className.replace(
|
||||||
/\s*editor-preview-active-side\s*/g, ''
|
/\s*editor-preview-active-side\s*/g, ''
|
||||||
);
|
);
|
||||||
@ -868,8 +906,16 @@ function toggleSideBySide(editor) {
|
|||||||
// give some time for the transition from editor.css to fire and the view to slide from right to left,
|
// give some time for the transition from editor.css to fire and the view to slide from right to left,
|
||||||
// instead of just appearing.
|
// instead of just appearing.
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
if (!cm.getOption('fullScreen'))
|
if (!cm.getOption('fullScreen')) {
|
||||||
toggleFullScreen(editor);
|
if (editor.options.sideBySideFullscreen === false) {
|
||||||
|
cm.setOption('sideBySideNoFullscreen', true);
|
||||||
|
noFullscreenItems.forEach(function(el) {
|
||||||
|
addNoFullscreenClass(el);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
toggleFullScreen(editor);
|
||||||
|
}
|
||||||
|
}
|
||||||
preview.className += ' editor-preview-active-side';
|
preview.className += ' editor-preview-active-side';
|
||||||
}, 1);
|
}, 1);
|
||||||
if (toolbarButton) toolbarButton.className += ' active';
|
if (toolbarButton) toolbarButton.className += ' active';
|
||||||
@ -924,6 +970,12 @@ function togglePreview(editor) {
|
|||||||
var toolbar_div = editor.toolbar_div;
|
var toolbar_div = editor.toolbar_div;
|
||||||
var toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;
|
var toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;
|
||||||
var preview = wrapper.lastChild;
|
var preview = wrapper.lastChild;
|
||||||
|
|
||||||
|
// Turn off side by side if needed
|
||||||
|
var sidebyside = cm.getWrapperElement().nextSibling;
|
||||||
|
if (/editor-preview-active-side/.test(sidebyside.className))
|
||||||
|
toggleSideBySide(editor);
|
||||||
|
|
||||||
if (!preview || !/editor-preview-full/.test(preview.className)) {
|
if (!preview || !/editor-preview-full/.test(preview.className)) {
|
||||||
|
|
||||||
preview = document.createElement('div');
|
preview = document.createElement('div');
|
||||||
@ -943,6 +995,7 @@ function togglePreview(editor) {
|
|||||||
|
|
||||||
wrapper.appendChild(preview);
|
wrapper.appendChild(preview);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/editor-preview-active/.test(preview.className)) {
|
if (/editor-preview-active/.test(preview.className)) {
|
||||||
preview.className = preview.className.replace(
|
preview.className = preview.className.replace(
|
||||||
/\s*editor-preview-active\s*/g, ''
|
/\s*editor-preview-active\s*/g, ''
|
||||||
@ -965,10 +1018,6 @@ function togglePreview(editor) {
|
|||||||
}
|
}
|
||||||
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
||||||
|
|
||||||
// Turn off side by side if needed
|
|
||||||
var sidebyside = cm.getWrapperElement().nextSibling;
|
|
||||||
if (/editor-preview-active-side/.test(sidebyside.className))
|
|
||||||
toggleSideBySide(editor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _replaceSelection(cm, active, startEnd, url) {
|
function _replaceSelection(cm, active, startEnd, url) {
|
||||||
@ -1672,6 +1721,7 @@ function EasyMDE(options) {
|
|||||||
options.shortcuts = extend({}, shortcuts, options.shortcuts || {});
|
options.shortcuts = extend({}, shortcuts, options.shortcuts || {});
|
||||||
|
|
||||||
options.minHeight = options.minHeight || '300px';
|
options.minHeight = options.minHeight || '300px';
|
||||||
|
options.maxHeight = options.maxHeight || false;
|
||||||
|
|
||||||
options.errorCallback = options.errorCallback || function (errorMessage) {
|
options.errorCallback = options.errorCallback || function (errorMessage) {
|
||||||
alert(errorMessage);
|
alert(errorMessage);
|
||||||
@ -1959,6 +2009,10 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
|
|
||||||
this.codemirror.getScrollerElement().style.minHeight = options.minHeight;
|
this.codemirror.getScrollerElement().style.minHeight = options.minHeight;
|
||||||
|
|
||||||
|
if (options.maxHeight !== false) {
|
||||||
|
this.codemirror.getScrollerElement().style.height = options.maxHeight;
|
||||||
|
}
|
||||||
|
|
||||||
if (options.forceSync === true) {
|
if (options.forceSync === true) {
|
||||||
var cm = this.codemirror;
|
var cm = this.codemirror;
|
||||||
cm.on('change', function () {
|
cm.on('change', function () {
|
||||||
@ -1968,6 +2022,14 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
|
|
||||||
this.gui = {};
|
this.gui = {};
|
||||||
|
|
||||||
|
// Wrap Codemirror with container before create toolbar, etc,
|
||||||
|
// to use with sideBySideFullscreen option.
|
||||||
|
var easyMDEContainer = document.createElement('div');
|
||||||
|
easyMDEContainer.classList.add('EasyMDEContainer');
|
||||||
|
var cmWrapper = this.codemirror.getWrapperElement();
|
||||||
|
cmWrapper.parentNode.insertBefore(easyMDEContainer, cmWrapper);
|
||||||
|
easyMDEContainer.appendChild(cmWrapper);
|
||||||
|
|
||||||
if (options.toolbar !== false) {
|
if (options.toolbar !== false) {
|
||||||
this.gui.toolbar = this.createToolbar();
|
this.gui.toolbar = this.createToolbar();
|
||||||
}
|
}
|
||||||
@ -2229,6 +2291,21 @@ EasyMDE.prototype.uploadImageUsingCustomFunction = function(imageUploadFunction,
|
|||||||
imageUploadFunction(file, onSuccess, onError);
|
imageUploadFunction(file, onSuccess, onError);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EasyMDE.prototype.setPreviewMaxHeight = function () {
|
||||||
|
var cm = this.codemirror;
|
||||||
|
var wrapper = cm.getWrapperElement();
|
||||||
|
var preview = wrapper.nextSibling;
|
||||||
|
|
||||||
|
// Calc preview max height
|
||||||
|
var paddingTop = parseInt(window.getComputedStyle(wrapper).paddingTop);
|
||||||
|
var borderTopWidth = parseInt(window.getComputedStyle(wrapper).borderTopWidth);
|
||||||
|
var optionsMaxHeight = parseInt(this.options.maxHeight);
|
||||||
|
var wrapperMaxHeight = optionsMaxHeight + paddingTop * 2 + borderTopWidth * 2;
|
||||||
|
var previewMaxHeight = wrapperMaxHeight.toString() + 'px';
|
||||||
|
|
||||||
|
preview.style.height = previewMaxHeight;
|
||||||
|
};
|
||||||
|
|
||||||
EasyMDE.prototype.createSideBySide = function () {
|
EasyMDE.prototype.createSideBySide = function () {
|
||||||
var cm = this.codemirror;
|
var cm = this.codemirror;
|
||||||
var wrapper = cm.getWrapperElement();
|
var wrapper = cm.getWrapperElement();
|
||||||
@ -2253,6 +2330,10 @@ EasyMDE.prototype.createSideBySide = function () {
|
|||||||
wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);
|
wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.options.maxHeight !== false) {
|
||||||
|
this.setPreviewMaxHeight();
|
||||||
|
}
|
||||||
|
|
||||||
if (this.options.syncSideBySidePreviewScroll === false) return preview;
|
if (this.options.syncSideBySidePreviewScroll === false) return preview;
|
||||||
// Syncs scroll editor -> preview
|
// Syncs scroll editor -> preview
|
||||||
var cScroll = false;
|
var cScroll = false;
|
||||||
|
@ -164,6 +164,7 @@ const editorImagesCustom = new EasyMDE({
|
|||||||
});
|
});
|
||||||
|
|
||||||
new EasyMDE({
|
new EasyMDE({
|
||||||
|
sideBySideFullscreen: true,
|
||||||
autosave: {
|
autosave: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
delay: 2000,
|
delay: 2000,
|
||||||
@ -180,6 +181,7 @@ new EasyMDE({
|
|||||||
});
|
});
|
||||||
|
|
||||||
new EasyMDE({
|
new EasyMDE({
|
||||||
|
sideBySideFullscreen: false,
|
||||||
toolbar: [
|
toolbar: [
|
||||||
'bold',
|
'bold',
|
||||||
'italic',
|
'italic',
|
||||||
|
1
types/easymde.d.ts
vendored
1
types/easymde.d.ts
vendored
@ -183,6 +183,7 @@ declare namespace EasyMDE {
|
|||||||
spellChecker?: boolean;
|
spellChecker?: boolean;
|
||||||
inputStyle?: 'textarea' | 'contenteditable';
|
inputStyle?: 'textarea' | 'contenteditable';
|
||||||
nativeSpellcheck?: boolean;
|
nativeSpellcheck?: boolean;
|
||||||
|
sideBySideFullscreen?: boolean;
|
||||||
status?: boolean | ReadonlyArray<string | StatusBarItem>;
|
status?: boolean | ReadonlyArray<string | StatusBarItem>;
|
||||||
styleSelectedText?: boolean;
|
styleSelectedText?: boolean;
|
||||||
tabSize?: number;
|
tabSize?: number;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user