5

这个让我傻眼了...

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

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

我想在我的页面中循环使用 Liquid 的散列,但我似乎无法将散列从插件获取到 Liquid。{% capture %}仅适用于字符串,{% assign %}不会让您在其内部调用标签,例如自定义 Liquid 标签{% assign projects = gethash %}在哪里。gethash

基本上,我想使用单独的 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 哈希):

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

在模板中,我想:

{% for p in projects %}
  ...

这应该很简单,但它是一种痛苦的液体。

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

4

2 回答 2

5

这是我想出的解决方案:

一个创建 Liquid 标签的Jekyll 插件yaml_to_liquid: . 该插件将 yaml 文件解析为哈希,然后将其添加到 Jekyllpage变量中。

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顶部,然后像往常一样访问该变量。此循环只会输出哈希(允许您访问整个哈希或子哈希):.mdymlcode

---
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:
于 2013-10-31T18:28:23.230 回答
0

好吧,如果你不需要它作为插件,它可以放在你的_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. 简单是好的。

希望有帮助。:)

于 2013-08-27T21:45:19.540 回答