在foreach成员上或通过where filter

时间:2017-04-05 15:04:36

标签: jekyll

我想知道是否有人可以阐明这个难题。我在Mac上使用新安装的vanilla jekyll。一切似乎都运行良好,但我发现在页面页脚中显示的某些文本在帖子和所有其他页面上的呈现方式不同。在大多数页面上,文本将呈现为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>

问题

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

我想也许它可能与帖子和页面之间的不同程序步骤有关,也许Markdown渲染正在发生&#34;之后&#34;在页面上但已经发生了#34;之前&#34;在帖子中。我在杰基尔身上只有两天,所以我真的不知道它是如何运作的。

为了测试该理论,我尝试使用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呈现的内容而不是循环遍历它们?

感谢您的任何见解!

1 个答案:

答案 0 :(得分:2)

site.footer_sections是array,'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 }}

OR

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

<强>链接:

array documentation

first documentation

where documentation