ruby-formatter/rufo

Unexpected EOF with blocks in .html.erb files

jyc opened this issue · 4 comments

jyc commented

Thanks for maintaining rufo!

It looks like it doesn't support blocks in ERB files:

$ rufo .
Format: ./config/environments/development.rb
Format: ./config/environments/test.rb
Format: ./config/initializers/filter_parameter_logging.rb
./app/views/rodauth/_login_form.html.erb:1 syntax error, unexpected end-of-input

Here is the ERB file in question, generated by janko/rodauth-rails:

<%= form_with url: rodauth.login_path, method: :post, data: { turbo: false }, class: "w-full max-w-sm" do |form| %>
  <% if rodauth.skip_login_field_on_login? %>
    <div class="mb-6">
      <%= form.label "login", rodauth.login_label, class: "block text-sm font-semibold" %>
      <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", readonly: true, class: "mt-2 text-sm w-full py-2 px-0 bg-inherit border-transparent focus:ring-0 focus:border-transparent" %>
    </div>
  <% else %>
    <div class="mb-6">
      <%= form.label "login", rodauth.login_label, class: "block text-sm font-semibold" %>
      <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", autocomplete: "email", required: true, class: "mt-2 text-sm w-full px-3 py-2 border rounded-md dark:bg-gray-900 dark:text-gray-100 dark:focus:bg-gray-800 #{rodauth.field_error(rodauth.login_param) ? "border-red-600 focus:ring-red-600 focus:border-red-600 dark:border-red-400 dark:focus:ring-red-400" : "border-gray-300 dark:border-gray-700 dark:focus:border-emerald-400 dark:focus:ring-emerald-400" }", aria: ({ invalid: true, describedby: "login_error_message" } if rodauth.field_error(rodauth.login_param)) %>
      <%= content_tag(:span, rodauth.field_error(rodauth.login_param), class: "block mt-1 text-red-600 text-xs dark:text-red-400", id: "login_error_message") if rodauth.field_error(rodauth.login_param) %>
    </div>
  <% end %>

  <% unless rodauth.skip_password_field_on_login? %>
    <div class="mb-6">
      <%= form.label "password", rodauth.password_label, class: "block text-sm font-semibold" %>
      <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "mt-2 text-sm w-full px-3 py-2 border rounded-md dark:bg-gray-900 dark:text-gray-100 dark:focus:bg-gray-800 #{rodauth.field_error(rodauth.password_param) ? "border-red-600 focus:ring-red-600 focus:border-red-600 dark:border-red-400 dark:focus:ring-red-400" : "border-gray-300 dark:border-gray-700 dark:focus:border-emerald-400 dark:focus:ring-emerald-400" }", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
      <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "block mt-1 text-red-600 text-xs dark:text-red-400", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
    </div>
  <% end %>

  <%= form.submit rodauth.login_button, class: "w-full px-8 py-3 cursor-pointer font-semibold text-sm rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 dark:bg-emerald-400 dark:hover:bg-emerald-500 dark:text-gray-900 dark:focus:ring-emerald-400 dark:focus:ring-offset-current" %>
<% end %>
kzkn commented

@jyc
Thanks for the report.

At least, ErbFormatter seems to support do-end blocks.

it "handles do end blocks" do
result = subject.format("<% a do |b| %>\nabc\n<% end %>")
expect(result).to eql("<% a do |b| %>\nabc\n<% end %>")
end

But your example causes unexpected end-of-input certainly.

$ cat <<EOF >foo.html.erb
YOURCODE
EOF

$ rufo foo.html.erb
foo.html.erb:1 syntax error, unexpected end-of-input

Could you please try to find a minimum reproducible example?

kzkn commented

I've found.

NG:

$ cat <<EOF | rufo --filename a.erb
pipe heredoc> <%= a(b: true) do %>
pipe heredoc> <% end %>
pipe heredoc> EOF
STDIN is invalid code. Error on line:1 syntax error, unexpected end-of-input

OK:

$ cat <<EOF | rufo --filename b.erb
pipe heredoc> <%= a(b: 1) do %>
pipe heredoc> <% end %>
pipe heredoc> EOF
<%= a(b: 1) do %>
<% end %>
kzkn commented

@jyc
I've opened #300 and I have confirmed that your code is formatted.
If you'd like, I'd be happy to try some other codes to see if they work. I am not using ERB actively.

+1 for this issue. Currently experiencing it with Rails form helper blocks (form_with / form_tag).