Skip to content

Commit ca218e6

Browse files
authored
Merge pull request #11 from zharinov/jsx_string_child_fix
Handle edge case when string literal is a JSX child
2 parents dae554c + 9fb640d commit ca218e6

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

lib/es_tree/tools/generator.ex

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,26 @@ defmodule ESTree.Tools.Generator do
752752
end
753753

754754
def do_generate(%ESTree.JSXElement{ openingElement: openingElement, children: children, closingElement: closingElement }, level) do
755-
"#{ generate(openingElement) }#{ Enum.map(children, &generate(&1, calculate_next_level(level))) |> Enum.join(" ") }#{ generate(closingElement) }"
755+
"#{ generate(openingElement) }#{ generate_jsx_children(children, calculate_next_level(level)) }#{ generate(closingElement) }"
756+
end
757+
758+
defp generate_jsx_children(children, level) do
759+
gen_fn = fn
760+
%ESTree.Literal{value: value} when is_binary(value) ->
761+
convert_jsx_text(value)
762+
other ->
763+
generate(other, level)
764+
end
765+
766+
children |> Enum.map(gen_fn) |> Enum.join
767+
end
768+
769+
defp convert_jsx_text(str) do
770+
str
771+
|> String.replace("{", "{")
772+
|> String.replace("}", "}")
773+
|> String.replace("<", "&lt;")
774+
|> String.replace(">", "&gt;")
756775
end
757776

758777
defp convert_string_characters(str) do

test/tools/generator/jsx_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,28 @@ defmodule ESTree.Tools.Generator.JSX.Test do
148148

149149
assert Generator.generate(ast) == "<Test.xml><div/></Test.xml>"
150150
end
151+
152+
should "handle inner text" do
153+
ast = Builder.jsx_element(
154+
Builder.jsx_opening_element(
155+
Builder.jsx_identifier(
156+
"Test"
157+
)
158+
),
159+
[
160+
Builder.literal("counter: "),
161+
Builder.jsx_expression_container(
162+
Builder.identifier(:count)
163+
),
164+
Builder.literal("."),
165+
],
166+
Builder.jsx_closing_element(
167+
Builder.jsx_identifier(
168+
"Test"
169+
)
170+
)
171+
)
172+
173+
assert Generator.generate(ast) == "<Test>counter: {count}.</Test>"
174+
end
151175
end

0 commit comments

Comments
 (0)