Получить хэш в шаблоне Jekyll Liquid из плагина для использования в цикле FOR?

Этот поставил меня в тупик...

Я хотел бы поделиться хешем YAML из одного файла с несколькими другими страницами Jekyll.

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

Я хотел бы перебрать хеш с помощью Liquid на своих страницах, но я не могу получить хэш от плагина к Liquid. {% capture %} работает только со строками, а {% assign %} не позволяет вам вызывать тег внутри себя, например {% assign projects = gethash %}, где gethash — это пользовательский тег Liquid.

По сути, я хотел бы использовать отдельный файл YAML, например текстовую базу данных.

В файле YAML есть это:

projects:

  category1:
     -
       title: Project 1
       desc: Description
       etc...
     -
       title: Project 2
       etc...

    category2:
     -
       title: Project 3
       desc: Description
       etc...
     -
       title: Project 4
       etc...

Плагин вызывает (который дает Ruby Hash YAML):

def...
  YAML::load(File.read('projects.yml'))
end...

И в шаблоне я хочу:

{% for p in projects %}
  ...

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

Как вы можете получить хэш в Liquid из плагина для использования в цикле {% for %}?


person J W    schedule 27.08.2013    source источник


Ответы (2)


Вот решение, которое я придумал:

Плагин Jekyll, создающий тег Liquid: yaml_to_liquid. Этот плагин преобразует файл yaml в хэш, а затем добавляет его в переменную Jekyll page.

module Jekyll

  class YamlToLiquid < Liquid::Tag
    def initialize(tag_name, arg, tokens)
      super

      if arg.length == 0
        raise 'Please enter a yaml file path'
      else
        @yml_path = arg
      end
    end

    def render(context)

      yml = YAML::load(File.read(@yml_path))
      context.registers[:page]['yml'] = yml
    end
  end
end

Liquid::Template.register_tag('yaml_to_liquid', Jekyll::YamlToLiquid)

Чтобы использовать его. Поместите тег вверху страницы .html или .md сразу под Основной вопрос Yaml, а затем получите доступ к переменной yml, как обычно. Этот цикл будет выводить только хэш code (позволяет получить доступ ко всему хэшу или только к подхэшам):

---
layout: page
---
{% yaml_to_liquid work/_projects.yml %}

<ul>
  {% for n in page.yml.projects.code %}
    <li>
    <a href="{{ n.url }}">{{ n.title }}</a>
    </li>
  {% endfor %}
</ul>

Пример work/_projects.yml:

projects:

  code:
    - title:
      url:

    - title:
      url:

  websites:
    - title:
      url:

    - title:
      url:
person J W    schedule 31.10.2013

Ну, а если вам не нужно, чтобы это был плагин, его можно поместить в свой _config.yml. Для плагина вам может понадобиться добавить хэш к переменной site.

Думаю генератора будет достаточно. Существует страница о плагинах, на которую стоит обратить внимание.

Вот что я бы использовал (сейчас я не могу проверить, так что это может быть неправильно!):

module Jekyll
  class ProjectsGenerator < Generator
    safe true

    def generate(site)
      # This probably won't work.
      site.projects = YAML::load(File.read('projects.yml'))
    end
  end
end

В любом случае, я действительно думаю, что если вам не нужна дополнительная сложность (наличие отдельного файла, создание нового плагина специально для вас и т. д.), просто поместите данные в _config.yml. Простота это хорошо.

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

person agarie    schedule 27.08.2013
comment
Спасибо @agarie. Как добавить переменную site в плагин и получить к ней доступ в шаблоне? Я сделал плагин (pastebin.com/x1ahiwhj), который загружает YAML и обрабатывает шаблон. Это не идеально, и добавление к сайту было бы лучше. - person J W; 28.08.2013
comment
Привет @agarie, спасибо за обновление. Я внес свой вклад в Jekyll и прочитал страницу плагинов, а также создал несколько. Поэтому мне просто нужно целенаправленное решение для добавления к сайту var. Я не хочу помещать данные в _config.yml, так как там будет несколько хэшей разных данных и мне лучше иметь их в своих соответствующих файлах, это совсем не сложно, однако, добавление на сайт ( или страница) из плагина кажется... - person J W; 31.08.2013