Использование жидкости для сортировки постов в алфавитном порядке
Есть ли способ отсортировать несколько сообщений по алфавиту, используя Jekyll?
У меня теперь есть что-то вроде этого:
{% for post in site.categories.threat %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
Это работает, но сообщения смешаны. Было бы намного лучше, если бы они были отсортированы по алфавиту, я думаю.
Спасибо
Ответы
Ответ 1
Он может выполняться без плагина, что означает, что он работает с Github Pages.
Однако вы должны использовать некоторые уродливые трюки для манипуляции строкой.
Я использовал аналогичный подход для реализации страницы тега (который перечисляет все сообщения для каждого тега).
Тот же подход, слегка измененный:
{% capture posts %}
{% for post in site.posts %}
|{{ post.title }}#{{ post.url }}
{% endfor %}
{% endcapture %}
{% assign sortedposts = posts | split: '|' | sort %}
{% for post in sortedposts %}
{% assign postitems = post | split: '#' %}
<a href={{ postitems[1] }}">{{ postitems[0] }}</a><br>
{% endfor %}
Внимание:
В первом цикле вам нужны два разных разделительных символа (и, конечно же, снова в вызовах split
).
Чтобы это работало, оба символа не должны встречаться ни в одном из заголовков сообщений или URL-адресов!
Я использую |
и #
в этом примере, который работает для меня (я только что протестировал его в своем блоге). Но вам, возможно, придется использовать разные символы, в зависимости от ваших заголовков и способов создания ваших URL.
Бонус:
Если вы хотите отображать только сообщения в определенном теге/категории (а не во всех сообщениях), вы можете изменить первый цикл for
(один внутри capture
) на один из следующих:
{% for post in site.tags['whatever'] %}
{% for post in site.categories['whatever'] %}
Ответ 2
В соответствии с документацией для фильтрации массива одним из его полей вы можете использовать:
{% assign sortedPosts = site.posts | sort: 'title' %}
Затем переменная sortedPosts
будет содержать отсортированный массив.
Документацию можно найти здесь: https://docs.shopify.com/themes/liquid/filters/array-filters#sort
Ответ 3
Я адаптировал плагин Jekyll из https://gist.github.com/3812259, чтобы выполнить это. Я не мог использовать плагин as-is, потому что он не удался при наличии нулевых значений. Я начинаю ruby-программист и закодировал нулевую обработку с помощью fooobar.com/questions/172085/...
sort_for, например, реверсирование сортировки и выполнение строковых сопоставлений с учетом регистра (игнорируется, если сортированное свойство не является строкой):
{% sorted_for node in site.pages reversed sort_by:title case_sensitive:true %}
{{ node.title }}
{% endsorted_for %}
sorted_keys_for например:
{% sorted_keys_for tag in site.tags %}
<a href="/tags/{{ tag | downcase | replace:" ","-"}}.html">{{ tag }}</a><br />
Num posts: {{ site.tags[tag].size }}
{% endsorted_keys_for %}
Для использования в Jekyll, введите этот код в _plugins/sort_for.rb
module Jekyll
module SortedForImpl
def render(context)
sorted_collection = collection_to_sort context
return if sorted_collection.empty?
sort_attr = @attributes['sort_by']
case_sensitive = @attributes['case_sensitive'] == 'true'
i = sorted_collection.first
if sort_attr != nil
if i.to_liquid[sort_attr].instance_of? String and not case_sensitive
sorted_collection.sort_by! { |i|
k = i.to_liquid[sort_attr]
k ? k.downcase : ''
}
else
sorted_collection.sort_by! { |i|
k = i.to_liquid[sort_attr]
[k ? 1 : 0,k || 1]
}
end
else
if i.instance_of? String and not case_sensitive
sorted_collection.sort_by! { |i| i.downcase }
else
sorted_collection.sort!
end
end
original_name = @collection_name
result = nil
context.stack do
sorted_collection_name = "#{@collection_name}_sorted".sub('.', '_')
context[sorted_collection_name] = sorted_collection
@collection_name = sorted_collection_name
result = super
@collection_name = original_name
end
result
end
end
class SortedForTag < Liquid::For
include SortedForImpl
def collection_to_sort(context)
return context[@collection_name].dup
end
def end_tag
'endsorted_for'
end
end
class SortedKeysForTag < Liquid::For
include SortedForImpl
def collection_to_sort(context)
return context[@collection_name].keys
end
def end_tag
'endsorted_keys_for'
end
end
end
Liquid::Template.register_tag('sorted_for', Jekyll::SortedForTag)
Liquid::Template.register_tag('sorted_keys_for', Jekyll::SortedKeysForTag)
Ответ 4
Он и чистый, и элегантный, чтобы сортировать в Jekyll на страницах GitHub без плагина. Используйте файл данных .yml в каталоге _data. Я использую файл данных, который называется team-members.yml
:
{% assign sorted_team = site.data.team-members | sort:'title' %}
{% for member in sorted_team %}
<span class="title">{{ member.title }}</span>
{% endfor %}
Этот шаблон обычно должен заботиться о том, что вам нужно делать здесь.
Ответ 5
Я хотел бы добавить следующее для справок в будущем.
Чтобы отсортировать записи по названию, вы можете использовать фильтр sort
.
См. http://jekyllrb.com/docs/templates/#filters
Итак, это работает:
{% assign sorted_threat_posts = site.categories.threat | sort: 'title', 'last' %}
{% for post in sorted_threat_posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
Ответ 6
Это невозможно сделать без плагина или пользовательской функции. Несмотря на то, что в следующих выпусках предпринимаются постоянные усилия по реализации этого решения: https://github.com/Shopify/liquid/pull/101, и тогда это будет выглядеть так:
{% for tag in site.tags order:ascending %}
...
{% endfor %}
Смотрите также: Заказать массив с шаблоном Jekyll/liquid
Ответ 7
i проверил христианское замечательное решение на моем локальном сайте: перед первой строкой на выходе есть пустая ссылка (я не знаю почему), поэтому первая ссылка не работает, поэтому я изменил его вставку кода {% if postitems[1] %}
перед строкой <a href={{ postitems[1] }}">{{ postitems[0] }}</a><br>
и a {% endif %}
после. предложил комментарий о танковом туалете.