В Jekyll Как мне получить первое изображение?
В моем индексе сообщений в блоге я хотел бы получить первое изображение из сообщения, чтобы отобразить его в индексе, используя только жидкость, поэтому он работает на страницах github.
У меня есть ощущение раскола, это путь, но мне плохо с жидкостью.
Я хотел бы получить URL-адрес изображения и поместить его в переменную, чтобы его стиль.
Идеальное решение будет примерно таким:
{% for post in site.posts %}
<li>
<a href="{{ post.url }}">{{post.content | first_image}}</a>
</li>
{% endfor %}
Любые идеи?
Ответы
Ответ 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

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
, если вам не нужен образ заполнителя.