marked/test/helpers/load.js

94 lines
2.6 KiB
JavaScript
Raw Normal View History

import fs from 'fs';
import path from 'path';
import fm from 'front-matter';
import { createRequire } from 'module';
2019-04-25 09:42:38 -05:00
const require = createRequire(import.meta.url);
2019-04-25 09:42:38 -05:00
export function outputCompletionTable(title, specs) {
2019-04-25 09:42:38 -05:00
let longestName = 0;
let maxSpecs = 0;
for (const section in specs) {
longestName = Math.max(section.length, longestName);
maxSpecs = Math.max(specs[section].total, maxSpecs);
}
const maxSpecsLen = ('' + maxSpecs).length;
const spaces = maxSpecsLen * 2 + longestName + 11;
console.log('-'.padEnd(spaces + 4, '-'));
console.log(`| ${title.padStart(Math.ceil((spaces + title.length) / 2)).padEnd(spaces)} |`);
console.log(`| ${' '.padEnd(spaces)} |`);
for (const section in specs) {
console.log(`| ${section.padEnd(longestName)} ${('' + specs[section].pass).padStart(maxSpecsLen)} of ${('' + specs[section].total).padStart(maxSpecsLen)} ${(100 * specs[section].pass / specs[section].total).toFixed().padStart(4)}% |`);
}
console.log('-'.padEnd(spaces + 4, '-'));
console.log();
}
export function loadFiles(dir) {
2019-04-25 09:42:38 -05:00
const files = fs.readdirSync(dir);
return files.reduce((obj, file) => {
const ext = path.extname(file);
const name = path.basename(file, ext);
const absFile = path.join(dir, file);
let specs;
switch (ext) {
case '.md': {
const content = fm(fs.readFileSync(absFile, 'utf8'));
2019-07-01 09:33:25 -05:00
const skip = content.attributes.skip;
delete content.attributes.skip;
const only = content.attributes.only;
delete content.attributes.only;
2019-04-25 09:42:38 -05:00
specs = [{
section: name,
markdown: content.body,
html: fs.readFileSync(absFile.replace(/[^.]+$/, 'html'), 'utf8'),
2019-07-01 09:33:25 -05:00
options: content.attributes,
only,
skip
2019-04-25 09:42:38 -05:00
}];
break;
}
case '.cjs':
2019-04-25 09:42:38 -05:00
case '.json': {
try {
specs = require(absFile);
} catch (err) {
console.log(`Error loading ${absFile}`);
throw err;
}
2019-04-25 09:42:38 -05:00
if (!Array.isArray(specs)) {
specs = [specs];
}
break;
}
default:
return obj;
}
for (let i = 0; i < specs.length; i++) {
const spec = specs[i];
2019-04-25 09:42:38 -05:00
if (!spec.section) {
spec.section = `${name}[${i}]`;
2019-04-25 09:42:38 -05:00
}
if (!obj[spec.section]) {
obj[spec.section] = {
total: 0,
pass: 0,
specs: []
};
}
obj[spec.section].total++;
obj[spec.section].pass += spec.shouldFail ? 0 : 1;
obj[spec.section].specs.push(spec);
}
return obj;
}, {});
}