diff options
Diffstat (limited to 'lib/parse/page.js')
-rw-r--r-- | lib/parse/page.js | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/parse/page.js b/lib/parse/page.js new file mode 100644 index 0000000..047f3e4 --- /dev/null +++ b/lib/parse/page.js @@ -0,0 +1,62 @@ +var _ = require('lodash'); +var marked = require('marked'); + + +// Split a page up into sections (lesson, exercises, ...) +function splitSections(nodes) { + var section = []; + + return _.reduce(nodes, function(sections, el) { + if(el.type === 'hr') { + sections.push(section); + section = []; + } else { + section.push(el); + } + + return sections; + }, []).concat([section]); // Add remaining nodes +} + +// What is the type of this section +function sectionType(nodes) { + if(_.filter(nodes, { + type: 'code' + }).length === 3) { + return 'exercise'; + } + + return 'normal'; +} + +function parsePage(src) { + var nodes = marked.lexer(src); + + return _.chain(splitSections(nodes)) + .map(function(section) { + // Detect section type + section.type = sectionType(section); + return section; + }) + .map(function(section, idx) { + // Transform given type + if(section.type === 'exercise' && (idx % 2) == 1) { + return { + type: section.type, + }; + } + + // marked's Render expects this, we don't use it yet + section.links = {}; + + // Render normal pages + return { + type: section.type, + content: marked.parser(section) + }; + }) + .value(); +} + +// Exports +module.exports = parsePage; |