feat(challenge-md): Parse solutions from md

This commit is contained in:
Bouncey
2018-09-30 20:34:01 +01:00
committed by Stuart Taylor
parent 2f193ac4ae
commit 142ac17112
4 changed files with 72 additions and 1 deletions

View File

@ -0,0 +1,14 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`challengeSeed-to-data plugin should have an output to match the snapshot 1`] = `
Object {
"solutions": Array [
"function testFunction(arg) {
return arg;
}
testFunction('hello');
",
],
}
`;

View File

@ -0,0 +1,20 @@
const visit = require('unist-util-visit');
const { selectAll } = require('hast-util-select');
const { sectionFilter } = require('./utils');
function createPlugin() {
return function transformer(tree, file) {
function visitor(node) {
if (sectionFilter(node, 'solution')) {
const solutions = selectAll('code', node).map(
element => element.children[0].value
);
file.data.solutions = solutions;
}
}
visit(tree, 'element', visitor);
};
}
module.exports = createPlugin;

View File

@ -0,0 +1,37 @@
/* global describe it expect beforeEach */
const mockAST = require('./fixtures/challenge-html-ast.json');
const solutionToData = require('./solution-to-data');
describe('challengeSeed-to-data plugin', () => {
const plugin = solutionToData();
let file = { data: {} };
beforeEach(() => {
file = { data: {} };
});
it('returns a function', () => {
expect(typeof plugin).toEqual('function');
});
it('adds a `solutions` property to `file.data`', () => {
plugin(mockAST, file);
expect('solutions' in file.data).toBe(true);
});
it('ensures that the `solutions` property is an array', () => {
plugin(mockAST, file);
expect(Array.isArray(file.data.solutions)).toBe(true);
});
it('each entry in the `solutions` array is a string', () => {
plugin(mockAST, file);
expect(file.data.solutions.every(el => typeof el === 'string')).toBe(true);
});
it('should have an output to match the snapshot', () => {
plugin(mockAST, file);
expect(file.data).toMatchSnapshot();
});
});

View File

@ -1,7 +1,7 @@
const visit = require('unist-util-visit'); const visit = require('unist-util-visit');
const toHTML = require('hast-util-to-html'); const toHTML = require('hast-util-to-html');
const { sectionFilter } = require('./utils') const { sectionFilter } = require('./utils');
function textToData(sectionIds) { function textToData(sectionIds) {
if (!sectionIds || !Array.isArray(sectionIds) || sectionIds.length <= 0) { if (!sectionIds || !Array.isArray(sectionIds) || sectionIds.length <= 0) {