Implement an option to use iframe for preview

pull/504/head
Titouan Galopin 7 years ago
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
} }

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

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,38 +1708,40 @@ 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);
} }
// Syncs scroll editor -> preview if(preview.tagName == "DIV") {
var cScroll = false; // Syncs scroll editor -> preview
var pScroll = false; var cScroll = false;
cm.on("scroll", function(v) { var pScroll = false;
if(cScroll) { cm.on("scroll", function(v) {
cScroll = false; if(cScroll) {
return; cScroll = false;
} return;
pScroll = true; }
var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight; pScroll = true;
var ratio = parseFloat(v.getScrollInfo().top) / height; var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight;
var move = (preview.scrollHeight - preview.clientHeight) * ratio; var ratio = parseFloat(v.getScrollInfo().top) / height;
preview.scrollTop = move; var move = (preview.scrollHeight - preview.clientHeight) * ratio;
}); preview.scrollTop = move;
});
// Syncs scroll preview -> editor
preview.onscroll = function() {
if(pScroll) {
pScroll = false;
return;
}
cScroll = true;
var height = preview.scrollHeight - preview.clientHeight;
var ratio = parseFloat(preview.scrollTop) / height;
var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;
cm.scrollTo(0, move);
};
}
// Syncs scroll preview -> editor
preview.onscroll = function() {
if(pScroll) {
pScroll = false;
return;
}
cScroll = true;
var height = preview.scrollHeight - preview.clientHeight;
var ratio = parseFloat(preview.scrollTop) / height;
var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;
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;
} }
@ -2079,4 +2127,4 @@ SimpleMDE.prototype.toTextArea = function() {
} }
}; };
module.exports = SimpleMDE; module.exports = SimpleMDE;

Loading…
Cancel
Save