diff --git a/lib/ash/flow/chart/mermaid.ex b/lib/ash/flow/chart/mermaid.ex
index 5082f9ae..adf616a6 100644
--- a/lib/ash/flow/chart/mermaid.ex
+++ b/lib/ash/flow/chart/mermaid.ex
@@ -187,11 +187,17 @@ defmodule Ash.Flow.Chart.Mermaid do
if Code.ensure_loaded?(Earmark) do
defp as_html!(value) do
value
+ |> escape()
|> Earmark.as_html!()
|> String.replace("
", "
")
end
else
- defp as_html!(value), do: value |> String.split("\n", trim: true) |> Enum.join("
")
+ defp as_html!(value),
+ do:
+ value
+ |> String.replace("\"", "\\\"")
+ |> String.split("\n", trim: true)
+ |> Enum.join("
")
end
defp short_name(%Ash.Flow.Step.Custom{custom: {mod, opts}}) do
@@ -269,6 +275,11 @@ defmodule Ash.Flow.Chart.Mermaid do
defp do_links(steps, all_steps, opts) do
Enum.flat_map(steps, fn step ->
case step do
+ %Ash.Flow.Step.Branch{steps: steps, condition: condition} = step ->
+ id = "#{format_name(step)}"
+
+ dependencies(step, all_steps, [condition], id) ++ do_links(steps, all_steps, opts)
+
%Ash.Flow.Step.Map{steps: steps, over: over} = step ->
id = "#{format_name(step)}.element"
@@ -340,7 +351,7 @@ defmodule Ash.Flow.Chart.Mermaid do
end
end)
- "%{
#{body}
}"
+ "%{
#{escape(body)}
}"
end
defp do_format_template(template, all_steps) when is_list(template) do
diff --git a/lib/ash/flow/flow.ex b/lib/ash/flow/flow.ex
index 7f99a3fa..b43b3605 100644
--- a/lib/ash/flow/flow.ex
+++ b/lib/ash/flow/flow.ex
@@ -583,8 +583,13 @@ defmodule Ash.Flow do
Enum.flat_map(list, &do_list_expr_refs(&1, matcher))
end
- defp do_list_expr_refs({key, value}, matcher) when is_atom(key),
- do: do_list_expr_refs(value, matcher)
+ defp do_list_expr_refs({key, value}, matcher) when is_atom(key) do
+ if matcher.({key, value}) do
+ [{key, value}]
+ else
+ do_list_expr_refs(value, matcher)
+ end
+ end
defp do_list_expr_refs(expression, matcher) do
case expression do