从插件中获取一个Jekyll Liquid模板的哈希值,以便在FOR循环中使用?

时间:2013-08-27 02:03:16

标签: ruby yaml jekyll liquid

这个让我难过......

我想从其他几个Jekyll页面中的单个文件中共享一个YAML哈希。

我知道你可以把它放在Front Matter中(这需要复制它),我知道你可以通过一个插件生成(写)页面(但我在几个不同类型的页面中使用它,会很复杂)。这也不是我要找的。

我想在我的页面中使用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...

插件正在调用(它提供了YAML的Ruby Hash):

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

在模板中,我想:

{% for p in projects %}
  ...

这应该非常简单,但它是那些令人痛苦的液体之物。

如何从插件中获取Liquid的哈希值,以便在{% for %}循环中使用?

2 个答案:

答案 0 :(得分:5)

这是我提出的解决方案:

Jekyll Plugin ,它创建了一个液体标记: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)

使用它。将标记放在 Yaml Front Matter 正下方的.html.md页面的顶部,然后照常访问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:

答案 1 :(得分:0)

好吧,如果你不需要它作为插件,它可以放在你的_config.yml中。对于插件,您可能需要将哈希附加到site变量。

我认为发电机就足够了。你需要看一下a page about plugins

这是我使用的(我现在无法测试,所以它可能是错的!):

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中。简单就是好。

希望有所帮助。 :)