验证
语法验证
Markdoc 开箱即用地支持使用 validate 函数进行语法验证。
validate(AstNode, ?Config) => ValidateError[]
调用 validate 是一个可选步骤,您可以在渲染之前使用它来验证抽象语法树(AST)。这在测试、持续集成或编辑器扩展等开发工具中非常有用。
const doc = `# Heading`; const ast = Markdoc.parse(doc); const errors = Markdoc.validate(ast, config); // 对错误进行处理
如果文档包含语法错误,validate 的输出如下所示:
const doc = `
{% callout %}
这里!
`;
const ast = Markdoc.parse(doc);
const errors = Markdoc.validate(ast, config);
// errors
[
{
type: 'tag',
lines: [1, 2],
location: {
start: { line: 1 },
end: { line: 2 }
},
error: {
id: 'missing-closing',
level: 'critical',
message: "节点 'callout' 缺少闭合标签"
}
}
];
模式验证
您还可以通过向 Node 或 Tag 定义,或向您的 自定义属性类型 添加 validate 函数,来扩展 Markdoc 并添加自定义验证规则。
验证内容
使用 Node 或 Tag 的 validate 函数来验证内容是否正确,特别是 children(子节点)。
/** @type {import('@markdoc/markdoc').Config} */
const config = {
tags: {
provider: {
render: 'Provider',
// ...
validate(node) {
if (node.children.length !== 1) {
return [
{
id: 'provider-children',
level: 'critical',
message: 'Provider 必须只有一个子节点。'
}
];
}
return [];
}
}
}
};
验证属性
使用 自定义 Attribute 类型 来验证传递给您的标签和节点的属性是否正确。
export class ImageSrc {
validate(value, config) {
if (!value.startsWith('https://')) {
return [
{
id: 'image-src',
level: 'error',
message: '所有图片 src 应包含完整 URL。'
}
];
}
return [];
}
}
/** @type {import('@markdoc/markdoc').Config} */
const config = {
image: {
render: 'img',
attributes: {
src: {
type: ImageSrc,
required: true
// ...
}
// ...
}
}
};