diff --git a/lib/phoenix/naming.ex b/lib/phoenix/naming.ex index 01c378214b..b9ba273ff1 100644 --- a/lib/phoenix/naming.ex +++ b/lib/phoenix/naming.ex @@ -129,4 +129,34 @@ defmodule Phoenix.Naming do bin |> String.replace("_", " ") |> String.capitalize end + + @doc """ + Converts an attribute/form field into its titleized version (all words capitalized). + + ## Examples + + iex> Phoenix.Naming.titleize(:username) + "Username" + iex> Phoenix.Naming.titleize(:created_at) + "Created At" + iex> Phoenix.Naming.titleize("user_id") + "User" + + """ + @spec titleize(atom | String.t) :: String.t + def titleize(atom) when is_atom(atom), + do: titleize(Atom.to_string(atom)) + def titleize(bin) when is_binary(bin) do + bin = + if String.ends_with?(bin, "_id") do + binary_part(bin, 0, byte_size(bin) - 3) + else + bin + end + + bin + |> String.replace("_", " ") + |> String.split() + |> Enum.map_join(" ", &String.capitalize/1) + end end diff --git a/test/phoenix/naming_test.exs b/test/phoenix/naming_test.exs index dabbf6965a..46ea706f6d 100644 --- a/test/phoenix/naming_test.exs +++ b/test/phoenix/naming_test.exs @@ -42,4 +42,20 @@ defmodule Phoenix.NamingTest do assert Naming.camelize("_foo_bar", :lower) == "fooBar" assert Naming.camelize("foo_bar_1", :lower) == "fooBar1" end + + test "humanize/1 converts atoms and strings to humanized form" do + assert Naming.humanize(:username) == "Username" + assert Naming.humanize(:created_at) == "Created at" + assert Naming.humanize("user_id") == "User" + assert Naming.humanize("foo_bar") == "Foo bar" + assert Naming.humanize(:email_id) == "Email" + end + + test "titleize/1 converts atoms and strings to titleized form" do + assert Naming.titleize(:username) == "Username" + assert Naming.titleize(:created_at) == "Created At" + assert Naming.titleize("user_id") == "User" + assert Naming.titleize("foo_bar") == "Foo Bar" + assert Naming.titleize(:email_id) == "Email" + end end