| 
									
										
										
										
											2018-09-30 20:34:01 +01:00
										 |  |  | const visit = require('unist-util-visit'); | 
					
						
							|  |  |  | const { selectAll } = require('hast-util-select'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { sectionFilter } = require('./utils'); | 
					
						
							| 
									
										
										
										
											2020-07-13 18:59:40 +02:00
										 |  |  | const { createCodeGetter, defaultFile } = require('./challengeSeed-to-data'); | 
					
						
							|  |  |  | const { isEmpty } = require('lodash'); | 
					
						
							| 
									
										
										
										
											2020-06-04 16:52:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | const solutionRE = /(.+)-solution$/; | 
					
						
							| 
									
										
										
										
											2018-09-30 20:34:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-13 18:59:40 +02:00
										 |  |  | function indexByKey(obj) { | 
					
						
							|  |  |  |   return { [obj.key]: { ...obj } }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-30 20:34:01 +01:00
										 |  |  | function createPlugin() { | 
					
						
							|  |  |  |   return function transformer(tree, file) { | 
					
						
							|  |  |  |     function visitor(node) { | 
					
						
							|  |  |  |       if (sectionFilter(node, 'solution')) { | 
					
						
							| 
									
										
										
										
											2020-06-04 16:52:49 +02:00
										 |  |  |         // fallback for single-file challenges
 | 
					
						
							| 
									
										
										
										
											2020-07-13 18:59:40 +02:00
										 |  |  |         const rawSolutions = selectAll('code', node).map(element => ({ | 
					
						
							|  |  |  |           lang: element.properties.className[0].split('-')[1], | 
					
						
							|  |  |  |           contents: element.children[0].value | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 16:52:49 +02:00
										 |  |  |         const solutionFiles = {}; | 
					
						
							| 
									
										
										
										
											2020-07-13 18:59:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 16:52:49 +02:00
										 |  |  |         const codeDivs = selectAll('div', node); | 
					
						
							|  |  |  |         const solutionContainers = codeDivs.filter(({ properties: { id } }) => | 
					
						
							|  |  |  |           solutionRE.test(id) | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         solutionContainers.forEach( | 
					
						
							|  |  |  |           createCodeGetter('contents', solutionRE, solutionFiles) | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-13 18:59:40 +02:00
										 |  |  |         const solutionsAsFiles = rawSolutions | 
					
						
							|  |  |  |           .map(({ lang, contents }) => ({ | 
					
						
							|  |  |  |             ...defaultFile(lang), | 
					
						
							|  |  |  |             contents | 
					
						
							|  |  |  |           })) | 
					
						
							|  |  |  |           .map(indexByKey); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const solutions = isEmpty(solutionFiles) | 
					
						
							|  |  |  |           ? solutionsAsFiles | 
					
						
							|  |  |  |           : [solutionFiles]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 16:52:49 +02:00
										 |  |  |         file.data = { | 
					
						
							|  |  |  |           ...file.data, | 
					
						
							| 
									
										
										
										
											2020-07-13 18:59:40 +02:00
										 |  |  |           solutions | 
					
						
							| 
									
										
										
										
											2020-06-04 16:52:49 +02:00
										 |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-09-30 20:34:01 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     visit(tree, 'element', visitor); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = createPlugin; |