summaryrefslogtreecommitdiffstats
path: root/lib/parse/page.js
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2014-04-12 01:51:06 -0700
committerAaron O'Mullan <aaron.omullan@gmail.com>2014-04-12 01:51:06 -0700
commit78cb9a56ba2cb89842d9940cf3dd81f582c6270a (patch)
treeb73929b036c03ce961feee64e9e1044cdffb12d6 /lib/parse/page.js
parentab27725b9935b185a58b725e75aedeb579e87d8f (diff)
parent6173fb76ad3d9ad9357389021aa347df3b1bde92 (diff)
downloadgitbook-78cb9a56ba2cb89842d9940cf3dd81f582c6270a.zip
gitbook-78cb9a56ba2cb89842d9940cf3dd81f582c6270a.tar.gz
gitbook-78cb9a56ba2cb89842d9940cf3dd81f582c6270a.tar.bz2
Merge pull request #85 from GitbookIO/pr/63
Pr/63
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
index 3479c85..eb118e4 100644
--- a/lib/parse/page.js
+++ b/lib/parse/page.js
@@ -36,6 +36,14 @@ function render(section, _options) {
return marked.parser(section, options);
}
+function quizQuestion(node) {
+ if (node.text) {
+ node.text = node.text.replace(/^([\[(])x([\])])/, "$1 $2");
+ } else {
+ return node.replace(/^([\[(])x([\])])/, "$1 $2");
+ }
+}
+
function parsePage(src, options) {
options = options || {};
@@ -76,6 +84,60 @@ function parsePage(src, options) {
context: codeNodes[3] ? codeNodes[3].text : null,
}
};
+ } else if (section.type === 'quiz') {
+ var quiz = [], question, foundFeedback = false;
+ var nonQuizNodes = section[0].type === 'paragraph' && section[1].type !== 'list_start' ? [section[0]] : [];
+ var quizNodes = section.slice(0);
+ quizNodes.splice(0, nonQuizNodes.length);
+
+ for (var i = 0; i < quizNodes.length; i++) {
+ var node = quizNodes[i];
+
+ if (question && (((node.type === 'list_end' || node.type === 'blockquote_end') && i === quizNodes.length - 1)
+ || node.type === 'table' || (node.type === 'paragraph' && !foundFeedback))) {
+ quiz.push({
+ base: render(question.questionNodes),
+ solution: render(question.solutionNodes),
+ feedback: render(question.feedbackNodes)
+ });
+ }
+
+ if (node.type === 'table' || (node.type === 'paragraph' && !foundFeedback)) {
+ question = { questionNodes: [], solutionNodes: [], feedbackNodes: [] };
+ }
+
+ if (node.type === 'blockquote_start') {
+ foundFeedback = true;
+ } else if (node.type === 'blockquote_end') {
+ foundFeedback = false;
+ }
+
+ if (node.type === 'table') {
+ question.solutionNodes.push(_.cloneDeep(node));
+ node.cells = node.cells.map(function(row) {
+ return row.map(quizQuestion);
+ });
+ question.questionNodes.push(node);
+ } else if (!/blockquote/.test(node.type)) {
+ if (foundFeedback) {
+ question.feedbackNodes.push(node);
+ } else if (node.type === 'paragraph' || node.type === 'text'){
+ question.solutionNodes.push(_.cloneDeep(node));
+ quizQuestion(node);
+ question.questionNodes.push(node);
+ } else {
+ question.solutionNodes.push(node);
+ question.questionNodes.push(node);
+ }
+ }
+ }
+
+ return {
+ id: section.id,
+ type: section.type,
+ content: render(nonQuizNodes),
+ quiz: quiz
+ };
}
// Render normal pages