我正在尝试为 Quarto/pandoc 编写一个 lua 过滤器,它删除与文档 yaml 标头中定义的目标语言不匹配的所有代码块。这是我到目前为止得到的过滤器:
taget_lang = nil
function Meta(m)
if m.taget_lang then
taget_lang = pandoc.utils.stringify(m.taget_lang)
end
print("In Meta, taget lang is " .. taget_lang)
return m
end
function CodeBlock(el)
print("In CodeBlock, taget lang is " .. taget_lang)
if taget_lang then
if el.attr.classes[1] ~= taget_lang then
return {}
end
return el
end
end
这是一个 Markdown(或更确切地说是四开)文档的示例:
---
title: Some title
author: Some author
date: last-modified
format:
ipynb:
toc: false
filters:
- langsplit.lua
taget_lang: "python"
---
Here is some text.
```{python test-py}
print("some python code")
```
```{r test-r}
print("some R code")
```
当我使用 时quarto render test.qmd
,我得到以下打印输出:
nil
nil
nil
nil
In Meta, taget lang is python
并且渲染的文档包含所有代码,告诉我CodeBlock函数无法访问Meta内部定义的taget_lang。但根据文档,这应该可行。有什么线索吗?
(我也不满意return {}
,它返回一个空代码块而不是什么都没有,但这是一个单独的问题)
文档指定元数据是在过滤块后处理的,因此仅在处理CodeBlock
target_lang
元素后才设置。有两种方法可以解决这个问题。一种方法是过滤主要的Pandoc元素,这可以提供更多控制:
另一种方法是通过显式返回过滤器序列来控制过滤器的执行顺序,如下所示: