【问题标题】:Get Jekyll Configuration Inside Plugin在插件中获取 Jekyll 配置
【发布时间】:2012-07-09 18:28:44
【问题描述】:

我想对 Jekyll Only First Paragraph plugin 进行更改,以使生成“阅读更多”链接成为可配置选项。

为此,我需要能够访问插件AssetFilter 中的 Jekyll 站点配置。有了可用的配置,我可以进行更改。我不知道如何使站点配置对插件可用。

下面的代码演示了我希望site.config 可用的位置:

require 'nokogiri'

module Jekyll
  module AssetFilter
    def only_first_p(post)
      # site.config needs to be available here to modify the output based on the configuration

      output = "<p>"
      output << Nokogiri::HTML(post["content"]).at_css("p").inner_html
      output << %{</p><a class="readmore" href="#{post["url"]}">Read more</a>}

      output
    end
  end
end

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


这可以实现吗?

【问题讨论】:

  • 我可以建议将此问题的标题更改为“Get Jekyll Configuration Inside Plugin”或其中包含“Plugin”一词的内容。更通用的术语应该可以帮助其他人更容易找到它。
  • 标题改了,好建议

标签: ruby jekyll liquid


【解决方案1】:

如果您正在使用生成器(也是插件),则可以获得如下配置:

class MyPlugin < Jekyll::Generator
  def generate(site)
    puts site.config["max_posts"] # max_posts as defined in _config.yml

您将获取站点作为参数,并且 .config 可作为哈希访问。

【讨论】:

    【解决方案2】:

    Jekyll.configuration({})['KEY_NAME'] 将破坏--config 命令行选项,因为它总是会从 _config.yml 文件加载配置。另一个不好的副作用是它会再次读取 _config.yml 文件。

    context.registers[:site].config['KEY_NAME'] 是正确答案,因为它会从 Jekyll 已经加载的配置中获取密钥。

    【讨论】:

    • 不确定--config 问题,但后一种解决方案对我来说似乎更整洁。感谢您的提醒!
    • 什么是“上下文”?
    【解决方案3】:

    概述

    您可以通过以下方式访问插件中的 Jekyll 配置选项:

    Jekyll.configuration({})['KEY_NAME']
    

    如果配置键包含嵌套级别,格式为:

    Jekyll.configuration({})['KEY_LEVEL_1']['KEY_LEVEL_2']
    

    示例

    如果 _config.yml 包含:

    testvar: new value
    
    custom_root:
        second_level: sub level data
    

    简单输出这些值的基本示例如下所示:

    require 'nokogiri'
    
    module Jekyll
      module AssetFilter
        def only_first_p(post)
    
          @c_value = Jekyll.configuration({})['testvar']
          @c_value_nested = Jekyll.configuration({})['custom_root']['second_level']
    
          output = "<p>"
    
          ### Confirm you got the config values
          output << "<br />"
          output << "c_value: " + @c_value + "<br />"
          output << "c_value_nested: " + @c_value_nested + "<br />"
          output << "<br />"
          ###
    
          output << Nokogiri::HTML(post["content"]).at_css("p").inner_html
          output << %{</p><a class="readmore" href="#{post["url"]}">Read more</a>}
    
          output
        end
      end
    end
    
    Liquid::Template.register_filter(Jekyll::AssetFilter)
    

    当然,您可能希望在尝试使用配置键/值之前进行检查,以验证是否已定义配置键/值。这留给读者作为练习。


    另一个可能的选择

    Jekyll Plugins Wiki Page 的“液体过滤器”部分包含以下内容:

    在 Jekyll 中,您可以通过寄存器访问站点对象。例如,您可以像这样访问全局配置 (_config.yml):@context.registers[:site].config['cdn']。

    我还没有花时间让它工作,但它可能也值得一试。

    【讨论】:

    • 不客气。此外,你的时机非常好。我正在构建我的第一个插件,并且遇到了访问配置选项的相同需求。上周我花了几个小时弄清楚。分享解决方案让花费的时间更加值得。
    • Jekyll.configuration({}) 解决方案的一个问题可能是每次调用都会执行整个“从 YAML 文件加载配置”过程。这为我使用 Jekyll 1.0-rc1 生成了大量日志输出,所以我选择了“上下文”解决方案。
    • context.registers[:site].config['cdn'] 非常适合我!
    • 我打算编辑那个答案以将“可能值得”更改为“绝对值得”:) 同时,请注意 @context.registers[:site] 返回与整个站点对应的对象,因此您可以还可以访问网站上的帖子数量 - @context.registers[:site].posts.count。享受吧!
    • “液体过滤器”部分的链接已更新:github.com/jekyll/jekyll/blob/master/docs/_docs/… 或:jekyllrb.com/docs/plugins
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多