@@ -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 ( / ^ @ a c t i o n | t e s t / ) ;
194+ let isPossibleAction = lines [ i ] . match ( / ^ @ a c t i o n | t e s t | h i n t / ) ;
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