如何使用 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 methodgsub' 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:inescape': 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 作为方法名称。