mirror of
https://github.com/sparksuite/simplemde-markdown-editor.git
synced 2024-06-01 21:42:28 +02: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;
|
||||
vertical-align: top;
|
||||
margin-bottom: -30px;
|
||||
/* Hack to make IE7 behave */
|
||||
*zoom:1;
|
||||
*display:inline;
|
||||
}
|
||||
.CodeMirror-gutter-wrapper {
|
||||
position: absolute;
|
||||
|
@ -258,8 +255,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
|
|||
position: relative;
|
||||
overflow: visible;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
-webkit-font-variant-ligatures: none;
|
||||
font-variant-ligatures: none;
|
||||
-webkit-font-variant-ligatures: contextual;
|
||||
font-variant-ligatures: contextual;
|
||||
}
|
||||
.CodeMirror-wrap pre {
|
||||
word-wrap: break-word;
|
||||
|
@ -333,9 +330,6 @@ div.CodeMirror-dragcursors {
|
|||
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 */
|
||||
.cm-force-border { padding-right: .1px; }
|
||||
|
||||
|
@ -579,6 +573,11 @@ span.CodeMirror-selectedtext { background: none; }
|
|||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
iframe.editor-preview {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.editor-preview-side {
|
||||
padding: 10px;
|
||||
position: fixed;
|
||||
|
@ -594,6 +593,11 @@ span.CodeMirror-selectedtext { background: none; }
|
|||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
iframe.editor-preview-side {
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.editor-preview-active-side {
|
||||
display: block
|
||||
}
|
||||
|
|
17923
debug/simplemde.debug.js
17923
debug/simplemde.debug.js
File diff suppressed because one or more lines are too long
17921
debug/simplemde.js
17921
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;
|
||||
}
|
||||
|
||||
iframe.editor-preview {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.editor-preview-side {
|
||||
padding: 10px;
|
||||
position: fixed;
|
||||
|
@ -240,6 +245,11 @@
|
|||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
iframe.editor-preview-side {
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.editor-preview-active-side {
|
||||
display: block
|
||||
}
|
||||
|
|
|
@ -178,6 +178,46 @@ function getState(cm, pos) {
|
|||
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
|
||||
var saved_overflow = "";
|
||||
|
@ -727,7 +767,7 @@ function toggleSideBySide(editor) {
|
|||
}
|
||||
|
||||
var sideBySideRenderingFunction = function() {
|
||||
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
||||
injectPreviewContent(preview, editor.options.previewRender(editor.value(), preview));
|
||||
};
|
||||
|
||||
if(!cm.sideBySideRenderingFunction) {
|
||||
|
@ -735,7 +775,7 @@ function toggleSideBySide(editor) {
|
|||
}
|
||||
|
||||
if(useSideBySideListener) {
|
||||
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
|
||||
injectPreviewContent(preview, editor.options.previewRender(editor.value(), preview));
|
||||
cm.on("update", cm.sideBySideRenderingFunction);
|
||||
} else {
|
||||
cm.off("update", cm.sideBySideRenderingFunction);
|
||||
|
@ -756,8 +796,7 @@ function togglePreview(editor) {
|
|||
var toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;
|
||||
var preview = wrapper.lastChild;
|
||||
if(!preview || !/editor-preview/.test(preview.className)) {
|
||||
preview = document.createElement("div");
|
||||
preview.className = "editor-preview";
|
||||
preview = createPreviewContainer("editor-preview", editor.options.previewConfig);
|
||||
wrapper.appendChild(preview);
|
||||
}
|
||||
if(/editor-preview-active/.test(preview.className)) {
|
||||
|
@ -780,7 +819,7 @@ function togglePreview(editor) {
|
|||
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
|
||||
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
|
||||
options.parsingConfig = extend({
|
||||
highlightFormatting: true // needed for toggleCodeBlock to detect types of code
|
||||
|
@ -1662,38 +1708,40 @@ SimpleMDE.prototype.createSideBySide = function() {
|
|||
var preview = wrapper.nextSibling;
|
||||
|
||||
if(!preview || !/editor-preview-side/.test(preview.className)) {
|
||||
preview = document.createElement("div");
|
||||
preview.className = "editor-preview-side";
|
||||
preview = createPreviewContainer("editor-preview-side", this.options.previewConfig);
|
||||
wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);
|
||||
}
|
||||
|
||||
// Syncs scroll editor -> preview
|
||||
var cScroll = false;
|
||||
var pScroll = false;
|
||||
cm.on("scroll", function(v) {
|
||||
if(cScroll) {
|
||||
cScroll = false;
|
||||
return;
|
||||
}
|
||||
pScroll = true;
|
||||
var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight;
|
||||
var ratio = parseFloat(v.getScrollInfo().top) / height;
|
||||
var move = (preview.scrollHeight - preview.clientHeight) * ratio;
|
||||
preview.scrollTop = move;
|
||||
});
|
||||
if(preview.tagName == "DIV") {
|
||||
// Syncs scroll editor -> preview
|
||||
var cScroll = false;
|
||||
var pScroll = false;
|
||||
cm.on("scroll", function(v) {
|
||||
if(cScroll) {
|
||||
cScroll = false;
|
||||
return;
|
||||
}
|
||||
pScroll = true;
|
||||
var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight;
|
||||
var ratio = parseFloat(v.getScrollInfo().top) / height;
|
||||
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;
|
||||
};
|
||||
|
||||
|
@ -1923,7 +1971,7 @@ SimpleMDE.prototype.value = function(val) {
|
|||
if(this.isPreviewActive()) {
|
||||
var wrapper = cm.getWrapperElement();
|
||||
var preview = wrapper.lastChild;
|
||||
preview.innerHTML = this.options.previewRender(val, preview);
|
||||
injectPreviewContent(preview, this.options.previewRender(val, preview));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@ -2079,4 +2127,4 @@ SimpleMDE.prototype.toTextArea = function() {
|
|||
}
|
||||
};
|
||||
|
||||
module.exports = SimpleMDE;
|
||||
module.exports = SimpleMDE;
|
||||
|
|
Loading…
Reference in a new issue