Stackedit/public/res/extensions/markdownSectionParser.js

80 lines
3.0 KiB
JavaScript
Raw Normal View History

define([
2013-11-17 22:59:03 +00:00
"underscore",
"extensions/markdownExtra",
"extensions/mathJax",
"classes/Extension",
], function(_, markdownExtra, mathJax, Extension) {
var markdownSectionParser = new Extension("markdownSectionParser", "Markdown section parser");
2013-11-07 23:10:38 +00:00
var eventMgr;
markdownSectionParser.onEventMgrCreated = function(eventMgrParameter) {
eventMgr = eventMgrParameter;
};
2014-03-19 00:33:57 +00:00
2014-03-17 02:01:46 +00:00
var sectionList = [];
2014-03-19 00:33:57 +00:00
2014-03-17 02:01:46 +00:00
// Regexp to look for section delimiters
var regexp = '^.+[ \\t]*\\n=+[ \\t]*\\n+|^.+[ \\t]*\\n-+[ \\t]*\\n+|^\\#{1,6}[ \\t]*.+?[ \\t]*\\#*\\n+'; // Title delimiters
markdownSectionParser.onPagedownConfigure = function(editor) {
2013-11-21 17:47:19 +00:00
if(markdownExtra.enabled) {
2013-11-17 22:59:03 +00:00
if(_.some(markdownExtra.config.extensions, function(extension) {
return extension == "fenced_code_gfm";
})) {
regexp = '^```.*\\n[\\s\\S]*?\\n```|' + regexp; // Fenced block delimiters
}
}
2013-11-21 17:47:19 +00:00
if(mathJax.enabled) {
2013-11-17 22:59:03 +00:00
// Math delimiter has to follow 1 empty line to be considered as a section delimiter
regexp = '^[ \\t]*\\n\\$\\$[\\s\\S]*?\\$\\$|' + regexp; // $$ math block delimiters
regexp = '^[ \\t]*\\n\\\\\\\\[[\\s\\S]*?\\\\\\\\]|' + regexp; // \\[ \\] math block delimiters
regexp = '^[ \\t]*\\n\\\\?\\\\begin\\{[a-z]*\\*?\\}[\\s\\S]*?\\\\end\\{[a-z]*\\*?\\}|' + regexp; // \\begin{...} \\end{...} math block delimiters
2013-11-17 22:59:03 +00:00
}
regexp = new RegExp(regexp, 'gm');
2014-03-19 00:33:57 +00:00
var converter = editor.getConverter();
2014-03-17 02:01:46 +00:00
converter.hooks.chain("preConversion", function() {
2013-11-17 22:59:03 +00:00
return _.reduce(sectionList, function(result, section) {
2014-03-17 02:01:46 +00:00
return result + section.previewText;
2013-11-17 22:59:03 +00:00
}, '');
});
};
2014-03-19 00:33:57 +00:00
var trimLen = 0;
2014-03-17 02:01:46 +00:00
markdownSectionParser.onMarkdownTrim = function(len) {
trimLen = len;
};
var sectionCounter = 0;
function parseFileContent(fileDesc) {
var text = fileDesc.content.substring(trimLen);
2014-03-19 00:33:57 +00:00
var frontMatter = fileDesc.content.substring(0, trimLen);
2014-03-17 02:01:46 +00:00
var tmpText = text + "\n\n";
function addSection(startOffset, endOffset) {
var sectionText = tmpText.substring(offset, endOffset);
sectionList.push({
id: ++sectionCounter,
2014-03-19 00:33:57 +00:00
text: sectionText,
textWithFrontMatter: frontMatter + sectionText
2014-03-17 02:01:46 +00:00
});
2014-03-19 00:33:57 +00:00
frontMatter = '';
2014-03-17 02:01:46 +00:00
}
sectionList = [];
var offset = 0;
// Look for delimiters
tmpText.replace(regexp, function(match, matchOffset) {
// Create a new section with the text preceding the delimiter
addSection(offset, matchOffset);
offset = matchOffset;
});
// Last section
addSection(offset, text.length);
eventMgr.onSectionsCreated(sectionList);
}
2014-03-19 00:33:57 +00:00
2014-03-17 02:01:46 +00:00
markdownSectionParser.onFileOpen = parseFileContent;
markdownSectionParser.onContentChanged = parseFileContent;
return markdownSectionParser;
2014-03-19 00:33:57 +00:00
});