Skip to content

Commit 8ce6721

Browse files
committed
cover code block edge cases
1 parent a748079 commit 8ce6721

File tree

4 files changed

+119
-83
lines changed

4 files changed

+119
-83
lines changed

dist/cr.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
{
1818
"title": "Page two",
1919
"description": "page two description",
20-
"explanation": "page two explanation\n\n```\nvar a = 'something';\n```",
20+
"explanation": "page two explanation\n\n```\nvar a = 'something';\n\nfunction someFunc() {\n return 'some result';\n}\n```",
2121
"tasks": [
2222
{
2323
"title": " Task One",

src/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ page two explanation
1818

1919
```
2020
var a = 'something';
21+
22+
function someFunc() {
23+
return 'some result';
24+
}
2125
```
2226

2327
+ Task One

src/build.js

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ var regex = {
88
'##': line('#', 2),
99
'###': line('#', 3),
1010
'+': line('\\+', 1),
11-
'@': line('@', 1)
11+
'@': line('@', 1),
12+
'```': line('`', 3)
1213
};
1314
function isEmpty(line) {
1415
return !line.length || !!line.match(/^\s+?[\n\r]/);
@@ -95,28 +96,35 @@ function page(result, lines, index) {
9596
explanation: '',
9697
tasks: []
9798
});
99+
let inCodeBlock = false;
98100
for (let i = 1; i < lines.length; i++) {
99101
let pageTitleMatch = parseWithCode('###', lines[i]);
100102
let nextChapter = parseWithCode('##', lines[i]);
101103
let nextTask = parseWithCode('+', lines[i]);
102-
if (!hasBreak && isEmpty(lines[i])) {
103-
hasBreak = i;
104+
let codeBlock = parseWithCode('```', lines[i]);
105+
if (!!codeBlock) {
106+
inCodeBlock = !inCodeBlock;
104107
}
105-
else if (!!nextChapter) {
106-
return chapter(result, lines.slice(i), index);
107-
}
108-
else if (!!pageTitleMatch) {
109-
return page(result, lines.slice(i), index);
110-
}
111-
else if (!!nextTask) {
112-
return task(result, lines.slice(i), index);
113-
}
114-
else {
115-
if (!hasBreak) {
116-
result.chapters[index.chapter].pages[index.page].description += lines[i] + '\n';
108+
if (!inCodeBlock) {
109+
if (!hasBreak && isEmpty(lines[i])) {
110+
hasBreak = i;
111+
}
112+
else if (!!nextChapter) {
113+
return chapter(result, lines.slice(i), index);
114+
}
115+
else if (!!pageTitleMatch) {
116+
return page(result, lines.slice(i), index);
117+
}
118+
else if (!!nextTask) {
119+
return task(result, lines.slice(i), index);
117120
}
118121
else {
119-
result.chapters[index.chapter].pages[index.page].explanation += lines[i] + '\n';
122+
if (!hasBreak) {
123+
result.chapters[index.chapter].pages[index.page].description += lines[i] + '\n';
124+
}
125+
else {
126+
result.chapters[index.chapter].pages[index.page].explanation += lines[i] + '\n';
127+
}
120128
}
121129
}
122130
}
@@ -130,36 +138,43 @@ function task(result, lines, index) {
130138
actions: []
131139
});
132140
index.task += 1;
141+
let inCodeBlock = false;
133142
for (let i = 1; i < lines.length; i++) {
134143
let nextPage = parseWithCode('###', lines[i]);
135144
let nextChapter = parseWithCode('##', lines[i]);
136145
let nextTask = parseWithCode('+', lines[i]);
137-
let isPossibleAction = lines[i].match(/^@action|test/);
138-
if (!!isPossibleAction) {
139-
let action = lines[i].slice(1).split('(')[0];
140-
let target = /\((.*?)\)$/.exec(lines[i])[1];
141-
switch (action) {
142-
case 'test':
143-
result.chapters[index.chapter].pages[index.page].tasks[index.task].tests.push(target);
144-
break;
145-
case 'action':
146-
result.chapters[index.chapter].pages[index.page].tasks[index.task].actions.push(target);
147-
break;
148-
default:
149-
console.log('Invalid task action');
146+
let isPossibleAction = lines[i].match(/^@action|test|hint/);
147+
let codeBlock = parseWithCode('```', lines[i]);
148+
if (!!codeBlock) {
149+
inCodeBlock = !inCodeBlock;
150+
}
151+
if (!inCodeBlock) {
152+
if (!!isPossibleAction) {
153+
let action = lines[i].slice(1).split('(')[0];
154+
let target = /\((.*?)\)$/.exec(lines[i])[1];
155+
switch (action) {
156+
case 'test':
157+
result.chapters[index.chapter].pages[index.page].tasks[index.task].tests.push(target);
158+
break;
159+
case 'action':
160+
result.chapters[index.chapter].pages[index.page].tasks[index.task].actions.push(target);
161+
break;
162+
default:
163+
console.log('Invalid task action');
164+
}
165+
}
166+
else if (!!nextTask) {
167+
return task(result, lines.slice(i), index);
168+
}
169+
else if (!!nextPage) {
170+
return page(result, lines.slice(i), index);
171+
}
172+
else if (!!nextChapter) {
173+
return chapter(result, lines.slice(i), index);
174+
}
175+
else {
176+
result.chapters[index.chapter].pages[index.page].tasks[index.task].description += lines[i] + '\n';
150177
}
151-
}
152-
else if (!!nextTask) {
153-
return task(result, lines.slice(i), index);
154-
}
155-
else if (!!nextPage) {
156-
return page(result, lines.slice(i), index);
157-
}
158-
else if (!!nextChapter) {
159-
return chapter(result, lines.slice(i), index);
160-
}
161-
else {
162-
result.chapters[index.chapter].pages[index.page].tasks[index.task].description += lines[i] + '\n';
163178
}
164179
}
165180
return result;

src/build.ts

Lines changed: 58 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ var regex = {
1010
'##': line('#', 2),
1111
'###': line('#', 3),
1212
'+': line('\\+', 1),
13-
'@': line('@', 1)
13+
'@': line('@', 1),
14+
'```': line('`', 3)
1415
};
1516

1617

@@ -130,28 +131,37 @@ function page(result: Result, lines: string[], index: Index) {
130131
explanation: '',
131132
tasks: []
132133
});
134+
let inCodeBlock = false;
133135
for (let i = 1; i < lines.length; i++) {
134136
// matches
135137
let pageTitleMatch = parseWithCode('###', lines[i]);
136138
let nextChapter = parseWithCode('##', lines[i]);
137139
let nextTask = parseWithCode('+', lines[i]);
138-
// 1. page title
139-
if (!hasBreak && isEmpty(lines[i])) {
140-
hasBreak = i;
141-
// 3. exit on page title match again or next chapter
142-
} else if (!!nextChapter) {
143-
return chapter(result, lines.slice(i), index);
144-
// next page
145-
} else if (!!pageTitleMatch) {
146-
return page(result, lines.slice(i), index);
147-
} else if (!!nextTask) {
148-
return task(result, lines.slice(i), index);
149-
} else {
150-
// description || explanation
151-
if (!hasBreak) {
152-
result.chapters[index.chapter].pages[index.page].description += lines[i] + '\n';
140+
let codeBlock = parseWithCode('```', lines[i]);
141+
142+
if (!!codeBlock) {
143+
inCodeBlock = !inCodeBlock;
144+
}
145+
146+
if (!inCodeBlock) {
147+
// 1. page title
148+
if (!hasBreak && isEmpty(lines[i])) {
149+
hasBreak = i;
150+
// 3. exit on page title match again or next chapter
151+
} else if (!!nextChapter) {
152+
return chapter(result, lines.slice(i), index);
153+
// next page
154+
} else if (!!pageTitleMatch) {
155+
return page(result, lines.slice(i), index);
156+
} else if (!!nextTask) {
157+
return task(result, lines.slice(i), index);
153158
} else {
154-
result.chapters[index.chapter].pages[index.page].explanation += lines[i] + '\n';
159+
// description || explanation
160+
if (!hasBreak) {
161+
result.chapters[index.chapter].pages[index.page].description += lines[i] + '\n';
162+
} else {
163+
result.chapters[index.chapter].pages[index.page].explanation += lines[i] + '\n';
164+
}
155165
}
156166
}
157167
}
@@ -175,38 +185,45 @@ function task(result: Result, lines: string[], index: Index) {
175185
actions: []
176186
});
177187
index.task += 1;
188+
let inCodeBlock = false;
178189
for (let i = 1; i < lines.length; i++) {
179190
// matches
180191
let nextPage = parseWithCode('###', lines[i]);
181192
let nextChapter = parseWithCode('##', lines[i]);
182193
let nextTask = parseWithCode('+', lines[i]);
183-
let isPossibleAction = lines[i].match(/^@action|test/);
194+
let isPossibleAction = lines[i].match(/^@action|test|hint/);
195+
let codeBlock = parseWithCode('```', lines[i]);
184196

197+
if (!!codeBlock) {
198+
inCodeBlock = !inCodeBlock;
199+
}
185200
// add actions
186-
if (!!isPossibleAction) {
187-
let action = lines[i].slice(1).split('(')[0];
188-
let target = /\((.*?)\)$/.exec(lines[i])[1];
189-
switch (action) {
190-
case 'test':
191-
result.chapters[index.chapter].pages[index.page].tasks[index.task].tests.push(target);
192-
break;
193-
case 'action':
194-
result.chapters[index.chapter].pages[index.page].tasks[index.task].actions.push(target);
195-
break;
196-
default:
197-
console.log('Invalid task action');
201+
if (!inCodeBlock) {
202+
if (!!isPossibleAction) {
203+
let action = lines[i].slice(1).split('(')[0];
204+
let target = /\((.*?)\)$/.exec(lines[i])[1];
205+
switch (action) {
206+
case 'test':
207+
result.chapters[index.chapter].pages[index.page].tasks[index.task].tests.push(target);
208+
break;
209+
case 'action':
210+
result.chapters[index.chapter].pages[index.page].tasks[index.task].actions.push(target);
211+
break;
212+
default:
213+
console.log('Invalid task action');
214+
}
215+
} else if (!!nextTask) {
216+
return task(result, lines.slice(i), index);
217+
// exit on page
218+
} else if (!!nextPage) {
219+
return page(result, lines.slice(i), index);
220+
// exit on chapter
221+
} else if (!!nextChapter) {
222+
return chapter(result, lines.slice(i), index);
223+
// task description +
224+
} else {
225+
result.chapters[index.chapter].pages[index.page].tasks[index.task].description += lines[i] + '\n';
198226
}
199-
} else if (!!nextTask) {
200-
return task(result, lines.slice(i), index);
201-
// exit on page
202-
} else if (!!nextPage) {
203-
return page(result, lines.slice(i), index);
204-
// exit on chapter
205-
} else if (!!nextChapter) {
206-
return chapter(result, lines.slice(i), index);
207-
// task description +
208-
} else {
209-
result.chapters[index.chapter].pages[index.page].tasks[index.task].description += lines[i] + '\n';
210227
}
211228
}
212229
return result;

0 commit comments

Comments
 (0)