Get Jekyll Configuration Inside Plugin

喜你入骨 提交于 2020-01-22 17:15:07

问题


I'd like to make changes to the Jekyll Only First Paragraph plugin to make the generation of a 'read more ' link a configurable option.

To do this I'd need to be able to access the Jekyll site config inside the plugin's AssetFilter. With the configuration available I can make the change. I don't know how to make the site configuration available to the plugin.

The code below demonstrates where I'd like site.config available:

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)


Can this be achieved?


回答1:


Overview

You can access Jekyll config options in plugins with:

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

If the config key contains nested levels, the format is:

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

Example

If a _config.yml contains:

testvar: new value

custom_root:
    second_level: sub level data

A basic example that simply outputs those values would look like:

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)

Of course, you would want to put checks in that verify that the config key/values are defined before trying to use them. That's left as an exercise for the reader.


Another Possible Option

The "Liquid filters" section of the Jekyll Plugins Wiki Page contains the following:

In Jekyll you can access the site object through registers. As an example, you can access the global configuration (_config.yml) like this: @context.registers[:site].config['cdn'].

I haven't spent the time to get that to work, but it might be worth checking out as well.




回答2:


Jekyll.configuration({})['KEY_NAME'] will break the --config command line option because it will always load the configurations from the _config.yml file. Another bad side effect is that it will read the _config.yml file again.

context.registers[:site].config['KEY_NAME'] is the correct answer because it will get the key from the configurations already loaded by Jekyll.




回答3:


If you are working with Generators (which are also plugins), it is possible to get the configuration like this:

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

You'll get the site as an argument, and the .config is accessible as an hash.



来源:https://stackoverflow.com/questions/11410611/get-jekyll-configuration-inside-plugin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!