* fix: only log errors when challenges update * refactor: handle error first Co-authored-by: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> Co-authored-by: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com>
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const { readSync } = require('to-vfile');
 | |
| const remark = require('remark-parse');
 | |
| const directive = require('remark-directive');
 | |
| const frontmatter = require('remark-frontmatter');
 | |
| const addTests = require('./plugins/add-tests');
 | |
| const restoreDirectives = require('./plugins/restore-directives');
 | |
| const replaceImports = require('./plugins/replace-imports');
 | |
| const addFrontmatter = require('./plugins/add-frontmatter');
 | |
| const addText = require('./plugins/add-text');
 | |
| const addVideoQuestion = require('./plugins/add-video-question');
 | |
| const addSeed = require('./plugins/add-seed');
 | |
| const addSolution = require('./plugins/add-solution');
 | |
| const tableAndStrikeThrough = require('./plugins/table-and-strikethrough');
 | |
| const unified = require('unified');
 | |
| 
 | |
| // by convention, anything that adds to file.data has the name add<name>.
 | |
| const processor = unified()
 | |
|   // add the remark parser
 | |
|   .use(remark)
 | |
|   // modify the parser so that Github flavour tables and strikethroughs get
 | |
|   // converted to 'delete' nodes
 | |
|   .use(tableAndStrikeThrough)
 | |
|   // directives are parsed into 'leafDirective' nodes and used for imports
 | |
|   .use(directive)
 | |
|   // convert the text at the top of the document (surrounded by ---) into a
 | |
|   // 'yaml' node
 | |
|   .use(frontmatter, ['yaml'])
 | |
|   // extract the content from that 'yaml' node
 | |
|   .use(addFrontmatter)
 | |
|   // Any imports will be replaced (in the tree) with
 | |
|   // the sub-tree of the target file. e.g.
 | |
|   // ::import{component="Script" from="./file.path" }
 | |
|   // means that file.path's tree will be inserted wherever
 | |
|   // ::use{component="Script"}
 | |
|   // appears.
 | |
|   .use(replaceImports)
 | |
|   // the final five 'add' plugins insert content into file.data
 | |
|   // TODO: rename test->hint everywhere? It should make things easier to reason
 | |
|   // about.
 | |
|   .use(addSeed)
 | |
|   .use(addSolution)
 | |
|   // the directives will have been parsed and used by this point, any remaining
 | |
|   // 'directives' will be from text like the css selector :root. These should be
 | |
|   // converted back to text before they're added to the challenge object.
 | |
|   .use(restoreDirectives)
 | |
|   .use(addVideoQuestion)
 | |
|   .use(addTests)
 | |
|   .use(addText, ['description', 'instructions']);
 | |
| 
 | |
| exports.parseMD = function parseMD(filename) {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     const file = readSync(filename);
 | |
|     const tree = processor.parse(file);
 | |
|     processor.run(tree, file, function(err, node, file) {
 | |
|       if (!err) {
 | |
|         delete file.contents;
 | |
|         resolve(file.data);
 | |
|       }
 | |
| 
 | |
|       err.message += ' in file ' + filename;
 | |
|       reject(err);
 | |
|     });
 | |
|   });
 | |
| };
 |