markdown-doctest
Version:
Test all the code in your markdown docs!
85 lines (84 loc) • 2.59 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var isStartOfSnippet = function (line) {
return line.trim().match(/```\W*(JavaScript|js|es6)\s?$/i);
};
var isEndOfSnippet = function (line) { return line.trim() === "```"; };
var isSkip = function (line) { return line.trim() === "<!-- skip-example -->"; };
var isCodeSharedInFile = function (line) {
return line.trim() === "<!-- share-code-between-examples -->";
};
function startNewSnippet(snippets, fileName, lineNumber) {
var skip = snippets.skip;
snippets.skip = false;
return Object.assign(snippets, {
snippets: snippets.snippets.concat([
{ code: "", fileName: fileName, lineNumber: lineNumber, complete: false, skip: skip }
])
});
}
function addLineToLastSnippet(line) {
return function addLine(snippets) {
var lastSnippet = snippets.snippets[snippets.snippets.length - 1];
if (lastSnippet && !lastSnippet.complete) {
lastSnippet.code += line + "\n";
}
return snippets;
};
}
function endSnippet(snippets, fileName, lineNumber) {
var lastSnippet = snippets.snippets[snippets.snippets.length - 1];
if (lastSnippet) {
lastSnippet.complete = true;
}
return snippets;
}
function skip(snippets) {
snippets.skip = true;
return snippets;
}
function shareCodeInFile(snippets) {
snippets.shareCodeInFile = true;
return snippets;
}
function parseLine(line) {
if (isStartOfSnippet(line)) {
return startNewSnippet;
}
if (isEndOfSnippet(line)) {
return endSnippet;
}
if (isSkip(line)) {
return skip;
}
if (isCodeSharedInFile(line)) {
return shareCodeInFile;
}
return addLineToLastSnippet(line);
}
function parseCodeSnippets(args) {
var contents = args.contents;
var fileName = args.fileName;
var initialState = {
snippets: [],
shareCodeInFile: false,
complete: false
};
var results = contents
.split("\n")
.map(parseLine)
.reduce(function (snippets, lineAction, index) {
return lineAction(snippets, fileName, index + 1);
}, initialState);
var codeSnippets = results.snippets;
var lastSnippet = codeSnippets[codeSnippets.length - 1];
if (lastSnippet && !lastSnippet.complete) {
throw new Error("Snippet parsing was incomplete");
}
return {
fileName: fileName,
codeSnippets: codeSnippets,
shareCodeInFile: results.shareCodeInFile
};
}
exports.default = parseCodeSnippets;
;