New partialRendering extension

This commit is contained in:
benweet 2013-07-28 11:35:04 +01:00
parent 6c9e8317dd
commit 0d6d329e6a
10 changed files with 44 additions and 41 deletions

View File

@ -630,7 +630,7 @@
<div class="msg-no-publish hide">
"<span class="file-title"></span>" is not published yet. <br /> <br />
</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>
</div>
<div class="modal-footer">

View File

@ -224,8 +224,8 @@ define([
if(editor !== undefined) {
// If the editor is already created
editor.undoManager.reinit(initDocumentContent, fileDesc.editorStart, fileDesc.editorEnd, fileDesc.editorScrollTop);
editor.refreshPreview();
extensionMgr.onFileOpen(fileDesc);
editor.refreshPreview();
return;
}
var previewContainerElt = $(".preview-container");
@ -256,12 +256,12 @@ define([
converter.hooks.chain("preConversion", function(text) {
var tmpText = text + "\n\n";
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) {
if(title && matchOffset > offset) {
if(title) {
// We just found a title which means end of the previous section
// Exclude last \n of the section
sectionList.push(tmpText.substring(offset, matchOffset - 1));
sectionList.push(tmpText.substring(offset, matchOffset));
offset = matchOffset;
}
return "";
@ -318,7 +318,7 @@ define([
else {
previewWrapper = function(makePreview) {
return function() {
window.previewStartTime = new Date().getTime();
extensionMgr.previewStartTime = new Date();
makePreview();
if(documentContent === undefined) {
previewContainerElt.scrollTop(fileDesc.previewScrollTop);

View File

@ -164,7 +164,7 @@ define([
html += $(this).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

View File

@ -35,7 +35,7 @@ define([
linebreaks: {
automatic: true
},
EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50),
EqnChunk: 10,
imageFont: null
},
tex2jax: tex2jax,

View File

@ -5,23 +5,23 @@ define([
"text!html/partialRenderingSettingsBlock.html",
], function($, _, Extension, partialRenderingSettingsBlockHTML) {
var partialRendering = new Extension("partialRendering", "Partial rendering", true);
var partialRendering = new Extension("partialRendering", "Partial Rendering", true);
partialRendering.settingsBlock = partialRenderingSettingsBlockHTML;
var converter = undefined;
var sectionCounter = 0;
var sectionList = [];
var linkDefinition = "";
var linkDefinition = undefined;
var sectionsToRemove = [];
var modifiedSections = [];
var insertAfterSection = undefined;
var fileChanged = true;
var fileChanged = false;
function updateSectionList(newSectionList, newLinkDefinition) {
modifiedSections = [];
sectionsToRemove = [];
insertAfterSection = undefined;
// Render everything if file changed or linkDefinition changed
// Render everything if file or linkDefinition changed
if(fileChanged === true || linkDefinition != newLinkDefinition) {
fileChanged = false;
linkDefinition = newLinkDefinition;
@ -31,7 +31,7 @@ define([
return;
}
// Find modified sections starting from left
// Find modified sections starting from top
var leftIndex = sectionList.length;
_.some(sectionList, function(section, index) {
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;
_.some(sectionList.slice().reverse(), function(section, index) {
if(index >= newSectionList.length || section.text != newSectionList[newSectionList.length - index - 1].text) {
@ -82,7 +82,7 @@ define([
return wholeMatch;
});
// And eventually footnotes...
// And footnotes eventually
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) {
if(footnote) {
@ -120,7 +120,7 @@ define([
var insertAfterSectionElt = insertAfterSection === undefined ? wmdPreviewElt : $("#wmd-preview-section-" + insertAfterSection.id);
_.each(modifiedSections, function(section) {
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);
if(index !== 0 && elt.is(".wmd-title")) {
return true;
@ -155,7 +155,7 @@ define([
// Append the whole footnotes at the end of the document
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);
}
}
@ -174,15 +174,11 @@ define([
});
};
partialRendering.onPreviewFinished = function() {
$('script[type="math/tex; mode=display"]').remove();
};
partialRendering.onReady = function() {
$("#preview-contents").append(footnoteContainerElt);
$("#wmd-preview").hide();
};
partialRendering.onFileClose = function() {
partialRendering.onFileSelected = function() {
fileChanged = true;
};
partialRendering.onFileOpen = function() {

View File

@ -9,7 +9,7 @@ define([
var scrollLink = new Extension("scrollLink", "Scroll Link", true);
scrollLink.settingsBlock = scrollLinkSettingsBlockHTML;
var sectionList = undefined;
scrollLink.onSectionsCreated = function(sectionListParam) {
sectionList = sectionListParam;
@ -31,12 +31,13 @@ define([
var textareaElt = $("#md-section-helper");
// It has to be the same width as wmd-input
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 mdSectionOffset = 0;
function addMdSection(sectionText) {
var sectionHeight = padding;
if(sectionText !== undefined) {
if(sectionText.length !== 0) {
textareaElt.val(sectionText);
sectionHeight += textareaElt.prop('scrollHeight');
}
@ -50,9 +51,14 @@ define([
padding = 0;
}
_.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
// 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'));
}
addMdSection(sectionText);

View File

@ -114,14 +114,17 @@ define([
}
toc.onEditorConfigure = function(editor) {
var tocExp = new RegExp("^" + toc.config.marker + "$", "g")
// Run TOC generation when conversion is finished directly on HTML
editor.hooks.chain("onPreviewRefresh", function() {
var htmlToc = buildToc();
$("#preview-contents > .preview-content").each(function() {
var html = $(this).html();
html = html.replace(new RegExp("<p>" + toc.config.marker + "<\\/p>", "g"), htmlToc);
$(this).html(html);
// Replace toc paragraphs
$("#preview-contents p").each(function() {
if(tocExp.test($(this).html())) {
$(this).html(htmlToc);
}
});
// Add toc in the TOC button
$(".table-of-contents").html(htmlToc);
});
};

View File

@ -1,7 +1,5 @@
<p>Binds together editor and preview scrollbars.</p>
<p>Renders modified sections only.</p>
<blockquote class="muted">
<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
your document does not contain any title the mapping will be linear and
consequently less accurate.
<b>NOTE:</b> Document sections are based on title elements (h1, h2...). Therefore if
your document does not contain any title, performance will not be increased.
</blockquote>

View File

@ -1,7 +1,7 @@
<p>Binds together editor and preview scrollbars.</p>
<blockquote class="muted">
<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
your document does not contain any title the mapping will be linear and
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
consequently less accurate.
</blockquote>

View File

@ -297,7 +297,7 @@ define([
if(isRealtime) {
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;
}
// Perform the provider's real time export
@ -317,7 +317,7 @@ define([
}
else {
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;
}
// Perform the provider's standard export
@ -342,7 +342,7 @@ define([
$(".action-sync-manual-" + provider.providerId).click(function(event) {
var fileDesc = fileMgr.currentFile;
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;
}
provider.exportManual(event, fileDesc.title, fileDesc.content, function(error, syncAttributes) {