myst-parser
Version:
Markdown parser for MyST markdown in JavaScript
56 lines (55 loc) • 2.21 kB
JavaScript
import { fileError, fileWarn, ParseTypesEnum } from 'myst-common';
export function contentFromNode(node, spec, vfile, description, ruleId) {
const { children, value } = node;
if (spec.type === ParseTypesEnum.parsed || spec.type === 'myst') {
if (typeof value !== 'string') {
fileWarn(vfile, `content is parsed from non-string value for ${description}`, {
node,
ruleId,
});
}
if (!(children === null || children === void 0 ? void 0 : children.length)) {
if (spec.required) {
fileError(vfile, `no parsed content for required ${description}`, { node, ruleId });
}
return undefined;
}
return children;
}
if (value == null) {
if (spec.required) {
fileError(vfile, `no content for required ${description}`, { node, ruleId });
}
return undefined;
}
if (spec.type === ParseTypesEnum.string || spec.type === String) {
if (value === true)
return '';
// silently transform numbers into strings here
if (typeof value !== 'string' && !(value && typeof value === 'number' && !isNaN(value))) {
fileWarn(vfile, `value is not a string for ${description}`, { node, ruleId });
}
return String(value);
}
if (spec.type === ParseTypesEnum.number || spec.type === Number) {
const valueAsNumber = Number(value);
if (value === true || isNaN(valueAsNumber)) {
const fileFn = spec.required ? fileError : fileWarn;
fileFn(vfile, `number not provided for ${description}`, { node, ruleId });
return undefined;
}
return valueAsNumber;
}
if (spec.type === ParseTypesEnum.boolean || spec.type === Boolean) {
if (typeof value === 'string') {
if (value.toLowerCase() === 'false')
return false;
if (value.toLowerCase() === 'true')
return true;
}
if (typeof value !== 'boolean') {
fileWarn(vfile, `value is not a boolean for ${description}`, { node, ruleId });
}
return !!value;
}
}