summaryrefslogtreecommitdiffstats
path: root/lib/parse/page.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/parse/page.js')
-rw-r--r--lib/parse/page.js62
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;