ruby jekyll包含参数中的Liquid变量

y1aodyip  于 2023-10-17  发布在  Ruby
关注(0)|答案(2)|浏览(150)

我在_includes中有一个jekyll partial,它在其内容周围 Package 了一个彩色的div。partial(callout.html)看起来像这样:

<div markdown="1" class="callout">
    {{ include.content }}
</div>

test.md中,我这样调用它:

{% include callout.html content="Content to be filled with a URL: {{ site.baseurl }}/img/test.png" %}

但是,这会导致Liquid抛出错误:

Liquid Exception: Invalid syntax for include tag: ... 
" Valid syntax: {% include file.ext param='value' param2='value' %} in
bundler: failed to load command: jekyll (/usr/local/lib/ruby/gems/2.6.0/bin/jekyll)

我认为这个问题是由于我在content参数中包含了{{ site.baseurl }}

我怎样才能绕过这个限制?

pb3s4cty

pb3s4cty1#

https://jekyllrb.com/docs/includes/#passing-parameter-variables-to-includes
我在发布后不久就在Jekyll文档中找到了答案。
content参数的值应该在传递给include之前单独存储为变量,使用capture。对于上面的示例:

{% capture callout_content %}
Content to be filled with a URL: {{ site.baseurl }}/img/test.png
{% endcapture %}

{% include callout.html content=callout_content %}
i5desfxk

i5desfxk2#

有几个例外没有很好的记录。
使用{% include %},参数(例如要包含的文件名和要包含的任何变量(本例中为“内容”))可以作为引用传递:

{% include {{ file }} content='...' url='...' %}

关于你列出的例子,我会怎么做:

{% assign image_url = site.baseurl | append: '/img/test.png' | strip %}
{% include callout.html text='Content to be filled with a URL:' url=image_url %}

然后在callout.html包含的文件中:

<div class="callout">
 {{ include.text }} {{ include.url }} 
</div>

不确定它是否更干净/更好/更快,但我不喜欢在内容包含中混合/匹配文本和变量,它只是感觉恶心。
为了增加更多的复杂性和进一步的定制.可能有点离题,但它确实展示了include的真正威力。
我想强调的是,使用包含和传递变量作为对页面或头版或模板上人工输入文本的引用,您应该始终考虑使文本“安全”:
| strip| uri_escape等是你的朋友:

{% if page.callout.enabled == true %}
{% assign file = 'callout.html' %}
{% assign text = 'Content to be filled with a URL: ' %}
{% assign image_url = site.baseurl | append: page.image | uri_escape | strip %}
{% include {{ file }} text=text image_url=image_url %}
{% elsif page.comments.enabled == true %}
{% assign file = 'components/comments/disqus.html' %}
{% include {{ file }} %}
{% endif %}

在本例中,我特别没有在文本变量中包含| strip,因为它会删除尾随的空格。更喜欢将空格留在模板包含的文件中,而不是以这种方式传递的变量-它们不可能进行比较和/或处理,但是当将它们分离为单独的变量时,然后将其传递到包含中,您可以。

相关问题