Packages
surface
0.7.6
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha.0
A component based library for Phoenix LiveView
Current section
Files
Jump to
Current section
Files
lib/surface/formatter/phases/newlines.ex
defmodule Surface.Formatter.Phases.Newlines do
@moduledoc """
Standardizes usage of newlines.
- Prevents more than 1 empty line in a row.
- Prevents an empty line separating an opening/closing tag from the contents inside.
"""
@behaviour Surface.Formatter.Phase
alias Surface.Formatter.Phase
def run(nodes, _opts) do
nodes
|> collapse_newlines()
|> prevent_empty_line_at_beginning()
|> prevent_empty_line_at_end()
end
defp collapse_newlines(nodes) do
nodes
|> Enum.chunk_by(&(&1 == :newline))
|> Enum.map(fn
[:newline, :newline | _] -> [:newline, :newline]
nodes -> nodes
end)
|> Enum.flat_map(&Function.identity/1)
|> Phase.transform_element_children(&collapse_newlines/1)
end
defp prevent_empty_line_at_beginning(nodes) do
nodes
|> case do
[:newline, :newline | rest] -> [:newline | rest]
_ -> nodes
end
|> Phase.transform_element_children(&prevent_empty_line_at_beginning/1)
end
defp prevent_empty_line_at_end(nodes) do
nodes
|> Enum.slice(-2..-1)
|> case do
[:newline, :newline] -> Enum.slice(nodes, 0..-2)
_ -> nodes
end
|> Phase.transform_element_children(&prevent_empty_line_at_end/1)
end
end