New partialRendering extension
This commit is contained in:
parent
6c9e8317dd
commit
0d6d329e6a
@ -630,7 +630,7 @@
|
|||||||
<div class="msg-no-publish hide">
|
<div class="msg-no-publish hide">
|
||||||
"<span class="file-title"></span>" is not published yet. <br /> <br />
|
"<span class="file-title"></span>" is not published yet. <br /> <br />
|
||||||
</div>
|
</div>
|
||||||
<b>NOTE:</b> You can add locations using "Publish on" sub-menu.
|
<b>NOTE:</b> You can add publications using "Publish on" sub-menu.
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
10
js/core.js
10
js/core.js
@ -224,8 +224,8 @@ define([
|
|||||||
if(editor !== undefined) {
|
if(editor !== undefined) {
|
||||||
// If the editor is already created
|
// If the editor is already created
|
||||||
editor.undoManager.reinit(initDocumentContent, fileDesc.editorStart, fileDesc.editorEnd, fileDesc.editorScrollTop);
|
editor.undoManager.reinit(initDocumentContent, fileDesc.editorStart, fileDesc.editorEnd, fileDesc.editorScrollTop);
|
||||||
editor.refreshPreview();
|
|
||||||
extensionMgr.onFileOpen(fileDesc);
|
extensionMgr.onFileOpen(fileDesc);
|
||||||
|
editor.refreshPreview();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var previewContainerElt = $(".preview-container");
|
var previewContainerElt = $(".preview-container");
|
||||||
@ -256,12 +256,12 @@ define([
|
|||||||
converter.hooks.chain("preConversion", function(text) {
|
converter.hooks.chain("preConversion", function(text) {
|
||||||
var tmpText = text + "\n\n";
|
var tmpText = text + "\n\n";
|
||||||
var sectionList = [], offset = 0;
|
var sectionList = [], offset = 0;
|
||||||
// Look for titles (exclude gfm blocs)
|
// Look for titles (excluding gfm blocs)
|
||||||
tmpText.replace(/^```.*\n[\s\S]*?\n```|(^.+[ \t]*\n=+[ \t]*\n+|^.+[ \t]*\n-+[ \t]*\n+|^\#{1,6}[ \t]*.+?[ \t]*\#*\n+)/gm, function(match, title, matchOffset) {
|
tmpText.replace(/^```.*\n[\s\S]*?\n```|(^.+[ \t]*\n=+[ \t]*\n+|^.+[ \t]*\n-+[ \t]*\n+|^\#{1,6}[ \t]*.+?[ \t]*\#*\n+)/gm, function(match, title, matchOffset) {
|
||||||
if(title && matchOffset > offset) {
|
if(title) {
|
||||||
// We just found a title which means end of the previous section
|
// We just found a title which means end of the previous section
|
||||||
// Exclude last \n of the section
|
// Exclude last \n of the section
|
||||||
sectionList.push(tmpText.substring(offset, matchOffset - 1));
|
sectionList.push(tmpText.substring(offset, matchOffset));
|
||||||
offset = matchOffset;
|
offset = matchOffset;
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
@ -318,7 +318,7 @@ define([
|
|||||||
else {
|
else {
|
||||||
previewWrapper = function(makePreview) {
|
previewWrapper = function(makePreview) {
|
||||||
return function() {
|
return function() {
|
||||||
window.previewStartTime = new Date().getTime();
|
extensionMgr.previewStartTime = new Date();
|
||||||
makePreview();
|
makePreview();
|
||||||
if(documentContent === undefined) {
|
if(documentContent === undefined) {
|
||||||
previewContainerElt.scrollTop(fileDesc.previewScrollTop);
|
previewContainerElt.scrollTop(fileDesc.previewScrollTop);
|
||||||
|
@ -164,7 +164,7 @@ define([
|
|||||||
html += $(this).html();
|
html += $(this).html();
|
||||||
});
|
});
|
||||||
onPreviewFinished(utils.trim(html));
|
onPreviewFinished(utils.trim(html));
|
||||||
console.log("Preview time: " + (new Date().getTime() - window.previewStartTime));
|
logger.log("Preview time: " + (new Date() - extensionMgr.previewStartTime));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// We assume images are loading in the preview
|
// We assume images are loading in the preview
|
||||||
|
@ -35,7 +35,7 @@ define([
|
|||||||
linebreaks: {
|
linebreaks: {
|
||||||
automatic: true
|
automatic: true
|
||||||
},
|
},
|
||||||
EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50),
|
EqnChunk: 10,
|
||||||
imageFont: null
|
imageFont: null
|
||||||
},
|
},
|
||||||
tex2jax: tex2jax,
|
tex2jax: tex2jax,
|
||||||
|
@ -5,23 +5,23 @@ define([
|
|||||||
"text!html/partialRenderingSettingsBlock.html",
|
"text!html/partialRenderingSettingsBlock.html",
|
||||||
], function($, _, Extension, partialRenderingSettingsBlockHTML) {
|
], function($, _, Extension, partialRenderingSettingsBlockHTML) {
|
||||||
|
|
||||||
var partialRendering = new Extension("partialRendering", "Partial rendering", true);
|
var partialRendering = new Extension("partialRendering", "Partial Rendering", true);
|
||||||
partialRendering.settingsBlock = partialRenderingSettingsBlockHTML;
|
partialRendering.settingsBlock = partialRenderingSettingsBlockHTML;
|
||||||
|
|
||||||
var converter = undefined;
|
var converter = undefined;
|
||||||
var sectionCounter = 0;
|
var sectionCounter = 0;
|
||||||
var sectionList = [];
|
var sectionList = [];
|
||||||
var linkDefinition = "";
|
var linkDefinition = undefined;
|
||||||
var sectionsToRemove = [];
|
var sectionsToRemove = [];
|
||||||
var modifiedSections = [];
|
var modifiedSections = [];
|
||||||
var insertAfterSection = undefined;
|
var insertAfterSection = undefined;
|
||||||
var fileChanged = true;
|
var fileChanged = false;
|
||||||
function updateSectionList(newSectionList, newLinkDefinition) {
|
function updateSectionList(newSectionList, newLinkDefinition) {
|
||||||
modifiedSections = [];
|
modifiedSections = [];
|
||||||
sectionsToRemove = [];
|
sectionsToRemove = [];
|
||||||
insertAfterSection = undefined;
|
insertAfterSection = undefined;
|
||||||
|
|
||||||
// Render everything if file changed or linkDefinition changed
|
// Render everything if file or linkDefinition changed
|
||||||
if(fileChanged === true || linkDefinition != newLinkDefinition) {
|
if(fileChanged === true || linkDefinition != newLinkDefinition) {
|
||||||
fileChanged = false;
|
fileChanged = false;
|
||||||
linkDefinition = newLinkDefinition;
|
linkDefinition = newLinkDefinition;
|
||||||
@ -31,7 +31,7 @@ define([
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find modified sections starting from left
|
// Find modified sections starting from top
|
||||||
var leftIndex = sectionList.length;
|
var leftIndex = sectionList.length;
|
||||||
_.some(sectionList, function(section, index) {
|
_.some(sectionList, function(section, index) {
|
||||||
if(index >= newSectionList.length || section.text != newSectionList[index].text) {
|
if(index >= newSectionList.length || section.text != newSectionList[index].text) {
|
||||||
@ -40,7 +40,7 @@ define([
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Find modified sections starting from right
|
// Find modified sections starting from bottom
|
||||||
var rightIndex = -sectionList.length;
|
var rightIndex = -sectionList.length;
|
||||||
_.some(sectionList.slice().reverse(), function(section, index) {
|
_.some(sectionList.slice().reverse(), function(section, index) {
|
||||||
if(index >= newSectionList.length || section.text != newSectionList[newSectionList.length - index - 1].text) {
|
if(index >= newSectionList.length || section.text != newSectionList[newSectionList.length - index - 1].text) {
|
||||||
@ -82,7 +82,7 @@ define([
|
|||||||
return wholeMatch;
|
return wholeMatch;
|
||||||
});
|
});
|
||||||
|
|
||||||
// And eventually footnotes...
|
// And footnotes eventually
|
||||||
if(doFootnotes) {
|
if(doFootnotes) {
|
||||||
text = text.replace(/^```.*\n[\s\S]*?\n```|\n[ ]{0,3}\[\^(.+?)\]\:[ \t]*\n?([\s\S]*?)\n{1,2}((?=\n[ ]{0,3}\S)|$)/g, function(wholeMatch, footnote) {
|
text = text.replace(/^```.*\n[\s\S]*?\n```|\n[ ]{0,3}\[\^(.+?)\]\:[ \t]*\n?([\s\S]*?)\n{1,2}((?=\n[ ]{0,3}\S)|$)/g, function(wholeMatch, footnote) {
|
||||||
if(footnote) {
|
if(footnote) {
|
||||||
@ -120,7 +120,7 @@ define([
|
|||||||
var insertAfterSectionElt = insertAfterSection === undefined ? wmdPreviewElt : $("#wmd-preview-section-" + insertAfterSection.id);
|
var insertAfterSectionElt = insertAfterSection === undefined ? wmdPreviewElt : $("#wmd-preview-section-" + insertAfterSection.id);
|
||||||
_.each(modifiedSections, function(section) {
|
_.each(modifiedSections, function(section) {
|
||||||
var sectionElt = $('<div id="wmd-preview-section-' + section.id + '" class="wmd-preview-section preview-content">');
|
var sectionElt = $('<div id="wmd-preview-section-' + section.id + '" class="wmd-preview-section preview-content">');
|
||||||
_.some(wmdPreviewElt.children(), function(elt, index) {
|
_.some(wmdPreviewElt.contents(), function(elt, index) {
|
||||||
elt = $(elt);
|
elt = $(elt);
|
||||||
if(index !== 0 && elt.is(".wmd-title")) {
|
if(index !== 0 && elt.is(".wmd-title")) {
|
||||||
return true;
|
return true;
|
||||||
@ -155,7 +155,7 @@ define([
|
|||||||
// Append the whole footnotes at the end of the document
|
// Append the whole footnotes at the end of the document
|
||||||
footnoteContainerElt.html($('<div class="footnotes">').append("<hr>").append(footnoteElts));
|
footnoteContainerElt.html($('<div class="footnotes">').append("<hr>").append(footnoteElts));
|
||||||
}
|
}
|
||||||
// Keep only used footnotes in our map
|
// Keep used footnotes only in our map
|
||||||
footnoteList = _.pick(footnoteList, usedFootnoteIds);
|
footnoteList = _.pick(footnoteList, usedFootnoteIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -174,15 +174,11 @@ define([
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
partialRendering.onPreviewFinished = function() {
|
|
||||||
$('script[type="math/tex; mode=display"]').remove();
|
|
||||||
};
|
|
||||||
|
|
||||||
partialRendering.onReady = function() {
|
partialRendering.onReady = function() {
|
||||||
$("#preview-contents").append(footnoteContainerElt);
|
$("#preview-contents").append(footnoteContainerElt);
|
||||||
$("#wmd-preview").hide();
|
$("#wmd-preview").hide();
|
||||||
};
|
};
|
||||||
partialRendering.onFileClose = function() {
|
partialRendering.onFileSelected = function() {
|
||||||
fileChanged = true;
|
fileChanged = true;
|
||||||
};
|
};
|
||||||
partialRendering.onFileOpen = function() {
|
partialRendering.onFileOpen = function() {
|
||||||
|
@ -31,12 +31,13 @@ define([
|
|||||||
var textareaElt = $("#md-section-helper");
|
var textareaElt = $("#md-section-helper");
|
||||||
// It has to be the same width as wmd-input
|
// It has to be the same width as wmd-input
|
||||||
textareaElt.width(editorElt.width());
|
textareaElt.width(editorElt.width());
|
||||||
// Consider wmd-input top padding (will be used for 1st and last section)
|
// Consider wmd-input top padding (will be used for 1st and last
|
||||||
|
// section)
|
||||||
var padding = pxToFloat(editorElt.css('padding-top'));
|
var padding = pxToFloat(editorElt.css('padding-top'));
|
||||||
var mdSectionOffset = 0;
|
var mdSectionOffset = 0;
|
||||||
function addMdSection(sectionText) {
|
function addMdSection(sectionText) {
|
||||||
var sectionHeight = padding;
|
var sectionHeight = padding;
|
||||||
if(sectionText !== undefined) {
|
if(sectionText.length !== 0) {
|
||||||
textareaElt.val(sectionText);
|
textareaElt.val(sectionText);
|
||||||
sectionHeight += textareaElt.prop('scrollHeight');
|
sectionHeight += textareaElt.prop('scrollHeight');
|
||||||
}
|
}
|
||||||
@ -50,9 +51,14 @@ define([
|
|||||||
padding = 0;
|
padding = 0;
|
||||||
}
|
}
|
||||||
_.each(sectionList, function(sectionText, index) {
|
_.each(sectionList, function(sectionText, index) {
|
||||||
if(index === sectionList.length - 1) {
|
if(index !== sectionList.length - 1) {
|
||||||
|
// Remove the last \n preceding the next title
|
||||||
|
sectionText = sectionText.substring(0, sectionText.length - 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
// Last section
|
// Last section
|
||||||
// Consider wmd-input bottom padding and exclude \n\n previously added
|
// Consider wmd-input bottom padding and exclude \n\n previously
|
||||||
|
// added
|
||||||
padding += pxToFloat(editorElt.css('padding-bottom'));
|
padding += pxToFloat(editorElt.css('padding-bottom'));
|
||||||
}
|
}
|
||||||
addMdSection(sectionText);
|
addMdSection(sectionText);
|
||||||
|
@ -114,14 +114,17 @@ define([
|
|||||||
}
|
}
|
||||||
|
|
||||||
toc.onEditorConfigure = function(editor) {
|
toc.onEditorConfigure = function(editor) {
|
||||||
|
var tocExp = new RegExp("^" + toc.config.marker + "$", "g")
|
||||||
// Run TOC generation when conversion is finished directly on HTML
|
// Run TOC generation when conversion is finished directly on HTML
|
||||||
editor.hooks.chain("onPreviewRefresh", function() {
|
editor.hooks.chain("onPreviewRefresh", function() {
|
||||||
var htmlToc = buildToc();
|
var htmlToc = buildToc();
|
||||||
$("#preview-contents > .preview-content").each(function() {
|
// Replace toc paragraphs
|
||||||
var html = $(this).html();
|
$("#preview-contents p").each(function() {
|
||||||
html = html.replace(new RegExp("<p>" + toc.config.marker + "<\\/p>", "g"), htmlToc);
|
if(tocExp.test($(this).html())) {
|
||||||
$(this).html(html);
|
$(this).html(htmlToc);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
// Add toc in the TOC button
|
||||||
$(".table-of-contents").html(htmlToc);
|
$(".table-of-contents").html(htmlToc);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
<p>Binds together editor and preview scrollbars.</p>
|
<p>Renders modified sections only.</p>
|
||||||
<blockquote class="muted">
|
<blockquote class="muted">
|
||||||
<b>NOTE:</b> The mapping between Markdown and HTML is based on the
|
<b>NOTE:</b> Document sections are based on title elements (h1, h2...). Therefore if
|
||||||
position of the title elements (h1 h2 ...) in the page. Therefore if
|
your document does not contain any title, performance will not be increased.
|
||||||
your document does not contain any title the mapping will be linear and
|
|
||||||
consequently less accurate.
|
|
||||||
</blockquote>
|
</blockquote>
|
@ -1,7 +1,7 @@
|
|||||||
<p>Binds together editor and preview scrollbars.</p>
|
<p>Binds together editor and preview scrollbars.</p>
|
||||||
<blockquote class="muted">
|
<blockquote class="muted">
|
||||||
<b>NOTE:</b> The mapping between Markdown and HTML is based on the
|
<b>NOTE:</b> The mapping between Markdown and HTML is based on the
|
||||||
position of the title elements (h1 h2 ...) in the page. Therefore if
|
position of the title elements (h1, h2...) in the page. Therefore if
|
||||||
your document does not contain any title the mapping will be linear and
|
your document does not contain any title, the mapping will be linear and
|
||||||
consequently less accurate.
|
consequently less accurate.
|
||||||
</blockquote>
|
</blockquote>
|
@ -297,7 +297,7 @@ define([
|
|||||||
|
|
||||||
if(isRealtime) {
|
if(isRealtime) {
|
||||||
if(_.size(fileDesc.syncLocations) > 0) {
|
if(_.size(fileDesc.syncLocations) > 0) {
|
||||||
extensionMgr.onError("Realtime collaboration document can't be synchronized with multiple locations");
|
extensionMgr.onError("Real time collaborative document can't be synchronized with multiple locations");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Perform the provider's real time export
|
// Perform the provider's real time export
|
||||||
@ -317,7 +317,7 @@ define([
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(_.size(fileDesc.syncLocations) > 0 && _.first(_.values(fileDesc.syncLocations)).isRealtime) {
|
if(_.size(fileDesc.syncLocations) > 0 && _.first(_.values(fileDesc.syncLocations)).isRealtime) {
|
||||||
extensionMgr.onError("Realtime collaboration document can't be synchronized with multiple locations");
|
extensionMgr.onError("Real time collaborative document can't be synchronized with multiple locations");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Perform the provider's standard export
|
// Perform the provider's standard export
|
||||||
@ -342,7 +342,7 @@ define([
|
|||||||
$(".action-sync-manual-" + provider.providerId).click(function(event) {
|
$(".action-sync-manual-" + provider.providerId).click(function(event) {
|
||||||
var fileDesc = fileMgr.currentFile;
|
var fileDesc = fileMgr.currentFile;
|
||||||
if(_.size(fileDesc.syncLocations) > 0 && _.first(_.values(fileDesc.syncLocations)).isRealtime) {
|
if(_.size(fileDesc.syncLocations) > 0 && _.first(_.values(fileDesc.syncLocations)).isRealtime) {
|
||||||
extensionMgr.onError("Realtime collaboration document can't be synchronized with multiple locations");
|
extensionMgr.onError("Real time collaborative document can't be synchronized with multiple locations");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
provider.exportManual(event, fileDesc.title, fileDesc.content, function(error, syncAttributes) {
|
provider.exportManual(event, fileDesc.title, fileDesc.content, function(error, syncAttributes) {
|
||||||
|
Loading…
Reference in New Issue
Block a user