@ng-doc/builder
Version:
<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>
64 lines • 3.21 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseCodeBlockParams = parseCodeBlockParams;
const tslib_1 = require("tslib");
const P = tslib_1.__importStar(require("parsimmon"));
const helpers_1 = require("./helpers");
/**
* Code block options parser
* @param options - Options string to parse
*/
function parseCodeBlockParams(options) {
const parser = P.createLanguage({
language: () => P.regexp(/[a-zA-Z-]+/)
.skip(P.optWhitespace)
.map((language) => ({ language })),
// File Parsers
fileLineNumber: () => P.string('L').then(P.digits).map(Number),
fileLineRange: (p) => P.seqMap(P.string('#')
.then(p['fileLineNumber'])
.map((num) => num - 1), P.string('-').then(p['fileLineNumber'].fallback(undefined)), (fileLineStart, fileLineEnd) => ({ fileLineStart, fileLineEnd })),
fileLineStart: (p) => P.string('#')
.then(p['fileLineNumber'])
.map((num) => num - 1)
.map((fileLineStart) => ({ fileLineStart, fileLineEnd: fileLineStart + 1 })),
lineParams: (p) => p['fileLineRange'].or(p['fileLineStart']).fallback({}),
highlightedLinesRange: () => P.seqMap(helpers_1.number.skip(P.string('-')), helpers_1.number, (start, end) => [...Array(end + 1).keys()].slice(start - end - 1)),
// Main Parsers
lineNumbers: () => P.string('lineNumbers').map(() => ({ lineNumbers: true })),
filePath: () => (0, helpers_1.param)('file'),
name: () => (0, helpers_1.param)('name'),
group: () => (0, helpers_1.param)('group'),
fileName: () => (0, helpers_1.param)('fileName', 'name'),
icon: () => (0, helpers_1.param)('icon'),
active: () => P.string('active').map(() => ({ active: true })),
file: (p) => P.seq(p['filePath'], p['lineParams'].map(({ fileLineStart, fileLineEnd }) => ({ fileLineStart, fileLineEnd }))).map(([file, lineParams]) => ({ ...file, ...lineParams })),
highlightedLines: (p) => p['highlightedLinesRange']
.or(helpers_1.number)
.sepBy(P.string(',').then(P.optWhitespace))
.wrap(P.string('{'), P.string('}'))
.map((a) => Array.from(new Set(a.flat())))
.map((highlightedLines) => ({ highlightedLines })),
// Combined Parsers
paramsParser: (p) => p['lineNumbers']
.or(p['fileName'])
.or(p['file'])
.or(p['name'])
.or(p['group'])
.or(p['active'])
.or(p['icon'])
.or(p['highlightedLines'])
.sepBy(P.whitespace),
languageWithParamsParser: (p) => P.seq(p['language'], p['paramsParser']).map((v) => v.flat()),
});
let result = parser['paramsParser'].parse(options);
if (result.status) {
return result.value.reduce((acc, cur) => ({ ...acc, ...cur }), {});
}
result = parser['languageWithParamsParser'].parse(options);
if (result.status) {
return result.value.reduce((acc, cur) => ({ ...acc, ...cur }), {});
}
throw new Error(`Unable to parse code block options: "${options}"`);
}
//# sourceMappingURL=parse-code-block-params.js.map
;