如何使用 Liquid 在 Jekyll 中传递多个参数?
How can I pass multiple params in Jekyll with Liquid?
我有 found a Ruby Jekyll 插件,可以使用 Liquid 在 Jekyll 网页中混淆这样的电子邮件地址
{{ site.email | mailObfuscate }}
不过,我想传递多个参数给mailObfuscate
我试过以下方法
{{ email=site.email, linkText='foo bar' | mailObfuscate }}
但是,这会在构建我的网站时出错
Liquid Warning: Liquid syntax error (line 89): Unexpected character = in "{{ email=site.email, linkText='foo bar' | mailObfuscate }}" in privacy.html
Liquid Exception: undefined method gsub' for nil:NilClass in privacy.html
Error: undefined method
gsub' for nil:NilClass
Error: Run jekyll build --trace for more information.
运行 跟踪给出以下错误
1: from D:/Ruby26-x64/lib/ruby/2.6.0/uri/common.rb:103:in escape'
D:/Ruby26-x64/lib/ruby/2.6.0/uri/rfc2396_parser.rb:305:in
escape':
undefined method `gsub' for nil:NilClass (NoMethodError)
可以在 Pastebin
找到完整的跟踪
如何传递多个变量?
您需要修改方法以获取第二个参数,然后您可以将其用作 link 文本。试试这个:
require "base64"
require "uri"
module ObfuscateMailAddress
def mailObfuscate(email_address, link_text )
base64Mail = Base64.strict_encode64(URI::encode(email_address))
# See http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/
output = "<a href=\"#\" "
output += "data-contact=\"#{base64Mail}\" target=\"_blank\" "
output += "onfocus=\"this.href = 'mailto:' + atob(this.dataset.contact)\">"
output += "<script type=\"text/javascript\">document.write(atob(\"#{base64Mail}\"));</script>#{link_text}</a>"
return output
end
end
Liquid::Template.register_filter(ObfuscateMailAddress)
要在液体模板中传递多个参数,语法有点奇怪,see documentation。管道左侧的字符串自动作为第一个参数传递给您的 ruby 方法,而其他参数则通过冒号传递。
{{ 'test@example.com' | mailObfuscate:'myLinkText' }}
但是你也一样,如果你在 Ruby >= 2.3,你可以让你的方法更具可读性,而不需要所有的转义字符和更好的语法突出显示在你的编辑器中,如果你改变你的方法使用 SQUIGGLY HEREDOC 作为您的字符串定义,在任何情况下都不需要明确的 return
。对于 Ruby < 2.3,您仍然可以使用常规的 HEREDOC,只需将 ~
替换为 -
,但您的字符串中会有额外的缩进,这对于渲染的 html 来说是没有问题的。
def mailObfuscate(email_address, link_text )
base64Mail = Base64.strict_encode64(URI::encode(email_address))
ouput = <<~HTML
<a href="#" data-contact="#{base64Mail}" target="_blank"
onfocus="this.href = 'mailto:' + atob(this.dataset.contact)" >
<script type="text/javascript">
document.write(atob("#{base64Mail}"));
</script>
#{link_text}
</a>
HTML
end
当它被这样调用时:
puts mailObfuscate('foo@bar.com', 'foobar')
它将呈现:
<a href="#" data-contact="Zm9vQGJhci5jb20=" target="_blank"
onfocus="this.href = 'mailto:' + atob(this.dataset.contact)" >
<script type="text/javascript">
document.write(atob("Zm9vQGJhci5jb20="));
</script>
foobar
</a>
附带说明,ruby style guide 建议我们使用 snake_case
作为方法名称,因此您可能想使用 mail_obfuscate
作为方法名称。
我有 found a Ruby Jekyll 插件,可以使用 Liquid 在 Jekyll 网页中混淆这样的电子邮件地址
{{ site.email | mailObfuscate }}
不过,我想传递多个参数给mailObfuscate
我试过以下方法
{{ email=site.email, linkText='foo bar' | mailObfuscate }}
但是,这会在构建我的网站时出错
Liquid Warning: Liquid syntax error (line 89): Unexpected character = in "{{ email=site.email, linkText='foo bar' | mailObfuscate }}" in privacy.html Liquid Exception: undefined method
gsub' for nil:NilClass in privacy.html Error: undefined method
gsub' for nil:NilClass Error: Run jekyll build --trace for more information.
运行 跟踪给出以下错误
1: from D:/Ruby26-x64/lib/ruby/2.6.0/uri/common.rb:103:in
escape' D:/Ruby26-x64/lib/ruby/2.6.0/uri/rfc2396_parser.rb:305:in
escape': undefined method `gsub' for nil:NilClass (NoMethodError)
可以在 Pastebin
找到完整的跟踪如何传递多个变量?
您需要修改方法以获取第二个参数,然后您可以将其用作 link 文本。试试这个:
require "base64"
require "uri"
module ObfuscateMailAddress
def mailObfuscate(email_address, link_text )
base64Mail = Base64.strict_encode64(URI::encode(email_address))
# See http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/
output = "<a href=\"#\" "
output += "data-contact=\"#{base64Mail}\" target=\"_blank\" "
output += "onfocus=\"this.href = 'mailto:' + atob(this.dataset.contact)\">"
output += "<script type=\"text/javascript\">document.write(atob(\"#{base64Mail}\"));</script>#{link_text}</a>"
return output
end
end
Liquid::Template.register_filter(ObfuscateMailAddress)
要在液体模板中传递多个参数,语法有点奇怪,see documentation。管道左侧的字符串自动作为第一个参数传递给您的 ruby 方法,而其他参数则通过冒号传递。
{{ 'test@example.com' | mailObfuscate:'myLinkText' }}
但是你也一样,如果你在 Ruby >= 2.3,你可以让你的方法更具可读性,而不需要所有的转义字符和更好的语法突出显示在你的编辑器中,如果你改变你的方法使用 SQUIGGLY HEREDOC 作为您的字符串定义,在任何情况下都不需要明确的 return
。对于 Ruby < 2.3,您仍然可以使用常规的 HEREDOC,只需将 ~
替换为 -
,但您的字符串中会有额外的缩进,这对于渲染的 html 来说是没有问题的。
def mailObfuscate(email_address, link_text )
base64Mail = Base64.strict_encode64(URI::encode(email_address))
ouput = <<~HTML
<a href="#" data-contact="#{base64Mail}" target="_blank"
onfocus="this.href = 'mailto:' + atob(this.dataset.contact)" >
<script type="text/javascript">
document.write(atob("#{base64Mail}"));
</script>
#{link_text}
</a>
HTML
end
当它被这样调用时:
puts mailObfuscate('foo@bar.com', 'foobar')
它将呈现:
<a href="#" data-contact="Zm9vQGJhci5jb20=" target="_blank"
onfocus="this.href = 'mailto:' + atob(this.dataset.contact)" >
<script type="text/javascript">
document.write(atob("Zm9vQGJhci5jb20="));
</script>
foobar
</a>
附带说明,ruby style guide 建议我们使用 snake_case
作为方法名称,因此您可能想使用 mail_obfuscate
作为方法名称。