Получить встроенный модуль Jekyll Configuration

Я хотел бы внести изменения в Jekyll плагин только первого абзаца, чтобы генерировать ссылку "читать дальше", настраиваемый вариант.

Для этого мне нужно будет иметь доступ к конфигурации сайта Jekyll внутри плагина AssetFilter. Имея доступную конфигурацию, я могу внести изменения. Я не знаю, как сделать конфигурацию сайта доступной для плагина.

В приведенном ниже коде показано, где я хотел бы 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)


Можно ли это достичь?

Ответы

Ответ 1

Обзор

Вы можете получить доступ к настройкам конфигурации 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)

Конечно, вы хотели бы поместить проверки, которые проверяют, что ключ/значения конфигурации определены, прежде чем пытаться их использовать. Это оставило для читателя упражнение.


Другой возможный вариант

Раздел "Жидкостные фильтры" страницы Wiki Wiki содержит следующее:

В Jekyll вы можете получить доступ к объекту сайта через регистры. В качестве примера вы можете получить глобальную конфигурацию (_config.yml) следующим образом: @context.registers [: site].config ['cdn'].

Я не потратил время, чтобы заставить это работать, но, возможно, стоит проверить также.

Ответ 2

Jekyll.configuration({})['KEY_NAME'] разбивает параметр командной строки --config, поскольку он всегда загружает конфигурации из файла _config.yml. Другой плохой побочный эффект заключается в том, что он снова прочитает файл _config.yml.

context.registers[:site].config['KEY_NAME'] - правильный ответ, потому что он получит ключ от конфигураций, уже загруженных Jekyll.

Ответ 3

Если вы работаете с генераторами (которые также являются плагинами), можно получить конфигурацию следующим образом:

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

Вы получите сайт как аргумент, а .config будет доступен как хэш.