Reputation: 17309
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?
Upvotes: 20
Views: 4651
Reputation: 7141
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.
Upvotes: 3
Reputation: 490
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.
Upvotes: 17
Reputation: 25475
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']
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.
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.
Upvotes: 24