feat(parser): handle multi-file solutions
This commit is contained in:
committed by
Mrugesh Mohapatra
parent
a959d462e9
commit
063145fe90
@ -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;
|
||||||
|
@ -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: {} };
|
||||||
|
@ -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()
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user