使用 Liquid 自定义标签输出多个 span 元素

Using Liquid custom tags to output multiple `span` elements`

我正在使用 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

我能得到一些帮助来解决这个问题吗?我觉得我非常接近...这只是我明显搞砸了的实际页面呈现。

替换

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

在 Ruby 中,您的函数将 return 它执行的最后一个表达式。对你来说,这就是 symbol.each do … end.

each returns various things, but what it does not do by itself is return the contents of its block. For that, you want map:

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