feat(parser): handle multi-file solutions

This commit is contained in:
Oliver Eyton-Williams
2020-06-04 16:52:49 +02:00
committed by Mrugesh Mohapatra
parent a959d462e9
commit 063145fe90
4 changed files with 25 additions and 6 deletions

View File

@ -20,8 +20,6 @@ function defaultFile(lang) {
}; };
} }
function createCodeGetter(key, regEx, seeds) { function createCodeGetter(key, regEx, seeds) {
console.log('seeds');
console.log(seeds);
return container => { return container => {
const { const {
properties: { id } properties: { id }
@ -122,4 +120,5 @@ function createPlugin() {
}; };
} }
module.exports = createPlugin; exports.challengeSeedToData = createPlugin;
exports.createCodeGetter = createCodeGetter;

View File

@ -1,8 +1,9 @@
/* global describe it expect beforeEach */ /* global describe it expect beforeEach */
const mockAST = require('./fixtures/challenge-html-ast.json');
const challengeSeedToData = require('./challengeSeed-to-data');
const isArray = require('lodash/isArray'); const isArray = require('lodash/isArray');
const mockAST = require('./fixtures/challenge-html-ast.json');
const { challengeSeedToData } = require('./challengeSeed-to-data');
describe('challengeSeed-to-data plugin', () => { describe('challengeSeed-to-data plugin', () => {
const plugin = challengeSeedToData(); const plugin = challengeSeedToData();
let file = { data: {} }; let file = { data: {} };

View File

@ -9,7 +9,7 @@ const raw = require('rehype-raw');
const frontmatterToData = require('./frontmatter-to-data'); const frontmatterToData = require('./frontmatter-to-data');
const textToData = require('./text-to-data'); const textToData = require('./text-to-data');
const testsToData = require('./tests-to-data'); const testsToData = require('./tests-to-data');
const challengeSeedToData = require('./challengeSeed-to-data'); const { challengeSeedToData } = require('./challengeSeed-to-data');
const solutionsToData = require('./solution-to-data'); const solutionsToData = require('./solution-to-data');
const processor = unified() const processor = unified()

View File

@ -2,11 +2,15 @@ const visit = require('unist-util-visit');
const { selectAll } = require('hast-util-select'); const { selectAll } = require('hast-util-select');
const { sectionFilter } = require('./utils'); const { sectionFilter } = require('./utils');
const { createCodeGetter } = require('./challengeSeed-to-data');
const solutionRE = /(.+)-solution$/;
function createPlugin() { function createPlugin() {
return function transformer(tree, file) { return function transformer(tree, file) {
function visitor(node) { function visitor(node) {
if (sectionFilter(node, 'solution')) { if (sectionFilter(node, 'solution')) {
// fallback for single-file challenges
const solutions = selectAll('code', node).map( const solutions = selectAll('code', node).map(
element => element.children[0].value element => element.children[0].value
); );
@ -14,6 +18,21 @@ function createPlugin() {
...file.data, ...file.data,
solutions solutions
}; };
const solutionFiles = {};
const codeDivs = selectAll('div', node);
const solutionContainers = codeDivs.filter(({ properties: { id } }) =>
solutionRE.test(id)
);
solutionContainers.forEach(
createCodeGetter('contents', solutionRE, solutionFiles)
);
file.data = {
...file.data,
solutionFiles: Object.keys(solutionFiles).map(
lang => solutionFiles[lang]
)
};
} }
} }
visit(tree, 'element', visitor); visit(tree, 'element', visitor);