Project

General

Profile

Actions

Feature #15538

closed

Erb indenting / unindenting

Added by kke (Kimmo Lehto) almost 6 years ago. Updated almost 6 years ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
-
[ruby-core:91103]

Description

In Erb, would it be possible to add a new tag that would indent the following content to match the depth of the tag? The tag could be <%~ (to resemble the <<~EOS squiggy heredoc).

Reason

Something like this would be easy to follow:

1
<%- [2, 3, 4].each do |num| -%>
  <%- unless num == 3 -%>
    <%= num %>
  <%- end -%>
<%- end -%>
5

But unfortunately it will render with "extra" indentation:

1
    2
    4
5

Currently, to avoid this, you have to write your template using either no indentation:

1
<%- [2, 3, 4].each do |num| -%>
<%- unless num == 3 -%>
<%= num %>
<%- end -%>
<%- end -%>
5

Or a weird jumpy indentation:

1
<%- [2, 3, 4].each do |num| -%>
  <%- unless num == 3 -%>
<%= num %>
  <%- end -%>
<%- end -%>
5

With the <%~ it could be written as:

1
<%~ [2, 3, 4].each do |num| -%>
  <%- unless num == 3 -%>
    <%= num %>
  <%- end -%>
<%~ end -%>
5

And it would output as desired without the "extra" indentation:

1
2
4
5

Another example:

<%= "abcd" %> <%~ [1.2.3].each do |num| -%>
                <%= num %>
              <%~ end -%>

would produce:

abcd 1
     2
     3

Using with =

It would also be handy if the ~ could be used in <%= statements, perhaps as <%~=. This would be excellent for example when templating YAML's:

<%- bars = %w(abc def)" -%>
foo:
  bar: 
    <%~= bars.map { |bar| "- #{bar}\n" } %>

Which would reindent the statement outcome to produce something like:

foo:
  bar:
    - abc
    - def

This would require these new tags:

  1. <%~ begin a code block and begin or end reindentation mode. content produced inside the block will be reindented to the depth of the < character in <%~. If the indentation mode was already active due to a previous <%~, it ends the indentation mode.
  2. <%~= like regular <%= but multiline strings will be reindented to the column of the < character
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0