覆盖 Jekyll Block 插件中的上下文寄存器

Overriding a context register in a Jekyll Block plugin

我正试图在 Jekyll 中更好地控制我的 post 摘录。在我的情况下,使用默认摘录代码似乎效果不佳,因为它 (a) 需要成为第一段,并且 (b) 仍呈现在页面上。对于我的博客 post 的大部分内容,我想要自定义文本,这不是实际博客 post 的一部分,或者稍后在博客 post 中的一些文本。我希望用一个块来做到这一点,它可以选择采用一个参数来呈现内容(尽管我稍后会添加该特定功能)。我目前有这个概念验证插件:

require "jekyll"

module Jekyll
  class RenderExcerptBlock < Liquid::Block
    def render(context)
      page = context.registers[:page]
      content = super

      page["excerpt"] = content.lines[0..50]

      content
    end
  end
end

Liquid::Template.register_tag "excerpt", Jekyll::RenderExcerptBlock

理论上可以让我这样做:

{% excerpt %}
A snippet of this post
{% endexcerpt %}

然而,当 运行 jekyll build:

  Liquid Exception: Key excerpt cannot be set in the drop. in /Users/nick.chambers/blog/_posts/2020-01-21-unix-shell-scripting-with-bash.md
             ERROR: YOUR SITE COULD NOT BE BUILT:
                    ------------------------------------
                    Key excerpt cannot be set in the drop.

是否可以通过某种方式覆盖该寄存器的值?或者,是否有更多的 Jekyll 方法来实现此目的?

Jekyll 方法 为您的 post(或集合中的任何文档)自定义摘录,只需将其添加到前面:

---
title: Test Doc
excerpt: This is a custom excerpt
---

The opening paragraph of this document.

Another paragraph in this document.

然后在您的布局中引用它以呈现它:

<div class="post-excerpt">
  {{ page.excerpt }}
</div>

<div>
{% for post in site.posts %}
  <h2>{{ post.title }}</h2>
  <div>{{ post.excerpt }}</div>
{% endfor %}
</div>