Markdown 呈现在 foreach 的成员上调用或通过 where 筛选器调用时会有所不同



我想知道是否有人可以阐明这个难题。我正在Mac上使用新安装的香草杰基尔。 一切似乎都很好,但我发现我的页面页脚中显示的一些文本在帖子和所有其他页面上的呈现方式不同。在大多数页面上,文本将呈现为HTML,但在帖子中,它呈现为Markdown。我找到了解决方法,但它给我留下了更多问题。

上下文

我已将footer_sections定义为保存部分页脚的集合。在我的_config.yml中,这看起来像:

collections:
footer_sections:
output: false

然后在 Markdown 文件中定义页脚部分,例如_footer_sections/address.md

---
title: Address
order: 1
---
**My Name**  
123 My Street  
My Town, ST 12345  
123-555-5555

在我的default.html中,我的HTML中有一个页脚部分,如下所示:

<div id="footer">
{{ site.footer_sections | where: "title", "Address" }}
</div>

我的帖子设置如下:

---
title: Silly new post
date: 2017-02-27T12:33:53+00:00
author: Eric Celeste
layout: post
---
Silly post.

最后,帖子布局连接到默认布局,如下所示:

---
layout: default
---
<h1>{{ page.title }}</h1>
<p class="meta">{{ page.date | date_to_string }}</p>
<div class="post">
{{ content }}
</div>

问题所在

请注意,address.md文件是在 Markdown 中定义的,然后通过包含default.html中的部分,其内容显示在页脚中。在所有常规页面上,这将呈现为HTML(一个粗体名称,一个普通地址),但在像上面愚蠢的帖子这样的帖子上,它将呈现为Markdown(一个被星星包围的名字和一个没有类似中断的地址)。

我想也许这与帖子和页面之间的不同程序步骤有关,也许 Markdown 渲染在页面上"稍后"发生,但已经在帖子中"更早"发生。我在 Jekyll 上只有两天大,所以我真的不知道它是如何工作的。

为了验证这一理论,我尝试使用markdownify滤镜强制 Markdown 渲染。我更改了default.html中的液体标签,以便它们显示为:

{% assign section = site.footer_sections | where: "title", "Address" %}
{{ section.content | markdownify }}

奇怪的是,这在任何地方都产生了更糟糕的结果。现在,常规或帖子页面的页脚中没有出现任何类型的文本。

理论上,也许where过滤器实际上与循环遍历数组成员不同foreach我尝试了另一种方法:

{% for section in site.footer_sections %}
{% if section.title == "Address" %}
{{ section.content | markdownify }}
{% endif %}
{% endfor %}

成功了!现在,页脚部分的内容在常规页面和帖子上都呈现为 HTML。

我的问题

为什么最初的方法不起作用?在 Jekyll 中呈现帖子和其他页面有什么区别?

虽然我找到了解决方法,但我不明白为什么它有效。使用where筛选器从数组中提取项目与使用foreach循环中的成员有何不同?这对markdownify过滤器的结果有何影响?

有没有一种更干净、更简单的方法可以从我的部分获取 HTML 呈现的内容,而不是每次我想使用其中一个时循环浏览它们?

感谢您的任何见解!

site.footer_sections是一个数组,"where"过滤器的输出仍然是一个数组(但只包含符合您条件的值)。

在您的情况下,您正在获得一个单元素数组,但它仍然是一个数组对象。

要亲自查看此信息,请使用检查过滤器:

{% assign section = site.footer_sections | where: "title", "Address" %}
{{ section.content | inspect }}

另一方面,当您使用 for 循环遍历元素时,在每次迭代时,您都会获得数组的各个元素。尝试在循环中使用inspect,看看两种类型的section变量有何不同。

要使"where"方法起作用,您需要使用first[0]从数组中获取实际元素:

{% assign section = site.footer_sections | where: "title", "Address" %}
{{ section.first.content | markdownify }}

{% assign section = site.footer_sections | where: "title", "Address" %}
{{ section[0].content | markdownify }}

链接:

阵列文档

第一个文档

其中文档

最新更新