 
   ## Code blocks
 
-  defp process_code([], code, indent) do
+  defp process_code([], code, indent, _colors) do
     write_code(code, indent)
   end
 
   # Blank line between code blocks
-  defp process_code([ "", "    " <> line | rest ], code, indent) do
-    process_code(rest, [line, "" | code], indent)
-  end
-
-  defp process_code([ "    " <> line | rest ], code, indent) do
-    process_code(rest, [line|code], indent)
-  end
-
-  defp process_code(rest, code, indent) do
+  defp process_code([ "", "    " <> line | rest ], code, indent, colors) do
+    process_code(rest, [line, "" | code], indent, colors)
+  end
+
+  defp process_code([ "    " <> line | rest ], code, indent, colors) do
+    process_code(rest, [line|code], indent, colors)
+  end
+
+  defp process_code(rest, code, indent, colors) do
     write_code(code, indent)
-    process(rest, indent)
+    process(rest, indent, colors)
   end
 
   defp write_code(code, indent) do


  ## Text (paragraphs / lists)

  defp process_text(doc=["" | _], para, indent, from_list) do
    write_text(Enum.reverse(para), indent, from_list)
    process(doc, indent)
  end

  defp process_text([], para, indent, from_list) do
    write_text(Enum.reverse(para), indent, from_list)
  end

  defp process_text([line | rest], para, indent, true) do
    { stripped, count } = strip_spaces(line, 0)
    case stripped do
      <<bullet, ?\s, item :: binary>> when bullet in @bullets ->
        write_text(Enum.reverse(para), indent, true)
        process_list(item, rest, count, indent)
      _ ->
        process_text(rest, [line | para], indent, true)
    end
  end

  defp process_text([line | rest], para, indent, from_list) do
    process_text(rest, [line | para], indent, from_list)
  end

  defp write_text(lines, indent, from_list) do


  ## Lists

  defp process_list(line, rest, count, indent, colors) do
    IO.write indent <> "• "
    { contents, rest, done } = process_list_next(rest, count, false, [])
    process_text(contents, [line], indent <> "  ", true, colors)
    if done, do: IO.puts(IO.ANSI.reset)
    process(rest, indent, colors)
  end

  # Process the thing after a list item entry. It can be either:
