Как мне использовать отрывок из серого вещества Eleventy?

Цель: отображать отрывок сообщения для каждого сообщения в списке сообщений блога Eleventy.

Я адаптирую этот стартовый проект как свой собственный блог. Я обращаюсь к этому документу Eleventy, чтобы получить отрывок из сообщения.

Мой код:

Я начал с редактирования моего .eleventy.js, чтобы включить выдержку из серого вещества, в соответствии с приведенным выше документом, например:

module.exports = function(eleventyConfig) {
  eleventyConfig.addPlugin(pluginRss);
  eleventyConfig.addPlugin(pluginSyntaxHighlight);
  eleventyConfig.addPlugin(pluginNavigation);

  eleventyConfig.setDataDeepMerge(true);
  eleventyConfig.setFrontMatterParsingOptions({ excerpt: true
                                              });
  /* file continues below */

Затем я добавил "---" после первого абзаца в некоторых сообщениях в блогах для примера.

Наконец, я обновил /_includes/postslist.njk, чтобы включить ссылку на отрывок для каждого сообщения, поэтому теперь мой новый файл гласит:

<ol reversed class="postlist" style="counter-reset: start-from {{ (postslistCounter or postslist.length) + 1 }}">
{% for post in postslist | reverse %}
  <li class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
    <a href="{{ post.url | url }}" class="postlist-link">{% if post.data.title %}{{ post.data.title }}{% else %}<code>{{ post.url }}</code>{% endif %}</a>
    <time class="postlist-date" datetime="{{ post.date | htmlDateString }}">{{ post.date | htmlDateString }}</time>
    {% for tag in post.data.tags %}
      {%- if collections.tagList.indexOf(tag) != -1 -%}
      {% set tagUrl %}/tags/{{ tag }}/{% endset %}
      <a href="{{ tagUrl | url }}" class="tag">{{ tag }}</a>
      {%- endif -%}
    {% endfor %}
    {%- if post.excerpt -%}
        <p>{{ post.excerpt }}</p>
    {%- endif -%}
  </li>
{% endfor %}
</ol>

но отрывки не появляются.

Что я пробовал

I've checked for empty paragraph tags in the output HTML, and they are not there, so the ifcondition itself is failing.

I've tried setting the excerpt separator to something other than the default "---", with the same result.

Importantly, I've tried disabling excerpts in the .eleventy.js, which causes the separator to be read as regular markdown. This is important because it shows that gray-matter is correctly reading my separators in the blog posts as separators, and therefore the problem must be in my/_includes/postslist.njk.

Conclusion

How do I reference the excerpt that Eleventy generates from gray-matter?

(P. S.: I don't have enough reputation to create a Stackru tag for the gray-matter npm package, but imho it wouldn't be a bad idea if somebody wanted to do that. I've tagged it with yaml-front-matter, which isn't wholly inaccurate, but as I understand it my issue is pretty specific to the gray-matter dialect of yaml front matter.)

1 ответ

Решение

Согласно документации, eleventy делает отрывок доступным под pageпеременную (см. данные, предоставленные Eleventy), а не как свойство "верхнего уровня" элемента коллекции. Вpage переменная является частью dataобъект коллекции. Если вы используетеpost.data.page.excerpt вместо того post.excerpt он будет работать как положено:

{%- if post.data.page.excerpt -%}
    <p>{{ post.data.page.excerpt }}</p>
{%- endif -%}

В качестве альтернативы вы можете использовать опцию excerpt_alias, чтобы сделать отрывок доступным как свойство верхнего уровня. В этой конфигурации ваш шаблон будет работать как есть:

eleventyConfig.setFrontMatterParsingOptions({
    excerpt: true,
    excerpt_alias: 'excerpt',
});
Другие вопросы по тегам