New partialRendering extension
This commit is contained in:
parent
0d6d329e6a
commit
539f39a2d9
@ -153,22 +153,26 @@ define([
|
|||||||
var onAsyncPreviewCallbackList = getExtensionCallbackList("onAsyncPreview");
|
var onAsyncPreviewCallbackList = getExtensionCallbackList("onAsyncPreview");
|
||||||
// The number of times we expect tryFinished to be called
|
// The number of times we expect tryFinished to be called
|
||||||
var nbAsyncPreviewCallback = onAsyncPreviewCallbackList.length + 1;
|
var nbAsyncPreviewCallback = onAsyncPreviewCallbackList.length + 1;
|
||||||
|
var previewContentsElt = undefined;
|
||||||
|
var previewContentsJQElt = undefined;
|
||||||
extensionMgr["onAsyncPreview"] = function() {
|
extensionMgr["onAsyncPreview"] = function() {
|
||||||
logger.log("onAsyncPreview");
|
logger.log("onAsyncPreview");
|
||||||
// Call onPreviewFinished callbacks when all async preview are finished
|
// Call onPreviewFinished callbacks when all async preview are finished
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
function tryFinished() {
|
function tryFinished() {
|
||||||
if(++counter === nbAsyncPreviewCallback) {
|
if(++counter === nbAsyncPreviewCallback) {
|
||||||
var html = "";
|
_.defer(function() {
|
||||||
$("#preview-contents > .preview-content").each(function() {
|
var html = "";
|
||||||
html += $(this).html();
|
_.each(previewContentsElt.children, function(elt) {
|
||||||
|
html += elt.innerHTML;
|
||||||
|
});
|
||||||
|
onPreviewFinished(utils.trim(html));
|
||||||
|
logger.log("Preview time: " + (new Date() - extensionMgr.previewStartTime));
|
||||||
});
|
});
|
||||||
onPreviewFinished(utils.trim(html));
|
|
||||||
logger.log("Preview time: " + (new Date() - extensionMgr.previewStartTime));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// We assume images are loading in the preview
|
// We assume images are loading in the preview
|
||||||
$("#preview-contents").waitForImages(tryFinished);
|
previewContentsJQElt.waitForImages(tryFinished);
|
||||||
_.each(onAsyncPreviewCallbackList, function(asyncPreviewCallback) {
|
_.each(onAsyncPreviewCallbackList, function(asyncPreviewCallback) {
|
||||||
asyncPreviewCallback(tryFinished);
|
asyncPreviewCallback(tryFinished);
|
||||||
});
|
});
|
||||||
@ -184,6 +188,9 @@ define([
|
|||||||
}
|
}
|
||||||
|
|
||||||
extensionMgr["onReady"] = function() {
|
extensionMgr["onReady"] = function() {
|
||||||
|
previewContentsElt = document.getElementById('preview-contents');
|
||||||
|
previewContentsJQElt = $(previewContentsElt);
|
||||||
|
|
||||||
// Create accordion in settings dialog
|
// Create accordion in settings dialog
|
||||||
_.chain(extensionList).sortBy(function(extension) {
|
_.chain(extensionList).sortBy(function(extension) {
|
||||||
return extension.extensionName.toLowerCase();
|
return extension.extensionName.toLowerCase();
|
||||||
|
@ -30,6 +30,7 @@ define([
|
|||||||
selectedFileDesc = fileDesc;
|
selectedFileDesc = fileDesc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var textareaElt = undefined;
|
||||||
buttonHtmlCode.onPreviewFinished = function(html) {
|
buttonHtmlCode.onPreviewFinished = function(html) {
|
||||||
try {
|
try {
|
||||||
var htmlCode = _.template(buttonHtmlCode.config.template, {
|
var htmlCode = _.template(buttonHtmlCode.config.template, {
|
||||||
@ -37,7 +38,7 @@ define([
|
|||||||
documentMarkdown: selectedFileDesc.content,
|
documentMarkdown: selectedFileDesc.content,
|
||||||
documentHTML: html
|
documentHTML: html
|
||||||
});
|
});
|
||||||
$("#input-html-code").val(htmlCode);
|
textareaElt.value = htmlCode;
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch(e) {
|
||||||
extensionMgr.onError(e);
|
extensionMgr.onError(e);
|
||||||
@ -46,6 +47,7 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
buttonHtmlCode.onReady = function() {
|
buttonHtmlCode.onReady = function() {
|
||||||
|
textareaElt = document.getElementById('input-html-code');
|
||||||
$(".action-html-code").click(function() {
|
$(".action-html-code").click(function() {
|
||||||
_.defer(function() {
|
_.defer(function() {
|
||||||
$("#input-html-code").each(function() {
|
$("#input-html-code").each(function() {
|
||||||
|
@ -43,12 +43,29 @@ define([
|
|||||||
buttonStat.onCreatePreviewButton = function() {
|
buttonStat.onCreatePreviewButton = function() {
|
||||||
return $(_.template(buttonStatHTML, buttonStat.config));
|
return $(_.template(buttonStatHTML, buttonStat.config));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var previewContentsElt = undefined;
|
||||||
|
var value1Elt = undefined;
|
||||||
|
var value2Elt = undefined;
|
||||||
|
var value3Elt = undefined;
|
||||||
|
buttonStat.onReady = function() {
|
||||||
|
previewContentsElt = document.getElementById('preview-contents');
|
||||||
|
value1Elt = document.getElementById('span-stat-value1');
|
||||||
|
value2Elt = document.getElementById('span-stat-value2');
|
||||||
|
value3Elt = document.getElementById('span-stat-value3');
|
||||||
|
};
|
||||||
|
|
||||||
buttonStat.onPreviewFinished = function() {
|
buttonStat.onPreviewFinished = function() {
|
||||||
var text = $("#preview-contents").clone().find("script").remove().end().text();
|
var previewContentsEltClone = previewContentsElt.cloneNode(true);
|
||||||
$("#span-stat-value1").text((text.match(new RegExp(buttonStat.config.value1, "g")) || []).length);
|
var scriptEltList = previewContentsEltClone.getElementsByTagName('script');
|
||||||
$("#span-stat-value2").text((text.match(new RegExp(buttonStat.config.value2, "g")) || []).length);
|
for(var i = scriptEltList.length-1; i >= 0; i--) {
|
||||||
$("#span-stat-value3").text((text.match(new RegExp(buttonStat.config.value3, "g")) || []).length);
|
var scriptElt = scriptEltList[i];
|
||||||
|
scriptElt.parentNode.removeChild(scriptElt);
|
||||||
|
}
|
||||||
|
var text = previewContentsEltClone.textContent;
|
||||||
|
value1Elt.textContent = (text.match(new RegExp(buttonStat.config.value1, "g")) || []).length;
|
||||||
|
value2Elt.textContent = (text.match(new RegExp(buttonStat.config.value2, "g")) || []).length;
|
||||||
|
value3Elt.textContent = (text.match(new RegExp(buttonStat.config.value3, "g")) || []).length;
|
||||||
};
|
};
|
||||||
|
|
||||||
return buttonStat;
|
return buttonStat;
|
||||||
|
@ -10,12 +10,14 @@ define([
|
|||||||
|
|
||||||
var libraries = {
|
var libraries = {
|
||||||
"Bootstrap": "http://twitter.github.io/bootstrap/",
|
"Bootstrap": "http://twitter.github.io/bootstrap/",
|
||||||
|
"crel": "https://github.com/KoryNunn/crel",
|
||||||
"CSS Browser Selector": "https://github.com/rafaelp/css_browser_selector/",
|
"CSS Browser Selector": "https://github.com/rafaelp/css_browser_selector/",
|
||||||
"Dropbox-js": "https://github.com/dropbox/dropbox-js",
|
"Dropbox-js": "https://github.com/dropbox/dropbox-js",
|
||||||
"FileSaver.js": "https://github.com/eligrey/FileSaver.js/",
|
"FileSaver.js": "https://github.com/eligrey/FileSaver.js/",
|
||||||
"Gatekeeper": "https://github.com/prose/gatekeeper",
|
"Gatekeeper": "https://github.com/prose/gatekeeper",
|
||||||
"Github.js": "https://github.com/michael/github",
|
"Github.js": "https://github.com/michael/github",
|
||||||
"Glyphicons": "http://glyphicons.com/",
|
"Glyphicons": "http://glyphicons.com/",
|
||||||
|
"Highlight.js": "http://softwaremaniacs.org/soft/highlight/en/",
|
||||||
"jGrowl": "https://github.com/stanlemon/jGrowl/",
|
"jGrowl": "https://github.com/stanlemon/jGrowl/",
|
||||||
"jQuery": "http://jquery.com/",
|
"jQuery": "http://jquery.com/",
|
||||||
"jQuery Mouse Wheel Plugin": "https://github.com/brandonaaron/jquery-mousewheel",
|
"jQuery Mouse Wheel Plugin": "https://github.com/brandonaaron/jquery-mousewheel",
|
||||||
@ -34,6 +36,7 @@ define([
|
|||||||
|
|
||||||
var projects = {
|
var projects = {
|
||||||
"StackEdit Download Proxy": "https://github.com/benweet/stackedit-download-proxy",
|
"StackEdit Download Proxy": "https://github.com/benweet/stackedit-download-proxy",
|
||||||
|
"StackEdit Picasa Proxy": "https://github.com/benweet/stackedit-picasa-proxy",
|
||||||
"StackEdit SSH Proxy": "https://github.com/benweet/stackedit-ssh-proxy",
|
"StackEdit SSH Proxy": "https://github.com/benweet/stackedit-ssh-proxy",
|
||||||
"StackEdit Tumblr Proxy": "https://github.com/benweet/stackedit-tumblr-proxy",
|
"StackEdit Tumblr Proxy": "https://github.com/benweet/stackedit-tumblr-proxy",
|
||||||
"StackEdit WordPress Proxy": "https://github.com/benweet/stackedit-wordpress-proxy",
|
"StackEdit WordPress Proxy": "https://github.com/benweet/stackedit-wordpress-proxy",
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
define([
|
define([
|
||||||
"jquery",
|
"jquery",
|
||||||
|
"underscore",
|
||||||
"utils",
|
"utils",
|
||||||
"classes/Extension",
|
"classes/Extension",
|
||||||
"text!html/markdownExtraSettingsBlock.html",
|
"text!html/markdownExtraSettingsBlock.html",
|
||||||
"libs/Markdown.Extra",
|
"libs/Markdown.Extra",
|
||||||
], function($, utils, Extension, markdownExtraSettingsBlockHTML) {
|
], function($, _, utils, Extension, markdownExtraSettingsBlockHTML) {
|
||||||
|
|
||||||
var markdownExtra = new Extension("markdownExtra", "Markdown Extra", true);
|
var markdownExtra = new Extension("markdownExtra", "Markdown Extra", true);
|
||||||
markdownExtra.settingsBlock = markdownExtraSettingsBlockHTML;
|
markdownExtra.settingsBlock = markdownExtraSettingsBlockHTML;
|
||||||
@ -50,9 +51,10 @@ define([
|
|||||||
};
|
};
|
||||||
if(markdownExtra.config.highlighter == "highlight") {
|
if(markdownExtra.config.highlighter == "highlight") {
|
||||||
options.highlighter = "prettify";
|
options.highlighter = "prettify";
|
||||||
|
var previewContentsElt = document.getElementById('preview-contents');
|
||||||
editor.hooks.chain("onPreviewRefresh", function() {
|
editor.hooks.chain("onPreviewRefresh", function() {
|
||||||
$('.prettyprint').each(function(i, e) {
|
_.each(previewContentsElt.querySelectorAll('.prettyprint'), function(elt) {
|
||||||
hljs.highlightBlock(e);
|
hljs.highlightBlock(elt);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -61,7 +63,7 @@ define([
|
|||||||
editor.hooks.chain("onPreviewRefresh", prettyPrint);
|
editor.hooks.chain("onPreviewRefresh", prettyPrint);
|
||||||
}
|
}
|
||||||
Markdown.Extra.init(converter, options);
|
Markdown.Extra.init(converter, options);
|
||||||
|
|
||||||
// Store extensions list in converter for partialRendering
|
// Store extensions list in converter for partialRendering
|
||||||
converter.extraExtensions = markdownExtra.config.extensions;
|
converter.extraExtensions = markdownExtra.config.extensions;
|
||||||
};
|
};
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
define([
|
define([
|
||||||
"jquery",
|
|
||||||
"underscore",
|
"underscore",
|
||||||
|
"crel",
|
||||||
"classes/Extension",
|
"classes/Extension",
|
||||||
"text!html/partialRenderingSettingsBlock.html",
|
"text!html/partialRenderingSettingsBlock.html",
|
||||||
], function($, _, Extension, partialRenderingSettingsBlockHTML) {
|
], function(_, crel, Extension, partialRenderingSettingsBlockHTML) {
|
||||||
|
|
||||||
var partialRendering = new Extension("partialRendering", "Partial Rendering", true);
|
var partialRendering = new Extension("partialRendering", "Partial Rendering", true);
|
||||||
partialRendering.settingsBlock = partialRenderingSettingsBlockHTML;
|
partialRendering.settingsBlock = partialRenderingSettingsBlockHTML;
|
||||||
@ -14,12 +14,12 @@ define([
|
|||||||
var linkDefinition = undefined;
|
var linkDefinition = undefined;
|
||||||
var sectionsToRemove = [];
|
var sectionsToRemove = [];
|
||||||
var modifiedSections = [];
|
var modifiedSections = [];
|
||||||
var insertAfterSection = undefined;
|
var insertBeforeSection = undefined;
|
||||||
var fileChanged = false;
|
var fileChanged = false;
|
||||||
function updateSectionList(newSectionList, newLinkDefinition) {
|
function updateSectionList(newSectionList, newLinkDefinition) {
|
||||||
modifiedSections = [];
|
modifiedSections = [];
|
||||||
sectionsToRemove = [];
|
sectionsToRemove = [];
|
||||||
insertAfterSection = undefined;
|
insertBeforeSection = undefined;
|
||||||
|
|
||||||
// Render everything if file or linkDefinition changed
|
// Render everything if file or linkDefinition changed
|
||||||
if(fileChanged === true || linkDefinition != newLinkDefinition) {
|
if(fileChanged === true || linkDefinition != newLinkDefinition) {
|
||||||
@ -59,7 +59,7 @@ define([
|
|||||||
var leftSections = sectionList.slice(0, leftIndex);
|
var leftSections = sectionList.slice(0, leftIndex);
|
||||||
modifiedSections = newSectionList.slice(leftIndex, newSectionList.length + rightIndex);
|
modifiedSections = newSectionList.slice(leftIndex, newSectionList.length + rightIndex);
|
||||||
var rightSections = sectionList.slice(sectionList.length + rightIndex, sectionList.length);
|
var rightSections = sectionList.slice(sectionList.length + rightIndex, sectionList.length);
|
||||||
insertAfterSection = _.last(leftSections);
|
insertBeforeSection = _.first(rightSections);
|
||||||
sectionsToRemove = sectionList.slice(leftIndex, sectionList.length + rightIndex);
|
sectionsToRemove = sectionList.slice(leftIndex, sectionList.length + rightIndex);
|
||||||
sectionList = leftSections.concat(modifiedSections).concat(rightSections);
|
sectionList = leftSections.concat(modifiedSections).concat(rightSections);
|
||||||
}
|
}
|
||||||
@ -72,17 +72,8 @@ define([
|
|||||||
hasFootnotes = false;
|
hasFootnotes = false;
|
||||||
_.each(sectionListParam, function(text) {
|
_.each(sectionListParam, function(text) {
|
||||||
text += "\n\n";
|
text += "\n\n";
|
||||||
|
|
||||||
// Strip link definitions
|
|
||||||
text = text.replace(/^```.*\n[\s\S]*?\n```|^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm, function(wholeMatch, link) {
|
|
||||||
if(link) {
|
|
||||||
newLinkDefinition += wholeMatch;
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return wholeMatch;
|
|
||||||
});
|
|
||||||
|
|
||||||
// And footnotes eventually
|
// Strip footnotes
|
||||||
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) {
|
||||||
@ -94,6 +85,15 @@ define([
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Strip link definitions
|
||||||
|
text = text.replace(/^```.*\n[\s\S]*?\n```|^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm, function(wholeMatch, link) {
|
||||||
|
if(link) {
|
||||||
|
newLinkDefinition += wholeMatch;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return wholeMatch;
|
||||||
|
});
|
||||||
|
|
||||||
// Skip space only sections
|
// Skip space only sections
|
||||||
if(/\S/.test(text)) {
|
if(/\S/.test(text)) {
|
||||||
// Add section to the newSectionList
|
// Add section to the newSectionList
|
||||||
@ -107,56 +107,73 @@ define([
|
|||||||
updateSectionList(newSectionList, newLinkDefinition);
|
updateSectionList(newSectionList, newLinkDefinition);
|
||||||
};
|
};
|
||||||
|
|
||||||
var footnoteContainerElt = $('<div id="wmd-preview-section-footnotes" class="preview-content">');
|
var footnoteContainerElt = undefined;
|
||||||
var footnoteList = {};
|
var previewContentsElt = undefined;
|
||||||
|
var footnoteMap = {};
|
||||||
function refreshSections() {
|
function refreshSections() {
|
||||||
|
|
||||||
// Remove outdated sections
|
// Remove outdated sections
|
||||||
_.each(sectionsToRemove, function(section) {
|
_.each(sectionsToRemove, function(section) {
|
||||||
$("#wmd-preview-section-" + section.id).remove();
|
var sectionElt = document.getElementById("wmd-preview-section-" + section.id);
|
||||||
|
previewContentsElt.removeChild(sectionElt);
|
||||||
});
|
});
|
||||||
|
|
||||||
var wmdPreviewElt = $("#wmd-preview");
|
var wmdPreviewElt = document.getElementById("wmd-preview");
|
||||||
var insertAfterSectionElt = insertAfterSection === undefined ? wmdPreviewElt : $("#wmd-preview-section-" + insertAfterSection.id);
|
var markdownEltList = Array.prototype.slice.call(wmdPreviewElt.childNodes);
|
||||||
|
wmdPreviewElt.innerHTML = '';
|
||||||
|
var newSectionEltList = document.createDocumentFragment();
|
||||||
_.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 = crel('div', {
|
||||||
_.some(wmdPreviewElt.contents(), function(elt, index) {
|
id: 'wmd-preview-section-' + section.id,
|
||||||
elt = $(elt);
|
class: 'wmd-preview-section preview-content'
|
||||||
if(index !== 0 && elt.is(".wmd-title")) {
|
});
|
||||||
return true;
|
var isFirst = true;
|
||||||
|
while(markdownEltList.length !== 0) {
|
||||||
|
var elt = markdownEltList[0];
|
||||||
|
if(isFirst === false && /(^| )wmd-title($| )/.test(elt.className)) {
|
||||||
|
// Stop when encountered the next wmd-title
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(elt.is("div.footnotes")) {
|
isFirst = false;
|
||||||
elt.find("ol > li").each(function() {
|
if(elt.tagName == 'DIV' && elt.className == 'footnotes') {
|
||||||
var footnoteElt = $(this).clone();
|
_.each(elt.querySelectorAll("ol > li"), function(footnoteElt) {
|
||||||
var id = footnoteElt.attr("id").substring(3);
|
// Store each footnote in our footnote map
|
||||||
footnoteList[id] = footnoteElt;
|
var id = footnoteElt.id.substring(3);
|
||||||
|
footnoteMap[id] = footnoteElt;
|
||||||
});
|
});
|
||||||
elt.remove();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sectionElt.append(elt);
|
sectionElt.appendChild(elt);
|
||||||
}
|
}
|
||||||
});
|
markdownEltList.shift();
|
||||||
insertAfterSectionElt.after(sectionElt);
|
};
|
||||||
insertAfterSectionElt = sectionElt;
|
newSectionEltList.appendChild(sectionElt);
|
||||||
});
|
});
|
||||||
|
var insertBeforeElt = footnoteContainerElt;
|
||||||
|
if(insertBeforeSection !== undefined) {
|
||||||
|
insertBeforeElt = document.getElementById("wmd-preview-section-" + insertBeforeSection.id);
|
||||||
|
}
|
||||||
|
previewContentsElt.insertBefore(newSectionEltList, insertBeforeElt);
|
||||||
|
|
||||||
// Rewrite footnotes in the footer and update footnote numbers
|
// Rewrite footnotes in the footer and update footnote numbers
|
||||||
footnoteContainerElt.empty();
|
footnoteContainerElt.innerHTML = '';
|
||||||
var usedFootnoteIds = [];
|
var usedFootnoteIds = [];
|
||||||
if(hasFootnotes === true) {
|
if(hasFootnotes === true) {
|
||||||
var footnoteElts = $("<ol>");
|
var footnoteElts = crel('ol');
|
||||||
$("#preview-contents a.footnote").each(function(index) {
|
_.each(previewContentsElt.querySelectorAll('a.footnote'), function(elt, index) {
|
||||||
var id=$(this).text(index + 1).attr("id").substring(6);
|
elt.textContent = index + 1;
|
||||||
|
var id = elt.id.substring(6);
|
||||||
usedFootnoteIds.push(id);
|
usedFootnoteIds.push(id);
|
||||||
footnoteElts.append(footnoteList[id].clone());
|
footnoteElts.appendChild(footnoteMap[id].cloneNode(true));
|
||||||
});
|
});
|
||||||
if(usedFootnoteIds.length > 0) {
|
if(usedFootnoteIds.length > 0) {
|
||||||
// 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.appendChild(crel('div', {
|
||||||
|
class: 'footnotes'
|
||||||
|
}, crel('hr'), footnoteElts));
|
||||||
}
|
}
|
||||||
// Keep used footnotes only in our map
|
// Keep used footnotes only in our map
|
||||||
footnoteList = _.pick(footnoteList, usedFootnoteIds);
|
footnoteMap = _.pick(footnoteMap, usedFootnoteIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,12 +192,18 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
partialRendering.onReady = function() {
|
partialRendering.onReady = function() {
|
||||||
$("#preview-contents").append(footnoteContainerElt);
|
footnoteContainerElt = crel('div', {
|
||||||
$("#wmd-preview").hide();
|
id: 'wmd-preview-section-footnotes',
|
||||||
|
class: 'preview-content'
|
||||||
|
});
|
||||||
|
previewContentsElt = document.getElementById("preview-contents");
|
||||||
|
previewContentsElt.appendChild(footnoteContainerElt);
|
||||||
};
|
};
|
||||||
|
|
||||||
partialRendering.onFileSelected = function() {
|
partialRendering.onFileSelected = function() {
|
||||||
fileChanged = true;
|
fileChanged = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
partialRendering.onFileOpen = function() {
|
partialRendering.onFileOpen = function() {
|
||||||
if(converter.extraExtensions) {
|
if(converter.extraExtensions) {
|
||||||
doFootnotes = _.some(converter.extraExtensions, function(extension) {
|
doFootnotes = _.some(converter.extraExtensions, function(extension) {
|
||||||
|
@ -15,6 +15,9 @@ define([
|
|||||||
sectionList = sectionListParam;
|
sectionList = sectionListParam;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var editorElt = undefined;
|
||||||
|
var previewElt = undefined;
|
||||||
|
var textareaElt = undefined;
|
||||||
var mdSectionList = [];
|
var mdSectionList = [];
|
||||||
var htmlSectionList = [];
|
var htmlSectionList = [];
|
||||||
function pxToFloat(px) {
|
function pxToFloat(px) {
|
||||||
@ -25,10 +28,7 @@ define([
|
|||||||
var buildSections = _.debounce(function() {
|
var buildSections = _.debounce(function() {
|
||||||
|
|
||||||
// Try to find Markdown sections by looking for titles
|
// Try to find Markdown sections by looking for titles
|
||||||
var editorElt = $("#wmd-input");
|
|
||||||
mdSectionList = [];
|
mdSectionList = [];
|
||||||
// This textarea is used to measure sections height
|
|
||||||
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
|
// Consider wmd-input top padding (will be used for 1st and last
|
||||||
@ -65,14 +65,14 @@ define([
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Try to find corresponding sections in the preview
|
// Try to find corresponding sections in the preview
|
||||||
var previewElt = $(".preview-container");
|
|
||||||
htmlSectionList = [];
|
htmlSectionList = [];
|
||||||
var htmlSectionOffset = 0;
|
var htmlSectionOffset = 0;
|
||||||
var previewScrollTop = previewElt.scrollTop();
|
var previewScrollTop = previewElt.scrollTop();
|
||||||
// Each title element is a section separator
|
// Each title element is a section separator
|
||||||
$("#preview-contents > .preview-content").children(".wmd-title").each(function() {
|
previewElt.find(".preview-content > .wmd-title").each(function() {
|
||||||
|
var titleElt = $(this);
|
||||||
// Consider div scroll position and header element top margin
|
// Consider div scroll position and header element top margin
|
||||||
var newSectionOffset = $(this).position().top + previewScrollTop + pxToFloat($(this).css('margin-top'));
|
var newSectionOffset = titleElt.position().top + previewScrollTop + pxToFloat(titleElt.css('margin-top'));
|
||||||
htmlSectionList.push({
|
htmlSectionList.push({
|
||||||
startOffset: htmlSectionOffset,
|
startOffset: htmlSectionOffset,
|
||||||
endOffset: newSectionOffset,
|
endOffset: newSectionOffset,
|
||||||
@ -100,9 +100,7 @@ define([
|
|||||||
if(mdSectionList.length === 0 || mdSectionList.length !== htmlSectionList.length) {
|
if(mdSectionList.length === 0 || mdSectionList.length !== htmlSectionList.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var editorElt = $("#wmd-input");
|
|
||||||
var editorScrollTop = editorElt.scrollTop();
|
var editorScrollTop = editorElt.scrollTop();
|
||||||
var previewElt = $(".preview-container");
|
|
||||||
var previewScrollTop = previewElt.scrollTop();
|
var previewScrollTop = previewElt.scrollTop();
|
||||||
function animate(srcScrollTop, srcSectionList, destElt, destSectionList, currentDestScrollTop, callback) {
|
function animate(srcScrollTop, srcSectionList, destElt, destSectionList, currentDestScrollTop, callback) {
|
||||||
// Find the section corresponding to the offset
|
// Find the section corresponding to the offset
|
||||||
@ -160,6 +158,12 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
scrollLink.onLayoutCreated = function() {
|
scrollLink.onLayoutCreated = function() {
|
||||||
|
editorElt = $("#wmd-input");
|
||||||
|
previewElt = $(".preview-container");
|
||||||
|
|
||||||
|
// This textarea is used to measure sections height
|
||||||
|
textareaElt = $("#md-section-helper");
|
||||||
|
|
||||||
$(".preview-container").bind("keyup mouseup mousewheel", function() {
|
$(".preview-container").bind("keyup mouseup mousewheel", function() {
|
||||||
isScrollPreview = true;
|
isScrollPreview = true;
|
||||||
isScrollEditor = false;
|
isScrollEditor = false;
|
||||||
@ -172,19 +176,20 @@ define([
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var previewContentsElt = undefined;
|
||||||
scrollLink.onEditorConfigure = function(editor) {
|
scrollLink.onEditorConfigure = function(editor) {
|
||||||
|
previewContentsElt = $("#preview-contents");
|
||||||
editor.getConverter().hooks.chain("postConversion", function(text) {
|
editor.getConverter().hooks.chain("postConversion", function(text) {
|
||||||
// To avoid losing scrolling position before elements are fully
|
// To avoid losing scrolling position before elements are fully
|
||||||
// loaded
|
// loaded
|
||||||
var previewElt = $("#preview-contents");
|
previewContentsElt.height(previewContentsElt.height());
|
||||||
previewElt.height(previewElt.height());
|
|
||||||
return text;
|
return text;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
scrollLink.onPreviewFinished = function() {
|
scrollLink.onPreviewFinished = function() {
|
||||||
// Now set the correct height
|
// Now set the correct height
|
||||||
$("#preview-contents").height("auto");
|
previewContentsElt.height("auto");
|
||||||
isScrollEditor = true;
|
isScrollEditor = true;
|
||||||
buildSections();
|
buildSections();
|
||||||
};
|
};
|
||||||
|
@ -90,10 +90,11 @@ define([
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build the TOC
|
// Build the TOC
|
||||||
|
var previewContentsElt = undefined;
|
||||||
function buildToc() {
|
function buildToc() {
|
||||||
var anchorList = {};
|
var anchorList = {};
|
||||||
function createAnchor(element) {
|
function createAnchor(element) {
|
||||||
var id = element.prop("id") || utils.slugify(element.text());
|
var id = element.id || utils.slugify(element.textContent);
|
||||||
var anchor = id;
|
var anchor = id;
|
||||||
var index = 0;
|
var index = 0;
|
||||||
while (_.has(anchorList, anchor)) {
|
while (_.has(anchorList, anchor)) {
|
||||||
@ -101,31 +102,35 @@ define([
|
|||||||
}
|
}
|
||||||
anchorList[anchor] = true;
|
anchorList[anchor] = true;
|
||||||
// Update the id of the element
|
// Update the id of the element
|
||||||
element.prop("id", anchor);
|
element.id = anchor;
|
||||||
return anchor;
|
return anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
var elementList = [];
|
var elementList = [];
|
||||||
$("#preview-contents > .preview-content").children("h1, h2, h3, h4, h5, h6").each(function() {
|
_.each(previewContentsElt.querySelectorAll('.preview-content > .wmd-title'), function(elt) {
|
||||||
elementList.push(new TocElement($(this).prop("tagName"), createAnchor($(this)), $(this).text()));
|
elementList.push(new TocElement(elt.tagName, createAnchor(elt), elt.textContent));
|
||||||
});
|
});
|
||||||
elementList = groupTags(elementList);
|
elementList = groupTags(elementList);
|
||||||
return '<div class="toc">\n<ul>\n' + elementList.join("") + '</ul>\n</div>\n';
|
return '<div class="toc">\n<ul>\n' + elementList.join("") + '</ul>\n</div>\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
toc.onEditorConfigure = function(editor) {
|
toc.onEditorConfigure = function(editor) {
|
||||||
var tocExp = new RegExp("^" + toc.config.marker + "$", "g")
|
previewContentsElt = document.getElementById('preview-contents');
|
||||||
|
var tocEltList = document.querySelectorAll('.table-of-contents');
|
||||||
|
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();
|
||||||
// Replace toc paragraphs
|
// Replace toc paragraphs
|
||||||
$("#preview-contents p").each(function() {
|
_.each(previewContentsElt.getElementsByTagName('p'), function(elt) {
|
||||||
if(tocExp.test($(this).html())) {
|
if(tocExp.test(elt.innerHTML)) {
|
||||||
$(this).html(htmlToc);
|
elt.innerHTML = htmlToc;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Add toc in the TOC button
|
// Add toc in the TOC button
|
||||||
$(".table-of-contents").html(htmlToc);
|
_.each(tocEltList, function(elt) {
|
||||||
|
elt.innerHTML = htmlToc;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -482,6 +482,9 @@
|
|||||||
// Find and convert footnotes references.
|
// Find and convert footnotes references.
|
||||||
Markdown.Extra.prototype.doFootnotes = function(text) {
|
Markdown.Extra.prototype.doFootnotes = function(text) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
if(self.isConvertingFootnote === true) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
var footnoteCounter = 0;
|
var footnoteCounter = 0;
|
||||||
text = text.replace(/\[\^(.+?)\]/g, function(wholeMatch, m1) {
|
text = text.replace(/\[\^(.+?)\]/g, function(wholeMatch, m1) {
|
||||||
@ -512,7 +515,9 @@
|
|||||||
for(var i=0; i<self.usedFootnotes.length; i++) {
|
for(var i=0; i<self.usedFootnotes.length; i++) {
|
||||||
var id = self.usedFootnotes[i];
|
var id = self.usedFootnotes[i];
|
||||||
var footnote = self.footnotes[id];
|
var footnote = self.footnotes[id];
|
||||||
|
self.isConvertingFootnote = true;
|
||||||
var formattedfootnote = convertSpans(footnote, self);
|
var formattedfootnote = convertSpans(footnote, self);
|
||||||
|
delete self.isConvertingFootnote;
|
||||||
text += '<li id="fn:'
|
text += '<li id="fn:'
|
||||||
+ id
|
+ id
|
||||||
+ '">'
|
+ '">'
|
||||||
|
@ -4,6 +4,7 @@ requirejs.config({
|
|||||||
paths: {
|
paths: {
|
||||||
"jquery": "libs/jquery",
|
"jquery": "libs/jquery",
|
||||||
"underscore": "libs/underscore",
|
"underscore": "libs/underscore",
|
||||||
|
"crel": "libs/crel",
|
||||||
"jgrowl": "libs/jgrowl",
|
"jgrowl": "libs/jgrowl",
|
||||||
"mousetrap": "libs/mousetrap",
|
"mousetrap": "libs/mousetrap",
|
||||||
"toMarkdown": "libs/to-markdown",
|
"toMarkdown": "libs/to-markdown",
|
||||||
|
Loading…
Reference in New Issue
Block a user