Как я могу передать несколько параметров в Jekyll с жидкостью? - PullRequest
1 голос
/ 14 апреля 2019

У меня найден плагин Ruby для Jekyll, чтобы запутать такой адрес электронной почты на веб-странице Jekyll с помощью Liquid

{{ site.email | mailObfuscate }}

Однако я хотел бы передать несколько параметров в mailObfuscate

Я пробовал следующее

{{ email=site.email, linkText='foo bar' | mailObfuscate }}

Однако, это дает ошибку при создании моего сайта

Liquid Предупреждение: Ошибка синтаксиса (строка 89): неожиданный символ = в "{{email = site.email, linkText = 'foo bar' | mailObfuscate}}" в privacy.html Исключение для жидкости: неопределенный метод gsub' for nil:NilClass in privacy.html Error: undefined method gsub 'для nil: NilClass Ошибка: запустите сборку jekyll --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 escape ': неопределенный метод `gsub 'для nil: NilClass (NoMethodError)

Полный след можно найти в Pastebin

Как я могу передать несколько переменных?

1 Ответ

1 голос
/ 14 апреля 2019

Вам нужно изменить метод так, чтобы он принимал 2-й аргумент, затем вы можете использовать его в качестве текста ссылки.Попробуйте это:

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)

Чтобы передать несколько аргументов в жидком шаблоне, синтаксис немного странный, см. Документацию .Строка в левой части канала автоматически передается в качестве первого аргумента в ваш метод ruby, а дополнительные аргументы передаются с двоеточием.

{{ 'test@example.com' | mailObfuscate:'myLinkText' }}

Но вы также, если вы используете Ruby> =2.3, вы можете сделать ваш метод более читабельным без необходимости использования всех escape-символов и лучшей подсветки синтаксиса в вашем редакторе, если вы измените свой метод на использование SQUIGGLY HEREDOC для определения строки, в любом случае явный return не требуется.Для Ruby <2.3 вы все равно можете использовать обычный HEREDOC, просто замените <code>~ на -, но у вас просто есть дополнительный отступ в вашей строке, что, в любом случае, не представляет проблемы для визуализированного 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 ​​ рекомендует использовать snake_case для имен методовтак что вы можете использовать mail_obfuscate вместо имени вашего метода.

...