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;
|