Использование пользовательских тегов Liquid для вывода нескольких элементов `span` - PullRequest
1 голос
/ 20 марта 2020

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

Я начал со следующего:

{% symbol R %}

И соответствующий код плагина:

module Jekyll
  class Symbol < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
      @text = text
    end 

    def render(context)
      "<span class='symbol-#{@text}'>#{@text}</span>"
    end
  end
end

Liquid::Template.register_tag('symbol', Jekyll::Symbol)

И вывод на моей странице, как и ожидалось, следующий:

<span class="symbol-R">R</span>

Теперь я пытаюсь изменить этот плагин, чтобы я мог передать список через запятую, например:

{% symbol R,G %}

Я обновил свой код плагина следующим образом:

module Jekyll
  class Symbol < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
      @text = text
    end 

    def render(context)
      symbol = @text.split(',').map(&:strip)

      symbol.each do |item|
        puts item # to test in terminal
        "<span class='symbol-#{@text}'>#{@text}</span>"
      end
    end
  end
end

Liquid::Template.register_tag('symbol', Jekyll::Symbol)

Терминал выводит правильно:

R
G

И я ожидал, что я получу на своей странице следующее:

<span class="symbol-R">R</span><span class="symbol-G">G</span>

Но все это появляется на странице:

RG

Могу ли я получить помощь в выяснении этого? Я чувствую, что я очень близок ... это просто фактический рендеринг страницы, с которым я явно ошибаюсь.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

В Ruby ваша функция вернет последнее выражение, которое она выполнила. Для вас это symbol.each do … end.

each возвращает различные вещи, но что он не делает сам по себе, так это возвращает содержимое своего блока. Для этого вы хотите map:

symbol.map do |item|
  puts item # to test in terminal
  "<span class='symbol-#{@text}'>#{@text}</span>"
end
0 голосов
/ 20 марта 2020

Заменить

symbol.each do |item|
  puts item # to test in terminal
  "<span class='symbol-#{@text}'>#{@text}</span>"
end

на

output = ""
symbol.each do |item|
  output =+ "<span class='symbol-#{item}'>#{item}</span>"
end

output
...