我有found a Ruby插件供Jekyll在使用Liquid的Jekyll网页中混淆这样的电子邮件地址
{{ site.email | mailObfuscate }}
但是,我想将多个参数传递给mailObfuscate
我尝试了以下
{{ email=site.email, linkText='foo bar' | mailObfuscate }}
但是,这在构建我的网站时出现了错误
液体警告:液态语法错误(第89行):privacy.html中的“ {{email = site.email,linkText ='foo bar'| mailObfuscate}}”中出现意外字符= 液体异常:nil:NilClass的未定义方法
gsub' for nil:NilClass in privacy.html Error: undefined method
gsub' 错误:运行jekyll build --trace以获得更多信息。
运行跟踪会出现以下错误
1:从D:/Ruby26-x64/lib/ruby/2.6.0/uri/common.rb:103:在
escape' D:/Ruby26-x64/lib/ruby/2.6.0/uri/rfc2396_parser.rb:305:in
中转义: 未定义的方法'gsub'用于nil:NilClass(NoMethodError)
完整的跟踪信息可以在Pastebin
上找到。如何传递多个变量?
答案 0 :(得分:1)
您需要修改该方法以使用第二个参数,然后可以将其用作链接文本。试试这个:
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
用作方法名称。