【问题标题】:Get a hash into a Jekyll Liquid template from a Plugin for use in the FOR loop?从插件中获取 Jekyll Liquid 模板的哈希值以在 FOR 循环中使用?
【发布时间】:2013-08-29 15:09:33
【问题描述】:

这个让我难过...

我想在其他几个 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 哈希):

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

在模板中,我想:

{% for p in projects %}
  ...

这应该很简单,但它是一种令人痛苦的 Liquid 事物。

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

【问题讨论】:

    标签: ruby yaml jekyll liquid


    【解决方案1】:

    好吧,如果您不需要它成为插件,可以将其放入您的_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。简单是好的。

    希望对您有所帮助。 :)

    【讨论】:

    • 谢谢@agarie。如何在插件中附加到site var 并在模板中访问它?我制作了一个插件 (pastebin.com/x1ahiwhj) 加载 YAML 并处理模板。这并不理想,附加到站点会更好。
    • 嗨@agarie,感谢您的更新。我为 Jekyll 做出了贡献,并阅读了插件页面并创建了一些。所以我只需要一个有针对性的解决方案来附加到站点变量。我不想将数据放在 _config.yml 中,因为会有一些不同数据的哈希值,我最好将它们放在各自的文件中,这并不复杂,但是,附加到站点(或页面)来自插件似乎是......
    【解决方案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 Front Matter 下方,然后照常访问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:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多