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