Как отобразить данные из файла данных Jekyll на основе текущей переменной страницы - PullRequest
0 голосов
/ 17 апреля 2019

Проблема

У меня есть div на моем сайте Jekyll, где я хотел бы отображать данные, сгенерированные из _data/book-data.yml, например:

- name: johnson-everything-under
  title: Everything Under
  author: Daisy Johnson
  publisher: Faber & Faber
  pub-date: 12/12/2012

- name: johnson-train-dreams
  title: Train Dreams
  author: Denis Johsnon
  publisher: Granta
  pub-date: 01/01/2001

Я пытаюсь найти способ отобразить данные, которые соответствуют соответствующей странице (каждая запись книги имеет свою страницу), и я подумал, что это возможно, если клавиша name соответствует page.url или некоторая другая переменная страницы.

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

На рабочей странице у меня есть include, который содержит следующий HTML:

<div class="book-meta">
  {% if page.category == "reviews"%}
  <div class="book-thumbnail">
    <img class="post-thumbnail-lg" src="{{ site.baseurl }}/assets/images/{{ page.thumbnail }}" alt="{{ page.thumbnail }}">
  </div>
  {% for book in site.data.book-data %}
  <div class="book-details">
    <ul class="book-meta-list">
      <li class="book-meta-item"><p><a href="#">{{ book.author }}</a></p></li>
      <li class="book-meta-item"><p><em>{{ book.title }}</em></p></li>
      <li class="book-meta-item"><p>{{ book.publisher }}</p></li>
      <li class="book-meta-item"><p>{{ book.pub-date }}</p></li>
    </ul>
  </div>
  {% endfor %}
  {% endif %}
</div>

CSS не важен, но так как он в настоящее время выводит приведенный выше HTML:

Screenshot

Желаемый вывод

Как видите, выходные данные содержат оба блока метаданных из файла .yml. Я хотел бы найти способ, чтобы отображался только соответствующий блок данных (первый блок в данном случае):

Screenshot2

Потенциальное решение (я)

Я подумал, что может быть способ сопоставления page.variable с именем блока YAML, чтобы выводились только нужные данные книги. Что-то вроде:

{% assign url_substring = page.url | split, '/' | last %}
// url_substring = johnson-everything-under
{% for book in site.data.book-data %}
{% if url_substring == book.name %}
// = true
<p>{{ book.title }}<p>
{% endif %}
{% endfor %}

Кроме того факта, что я не могу заставить это работать должным образом, я также вижу, что жидкостный тег {{ book.title }} не может определить, какой заголовок книги вывести, даже если page.url соответствует.

Я не уверен, что нахожусь на правильном пути, поэтому, если у кого-то есть какие-либо другие предложения о том, как это может быть достигнуто, я хотел бы услышать это. Заранее спасибо.

1 Ответ

2 голосов
/ 17 апреля 2019

Вы можете использовать фильтр where от Jekyll в сочетании со смарт-включением:

{% assign book = site.data.book-data | where: 'title', include.title | first %}

<div class="book-meta">
  <div class="book-thumbnail">
    <img
      class="post-thumbnail-lg"
      src="{{ book.thumbnail | prepend: 'assets/images/' | relative_url }}"
      alt="{{ book.title }}"
    />
  </div>

  <div class="book-details">
    <ul class="book-meta-list">
      <li class="book-meta-item"><p><a href="#">{{ book.author }}</a></p></li>
      <li class="book-meta-item"><p><em>{{ book.title }}</em></p></li>
      <li class="book-meta-item"><p>{{ book.publisher }}</p></li>
      <li class="book-meta-item"><p>{{ book.pub-date }}</p></li>
    </ul>
  </div>
</div>

Обратите внимание, что я также включил thumbnail информацию в файл данных ..

Затем просто передайте параметр title в include (в макете страницы вашей книги):

{% include books.html title = 'Everything Under' %}

Если вы хотите отобразить «листинг», просто выполните цикл и выполните рендеринг:

{% for book in site.data.book-data %}
  {% include books.html title = book.title %}
{% endfor %}
...