Pandoc模板中循环内非循环变量未获取循环数组值问题
解决Pandoc模板中循环内非循环变量无法引用循环变量值的问题
问题根源
你碰到的这个情况,本质是Pandoc模板的变量作用域限制:mais是定义在YAML顶层的非循环变量,它的内容在模板开始渲染时就被固定下来了,不会随着$for(icones)$的每一次迭代,重新解析里面的$icones.nome$引用。所以mais.url里的$icones.nome$只是当作普通文本处理,自然没法获取循环里的动态值,导致最终URL为空。
两种可行的解决方案
方案1:直接在模板中拼接URL(最简单)
既然mais.url的结构是固定的,只是需要插入icones.nome和gnome的值,不如直接跳过mais变量,在循环内部直接拼出完整URL:
修改你的Pandoc模板为:
$for(icones)$ <img alt="$icones.nome$" name="$icones.nome$" src="https://filename.com/$icones.nome$/logo=$gnome$"/> $endfor$
这样每一次循环迭代时,$icones.nome$和$gnome$都会被正确替换成当前循环的对应值,完全符合你的期望输出。
方案2:整合YAML结构+使用Pandoc的replace过滤器(适合需要统一管理URL模板的场景)
如果后续需要统一修改URL结构,不想每次改模板,可以调整YAML,把URL模板放到icones的每个对象里,再用Pandoc的replace功能动态替换变量:
修改后的YAML配置:
--- gnome: 'gnome' icones: - {nome: actions, url_template: 'filename.com/$nome$/logo=$gnome$'} - {nome: apps, url_template: 'filename.com/$nome$/logo=$gnome$'} - {nome: devices, url_template: 'filename.com/$nome$/logo=$gnome$'} - {nome: mimetypes, url_template: 'filename.com/$nome$/logo=$gnome$'} - {nome: places, url_template: 'filename.com/$nome$/logo=$gnome$'} - {nome: status, url_template: 'filename.com/$nome$/logo=$gnome$'} ---
修改后的Pandoc模板(需要Pandoc 2.18及以上版本):
$for(icones)$ $let:url = icones.url_template$ $url := replace(url, "$nome$", icones.nome)$ $url := replace(url, "$gnome$", gnome)$ <img alt="$icones.nome$" name="$icones.nome$" src="https://$url$"/> $endfor$
这种方式把URL模板集中在YAML里,后续要改结构只需要修改YAML中的url_template即可,不用动模板代码。
最终效果验证
不管用哪种方案,最终生成的HTML都会是你想要的样子:
<img alt="actions" name="actions" src="https://filename.com/actions/logo=gnome"/> <img alt="apps" name="apps" src="https://filename.com/apps/logo=gnome"/> <img alt="devices" name="devices" src="https://filename.com/devices/logo=gnome"/> <!-- 其余项以此类推 -->
内容的提问来源于stack exchange,提问作者Oo'-
相关产品推荐
相关产品推荐

