| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  | const visit = require('unist-util-visit'); | 
					
						
							|  |  |  | const { selectAll, select } = require('hast-util-select'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { sectionFilter } = require('./utils'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const seedRE = /(.+)-seed$/; | 
					
						
							|  |  |  | const headRE = /(.+)-setup$/; | 
					
						
							|  |  |  | const tailRE = /(.+)-teardown$/; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function defaultFile(lang) { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     key: `index${lang}`, | 
					
						
							|  |  |  |     ext: lang, | 
					
						
							|  |  |  |     name: 'index', | 
					
						
							|  |  |  |     contents: '', | 
					
						
							|  |  |  |     head: '', | 
					
						
							|  |  |  |     tail: '' | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function createCodeGetter(key, regEx, seeds) { | 
					
						
							|  |  |  |   return container => { | 
					
						
							|  |  |  |     const { | 
					
						
							|  |  |  |       properties: { id } | 
					
						
							|  |  |  |     } = container; | 
					
						
							|  |  |  |     const lang = id.match(regEx)[1]; | 
					
						
							|  |  |  |     const code = select('code', container).children[0].value; | 
					
						
							|  |  |  |     if (lang in seeds) { | 
					
						
							|  |  |  |       seeds[lang] = { | 
					
						
							|  |  |  |         ...seeds[lang], | 
					
						
							|  |  |  |         [key]: code | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       seeds[lang] = { | 
					
						
							|  |  |  |         ...defaultFile(lang), | 
					
						
							|  |  |  |         [key]: code | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createPlugin() { | 
					
						
							|  |  |  |   return function transformer(tree, file) { | 
					
						
							|  |  |  |     function visitor(node) { | 
					
						
							|  |  |  |       if (sectionFilter(node, 'challengeSeed')) { | 
					
						
							|  |  |  |         let seeds = {}; | 
					
						
							|  |  |  |         const codeDivs = selectAll('div', node); | 
					
						
							| 
									
										
										
										
											2020-02-08 13:29:10 -05:00
										 |  |  |         const seedContainers = codeDivs.filter(({ properties: { id } }) => | 
					
						
							| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  |           seedRE.test(id) | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2020-02-08 13:29:10 -05:00
										 |  |  |         seedContainers.forEach(createCodeGetter('contents', seedRE, seeds)); | 
					
						
							| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-08 13:29:10 -05:00
										 |  |  |         const headContainers = codeDivs.filter(({ properties: { id } }) => | 
					
						
							| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  |           headRE.test(id) | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2020-02-08 13:29:10 -05:00
										 |  |  |         headContainers.forEach(createCodeGetter('head', headRE, seeds)); | 
					
						
							| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-08 13:29:10 -05:00
										 |  |  |         const tailContainers = codeDivs.filter(({ properties: { id } }) => | 
					
						
							| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  |           tailRE.test(id) | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2020-02-08 13:29:10 -05:00
										 |  |  |         tailContainers.forEach(createCodeGetter('tail', tailRE, seeds)); | 
					
						
							| 
									
										
										
										
											2018-09-30 20:13:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         file.data = { | 
					
						
							|  |  |  |           ...file.data, | 
					
						
							|  |  |  |           files: Object.keys(seeds).map(lang => seeds[lang]) | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     visit(tree, 'element', visitor); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = createPlugin; |