mirror of
https://github.com/sparksuite/simplemde-markdown-editor.git
synced 2025-09-24 16:40:55 -06:00
Implement an option to use iframe for preview
This commit is contained in:
parent
5b8611628b
commit
dfc5d771fa
@ -212,9 +212,6 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
margin-bottom: -30px;
|
margin-bottom: -30px;
|
||||||
/* Hack to make IE7 behave */
|
|
||||||
*zoom:1;
|
|
||||||
*display:inline;
|
|
||||||
}
|
}
|
||||||
.CodeMirror-gutter-wrapper {
|
.CodeMirror-gutter-wrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -258,8 +255,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
|
|||||||
position: relative;
|
position: relative;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
-webkit-font-variant-ligatures: none;
|
-webkit-font-variant-ligatures: contextual;
|
||||||
font-variant-ligatures: none;
|
font-variant-ligatures: contextual;
|
||||||
}
|
}
|
||||||
.CodeMirror-wrap pre {
|
.CodeMirror-wrap pre {
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
@ -333,9 +330,6 @@ div.CodeMirror-dragcursors {
|
|||||||
background: rgba(255, 255, 0, .4);
|
background: rgba(255, 255, 0, .4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
|
|
||||||
.CodeMirror span { *vertical-align: text-bottom; }
|
|
||||||
|
|
||||||
/* Used to force a border model for a node */
|
/* Used to force a border model for a node */
|
||||||
.cm-force-border { padding-right: .1px; }
|
.cm-force-border { padding-right: .1px; }
|
||||||
|
|
||||||
@ -579,6 +573,11 @@ span.CodeMirror-selectedtext { background: none; }
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iframe.editor-preview {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-preview-side {
|
.editor-preview-side {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@ -594,6 +593,11 @@ span.CodeMirror-selectedtext { background: none; }
|
|||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iframe.editor-preview-side {
|
||||||
|
padding: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-preview-active-side {
|
.editor-preview-active-side {
|
||||||
display: block
|
display: block
|
||||||
}
|
}
|
||||||
|
17799
debug/simplemde.debug.js
17799
debug/simplemde.debug.js
File diff suppressed because one or more lines are too long
17797
debug/simplemde.js
17797
debug/simplemde.js
File diff suppressed because it is too large
Load Diff
2
dist/simplemde.min.css
vendored
2
dist/simplemde.min.css
vendored
File diff suppressed because one or more lines are too long
18
dist/simplemde.min.js
vendored
18
dist/simplemde.min.js
vendored
File diff suppressed because one or more lines are too long
@ -225,6 +225,11 @@
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iframe.editor-preview {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-preview-side {
|
.editor-preview-side {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@ -240,6 +245,11 @@
|
|||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iframe.editor-preview-side {
|
||||||
|
padding: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.editor-preview-active-side {
|
.editor-preview-active-side {
|
||||||
display: block
|
display: block
|
||||||
}
|
}
|
||||||
|
@ -178,6 +178,46 @@ function getState(cm, pos) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createPreviewContainer(className, previewConfig) {
|
||||||
|
var preview;
|
||||||
|
|
||||||
|
if(previewConfig.useIframe) {
|
||||||
|
preview = document.createElement("iframe");
|
||||||
|
preview.onload = function() {
|
||||||
|
var idoc = getIframeDocument(preview);
|
||||||
|
|
||||||
|
for(var i in previewConfig.editorCss) {
|
||||||
|
var link = idoc.createElement("link");
|
||||||
|
link.rel = "stylesheet";
|
||||||
|
link.href = previewConfig.editorCss[i];
|
||||||
|
idoc.head.appendChild(link);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
preview = document.createElement("div");
|
||||||
|
}
|
||||||
|
|
||||||
|
preview.className = className;
|
||||||
|
|
||||||
|
return preview;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getIframeDocument(iframe) {
|
||||||
|
return iframe.contentDocument || iframe.contentWindow.document;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPreviewContentContainer(preview) {
|
||||||
|
if(preview.tagName == "IFRAME") {
|
||||||
|
return getIframeDocument(preview).body;
|
||||||
|
}
|
||||||
|
|
||||||
|
return preview;
|
||||||
|
}
|
||||||
|
|
||||||
|
function injectPreviewContent(preview, content) {
|
||||||
|
getPreviewContentContainer(preview).innerHTML = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Saved overflow setting
|
// Saved overflow setting
|
||||||
var saved_overflow = "";
|
var saved_overflow = "";
|
||||||
@ -727,7 +767,7 @@ function toggleSideBySide(editor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var sideBySideRenderingFunction = function() {
|
var sideBySideRenderingFunction = function() {
|
||||||
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
injectPreviewContent(preview, editor.options.previewRender(editor.value(), preview));
|
||||||
};
|
};
|
||||||
|
|
||||||
if(!cm.sideBySideRenderingFunction) {
|
if(!cm.sideBySideRenderingFunction) {
|
||||||
@ -735,7 +775,7 @@ function toggleSideBySide(editor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(useSideBySideListener) {
|
if(useSideBySideListener) {
|
||||||
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
injectPreviewContent(preview, editor.options.previewRender(editor.value(), preview));
|
||||||
cm.on("update", cm.sideBySideRenderingFunction);
|
cm.on("update", cm.sideBySideRenderingFunction);
|
||||||
} else {
|
} else {
|
||||||
cm.off("update", cm.sideBySideRenderingFunction);
|
cm.off("update", cm.sideBySideRenderingFunction);
|
||||||
@ -756,8 +796,7 @@ function togglePreview(editor) {
|
|||||||
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;
|
||||||
if(!preview || !/editor-preview/.test(preview.className)) {
|
if(!preview || !/editor-preview/.test(preview.className)) {
|
||||||
preview = document.createElement("div");
|
preview = createPreviewContainer("editor-preview", editor.options.previewConfig);
|
||||||
preview.className = "editor-preview";
|
|
||||||
wrapper.appendChild(preview);
|
wrapper.appendChild(preview);
|
||||||
}
|
}
|
||||||
if(/editor-preview-active/.test(preview.className)) {
|
if(/editor-preview-active/.test(preview.className)) {
|
||||||
@ -780,7 +819,7 @@ function togglePreview(editor) {
|
|||||||
toolbar_div.className += " disabled-for-preview";
|
toolbar_div.className += " disabled-for-preview";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
injectPreviewContent(preview, editor.options.previewRender(editor.value(), preview));
|
||||||
|
|
||||||
// Turn off side by side if needed
|
// Turn off side by side if needed
|
||||||
var sidebyside = cm.getWrapperElement().nextSibling;
|
var sidebyside = cm.getWrapperElement().nextSibling;
|
||||||
@ -1376,6 +1415,13 @@ function SimpleMDE(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set default options for preview config
|
||||||
|
options.previewConfig = extend({
|
||||||
|
useIframe: true, // should the preview be done in an iframe to isolate stylesheets
|
||||||
|
editorCss: [] // if the iframe mode is enabled, an array of stylesheets to style the preview area
|
||||||
|
}, options.previewConfig || {});
|
||||||
|
|
||||||
|
|
||||||
// Set default options for parsing config
|
// Set default options for parsing config
|
||||||
options.parsingConfig = extend({
|
options.parsingConfig = extend({
|
||||||
highlightFormatting: true // needed for toggleCodeBlock to detect types of code
|
highlightFormatting: true // needed for toggleCodeBlock to detect types of code
|
||||||
@ -1662,11 +1708,11 @@ SimpleMDE.prototype.createSideBySide = function() {
|
|||||||
var preview = wrapper.nextSibling;
|
var preview = wrapper.nextSibling;
|
||||||
|
|
||||||
if(!preview || !/editor-preview-side/.test(preview.className)) {
|
if(!preview || !/editor-preview-side/.test(preview.className)) {
|
||||||
preview = document.createElement("div");
|
preview = createPreviewContainer("editor-preview-side", this.options.previewConfig);
|
||||||
preview.className = "editor-preview-side";
|
|
||||||
wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);
|
wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(preview.tagName == "DIV") {
|
||||||
// Syncs scroll editor -> preview
|
// Syncs scroll editor -> preview
|
||||||
var cScroll = false;
|
var cScroll = false;
|
||||||
var pScroll = false;
|
var pScroll = false;
|
||||||
@ -1694,6 +1740,8 @@ SimpleMDE.prototype.createSideBySide = function() {
|
|||||||
var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;
|
var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;
|
||||||
cm.scrollTo(0, move);
|
cm.scrollTo(0, move);
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return preview;
|
return preview;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1923,7 +1971,7 @@ SimpleMDE.prototype.value = function(val) {
|
|||||||
if(this.isPreviewActive()) {
|
if(this.isPreviewActive()) {
|
||||||
var wrapper = cm.getWrapperElement();
|
var wrapper = cm.getWrapperElement();
|
||||||
var preview = wrapper.lastChild;
|
var preview = wrapper.lastChild;
|
||||||
preview.innerHTML = this.options.previewRender(val, preview);
|
injectPreviewContent(preview, this.options.previewRender(val, preview));
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user