如何从 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 知识的人维护。
情境化
我一直在学习如何使用 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 知识的人维护。