Как отсортировать хеш, преобразованный в массив в Liquid - PullRequest
11 голосов
/ 17 июня 2011

Насколько я понимаю, Liquid конвертирует Ruby Hashes в массивы для использования в тегах.Например, при использовании Jekyll:

{% for category in site.categories %}
    <li>{{ category[0] }}</li>
{% endfor %}

... преобразует site.categories в массив кортежей, в которых [0] ссылается на ключ, [1] список значений.

Если бы я хотел, чтобы вышеуказанная карта категорий сортировалась в алфавитном порядке по ключу ([0] каждого кортежа), как я могу это сделать?

Ответы [ 8 ]

9 голосов
/ 25 ноября 2011

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

{% capture get_items %}
 {% for cat in site.categories %}
   {{ cat | first }}
 {% endfor %}
{% endcapture %}
{% capture num_words %}
 {{ get_items | split:' ' |  sort | join:' ' | number_of_words }}
{% endcapture %}
{% for item in (1..num_words) %}
 <li>{{ get_items | split:' ' |  sort | join:' ' | truncatewords:item | remove:'.    ..' |    split:' ' | last }}</li>
{% endfor %}
7 голосов
/ 18 августа 2012

Вы также можете использовать массивы вместо хэшей!

Вместо использования этого yaml:

categories:
  a_category: category description
  another_category: another category description

Вы можете использовать это:

categories:
  - {name: 'a category', description: 'category description'}
  - {name: 'another category', description: 'another category description'}

И затемВы можете повторить, как это, и порядок будет сохранен:)

{% for category in site.categories %}
  <li>{{ category['name'] }}</li>
{% endfor %}
4 голосов
/ 14 августа 2013

Индекс сообщений по алфавитно отсортированным тегам (пробелы в именах тегов не допускаются):

{% capture tags %}
  {% for tag in site.tags %}
    {{ tag[0] }}
  {% endfor %}
{% endcapture %}
{% assign sortedtags = tags | split:' ' | sort %}

{% for tag in sortedtags %}
  <h4>#{{ tag }}</h4>
  <ul>
  {% for post in site.tags[tag] %}
    <li>
      <span>{{ post.date | date_to_string }}</span>
      <a href="{{ post.url }}">{{ post.title }}</a>
    </li>
  {% endfor %}
  </ul>
{% endfor %}
2 голосов
/ 27 октября 2014

Вы можете сортировать по ключу, используя следующий метод (который совместим с Github Pages):

{% assign sorted_categories = (site.categories | sort:0) %}
{% for category in sorted_categories %}
   <!-- Using the 'capitalize' filter in Liquid Tags - you can leave this out -->
   <li>{{category[0] | capitalize }}</li>

   {% assign sorted_catposts = (category[1] | sort: 'title', 'last') %}
   {% for catpost in sorted_catposts %}
     <!-- The posts within each category are now alphabetically sorted by title -->
     <!-- Do stuff with each post in each category -->
   {% endfor %}
{% endfor %}

Надеюсь, это поможет.

1 голос
/ 25 октября 2014

Вы можете избавить себя от некоторых проблем и расширить Liquid:

например

# https://gist.github.com/dnozay/026862f5d65dcb8b4353

module Jekyll
  module Toolbox
    def keys(hash)
      hash.keys
    end
    def to_ul(collection)
      result = ''
      collection.each do |item|
        result << "<li>#{item}</li>"
      end
      result
    end
  end
end

Liquid::Template.register_filter(Jekyll::Toolbox)

Использование:

{{ myhash | keys | to_ul }}

Примеры:

# https://gist.github.com/dnozay/026862f5d65dcb8b4353

@context = { 'myhash' => { 'b' => 'B', 'a' => 'A', 'c' => 'C' } }
@template = Liquid::Template.parse("{{ myhash | keys | to_ul }}")
@template.render(@context)  # => "<li>b</li><li>a</li><li>c</li>"
@template = Liquid::Template.parse("{{ myhash | keys | sort | to_ul }}")
@template.render(@context)  # => "<li>a</li><li>b</li><li>c</li>"

Если вам повезет, вы можете посмотреть на github файл for.rb и расширить синтаксис for для лучшей обработки хэшей:).

1 голос
/ 05 июля 2013

Я также хочу принять участие в этом запутанном конкурсе (парни, number_of_words, серьезно?).

Этот код создает список тегов по тегам, ища следующий тег в лексикографическом порядке всписок на каждом этапе.Это в O ( n ²), где n - количество тегов.

<section>
  <h1>Pick a tag!</h1>
  <ul id="recent_posts">
    {% assign current_tag = ' ' %}
    {% for t in site.categories %}
      <li class="post">
        {% assign next_tag = 'ZZZ' %}
        {% for item in site.categories %}
          {% assign tag = item.first %}
          {% if tag > current_tag and tag < next_tag %}
            {% assign next_tag = tag %}
          {% endif %}
        {% endfor %}
        {{ next_tag | category_link }} {{ site.categories[next_tag].size }}
        {% assign current_tag = next_tag %}
      </li>
    {% endfor %}
  </ul>
</section>

Кстати, жидкие комментарии выглядят нелепо тяжелыми.

0 голосов
/ 19 июля 2012

Вот как я исправил проблему с Nikos:

{% capture get_items %}
   {% for cat in site.categories %}
    {{ cat | first | replace: ' ', '_' }}
   {% endfor %}
{% endcapture %}
{% capture num_words %}
  {{ get_items | split:' ' |  sort | join:' ' | number_of_words }}
{% endcapture %}
{% for item in (1..num_words) %}
  <li>{{ get_items | split:' ' |  sort | join:' ' | truncatewords:item | remove:'...' | split:' '  | last | replace: '_', ' ' }}</li>
{% endfor %}

Теперь, как заставить это работать с HAML ...

0 голосов
/ 19 июня 2011

Ни реализация Liquid по умолчанию, ни дополнения, сделанные Jekyll, не позволяют получить то, что вы хотите.

Боюсь, то, что вы хотите, просто невозможно с текущей настройкой.Вам нужно было бы обезопасить Jekyll или Liquid, чтобы хэши возвращали свои ключи в отсортированном порядке.

...