   the attribute is completely removed if it is false:
 
       iex> tag(:audio, autoplay: true)
-      {:safe, "<audio autoplay=\"autoplay\">"}
+      {:safe, [60, "audio", [[32, "autoplay", 61, 34, "autoplay", 34]], 62]}
       iex> tag(:audio, autoplay: false)
-      {:safe, "<audio>"}
+      {:safe, [60, "audio", [], 62]}
 
   If you want the boolean attribute to be sent as is,
   you can explicitly convert it to a string before.
   """
   def tag(name), do: tag(name, [])
   def tag(name, attrs) when is_list(attrs) do
-    {:safe, "<#{name}#{build_attrs(name, attrs)}>"}
+    {:safe, [?<, to_string(name), build_attrs(name, attrs), ?>]}
   end
 
   @doc ~S"""
   Creates an HTML tag with given name, content, and attributes.
 
       iex> content_tag(:p, "Hello")
-      {:safe, [60, "p", "", 62, "Hello", 60, 47, "p", 62]}
+      {:safe, [60, "p", [], 62, "Hello", 60, 47, "p", 62]}
       iex> content_tag(:p, "<Hello>", class: "test")
-      {:safe, [60, "p", " class=\"test\"", 62, "&lt;Hello&gt;", 60, 47, "p", 62]}
+      {:safe, [60, "p", [[32, "class", 61, 34, "test", 34]], 62, "&lt;Hello&gt;", 60, 47, "p", 62]}
 
       iex> content_tag :p, class: "test" do
       ...>   "Hello"
       ...> end
-      {:safe, [60, "p", " class=\"test\"", 62, "Hello", 60, 47, "p", 62]}
+      {:safe, [60, "p", [[32, "class", 61, 34, "test", 34]], 62, "Hello", 60, 47, "p", 62]}
   """
   def content_tag(name, [do: block]) when is_atom(name) do
     content_tag(name, block, [])

    end
  end

  defp build_attrs(_tag, []), do: ""
  defp build_attrs(tag, attrs), do: build_attrs(tag, attrs, [])

  defp build_attrs(_tag, [], acc),

  in the tag's attributes keyword list:

      iex> tag(:input, [{:data, [foo: "bar"]}, id: "some_id"])
      {:safe, [60, "input", [[32, "data-foo", 61, 34, "bar", 34], [32, "id", 61, 34, "some_id", 34]], 62]}

  ## Boolean values

