diff --git a/lib/xml_builder.ex b/lib/xml_builder.ex index d6872eb..49e413c 100644 --- a/lib/xml_builder.ex +++ b/lib/xml_builder.ex @@ -257,8 +257,7 @@ defmodule XmlBuilder do do: format({nil, nil, string}, level, options) defp format(list, level, options) when is_list(list) do - formatter = formatter(options) - map_intersperse(list, formatter.line_break(), &format(&1, level, options)) + format_children(list, level, options) end defp format({nil, nil, name}, level, options) when is_bitstring(name), @@ -339,6 +338,25 @@ defmodule XmlBuilder do ] end + defp format_children(list, level, options) when is_list(list) do + line_break = formatter(options).line_break() + + {result, _} = + Enum.flat_map_reduce(list, 0, fn + element, count when is_blank_list(element) -> + {[], count} + + element, count -> + if line_break == "" or count == 0 do + {[format(element, level, options)], count + 1} + else + {[line_break, format(element, level, options)], count + 1} + end + end) + + result + end + defp elements_with_prolog([first | rest]) when length(rest) > 0, do: [first_element(first) | element(rest)] @@ -360,7 +378,7 @@ defmodule XmlBuilder do defp format_content(children, level, options) when is_list(children) do format_char = formatter(options).line_break() - [format_char, map_intersperse(children, format_char, &format(&1, level, options))] + [format_char, format_children(children, level, options)] end defp format_content(content, _level, _options), diff --git a/test/xml_builder_test.exs b/test/xml_builder_test.exs index 955b2a6..3cb7084 100644 --- a/test/xml_builder_test.exs +++ b/test/xml_builder_test.exs @@ -320,6 +320,12 @@ defmodule XmlBuilderTest do assert warning =~ "doc/1 is deprecated. Use document/1 with generate/1 instead." end + test "removal of empty child elements" do + assert {:person, nil, [nil, {:first, nil, "Josh"}, [], {:last, nil, "Nussbaum"}]} + |> XmlBuilder.generate() == + ~s|\n Josh\n Nussbaum\n| + end + def element(name, arg), do: XmlBuilder.element(name, arg) |> XmlBuilder.generate()