Подтвердить что ты не робот

В Jekyll Как мне получить первое изображение?

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

У меня есть ощущение раскола, это путь, но мне плохо с жидкостью.

Я хотел бы получить URL-адрес изображения и поместить его в переменную, чтобы его стиль.

Идеальное решение будет примерно таким:

{% for post in site.posts %}
    <li>
      <a href="{{ post.url }}">{{post.content | first_image}}</a>
    </li>
  {% endfor %}

Любые идеи?

4b9b3361

Ответ 1

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

<ul>
  {% for post in site.posts %}
    <li>

      {% assign foundImage = 0 %}
      {% assign images = post.content | split:"<img " %}
      {% for image in images %}
        {% if image contains 'src' %}

            {% if foundImage == 0 %}
                {% assign html = image | split:"/>" | first %}
                <img {{ html }} />
                {% assign foundImage = 1 %}
            {% endif %}
        {% endif %}
      {% endfor %}

      <a href="{{ post.url }}">{{ post.title }}</a>
    </li>
  {% endfor %}
</ul>

Ответ 2

Некоторые решения вашей проблемы:

1 - Используйте тег Post Excerpt Документация здесь

Ваше сообщение:

---
layout: post
title: Testing images
---
## Title
Intro Text
![Image alt]({{ site.baseurl }}/assets/img/image.jpg "image title")
More intro text

Some more text blah !

Ваш шаблон:

<ul>
  {% for post in site.posts %}
    <li>
      <a href="{{ post.url }}">{{ post.title }}</a>
      {{ post.excerpt }}
    </li>
  {% endfor %}
</ul>

Как только ваш тег изображения появится перед excerpt_separator (\n\n = две строки новой строки), он будет в выдержке после.

2 - Используйте свой почтовый ямский фронт для хранения данных изображений

Сообщение:

---
layout: post
title: Testing images

images:

  - url: /assets/img/cypripedium-calceolum.jpg
    alt: Cypripedium Calceolum
    title: Cypripedium Calceolum

  - url: /assets/img/hello-bumblebee.jpg
    alt: Hello bumblebee !
    title: Hello bumblebee !
---

Intro here yo ! <-- THIS IS THE EXCERPT

Post body begin, and first image not in excerpt
{% assign image = page.images[0] %} <-- first element of the array is zero
{% include image.html image=image %}

Some more text blah !
{% assign image = page.images[1] %}
{% include image.html image=image %}

_includes/image.html (централизованный в include для стандартизации, но может быть в шаблоне):

<img src="{{ site.baseurl }}{{ include.image.url }}" alt="{{ include.image.alt }}" title="{{ include.image.title }}">

Страница индекса:

<ul class="posts">
  {% for post in site.posts %}
    <li>
      <span class="post-date">{{ post.date | date: "%b %-d, %Y" }}</span>
      <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
      {{ post.excerpt }}
      {% assign image = post.images[0] %}
      {% include image.html image=image %}
    </li>
  {% endfor %}
</ul>

Ответ 3

Вы можете определить настраиваемую переменную для своей Front Matter под названием "image", чтобы она работала, как сообщения Wordpress. Лучшее изображение:

---
image: featured-image.jpg
---

Примечание, чтобы запомнить, где сохранен ваш образ. В моем случае я создал каталог под названием "imagens" (PT-BR здесь). Затем перейдите в свой index.html и добавьте изображение в свой шаблон, где хотите. На моем сайте это выглядит так:

<ul class="post-list">
    {% for post in site.posts %}
      <li>
        <h2>
          <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
        </h2>
        <span class="post-meta">{{ post.date | date: "%b %-d, %Y" }},</span>
        <span class="post-meta">por</span>
        <span class="post-meta">{{ post.author }}</span>
      </li>

      //IMAGE
      <img src="{{ site.baseurl }}/imagens/{{ post.image }}">
      //IMAGE


      {{ post.excerpt }}
      <a class="btn btn-default" href="{{ post.url | prepend: site.baseurl }}">Continuar lendo</a>
    {% endfor %}
  </ul>

Что это.

Ответ 4

Я взял ответ Дэвида и нашел способ получить только атрибут src из тега img.

    {% assign foundImage = 0 %}
    {% assign images = post.content | split:"<img " %}
    {% for image in images %}
      {% if image contains 'src' %}

          {% if foundImage == 0 %}
              {% assign html = image | split:"/>" | first %}
              {% assign tags = html | split:" " %}
              {% for tag in tags %}
                {% if tag contains 'src' %}
                  <img {{ tag }} />
                {% endif %}
              {% endfor %}
              {% assign foundImage = 1 %}
          {% endif %}
      {% endif %}
    {% endfor %}

Ответ 5

Если вам нужен URL-адрес изображения вместо всего, что находится в теге img, вы можете использовать следующий метод.

Установить жидкостный фильтр match_regex:

gem install match_regex

Затем добавьте его в конфигурацию Jekyll:

plugins:
  - match_regex

Создайте фрагмент захвата в шаблоне:

{% capture post_first_image %}
  {% assign hero_image = page.content | match_regex: '<img .*?src="([^"]+)"' %}
  {% if hero_image == nil %}
    {% assign hero_image = "/placeholder-image.png" | prepend: site_base %}
  {% endif %}
  {{ hero_image }}
{% endcapture %}

Шаблон:

<meta property="og:image" content="{{ post_first_image | strip }}">

Вы можете просто удалить условие if, если вам не нужен образ заполнителя.