如何使用Liquid在Jekyll中传递多个参数?

时间:2019-04-14 13:11:47

标签: ruby jekyll liquid

我有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

上找到。

如何传递多个变量?

1 个答案:

答案 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用作方法名称。