передать несколько аргументов пользовательскому плагину в jekyll

Я работаю с jekyll над созданием веб-сайта.
И я создал собственный плагин таблицы содержания с помощью ruby.

вот код

require 'nokogiri'

module Jekyll

  module TOCGenerator
    TOC_CONTAINER_HTML = '<ul>%1</ul>'

    def toc(html,op)
      toc_top_tag = "h1"
      item_number = 0
      toc_html = ''
      sub_url = html['url']

      doc = Nokogiri::HTML(html['content'])
      doc.css(toc_top_tag).each do |tag|
        toc_html += create_level_html(sub_url, tag['id'], tag.text)
        item_number += 1
      end

      return '' unless item_number > 0

      if 0 < item_number
        toc_table = TOC_CONTAINER_HTML
        .gsub('%1', toc_html)
      end
    end

    private
    def create_level_html(url, anchor_id, tocText)
      link = '<a href="%1#%2">%3</a>'
      .gsub('%1', url)
      .gsub('%2', anchor_id.to_s)
      .gsub('%3', tocText)
      '<li>%1</li>'
      .gsub('%1', link)
    end
  end
end

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

и в каком-то документе

<div>
{{ page | toc }}
</div>

это работает так хорошо.

Чтобы улучшить его функцию, я хотел бы добавить некоторый аргумент для рендеринга toc. поэтому я добавил заголовок аргумента функции точно так же.

def toc(html,option)

но когда я вызываю функцию в шаблоне jekyll, возникает такая ошибка

  Liquid Exception: Liquid error (line 41): wrong number of arguments (given 1, expected 2) in /_layouts/default.html

Я пробовал {{ (three,1) | toc }}, {{ three, 1 | toc }}, {{ three | 1 | toc }} вызывать функцию с двумя аргументами, но результаты получались одинаковыми.

как мне вызвать функцию в jekyll с несколькими аргументами?

заранее спасибо.


person gnujoow    schedule 22.11.2016    source источник
comment
Знаете ли вы, что в kramdown есть функция TOC, которая может вам подойти? См. kramdown.gettalong.org/converter/html.html#toc.   -  person David Jacquel    schedule 22.11.2016
comment
@DavidJacquel Я уже знаю, что у kramdown есть функция toc. насколько я знаю, функция toc kramdown может использоваться только в одном и том же документе. Моей целью создания toc является рендеринг toc на другой странице, и поэтому я создал собственный генератор toc с ruby.   -  person gnujoow    schedule 23.11.2016


Ответы (1)


Этот ответ вряд ли будет иметь отношение к исходному плакату, но если кто-то пришел сюда из Google, как и я, вот как я его решил.

Код плагина:

module Jekyll
  module YourFilter
    def yourFilter( input, arg1, arg2 )
      # your code
    end
  end
end

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

Код тега в вашем контенте:

{{ 'Lorem ipsum' | yourFilter: 'argument 1', 'argument 2' }}

Главное, чтобы после названия фильтра в коде тега стояла точка с запятой. Кажется, это позволяет плагину анализировать несколько аргументов, а не только последний.

person Tom Slominski    schedule 03.04.2018
comment
Если вы пришли из Google, вы, скорее всего, сможете написать лучший вопрос для своего ответа. Пожалуйста, сделай так!! Вопросы с самостоятельными ответами могут быть весьма полезны для сообщества в целом. - person Luuklag; 03.04.2018