如何从 liquid 标签中写入有效的 HTML?

How to write valid HTML out of a liquid tag?

情境化

我一直在学习如何使用 Jekyll,现在我正在尝试开发我的第一个液体标签。它的目的是呈现给定 StackExchange 社区的 my flair

这样,当我在页面中插入 {% flair Whosebug %} 时,它应该被等效的 HTML 替换。下面是代码:

module Jekyll
    class FlairTag < Liquid::Tag

        def initialize(tag_name, community, tokens)
            super
            @community = community
        end

        def render(context)
            output = \
            "<a href=\"{{ #{@community}.url }}/users/{{ #{@community}.id }}/{{ site.data.stackexchange.user.nickname }}\">" \
                "<img src=\"https://stackexchange.com/users/flair/{{ site.data.stackexchange.user.id }}\" " \
                    "width=\"208\" height=\"58\" " \
                    "title=\"Profile for {{ site.data.stackexchange.user.nickname }} on {{ include.label }}\">" \
                    "alt=\"Profile for {{ site.data.stackexchange.user.nickname }} on {{ include.label }}\"" \
            "</a>"

            return output
        end
    end
end

Liquid::Template.register_tag('flair', Jekyll::FlairTag)

问题

我读过 here return 包含所需 HTML 代码的字符串我会实现我的目标,但是它没有正确发生,我的意思是,它已经和我直接在页面写HTML不一样了

有什么我遗漏的吗? 或者有另一种方法来写出 HTML 代码作为 ruby 功能/液体标签的 return 吗?

{{ site.data.stackexchange.user.id }}这样的流利的表达在这里就不解释了。您需要使用变量来输出数据。

正如我猜测的那样,您将数据存储在 _data/Whosebug.yml 文件中,该文件可能如下所示:

url: https://whosebug.com
id: 2989289
user: artu-hnrq

这段代码可以完成工作:

module Jekyll
    class FlairTag < Liquid::Tag

        def initialize(tag_name, community, tokens)
            super
            # if this tag is called with {% flair Whosebug %}
            # the "community" variable will be "Whosebug "
            # in order to remove the trailing space, we strip the variable
            @community = community.strip
        end

        def render(context)
            site = context.registers[:site]
            data = site.data[@community]
            url  = data["url"]
            id   = data["id"]
            user = data["user"]
            alt  = "Profile for #{user} on #{@community}"

            output = %(
              <a href="#{url}/users/#{id}/#{user}">
                <img src="#{url}/users/flair/#{id}.png"
                     width="208" height="58"
                     title="#{alt}"
                     alt="#{alt}"
              </a>
            )
        end
    end
end

Liquid::Template.register_tag('flair', Jekyll::FlairTag)

注意:从我的角度来看,如果此代码段位于您网站上的独特位置(简历、页脚等),则可以通过简单的包含来实现。

如果不需要为每个页面自定义此标记,则几乎不会提高性能,并且您的代码仍可由只有 html/liquid 知识的人维护。